@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.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.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","charHeight","Ticker","sfc","props","val","defineComponent","__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","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","t","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.umd.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","charHeight","Ticker","sfc","props","val","defineComponent","__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","_createElementBlock","_createVNode","_unref","SmartTicker","emit","__emit","isOpen","triggerRef","t","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]}
|