@tombcato/ai-selector-vue 0.1.3 → 0.1.4
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/index.js +30 -30
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/useAIConfig.ts","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/TickerCore-C7Ejc9kB.js","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/vue.js","../src/SmartText.vue","../src/ProviderSelect.vue","../src/AuthInput.vue","../src/ModelSelect.vue","../src/BaseUrlInput.vue","../src/AIConfigForm.vue"],"sourcesContent":["import { ref, computed, watch, onMounted } from 'vue';\r\nimport {\r\n testConnection,\r\n createConfigStorage,\r\n resolveProviderConfig,\r\n type Model,\r\n type AIConfig,\r\n type TestConnectionResult,\r\n type ProviderConfig,\r\n fetchModels,\r\n type ModelFetcher,\r\n} from '@tombcato/ai-selector-core';\r\n\r\nexport interface UseAIConfigOptions {\r\n proxyUrl?: string;\r\n initialConfig?: Partial<AIConfig>;\r\n providerConfig?: ProviderConfig;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nexport function useAIConfig(options: UseAIConfigOptions = {}) {\r\n const providerId = ref(options.initialConfig?.providerId || '');\r\n const apiKey = ref(options.initialConfig?.apiKey || '');\r\n const model = ref(options.initialConfig?.model || '');\r\n const modelName = ref(options.initialConfig?.modelName || '');\r\n const baseUrl = ref(options.initialConfig?.baseUrl || '');\r\n\r\n const models = ref<Model[]>([]);\r\n const testStatus = ref<'idle' | 'testing' | 'success' | 'error'>('idle');\r\n const testResult = ref<TestConnectionResult | null>(null);\r\n const isFetchingModels = ref(false);\r\n const fetchModelError = ref<string | null>(null);\r\n\r\n // Resolve provider config\r\n const resolvedConfig = computed(() => resolveProviderConfig(options.providerConfig));\r\n const allProviders = computed(() => resolvedConfig.value.providers);\r\n\r\n const provider = computed(() =>\r\n allProviders.value.find((p: any) => p.id === providerId.value) || null\r\n );\r\n\r\n const storage = createConfigStorage(undefined, {\r\n serialize: options.onSerialize,\r\n deserialize: options.onDeserialize\r\n });\r\n\r\n // Flag to prevent clearing data during initial load\r\n const isLoaded = ref(false);\r\n\r\n // Load config\r\n onMounted(() => {\r\n const saved = storage.load();\r\n if (saved) {\r\n // Only load if provider exists in current config\r\n if (saved.providerId && allProviders.value.some((p: any) => p.id === saved.providerId)) {\r\n providerId.value = saved.providerId;\r\n if (saved.apiKey) apiKey.value = saved.apiKey;\r\n if (saved.model) model.value = saved.model;\r\n if (saved.modelName) modelName.value = saved.modelName;\r\n if (saved.baseUrl) baseUrl.value = saved.baseUrl;\r\n }\r\n }\r\n setTimeout(() => { isLoaded.value = true; }, 0);\r\n });\r\n\r\n // Watch for provider changes to reset fields\r\n watch(providerId, () => {\r\n if (!isLoaded.value) return;\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n });\r\n\r\n // Watch for provider/apikey/baseurl to update models (with caching)\r\n let fetchTimer: any = null;\r\n const modelCache = new Map<string, Model[]>();\r\n\r\n watch([providerId, apiKey, baseUrl], () => {\r\n if (fetchTimer) clearTimeout(fetchTimer);\r\n\r\n if (!providerId.value || !provider.value) {\r\n models.value = [];\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n const shouldFetch = provider.value.supportsModelsApi && (!provider.value.needsApiKey || !!apiKey.value);\r\n const actualBaseUrl = baseUrl.value || provider.value.baseUrl;\r\n const cacheKey = `${providerId.value}|${actualBaseUrl}|${apiKey.value}`;\r\n\r\n // Check cache first\r\n const cachedModels = modelCache.get(cacheKey);\r\n if (cachedModels) {\r\n models.value = cachedModels;\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n if (!shouldFetch) {\r\n const staticModels = resolvedConfig.value.getModels(providerId.value);\r\n models.value = staticModels;\r\n modelCache.set(cacheKey, staticModels);\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n // Set fetching immediately to fill debounce gap\r\n isFetchingModels.value = true;\r\n fetchModelError.value = null;\r\n\r\n // Pre-fill with static models if empty to avoid flicker\r\n if (models.value.length === 0) {\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n }\r\n\r\n fetchTimer = setTimeout(async () => {\r\n try {\r\n let fetchedModels: Model[];\r\n\r\n if (options.modelFetcher) {\r\n fetchedModels = await options.modelFetcher({\r\n type: 'fetchModels',\r\n providerId: provider.value!.id,\r\n baseUrl: actualBaseUrl,\r\n apiKey: apiKey.value\r\n });\r\n } else {\r\n fetchedModels = await fetchModels({\r\n provider: provider.value!,\r\n apiKey: apiKey.value,\r\n baseUrl: actualBaseUrl,\r\n proxyUrl: options.proxyUrl,\r\n fallbackToStatic: false\r\n });\r\n }\r\n models.value = fetchedModels;\r\n modelCache.set(cacheKey, fetchedModels);\r\n } catch (e) {\r\n console.warn('Model fetch failed:', e);\r\n fetchModelError.value = 'fetchModelsFailed';\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n // Don't cache failed results\r\n } finally {\r\n isFetchingModels.value = false;\r\n }\r\n }, 500);\r\n }, { immediate: true });\r\n\r\n // Reset test status when apiKey/baseUrl changes while in error/success state\r\n watch([apiKey, baseUrl], () => {\r\n if (testStatus.value === 'error' || testStatus.value === 'success') {\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n }\r\n });\r\n\r\n // Actions\r\n async function runTest() {\r\n if (!provider.value) return;\r\n if (provider.value.needsApiKey && !apiKey.value) return;\r\n\r\n testStatus.value = 'testing';\r\n testResult.value = null;\r\n\r\n let result: TestConnectionResult;\r\n\r\n if (options.modelFetcher) {\r\n try {\r\n const fetcherResult = await options.modelFetcher({\r\n type: 'checkConnection',\r\n providerId: provider.value.id,\r\n baseUrl: baseUrl.value || provider.value.baseUrl,\r\n apiKey: apiKey.value,\r\n modelId: model.value\r\n });\r\n result = {\r\n success: fetcherResult.success,\r\n latencyMs: fetcherResult.latency || fetcherResult.latencyMs,\r\n message: fetcherResult.message\r\n };\r\n } catch (e: any) {\r\n result = { success: false, message: e.message || 'Unknown error' };\r\n }\r\n } else {\r\n result = await testConnection({\r\n provider: provider.value,\r\n apiKey: apiKey.value,\r\n baseUrl: baseUrl.value,\r\n model: model.value,\r\n proxyUrl: options.proxyUrl\r\n });\r\n }\r\n\r\n testResult.value = result;\r\n testStatus.value = result.success ? 'success' : 'error';\r\n\r\n // Auto-revert to idle (always 2s)\r\n setTimeout(() => {\r\n testStatus.value = 'idle';\r\n }, 2000);\r\n\r\n return result;\r\n }\r\n\r\n function save() {\r\n const foundModel = models.value.find((m: Model) => m.id === model.value);\r\n const nameToSave = foundModel?.name || modelName.value || model.value;\r\n\r\n if (foundModel?.name && foundModel.name !== modelName.value) {\r\n modelName.value = foundModel.name;\r\n }\r\n\r\n storage.save({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: nameToSave,\r\n baseUrl: baseUrl.value\r\n });\r\n }\r\n\r\n function clear() {\r\n storage.clear();\r\n providerId.value = '';\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n }\r\n\r\n // Select a model (sets both id and name)\r\n function selectModel(modelId: string, name?: string) {\r\n model.value = modelId;\r\n // 如果提供了 name 就用,否则从 models 列表查找,最后用 id\r\n if (name) {\r\n modelName.value = name;\r\n } else {\r\n const found = models.value.find((m: Model) => m.id === modelId);\r\n modelName.value = found?.name || modelId;\r\n }\r\n }\r\n\r\n const isValid = computed(() => {\r\n if (!providerId.value || !model.value) return false;\r\n if (provider.value?.needsApiKey && !apiKey.value) return false;\r\n return true;\r\n });\r\n\r\n const currentConfig = computed<AIConfig>(() => ({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: modelName.value,\r\n baseUrl: baseUrl.value || provider.value?.baseUrl || ''\r\n }));\r\n\r\n return {\r\n // State (Refs)\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n isFetchingModels,\r\n fetchModelError,\r\n\r\n // Computed\r\n provider,\r\n providers: allProviders,\r\n isValid,\r\n config: currentConfig,\r\n\r\n // Actions\r\n runTest,\r\n save,\r\n clear,\r\n selectModel,\r\n };\r\n}\r\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst EMPTY_CHAR = \"\\0\";\nconst TickerUtils = {\n provideNumberList: () => \"0123456789\",\n provideAlphabeticalList: () => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n};\nclass TickerCharacterList {\n constructor(characterList) {\n __publicField(this, \"numOriginalCharacters\");\n __publicField(this, \"characterList\");\n __publicField(this, \"characterIndicesMap\");\n const charsArray = [...characterList];\n const length = charsArray.length;\n this.numOriginalCharacters = length;\n this.characterIndicesMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < length; i++) {\n this.characterIndicesMap.set(charsArray[i], i);\n }\n this.characterList = new Array(length * 2 + 1);\n this.characterList[0] = EMPTY_CHAR;\n for (let i = 0; i < length; i++) {\n this.characterList[1 + i] = charsArray[i];\n this.characterList[1 + length + i] = charsArray[i];\n }\n }\n getCharacterIndices(start, end, direction) {\n let startIndex = this.getIndexOfChar(start);\n let endIndex = this.getIndexOfChar(end);\n if (startIndex < 0 || endIndex < 0) return null;\n switch (direction) {\n case \"DOWN\":\n if (end === EMPTY_CHAR) {\n endIndex = this.characterList.length;\n } else if (endIndex < startIndex) {\n endIndex += this.numOriginalCharacters;\n }\n break;\n case \"UP\":\n if (startIndex < endIndex) {\n startIndex += this.numOriginalCharacters;\n }\n break;\n case \"ANY\":\n if (start !== EMPTY_CHAR && end !== EMPTY_CHAR) {\n if (endIndex < startIndex) {\n const nonWrap = startIndex - endIndex;\n const wrap = this.numOriginalCharacters - startIndex + endIndex;\n if (wrap < nonWrap) endIndex += this.numOriginalCharacters;\n } else if (startIndex < endIndex) {\n const nonWrap = endIndex - startIndex;\n const wrap = this.numOriginalCharacters - endIndex + startIndex;\n if (wrap < nonWrap) startIndex += this.numOriginalCharacters;\n }\n }\n break;\n }\n return { startIndex, endIndex };\n }\n getSupportedCharacters() {\n return new Set(this.characterIndicesMap.keys());\n }\n getCharacterList() {\n return this.characterList;\n }\n getIndexOfChar(c) {\n if (c === EMPTY_CHAR) return 0;\n if (this.characterIndicesMap.has(c)) return this.characterIndicesMap.get(c) + 1;\n return -1;\n }\n}\nconst ACTION_SAME = 0;\nconst ACTION_INSERT = 1;\nconst ACTION_DELETE = 2;\nfunction computeColumnActions(source, target, supported) {\n let si = 0, ti = 0;\n const actions = [];\n while (true) {\n const endS = si === source.length;\n const endT = ti === target.length;\n if (endS && endT) break;\n if (endS) {\n for (; ti < target.length; ti++) actions.push(ACTION_INSERT);\n break;\n }\n if (endT) {\n for (; si < source.length; si++) actions.push(ACTION_DELETE);\n break;\n }\n const sSupp = supported.has(source[si]);\n const tSupp = supported.has(target[ti]);\n if (sSupp && tSupp) {\n let se = si + 1, te = ti + 1;\n while (se < source.length && supported.has(source[se])) se++;\n while (te < target.length && supported.has(target[te])) te++;\n const sLen = se - si, tLen = te - ti;\n if (sLen === tLen) {\n for (let i = 0; i < sLen; i++) actions.push(ACTION_SAME);\n } else {\n const matrix = Array(sLen + 1).fill(null).map(() => Array(tLen + 1).fill(0));\n for (let i = 0; i <= sLen; i++) matrix[i][0] = i;\n for (let j = 0; j <= tLen; j++) matrix[0][j] = j;\n for (let r2 = 1; r2 <= sLen; r2++) {\n for (let c2 = 1; c2 <= tLen; c2++) {\n const cost = source[si + r2 - 1] === target[ti + c2 - 1] ? 0 : 1;\n matrix[r2][c2] = Math.min(matrix[r2 - 1][c2] + 1, matrix[r2][c2 - 1] + 1, matrix[r2 - 1][c2 - 1] + cost);\n }\n }\n const result = [];\n let r = sLen, c = tLen;\n while (r > 0 || c > 0) {\n if (r === 0) {\n result.push(ACTION_INSERT);\n c--;\n } else if (c === 0) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n const ins = matrix[r][c - 1], del = matrix[r - 1][c], rep = matrix[r - 1][c - 1];\n if (ins < del && ins < rep) {\n result.push(ACTION_INSERT);\n c--;\n } else if (del < rep) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n result.push(ACTION_SAME);\n r--;\n c--;\n }\n }\n }\n for (let i = result.length - 1; i >= 0; i--) actions.push(result[i]);\n }\n si = se;\n ti = te;\n } else if (sSupp) {\n actions.push(ACTION_INSERT);\n ti++;\n } else if (tSupp) {\n actions.push(ACTION_DELETE);\n si++;\n } else {\n actions.push(ACTION_SAME);\n si++;\n ti++;\n }\n }\n return actions;\n}\nfunction createColumn() {\n return {\n currentChar: EMPTY_CHAR,\n targetChar: EMPTY_CHAR,\n charList: null,\n startIndex: 0,\n endIndex: 0,\n sourceWidth: 0,\n currentWidth: 0,\n targetWidth: 0,\n directionAdj: 1,\n prevDelta: 0,\n currDelta: 0\n };\n}\nfunction setTarget(col, target, lists, dir) {\n const c = { ...col };\n c.targetChar = target;\n c.sourceWidth = c.currentWidth;\n c.targetWidth = target === EMPTY_CHAR ? 0 : 1;\n let found = false;\n for (const list of lists) {\n const indices = list.getCharacterIndices(c.currentChar, target, dir);\n if (indices) {\n c.charList = list.getCharacterList();\n c.startIndex = indices.startIndex;\n c.endIndex = indices.endIndex;\n found = true;\n break;\n }\n }\n if (!found) {\n c.charList = c.currentChar === target ? [c.currentChar] : [c.currentChar, target];\n c.startIndex = 0;\n c.endIndex = c.currentChar === target ? 0 : 1;\n }\n c.directionAdj = c.endIndex >= c.startIndex ? 1 : -1;\n c.prevDelta = c.currDelta;\n c.currDelta = 0;\n return c;\n}\nfunction applyProgress(col, progress, forceUpdate = false) {\n const c = { ...col };\n const total = Math.abs(c.endIndex - c.startIndex);\n const pos = progress * total;\n const offset = pos - Math.floor(pos);\n const additional = c.prevDelta * (1 - progress);\n const delta = offset * c.directionAdj + additional;\n const charIdx = c.startIndex + Math.floor(pos) * c.directionAdj;\n if (progress >= 1) {\n c.currentChar = c.targetChar;\n c.currDelta = 0;\n c.prevDelta = 0;\n } else if (forceUpdate && c.charList && charIdx >= 0 && charIdx < c.charList.length) {\n c.currentChar = c.charList[charIdx];\n c.currDelta = delta;\n }\n c.currentWidth = c.sourceWidth + (c.targetWidth - c.sourceWidth) * progress;\n return { col: c, charIdx, delta };\n}\nconst easingFunctions = {\n linear: (t) => t,\n easeIn: (t) => t * t,\n easeOut: (t) => 1 - (1 - t) * (1 - t),\n easeInOut: (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n};\nexport {\n ACTION_INSERT as A,\n EMPTY_CHAR as E,\n TickerUtils as T,\n TickerCharacterList as a,\n applyProgress as b,\n computeColumnActions as c,\n createColumn as d,\n ACTION_SAME as e,\n easingFunctions as f,\n ACTION_DELETE as g,\n setTarget as s\n};\n//# sourceMappingURL=TickerCore-C7Ejc9kB.js.map\n","import { defineComponent, ref, computed, watch, onUnmounted, createElementBlock, openBlock, normalizeClass, Fragment, renderList, normalizeStyle, toDisplayString, unref } from \"vue\";\nimport { a as TickerCharacterList, b as applyProgress, c as computeColumnActions, A as ACTION_INSERT, s as setTarget, d as createColumn, e as ACTION_SAME, E as EMPTY_CHAR, f as easingFunctions } from \"./TickerCore-C7Ejc9kB.js\";\nimport { g, T } from \"./TickerCore-C7Ejc9kB.js\";\nconst charHeight = 1.2;\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"Ticker\",\n props: {\n value: { type: String, required: true },\n characterLists: { type: Array, default: () => [\"0123456789\"] },\n duration: { type: Number, default: 500 },\n direction: { type: String, default: \"ANY\" },\n easing: { type: String, default: \"easeInOut\" },\n className: { type: String, default: \"\" },\n charWidth: { type: Number, default: 1 }\n },\n setup(__props) {\n const props = __props;\n const columns = ref([]);\n const progress = ref(1);\n let animId;\n const lists = computed(() => props.characterLists.map((s) => new TickerCharacterList(s)));\n const supported = computed(() => {\n const set = /* @__PURE__ */ new Set();\n lists.value.forEach((l) => l.getSupportedCharacters().forEach((c) => set.add(c)));\n return set;\n });\n watch(() => props.value, (newValue, oldValue) => {\n if (newValue === oldValue) return;\n if (animId) {\n cancelAnimationFrame(animId);\n animId = void 0;\n }\n let currentCols = columns.value;\n if (progress.value < 1 && progress.value > 0) {\n currentCols = currentCols.map((c) => applyProgress(c, progress.value, true).col);\n }\n const targetChars = [...newValue];\n const sourceChars = currentCols.map((c) => c.currentChar);\n const actions = computeColumnActions(sourceChars, targetChars, supported.value);\n let ci = 0, ti = 0;\n const result = [];\n const validCols = currentCols.filter((c) => c.currentWidth > 0);\n for (const action of actions) {\n if (action === ACTION_INSERT) {\n result.push(setTarget(createColumn(), targetChars[ti++], lists.value, props.direction));\n } else if (action === ACTION_SAME) {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, targetChars[ti++], lists.value, props.direction));\n } else {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, EMPTY_CHAR, lists.value, props.direction));\n }\n }\n columns.value = result;\n progress.value = 0;\n const start = performance.now();\n const dur = props.duration;\n const easeFn = easingFunctions[props.easing] || easingFunctions.linear;\n let lastUpdate = 0;\n const animate = (now) => {\n const linearP = Math.min((now - start) / dur, 1);\n const p = easeFn(linearP);\n const shouldUpdate = now - lastUpdate >= 16 || linearP >= 1;\n if (shouldUpdate) {\n lastUpdate = now;\n progress.value = p;\n }\n if (linearP < 1) {\n animId = requestAnimationFrame(animate);\n } else {\n const final = columns.value.map((c) => applyProgress(c, 1).col).filter((c) => c.currentWidth > 0);\n columns.value = final;\n progress.value = 1;\n animId = void 0;\n }\n };\n animId = requestAnimationFrame(animate);\n }, { immediate: true });\n onUnmounted(() => {\n if (animId) cancelAnimationFrame(animId);\n });\n const renderedColumns = computed(() => {\n return columns.value.map((col) => {\n const { charIdx, delta } = applyProgress(col, progress.value);\n const width = col.sourceWidth + (col.targetWidth - col.sourceWidth) * progress.value;\n if (width <= 0) return { width, chars: [] };\n const chars = [];\n const list = col.charList || [];\n const deltaEm = delta * charHeight;\n const add = (idx, offsetMod, keyPrefix) => {\n if (idx >= 0 && idx < list.length) {\n chars.push({\n key: `${keyPrefix}-${idx}`,\n char: list[idx],\n offset: deltaEm + offsetMod\n });\n }\n };\n add(charIdx, 0, \"c\");\n add(charIdx + 1, -charHeight, \"n\");\n add(charIdx - 1, charHeight, \"p\");\n const isFW = (c) => c && c.length > 0 && c.charCodeAt(0) > 255;\n const getW = (c) => isFW(c) ? 1.25 : 0.8;\n const startChar = list[col.startIndex] || \"\";\n const endChar = list[col.endIndex] || \"\";\n const w1 = getW(startChar);\n const w2 = getW(endChar);\n const baseW = w1 + (w2 - w1) * progress.value;\n return { width, chars, baseW };\n }).filter((c) => c.width > 0);\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"ticker\", __props.className])\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(renderedColumns.value, (col, i) => {\n return openBlock(), createElementBlock(\"div\", {\n key: i,\n class: \"ticker-column\",\n style: normalizeStyle({ width: `${col.width * (col.baseW || 0.8) * __props.charWidth}em` })\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(col.chars, (charObj) => {\n return openBlock(), createElementBlock(\"div\", {\n key: charObj.key,\n class: \"ticker-char\",\n style: normalizeStyle({ transform: `translateY(${charObj.offset}em)` })\n }, toDisplayString(charObj.char === unref(EMPTY_CHAR) ? \" \" : charObj.char), 5);\n }), 128))\n ], 4);\n }), 128))\n ], 2);\n };\n }\n});\nconst _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\nconst Ticker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-7e47ac69\"]]);\nexport {\n g as ACTION_DELETE,\n ACTION_INSERT,\n ACTION_SAME,\n EMPTY_CHAR,\n Ticker,\n TickerCharacterList,\n T as TickerUtils,\n applyProgress,\n computeColumnActions,\n createColumn,\n easingFunctions,\n setTarget\n};\n//# sourceMappingURL=vue.js.map\n","<script setup lang=\"ts\">\r\nimport { Ticker as SmartTicker } from '@tombcato/smart-ticker/vue';\r\nimport '@tombcato/smart-ticker/style.css';\r\n\r\nconst props = defineProps<{\r\n text?: string;\r\n className?: string;\r\n placeholder?: string;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"!text && placeholder\" :class=\"['apmsu-placeholder', className]\">\r\n {{ placeholder }}\r\n </span>\r\n <span v-else-if=\"text\" :class=\"['inline-flex min-w-0', className]\">\r\n <SmartTicker :value=\"text\" :char-width=\"0.8\" :duration=\"300\" />\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n providers: Provider[];\r\n selectedProviderId: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [providerId: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\nconst selectedProvider = computed(() => props.providers.find(p => p.id === props.selectedProviderId));\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string) {\r\n emit('select', id);\r\n isOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label\">{{ t.providerLabel }}</label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && (isOpen = !isOpen)\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <div v-if=\"selectedProvider\" class=\"flex items-center gap-2 min-w-0\">\r\n <img :src=\"selectedProvider.icon\" :alt=\"selectedProvider.name\" class=\"apmsu-provider-icon\" />\r\n <SmartText :text=\"selectedProvider.name\" />\r\n </div>\r\n <span v-else class=\"apmsu-placeholder\">{{ t.selectProvider }}</span>\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <button\r\n v-for=\"p in providers\"\r\n :key=\"p.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(p.id)\"\r\n :class=\"['apmsu-dropdown-item rounded-sm', selectedProviderId === p.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <div class=\"flex items-center gap-2 flex-shrink-0\">\r\n <img :src=\"p.icon\" :alt=\"p.name\" class=\"apmsu-provider-icon\" />\r\n <span class=\"font-medium whitespace-nowrap\">{{ p.name }}</span>\r\n </div>\r\n <span class=\"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0\">\r\n {{ p.baseUrl.replace('https://', '') }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n apiKey: string;\r\n testStatus: 'idle' | 'testing' | 'success' | 'error';\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:apiKey': [value: string];\r\n}>();\r\n\r\nconst isVisible = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst inputClass = computed(() => {\r\n if (props.testStatus === 'success') return 'apmsu-input apmsu-input-success';\r\n return 'apmsu-input apmsu-input-default';\r\n});\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"provider && provider.needsApiKey\" class=\"apmsu-field\">\r\n <label class=\"apmsu-label\">{{ t.apiKeyLabel }}</label>\r\n <div class=\"relative\">\r\n <input\r\n :type=\"isVisible ? 'text' : 'password'\"\r\n :value=\"apiKey\"\r\n @input=\"emit('update:apiKey', ($event.target as HTMLInputElement).value)\"\r\n @focus=\"isVisible = true\"\r\n @blur=\"isVisible = false\"\r\n :placeholder=\"t.apiKeyPlaceholder\"\r\n :disabled=\"disabled\"\r\n :class=\"[inputClass, 'pr-10']\"\r\n />\r\n <span class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center\">\r\n <svg v-if=\"isVisible\" class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\r\n </svg>\r\n <svg v-else class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider, type Model } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n models: Model[];\r\n selectedModelId: string;\r\n hasApiKey: boolean;\r\n disabled?: boolean;\r\n language?: Language;\r\n isFetchingModels?: boolean;\r\n fetchModelError?: string | null;\r\n selectedModelName?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [modelId: string, modelName?: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst modelSearch = ref('');\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst filteredModels = computed(() =>\r\n props.models.filter(m =>\r\n m.name.toLowerCase().includes(modelSearch.value.toLowerCase()) ||\r\n m.id.toLowerCase().includes(modelSearch.value.toLowerCase())\r\n )\r\n);\r\n\r\nconst activeModelName = computed(() => \r\n props.models.find(m => m.id === props.selectedModelId)?.name || props.selectedModelName || props.selectedModelId\r\n);\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string, name?: string) {\r\n emit('select', id, name);\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label flex items-center justify-between\">\r\n <span>{{ t.modelLabel }}</span>\r\n </label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && provider && (isOpen = !isOpen)\"\r\n :disabled=\"disabled || !provider\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <SmartText \r\n :text=\"activeModelName ? activeModelName : ''\"\r\n :placeholder=\"t.selectModel\"\r\n />\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <div class=\"p-1.5 border-b border-gray-100 dark:border-zinc-800\">\r\n <input\r\n type=\"text\"\r\n v-model=\"modelSearch\"\r\n :placeholder=\"t.searchModel\"\r\n class=\"apmsu-select-trigger\"\r\n :autofocus=\"isOpen\"\r\n />\r\n </div>\r\n <div class=\"max-h-60 overflow-auto\">\r\n <button\r\n v-if=\"modelSearch && !filteredModels.some(m => m.id === modelSearch)\"\r\n type=\"button\"\r\n @click=\"handleSelect(modelSearch)\"\r\n class=\"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b\"\r\n >\r\n <span class=\"text-blue-500\">{{ t.useCustom }}: {{ modelSearch }}</span>\r\n </button>\r\n <button\r\n v-for=\"m in filteredModels\"\r\n :key=\"m.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(m.id, m.name)\"\r\n :class=\"['apmsu-dropdown-item', selectedModelId === m.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <span>{{ m.name }}</span>\r\n </button>\r\n <div v-if=\"filteredModels.length === 0 && !modelSearch\" class=\"p-4 text-center apmsu-hint-text\">\r\n {{ t.noModels }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Status Messages Container - only for supportsModelsApi providers -->\r\n <div v-if=\"provider?.supportsModelsApi\" class=\"min-h-[20px] flex items-center\">\r\n <p v-if=\"isFetchingModels\" class=\"apmsu-hint-text animate-pulse\">\r\n {{ t.refreshingModels }}\r\n </p>\r\n \r\n <p v-else-if=\"fetchModelError\" class=\"apmsu-hint-text dark:text-zinc-500\">\r\n {{ (t as any)[fetchModelError] || fetchModelError }}\r\n </p>\r\n\r\n <p v-else-if=\"provider?.needsApiKey && !hasApiKey\" class=\"apmsu-hint-text\">\r\n {{ t.apiKeyTip }}\r\n </p>\r\n\r\n <p v-else class=\"apmsu-hint-text\">\r\n {{ t.modelListUpdated }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n baseUrl: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:baseUrl': [value: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"provider\">\r\n <button\r\n type=\"button\"\r\n @click=\"isOpen = !isOpen\"\r\n class=\"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors\"\r\n >\r\n <svg \r\n :class=\"['w-3 h-3 transition-transform', isOpen && 'rotate-90']\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n {{ t.customBaseUrl }}\r\n </button>\r\n\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <input\r\n type=\"text\"\r\n :value=\"baseUrl\"\r\n @input=\"emit('update:baseUrl', ($event.target as HTMLInputElement).value)\"\r\n :placeholder=\"provider.baseUrl\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-input apmsu-input-default\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue';\r\nimport { useAIConfig } from './useAIConfig';\r\n\r\nimport { I18N, type Language, type AIConfig, type ProviderConfig, type TestConnectionResult, type ModelFetcher } from '@tombcato/ai-selector-core';\r\n\r\n// Sub-components\r\nimport ProviderSelect from './ProviderSelect.vue';\r\nimport AuthInput from './AuthInput.vue';\r\nimport ModelSelect from './ModelSelect.vue';\r\nimport BaseUrlInput from './BaseUrlInput.vue';\r\n\r\ninterface Props {\r\n proxyUrl: string;\r\n config?: ProviderConfig;\r\n initialConfig?: Partial<AIConfig>;\r\n title?: string;\r\n showPreview?: boolean;\r\n saveButtonText?: string;\r\n disabled?: boolean;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n language?: Language;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n showPreview: false,\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n save: [config: AIConfig];\r\n testResult: [result: TestConnectionResult];\r\n change: [config: Partial<AIConfig>];\r\n}>();\r\n\r\nconst {\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n provider,\r\n providers,\r\n isValid,\r\n config: currentConfig,\r\n runTest,\r\n save,\r\n selectModel,\r\n isFetchingModels,\r\n fetchModelError,\r\n} = useAIConfig({\r\n proxyUrl: props.proxyUrl,\r\n providerConfig: props.config,\r\n initialConfig: props.initialConfig,\r\n onSerialize: props.onSerialize,\r\n onDeserialize: props.onDeserialize,\r\n modelFetcher: props.modelFetcher,\r\n});\r\n\r\nconst t = computed(() => I18N[props.language]);\r\nconst saveStatus = ref<'idle' | 'saved'>('idle');\r\nconst isPreviewOpen = ref(false);\r\n\r\n// Watch for changes\r\nwatch([providerId, apiKey, model, baseUrl], () => {\r\n emit('change', {\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n baseUrl: baseUrl.value,\r\n });\r\n});\r\n\r\n// Watch test result\r\nwatch(testResult, (result) => {\r\n if (result) emit('testResult', result);\r\n});\r\n\r\n// Handle save\r\nfunction handleSave() {\r\n save();\r\n saveStatus.value = 'saved';\r\n emit('save', currentConfig.value);\r\n setTimeout(() => { saveStatus.value = 'idle'; }, 2000);\r\n}\r\n\r\n// Handler wrappers for vue events\r\nfunction updateProvider(id: string) {\r\n providerId.value = id;\r\n}\r\n\r\nfunction updateApiKey(val: string) {\r\n apiKey.value = val;\r\n}\r\n\r\nfunction updateModel(id: string, name?: string) {\r\n selectModel(id, name);\r\n}\r\n\r\nfunction updateBaseUrl(val: string) {\r\n baseUrl.value = val;\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-card\">\r\n <h2 v-if=\"title\" class=\"text-lg font-semibold mb-4\">{{ title }}</h2>\r\n\r\n <div class=\"space-y-3\">\r\n <ProviderSelect\r\n :providers=\"providers\"\r\n :selectedProviderId=\"providerId\"\r\n @select=\"updateProvider\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <BaseUrlInput\r\n :provider=\"provider\"\r\n :baseUrl=\"baseUrl\"\r\n @update:baseUrl=\"updateBaseUrl\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <!-- Auth & Model Collapsible Section -->\r\n <div :class=\"['transition-all duration-500 ease-in-out', providerId ? 'max-h-[1000px] opacity-100 overflow-visible' : 'max-h-0 opacity-0 overflow-hidden']\">\r\n <div class=\"space-y-4\">\r\n <AuthInput\r\n :provider=\"provider\"\r\n :apiKey=\"apiKey\"\r\n @update:apiKey=\"updateApiKey\"\r\n :testStatus=\"testStatus\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n />\r\n\r\n <ModelSelect\r\n :provider=\"provider\"\r\n :models=\"models\"\r\n :selectedModelId=\"model\"\r\n @select=\"updateModel\"\r\n :hasApiKey=\"!!apiKey\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n :selectedModelName=\"modelName\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"pt-2 space-y-2\">\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n @click=\"runTest()\"\r\n :disabled=\"!providerId || !apiKey || !model || disabled || testStatus === 'testing'\"\r\n :class=\"['apmsu-btn flex-1', \r\n testStatus === 'success' ? 'apmsu-btn-success' : \r\n testStatus === 'error' ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40' : \r\n 'apmsu-btn-ghost border border-gray-200 dark:border-zinc-700'\r\n ]\"\r\n >\r\n <span v-if=\"testStatus === 'testing'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n {{ t.testing }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'success'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-success\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\r\n </svg>\r\n {{ t.testSuccess }} {{ testResult?.latencyMs ? `${testResult.latencyMs}ms` : '' }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'error'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-error\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\r\n </svg>\r\n {{ t.testFailed }}\r\n </span>\r\n <template v-else>{{ t.testConnection }}</template>\r\n </button>\r\n\r\n <button\r\n @click=\"handleSave\"\r\n :disabled=\"!isValid || disabled\"\r\n :class=\"['apmsu-btn flex-1', saveStatus === 'saved' ? 'apmsu-btn-success' : 'apmsu-btn-primary']\"\r\n >\r\n <span v-if=\"saveStatus === 'saved'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n {{ t.saved }}\r\n </span>\r\n <template v-else>{{ saveButtonText || t.save }}</template>\r\n </button>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: (!testResult?.success && testResult?.message && testStatus !== 'testing' && testStatus !== 'success') ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <div class=\"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800\">\r\n <p class=\"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left\">{{ testResult?.message }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Config Preview - Collapsible -->\r\n <div v-if=\"showPreview && provider\" class=\"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n @click=\"isPreviewOpen = !isPreviewOpen\"\r\n class=\"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors\"\r\n >\r\n <h3 class=\"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider\">{{ t.preview }}</h3>\r\n <svg \r\n :class=\"['w-4 h-4 text-gray-400 transition-transform duration-200', isPreviewOpen ? 'rotate-180' : '']\"\r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <div \r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isPreviewOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <pre class=\"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50\">\r\n{{ JSON.stringify({\r\n provider: provider.name,\r\n apiFormat: provider.apiFormat,\r\n baseUrl: baseUrl || provider.baseUrl,\r\n model: model || t.unselected,\r\n hasApiKey: !!apiKey\r\n}, null, 2) }}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n/* 样式已在 main.ts 中通过 style.css 导入 */\r\n</style>\r\n"],"names":["useAIConfig","options","providerId","ref","_a","apiKey","_b","model","_c","modelName","_d","baseUrl","_e","models","testStatus","testResult","isFetchingModels","fetchModelError","resolvedConfig","computed","resolveProviderConfig","allProviders","provider","p","storage","createConfigStorage","isLoaded","onMounted","saved","watch","fetchTimer","modelCache","shouldFetch","actualBaseUrl","cacheKey","cachedModels","staticModels","fetchedModels","fetchModels","e","runTest","result","fetcherResult","testConnection","save","foundModel","m","nameToSave","clear","selectModel","modelId","name","found","isValid","currentConfig","__defProp","__defNormalProp","obj","key","value","__publicField","EMPTY_CHAR","TickerCharacterList","characterList","charsArray","length","i","start","end","direction","startIndex","endIndex","nonWrap","c","ACTION_SAME","ACTION_INSERT","ACTION_DELETE","computeColumnActions","source","target","supported","si","ti","actions","endS","endT","sSupp","tSupp","se","te","sLen","tLen","matrix","j","r2","c2","cost","r","ins","del","rep","createColumn","setTarget","col","lists","dir","list","indices","applyProgress","progress","forceUpdate","total","pos","offset","additional","delta","charIdx","easingFunctions","t","charHeight","_sfc_main","defineComponent","__props","props","columns","animId","s","set","l","newValue","oldValue","currentCols","targetChars","sourceChars","ci","validCols","action","existing","dur","easeFn","lastUpdate","animate","now","linearP","final","onUnmounted","renderedColumns","width","chars","deltaEm","add","idx","offsetMod","keyPrefix","isFW","getW","startChar","endChar","w1","w2","baseW","_ctx","_cache","openBlock","createElementBlock","normalizeClass","Fragment","renderList","normalizeStyle","charObj","toDisplayString","unref","_export_sfc","sfc","val","Ticker","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","I18N","selectedProvider","handleClickOutside","handleSelect","id","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","$event","_openBlock","_hoisted_4","SmartText","_hoisted_6","_Fragment","_renderList","_normalizeClass","_hoisted_8","_hoisted_10","_hoisted_11","isVisible","inputClass","_hoisted_3","_hoisted_5","_hoisted_7","modelSearch","filteredModels","activeModelName","_hoisted_9","_hoisted_12","_hoisted_13","_hoisted_14","providers","saveStatus","isPreviewOpen","handleSave","updateProvider","updateApiKey","updateModel","updateBaseUrl","ProviderSelect","BaseUrlInput","AuthInput","ModelSelect","_createTextVNode","_normalizeStyle","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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","x_google_ignoreList":[1,2]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/useAIConfig.ts","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/TickerCore-C7Ejc9kB.js","../../../node_modules/.pnpm/@tombcato+smart-ticker@1.0._add73ef6986dd10d53023186e7f9a4fd/node_modules/@tombcato/smart-ticker/dist/vue.js","../src/SmartText.vue","../src/ProviderSelect.vue","../src/AuthInput.vue","../src/ModelSelect.vue","../src/BaseUrlInput.vue","../src/AIConfigForm.vue"],"sourcesContent":["import { ref, computed, watch, onMounted } from 'vue';\r\nimport {\r\n testConnection,\r\n createConfigStorage,\r\n resolveProviderConfig,\r\n type Model,\r\n type AIConfig,\r\n type TestConnectionResult,\r\n type ProviderConfig,\r\n fetchModels,\r\n type ModelFetcher,\r\n} from '@tombcato/ai-selector-core';\r\n\r\nexport interface UseAIConfigOptions {\r\n proxyUrl?: string;\r\n initialConfig?: Partial<AIConfig>;\r\n providerConfig?: ProviderConfig;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nexport function useAIConfig(options: UseAIConfigOptions = {}) {\r\n const providerId = ref(options.initialConfig?.providerId || '');\r\n const apiKey = ref(options.initialConfig?.apiKey || '');\r\n const model = ref(options.initialConfig?.model || '');\r\n const modelName = ref(options.initialConfig?.modelName || '');\r\n const baseUrl = ref(options.initialConfig?.baseUrl || '');\r\n\r\n const models = ref<Model[]>([]);\r\n const testStatus = ref<'idle' | 'testing' | 'success' | 'error'>('idle');\r\n const testResult = ref<TestConnectionResult | null>(null);\r\n const isFetchingModels = ref(false);\r\n const fetchModelError = ref<string | null>(null);\r\n\r\n // Resolve provider config\r\n const resolvedConfig = computed(() => resolveProviderConfig(options.providerConfig));\r\n const allProviders = computed(() => resolvedConfig.value.providers);\r\n\r\n const provider = computed(() =>\r\n allProviders.value.find((p: any) => p.id === providerId.value) || null\r\n );\r\n\r\n const storage = createConfigStorage(undefined, {\r\n serialize: options.onSerialize,\r\n deserialize: options.onDeserialize\r\n });\r\n\r\n // Flag to prevent clearing data during initial load\r\n const isLoaded = ref(false);\r\n\r\n // Load config\r\n onMounted(() => {\r\n const saved = storage.load();\r\n if (saved) {\r\n // Only load if provider exists in current config\r\n if (saved.providerId && allProviders.value.some((p: any) => p.id === saved.providerId)) {\r\n providerId.value = saved.providerId;\r\n if (saved.apiKey) apiKey.value = saved.apiKey;\r\n if (saved.model) model.value = saved.model;\r\n if (saved.modelName) modelName.value = saved.modelName;\r\n if (saved.baseUrl) baseUrl.value = saved.baseUrl;\r\n }\r\n }\r\n setTimeout(() => { isLoaded.value = true; }, 0);\r\n });\r\n\r\n // Watch for provider changes to reset fields\r\n watch(providerId, () => {\r\n if (!isLoaded.value) return;\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n });\r\n\r\n // Watch for provider/apikey/baseurl to update models (with caching)\r\n let fetchTimer: any = null;\r\n const modelCache = new Map<string, Model[]>();\r\n\r\n watch([providerId, apiKey, baseUrl], () => {\r\n if (fetchTimer) clearTimeout(fetchTimer);\r\n\r\n if (!providerId.value || !provider.value) {\r\n models.value = [];\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n const shouldFetch = provider.value.supportsModelsApi && (!provider.value.needsApiKey || !!apiKey.value);\r\n const actualBaseUrl = baseUrl.value || provider.value.baseUrl;\r\n const cacheKey = `${providerId.value}|${actualBaseUrl}|${apiKey.value}`;\r\n\r\n // Check cache first\r\n const cachedModels = modelCache.get(cacheKey);\r\n if (cachedModels) {\r\n models.value = cachedModels;\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n if (!shouldFetch) {\r\n const staticModels = resolvedConfig.value.getModels(providerId.value);\r\n models.value = staticModels;\r\n modelCache.set(cacheKey, staticModels);\r\n fetchModelError.value = null;\r\n isFetchingModels.value = false;\r\n return;\r\n }\r\n\r\n // Set fetching immediately to fill debounce gap\r\n isFetchingModels.value = true;\r\n fetchModelError.value = null;\r\n\r\n // Pre-fill with static models if empty to avoid flicker\r\n if (models.value.length === 0) {\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n }\r\n\r\n fetchTimer = setTimeout(async () => {\r\n try {\r\n let fetchedModels: Model[];\r\n\r\n if (options.modelFetcher) {\r\n fetchedModels = await options.modelFetcher({\r\n type: 'fetchModels',\r\n providerId: provider.value!.id,\r\n baseUrl: actualBaseUrl,\r\n apiKey: apiKey.value\r\n });\r\n } else {\r\n fetchedModels = await fetchModels({\r\n provider: provider.value!,\r\n apiKey: apiKey.value,\r\n baseUrl: actualBaseUrl,\r\n proxyUrl: options.proxyUrl,\r\n fallbackToStatic: false\r\n });\r\n }\r\n models.value = fetchedModels;\r\n modelCache.set(cacheKey, fetchedModels);\r\n } catch (e) {\r\n console.warn('Model fetch failed:', e);\r\n fetchModelError.value = 'fetchModelsFailed';\r\n models.value = resolvedConfig.value.getModels(providerId.value);\r\n // Don't cache failed results\r\n } finally {\r\n isFetchingModels.value = false;\r\n }\r\n }, 500);\r\n }, { immediate: true });\r\n\r\n // Reset test status when apiKey/baseUrl changes while in error/success state\r\n watch([apiKey, baseUrl], () => {\r\n if (testStatus.value === 'error' || testStatus.value === 'success') {\r\n testStatus.value = 'idle';\r\n testResult.value = null;\r\n }\r\n });\r\n\r\n // Actions\r\n async function runTest() {\r\n if (!provider.value) return;\r\n if (provider.value.needsApiKey && !apiKey.value) return;\r\n\r\n testStatus.value = 'testing';\r\n testResult.value = null;\r\n\r\n let result: TestConnectionResult;\r\n\r\n if (options.modelFetcher) {\r\n try {\r\n const fetcherResult = await options.modelFetcher({\r\n type: 'checkConnection',\r\n providerId: provider.value.id,\r\n baseUrl: baseUrl.value || provider.value.baseUrl,\r\n apiKey: apiKey.value,\r\n modelId: model.value\r\n });\r\n result = {\r\n success: fetcherResult.success,\r\n latencyMs: fetcherResult.latency || fetcherResult.latencyMs,\r\n message: fetcherResult.message\r\n };\r\n } catch (e: any) {\r\n result = { success: false, message: e.message || 'Unknown error' };\r\n }\r\n } else {\r\n result = await testConnection({\r\n provider: provider.value,\r\n apiKey: apiKey.value,\r\n baseUrl: baseUrl.value,\r\n model: model.value,\r\n proxyUrl: options.proxyUrl\r\n });\r\n }\r\n\r\n testResult.value = result;\r\n testStatus.value = result.success ? 'success' : 'error';\r\n\r\n // Auto-revert to idle (always 2s)\r\n setTimeout(() => {\r\n testStatus.value = 'idle';\r\n }, 2000);\r\n\r\n return result;\r\n }\r\n\r\n function save() {\r\n const foundModel = models.value.find((m: Model) => m.id === model.value);\r\n const nameToSave = foundModel?.name || modelName.value || model.value;\r\n\r\n if (foundModel?.name && foundModel.name !== modelName.value) {\r\n modelName.value = foundModel.name;\r\n }\r\n\r\n storage.save({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: nameToSave,\r\n baseUrl: baseUrl.value\r\n });\r\n }\r\n\r\n function clear() {\r\n storage.clear();\r\n providerId.value = '';\r\n apiKey.value = '';\r\n model.value = '';\r\n modelName.value = '';\r\n baseUrl.value = '';\r\n }\r\n\r\n // Select a model (sets both id and name)\r\n function selectModel(modelId: string, name?: string) {\r\n model.value = modelId;\r\n // 如果提供了 name 就用,否则从 models 列表查找,最后用 id\r\n if (name) {\r\n modelName.value = name;\r\n } else {\r\n const found = models.value.find((m: Model) => m.id === modelId);\r\n modelName.value = found?.name || modelId;\r\n }\r\n }\r\n\r\n const isValid = computed(() => {\r\n if (!providerId.value || !model.value) return false;\r\n if (provider.value?.needsApiKey && !apiKey.value) return false;\r\n return true;\r\n });\r\n\r\n const currentConfig = computed<AIConfig>(() => ({\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n modelName: modelName.value,\r\n baseUrl: baseUrl.value || provider.value?.baseUrl || ''\r\n }));\r\n\r\n return {\r\n // State (Refs)\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n isFetchingModels,\r\n fetchModelError,\r\n\r\n // Computed\r\n provider,\r\n providers: allProviders,\r\n isValid,\r\n config: currentConfig,\r\n\r\n // Actions\r\n runTest,\r\n save,\r\n clear,\r\n selectModel,\r\n };\r\n}\r\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst EMPTY_CHAR = \"\\0\";\nconst TickerUtils = {\n provideNumberList: () => \"0123456789\",\n provideAlphabeticalList: () => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n};\nclass TickerCharacterList {\n constructor(characterList) {\n __publicField(this, \"numOriginalCharacters\");\n __publicField(this, \"characterList\");\n __publicField(this, \"characterIndicesMap\");\n const charsArray = [...characterList];\n const length = charsArray.length;\n this.numOriginalCharacters = length;\n this.characterIndicesMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < length; i++) {\n this.characterIndicesMap.set(charsArray[i], i);\n }\n this.characterList = new Array(length * 2 + 1);\n this.characterList[0] = EMPTY_CHAR;\n for (let i = 0; i < length; i++) {\n this.characterList[1 + i] = charsArray[i];\n this.characterList[1 + length + i] = charsArray[i];\n }\n }\n getCharacterIndices(start, end, direction) {\n let startIndex = this.getIndexOfChar(start);\n let endIndex = this.getIndexOfChar(end);\n if (startIndex < 0 || endIndex < 0) return null;\n switch (direction) {\n case \"DOWN\":\n if (end === EMPTY_CHAR) {\n endIndex = this.characterList.length;\n } else if (endIndex < startIndex) {\n endIndex += this.numOriginalCharacters;\n }\n break;\n case \"UP\":\n if (startIndex < endIndex) {\n startIndex += this.numOriginalCharacters;\n }\n break;\n case \"ANY\":\n if (start !== EMPTY_CHAR && end !== EMPTY_CHAR) {\n if (endIndex < startIndex) {\n const nonWrap = startIndex - endIndex;\n const wrap = this.numOriginalCharacters - startIndex + endIndex;\n if (wrap < nonWrap) endIndex += this.numOriginalCharacters;\n } else if (startIndex < endIndex) {\n const nonWrap = endIndex - startIndex;\n const wrap = this.numOriginalCharacters - endIndex + startIndex;\n if (wrap < nonWrap) startIndex += this.numOriginalCharacters;\n }\n }\n break;\n }\n return { startIndex, endIndex };\n }\n getSupportedCharacters() {\n return new Set(this.characterIndicesMap.keys());\n }\n getCharacterList() {\n return this.characterList;\n }\n getIndexOfChar(c) {\n if (c === EMPTY_CHAR) return 0;\n if (this.characterIndicesMap.has(c)) return this.characterIndicesMap.get(c) + 1;\n return -1;\n }\n}\nconst ACTION_SAME = 0;\nconst ACTION_INSERT = 1;\nconst ACTION_DELETE = 2;\nfunction computeColumnActions(source, target, supported) {\n let si = 0, ti = 0;\n const actions = [];\n while (true) {\n const endS = si === source.length;\n const endT = ti === target.length;\n if (endS && endT) break;\n if (endS) {\n for (; ti < target.length; ti++) actions.push(ACTION_INSERT);\n break;\n }\n if (endT) {\n for (; si < source.length; si++) actions.push(ACTION_DELETE);\n break;\n }\n const sSupp = supported.has(source[si]);\n const tSupp = supported.has(target[ti]);\n if (sSupp && tSupp) {\n let se = si + 1, te = ti + 1;\n while (se < source.length && supported.has(source[se])) se++;\n while (te < target.length && supported.has(target[te])) te++;\n const sLen = se - si, tLen = te - ti;\n if (sLen === tLen) {\n for (let i = 0; i < sLen; i++) actions.push(ACTION_SAME);\n } else {\n const matrix = Array(sLen + 1).fill(null).map(() => Array(tLen + 1).fill(0));\n for (let i = 0; i <= sLen; i++) matrix[i][0] = i;\n for (let j = 0; j <= tLen; j++) matrix[0][j] = j;\n for (let r2 = 1; r2 <= sLen; r2++) {\n for (let c2 = 1; c2 <= tLen; c2++) {\n const cost = source[si + r2 - 1] === target[ti + c2 - 1] ? 0 : 1;\n matrix[r2][c2] = Math.min(matrix[r2 - 1][c2] + 1, matrix[r2][c2 - 1] + 1, matrix[r2 - 1][c2 - 1] + cost);\n }\n }\n const result = [];\n let r = sLen, c = tLen;\n while (r > 0 || c > 0) {\n if (r === 0) {\n result.push(ACTION_INSERT);\n c--;\n } else if (c === 0) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n const ins = matrix[r][c - 1], del = matrix[r - 1][c], rep = matrix[r - 1][c - 1];\n if (ins < del && ins < rep) {\n result.push(ACTION_INSERT);\n c--;\n } else if (del < rep) {\n result.push(ACTION_DELETE);\n r--;\n } else {\n result.push(ACTION_SAME);\n r--;\n c--;\n }\n }\n }\n for (let i = result.length - 1; i >= 0; i--) actions.push(result[i]);\n }\n si = se;\n ti = te;\n } else if (sSupp) {\n actions.push(ACTION_INSERT);\n ti++;\n } else if (tSupp) {\n actions.push(ACTION_DELETE);\n si++;\n } else {\n actions.push(ACTION_SAME);\n si++;\n ti++;\n }\n }\n return actions;\n}\nfunction createColumn() {\n return {\n currentChar: EMPTY_CHAR,\n targetChar: EMPTY_CHAR,\n charList: null,\n startIndex: 0,\n endIndex: 0,\n sourceWidth: 0,\n currentWidth: 0,\n targetWidth: 0,\n directionAdj: 1,\n prevDelta: 0,\n currDelta: 0\n };\n}\nfunction setTarget(col, target, lists, dir) {\n const c = { ...col };\n c.targetChar = target;\n c.sourceWidth = c.currentWidth;\n c.targetWidth = target === EMPTY_CHAR ? 0 : 1;\n let found = false;\n for (const list of lists) {\n const indices = list.getCharacterIndices(c.currentChar, target, dir);\n if (indices) {\n c.charList = list.getCharacterList();\n c.startIndex = indices.startIndex;\n c.endIndex = indices.endIndex;\n found = true;\n break;\n }\n }\n if (!found) {\n c.charList = c.currentChar === target ? [c.currentChar] : [c.currentChar, target];\n c.startIndex = 0;\n c.endIndex = c.currentChar === target ? 0 : 1;\n }\n c.directionAdj = c.endIndex >= c.startIndex ? 1 : -1;\n c.prevDelta = c.currDelta;\n c.currDelta = 0;\n return c;\n}\nfunction applyProgress(col, progress, forceUpdate = false) {\n const c = { ...col };\n const total = Math.abs(c.endIndex - c.startIndex);\n const pos = progress * total;\n const offset = pos - Math.floor(pos);\n const additional = c.prevDelta * (1 - progress);\n const delta = offset * c.directionAdj + additional;\n const charIdx = c.startIndex + Math.floor(pos) * c.directionAdj;\n if (progress >= 1) {\n c.currentChar = c.targetChar;\n c.currDelta = 0;\n c.prevDelta = 0;\n } else if (forceUpdate && c.charList && charIdx >= 0 && charIdx < c.charList.length) {\n c.currentChar = c.charList[charIdx];\n c.currDelta = delta;\n }\n c.currentWidth = c.sourceWidth + (c.targetWidth - c.sourceWidth) * progress;\n return { col: c, charIdx, delta };\n}\nconst easingFunctions = {\n linear: (t) => t,\n easeIn: (t) => t * t,\n easeOut: (t) => 1 - (1 - t) * (1 - t),\n easeInOut: (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) {\n return n1 * t * t;\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75;\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375;\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375;\n }\n }\n};\nexport {\n ACTION_INSERT as A,\n EMPTY_CHAR as E,\n TickerUtils as T,\n TickerCharacterList as a,\n applyProgress as b,\n computeColumnActions as c,\n createColumn as d,\n ACTION_SAME as e,\n easingFunctions as f,\n ACTION_DELETE as g,\n setTarget as s\n};\n//# sourceMappingURL=TickerCore-C7Ejc9kB.js.map\n","import { defineComponent, ref, computed, watch, onUnmounted, createElementBlock, openBlock, normalizeClass, Fragment, renderList, normalizeStyle, toDisplayString, unref } from \"vue\";\nimport { a as TickerCharacterList, b as applyProgress, c as computeColumnActions, A as ACTION_INSERT, s as setTarget, d as createColumn, e as ACTION_SAME, E as EMPTY_CHAR, f as easingFunctions } from \"./TickerCore-C7Ejc9kB.js\";\nimport { g, T } from \"./TickerCore-C7Ejc9kB.js\";\nconst charHeight = 1.2;\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"Ticker\",\n props: {\n value: { type: String, required: true },\n characterLists: { type: Array, default: () => [\"0123456789\"] },\n duration: { type: Number, default: 500 },\n direction: { type: String, default: \"ANY\" },\n easing: { type: String, default: \"easeInOut\" },\n className: { type: String, default: \"\" },\n charWidth: { type: Number, default: 1 }\n },\n setup(__props) {\n const props = __props;\n const columns = ref([]);\n const progress = ref(1);\n let animId;\n const lists = computed(() => props.characterLists.map((s) => new TickerCharacterList(s)));\n const supported = computed(() => {\n const set = /* @__PURE__ */ new Set();\n lists.value.forEach((l) => l.getSupportedCharacters().forEach((c) => set.add(c)));\n return set;\n });\n watch(() => props.value, (newValue, oldValue) => {\n if (newValue === oldValue) return;\n if (animId) {\n cancelAnimationFrame(animId);\n animId = void 0;\n }\n let currentCols = columns.value;\n if (progress.value < 1 && progress.value > 0) {\n currentCols = currentCols.map((c) => applyProgress(c, progress.value, true).col);\n }\n const targetChars = [...newValue];\n const sourceChars = currentCols.map((c) => c.currentChar);\n const actions = computeColumnActions(sourceChars, targetChars, supported.value);\n let ci = 0, ti = 0;\n const result = [];\n const validCols = currentCols.filter((c) => c.currentWidth > 0);\n for (const action of actions) {\n if (action === ACTION_INSERT) {\n result.push(setTarget(createColumn(), targetChars[ti++], lists.value, props.direction));\n } else if (action === ACTION_SAME) {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, targetChars[ti++], lists.value, props.direction));\n } else {\n const existing = validCols[ci++] || createColumn();\n result.push(setTarget(existing, EMPTY_CHAR, lists.value, props.direction));\n }\n }\n columns.value = result;\n progress.value = 0;\n const start = performance.now();\n const dur = props.duration;\n const easeFn = easingFunctions[props.easing] || easingFunctions.linear;\n let lastUpdate = 0;\n const animate = (now) => {\n const linearP = Math.min((now - start) / dur, 1);\n const p = easeFn(linearP);\n const shouldUpdate = now - lastUpdate >= 16 || linearP >= 1;\n if (shouldUpdate) {\n lastUpdate = now;\n progress.value = p;\n }\n if (linearP < 1) {\n animId = requestAnimationFrame(animate);\n } else {\n const final = columns.value.map((c) => applyProgress(c, 1).col).filter((c) => c.currentWidth > 0);\n columns.value = final;\n progress.value = 1;\n animId = void 0;\n }\n };\n animId = requestAnimationFrame(animate);\n }, { immediate: true });\n onUnmounted(() => {\n if (animId) cancelAnimationFrame(animId);\n });\n const renderedColumns = computed(() => {\n return columns.value.map((col) => {\n const { charIdx, delta } = applyProgress(col, progress.value);\n const width = col.sourceWidth + (col.targetWidth - col.sourceWidth) * progress.value;\n if (width <= 0) return { width, chars: [] };\n const chars = [];\n const list = col.charList || [];\n const deltaEm = delta * charHeight;\n const add = (idx, offsetMod, keyPrefix) => {\n if (idx >= 0 && idx < list.length) {\n chars.push({\n key: `${keyPrefix}-${idx}`,\n char: list[idx],\n offset: deltaEm + offsetMod\n });\n }\n };\n add(charIdx, 0, \"c\");\n add(charIdx + 1, -charHeight, \"n\");\n add(charIdx - 1, charHeight, \"p\");\n const isFW = (c) => c && c.length > 0 && c.charCodeAt(0) > 255;\n const getW = (c) => isFW(c) ? 1.25 : 0.8;\n const startChar = list[col.startIndex] || \"\";\n const endChar = list[col.endIndex] || \"\";\n const w1 = getW(startChar);\n const w2 = getW(endChar);\n const baseW = w1 + (w2 - w1) * progress.value;\n return { width, chars, baseW };\n }).filter((c) => c.width > 0);\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\"ticker\", __props.className])\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(renderedColumns.value, (col, i) => {\n return openBlock(), createElementBlock(\"div\", {\n key: i,\n class: \"ticker-column\",\n style: normalizeStyle({ width: `${col.width * (col.baseW || 0.8) * __props.charWidth}em` })\n }, [\n (openBlock(true), createElementBlock(Fragment, null, renderList(col.chars, (charObj) => {\n return openBlock(), createElementBlock(\"div\", {\n key: charObj.key,\n class: \"ticker-char\",\n style: normalizeStyle({ transform: `translateY(${charObj.offset}em)` })\n }, toDisplayString(charObj.char === unref(EMPTY_CHAR) ? \" \" : charObj.char), 5);\n }), 128))\n ], 4);\n }), 128))\n ], 2);\n };\n }\n});\nconst _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\nconst Ticker = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__scopeId\", \"data-v-7e47ac69\"]]);\nexport {\n g as ACTION_DELETE,\n ACTION_INSERT,\n ACTION_SAME,\n EMPTY_CHAR,\n Ticker,\n TickerCharacterList,\n T as TickerUtils,\n applyProgress,\n computeColumnActions,\n createColumn,\n easingFunctions,\n setTarget\n};\n//# sourceMappingURL=vue.js.map\n","<script setup lang=\"ts\">\r\nimport { Ticker as SmartTicker } from '@tombcato/smart-ticker/vue';\r\nimport '@tombcato/smart-ticker/style.css';\r\n\r\nconst props = defineProps<{\r\n text?: string;\r\n className?: string;\r\n placeholder?: string;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"!text && placeholder\" :class=\"['apmsu-placeholder', className]\">\r\n {{ placeholder }}\r\n </span>\r\n <span v-else-if=\"text\" :class=\"['inline-flex min-w-0', className]\">\r\n <SmartTicker :value=\"text\" :char-width=\"0.8\" :duration=\"300\" />\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n providers: Provider[];\r\n selectedProviderId: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [providerId: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\nconst selectedProvider = computed(() => props.providers.find(p => p.id === props.selectedProviderId));\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string) {\r\n emit('select', id);\r\n isOpen.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label\">{{ t.providerLabel }}</label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && (isOpen = !isOpen)\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <div v-if=\"selectedProvider\" class=\"flex items-center gap-2 min-w-0\">\r\n <img :src=\"selectedProvider.icon\" :alt=\"selectedProvider.name\" class=\"apmsu-provider-icon\" />\r\n <SmartText :text=\"selectedProvider.name\" />\r\n </div>\r\n <span v-else class=\"apmsu-placeholder\">{{ t.selectProvider }}</span>\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <button\r\n v-for=\"p in providers\"\r\n :key=\"p.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(p.id)\"\r\n :class=\"['apmsu-dropdown-item rounded-sm', selectedProviderId === p.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <div class=\"flex items-center gap-2 flex-shrink-0\">\r\n <img :src=\"p.icon\" :alt=\"p.name\" class=\"apmsu-provider-icon\" />\r\n <span class=\"font-medium whitespace-nowrap\">{{ p.name }}</span>\r\n </div>\r\n <span class=\"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0\">\r\n {{ p.baseUrl.replace('https://', '') }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n apiKey: string;\r\n testStatus: 'idle' | 'testing' | 'success' | 'error';\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:apiKey': [value: string];\r\n}>();\r\n\r\nconst isVisible = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst inputClass = computed(() => {\r\n return 'apmsu-input apmsu-input-default';\r\n});\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"provider && provider.needsApiKey\" class=\"apmsu-field\">\r\n <label class=\"apmsu-label\">{{ t.apiKeyLabel }}</label>\r\n <div class=\"relative\">\r\n <input\r\n :type=\"isVisible ? 'text' : 'password'\"\r\n :value=\"apiKey\"\r\n @input=\"emit('update:apiKey', ($event.target as HTMLInputElement).value)\"\r\n @focus=\"isVisible = true\"\r\n @blur=\"isVisible = false\"\r\n :placeholder=\"t.apiKeyPlaceholder\"\r\n :disabled=\"disabled\"\r\n :class=\"[inputClass, 'pr-10']\"\r\n />\r\n <span class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center\">\r\n <svg v-if=\"isVisible\" class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\r\n </svg>\r\n <svg v-else class=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\r\nimport { I18N, type Language, type Provider, type Model } from '@tombcato/ai-selector-core';\r\nimport SmartText from './SmartText.vue';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n models: Model[];\r\n selectedModelId: string;\r\n hasApiKey: boolean;\r\n disabled?: boolean;\r\n language?: Language;\r\n isFetchingModels?: boolean;\r\n fetchModelError?: string | null;\r\n selectedModelName?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n select: [modelId: string, modelName?: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst modelSearch = ref('');\r\nconst triggerRef = ref<HTMLDivElement | null>(null);\r\nconst t = computed(() => I18N[props.language]);\r\n\r\nconst filteredModels = computed(() =>\r\n props.models.filter(m =>\r\n m.name.toLowerCase().includes(modelSearch.value.toLowerCase()) ||\r\n m.id.toLowerCase().includes(modelSearch.value.toLowerCase())\r\n )\r\n);\r\n\r\nconst activeModelName = computed(() => \r\n props.models.find(m => m.id === props.selectedModelId)?.name || props.selectedModelName || props.selectedModelId\r\n);\r\n\r\nfunction handleClickOutside(e: MouseEvent) {\r\n if (triggerRef.value && !triggerRef.value.contains(e.target as Node)) {\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nonUnmounted(() => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n});\r\n\r\nfunction handleSelect(id: string, name?: string) {\r\n emit('select', id, name);\r\n isOpen.value = false;\r\n modelSearch.value = '';\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-field\" ref=\"triggerRef\">\r\n <label class=\"apmsu-label flex items-center justify-between\">\r\n <span>{{ t.modelLabel }}</span>\r\n </label>\r\n <div class=\"relative\">\r\n <button\r\n type=\"button\"\r\n @click=\"!disabled && provider && (isOpen = !isOpen)\"\r\n :disabled=\"disabled || !provider\"\r\n class=\"apmsu-select-trigger\"\r\n >\r\n <SmartText \r\n :text=\"activeModelName ? activeModelName : ''\"\r\n :placeholder=\"t.selectModel\"\r\n />\r\n <svg \r\n :class=\"['apmsu-chevron', isOpen ? 'rotate-180' : '']\" \r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n <div :class=\"['apmsu-dropdown origin-top', isOpen ? 'apmsu-dropdown-open' : '']\">\r\n <div class=\"p-1.5 border-b border-gray-100 dark:border-zinc-800\">\r\n <input\r\n type=\"text\"\r\n v-model=\"modelSearch\"\r\n :placeholder=\"t.searchModel\"\r\n class=\"apmsu-select-trigger\"\r\n :autofocus=\"isOpen\"\r\n />\r\n </div>\r\n <div class=\"max-h-60 overflow-auto\">\r\n <button\r\n v-if=\"modelSearch && !filteredModels.some(m => m.id === modelSearch)\"\r\n type=\"button\"\r\n @click=\"handleSelect(modelSearch)\"\r\n class=\"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b\"\r\n >\r\n <span class=\"text-blue-500\">{{ t.useCustom }}: {{ modelSearch }}</span>\r\n </button>\r\n <button\r\n v-for=\"m in filteredModels\"\r\n :key=\"m.id\"\r\n type=\"button\"\r\n @click=\"handleSelect(m.id, m.name)\"\r\n :class=\"['apmsu-dropdown-item', selectedModelId === m.id && 'apmsu-dropdown-item-active']\"\r\n >\r\n <span>{{ m.name }}</span>\r\n </button>\r\n <div v-if=\"filteredModels.length === 0 && !modelSearch\" class=\"p-4 text-center apmsu-hint-text\">\r\n {{ t.noModels }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Status Messages Container - only for supportsModelsApi providers -->\r\n <div v-if=\"provider?.supportsModelsApi\" class=\"min-h-[20px] flex items-center\">\r\n <p v-if=\"isFetchingModels\" class=\"apmsu-hint-text animate-pulse\">\r\n {{ t.refreshingModels }}\r\n </p>\r\n \r\n <p v-else-if=\"fetchModelError\" class=\"apmsu-hint-text dark:text-zinc-500\">\r\n {{ (t as any)[fetchModelError] || fetchModelError }}\r\n </p>\r\n\r\n <p v-else-if=\"provider?.needsApiKey && !hasApiKey\" class=\"apmsu-hint-text\">\r\n {{ t.apiKeyTip }}\r\n </p>\r\n\r\n <p v-else class=\"apmsu-hint-text\">\r\n {{ t.modelListUpdated }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { I18N, type Language, type Provider } from '@tombcato/ai-selector-core';\r\n\r\ninterface Props {\r\n provider: Provider | null;\r\n baseUrl: string;\r\n disabled?: boolean;\r\n language?: Language;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:baseUrl': [value: string];\r\n}>();\r\n\r\nconst isOpen = ref(false);\r\nconst t = computed(() => I18N[props.language]);\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"provider\">\r\n <button\r\n type=\"button\"\r\n @click=\"isOpen = !isOpen\"\r\n class=\"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors\"\r\n >\r\n <svg \r\n :class=\"['w-3 h-3 transition-transform', isOpen && 'rotate-90']\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\r\n </svg>\r\n {{ t.customBaseUrl }}\r\n </button>\r\n\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <input\r\n type=\"text\"\r\n :value=\"baseUrl\"\r\n @input=\"emit('update:baseUrl', ($event.target as HTMLInputElement).value)\"\r\n :placeholder=\"provider.baseUrl\"\r\n :disabled=\"disabled\"\r\n class=\"apmsu-input apmsu-input-default\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue';\r\nimport { useAIConfig } from './useAIConfig';\r\n\r\nimport { I18N, type Language, type AIConfig, type ProviderConfig, type TestConnectionResult, type ModelFetcher } from '@tombcato/ai-selector-core';\r\n\r\n// Sub-components\r\nimport ProviderSelect from './ProviderSelect.vue';\r\nimport AuthInput from './AuthInput.vue';\r\nimport ModelSelect from './ModelSelect.vue';\r\nimport BaseUrlInput from './BaseUrlInput.vue';\r\n\r\ninterface Props {\r\n proxyUrl: string;\r\n config?: ProviderConfig;\r\n initialConfig?: Partial<AIConfig>;\r\n title?: string;\r\n showPreview?: boolean;\r\n saveButtonText?: string;\r\n disabled?: boolean;\r\n onSerialize?: (data: any) => string;\r\n onDeserialize?: (data: string) => any;\r\n language?: Language;\r\n modelFetcher?: ModelFetcher;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n showPreview: false,\r\n disabled: false,\r\n language: 'zh',\r\n});\r\n\r\nconst emit = defineEmits<{\r\n save: [config: AIConfig];\r\n testResult: [result: TestConnectionResult];\r\n change: [config: Partial<AIConfig>];\r\n}>();\r\n\r\nconst {\r\n providerId,\r\n apiKey,\r\n model,\r\n modelName,\r\n baseUrl,\r\n models,\r\n testStatus,\r\n testResult,\r\n provider,\r\n providers,\r\n isValid,\r\n config: currentConfig,\r\n runTest,\r\n save,\r\n selectModel,\r\n isFetchingModels,\r\n fetchModelError,\r\n} = useAIConfig({\r\n proxyUrl: props.proxyUrl,\r\n providerConfig: props.config,\r\n initialConfig: props.initialConfig,\r\n onSerialize: props.onSerialize,\r\n onDeserialize: props.onDeserialize,\r\n modelFetcher: props.modelFetcher,\r\n});\r\n\r\nconst t = computed(() => I18N[props.language]);\r\nconst saveStatus = ref<'idle' | 'saved'>('idle');\r\nconst isPreviewOpen = ref(false);\r\n\r\n// Watch for changes\r\nwatch([providerId, apiKey, model, baseUrl], () => {\r\n emit('change', {\r\n providerId: providerId.value,\r\n apiKey: apiKey.value,\r\n model: model.value,\r\n baseUrl: baseUrl.value,\r\n });\r\n});\r\n\r\n// Watch test result\r\nwatch(testResult, (result) => {\r\n if (result) emit('testResult', result);\r\n});\r\n\r\n// Handle save\r\nfunction handleSave() {\r\n save();\r\n saveStatus.value = 'saved';\r\n emit('save', currentConfig.value);\r\n setTimeout(() => { saveStatus.value = 'idle'; }, 2000);\r\n}\r\n\r\n// Handler wrappers for vue events\r\nfunction updateProvider(id: string) {\r\n providerId.value = id;\r\n}\r\n\r\nfunction updateApiKey(val: string) {\r\n apiKey.value = val;\r\n}\r\n\r\nfunction updateModel(id: string, name?: string) {\r\n selectModel(id, name);\r\n}\r\n\r\nfunction updateBaseUrl(val: string) {\r\n baseUrl.value = val;\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"apmsu-card\">\r\n <h2 v-if=\"title\" class=\"text-lg font-semibold mb-4\">{{ title }}</h2>\r\n\r\n <div class=\"space-y-3\">\r\n <ProviderSelect\r\n :providers=\"providers\"\r\n :selectedProviderId=\"providerId\"\r\n @select=\"updateProvider\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <BaseUrlInput\r\n :provider=\"provider\"\r\n :baseUrl=\"baseUrl\"\r\n @update:baseUrl=\"updateBaseUrl\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n />\r\n\r\n <!-- Auth & Model Collapsible Section -->\r\n <div :class=\"['transition-all duration-500 ease-in-out', providerId ? 'max-h-[1000px] opacity-100 overflow-visible' : 'max-h-0 opacity-0 overflow-hidden']\">\r\n <div class=\"space-y-4\">\r\n <AuthInput\r\n :provider=\"provider\"\r\n :apiKey=\"apiKey\"\r\n @update:apiKey=\"updateApiKey\"\r\n :testStatus=\"testStatus\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n />\r\n\r\n <ModelSelect\r\n :provider=\"provider\"\r\n :models=\"models\"\r\n :selectedModelId=\"model\"\r\n @select=\"updateModel\"\r\n :hasApiKey=\"!!apiKey\"\r\n :disabled=\"disabled\"\r\n :language=\"language\"\r\n :isFetchingModels=\"isFetchingModels\"\r\n :fetchModelError=\"fetchModelError\"\r\n :selectedModelName=\"modelName\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"pt-2 space-y-2\">\r\n <div class=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n @click=\"runTest()\"\r\n :disabled=\"!providerId || !apiKey || !model || disabled || testStatus === 'testing'\"\r\n :class=\"['apmsu-btn flex-1', \r\n testStatus === 'success' ? 'apmsu-btn-success' : \r\n testStatus === 'error' ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40' : \r\n 'apmsu-btn-ghost border border-gray-200 dark:border-zinc-700'\r\n ]\"\r\n >\r\n <span v-if=\"testStatus === 'testing'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\r\n </svg>\r\n {{ t.testing }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'success'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-success\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\r\n </svg>\r\n {{ t.testSuccess }} {{ testResult?.latencyMs ? `${testResult.latencyMs}ms` : '' }}\r\n </span>\r\n <span v-else-if=\"testStatus === 'error'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"apmsu-icon-error\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\r\n </svg>\r\n {{ t.testFailed }}\r\n </span>\r\n <template v-else>{{ t.testConnection }}</template>\r\n </button>\r\n\r\n <button\r\n @click=\"handleSave\"\r\n :disabled=\"!isValid || disabled\"\r\n :class=\"['apmsu-btn flex-1', saveStatus === 'saved' ? 'apmsu-btn-success' : 'apmsu-btn-primary']\"\r\n >\r\n <span v-if=\"saveStatus === 'saved'\" class=\"flex items-center justify-center gap-2\">\r\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n {{ t.saved }}\r\n </span>\r\n <template v-else>{{ saveButtonText || t.save }}</template>\r\n </button>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n <div\r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: (!testResult?.success && testResult?.message && testStatus !== 'testing' && testStatus !== 'success') ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <div class=\"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800\">\r\n <p class=\"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left\">{{ testResult?.message }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Config Preview - Collapsible -->\r\n <div v-if=\"showPreview && provider\" class=\"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden\">\r\n <button\r\n type=\"button\"\r\n @click=\"isPreviewOpen = !isPreviewOpen\"\r\n class=\"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors\"\r\n >\r\n <h3 class=\"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider\">{{ t.preview }}</h3>\r\n <svg \r\n :class=\"['w-4 h-4 text-gray-400 transition-transform duration-200', isPreviewOpen ? 'rotate-180' : '']\"\r\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\r\n >\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <div \r\n class=\"grid transition-all duration-200 ease-out\"\r\n :style=\"{ gridTemplateRows: isPreviewOpen ? '1fr' : '0fr' }\"\r\n >\r\n <div class=\"overflow-hidden\">\r\n <pre class=\"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50\">\r\n{{ JSON.stringify({\r\n provider: provider.name,\r\n apiFormat: provider.apiFormat,\r\n baseUrl: baseUrl || provider.baseUrl,\r\n model: model || t.unselected,\r\n hasApiKey: !!apiKey\r\n}, null, 2) }}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n/* 样式已在 main.ts 中通过 style.css 导入 */\r\n</style>\r\n"],"names":["useAIConfig","options","providerId","ref","_a","apiKey","_b","model","_c","modelName","_d","baseUrl","_e","models","testStatus","testResult","isFetchingModels","fetchModelError","resolvedConfig","computed","resolveProviderConfig","allProviders","provider","p","storage","createConfigStorage","isLoaded","onMounted","saved","watch","fetchTimer","modelCache","shouldFetch","actualBaseUrl","cacheKey","cachedModels","staticModels","fetchedModels","fetchModels","e","runTest","result","fetcherResult","testConnection","save","foundModel","m","nameToSave","clear","selectModel","modelId","name","found","isValid","currentConfig","__defProp","__defNormalProp","obj","key","value","__publicField","EMPTY_CHAR","TickerCharacterList","characterList","charsArray","length","i","start","end","direction","startIndex","endIndex","nonWrap","c","ACTION_SAME","ACTION_INSERT","ACTION_DELETE","computeColumnActions","source","target","supported","si","ti","actions","endS","endT","sSupp","tSupp","se","te","sLen","tLen","matrix","j","r2","c2","cost","r","ins","del","rep","createColumn","setTarget","col","lists","dir","list","indices","applyProgress","progress","forceUpdate","total","pos","offset","additional","delta","charIdx","easingFunctions","t","charHeight","_sfc_main","defineComponent","__props","props","columns","animId","s","set","l","newValue","oldValue","currentCols","targetChars","sourceChars","ci","validCols","action","existing","dur","easeFn","lastUpdate","animate","now","linearP","final","onUnmounted","renderedColumns","width","chars","deltaEm","add","idx","offsetMod","keyPrefix","isFW","getW","startChar","endChar","w1","w2","baseW","_ctx","_cache","openBlock","createElementBlock","normalizeClass","Fragment","renderList","normalizeStyle","charObj","toDisplayString","unref","_export_sfc","sfc","val","Ticker","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","I18N","selectedProvider","handleClickOutside","handleSelect","id","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","$event","_openBlock","_hoisted_4","SmartText","_hoisted_6","_Fragment","_renderList","_normalizeClass","_hoisted_8","_hoisted_10","_hoisted_11","isVisible","inputClass","_hoisted_3","_hoisted_5","_hoisted_7","modelSearch","filteredModels","activeModelName","_hoisted_9","_hoisted_12","_hoisted_13","_hoisted_14","providers","saveStatus","isPreviewOpen","handleSave","updateProvider","updateApiKey","updateModel","updateBaseUrl","ProviderSelect","BaseUrlInput","AuthInput","ModelSelect","_createTextVNode","_normalizeStyle","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":";;AAsBO,SAASA,GAAYC,IAA8B,IAAI;;AAC1D,QAAMC,IAAaC,IAAIC,IAAAH,EAAQ,kBAAR,gBAAAG,EAAuB,eAAc,EAAE,GACxDC,IAASF,IAAIG,IAAAL,EAAQ,kBAAR,gBAAAK,EAAuB,WAAU,EAAE,GAChDC,IAAQJ,IAAIK,IAAAP,EAAQ,kBAAR,gBAAAO,EAAuB,UAAS,EAAE,GAC9CC,IAAYN,IAAIO,IAAAT,EAAQ,kBAAR,gBAAAS,EAAuB,cAAa,EAAE,GACtDC,IAAUR,IAAIS,IAAAX,EAAQ,kBAAR,gBAAAW,EAAuB,YAAW,EAAE,GAElDC,IAASV,EAAa,EAAE,GACxBW,IAAaX,EAA8C,MAAM,GACjEY,IAAaZ,EAAiC,IAAI,GAClDa,IAAmBb,EAAI,EAAK,GAC5Bc,IAAkBd,EAAmB,IAAI,GAGzCe,IAAiBC,EAAS,MAAMC,GAAsBnB,EAAQ,cAAc,CAAC,GAC7EoB,IAAeF,EAAS,MAAMD,EAAe,MAAM,SAAS,GAE5DI,IAAWH;AAAA,IAAS,MACtBE,EAAa,MAAM,KAAK,CAACE,MAAWA,EAAE,OAAOrB,EAAW,KAAK,KAAK;AAAA,EAAA,GAGhEsB,IAAUC,GAAoB,QAAW;AAAA,IAC3C,WAAWxB,EAAQ;AAAA,IACnB,aAAaA,EAAQ;AAAA,EAAA,CACxB,GAGKyB,IAAWvB,EAAI,EAAK;AAG1B,EAAAwB,GAAU,MAAM;AACZ,UAAMC,IAAQJ,EAAQ,KAAA;AACtB,IAAII,KAEIA,EAAM,cAAcP,EAAa,MAAM,KAAK,CAACE,MAAWA,EAAE,OAAOK,EAAM,UAAU,MACjF1B,EAAW,QAAQ0B,EAAM,YACrBA,EAAM,WAAQvB,EAAO,QAAQuB,EAAM,SACnCA,EAAM,UAAOrB,EAAM,QAAQqB,EAAM,QACjCA,EAAM,cAAWnB,EAAU,QAAQmB,EAAM,YACzCA,EAAM,YAASjB,EAAQ,QAAQiB,EAAM,WAGjD,WAAW,MAAM;AAAE,MAAAF,EAAS,QAAQ;AAAA,IAAM,GAAG,CAAC;AAAA,EAClD,CAAC,GAGDG,EAAM3B,GAAY,MAAM;AACpB,IAAKwB,EAAS,UACdrB,EAAO,QAAQ,IACfE,EAAM,QAAQ,IACdE,EAAU,QAAQ,IAClBE,EAAQ,QAAQ,IAChBG,EAAW,QAAQ,QACnBC,EAAW,QAAQ;AAAA,EACvB,CAAC;AAGD,MAAIe,IAAkB;AACtB,QAAMC,wBAAiB,IAAA;AAEvB,EAAAF,EAAM,CAAC3B,GAAYG,GAAQM,CAAO,GAAG,MAAM;AAGvC,QAFImB,kBAAyBA,CAAU,GAEnC,CAAC5B,EAAW,SAAS,CAACoB,EAAS,OAAO;AACtC,MAAAT,EAAO,QAAQ,CAAA,GACfI,EAAgB,QAAQ,MACxBD,EAAiB,QAAQ;AACzB;AAAA,IACJ;AAEA,UAAMgB,IAAcV,EAAS,MAAM,sBAAsB,CAACA,EAAS,MAAM,eAAe,CAAC,CAACjB,EAAO,QAC3F4B,IAAgBtB,EAAQ,SAASW,EAAS,MAAM,SAChDY,IAAW,GAAGhC,EAAW,KAAK,IAAI+B,CAAa,IAAI5B,EAAO,KAAK,IAG/D8B,IAAeJ,EAAW,IAAIG,CAAQ;AAC5C,QAAIC,GAAc;AACd,MAAAtB,EAAO,QAAQsB,GACflB,EAAgB,QAAQ,MACxBD,EAAiB,QAAQ;AACzB;AAAA,IACJ;AAEA,QAAI,CAACgB,GAAa;AACd,YAAMI,IAAelB,EAAe,MAAM,UAAUhB,EAAW,KAAK;AACpE,MAAAW,EAAO,QAAQuB,GACfL,EAAW,IAAIG,GAAUE,CAAY,GACrCnB,EAAgB,QAAQ,MACxBD,EAAiB,QAAQ;AACzB;AAAA,IACJ;AAGA,IAAAA,EAAiB,QAAQ,IACzBC,EAAgB,QAAQ,MAGpBJ,EAAO,MAAM,WAAW,MACxBA,EAAO,QAAQK,EAAe,MAAM,UAAUhB,EAAW,KAAK,IAGlE4B,IAAa,WAAW,YAAY;AAChC,UAAI;AACA,YAAIO;AAEJ,QAAIpC,EAAQ,eACRoC,IAAgB,MAAMpC,EAAQ,aAAa;AAAA,UACvC,MAAM;AAAA,UACN,YAAYqB,EAAS,MAAO;AAAA,UAC5B,SAASW;AAAA,UACT,QAAQ5B,EAAO;AAAA,QAAA,CAClB,IAEDgC,IAAgB,MAAMC,GAAY;AAAA,UAC9B,UAAUhB,EAAS;AAAA,UACnB,QAAQjB,EAAO;AAAA,UACf,SAAS4B;AAAA,UACT,UAAUhC,EAAQ;AAAA,UAClB,kBAAkB;AAAA,QAAA,CACrB,GAELY,EAAO,QAAQwB,GACfN,EAAW,IAAIG,GAAUG,CAAa;AAAA,MAC1C,SAASE,GAAG;AACR,gBAAQ,KAAK,uBAAuBA,CAAC,GACrCtB,EAAgB,QAAQ,qBACxBJ,EAAO,QAAQK,EAAe,MAAM,UAAUhB,EAAW,KAAK;AAAA,MAElE,UAAA;AACI,QAAAc,EAAiB,QAAQ;AAAA,MAC7B;AAAA,IACJ,GAAG,GAAG;AAAA,EACV,GAAG,EAAE,WAAW,IAAM,GAGtBa,EAAM,CAACxB,GAAQM,CAAO,GAAG,MAAM;AAC3B,KAAIG,EAAW,UAAU,WAAWA,EAAW,UAAU,eACrDA,EAAW,QAAQ,QACnBC,EAAW,QAAQ;AAAA,EAE3B,CAAC;AAGD,iBAAeyB,IAAU;AAErB,QADI,CAAClB,EAAS,SACVA,EAAS,MAAM,eAAe,CAACjB,EAAO,MAAO;AAEjD,IAAAS,EAAW,QAAQ,WACnBC,EAAW,QAAQ;AAEnB,QAAI0B;AAEJ,QAAIxC,EAAQ;AACR,UAAI;AACA,cAAMyC,IAAgB,MAAMzC,EAAQ,aAAa;AAAA,UAC7C,MAAM;AAAA,UACN,YAAYqB,EAAS,MAAM;AAAA,UAC3B,SAASX,EAAQ,SAASW,EAAS,MAAM;AAAA,UACzC,QAAQjB,EAAO;AAAA,UACf,SAASE,EAAM;AAAA,QAAA,CAClB;AACD,QAAAkC,IAAS;AAAA,UACL,SAASC,EAAc;AAAA,UACvB,WAAWA,EAAc,WAAWA,EAAc;AAAA,UAClD,SAASA,EAAc;AAAA,QAAA;AAAA,MAE/B,SAASH,GAAQ;AACb,QAAAE,IAAS,EAAE,SAAS,IAAO,SAASF,EAAE,WAAW,gBAAA;AAAA,MACrD;AAAA;AAEA,MAAAE,IAAS,MAAME,GAAe;AAAA,QAC1B,UAAUrB,EAAS;AAAA,QACnB,QAAQjB,EAAO;AAAA,QACf,SAASM,EAAQ;AAAA,QACjB,OAAOJ,EAAM;AAAA,QACb,UAAUN,EAAQ;AAAA,MAAA,CACrB;AAGL,WAAAc,EAAW,QAAQ0B,GACnB3B,EAAW,QAAQ2B,EAAO,UAAU,YAAY,SAGhD,WAAW,MAAM;AACb,MAAA3B,EAAW,QAAQ;AAAA,IACvB,GAAG,GAAI,GAEA2B;AAAA,EACX;AAEA,WAASG,IAAO;AACZ,UAAMC,IAAahC,EAAO,MAAM,KAAK,CAACiC,MAAaA,EAAE,OAAOvC,EAAM,KAAK,GACjEwC,KAAaF,KAAA,gBAAAA,EAAY,SAAQpC,EAAU,SAASF,EAAM;AAEhE,IAAIsC,KAAA,QAAAA,EAAY,QAAQA,EAAW,SAASpC,EAAU,UAClDA,EAAU,QAAQoC,EAAW,OAGjCrB,EAAQ,KAAK;AAAA,MACT,YAAYtB,EAAW;AAAA,MACvB,QAAQG,EAAO;AAAA,MACf,OAAOE,EAAM;AAAA,MACb,WAAWwC;AAAA,MACX,SAASpC,EAAQ;AAAA,IAAA,CACpB;AAAA,EACL;AAEA,WAASqC,IAAQ;AACb,IAAAxB,EAAQ,MAAA,GACRtB,EAAW,QAAQ,IACnBG,EAAO,QAAQ,IACfE,EAAM,QAAQ,IACdE,EAAU,QAAQ,IAClBE,EAAQ,QAAQ;AAAA,EACpB;AAGA,WAASsC,EAAYC,GAAiBC,GAAe;AAGjD,QAFA5C,EAAM,QAAQ2C,GAEVC;AACA,MAAA1C,EAAU,QAAQ0C;AAAA,SACf;AACH,YAAMC,IAAQvC,EAAO,MAAM,KAAK,CAACiC,MAAaA,EAAE,OAAOI,CAAO;AAC9D,MAAAzC,EAAU,SAAQ2C,KAAA,gBAAAA,EAAO,SAAQF;AAAA,IACrC;AAAA,EACJ;AAEA,QAAMG,IAAUlC,EAAS,MAAM;;AAE3B,WADI,GAACjB,EAAW,SAAS,CAACK,EAAM,UAC5BH,IAAAkB,EAAS,UAAT,QAAAlB,EAAgB,eAAe,CAACC,EAAO;AAAA,EAE/C,CAAC,GAEKiD,IAAgBnC,EAAmB,MAAA;;AAAO;AAAA,MAC5C,YAAYjB,EAAW;AAAA,MACvB,QAAQG,EAAO;AAAA,MACf,OAAOE,EAAM;AAAA,MACb,WAAWE,EAAU;AAAA,MACrB,SAASE,EAAQ,WAASP,IAAAkB,EAAS,UAAT,gBAAAlB,EAAgB,YAAW;AAAA,IAAA;AAAA,GACvD;AAEF,SAAO;AAAA;AAAA,IAEH,YAAAF;AAAA,IACA,QAAAG;AAAA,IACA,OAAAE;AAAA,IACA,WAAAE;AAAA,IACA,SAAAE;AAAA,IACA,QAAAE;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,iBAAAC;AAAA;AAAA,IAGA,UAAAK;AAAA,IACA,WAAWD;AAAA,IACX,SAAAgC;AAAA,IACA,QAAQC;AAAA;AAAA,IAGR,SAAAd;AAAA,IACA,MAAAI;AAAA,IACA,OAAAI;AAAA,IACA,aAAAC;AAAA,EAAA;AAER;ACjSA,IAAIM,KAAY,OAAO,gBACnBC,KAAkB,CAACC,GAAKC,GAAKC,MAAUD,KAAOD,IAAMF,GAAUE,GAAKC,GAAK,EAAE,YAAY,IAAM,cAAc,IAAM,UAAU,IAAM,OAAAC,EAAK,CAAE,IAAIF,EAAIC,CAAG,IAAIC,GACtJC,KAAgB,CAACH,GAAKC,GAAKC,MAAUH,GAAgBC,GAAK,OAAOC,KAAQ,WAAWA,IAAM,KAAKA,GAAKC,CAAK;AAC7G,MAAME,IAAa;AAKnB,MAAMC,GAAoB;AAAA,EACxB,YAAYC,GAAe;AACzB,IAAAH,GAAc,MAAM,uBAAuB,GAC3CA,GAAc,MAAM,eAAe,GACnCA,GAAc,MAAM,qBAAqB;AACzC,UAAMI,IAAa,CAAC,GAAGD,CAAa,GAC9BE,IAASD,EAAW;AAC1B,SAAK,wBAAwBC,GAC7B,KAAK,sBAAsC,oBAAI,IAAG;AAClD,aAASC,IAAI,GAAGA,IAAID,GAAQC;AAC1B,WAAK,oBAAoB,IAAIF,EAAWE,CAAC,GAAGA,CAAC;AAE/C,SAAK,gBAAgB,IAAI,MAAMD,IAAS,IAAI,CAAC,GAC7C,KAAK,cAAc,CAAC,IAAIJ;AACxB,aAASK,IAAI,GAAGA,IAAID,GAAQC;AAC1B,WAAK,cAAc,IAAIA,CAAC,IAAIF,EAAWE,CAAC,GACxC,KAAK,cAAc,IAAID,IAASC,CAAC,IAAIF,EAAWE,CAAC;AAAA,EAErD;AAAA,EACA,oBAAoBC,GAAOC,GAAKC,GAAW;AACzC,QAAIC,IAAa,KAAK,eAAeH,CAAK,GACtCI,IAAW,KAAK,eAAeH,CAAG;AACtC,QAAIE,IAAa,KAAKC,IAAW,EAAG,QAAO;AAC3C,YAAQF,GAAS;AAAA,MACf,KAAK;AACH,QAAID,MAAQP,IACVU,IAAW,KAAK,cAAc,SACrBA,IAAWD,MACpBC,KAAY,KAAK;AAEnB;AAAA,MACF,KAAK;AACH,QAAID,IAAaC,MACfD,KAAc,KAAK;AAErB;AAAA,MACF,KAAK;AACH,YAAIH,MAAUN,KAAcO,MAAQP;AAClC,cAAIU,IAAWD,GAAY;AACzB,kBAAME,IAAUF,IAAaC;AAE7B,YADa,KAAK,wBAAwBD,IAAaC,IAC5CC,MAASD,KAAY,KAAK;AAAA,UACvC,WAAWD,IAAaC,GAAU;AAChC,kBAAMC,IAAUD,IAAWD;AAE3B,YADa,KAAK,wBAAwBC,IAAWD,IAC1CE,MAASF,KAAc,KAAK;AAAA,UACzC;AAAA;AAEF;AAAA,IACR;AACI,WAAO,EAAE,YAAAA,GAAY,UAAAC,EAAQ;AAAA,EAC/B;AAAA,EACA,yBAAyB;AACvB,WAAO,IAAI,IAAI,KAAK,oBAAoB,KAAI,CAAE;AAAA,EAChD;AAAA,EACA,mBAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,eAAeE,GAAG;AAChB,WAAIA,MAAMZ,IAAmB,IACzB,KAAK,oBAAoB,IAAIY,CAAC,IAAU,KAAK,oBAAoB,IAAIA,CAAC,IAAI,IACvE;AAAA,EACT;AACF;AACA,MAAMC,IAAc,GACdC,IAAgB,GAChBC,IAAgB;AACtB,SAASC,GAAqBC,GAAQC,GAAQC,GAAW;AACvD,MAAIC,IAAK,GAAGC,IAAK;AACjB,QAAMC,IAAU,CAAA;AAChB,aAAa;AACX,UAAMC,IAAOH,MAAOH,EAAO,QACrBO,IAAOH,MAAOH,EAAO;AAC3B,QAAIK,KAAQC,EAAM;AAClB,QAAID,GAAM;AACR,aAAOF,IAAKH,EAAO,QAAQG,IAAM,CAAAC,EAAQ,KAAKR,CAAa;AAC3D;AAAA,IACF;AACA,QAAIU,GAAM;AACR,aAAOJ,IAAKH,EAAO,QAAQG,IAAM,CAAAE,EAAQ,KAAKP,CAAa;AAC3D;AAAA,IACF;AACA,UAAMU,IAAQN,EAAU,IAAIF,EAAOG,CAAE,CAAC,GAChCM,IAAQP,EAAU,IAAID,EAAOG,CAAE,CAAC;AACtC,QAAII,KAASC,GAAO;AAClB,UAAIC,IAAKP,IAAK,GAAGQ,IAAKP,IAAK;AAC3B,aAAOM,IAAKV,EAAO,UAAUE,EAAU,IAAIF,EAAOU,CAAE,CAAC,IAAG,CAAAA;AACxD,aAAOC,IAAKV,EAAO,UAAUC,EAAU,IAAID,EAAOU,CAAE,CAAC,IAAG,CAAAA;AACxD,YAAMC,IAAOF,IAAKP,GAAIU,IAAOF,IAAKP;AAClC,UAAIQ,MAASC;AACX,iBAASzB,IAAI,GAAGA,IAAIwB,GAAMxB,IAAK,CAAAiB,EAAQ,KAAKT,CAAW;AAAA,WAClD;AACL,cAAMkB,IAAS,MAAMF,IAAO,CAAC,EAAE,KAAK,IAAI,EAAE,IAAI,MAAM,MAAMC,IAAO,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3E,iBAASzB,IAAI,GAAGA,KAAKwB,GAAMxB,IAAK,CAAA0B,EAAO1B,CAAC,EAAE,CAAC,IAAIA;AAC/C,iBAAS2B,IAAI,GAAGA,KAAKF,GAAME,IAAK,CAAAD,EAAO,CAAC,EAAEC,CAAC,IAAIA;AAC/C,iBAASC,IAAK,GAAGA,KAAMJ,GAAMI;AAC3B,mBAASC,IAAK,GAAGA,KAAMJ,GAAMI,KAAM;AACjC,kBAAMC,IAAOlB,EAAOG,IAAKa,IAAK,CAAC,MAAMf,EAAOG,IAAKa,IAAK,CAAC,IAAI,IAAI;AAC/D,YAAAH,EAAOE,CAAE,EAAEC,CAAE,IAAI,KAAK,IAAIH,EAAOE,IAAK,CAAC,EAAEC,CAAE,IAAI,GAAGH,EAAOE,CAAE,EAAEC,IAAK,CAAC,IAAI,GAAGH,EAAOE,IAAK,CAAC,EAAEC,IAAK,CAAC,IAAIC,CAAI;AAAA,UACzG;AAEF,cAAMvD,IAAS,CAAA;AACf,YAAIwD,IAAIP,GAAMjB,IAAIkB;AAClB,eAAOM,IAAI,KAAKxB,IAAI;AAClB,cAAIwB,MAAM;AACR,YAAAxD,EAAO,KAAKkC,CAAa,GACzBF;AAAA,mBACSA,MAAM;AACf,YAAAhC,EAAO,KAAKmC,CAAa,GACzBqB;AAAA,eACK;AACL,kBAAMC,IAAMN,EAAOK,CAAC,EAAExB,IAAI,CAAC,GAAG0B,IAAMP,EAAOK,IAAI,CAAC,EAAExB,CAAC,GAAG2B,IAAMR,EAAOK,IAAI,CAAC,EAAExB,IAAI,CAAC;AAC/E,YAAIyB,IAAMC,KAAOD,IAAME,KACrB3D,EAAO,KAAKkC,CAAa,GACzBF,OACS0B,IAAMC,KACf3D,EAAO,KAAKmC,CAAa,GACzBqB,QAEAxD,EAAO,KAAKiC,CAAW,GACvBuB,KACAxB;AAAA,UAEJ;AAEF,iBAASP,IAAIzB,EAAO,SAAS,GAAGyB,KAAK,GAAGA,IAAK,CAAAiB,EAAQ,KAAK1C,EAAOyB,CAAC,CAAC;AAAA,MACrE;AACA,MAAAe,IAAKO,GACLN,IAAKO;AAAA,IACP,MAAO,CAAIH,KACTH,EAAQ,KAAKR,CAAa,GAC1BO,OACSK,KACTJ,EAAQ,KAAKP,CAAa,GAC1BK,QAEAE,EAAQ,KAAKT,CAAW,GACxBO,KACAC;AAAA,EAEJ;AACA,SAAOC;AACT;AACA,SAASkB,KAAe;AACtB,SAAO;AAAA,IACL,aAAaxC;AAAA,IACb,YAAYA;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,EACf;AACA;AACA,SAASyC,GAAUC,GAAKxB,GAAQyB,GAAOC,GAAK;AAC1C,QAAMhC,IAAI,EAAE,GAAG8B,EAAG;AAClB,EAAA9B,EAAE,aAAaM,GACfN,EAAE,cAAcA,EAAE,cAClBA,EAAE,cAAcM,MAAWlB,IAAa,IAAI;AAC5C,MAAIT,IAAQ;AACZ,aAAWsD,KAAQF,GAAO;AACxB,UAAMG,IAAUD,EAAK,oBAAoBjC,EAAE,aAAaM,GAAQ0B,CAAG;AACnE,QAAIE,GAAS;AACX,MAAAlC,EAAE,WAAWiC,EAAK,iBAAgB,GAClCjC,EAAE,aAAakC,EAAQ,YACvBlC,EAAE,WAAWkC,EAAQ,UACrBvD,IAAQ;AACR;AAAA,IACF;AAAA,EACF;AACA,SAAKA,MACHqB,EAAE,WAAWA,EAAE,gBAAgBM,IAAS,CAACN,EAAE,WAAW,IAAI,CAACA,EAAE,aAAaM,CAAM,GAChFN,EAAE,aAAa,GACfA,EAAE,WAAWA,EAAE,gBAAgBM,IAAS,IAAI,IAE9CN,EAAE,eAAeA,EAAE,YAAYA,EAAE,aAAa,IAAI,IAClDA,EAAE,YAAYA,EAAE,WAChBA,EAAE,YAAY,GACPA;AACT;AACA,SAASmC,GAAcL,GAAKM,GAAUC,IAAc,IAAO;AACzD,QAAMrC,IAAI,EAAE,GAAG8B,EAAG,GACZQ,IAAQ,KAAK,IAAItC,EAAE,WAAWA,EAAE,UAAU,GAC1CuC,IAAMH,IAAWE,GACjBE,IAASD,IAAM,KAAK,MAAMA,CAAG,GAC7BE,IAAazC,EAAE,aAAa,IAAIoC,IAChCM,IAAQF,IAASxC,EAAE,eAAeyC,GAClCE,IAAU3C,EAAE,aAAa,KAAK,MAAMuC,CAAG,IAAIvC,EAAE;AACnD,SAAIoC,KAAY,KACdpC,EAAE,cAAcA,EAAE,YAClBA,EAAE,YAAY,GACdA,EAAE,YAAY,KACLqC,KAAerC,EAAE,YAAY2C,KAAW,KAAKA,IAAU3C,EAAE,SAAS,WAC3EA,EAAE,cAAcA,EAAE,SAAS2C,CAAO,GAClC3C,EAAE,YAAY0C,IAEhB1C,EAAE,eAAeA,EAAE,eAAeA,EAAE,cAAcA,EAAE,eAAeoC,GAC5D,EAAE,KAAKpC,GAAG,SAAA2C,GAAS,OAAAD,EAAK;AACjC;AACA,MAAME,KAAkB;AAAA,EACtB,QAAQ,CAACC,MAAMA;AAAA,EACf,QAAQ,CAACA,MAAMA,IAAIA;AAAA,EACnB,SAAS,CAACA,MAAM,KAAK,IAAIA,MAAM,IAAIA;AAAA,EACnC,WAAW,CAACA,MAAMA,IAAI,MAAM,IAAIA,IAAIA,IAAI,IAAI,KAAK,IAAI,KAAKA,IAAI,GAAG,CAAC,IAAI;AAAA,EACtE,QAAQ,CAACA,MAGHA,IAAI,IAAI,OACH,SAAKA,IAAIA,IACPA,IAAI,IAAI,OACV,UAAMA,KAAK,MAAM,QAAMA,IAAI,OACzBA,IAAI,MAAM,OACZ,UAAMA,KAAK,OAAO,QAAMA,IAAI,SAE5B,UAAMA,KAAK,QAAQ,QAAMA,IAAI;AAG1C,GClOMC,KAAa,KACbC,KAA4B,gBAAAC,EAAgB;AAAA,EAChD,QAAQ;AAAA,EACR,OAAO;AAAA,IACL,OAAO,EAAE,MAAM,QAAQ,UAAU,GAAI;AAAA,IACrC,gBAAgB,EAAE,MAAM,OAAO,SAAS,MAAM,CAAC,YAAY,EAAC;AAAA,IAC5D,UAAU,EAAE,MAAM,QAAQ,SAAS,IAAG;AAAA,IACtC,WAAW,EAAE,MAAM,QAAQ,SAAS,MAAK;AAAA,IACzC,QAAQ,EAAE,MAAM,QAAQ,SAAS,YAAW;AAAA,IAC5C,WAAW,EAAE,MAAM,QAAQ,SAAS,GAAE;AAAA,IACtC,WAAW,EAAE,MAAM,QAAQ,SAAS,EAAC;AAAA,EACzC;AAAA,EACE,MAAMC,GAAS;AACb,UAAMC,IAAQD,GACRE,IAAUzH,EAAI,EAAE,GAChB0G,IAAW1G,EAAI,CAAC;AACtB,QAAI0H;AACJ,UAAMrB,IAAQrF,EAAS,MAAMwG,EAAM,eAAe,IAAI,CAACG,MAAM,IAAIhE,GAAoBgE,CAAC,CAAC,CAAC,GAClF9C,IAAY7D,EAAS,MAAM;AAC/B,YAAM4G,IAAsB,oBAAI,IAAG;AACnC,aAAAvB,EAAM,MAAM,QAAQ,CAACwB,MAAMA,EAAE,uBAAsB,EAAG,QAAQ,CAAC,MAAMD,EAAI,IAAI,CAAC,CAAC,CAAC,GACzEA;AAAA,IACT,CAAC;AACD,IAAAlG,EAAM,MAAM8F,EAAM,OAAO,CAACM,GAAUC,MAAa;AAC/C,UAAID,MAAaC,EAAU;AAC3B,MAAIL,MACF,qBAAqBA,CAAM,GAC3BA,IAAS;AAEX,UAAIM,IAAcP,EAAQ;AAC1B,MAAIf,EAAS,QAAQ,KAAKA,EAAS,QAAQ,MACzCsB,IAAcA,EAAY,IAAI,CAAC1D,MAAMmC,GAAcnC,GAAGoC,EAAS,OAAO,EAAI,EAAE,GAAG;AAEjF,YAAMuB,IAAc,CAAC,GAAGH,CAAQ,GAC1BI,IAAcF,EAAY,IAAI,CAAC1D,MAAMA,EAAE,WAAW,GAClDU,IAAUN,GAAqBwD,GAAaD,GAAapD,EAAU,KAAK;AAC9E,UAAIsD,IAAK,GAAGpD,IAAK;AACjB,YAAMzC,IAAS,CAAA,GACT8F,IAAYJ,EAAY,OAAO,CAAC1D,MAAMA,EAAE,eAAe,CAAC;AAC9D,iBAAW+D,KAAUrD;AACnB,YAAIqD,MAAW7D;AACb,UAAAlC,EAAO,KAAK6D,GAAUD,GAAY,GAAI+B,EAAYlD,GAAI,GAAGsB,EAAM,OAAOmB,EAAM,SAAS,CAAC;AAAA,iBAC7Ea,MAAW9D,GAAa;AACjC,gBAAM+D,IAAWF,EAAUD,GAAI,KAAKjC,GAAY;AAChD,UAAA5D,EAAO,KAAK6D,GAAUmC,GAAUL,EAAYlD,GAAI,GAAGsB,EAAM,OAAOmB,EAAM,SAAS,CAAC;AAAA,QAClF,OAAO;AACL,gBAAMc,IAAWF,EAAUD,GAAI,KAAKjC,GAAY;AAChD,UAAA5D,EAAO,KAAK6D,GAAUmC,GAAU5E,GAAY2C,EAAM,OAAOmB,EAAM,SAAS,CAAC;AAAA,QAC3E;AAEF,MAAAC,EAAQ,QAAQnF,GAChBoE,EAAS,QAAQ;AACjB,YAAM1C,IAAQ,YAAY,IAAG,GACvBuE,IAAMf,EAAM,UACZgB,IAAStB,GAAgBM,EAAM,MAAM,KAAKN,GAAgB;AAChE,UAAIuB,IAAa;AACjB,YAAMC,IAAU,CAACC,MAAQ;AACvB,cAAMC,IAAU,KAAK,KAAKD,IAAM3E,KAASuE,GAAK,CAAC,GACzCnH,IAAIoH,EAAOI,CAAO;AAMxB,aALqBD,IAAMF,KAAc,MAAMG,KAAW,OAExDH,IAAaE,GACbjC,EAAS,QAAQtF,IAEfwH,IAAU;AACZ,UAAAlB,IAAS,sBAAsBgB,CAAO;AAAA,aACjC;AACL,gBAAMG,IAAQpB,EAAQ,MAAM,IAAI,CAACnD,MAAMmC,GAAcnC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAACA,MAAMA,EAAE,eAAe,CAAC;AAChG,UAAAmD,EAAQ,QAAQoB,GAChBnC,EAAS,QAAQ,GACjBgB,IAAS;AAAA,QACX;AAAA,MACF;AACA,MAAAA,IAAS,sBAAsBgB,CAAO;AAAA,IACxC,GAAG,EAAE,WAAW,IAAM,GACtBI,GAAY,MAAM;AAChB,MAAIpB,KAAQ,qBAAqBA,CAAM;AAAA,IACzC,CAAC;AACD,UAAMqB,IAAkB/H,EAAS,MACxByG,EAAQ,MAAM,IAAI,CAACrB,MAAQ;AAChC,YAAM,EAAE,SAAAa,GAAS,OAAAD,EAAK,IAAKP,GAAcL,GAAKM,EAAS,KAAK,GACtDsC,IAAQ5C,EAAI,eAAeA,EAAI,cAAcA,EAAI,eAAeM,EAAS;AAC/E,UAAIsC,KAAS,EAAG,QAAO,EAAE,OAAAA,GAAO,OAAO,CAAA,EAAE;AACzC,YAAMC,IAAQ,CAAA,GACR1C,IAAOH,EAAI,YAAY,CAAA,GACvB8C,IAAUlC,IAAQI,IAClB+B,IAAM,CAACC,GAAKC,GAAWC,MAAc;AACzC,QAAIF,KAAO,KAAKA,IAAM7C,EAAK,UACzB0C,EAAM,KAAK;AAAA,UACT,KAAK,GAAGK,CAAS,IAAIF,CAAG;AAAA,UACxB,MAAM7C,EAAK6C,CAAG;AAAA,UACd,QAAQF,IAAUG;AAAA,QAChC,CAAa;AAAA,MAEL;AACA,MAAAF,EAAIlC,GAAS,GAAG,GAAG,GACnBkC,EAAIlC,IAAU,GAAG,CAACG,IAAY,GAAG,GACjC+B,EAAIlC,IAAU,GAAGG,IAAY,GAAG;AAChC,YAAMmC,IAAO,CAACjF,MAAMA,KAAKA,EAAE,SAAS,KAAKA,EAAE,WAAW,CAAC,IAAI,KACrDkF,IAAO,CAAClF,MAAMiF,EAAKjF,CAAC,IAAI,OAAO,KAC/BmF,IAAYlD,EAAKH,EAAI,UAAU,KAAK,IACpCsD,IAAUnD,EAAKH,EAAI,QAAQ,KAAK,IAChCuD,IAAKH,EAAKC,CAAS,GACnBG,IAAKJ,EAAKE,CAAO,GACjBG,IAAQF,KAAMC,IAAKD,KAAMjD,EAAS;AACxC,aAAO,EAAE,OAAAsC,GAAO,OAAAC,GAAO,OAAAY,EAAK;AAAA,IAC9B,CAAC,EAAE,OAAO,CAACvF,MAAMA,EAAE,QAAQ,CAAC,CAC7B;AACD,WAAO,CAACwF,GAAMC,OACLC,EAAS,GAAIC,EAAmB,OAAO;AAAA,MAC5C,OAAOC,EAAe,CAAC,UAAU3C,EAAQ,SAAS,CAAC;AAAA,IAC3D,GAAS;AAAA,OACAyC,EAAU,EAAI,GAAGC,EAAmBE,GAAU,MAAMC,GAAWrB,EAAgB,OAAO,CAAC3C,GAAKrC,OACpFiG,EAAS,GAAIC,EAAmB,OAAO;AAAA,QAC5C,KAAKlG;AAAA,QACL,OAAO;AAAA,QACP,OAAOsG,EAAe,EAAE,OAAO,GAAGjE,EAAI,SAASA,EAAI,SAAS,OAAOmB,EAAQ,SAAS,KAAI,CAAE;AAAA,MACtG,GAAa;AAAA,SACAyC,EAAU,EAAI,GAAGC,EAAmBE,GAAU,MAAMC,GAAWhE,EAAI,OAAO,CAACkE,OACnEN,EAAS,GAAIC,EAAmB,OAAO;AAAA,UAC5C,KAAKK,EAAQ;AAAA,UACb,OAAO;AAAA,UACP,OAAOD,EAAe,EAAE,WAAW,cAAcC,EAAQ,MAAM,MAAK,CAAE;AAAA,QACtF,GAAiBC,EAAgBD,EAAQ,SAASE,EAAM9G,CAAU,IAAI,MAAM4G,EAAQ,IAAI,GAAG,CAAC,EAC/E,GAAG,GAAG;AAAA,MACnB,GAAa,CAAC,EACL,GAAG,GAAG;AAAA,IACf,GAAS,CAAC;AAAA,EAER;AACF,CAAC,GACKG,KAAc,CAACC,GAAKlD,MAAU;AAClC,QAAM5C,IAAS8F,EAAI,aAAaA;AAChC,aAAW,CAACnH,GAAKoH,CAAG,KAAKnD;AACvB,IAAA5C,EAAOrB,CAAG,IAAIoH;AAEhB,SAAO/F;AACT,GACMgG,KAAyB,gBAAAH,GAAYpD,IAAW,CAAC,CAAC,aAAa,iBAAiB,CAAC,CAAC;;;;;;;;qBCjIzE,CAAAE,EAAA,QAAQA,EAAA,oBAArBsD,EAEO,QAAA;AAAA;MAF4B,+BAA6BtD,EAAA,SAAS,CAAA;AAAA,IAAA,KACpEA,EAAA,WAAW,GAAA,CAAA,KAECA,EAAA,aAAjBsD,EAEO,QAAA;AAAA;MAFiB,iCAA+BtD,EAAA,SAAS,CAAA;AAAA,IAAA;MAC9DuD,EAA+DC,EAAAC,EAAA,GAAA;AAAA,QAAjD,OAAOzD,EAAA;AAAA,QAAO,cAAY;AAAA,QAAM,UAAU;AAAA,MAAA;;;;;;;;;;;;;;;;;;;ACJ5D,UAAMC,IAAQD,GAKR0D,IAAOC,GAIPC,IAASnL,EAAI,EAAK,GAClBoL,IAAapL,EAA2B,IAAI,GAC5CmH,IAAInG,EAAS,MAAMqK,EAAK7D,EAAM,QAAQ,CAAC,GACvC8D,IAAmBtK,EAAS,MAAMwG,EAAM,UAAU,KAAK,CAAApG,MAAKA,EAAE,OAAOoG,EAAM,kBAAkB,CAAC;AAEpG,aAAS+D,EAAmBnJ,GAAe;AACzC,MAAIgJ,EAAW,SAAS,CAACA,EAAW,MAAM,SAAShJ,EAAE,MAAc,MACjE+I,EAAO,QAAQ;AAAA,IAEnB;AAEA,IAAA3J,GAAU,MAAM;AACd,eAAS,iBAAiB,aAAa+J,CAAkB;AAAA,IAC3D,CAAC,GAEDzC,GAAY,MAAM;AAChB,eAAS,oBAAoB,aAAayC,CAAkB;AAAA,IAC9D,CAAC;AAED,aAASC,EAAaC,GAAY;AAChC,MAAAR,EAAK,UAAUQ,CAAE,GACjBN,EAAO,QAAQ;AAAA,IACjB;2BAIEN,EAwCM,OAAA;AAAA,MAxCD,OAAM;AAAA,eAAkB;AAAA,MAAJ,KAAIO;AAAA,IAAA;MAC3BM,EAAwD,SAAxDC,IAAwDC,EAA1BzE,EAAA,MAAE,aAAa,GAAA,CAAA;AAAA,MAC7CuE,EAqCM,OArCNG,IAqCM;AAAA,QApCJH,EAiBS,UAAA;AAAA,UAhBP,MAAK;AAAA,UACJ,SAAK3B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA+B,MAAA,CAAGvE,EAAA,aAAa4D,EAAA,SAAUA,EAAA;AAAA,UAC/B,UAAU5D,EAAA;AAAA,UACX,OAAM;AAAA,QAAA;UAEK+D,EAAA,SAAXS,EAAA,GAAAlB,EAGM,OAHNmB,IAGM;AAAA,YAFJN,EAA6F,OAAA;AAAA,cAAvF,KAAKJ,EAAA,MAAiB;AAAA,cAAO,KAAKA,EAAA,MAAiB;AAAA,cAAM,OAAM;AAAA,YAAA;YACrER,EAA2CmB,IAAA;AAAA,cAA/B,MAAMX,EAAA,MAAiB;AAAA,YAAA;iBAErCS,EAAA,GAAAlB,EAAoE,QAApEqB,IAAoEN,EAA1BzE,EAAA,MAAE,cAAc,GAAA,CAAA;AAAA,gBAC1D0D,EAKM,OAAA;AAAA,YAJH,2BAAyBM,EAAA,QAAM,eAAA,EAAA,CAAA;AAAA,YAChC,MAAK;AAAA,YAAO,QAAO;AAAA,YAAe,SAAQ;AAAA,UAAA;YAE1CO,EAA2F,QAAA;AAAA,cAArF,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAAI,GAAE;AAAA,YAAA;;;QAI5EA,EAgBM,OAAA;AAAA,UAhBA,uEAAqEP,EAAA,QAAM,wBAAA,EAAA,CAAA;AAAA,QAAA;kBAC/EN,EAcSsB,GAAA,MAAAC,GAbK7E,EAAA,WAAS,CAAdnG,YADTyJ,EAcS,UAAA;AAAA,YAZN,KAAKzJ,EAAE;AAAA,YACR,MAAK;AAAA,YACJ,SAAK,CAAA0K,MAAEN,EAAapK,EAAE,EAAE;AAAA,YACxB,OAAKiL,EAAA,CAAA,kCAAqC9E,EAAA,uBAAuBnG,EAAE,MAAE,4BAAA,CAAA;AAAA,UAAA;YAEtEsK,EAGM,OAHNY,IAGM;AAAA,cAFJZ,EAA+D,OAAA;AAAA,gBAAzD,KAAKtK,EAAE;AAAA,gBAAO,KAAKA,EAAE;AAAA,gBAAM,OAAM;AAAA,cAAA;cACvCsK,EAA+D,QAA/Da,IAA+DX,EAAhBxK,EAAE,IAAI,GAAA,CAAA;AAAA,YAAA;YAEvDsK,EAEO,QAFPc,IAEOZ,EADFxK,EAAE,QAAQ,QAAO,YAAA,EAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtEhC,UAAMoG,IAAQD,GAKR0D,IAAOC,GAIPuB,IAAYzM,EAAI,EAAK,GACrBmH,IAAInG,EAAS,MAAMqK,EAAK7D,EAAM,QAAQ,CAAC,GAEvCkF,IAAa1L,EAAS,MACnB,iCACR;qBAIYuG,EAAA,YAAYA,EAAA,SAAS,eAAhCwE,KAAAlB,EAuBM,OAvBNc,IAuBM;AAAA,MAtBJD,EAAsD,SAAtDG,IAAsDD,EAAxBzE,EAAA,MAAE,WAAW,GAAA,CAAA;AAAA,MAC3CuE,EAoBM,OApBNiB,IAoBM;AAAA,QAnBJjB,EASE,SAAA;AAAA,UARC,MAAMe,EAAA,QAAS,SAAA;AAAA,UACf,OAAOlF,EAAA;AAAA,UACP,gCAAO0D,EAAI,iBAAmBa,EAAO,OAA4B,KAAK;AAAA,UACtE,gCAAOW,EAAA,QAAS;AAAA,UAChB,+BAAMA,EAAA,QAAS;AAAA,UACf,aAAatF,EAAA,MAAE;AAAA,UACf,UAAUI,EAAA;AAAA,UACV,UAAQmF,EAAA,OAAU,OAAA,CAAA;AAAA,QAAA;QAErBhB,EAQO,QARPkB,IAQO;AAAA,UAPMH,EAAA,SAAXV,KAAAlB,EAGM,OAHNqB,IAGM,CAAA,GAAAnC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YAFJ2B,EAA6G,QAAA;AAAA,cAAvG,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAAI,GAAE;AAAA,YAAA;YACxEA,EAAoM,QAAA;AAAA,cAA9L,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAAI,GAAE;AAAA,YAAA;mBAE1EK,KAAAlB,EAEM,OAFNgC,IAEM,CAAA,GAAA9C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YADJ2B,EAAqX,QAAA;AAAA,cAA/W,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAAI,GAAE;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChClF,UAAMlE,IAAQD,GAKR0D,IAAOC,GAIPC,IAASnL,EAAI,EAAK,GAClB8M,IAAc9M,EAAI,EAAE,GACpBoL,IAAapL,EAA2B,IAAI,GAC5CmH,IAAInG,EAAS,MAAMqK,EAAK7D,EAAM,QAAQ,CAAC,GAEvCuF,IAAiB/L;AAAA,MAAS,MAC9BwG,EAAM,OAAO;AAAA,QAAO,OAClB7E,EAAE,KAAK,cAAc,SAASmK,EAAY,MAAM,YAAA,CAAa,KAC7DnK,EAAE,GAAG,YAAA,EAAc,SAASmK,EAAY,MAAM,aAAa;AAAA,MAAA;AAAA,IAC7D,GAGIE,IAAkBhM;AAAA,MAAS,MAAA;;AAC/B,iBAAAf,IAAAuH,EAAM,OAAO,KAAK,CAAA7E,MAAKA,EAAE,OAAO6E,EAAM,eAAe,MAArD,gBAAAvH,EAAwD,SAAQuH,EAAM,qBAAqBA,EAAM;AAAA;AAAA,IAAA;AAGnG,aAAS+D,EAAmBnJ,GAAe;AACzC,MAAIgJ,EAAW,SAAS,CAACA,EAAW,MAAM,SAAShJ,EAAE,MAAc,MACjE+I,EAAO,QAAQ,IACf2B,EAAY,QAAQ;AAAA,IAExB;AAEA,IAAAtL,GAAU,MAAM;AACd,eAAS,iBAAiB,aAAa+J,CAAkB;AAAA,IAC3D,CAAC,GAEDzC,GAAY,MAAM;AAChB,eAAS,oBAAoB,aAAayC,CAAkB;AAAA,IAC9D,CAAC;AAED,aAASC,EAAaC,GAAYzI,GAAe;AAC/C,MAAAiI,EAAK,UAAUQ,GAAIzI,CAAI,GACvBmI,EAAO,QAAQ,IACf2B,EAAY,QAAQ;AAAA,IACtB;;;kBAIEjC,EA4EM,OAAA;AAAA,QA5ED,OAAM;AAAA,iBAAkB;AAAA,QAAJ,KAAIO;AAAA,MAAA;QAC3BM,EAEQ,SAFRC,IAEQ;AAAA,UADND,EAA+B,QAAA,MAAAE,EAAtBzE,EAAA,MAAE,UAAU,GAAA,CAAA;AAAA,QAAA;QAEvBuE,EAoDM,OApDNG,IAoDM;AAAA,UAnDJH,EAgBS,UAAA;AAAA,YAfP,MAAK;AAAA,YACJ,iCAAQnE,EAAA,YAAYA,eAAa4D,EAAA,SAAUA,EAAA;AAAA,YAC3C,UAAU5D,EAAA,YAAQ,CAAKA,EAAA;AAAA,YACxB,OAAM;AAAA,UAAA;YAENuD,EAGEmB,IAAA;AAAA,cAFC,MAAMe,EAAA,QAAkBA,EAAA,QAAe;AAAA,cACvC,aAAa7F,EAAA,MAAE;AAAA,YAAA;kBAElB0D,EAKM,OAAA;AAAA,cAJH,2BAAyBM,EAAA,QAAM,eAAA,EAAA,CAAA;AAAA,cAChC,MAAK;AAAA,cAAO,QAAO;AAAA,cAAe,SAAQ;AAAA,YAAA;cAE1CO,EAA2F,QAAA;AAAA,gBAArF,kBAAe;AAAA,gBAAQ,mBAAgB;AAAA,gBAAQ,gBAAa;AAAA,gBAAI,GAAE;AAAA,cAAA;;;UAI5EA,EAgCM,OAAA;AAAA,YAhCA,uCAAqCP,EAAA,QAAM,wBAAA,EAAA,CAAA;AAAA,UAAA;YAC/CO,EAQM,OARNM,IAQM;AAAA,iBAPJN,EAME,SAAA;AAAA,gBALA,MAAK;AAAA,8DACIoB,EAAW,QAAAhB;AAAA,gBACnB,aAAa3E,EAAA,MAAE;AAAA,gBAChB,OAAM;AAAA,gBACL,WAAWgE,EAAA;AAAA,cAAA;qBAHH2B,EAAA,KAAW;AAAA,cAAA;;YAMxBpB,EAqBM,OArBNQ,IAqBM;AAAA,cAnBIY,EAAA,SAAW,CAAKC,EAAA,MAAe,KAAK,CAAApK,MAAKA,EAAE,OAAOmK,EAAA,KAAW,UADrEjC,EAOS,UAAA;AAAA;gBALP,MAAK;AAAA,gBACJ,SAAKd,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA+B,MAAEN,EAAasB,EAAA,KAAW;AAAA,gBAChC,OAAM;AAAA,cAAA;gBAENpB,EAAuE,QAAvEmB,IAAuEjB,EAAxCzE,EAAA,MAAE,SAAS,IAAG,OAAEyE,EAAGkB,EAAA,KAAW,GAAA,CAAA;AAAA,cAAA;sBAE/DjC,EAQSsB,GAAA,MAAAC,GAPKW,EAAA,OAAc,CAAnBpK,YADTkI,EAQS,UAAA;AAAA,gBANN,KAAKlI,EAAE;AAAA,gBACR,MAAK;AAAA,gBACJ,SAAK,CAAAmJ,MAAEN,EAAa7I,EAAE,IAAIA,EAAE,IAAI;AAAA,gBAChC,OAAK0J,EAAA,CAAA,uBAA0B9E,EAAA,oBAAoB5E,EAAE,MAAE,4BAAA,CAAA;AAAA,cAAA;gBAExD+I,EAAyB,QAAA,MAAAE,EAAhBjJ,EAAE,IAAI,GAAA,CAAA;AAAA,cAAA;cAENoK,EAAA,MAAe,WAAM,KAAA,CAAWD,EAAA,SAA3Cf,KAAAlB,EAEM,OAFNoC,IAEMrB,EADDzE,EAAA,MAAE,QAAQ,GAAA,CAAA;;;;SAOVlH,IAAAsH,EAAA,aAAA,QAAAtH,EAAU,qBAArB8L,KAAAlB,EAgBM,OAhBN0B,IAgBM;AAAA,UAfKhF,EAAA,oBAATwE,KAAAlB,EAEI,KAFJ2B,IAEIZ,EADCzE,EAAA,MAAE,gBAAgB,GAAA,CAAA,KAGTI,EAAA,mBAAdwE,EAAA,GAAAlB,EAEI,KAFJqC,IAEItB,EADEzE,QAAUI,EAAA,eAAe,KAAKA,EAAA,eAAe,GAAA,CAAA,MAGrCpH,IAAAoH,EAAA,aAAA,QAAApH,EAAU,eAAW,CAAKoH,EAAA,aAAxCwE,EAAA,GAAAlB,EAEI,KAFJsC,IAEIvB,EADCzE,EAAA,MAAE,SAAS,GAAA,CAAA,MAGhB4E,EAAA,GAAAlB,EAEI,KAFJuC,IAEIxB,EADCzE,EAAA,MAAE,gBAAgB,GAAA,CAAA;AAAA,QAAA;;;;;;;;;;;;;;AC/H7B,UAAMK,IAAQD,GAKR0D,IAAOC,GAIPC,IAASnL,EAAI,EAAK,GAClBmH,IAAInG,EAAS,MAAMqK,EAAK7D,EAAM,QAAQ,CAAC;qBAI3BD,EAAA,iBAAhBsD,EAgCWsB,GAAA,EAAA,KAAA,KAAA;AAAA,MA/BTT,EAcS,UAAA;AAAA,QAbP,MAAK;AAAA,QACJ,SAAK3B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA+B,MAAEX,EAAA,QAAM,CAAIA,EAAA;AAAA,QAClB,OAAM;AAAA,MAAA;cAENN,EAOM,OAAA;AAAA,UANH,0CAAwCM,EAAA,SAAM,WAAA,CAAA;AAAA,UAC/C,MAAK;AAAA,UACL,QAAO;AAAA,UACP,SAAQ;AAAA,QAAA;UAERO,EAAyF,QAAA;AAAA,YAAnF,kBAAe;AAAA,YAAQ,mBAAgB;AAAA,YAAQ,gBAAa;AAAA,YAAI,GAAE;AAAA,UAAA;;UACpE,MACNE,EAAGzE,EAAA,MAAE,aAAa,GAAA,CAAA;AAAA,MAAA;MAGpBuE,EAcM,OAAA;AAAA,QAbJ,OAAM;AAAA,QACL,6BAA2BP,EAAA,QAAM,QAAA,OAAA;AAAA,MAAA;QAElCO,EASM,OATNC,IASM;AAAA,UARJD,EAOE,SAAA;AAAA,YANA,MAAK;AAAA,YACJ,OAAOnE,EAAA;AAAA,YACP,gCAAO0D,EAAI,kBAAoBa,EAAO,OAA4B,KAAK;AAAA,YACvE,aAAavE,EAAA,SAAS;AAAA,YACtB,UAAUA,EAAA;AAAA,YACX,OAAM;AAAA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3BhB,UAAMC,IAAQD,GAMR0D,IAAOC,GAMP;AAAA,MACJ,YAAAnL;AAAA,MACA,QAAAG;AAAA,MACA,OAAAE;AAAA,MACA,WAAAE;AAAA,MACA,SAAAE;AAAA,MACA,QAAAE;AAAA,MACA,YAAAC;AAAA,MACA,YAAAC;AAAA,MACA,UAAAO;AAAA,MACA,WAAAkM;AAAA,MACA,SAAAnK;AAAA,MACA,QAAQC;AAAA,MACR,SAAAd;AAAA,MACA,MAAAI;AAAA,MACA,aAAAK;AAAA,MACA,kBAAAjC;AAAA,MACA,iBAAAC;AAAA,IAAA,IACEjB,GAAY;AAAA,MACd,UAAU2H,EAAM;AAAA,MAChB,gBAAgBA,EAAM;AAAA,MACtB,eAAeA,EAAM;AAAA,MACrB,aAAaA,EAAM;AAAA,MACnB,eAAeA,EAAM;AAAA,MACrB,cAAcA,EAAM;AAAA,IAAA,CACrB,GAEKL,IAAInG,EAAS,MAAMqK,EAAK7D,EAAM,QAAQ,CAAC,GACvC8F,IAAatN,EAAsB,MAAM,GACzCuN,IAAgBvN,EAAI,EAAK;AAG/B,IAAA0B,EAAM,CAAC3B,GAAYG,GAAQE,GAAOI,CAAO,GAAG,MAAM;AAChD,MAAAyK,EAAK,UAAU;AAAA,QACb,YAAYlL,EAAW;AAAA,QACvB,QAAQG,EAAO;AAAA,QACf,OAAOE,EAAM;AAAA,QACb,SAASI,EAAQ;AAAA,MAAA,CAClB;AAAA,IACH,CAAC,GAGDkB,EAAMd,GAAY,CAAC0B,MAAW;AAC5B,MAAIA,KAAQ2I,EAAK,cAAc3I,CAAM;AAAA,IACvC,CAAC;AAGD,aAASkL,IAAa;AACpB,MAAA/K,EAAA,GACA6K,EAAW,QAAQ,SACnBrC,EAAK,QAAQ9H,EAAc,KAAK,GAChC,WAAW,MAAM;AAAE,QAAAmK,EAAW,QAAQ;AAAA,MAAQ,GAAG,GAAI;AAAA,IACvD;AAGA,aAASG,EAAehC,GAAY;AAClC,MAAA1L,EAAW,QAAQ0L;AAAA,IACrB;AAEA,aAASiC,EAAa/C,GAAa;AACjC,MAAAzK,EAAO,QAAQyK;AAAA,IACjB;AAEA,aAASgD,EAAYlC,GAAYzI,GAAe;AAC9C,MAAAF,EAAY2I,GAAIzI,CAAI;AAAA,IACtB;AAEA,aAAS4K,EAAcjD,GAAa;AAClC,MAAAnK,EAAQ,QAAQmK;AAAA,IAClB;;;AAKE,aAAAoB,EAAA,GAAAlB,EAiJM,OAjJNc,IAiJM;AAAA,QAhJMpE,EAAA,cAAVsD,EAAoE,MAApEgB,IAAoED,EAAbrE,EAAA,KAAK,GAAA,CAAA;QAE5DmE,EA4GM,OA5GNiB,IA4GM;AAAA,UA3GJ7B,EAME+C,IAAA;AAAA,YALC,WAAW9C,EAAAsC,CAAA;AAAA,YACX,oBAAoBtC,EAAAhL,CAAA;AAAA,YACpB,UAAQ0N;AAAA,YACR,UAAUlG,EAAA;AAAA,YACV,UAAUA,EAAA;AAAA,UAAA;UAGbuD,EAMEgD,IAAA;AAAA,YALC,UAAU/C,EAAA5J,CAAA;AAAA,YACV,SAAS4J,EAAAvK,CAAA;AAAA,YACT,oBAAgBoN;AAAA,YAChB,UAAUrG,EAAA;AAAA,YACV,UAAUA,EAAA;AAAA,UAAA;UAIbmE,EA0BM,OAAA;AAAA,YA1BA,qDAAmDX,EAAAhL,CAAA,IAAU,gDAAA,mCAAA,CAAA;AAAA,UAAA;YACjE2L,EAwBM,OAxBNM,IAwBM;AAAA,cAvBJlB,EASEiD,IAAA;AAAA,gBARC,UAAUhD,EAAA5J,CAAA;AAAA,gBACV,QAAQ4J,EAAA7K,CAAA;AAAA,gBACR,mBAAewN;AAAA,gBACf,YAAY3C,EAAApK,CAAA;AAAA,gBACZ,UAAU4G,EAAA;AAAA,gBACV,UAAUA,EAAA;AAAA,gBACV,kBAAkBwD,EAAAlK,CAAA;AAAA,gBAClB,iBAAiBkK,EAAAjK,CAAA;AAAA,cAAA;cAGpBgK,EAWEkD,IAAA;AAAA,gBAVC,UAAUjD,EAAA5J,CAAA;AAAA,gBACV,QAAQ4J,EAAArK,CAAA;AAAA,gBACR,iBAAiBqK,EAAA3K,CAAA;AAAA,gBACjB,UAAQuN;AAAA,gBACR,aAAa5C,EAAA7K,CAAA;AAAA,gBACb,UAAUqH,EAAA;AAAA,gBACV,UAAUA,EAAA;AAAA,gBACV,kBAAkBwD,EAAAlK,CAAA;AAAA,gBAClB,iBAAiBkK,EAAAjK,CAAA;AAAA,gBACjB,mBAAmBiK,EAAAzK,CAAA;AAAA,cAAA;;;UAM1BoL,EA4DM,OA5DNkB,IA4DM;AAAA,YA3DJlB,EA8CM,OA9CNQ,IA8CM;AAAA,cA7CJR,EA8BS,UAAA;AAAA,gBA7BP,MAAK;AAAA,gBACJ,iCAAOX,EAAA1I,CAAA;gBACP,UAAQ,CAAG0I,QAAU,CAAKA,EAAA7K,CAAA,MAAW6K,EAAA3K,CAAA,KAASmH,EAAA,YAAYwD,EAAApK,CAAA,MAAU;AAAA,gBACpE,OAAK0L,EAAA;AAAA,kBAAA;AAAA,kBAAuCtB,EAAApK,CAAA,MAAU,YAAA,sBAAuDoK,EAAApK,CAAA,MAAU,UAAA;;;gBAM5GoK,EAAApK,CAAA,MAAU,aAAtBoL,KAAAlB,EAMO,QANPyB,IAMO;AAAA,kCALLZ,EAGM,OAAA;AAAA,oBAHD,OAAM;AAAA,oBAAkB,SAAQ;AAAA,oBAAY,MAAK;AAAA,kBAAA;oBACpDA,EAA2F,UAAA;AAAA,sBAAnF,OAAM;AAAA,sBAAa,IAAG;AAAA,sBAAK,IAAG;AAAA,sBAAK,GAAE;AAAA,sBAAK,QAAO;AAAA,sBAAe,gBAAa;AAAA,oBAAA;oBACrFA,EAA+F,QAAA;AAAA,sBAAzF,OAAM;AAAA,sBAAa,MAAK;AAAA,sBAAe,GAAE;AAAA,oBAAA;;oBAC3C,MACNE,EAAGzE,EAAA,MAAE,OAAO,GAAA,CAAA;AAAA,gBAAA,MAEG4D,EAAApK,CAAA,MAAU,aAA3BoL,KAAAlB,EAKO,QALPoC,IAKO;AAAA,kCAJLvB,EAEM,OAAA;AAAA,oBAFD,OAAM;AAAA,oBAAqB,MAAK;AAAA,oBAAe,SAAQ;AAAA,kBAAA;oBAC1DA,EAAkI,QAAA,EAA5H,GAAE,yHAAuH;AAAA,kBAAA;kBAC3HuC,EAAA,MACNrC,EAAGzE,EAAA,MAAE,WAAW,IAAG,MAACyE,GAAGb,IAAAA,EAAAnK,CAAA,MAAAmK,QAAAA,EAAY,YAAS,GAAMA,EAAAnK,CAAA,EAAW,SAAS,OAAA,EAAA,GAAA,CAAA;AAAA,gBAAA,MAEvDmK,EAAApK,CAAA,MAAU,WAA3BoL,KAAAlB,EAKO,QALP0B,IAKO;AAAA,kCAJLb,EAEM,OAAA;AAAA,oBAFD,OAAM;AAAA,oBAAmB,MAAK;AAAA,oBAAe,SAAQ;AAAA,kBAAA;oBACxDA,EAA6G,QAAA,EAAvG,GAAE,oGAAkG;AAAA,kBAAA;oBACtG,MACNE,EAAGzE,EAAA,MAAE,UAAU,GAAA,CAAA;AAAA,gBAAA,YAEjB0D,EAAkDsB,GAAA,EAAA,KAAA,KAAA;AAAA,kBAA9B8B,EAAArC,EAAAzE,EAAA,MAAE,cAAc,GAAA,CAAA;AAAA,gBAAA;;cAGtCuE,EAYS,UAAA;AAAA,gBAXN,SAAO8B;AAAA,gBACP,UAAQ,CAAGzC,EAAA7H,CAAA,KAAWqE,EAAA;AAAA,gBACtB,8BAA4B+F,EAAA,UAAU,UAAA,sBAAA,mBAAA,CAAA;AAAA,cAAA;gBAE3BA,EAAA,UAAU,WAAtBvB,KAAAlB,EAKO,QALPqC,IAKO;AAAA,kCAJLxB,EAEM,OAAA;AAAA,oBAFD,OAAM;AAAA,oBAAU,MAAK;AAAA,oBAAO,QAAO;AAAA,oBAAe,SAAQ;AAAA,kBAAA;oBAC7DA,EAA6F,QAAA;AAAA,sBAAvF,kBAAe;AAAA,sBAAQ,mBAAgB;AAAA,sBAAQ,gBAAa;AAAA,sBAAM,GAAE;AAAA,oBAAA;;oBACtE,MACNE,EAAGzE,EAAA,MAAE,KAAK,GAAA,CAAA;AAAA,gBAAA,YAEZ0D,EAA0DsB,GAAA,EAAA,KAAA,KAAA;AAAA,sBAAtC5E,EAAA,kBAAkBJ,EAAA,MAAE,IAAI,GAAA,CAAA;AAAA,gBAAA;;;YAKhDuE,EASM,OAAA;AAAA,cARJ,OAAM;AAAA,cACL,OAAKwC,EAAA,EAAA,kBAAA,GAAwBnD,IAAAA,EAAAnK,CAAA,MAAAmK,QAAAA,EAAY,cAAWA,IAAAA,EAAAnK,CAAA,MAAAmK,QAAAA,EAAY,YAAWA,EAAApK,CAAA,MAAU,aAAkBoK,EAAApK,CAAA,MAAU,YAAA,QAAA,MAAA,CAAA;AAAA,YAAA;cAElH+K,EAIM,OAJNyB,IAIM;AAAA,gBAHJzB,EAEM,OAFN0B,IAEM;AAAA,kBADJ1B,EAAsG,KAAtGyC,IAAsGvC,GAA1Bb,KAAAA,EAAAnK,CAAA,MAAAmK,gBAAAA,GAAY,OAAO,GAAA,CAAA;AAAA,gBAAA;;;;;QAQ9FxD,EAAA,eAAewD,EAAA5J,CAAA,KAA1B4K,KAAAlB,EA8BM,OA9BNuD,IA8BM;AAAA,UA7BJ1C,EAYS,UAAA;AAAA,YAXP,MAAK;AAAA,YACJ,SAAK3B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA+B,OAAEyB,EAAA,QAAa,CAAIA,EAAA;AAAA,YACzB,OAAM;AAAA,UAAA;YAEN7B,EAA8G,MAA9G2C,IAA8GzC,EAAjBzE,EAAA,MAAE,OAAO,GAAA,CAAA;AAAA,kBACtG0D,EAKM,OAAA;AAAA,cAJH,qEAAmE0C,EAAA,QAAa,eAAA,EAAA,CAAA;AAAA,cACjF,MAAK;AAAA,cAAO,QAAO;AAAA,cAAe,SAAQ;AAAA,YAAA;cAE1C7B,EAA2F,QAAA;AAAA,gBAArF,kBAAe;AAAA,gBAAQ,mBAAgB;AAAA,gBAAQ,gBAAa;AAAA,gBAAI,GAAE;AAAA,cAAA;;;UAG5EA,EAeM,OAAA;AAAA,YAdJ,OAAM;AAAA,YACL,6BAA2B6B,EAAA,QAAa,QAAA,OAAA;AAAA,UAAA;YAEzC7B,EAUM,OAVN4C,IAUM;AAAA,cATJ5C,EAQM,OARN6C,IAAmI,KAC7I3C,EAAG,KAAK,UAAS;AAAA,gBAAgB,UAAAb,EAAA5J,CAAA,EAAS;AAAA,gBAAoB,WAAA4J,EAAA5J,CAAA,EAAS;AAAA,yBAAuB4J,EAAAvK,CAAA,KAAWuK,EAAA5J,CAAA,EAAS;AAAA,uBAAmB4J,EAAA3K,CAAA,KAAS+G,EAAA,MAAE;AAAA,6BAA4B4D,EAAA7K,CAAA;AAAA,cAAA,eAM9J;AAAA,aACJ,CAAA;AAAA,YAAA;;;;;;;","x_google_ignoreList":[1,2]}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(function($,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@tombcato/ai-selector-core")):typeof define=="function"&&define.amd?define(["exports","vue","@tombcato/ai-selector-core"],e):($=typeof globalThis<"u"?globalThis:$||self,e($.AISelectorVue={},$.Vue,$.AISelectorCore))})(this,(function($,e,z){"use strict";function q(t={}){var V,U,F,L,A;const s=e.ref(((V=t.initialConfig)==null?void 0:V.providerId)||""),r=e.ref(((U=t.initialConfig)==null?void 0:U.apiKey)||""),l=e.ref(((F=t.initialConfig)==null?void 0:F.model)||""),a=e.ref(((L=t.initialConfig)==null?void 0:L.modelName)||""),n=e.ref(((A=t.initialConfig)==null?void 0:A.baseUrl)||""),p=e.ref([]),d=e.ref("idle"),o=e.ref(null),h=e.ref(!1),u=e.ref(null),f=e.computed(()=>z.resolveProviderConfig(t.providerConfig)),c=e.computed(()=>f.value.providers),m=e.computed(()=>c.value.find(i=>i.id===s.value)||null),x=z.createConfigStorage(void 0,{serialize:t.onSerialize,deserialize:t.onDeserialize}),C=e.ref(!1);e.onMounted(()=>{const i=x.load();i&&i.providerId&&c.value.some(g=>g.id===i.providerId)&&(s.value=i.providerId,i.apiKey&&(r.value=i.apiKey),i.model&&(l.value=i.model),i.modelName&&(a.value=i.modelName),i.baseUrl&&(n.value=i.baseUrl)),setTimeout(()=>{C.value=!0},0)}),e.watch(s,()=>{C.value&&(r.value="",l.value="",a.value="",n.value="",d.value="idle",o.value=null)});let y=null;const E=new Map;e.watch([s,r,n],()=>{if(y&&clearTimeout(y),!s.value||!m.value){p.value=[],u.value=null,h.value=!1;return}const i=m.value.supportsModelsApi&&(!m.value.needsApiKey||!!r.value),g=n.value||m.value.baseUrl,v=`${s.value}|${g}|${r.value}`,D=E.get(v);if(D){p.value=D,u.value=null,h.value=!1;return}if(!i){const M=f.value.getModels(s.value);p.value=M,E.set(v,M),u.value=null,h.value=!1;return}h.value=!0,u.value=null,p.value.length===0&&(p.value=f.value.getModels(s.value)),y=setTimeout(async()=>{try{let M;t.modelFetcher?M=await t.modelFetcher({type:"fetchModels",providerId:m.value.id,baseUrl:g,apiKey:r.value}):M=await z.fetchModels({provider:m.value,apiKey:r.value,baseUrl:g,proxyUrl:t.proxyUrl,fallbackToStatic:!1}),p.value=M,E.set(v,M)}catch(M){console.warn("Model fetch failed:",M),u.value="fetchModelsFailed",p.value=f.value.getModels(s.value)}finally{h.value=!1}},500)},{immediate:!0}),e.watch([r,n],()=>{(d.value==="error"||d.value==="success")&&(d.value="idle",o.value=null)});async function k(){if(!m.value||m.value.needsApiKey&&!r.value)return;d.value="testing",o.value=null;let i;if(t.modelFetcher)try{const g=await t.modelFetcher({type:"checkConnection",providerId:m.value.id,baseUrl:n.value||m.value.baseUrl,apiKey:r.value,modelId:l.value});i={success:g.success,latencyMs:g.latency||g.latencyMs,message:g.message}}catch(g){i={success:!1,message:g.message||"Unknown error"}}else i=await z.testConnection({provider:m.value,apiKey:r.value,baseUrl:n.value,model:l.value,proxyUrl:t.proxyUrl});return o.value=i,d.value=i.success?"success":"error",setTimeout(()=>{d.value="idle"},2e3),i}function N(){const i=p.value.find(v=>v.id===l.value),g=(i==null?void 0:i.name)||a.value||l.value;i!=null&&i.name&&i.name!==a.value&&(a.value=i.name),x.save({providerId:s.value,apiKey:r.value,model:l.value,modelName:g,baseUrl:n.value})}function B(){x.clear(),s.value="",r.value="",l.value="",a.value="",n.value=""}function w(i,g){if(l.value=i,g)a.value=g;else{const v=p.value.find(D=>D.id===i);a.value=(v==null?void 0:v.name)||i}}const I=e.computed(()=>{var i;return!(!s.value||!l.value||(i=m.value)!=null&&i.needsApiKey&&!r.value)}),b=e.computed(()=>{var i;return{providerId:s.value,apiKey:r.value,model:l.value,modelName:a.value,baseUrl:n.value||((i=m.value)==null?void 0:i.baseUrl)||""}});return{providerId:s,apiKey:r,model:l,modelName:a,baseUrl:n,models:p,testStatus:d,testResult:o,isFetchingModels:h,fetchModelError:u,provider:m,providers:c,isValid:I,config:b,runTest:k,save:N,clear:B,selectModel:w}}var G=Object.defineProperty,Q=(t,s,r)=>s in t?G(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r,O=(t,s,r)=>Q(t,typeof s!="symbol"?s+"":s,r);const S="\0";class X{constructor(s){O(this,"numOriginalCharacters"),O(this,"characterList"),O(this,"characterIndicesMap");const r=[...s],l=r.length;this.numOriginalCharacters=l,this.characterIndicesMap=new Map;for(let a=0;a<l;a++)this.characterIndicesMap.set(r[a],a);this.characterList=new Array(l*2+1),this.characterList[0]=S;for(let a=0;a<l;a++)this.characterList[1+a]=r[a],this.characterList[1+l+a]=r[a]}getCharacterIndices(s,r,l){let a=this.getIndexOfChar(s),n=this.getIndexOfChar(r);if(a<0||n<0)return null;switch(l){case"DOWN":r===S?n=this.characterList.length:n<a&&(n+=this.numOriginalCharacters);break;case"UP":a<n&&(a+=this.numOriginalCharacters);break;case"ANY":if(s!==S&&r!==S){if(n<a){const p=a-n;this.numOriginalCharacters-a+n<p&&(n+=this.numOriginalCharacters)}else if(a<n){const p=n-a;this.numOriginalCharacters-n+a<p&&(a+=this.numOriginalCharacters)}}break}return{startIndex:a,endIndex:n}}getSupportedCharacters(){return new Set(this.characterIndicesMap.keys())}getCharacterList(){return this.characterList}getIndexOfChar(s){return s===S?0:this.characterIndicesMap.has(s)?this.characterIndicesMap.get(s)+1:-1}}const _=0,T=1,K=2;function Z(t,s,r){let l=0,a=0;const n=[];for(;;){const p=l===t.length,d=a===s.length;if(p&&d)break;if(p){for(;a<s.length;a++)n.push(T);break}if(d){for(;l<t.length;l++)n.push(K);break}const o=r.has(t[l]),h=r.has(s[a]);if(o&&h){let u=l+1,f=a+1;for(;u<t.length&&r.has(t[u]);)u++;for(;f<s.length&&r.has(s[f]);)f++;const c=u-l,m=f-a;if(c===m)for(let x=0;x<c;x++)n.push(_);else{const x=Array(c+1).fill(null).map(()=>Array(m+1).fill(0));for(let k=0;k<=c;k++)x[k][0]=k;for(let k=0;k<=m;k++)x[0][k]=k;for(let k=1;k<=c;k++)for(let N=1;N<=m;N++){const B=t[l+k-1]===s[a+N-1]?0:1;x[k][N]=Math.min(x[k-1][N]+1,x[k][N-1]+1,x[k-1][N-1]+B)}const C=[];let y=c,E=m;for(;y>0||E>0;)if(y===0)C.push(T),E--;else if(E===0)C.push(K),y--;else{const k=x[y][E-1],N=x[y-1][E],B=x[y-1][E-1];k<N&&k<B?(C.push(T),E--):N<B?(C.push(K),y--):(C.push(_),y--,E--)}for(let k=C.length-1;k>=0;k--)n.push(C[k])}l=u,a=f}else o?(n.push(T),a++):h?(n.push(K),l++):(n.push(_),l++,a++)}return n}function W(){return{currentChar:S,targetChar:S,charList:null,startIndex:0,endIndex:0,sourceWidth:0,currentWidth:0,targetWidth:0,directionAdj:1,prevDelta:0,currDelta:0}}function P(t,s,r,l){const a={...t};a.targetChar=s,a.sourceWidth=a.currentWidth,a.targetWidth=s===S?0:1;let n=!1;for(const p of r){const d=p.getCharacterIndices(a.currentChar,s,l);if(d){a.charList=p.getCharacterList(),a.startIndex=d.startIndex,a.endIndex=d.endIndex,n=!0;break}}return n||(a.charList=a.currentChar===s?[a.currentChar]:[a.currentChar,s],a.startIndex=0,a.endIndex=a.currentChar===s?0:1),a.directionAdj=a.endIndex>=a.startIndex?1:-1,a.prevDelta=a.currDelta,a.currDelta=0,a}function j(t,s,r=!1){const l={...t},a=Math.abs(l.endIndex-l.startIndex),n=s*a,p=n-Math.floor(n),d=l.prevDelta*(1-s),o=p*l.directionAdj+d,h=l.startIndex+Math.floor(n)*l.directionAdj;return s>=1?(l.currentChar=l.targetChar,l.currDelta=0,l.prevDelta=0):r&&l.charList&&h>=0&&h<l.charList.length&&(l.currentChar=l.charList[h],l.currDelta=o),l.currentWidth=l.sourceWidth+(l.targetWidth-l.sourceWidth)*s,{col:l,charIdx:h,delta:o}}const Y={linear:t=>t,easeIn:t=>t*t,easeOut:t=>1-(1-t)*(1-t),easeInOut:t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,bounce:t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},R=1.2,ee=((t,s)=>{const r=t.__vccOpts||t;for(const[l,a]of s)r[l]=a;return r})(e.defineComponent({__name:"Ticker",props:{value:{type:String,required:!0},characterLists:{type:Array,default:()=>["0123456789"]},duration:{type:Number,default:500},direction:{type:String,default:"ANY"},easing:{type:String,default:"easeInOut"},className:{type:String,default:""},charWidth:{type:Number,default:1}},setup(t){const s=t,r=e.ref([]),l=e.ref(1);let a;const n=e.computed(()=>s.characterLists.map(o=>new X(o))),p=e.computed(()=>{const o=new Set;return n.value.forEach(h=>h.getSupportedCharacters().forEach(u=>o.add(u))),o});e.watch(()=>s.value,(o,h)=>{if(o===h)return;a&&(cancelAnimationFrame(a),a=void 0);let u=r.value;l.value<1&&l.value>0&&(u=u.map(b=>j(b,l.value,!0).col));const f=[...o],c=u.map(b=>b.currentChar),m=Z(c,f,p.value);let x=0,C=0;const y=[],E=u.filter(b=>b.currentWidth>0);for(const b of m)if(b===T)y.push(P(W(),f[C++],n.value,s.direction));else if(b===_){const V=E[x++]||W();y.push(P(V,f[C++],n.value,s.direction))}else{const V=E[x++]||W();y.push(P(V,S,n.value,s.direction))}r.value=y,l.value=0;const k=performance.now(),N=s.duration,B=Y[s.easing]||Y.linear;let w=0;const I=b=>{const V=Math.min((b-k)/N,1),U=B(V);if((b-w>=16||V>=1)&&(w=b,l.value=U),V<1)a=requestAnimationFrame(I);else{const L=r.value.map(A=>j(A,1).col).filter(A=>A.currentWidth>0);r.value=L,l.value=1,a=void 0}};a=requestAnimationFrame(I)},{immediate:!0}),e.onUnmounted(()=>{a&&cancelAnimationFrame(a)});const d=e.computed(()=>r.value.map(o=>{const{charIdx:h,delta:u}=j(o,l.value),f=o.sourceWidth+(o.targetWidth-o.sourceWidth)*l.value;if(f<=0)return{width:f,chars:[]};const c=[],m=o.charList||[],x=u*R,C=(b,V,U)=>{b>=0&&b<m.length&&c.push({key:`${U}-${b}`,char:m[b],offset:x+V})};C(h,0,"c"),C(h+1,-R,"n"),C(h-1,R,"p");const y=b=>b&&b.length>0&&b.charCodeAt(0)>255,E=b=>y(b)?1.25:.8,k=m[o.startIndex]||"",N=m[o.endIndex]||"",B=E(k),w=E(N),I=B+(w-B)*l.value;return{width:f,chars:c,baseW:I}}).filter(o=>o.width>0));return(o,h)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ticker",t.className])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,(u,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"ticker-column",style:e.normalizeStyle({width:`${u.width*(u.baseW||.8)*t.charWidth}em`})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.chars,c=>(e.openBlock(),e.createElementBlock("div",{key:c.key,class:"ticker-char",style:e.normalizeStyle({transform:`translateY(${c.offset}em)`})},e.toDisplayString(c.char===e.unref(S)?" ":c.char),5))),128))],4))),128))],2))}}),[["__scopeId","data-v-7e47ac69"]]),H=e.defineComponent({__name:"SmartText",props:{text:{},className:{},placeholder:{}},setup(t){return(s,r)=>!t.text&&t.placeholder?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["apmsu-placeholder",t.className])},e.toDisplayString(t.placeholder),3)):t.text?(e.openBlock(),e.createElementBlock("span",{key:1,class:e.normalizeClass(["inline-flex min-w-0",t.className])},[e.createVNode(e.unref(ee),{value:t.text,"char-width":.8,duration:300},null,8,["value"])],2)):e.createCommentVNode("",!0)}}),te={class:"apmsu-label"},ae={class:"relative"},le=["disabled"],ne={key:0,class:"flex items-center gap-2 min-w-0"},re=["src","alt"],se={key:1,class:"apmsu-placeholder"},oe=["onClick"],ie={class:"flex items-center gap-2 flex-shrink-0"},ce=["src","alt"],de={class:"font-medium whitespace-nowrap"},ue={class:"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0"},me=e.defineComponent({__name:"ProviderSelect",props:{providers:{},selectedProviderId:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["select"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.ref(null),p=e.computed(()=>z.I18N[r.language]),d=e.computed(()=>r.providers.find(u=>u.id===r.selectedProviderId));function o(u){n.value&&!n.value.contains(u.target)&&(a.value=!1)}e.onMounted(()=>{document.addEventListener("mousedown",o)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",o)});function h(u){l("select",u),a.value=!1}return(u,f)=>(e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:n},[e.createElementVNode("label",te,e.toDisplayString(p.value.providerLabel),1),e.createElementVNode("div",ae,[e.createElementVNode("button",{type:"button",onClick:f[0]||(f[0]=c=>!t.disabled&&(a.value=!a.value)),disabled:t.disabled,class:"apmsu-select-trigger"},[d.value?(e.openBlock(),e.createElementBlock("div",ne,[e.createElementVNode("img",{src:d.value.icon,alt:d.value.name,class:"apmsu-provider-icon"},null,8,re),e.createVNode(H,{text:d.value.name},null,8,["text"])])):(e.openBlock(),e.createElementBlock("span",se,e.toDisplayString(p.value.selectProvider),1)),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...f[1]||(f[1]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,le),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top",a.value?"apmsu-dropdown-open":""])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.providers,c=>(e.openBlock(),e.createElementBlock("button",{key:c.id,type:"button",onClick:m=>h(c.id),class:e.normalizeClass(["apmsu-dropdown-item rounded-sm",t.selectedProviderId===c.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("div",ie,[e.createElementVNode("img",{src:c.icon,alt:c.name,class:"apmsu-provider-icon"},null,8,ce),e.createElementVNode("span",de,e.toDisplayString(c.name),1)]),e.createElementVNode("span",ue,e.toDisplayString(c.baseUrl.replace("https://","")),1)],10,oe))),128))],2)])],512))}}),pe={key:0,class:"apmsu-field"},fe={class:"apmsu-label"},he={class:"relative"},ge=["type","value","placeholder","disabled"],ye={class:"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center"},ke={key:0,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},be={key:1,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},xe=e.defineComponent({__name:"AuthInput",props:{provider:{},apiKey:{},testStatus:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:apiKey"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.computed(()=>z.I18N[r.language]),p=e.computed(()=>r.testStatus==="success"?"apmsu-input apmsu-input-success":"apmsu-input apmsu-input-default");return(d,o)=>t.provider&&t.provider.needsApiKey?(e.openBlock(),e.createElementBlock("div",pe,[e.createElementVNode("label",fe,e.toDisplayString(n.value.apiKeyLabel),1),e.createElementVNode("div",he,[e.createElementVNode("input",{type:a.value?"text":"password",value:t.apiKey,onInput:o[0]||(o[0]=h=>l("update:apiKey",h.target.value)),onFocus:o[1]||(o[1]=h=>a.value=!0),onBlur:o[2]||(o[2]=h=>a.value=!1),placeholder:n.value.apiKeyPlaceholder,disabled:t.disabled,class:e.normalizeClass([p.value,"pr-10"])},null,42,ge),e.createElementVNode("span",ye,[a.value?(e.openBlock(),e.createElementBlock("svg",ke,[...o[3]||(o[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},null,-1),e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",be,[...o[4]||(o[4]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"},null,-1)])]))])])])):e.createCommentVNode("",!0)}}),Ce={class:"apmsu-label flex items-center justify-between"},Ee={class:"relative"},Ne=["disabled"],we={class:"p-1.5 border-b border-gray-100 dark:border-zinc-800"},Be=["placeholder","autofocus"],Ve={class:"max-h-60 overflow-auto"},ve={class:"text-blue-500"},Me=["onClick"],Ie={key:1,class:"p-4 text-center apmsu-hint-text"},Se={key:0,class:"min-h-[20px] flex items-center"},$e={key:0,class:"apmsu-hint-text animate-pulse"},ze={key:1,class:"apmsu-hint-text dark:text-zinc-500"},Ue={key:2,class:"apmsu-hint-text"},Ae={key:3,class:"apmsu-hint-text"},De=e.defineComponent({__name:"ModelSelect",props:{provider:{},models:{},selectedModelId:{},hasApiKey:{type:Boolean},disabled:{type:Boolean,default:!1},language:{default:"zh"},isFetchingModels:{type:Boolean},fetchModelError:{},selectedModelName:{}},emits:["select"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.ref(""),p=e.ref(null),d=e.computed(()=>z.I18N[r.language]),o=e.computed(()=>r.models.filter(c=>c.name.toLowerCase().includes(n.value.toLowerCase())||c.id.toLowerCase().includes(n.value.toLowerCase()))),h=e.computed(()=>{var c;return((c=r.models.find(m=>m.id===r.selectedModelId))==null?void 0:c.name)||r.selectedModelName||r.selectedModelId});function u(c){p.value&&!p.value.contains(c.target)&&(a.value=!1,n.value="")}e.onMounted(()=>{document.addEventListener("mousedown",u)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",u)});function f(c,m){l("select",c,m),a.value=!1,n.value=""}return(c,m)=>{var x,C;return e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:p},[e.createElementVNode("label",Ce,[e.createElementVNode("span",null,e.toDisplayString(d.value.modelLabel),1)]),e.createElementVNode("div",Ee,[e.createElementVNode("button",{type:"button",onClick:m[0]||(m[0]=y=>!t.disabled&&t.provider&&(a.value=!a.value)),disabled:t.disabled||!t.provider,class:"apmsu-select-trigger"},[e.createVNode(H,{text:h.value?h.value:"",placeholder:d.value.selectModel},null,8,["text","placeholder"]),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...m[3]||(m[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,Ne),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown origin-top",a.value?"apmsu-dropdown-open":""])},[e.createElementVNode("div",we,[e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":m[1]||(m[1]=y=>n.value=y),placeholder:d.value.searchModel,class:"apmsu-select-trigger",autofocus:a.value},null,8,Be),[[e.vModelText,n.value]])]),e.createElementVNode("div",Ve,[n.value&&!o.value.some(y=>y.id===n.value)?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",onClick:m[2]||(m[2]=y=>f(n.value)),class:"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b"},[e.createElementVNode("span",ve,e.toDisplayString(d.value.useCustom)+": "+e.toDisplayString(n.value),1)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,y=>(e.openBlock(),e.createElementBlock("button",{key:y.id,type:"button",onClick:E=>f(y.id,y.name),class:e.normalizeClass(["apmsu-dropdown-item",t.selectedModelId===y.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("span",null,e.toDisplayString(y.name),1)],10,Me))),128)),o.value.length===0&&!n.value?(e.openBlock(),e.createElementBlock("div",Ie,e.toDisplayString(d.value.noModels),1)):e.createCommentVNode("",!0)])],2)]),(x=t.provider)!=null&&x.supportsModelsApi?(e.openBlock(),e.createElementBlock("div",Se,[t.isFetchingModels?(e.openBlock(),e.createElementBlock("p",$e,e.toDisplayString(d.value.refreshingModels),1)):t.fetchModelError?(e.openBlock(),e.createElementBlock("p",ze,e.toDisplayString(d.value[t.fetchModelError]||t.fetchModelError),1)):(C=t.provider)!=null&&C.needsApiKey&&!t.hasApiKey?(e.openBlock(),e.createElementBlock("p",Ue,e.toDisplayString(d.value.apiKeyTip),1)):(e.openBlock(),e.createElementBlock("p",Ae,e.toDisplayString(d.value.modelListUpdated),1))])):e.createCommentVNode("",!0)],512)}}}),Le={class:"overflow-hidden"},Te=["value","placeholder","disabled"],Fe=e.defineComponent({__name:"BaseUrlInput",props:{provider:{},baseUrl:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:baseUrl"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.computed(()=>z.I18N[r.language]);return(p,d)=>t.provider?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{type:"button",onClick:d[0]||(d[0]=o=>a.value=!a.value),class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors"},[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-3 h-3 transition-transform",a.value&&"rotate-90"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...d[2]||(d[2]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2)),e.createTextVNode(" "+e.toDisplayString(n.value.customBaseUrl),1)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:a.value?"1fr":"0fr"})},[e.createElementVNode("div",Le,[e.createElementVNode("input",{type:"text",value:t.baseUrl,onInput:d[1]||(d[1]=o=>l("update:baseUrl",o.target.value)),placeholder:t.provider.baseUrl,disabled:t.disabled,class:"apmsu-input apmsu-input-default"},null,40,Te)])],4)],64)):e.createCommentVNode("",!0)}}),_e={class:"apmsu-card"},Ke={key:0,class:"text-lg font-semibold mb-4"},Oe={class:"space-y-3"},We={class:"space-y-4"},Pe={class:"pt-2 space-y-2"},je={class:"flex gap-2"},Re=["disabled"],qe={key:0,class:"flex items-center justify-center gap-2"},Ye={key:1,class:"flex items-center justify-center gap-2"},He={key:2,class:"flex items-center justify-center gap-2"},Je=["disabled"],Ge={key:0,class:"flex items-center justify-center gap-2"},Qe={class:"overflow-hidden"},Xe={class:"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800"},Ze={class:"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left"},et={key:1,class:"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden"},tt={class:"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider"},at={class:"overflow-hidden"},lt={class:"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50"},nt=e.defineComponent({__name:"AIConfigForm",props:{proxyUrl:{},config:{},initialConfig:{},title:{},showPreview:{type:Boolean,default:!1},saveButtonText:{},disabled:{type:Boolean,default:!1},onSerialize:{},onDeserialize:{},language:{default:"zh"},modelFetcher:{}},emits:["save","testResult","change"],setup(t,{emit:s}){const r=t,l=s,{providerId:a,apiKey:n,model:p,modelName:d,baseUrl:o,models:h,testStatus:u,testResult:f,provider:c,providers:m,isValid:x,config:C,runTest:y,save:E,selectModel:k,isFetchingModels:N,fetchModelError:B}=q({proxyUrl:r.proxyUrl,providerConfig:r.config,initialConfig:r.initialConfig,onSerialize:r.onSerialize,onDeserialize:r.onDeserialize,modelFetcher:r.modelFetcher}),w=e.computed(()=>z.I18N[r.language]),I=e.ref("idle"),b=e.ref(!1);e.watch([a,n,p,o],()=>{l("change",{providerId:a.value,apiKey:n.value,model:p.value,baseUrl:o.value})}),e.watch(f,i=>{i&&l("testResult",i)});function V(){E(),I.value="saved",l("save",C.value),setTimeout(()=>{I.value="idle"},2e3)}function U(i){a.value=i}function F(i){n.value=i}function L(i,g){k(i,g)}function A(i){o.value=i}return(i,g)=>{var v,D,M,J;return e.openBlock(),e.createElementBlock("div",_e,[t.title?(e.openBlock(),e.createElementBlock("h2",Ke,e.toDisplayString(t.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",Oe,[e.createVNode(me,{providers:e.unref(m),selectedProviderId:e.unref(a),onSelect:U,disabled:t.disabled,language:t.language},null,8,["providers","selectedProviderId","disabled","language"]),e.createVNode(Fe,{provider:e.unref(c),baseUrl:e.unref(o),"onUpdate:baseUrl":A,disabled:t.disabled,language:t.language},null,8,["provider","baseUrl","disabled","language"]),e.createElementVNode("div",{class:e.normalizeClass(["transition-all duration-500 ease-in-out",e.unref(a)?"max-h-[1000px] opacity-100 overflow-visible":"max-h-0 opacity-0 overflow-hidden"])},[e.createElementVNode("div",We,[e.createVNode(xe,{provider:e.unref(c),apiKey:e.unref(n),"onUpdate:apiKey":F,testStatus:e.unref(u),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(N),fetchModelError:e.unref(B)},null,8,["provider","apiKey","testStatus","disabled","language","isFetchingModels","fetchModelError"]),e.createVNode(De,{provider:e.unref(c),models:e.unref(h),selectedModelId:e.unref(p),onSelect:L,hasApiKey:!!e.unref(n),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(N),fetchModelError:e.unref(B),selectedModelName:e.unref(d)},null,8,["provider","models","selectedModelId","hasApiKey","disabled","language","isFetchingModels","fetchModelError","selectedModelName"])])],2),e.createElementVNode("div",Pe,[e.createElementVNode("div",je,[e.createElementVNode("button",{type:"button",onClick:g[0]||(g[0]=rt=>e.unref(y)()),disabled:!e.unref(a)||!e.unref(n)||!e.unref(p)||t.disabled||e.unref(u)==="testing",class:e.normalizeClass(["apmsu-btn flex-1",e.unref(u)==="success"?"apmsu-btn-success":e.unref(u)==="error"?"bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40":"apmsu-btn-ghost border border-gray-200 dark:border-zinc-700"])},[e.unref(u)==="testing"?(e.openBlock(),e.createElementBlock("span",qe,[g[2]||(g[2]=e.createElementVNode("svg",{class:"apmsu-icon-spin",viewBox:"0 0 24 24",fill:"none"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testing),1)])):e.unref(u)==="success"?(e.openBlock(),e.createElementBlock("span",Ye,[g[3]||(g[3]=e.createElementVNode("svg",{class:"apmsu-icon-success",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testSuccess)+" "+e.toDisplayString((v=e.unref(f))!=null&&v.latencyMs?`${e.unref(f).latencyMs}ms`:""),1)])):e.unref(u)==="error"?(e.openBlock(),e.createElementBlock("span",He,[g[4]||(g[4]=e.createElementVNode("svg",{class:"apmsu-icon-error",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testFailed),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createTextVNode(e.toDisplayString(w.value.testConnection),1)],64))],10,Re),e.createElementVNode("button",{onClick:V,disabled:!e.unref(x)||t.disabled,class:e.normalizeClass(["apmsu-btn flex-1",I.value==="saved"?"apmsu-btn-success":"apmsu-btn-primary"])},[I.value==="saved"?(e.openBlock(),e.createElementBlock("span",Ge,[g[5]||(g[5]=e.createElementVNode("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 13l4 4L19 7"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.saved),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(t.saveButtonText||w.value.save),1)],64))],10,Je)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:!((D=e.unref(f))!=null&&D.success)&&((M=e.unref(f))!=null&&M.message)&&e.unref(u)!=="testing"&&e.unref(u)!=="success"?"1fr":"0fr"})},[e.createElementVNode("div",Qe,[e.createElementVNode("div",Xe,[e.createElementVNode("p",Ze,e.toDisplayString((J=e.unref(f))==null?void 0:J.message),1)])])],4)])]),t.showPreview&&e.unref(c)?(e.openBlock(),e.createElementBlock("div",et,[e.createElementVNode("button",{type:"button",onClick:g[1]||(g[1]=rt=>b.value=!b.value),class:"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors"},[e.createElementVNode("h3",tt,e.toDisplayString(w.value.preview),1),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-4 h-4 text-gray-400 transition-transform duration-200",b.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...g[6]||(g[6]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:b.value?"1fr":"0fr"})},[e.createElementVNode("div",at,[e.createElementVNode("pre",lt,""+e.toDisplayString(JSON.stringify({provider:e.unref(c).name,apiFormat:e.unref(c).apiFormat,baseUrl:e.unref(o)||e.unref(c).baseUrl,model:e.unref(p)||w.value.unselected,hasApiKey:!!e.unref(n)},null,2))+`
|
|
1
|
+
(function($,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@tombcato/ai-selector-core")):typeof define=="function"&&define.amd?define(["exports","vue","@tombcato/ai-selector-core"],e):($=typeof globalThis<"u"?globalThis:$||self,e($.AISelectorVue={},$.Vue,$.AISelectorCore))})(this,(function($,e,z){"use strict";function q(t={}){var V,U,F,L,A;const s=e.ref(((V=t.initialConfig)==null?void 0:V.providerId)||""),r=e.ref(((U=t.initialConfig)==null?void 0:U.apiKey)||""),l=e.ref(((F=t.initialConfig)==null?void 0:F.model)||""),a=e.ref(((L=t.initialConfig)==null?void 0:L.modelName)||""),n=e.ref(((A=t.initialConfig)==null?void 0:A.baseUrl)||""),p=e.ref([]),d=e.ref("idle"),o=e.ref(null),h=e.ref(!1),u=e.ref(null),f=e.computed(()=>z.resolveProviderConfig(t.providerConfig)),c=e.computed(()=>f.value.providers),m=e.computed(()=>c.value.find(i=>i.id===s.value)||null),x=z.createConfigStorage(void 0,{serialize:t.onSerialize,deserialize:t.onDeserialize}),C=e.ref(!1);e.onMounted(()=>{const i=x.load();i&&i.providerId&&c.value.some(g=>g.id===i.providerId)&&(s.value=i.providerId,i.apiKey&&(r.value=i.apiKey),i.model&&(l.value=i.model),i.modelName&&(a.value=i.modelName),i.baseUrl&&(n.value=i.baseUrl)),setTimeout(()=>{C.value=!0},0)}),e.watch(s,()=>{C.value&&(r.value="",l.value="",a.value="",n.value="",d.value="idle",o.value=null)});let y=null;const E=new Map;e.watch([s,r,n],()=>{if(y&&clearTimeout(y),!s.value||!m.value){p.value=[],u.value=null,h.value=!1;return}const i=m.value.supportsModelsApi&&(!m.value.needsApiKey||!!r.value),g=n.value||m.value.baseUrl,v=`${s.value}|${g}|${r.value}`,D=E.get(v);if(D){p.value=D,u.value=null,h.value=!1;return}if(!i){const M=f.value.getModels(s.value);p.value=M,E.set(v,M),u.value=null,h.value=!1;return}h.value=!0,u.value=null,p.value.length===0&&(p.value=f.value.getModels(s.value)),y=setTimeout(async()=>{try{let M;t.modelFetcher?M=await t.modelFetcher({type:"fetchModels",providerId:m.value.id,baseUrl:g,apiKey:r.value}):M=await z.fetchModels({provider:m.value,apiKey:r.value,baseUrl:g,proxyUrl:t.proxyUrl,fallbackToStatic:!1}),p.value=M,E.set(v,M)}catch(M){console.warn("Model fetch failed:",M),u.value="fetchModelsFailed",p.value=f.value.getModels(s.value)}finally{h.value=!1}},500)},{immediate:!0}),e.watch([r,n],()=>{(d.value==="error"||d.value==="success")&&(d.value="idle",o.value=null)});async function k(){if(!m.value||m.value.needsApiKey&&!r.value)return;d.value="testing",o.value=null;let i;if(t.modelFetcher)try{const g=await t.modelFetcher({type:"checkConnection",providerId:m.value.id,baseUrl:n.value||m.value.baseUrl,apiKey:r.value,modelId:l.value});i={success:g.success,latencyMs:g.latency||g.latencyMs,message:g.message}}catch(g){i={success:!1,message:g.message||"Unknown error"}}else i=await z.testConnection({provider:m.value,apiKey:r.value,baseUrl:n.value,model:l.value,proxyUrl:t.proxyUrl});return o.value=i,d.value=i.success?"success":"error",setTimeout(()=>{d.value="idle"},2e3),i}function N(){const i=p.value.find(v=>v.id===l.value),g=(i==null?void 0:i.name)||a.value||l.value;i!=null&&i.name&&i.name!==a.value&&(a.value=i.name),x.save({providerId:s.value,apiKey:r.value,model:l.value,modelName:g,baseUrl:n.value})}function B(){x.clear(),s.value="",r.value="",l.value="",a.value="",n.value=""}function w(i,g){if(l.value=i,g)a.value=g;else{const v=p.value.find(D=>D.id===i);a.value=(v==null?void 0:v.name)||i}}const I=e.computed(()=>{var i;return!(!s.value||!l.value||(i=m.value)!=null&&i.needsApiKey&&!r.value)}),b=e.computed(()=>{var i;return{providerId:s.value,apiKey:r.value,model:l.value,modelName:a.value,baseUrl:n.value||((i=m.value)==null?void 0:i.baseUrl)||""}});return{providerId:s,apiKey:r,model:l,modelName:a,baseUrl:n,models:p,testStatus:d,testResult:o,isFetchingModels:h,fetchModelError:u,provider:m,providers:c,isValid:I,config:b,runTest:k,save:N,clear:B,selectModel:w}}var G=Object.defineProperty,Q=(t,s,r)=>s in t?G(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r,O=(t,s,r)=>Q(t,typeof s!="symbol"?s+"":s,r);const S="\0";class X{constructor(s){O(this,"numOriginalCharacters"),O(this,"characterList"),O(this,"characterIndicesMap");const r=[...s],l=r.length;this.numOriginalCharacters=l,this.characterIndicesMap=new Map;for(let a=0;a<l;a++)this.characterIndicesMap.set(r[a],a);this.characterList=new Array(l*2+1),this.characterList[0]=S;for(let a=0;a<l;a++)this.characterList[1+a]=r[a],this.characterList[1+l+a]=r[a]}getCharacterIndices(s,r,l){let a=this.getIndexOfChar(s),n=this.getIndexOfChar(r);if(a<0||n<0)return null;switch(l){case"DOWN":r===S?n=this.characterList.length:n<a&&(n+=this.numOriginalCharacters);break;case"UP":a<n&&(a+=this.numOriginalCharacters);break;case"ANY":if(s!==S&&r!==S){if(n<a){const p=a-n;this.numOriginalCharacters-a+n<p&&(n+=this.numOriginalCharacters)}else if(a<n){const p=n-a;this.numOriginalCharacters-n+a<p&&(a+=this.numOriginalCharacters)}}break}return{startIndex:a,endIndex:n}}getSupportedCharacters(){return new Set(this.characterIndicesMap.keys())}getCharacterList(){return this.characterList}getIndexOfChar(s){return s===S?0:this.characterIndicesMap.has(s)?this.characterIndicesMap.get(s)+1:-1}}const _=0,T=1,K=2;function Z(t,s,r){let l=0,a=0;const n=[];for(;;){const p=l===t.length,d=a===s.length;if(p&&d)break;if(p){for(;a<s.length;a++)n.push(T);break}if(d){for(;l<t.length;l++)n.push(K);break}const o=r.has(t[l]),h=r.has(s[a]);if(o&&h){let u=l+1,f=a+1;for(;u<t.length&&r.has(t[u]);)u++;for(;f<s.length&&r.has(s[f]);)f++;const c=u-l,m=f-a;if(c===m)for(let x=0;x<c;x++)n.push(_);else{const x=Array(c+1).fill(null).map(()=>Array(m+1).fill(0));for(let k=0;k<=c;k++)x[k][0]=k;for(let k=0;k<=m;k++)x[0][k]=k;for(let k=1;k<=c;k++)for(let N=1;N<=m;N++){const B=t[l+k-1]===s[a+N-1]?0:1;x[k][N]=Math.min(x[k-1][N]+1,x[k][N-1]+1,x[k-1][N-1]+B)}const C=[];let y=c,E=m;for(;y>0||E>0;)if(y===0)C.push(T),E--;else if(E===0)C.push(K),y--;else{const k=x[y][E-1],N=x[y-1][E],B=x[y-1][E-1];k<N&&k<B?(C.push(T),E--):N<B?(C.push(K),y--):(C.push(_),y--,E--)}for(let k=C.length-1;k>=0;k--)n.push(C[k])}l=u,a=f}else o?(n.push(T),a++):h?(n.push(K),l++):(n.push(_),l++,a++)}return n}function W(){return{currentChar:S,targetChar:S,charList:null,startIndex:0,endIndex:0,sourceWidth:0,currentWidth:0,targetWidth:0,directionAdj:1,prevDelta:0,currDelta:0}}function P(t,s,r,l){const a={...t};a.targetChar=s,a.sourceWidth=a.currentWidth,a.targetWidth=s===S?0:1;let n=!1;for(const p of r){const d=p.getCharacterIndices(a.currentChar,s,l);if(d){a.charList=p.getCharacterList(),a.startIndex=d.startIndex,a.endIndex=d.endIndex,n=!0;break}}return n||(a.charList=a.currentChar===s?[a.currentChar]:[a.currentChar,s],a.startIndex=0,a.endIndex=a.currentChar===s?0:1),a.directionAdj=a.endIndex>=a.startIndex?1:-1,a.prevDelta=a.currDelta,a.currDelta=0,a}function j(t,s,r=!1){const l={...t},a=Math.abs(l.endIndex-l.startIndex),n=s*a,p=n-Math.floor(n),d=l.prevDelta*(1-s),o=p*l.directionAdj+d,h=l.startIndex+Math.floor(n)*l.directionAdj;return s>=1?(l.currentChar=l.targetChar,l.currDelta=0,l.prevDelta=0):r&&l.charList&&h>=0&&h<l.charList.length&&(l.currentChar=l.charList[h],l.currDelta=o),l.currentWidth=l.sourceWidth+(l.targetWidth-l.sourceWidth)*s,{col:l,charIdx:h,delta:o}}const Y={linear:t=>t,easeIn:t=>t*t,easeOut:t=>1-(1-t)*(1-t),easeInOut:t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,bounce:t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},R=1.2,ee=((t,s)=>{const r=t.__vccOpts||t;for(const[l,a]of s)r[l]=a;return r})(e.defineComponent({__name:"Ticker",props:{value:{type:String,required:!0},characterLists:{type:Array,default:()=>["0123456789"]},duration:{type:Number,default:500},direction:{type:String,default:"ANY"},easing:{type:String,default:"easeInOut"},className:{type:String,default:""},charWidth:{type:Number,default:1}},setup(t){const s=t,r=e.ref([]),l=e.ref(1);let a;const n=e.computed(()=>s.characterLists.map(o=>new X(o))),p=e.computed(()=>{const o=new Set;return n.value.forEach(h=>h.getSupportedCharacters().forEach(u=>o.add(u))),o});e.watch(()=>s.value,(o,h)=>{if(o===h)return;a&&(cancelAnimationFrame(a),a=void 0);let u=r.value;l.value<1&&l.value>0&&(u=u.map(b=>j(b,l.value,!0).col));const f=[...o],c=u.map(b=>b.currentChar),m=Z(c,f,p.value);let x=0,C=0;const y=[],E=u.filter(b=>b.currentWidth>0);for(const b of m)if(b===T)y.push(P(W(),f[C++],n.value,s.direction));else if(b===_){const V=E[x++]||W();y.push(P(V,f[C++],n.value,s.direction))}else{const V=E[x++]||W();y.push(P(V,S,n.value,s.direction))}r.value=y,l.value=0;const k=performance.now(),N=s.duration,B=Y[s.easing]||Y.linear;let w=0;const I=b=>{const V=Math.min((b-k)/N,1),U=B(V);if((b-w>=16||V>=1)&&(w=b,l.value=U),V<1)a=requestAnimationFrame(I);else{const L=r.value.map(A=>j(A,1).col).filter(A=>A.currentWidth>0);r.value=L,l.value=1,a=void 0}};a=requestAnimationFrame(I)},{immediate:!0}),e.onUnmounted(()=>{a&&cancelAnimationFrame(a)});const d=e.computed(()=>r.value.map(o=>{const{charIdx:h,delta:u}=j(o,l.value),f=o.sourceWidth+(o.targetWidth-o.sourceWidth)*l.value;if(f<=0)return{width:f,chars:[]};const c=[],m=o.charList||[],x=u*R,C=(b,V,U)=>{b>=0&&b<m.length&&c.push({key:`${U}-${b}`,char:m[b],offset:x+V})};C(h,0,"c"),C(h+1,-R,"n"),C(h-1,R,"p");const y=b=>b&&b.length>0&&b.charCodeAt(0)>255,E=b=>y(b)?1.25:.8,k=m[o.startIndex]||"",N=m[o.endIndex]||"",B=E(k),w=E(N),I=B+(w-B)*l.value;return{width:f,chars:c,baseW:I}}).filter(o=>o.width>0));return(o,h)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ticker",t.className])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,(u,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"ticker-column",style:e.normalizeStyle({width:`${u.width*(u.baseW||.8)*t.charWidth}em`})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.chars,c=>(e.openBlock(),e.createElementBlock("div",{key:c.key,class:"ticker-char",style:e.normalizeStyle({transform:`translateY(${c.offset}em)`})},e.toDisplayString(c.char===e.unref(S)?" ":c.char),5))),128))],4))),128))],2))}}),[["__scopeId","data-v-7e47ac69"]]),H=e.defineComponent({__name:"SmartText",props:{text:{},className:{},placeholder:{}},setup(t){return(s,r)=>!t.text&&t.placeholder?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["apmsu-placeholder",t.className])},e.toDisplayString(t.placeholder),3)):t.text?(e.openBlock(),e.createElementBlock("span",{key:1,class:e.normalizeClass(["inline-flex min-w-0",t.className])},[e.createVNode(e.unref(ee),{value:t.text,"char-width":.8,duration:300},null,8,["value"])],2)):e.createCommentVNode("",!0)}}),te={class:"apmsu-label"},ae={class:"relative"},le=["disabled"],ne={key:0,class:"flex items-center gap-2 min-w-0"},re=["src","alt"],se={key:1,class:"apmsu-placeholder"},oe=["onClick"],ie={class:"flex items-center gap-2 flex-shrink-0"},ce=["src","alt"],de={class:"font-medium whitespace-nowrap"},ue={class:"apmsu-hint-text ml-auto text-right truncate flex-1 min-w-0"},me=e.defineComponent({__name:"ProviderSelect",props:{providers:{},selectedProviderId:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["select"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.ref(null),p=e.computed(()=>z.I18N[r.language]),d=e.computed(()=>r.providers.find(u=>u.id===r.selectedProviderId));function o(u){n.value&&!n.value.contains(u.target)&&(a.value=!1)}e.onMounted(()=>{document.addEventListener("mousedown",o)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",o)});function h(u){l("select",u),a.value=!1}return(u,f)=>(e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:n},[e.createElementVNode("label",te,e.toDisplayString(p.value.providerLabel),1),e.createElementVNode("div",ae,[e.createElementVNode("button",{type:"button",onClick:f[0]||(f[0]=c=>!t.disabled&&(a.value=!a.value)),disabled:t.disabled,class:"apmsu-select-trigger"},[d.value?(e.openBlock(),e.createElementBlock("div",ne,[e.createElementVNode("img",{src:d.value.icon,alt:d.value.name,class:"apmsu-provider-icon"},null,8,re),e.createVNode(H,{text:d.value.name},null,8,["text"])])):(e.openBlock(),e.createElementBlock("span",se,e.toDisplayString(p.value.selectProvider),1)),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...f[1]||(f[1]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,le),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown max-h-[300px] overflow-auto p-1 origin-top",a.value?"apmsu-dropdown-open":""])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.providers,c=>(e.openBlock(),e.createElementBlock("button",{key:c.id,type:"button",onClick:m=>h(c.id),class:e.normalizeClass(["apmsu-dropdown-item rounded-sm",t.selectedProviderId===c.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("div",ie,[e.createElementVNode("img",{src:c.icon,alt:c.name,class:"apmsu-provider-icon"},null,8,ce),e.createElementVNode("span",de,e.toDisplayString(c.name),1)]),e.createElementVNode("span",ue,e.toDisplayString(c.baseUrl.replace("https://","")),1)],10,oe))),128))],2)])],512))}}),pe={key:0,class:"apmsu-field"},fe={class:"apmsu-label"},he={class:"relative"},ge=["type","value","placeholder","disabled"],ye={class:"absolute right-3 top-1/2 -translate-y-1/2 flex items-center justify-center"},ke={key:0,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},be={key:1,class:"w-4 h-4 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},xe=e.defineComponent({__name:"AuthInput",props:{provider:{},apiKey:{},testStatus:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:apiKey"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.computed(()=>z.I18N[r.language]),p=e.computed(()=>"apmsu-input apmsu-input-default");return(d,o)=>t.provider&&t.provider.needsApiKey?(e.openBlock(),e.createElementBlock("div",pe,[e.createElementVNode("label",fe,e.toDisplayString(n.value.apiKeyLabel),1),e.createElementVNode("div",he,[e.createElementVNode("input",{type:a.value?"text":"password",value:t.apiKey,onInput:o[0]||(o[0]=h=>l("update:apiKey",h.target.value)),onFocus:o[1]||(o[1]=h=>a.value=!0),onBlur:o[2]||(o[2]=h=>a.value=!1),placeholder:n.value.apiKeyPlaceholder,disabled:t.disabled,class:e.normalizeClass([p.value,"pr-10"])},null,42,ge),e.createElementVNode("span",ye,[a.value?(e.openBlock(),e.createElementBlock("svg",ke,[...o[3]||(o[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"},null,-1),e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",be,[...o[4]||(o[4]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"},null,-1)])]))])])])):e.createCommentVNode("",!0)}}),Ce={class:"apmsu-label flex items-center justify-between"},Ee={class:"relative"},Ne=["disabled"],we={class:"p-1.5 border-b border-gray-100 dark:border-zinc-800"},Be=["placeholder","autofocus"],Ve={class:"max-h-60 overflow-auto"},ve={class:"text-blue-500"},Me=["onClick"],Ie={key:1,class:"p-4 text-center apmsu-hint-text"},Se={key:0,class:"min-h-[20px] flex items-center"},$e={key:0,class:"apmsu-hint-text animate-pulse"},ze={key:1,class:"apmsu-hint-text dark:text-zinc-500"},Ue={key:2,class:"apmsu-hint-text"},Ae={key:3,class:"apmsu-hint-text"},De=e.defineComponent({__name:"ModelSelect",props:{provider:{},models:{},selectedModelId:{},hasApiKey:{type:Boolean},disabled:{type:Boolean,default:!1},language:{default:"zh"},isFetchingModels:{type:Boolean},fetchModelError:{},selectedModelName:{}},emits:["select"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.ref(""),p=e.ref(null),d=e.computed(()=>z.I18N[r.language]),o=e.computed(()=>r.models.filter(c=>c.name.toLowerCase().includes(n.value.toLowerCase())||c.id.toLowerCase().includes(n.value.toLowerCase()))),h=e.computed(()=>{var c;return((c=r.models.find(m=>m.id===r.selectedModelId))==null?void 0:c.name)||r.selectedModelName||r.selectedModelId});function u(c){p.value&&!p.value.contains(c.target)&&(a.value=!1,n.value="")}e.onMounted(()=>{document.addEventListener("mousedown",u)}),e.onUnmounted(()=>{document.removeEventListener("mousedown",u)});function f(c,m){l("select",c,m),a.value=!1,n.value=""}return(c,m)=>{var x,C;return e.openBlock(),e.createElementBlock("div",{class:"apmsu-field",ref_key:"triggerRef",ref:p},[e.createElementVNode("label",Ce,[e.createElementVNode("span",null,e.toDisplayString(d.value.modelLabel),1)]),e.createElementVNode("div",Ee,[e.createElementVNode("button",{type:"button",onClick:m[0]||(m[0]=y=>!t.disabled&&t.provider&&(a.value=!a.value)),disabled:t.disabled||!t.provider,class:"apmsu-select-trigger"},[e.createVNode(H,{text:h.value?h.value:"",placeholder:d.value.selectModel},null,8,["text","placeholder"]),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["apmsu-chevron",a.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...m[3]||(m[3]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))],8,Ne),e.createElementVNode("div",{class:e.normalizeClass(["apmsu-dropdown origin-top",a.value?"apmsu-dropdown-open":""])},[e.createElementVNode("div",we,[e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":m[1]||(m[1]=y=>n.value=y),placeholder:d.value.searchModel,class:"apmsu-select-trigger",autofocus:a.value},null,8,Be),[[e.vModelText,n.value]])]),e.createElementVNode("div",Ve,[n.value&&!o.value.some(y=>y.id===n.value)?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",onClick:m[2]||(m[2]=y=>f(n.value)),class:"apmsu-dropdown-item bg-blue-50 dark:bg-blue-900/20 border-b"},[e.createElementVNode("span",ve,e.toDisplayString(d.value.useCustom)+": "+e.toDisplayString(n.value),1)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,y=>(e.openBlock(),e.createElementBlock("button",{key:y.id,type:"button",onClick:E=>f(y.id,y.name),class:e.normalizeClass(["apmsu-dropdown-item",t.selectedModelId===y.id&&"apmsu-dropdown-item-active"])},[e.createElementVNode("span",null,e.toDisplayString(y.name),1)],10,Me))),128)),o.value.length===0&&!n.value?(e.openBlock(),e.createElementBlock("div",Ie,e.toDisplayString(d.value.noModels),1)):e.createCommentVNode("",!0)])],2)]),(x=t.provider)!=null&&x.supportsModelsApi?(e.openBlock(),e.createElementBlock("div",Se,[t.isFetchingModels?(e.openBlock(),e.createElementBlock("p",$e,e.toDisplayString(d.value.refreshingModels),1)):t.fetchModelError?(e.openBlock(),e.createElementBlock("p",ze,e.toDisplayString(d.value[t.fetchModelError]||t.fetchModelError),1)):(C=t.provider)!=null&&C.needsApiKey&&!t.hasApiKey?(e.openBlock(),e.createElementBlock("p",Ue,e.toDisplayString(d.value.apiKeyTip),1)):(e.openBlock(),e.createElementBlock("p",Ae,e.toDisplayString(d.value.modelListUpdated),1))])):e.createCommentVNode("",!0)],512)}}}),Le={class:"overflow-hidden"},Te=["value","placeholder","disabled"],Fe=e.defineComponent({__name:"BaseUrlInput",props:{provider:{},baseUrl:{},disabled:{type:Boolean,default:!1},language:{default:"zh"}},emits:["update:baseUrl"],setup(t,{emit:s}){const r=t,l=s,a=e.ref(!1),n=e.computed(()=>z.I18N[r.language]);return(p,d)=>t.provider?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{type:"button",onClick:d[0]||(d[0]=o=>a.value=!a.value),class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex items-center gap-1 transition-colors"},[(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-3 h-3 transition-transform",a.value&&"rotate-90"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...d[2]||(d[2]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])],2)),e.createTextVNode(" "+e.toDisplayString(n.value.customBaseUrl),1)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:a.value?"1fr":"0fr"})},[e.createElementVNode("div",Le,[e.createElementVNode("input",{type:"text",value:t.baseUrl,onInput:d[1]||(d[1]=o=>l("update:baseUrl",o.target.value)),placeholder:t.provider.baseUrl,disabled:t.disabled,class:"apmsu-input apmsu-input-default"},null,40,Te)])],4)],64)):e.createCommentVNode("",!0)}}),_e={class:"apmsu-card"},Ke={key:0,class:"text-lg font-semibold mb-4"},Oe={class:"space-y-3"},We={class:"space-y-4"},Pe={class:"pt-2 space-y-2"},je={class:"flex gap-2"},Re=["disabled"],qe={key:0,class:"flex items-center justify-center gap-2"},Ye={key:1,class:"flex items-center justify-center gap-2"},He={key:2,class:"flex items-center justify-center gap-2"},Je=["disabled"],Ge={key:0,class:"flex items-center justify-center gap-2"},Qe={class:"overflow-hidden"},Xe={class:"p-2 rounded-md bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800"},Ze={class:"text-xs text-red-600 dark:text-red-400 line-clamp-3 text-left"},et={key:1,class:"mt-6 border border-gray-200/50 dark:border-zinc-800 rounded-lg overflow-hidden"},tt={class:"text-xs font-medium text-gray-500 dark:text-zinc-500 uppercase tracking-wider"},at={class:"overflow-hidden"},lt={class:"text-xs text-gray-600 dark:text-zinc-400 font-mono overflow-x-auto leading-relaxed p-4 bg-zinc-50 dark:bg-zinc-900/50"},nt=e.defineComponent({__name:"AIConfigForm",props:{proxyUrl:{},config:{},initialConfig:{},title:{},showPreview:{type:Boolean,default:!1},saveButtonText:{},disabled:{type:Boolean,default:!1},onSerialize:{},onDeserialize:{},language:{default:"zh"},modelFetcher:{}},emits:["save","testResult","change"],setup(t,{emit:s}){const r=t,l=s,{providerId:a,apiKey:n,model:p,modelName:d,baseUrl:o,models:h,testStatus:u,testResult:f,provider:c,providers:m,isValid:x,config:C,runTest:y,save:E,selectModel:k,isFetchingModels:N,fetchModelError:B}=q({proxyUrl:r.proxyUrl,providerConfig:r.config,initialConfig:r.initialConfig,onSerialize:r.onSerialize,onDeserialize:r.onDeserialize,modelFetcher:r.modelFetcher}),w=e.computed(()=>z.I18N[r.language]),I=e.ref("idle"),b=e.ref(!1);e.watch([a,n,p,o],()=>{l("change",{providerId:a.value,apiKey:n.value,model:p.value,baseUrl:o.value})}),e.watch(f,i=>{i&&l("testResult",i)});function V(){E(),I.value="saved",l("save",C.value),setTimeout(()=>{I.value="idle"},2e3)}function U(i){a.value=i}function F(i){n.value=i}function L(i,g){k(i,g)}function A(i){o.value=i}return(i,g)=>{var v,D,M,J;return e.openBlock(),e.createElementBlock("div",_e,[t.title?(e.openBlock(),e.createElementBlock("h2",Ke,e.toDisplayString(t.title),1)):e.createCommentVNode("",!0),e.createElementVNode("div",Oe,[e.createVNode(me,{providers:e.unref(m),selectedProviderId:e.unref(a),onSelect:U,disabled:t.disabled,language:t.language},null,8,["providers","selectedProviderId","disabled","language"]),e.createVNode(Fe,{provider:e.unref(c),baseUrl:e.unref(o),"onUpdate:baseUrl":A,disabled:t.disabled,language:t.language},null,8,["provider","baseUrl","disabled","language"]),e.createElementVNode("div",{class:e.normalizeClass(["transition-all duration-500 ease-in-out",e.unref(a)?"max-h-[1000px] opacity-100 overflow-visible":"max-h-0 opacity-0 overflow-hidden"])},[e.createElementVNode("div",We,[e.createVNode(xe,{provider:e.unref(c),apiKey:e.unref(n),"onUpdate:apiKey":F,testStatus:e.unref(u),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(N),fetchModelError:e.unref(B)},null,8,["provider","apiKey","testStatus","disabled","language","isFetchingModels","fetchModelError"]),e.createVNode(De,{provider:e.unref(c),models:e.unref(h),selectedModelId:e.unref(p),onSelect:L,hasApiKey:!!e.unref(n),disabled:t.disabled,language:t.language,isFetchingModels:e.unref(N),fetchModelError:e.unref(B),selectedModelName:e.unref(d)},null,8,["provider","models","selectedModelId","hasApiKey","disabled","language","isFetchingModels","fetchModelError","selectedModelName"])])],2),e.createElementVNode("div",Pe,[e.createElementVNode("div",je,[e.createElementVNode("button",{type:"button",onClick:g[0]||(g[0]=rt=>e.unref(y)()),disabled:!e.unref(a)||!e.unref(n)||!e.unref(p)||t.disabled||e.unref(u)==="testing",class:e.normalizeClass(["apmsu-btn flex-1",e.unref(u)==="success"?"apmsu-btn-success":e.unref(u)==="error"?"bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/40":"apmsu-btn-ghost border border-gray-200 dark:border-zinc-700"])},[e.unref(u)==="testing"?(e.openBlock(),e.createElementBlock("span",qe,[g[2]||(g[2]=e.createElementVNode("svg",{class:"apmsu-icon-spin",viewBox:"0 0 24 24",fill:"none"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testing),1)])):e.unref(u)==="success"?(e.openBlock(),e.createElementBlock("span",Ye,[g[3]||(g[3]=e.createElementVNode("svg",{class:"apmsu-icon-success",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testSuccess)+" "+e.toDisplayString((v=e.unref(f))!=null&&v.latencyMs?`${e.unref(f).latencyMs}ms`:""),1)])):e.unref(u)==="error"?(e.openBlock(),e.createElementBlock("span",He,[g[4]||(g[4]=e.createElementVNode("svg",{class:"apmsu-icon-error",fill:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.testFailed),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createTextVNode(e.toDisplayString(w.value.testConnection),1)],64))],10,Re),e.createElementVNode("button",{onClick:V,disabled:!e.unref(x)||t.disabled,class:e.normalizeClass(["apmsu-btn flex-1",I.value==="saved"?"apmsu-btn-success":"apmsu-btn-primary"])},[I.value==="saved"?(e.openBlock(),e.createElementBlock("span",Ge,[g[5]||(g[5]=e.createElementVNode("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2.5",d:"M5 13l4 4L19 7"})],-1)),e.createTextVNode(" "+e.toDisplayString(w.value.saved),1)])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(t.saveButtonText||w.value.save),1)],64))],10,Je)]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:!((D=e.unref(f))!=null&&D.success)&&((M=e.unref(f))!=null&&M.message)&&e.unref(u)!=="testing"&&e.unref(u)!=="success"?"1fr":"0fr"})},[e.createElementVNode("div",Qe,[e.createElementVNode("div",Xe,[e.createElementVNode("p",Ze,e.toDisplayString((J=e.unref(f))==null?void 0:J.message),1)])])],4)])]),t.showPreview&&e.unref(c)?(e.openBlock(),e.createElementBlock("div",et,[e.createElementVNode("button",{type:"button",onClick:g[1]||(g[1]=rt=>b.value=!b.value),class:"w-full flex items-center justify-between px-4 py-3 bg-zinc-50 dark:bg-zinc-900/50 hover:bg-zinc-100 dark:hover:bg-zinc-800/50 transition-colors"},[e.createElementVNode("h3",tt,e.toDisplayString(w.value.preview),1),(e.openBlock(),e.createElementBlock("svg",{class:e.normalizeClass(["w-4 h-4 text-gray-400 transition-transform duration-200",b.value?"rotate-180":""]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...g[6]||(g[6]=[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))]),e.createElementVNode("div",{class:"grid transition-all duration-200 ease-out",style:e.normalizeStyle({gridTemplateRows:b.value?"1fr":"0fr"})},[e.createElementVNode("div",at,[e.createElementVNode("pre",lt,""+e.toDisplayString(JSON.stringify({provider:e.unref(c).name,apiFormat:e.unref(c).apiFormat,baseUrl:e.unref(o)||e.unref(c).baseUrl,model:e.unref(p)||w.value.unselected,hasApiKey:!!e.unref(n)},null,2))+`
|
|
2
2
|
`,1)])],4)])):e.createCommentVNode("",!0)])}}});$.AIConfigForm=nt,$.useAIConfig=q,Object.defineProperty($,Symbol.toStringTag,{value:"Module"})}));
|
|
3
3
|
//# sourceMappingURL=index.umd.js.map
|