@chenpu17/cc-gw 0.3.9 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/README.md +1 -1
  2. package/package.json +17 -27
  3. package/src/server/dist/index.js +66 -11
  4. package/src/web/dist/assets/About-DmfYXdTi.js +11 -0
  5. package/src/web/dist/assets/{ApiKeys-D3tshK2D.js → ApiKeys-Bq84uD5O.js} +1 -1
  6. package/src/web/dist/assets/{Button-CiJz5FvC.js → Button-B4UYWk6z.js} +1 -1
  7. package/src/web/dist/assets/{Dashboard-BcpzG5Js.js → Dashboard-CJmps0fW.js} +1 -1
  8. package/src/web/dist/assets/{FormField-DTM2fGgN.js → FormField-DKIC96zy.js} +1 -1
  9. package/src/web/dist/assets/{Help-CHzXBSkF.js → Help-C7fFCpNH.js} +1 -1
  10. package/src/web/dist/assets/{Input-Drhy9itS.js → Input-Cr1GbVY7.js} +1 -1
  11. package/src/web/dist/assets/{Login-DB7EbGqT.js → Login-f_-O93Uo.js} +1 -1
  12. package/src/web/dist/assets/Logs-CyN3g8z0.js +1 -0
  13. package/src/web/dist/assets/ModelManagement-B11a4hW3.js +1 -0
  14. package/src/web/dist/assets/{PageSection-BXgr5Sv8.js → PageSection-eOpSKdGw.js} +1 -1
  15. package/src/web/dist/assets/{Settings-CCeTL4KH.js → Settings-BUNwIquC.js} +1 -1
  16. package/src/web/dist/assets/{StatusBadge-84FTLpO5.js → StatusBadge-CFXAJ2QF.js} +1 -1
  17. package/src/web/dist/assets/{copy-jyJz3iB0.js → copy-Br9n1n5X.js} +1 -1
  18. package/src/web/dist/assets/index-BOv43c_r.css +1 -0
  19. package/src/web/dist/assets/{index-DOE1cGyy.js → index-ChT0XT-w.js} +4 -4
  20. package/src/web/dist/assets/{index-Dcq4ildt.js → index-DtOsr5xX.js} +1 -1
  21. package/src/web/dist/assets/{info-BRp6pBBe.js → info-Cnwm2-vh.js} +1 -1
  22. package/src/web/dist/assets/{useApiQuery-DFuDkJwZ.js → useApiQuery-mBT5M_Q6.js} +1 -1
  23. package/src/web/dist/index.html +4 -3
  24. package/src/web/dist/assets/About-kwS37DF6.js +0 -11
  25. package/src/web/dist/assets/Logs-AlBaIKTP.js +0 -1
  26. package/src/web/dist/assets/ModelManagement-BkMsnFWa.js +0 -1
  27. package/src/web/dist/assets/index-gcfzHYPE.css +0 -1
package/README.md CHANGED
@@ -292,7 +292,7 @@ UI 支持中英文、深色/浅色主题以及移动端响应式布局,提供
292
292
 
293
293
  - `providers`:定义上游服务;`type` 支持 `openai | anthropic | kimi | deepseek | custom`。
294
294
  - 模型标识使用 `providerId:modelId` 形式供路由引用。
295
- - `modelRoutes`:将 Claude 发起的模型名映射到上游模型;未命中时使用 `defaults`。
295
+ - `modelRoutes`:将 Claude 发起的模型名映射到上游模型;支持在源模型名中使用 `*` 通配符匹配,匹配度更高(字符更多)的规则优先,同等情况下按配置顺序取第一条;若希望直接透传请求的模型名,可将目标写成 `providerId:*`,此时会将源请求中的模型名原样发送给对应 Provider。
296
296
  - `routingPresets`:可选字段,保存多个 `anthropic`(或其他端点)路由模板,供 Web UI “一键切换”;每个模板仅包含 `name` 与 `modelRoutes`。
297
297
  - `storeRequestPayloads` / `storeResponsePayloads`:是否分别在 SQLite 中压缩保存请求原文与响应内容;关闭可减少敏感数据落盘。
298
298
  - `bodyLimit`:单次请求允许的最大请求体大小(字节),默认 10 MiB。`/compact` 等场景会发送较大上下文,如遇 413 可按需增大。
package/package.json CHANGED
@@ -1,24 +1,8 @@
1
1
  {
2
2
  "name": "@chenpu17/cc-gw",
3
- "version": "0.3.9",
3
+ "version": "0.3.11",
4
4
  "private": false,
5
5
  "type": "module",
6
- "scripts": {
7
- "dev": "pnpm --filter server dev",
8
- "build": "pnpm run build:server && pnpm run build:web",
9
- "build:server": "pnpm --filter @cc-gw/server build",
10
- "build:cli": "pnpm --filter @cc-gw/cli build",
11
- "build:web": "pnpm --filter @cc-gw/web build",
12
- "build:all": "pnpm run build:server && pnpm run build:cli && pnpm run build:web",
13
- "release:bundle": "pnpm run build:all && node scripts/build-release.mjs",
14
- "prepack": "pnpm run build:all",
15
- "lint": "pnpm exec eslint .",
16
- "format": "pnpm exec prettier --check .",
17
- "format:write": "pnpm exec prettier --write .",
18
- "typecheck": "pnpm -r exec tsc --noEmit",
19
- "test": "pnpm exec vitest run",
20
- "test:playwright": "playwright test"
21
- },
22
6
  "bin": {
23
7
  "cc-gw": "src/cli/dist/index.js"
24
8
  },
@@ -29,15 +13,6 @@
29
13
  "README.md",
30
14
  "LICENSE"
31
15
  ],
32
- "pnpm": {
33
- "peerDependencyRules": {
34
- "ignoreMissing": [
35
- "react",
36
- "react-dom"
37
- ]
38
- }
39
- },
40
- "packageManager": "pnpm@9.0.0",
41
16
  "engines": {
42
17
  "node": ">=18.18.0"
43
18
  },
@@ -75,5 +50,20 @@
75
50
  "typescript": "^5.4.3",
76
51
  "typescript-eslint": "^7.5.0",
77
52
  "vitest": "^1.6.0"
53
+ },
54
+ "scripts": {
55
+ "dev": "pnpm --filter server dev",
56
+ "build": "pnpm run build:server && pnpm run build:web",
57
+ "build:server": "pnpm --filter @cc-gw/server build",
58
+ "build:cli": "pnpm --filter @cc-gw/cli build",
59
+ "build:web": "pnpm --filter @cc-gw/web build",
60
+ "build:all": "pnpm run build:server && pnpm run build:cli && pnpm run build:web",
61
+ "release:bundle": "pnpm run build:all && node scripts/build-release.mjs",
62
+ "lint": "pnpm exec eslint .",
63
+ "format": "pnpm exec prettier --check .",
64
+ "format:write": "pnpm exec prettier --write .",
65
+ "typecheck": "pnpm -r exec tsc --noEmit",
66
+ "test": "pnpm exec vitest run",
67
+ "test:playwright": "playwright test"
78
68
  }
79
- }
69
+ }
@@ -10331,13 +10331,68 @@ function estimateTokens(payload, model) {
10331
10331
  }
10332
10332
 
10333
10333
  // router/index.ts
10334
- function resolveByIdentifier(identifier, providers) {
10334
+ function escapeRegExp(input) {
10335
+ return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
10336
+ }
10337
+ function wildcardMatches(pattern, value) {
10338
+ const regex = new RegExp(`^${pattern.split("*").map(escapeRegExp).join(".*")}$`);
10339
+ return regex.test(value);
10340
+ }
10341
+ function derivePassthroughModel(requestedModel) {
10342
+ if (!requestedModel)
10343
+ return null;
10344
+ const trimmed = requestedModel.trim();
10345
+ if (!trimmed)
10346
+ return null;
10347
+ const parts = trimmed.split(":", 2);
10348
+ if (parts.length === 2 && parts[1]) {
10349
+ return parts[1];
10350
+ }
10351
+ return trimmed;
10352
+ }
10353
+ function findMappedIdentifier(modelId, routes) {
10354
+ if (!modelId || !routes)
10355
+ return null;
10356
+ const direct = routes[modelId];
10357
+ if (direct) {
10358
+ return direct;
10359
+ }
10360
+ let bestTarget = null;
10361
+ let bestSpecificity = -1;
10362
+ let bestIndex = Number.POSITIVE_INFINITY;
10363
+ const entries = Object.entries(routes);
10364
+ for (let index = 0; index < entries.length; index += 1) {
10365
+ const [pattern, target] = entries[index];
10366
+ if (!pattern.includes("*"))
10367
+ continue;
10368
+ if (!wildcardMatches(pattern, modelId))
10369
+ continue;
10370
+ const specificity = pattern.replace(/\*/g, "").length;
10371
+ if (specificity > bestSpecificity || specificity === bestSpecificity && index < bestIndex) {
10372
+ bestTarget = target;
10373
+ bestSpecificity = specificity;
10374
+ bestIndex = index;
10375
+ }
10376
+ }
10377
+ return bestTarget;
10378
+ }
10379
+ function resolveByIdentifier(identifier, providers, requestedModel) {
10335
10380
  if (!identifier)
10336
10381
  return null;
10337
10382
  if (identifier.includes(":")) {
10338
10383
  const [providerId, modelId] = identifier.split(":", 2);
10339
10384
  const provider = providers.find((p) => p.id === providerId);
10340
- if (provider && (provider.defaultModel === modelId || provider.models?.some((m) => m.id === modelId))) {
10385
+ if (!provider) {
10386
+ return null;
10387
+ }
10388
+ if (modelId === "*") {
10389
+ const passthrough = derivePassthroughModel(requestedModel);
10390
+ if (passthrough) {
10391
+ return { providerId, modelId: passthrough, provider, tokenEstimate: 0 };
10392
+ }
10393
+ return null;
10394
+ }
10395
+ if (provider.defaultModel === modelId || provider.models?.some((m) => m.id === modelId)) {
10341
10396
  return { providerId, modelId, provider, tokenEstimate: 0 };
10342
10397
  }
10343
10398
  } else {
@@ -10360,22 +10415,22 @@ function resolveRoute(ctx) {
10360
10415
  throw new Error("\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u63D0\u4F9B\u5546\uFF0C\u8BF7\u5148\u5728 Web UI \u4E2D\u6DFB\u52A0 Provider\u3002");
10361
10416
  }
10362
10417
  const requestedModel = ctx.requestedModel?.trim();
10363
- const mappedIdentifier = requestedModel ? endpointConfig.modelRoutes?.[requestedModel] ?? null : null;
10418
+ const mappedIdentifier = requestedModel ? findMappedIdentifier(requestedModel, endpointConfig.modelRoutes) : null;
10419
+ const mapped = mappedIdentifier ? resolveByIdentifier(mappedIdentifier, providers, requestedModel) : null;
10420
+ if (mappedIdentifier && !mapped) {
10421
+ console.warn(`modelRoutes \u6620\u5C04\u76EE\u6807\u65E0\u6548: ${mappedIdentifier}`);
10422
+ }
10364
10423
  const fallbackModelId = providers[0].defaultModel ?? providers[0].models?.[0]?.id ?? "gpt-4o";
10365
10424
  const tokenEstimate = estimateTokens(
10366
10425
  ctx.payload,
10367
- mappedIdentifier ?? requestedModel ?? fallbackModelId
10426
+ mapped?.modelId ?? requestedModel ?? fallbackModelId
10368
10427
  );
10369
10428
  const strategy = ctx.payload;
10370
10429
  const defaults = endpointConfig.defaults;
10371
- if (mappedIdentifier) {
10372
- const mapped = resolveByIdentifier(mappedIdentifier, providers);
10373
- if (mapped) {
10374
- return { ...mapped, tokenEstimate };
10375
- }
10376
- console.warn(`modelRoutes \u6620\u5C04\u76EE\u6807\u65E0\u6548: ${mappedIdentifier}`);
10430
+ if (mapped) {
10431
+ return { ...mapped, tokenEstimate };
10377
10432
  }
10378
- const fromRequest = resolveByIdentifier(requestedModel, providers);
10433
+ const fromRequest = resolveByIdentifier(requestedModel, providers, requestedModel);
10379
10434
  if (fromRequest) {
10380
10435
  return { ...fromRequest, tokenEstimate };
10381
10436
  }
@@ -0,0 +1,11 @@
1
+ import{c as p,u as v,a as k,r,j as e,d as o,H as j,m as i}from"./index-ChT0XT-w.js";import{u as N}from"./useApiQuery-mBT5M_Q6.js";import{P as w,a as d}from"./PageSection-eOpSKdGw.js";import"./Input-Cr1GbVY7.js";import{B as b}from"./Button-B4UYWk6z.js";import{I as y}from"./info-Cnwm2-vh.js";/**
2
+ * @license lucide-react v0.344.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const T=p("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/**
7
+ * @license lucide-react v0.344.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const L=p("Sparkles",[["path",{d:"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z",key:"17u4zn"}],["path",{d:"M5 3v4",key:"bklmnn"}],["path",{d:"M19 17v4",key:"iiml17"}],["path",{d:"M3 5h4",key:"nem4j1"}],["path",{d:"M17 19h4",key:"lbex7p"}]]),E="0.3.11",I={version:E},M={};function m({items:t}){return t.length===0?null:e.jsx("dl",{className:"grid gap-4 sm:grid-cols-2 xl:grid-cols-2",children:t.map(s=>e.jsxs("div",{className:"rounded-2xl border border-slate-200/50 bg-white p-4 shadow-sm shadow-slate-200/30 transition-all duration-200 hover:-translate-y-0.5 hover:border-slate-200/70 hover:shadow-md hover:shadow-slate-200/40 dark:border-slate-700/50 dark:bg-slate-900/80 dark:shadow-lg dark:shadow-slate-900/30 dark:hover:border-slate-600/70",children:[e.jsx("dt",{className:"text-xs font-semibold uppercase tracking-[0.14em] text-slate-500 dark:text-slate-400",children:s.label}),e.jsx("dd",{className:"mt-2 text-base font-semibold text-slate-900 dark:text-slate-100",children:s.value}),s.hint?e.jsx("p",{className:o(i,"mt-2 text-xs leading-relaxed"),children:s.hint}):null]},s.label))})}function B(){const{t}=v(),{pushToast:s}=k(),a=N(["status","gateway"],{url:"/api/status",method:"GET"},{staleTime:6e4});r.useEffect(()=>{a.isError&&a.error&&s({title:t("about.toast.statusError.title"),description:a.error.message,variant:"error"})},[a.isError,a.error,s,t]);const n=I.version,l=r.useMemo(()=>{const u=M,f=u.VITE_BUILD_TIME??"-",g=u.VITE_NODE_VERSION??"-";return{buildTime:f,nodeVersion:g}},[]),h=r.useMemo(()=>[{label:t("about.app.labels.name"),value:e.jsx("span",{className:"font-mono text-sm font-semibold text-slate-900 dark:text-slate-100",children:"cc-local-gw"})},{label:t("about.app.labels.version"),value:e.jsxs("span",{className:"font-mono text-sm font-semibold text-blue-700 dark:text-blue-200",children:["v",n]})},{label:t("about.app.labels.buildTime"),value:l.buildTime,hint:t("about.app.hint.buildTime")},{label:t("about.app.labels.node"),value:e.jsx("span",{className:"font-mono text-sm text-slate-800 dark:text-slate-200",children:l.nodeVersion})}],[n,l.buildTime,l.nodeVersion,t]),c=r.useMemo(()=>a.data?[{label:t("about.status.labels.host"),value:a.data.host??"127.0.0.1"},{label:t("about.status.labels.port"),value:a.data.port.toLocaleString()},{label:t("about.status.labels.providers"),value:a.data.providers.toLocaleString()},{label:t("about.status.labels.active"),value:(a.data.activeRequests??0).toLocaleString(),hint:t("about.status.hint.active")}]:[],[a.data,t]),x=()=>{s({title:t("about.toast.updatesPlanned"),variant:"info"})};return e.jsxs("div",{className:"space-y-8",children:[e.jsx(w,{icon:e.jsx(y,{className:"h-6 w-6","aria-hidden":"true"}),title:t("about.title"),description:t("about.description"),badge:`v${n}`,actions:e.jsx(b,{variant:"primary",icon:e.jsx(L,{className:"h-4 w-4","aria-hidden":"true"}),onClick:x,children:t("about.support.actions.checkUpdates")})}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(d,{title:t("about.app.title"),description:t("about.app.subtitle"),className:"h-full",contentClassName:"gap-4",children:e.jsx(m,{items:h})}),e.jsx(d,{title:t("about.status.title"),description:t("about.status.subtitle"),className:"h-full",contentClassName:"gap-4",actions:e.jsx(b,{variant:"subtle",size:"sm",icon:e.jsx(T,{className:"h-4 w-4","aria-hidden":"true"}),onClick:()=>a.refetch(),loading:a.isFetching,children:a.isFetching?t("common.actions.refreshing"):t("common.actions.refresh")}),children:a.isLoading?e.jsxs("div",{className:"flex h-36 flex-col items-center justify-center gap-3 text-center",children:[e.jsx("div",{className:"h-10 w-10 animate-spin rounded-full border-[3px] border-blue-500/30 border-t-blue-600 dark:border-blue-400/20 dark:border-t-blue-300"}),e.jsx("p",{className:o(i,"text-sm"),children:t("about.status.loading")})]}):c.length>0?e.jsx(m,{items:c}):e.jsxs("div",{className:"flex h-36 flex-col items-center justify-center gap-2 rounded-2xl border border-dashed border-slate-200/60 bg-white p-6 text-center shadow-inner dark:border-slate-700/60 dark:bg-slate-900/60",children:[e.jsx("p",{className:"text-sm font-semibold text-slate-700 dark:text-slate-200",children:t("about.status.empty")}),e.jsx("p",{className:o(i,"text-xs"),children:t("common.actions.refresh")})]})})]}),e.jsx(d,{title:t("about.support.title"),description:e.jsxs("span",{className:"space-y-1",children:[e.jsx("span",{className:"block text-sm font-semibold text-blue-600 dark:text-blue-300",children:t("about.support.subtitle")}),e.jsx("span",{children:t("about.support.description")})]}),className:"relative overflow-hidden",contentClassName:"gap-6",children:e.jsxs("div",{className:"flex flex-col gap-4 rounded-3xl border border-slate-200/50 bg-white p-6 shadow-lg shadow-slate-200/30 backdrop-blur-md dark:border-slate-700/50 dark:bg-slate-900/80 dark:shadow-slate-900/40",children:[e.jsxs("div",{className:"flex flex-wrap items-start gap-4",children:[e.jsx("div",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-blue-500/20 to-indigo-500/20 text-blue-600 shadow-inner dark:text-blue-200",children:e.jsx(j,{className:"h-6 w-6","aria-hidden":"true"})}),e.jsx("p",{className:o(i,"text-sm leading-6"),children:t("about.support.tip")})]}),e.jsx("code",{className:"inline-flex items-center gap-2 self-start rounded-full border border-blue-200/50 bg-blue-50/80 px-4 py-2 text-xs font-semibold tracking-wide text-blue-700 shadow-sm dark:border-blue-500/30 dark:bg-blue-900/30 dark:text-blue-200",children:"~/.cc-gw/config.json"})]})})]})}export{B as default};
@@ -1,4 +1,4 @@
1
- import{c as T,u as W,a as J,r as d,j as e,L as X,K as Y,d as t,b as K,m as r,w as m,x as Z,k as ee,l as ae,f as se,h as te}from"./index-DOE1cGyy.js";import{E as le}from"./index-Dcq4ildt.js";import{u as w}from"./useApiQuery-DFuDkJwZ.js";import{P as ie,a as q}from"./PageSection-BXgr5Sv8.js";import{F as I}from"./FormField-DTM2fGgN.js";import{I as re}from"./Input-Drhy9itS.js";import{B as C}from"./Button-CiJz5FvC.js";import{S as ne}from"./StatusBadge-84FTLpO5.js";import{C as ce}from"./copy-jyJz3iB0.js";/**
1
+ import{c as T,u as W,a as J,r as d,j as e,L as X,K as Y,d as t,b as K,m as r,w as m,x as Z,k as ee,l as ae,f as se,h as te}from"./index-ChT0XT-w.js";import{E as le}from"./index-DtOsr5xX.js";import{u as w}from"./useApiQuery-mBT5M_Q6.js";import{P as ie,a as q}from"./PageSection-eOpSKdGw.js";import{F as I}from"./FormField-DKIC96zy.js";import{I as re}from"./Input-Cr1GbVY7.js";import{B as C}from"./Button-B4UYWk6z.js";import{S as ne}from"./StatusBadge-CFXAJ2QF.js";import{C as ce}from"./copy-Br9n1n5X.js";/**
2
2
  * @license lucide-react v0.344.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{j as s,d as c,z as i,x as p,k as b}from"./index-DOE1cGyy.js";function h({variant:n="subtle",size:o="md",children:a,loading:t,icon:e,className:l,disabled:r,...u}){const x={subtle:b,primary:p,danger:i}[n],m={sm:"h-8 px-3 text-xs",md:"h-10 px-4 text-sm",lg:"h-12 px-6 text-base"}[o];return s.jsx("button",{className:c(x,m,t&&"cursor-wait opacity-70",r&&"cursor-not-allowed opacity-50",l),disabled:r||t,...u,children:t?s.jsx("div",{className:"inline-block animate-spin rounded-full h-4 w-4 border-b-2 border-current"}):e?s.jsxs(s.Fragment,{children:[e,a]}):a})}export{h as B};
1
+ import{j as s,d as c,z as i,x as p,k as b}from"./index-ChT0XT-w.js";function h({variant:n="subtle",size:o="md",children:a,loading:t,icon:e,className:l,disabled:r,...u}){const x={subtle:b,primary:p,danger:i}[n],m={sm:"h-8 px-3 text-xs",md:"h-10 px-4 text-sm",lg:"h-12 px-6 text-base"}[o];return s.jsx("button",{className:c(x,m,t&&"cursor-wait opacity-70",r&&"cursor-not-allowed opacity-50",l),disabled:r||t,...u,children:t?s.jsx("div",{className:"inline-block animate-spin rounded-full h-4 w-4 border-b-2 border-current"}):e?s.jsxs(s.Fragment,{children:[e,a]}):a})}export{h as B};
@@ -1,4 +1,4 @@
1
- import{c as R,u as I,a as Z,r as p,b as ee,t as te,j as e,L as se,B as D,d as o,m as y,g as B,e as $,f as O,h as ae,l as F,s as re,i as A,k as oe,n as P}from"./index-DOE1cGyy.js";import{E as le}from"./index-Dcq4ildt.js";import{P as ie,a as U}from"./PageSection-BXgr5Sv8.js";import{S as de}from"./Input-Drhy9itS.js";import{S as ne}from"./StatusBadge-84FTLpO5.js";import{u as T}from"./useApiQuery-DFuDkJwZ.js";/**
1
+ import{c as R,u as I,a as Z,r as p,b as ee,t as te,j as e,L as se,B as D,d as o,m as y,g as B,e as $,f as O,h as ae,l as F,s as re,i as A,k as oe,n as P}from"./index-ChT0XT-w.js";import{E as le}from"./index-DtOsr5xX.js";import{P as ie,a as U}from"./PageSection-eOpSKdGw.js";import{S as de}from"./Input-Cr1GbVY7.js";import{S as ne}from"./StatusBadge-CFXAJ2QF.js";import{u as T}from"./useApiQuery-mBT5M_Q6.js";/**
2
2
  * @license lucide-react v0.344.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{j as s,d,E as m,G as x}from"./index-DOE1cGyy.js";function i({label:a,children:l,className:t,required:r,error:e}){return s.jsxs("div",{className:d(x,t),children:[s.jsxs("label",{className:m,children:[a,r&&s.jsx("span",{className:"text-red-500 ml-1",children:"*"})]}),l,e&&s.jsx("p",{className:"text-xs text-red-600 dark:text-red-400 mt-1",children:e})]})}export{i as F};
1
+ import{j as s,d,E as m,G as x}from"./index-ChT0XT-w.js";function i({label:a,children:l,className:t,required:r,error:e}){return s.jsxs("div",{className:d(x,t),children:[s.jsxs("label",{className:m,children:[a,r&&s.jsx("span",{className:"text-red-500 ml-1",children:"*"})]}),l,e&&s.jsx("p",{className:"text-xs text-red-600 dark:text-red-400 mt-1",children:e})]})}export{i as F};
@@ -1,4 +1,4 @@
1
- import{c as u,u as p,r as b,j as e,d as x,m}from"./index-DOE1cGyy.js";import{P as g,a as o}from"./PageSection-BXgr5Sv8.js";import{I as j}from"./info-BRp6pBBe.js";/**
1
+ import{c as u,u as p,r as b,j as e,d as x,m}from"./index-ChT0XT-w.js";import{P as g,a as o}from"./PageSection-eOpSKdGw.js";import{I as j}from"./info-Cnwm2-vh.js";/**
2
2
  * @license lucide-react v0.344.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as d,j as e,d as n,C as c,A as i}from"./index-DOE1cGyy.js";const f=d.forwardRef(({options:t,placeholder:s,className:r,...l},u)=>e.jsxs("select",{ref:u,className:n(c,r),...l,children:[s&&e.jsx("option",{value:"",disabled:!0,children:s}),t.map(a=>e.jsx("option",{value:a.value,disabled:a.disabled,children:a.label},a.value))]})),j=d.forwardRef(({variant:t="default",className:s,...r},l)=>e.jsx("input",{ref:l,className:n(i,s),...r}));export{j as I,f as S};
1
+ import{r as d,j as e,d as n,C as c,A as i}from"./index-ChT0XT-w.js";const f=d.forwardRef(({options:t,placeholder:s,className:r,...l},u)=>e.jsxs("select",{ref:u,className:n(c,r),...l,children:[s&&e.jsx("option",{value:"",disabled:!0,children:s}),t.map(a=>e.jsx("option",{value:a.value,disabled:a.disabled,children:a.label},a.value))]})),j=d.forwardRef(({variant:t="default",className:s,...r},l)=>e.jsx("input",{ref:l,className:n(i,s),...r}));export{j as I,f as S};
@@ -1 +1 @@
1
- import{u as y,a5 as E,a6 as C,a7 as S,r as l,j as e,d,L as _,m as j,A as v,x as L}from"./index-DOE1cGyy.js";function F(){const{t:a}=y(),o=E(),m=C(),{authEnabled:n,isAuthenticated:x,loading:i,login:k,error:b}=S(),[r,h]=l.useState({username:"",password:""}),[f,u]=l.useState(null),[p,g]=l.useState(!1),c=l.useMemo(()=>{var t;const s=m.state;return((t=s==null?void 0:s.from)==null?void 0:t.pathname)??"/"},[m.state]);l.useEffect(()=>{if(!n&&!i){o(c,{replace:!0});return}n&&x&&!i&&o(c,{replace:!0})},[n,x,i,o,c]);const N=async s=>{if(s.preventDefault(),u(null),!r.username.trim()||!r.password){u(a("login.validation.required"));return}g(!0);try{await k(r.username.trim(),r.password),o(c,{replace:!0})}catch(t){u(t instanceof Error?t.message:a("login.validation.failed"))}finally{g(!1)}},w=s=>e.jsxs("div",{className:"relative flex min-h-screen items-center justify-center overflow-hidden bg-gradient-to-br from-slate-100 via-white to-slate-200 px-4 dark:from-slate-950/95 dark:via-slate-950 dark:to-slate-900",children:[e.jsxs("div",{className:"pointer-events-none absolute inset-0",children:[e.jsx("div",{className:"absolute left-10 top-20 h-48 w-48 rounded-full bg-slate-200/40 blur-3xl dark:bg-slate-700/30"}),e.jsx("div",{className:"absolute right-16 bottom-32 h-56 w-56 rounded-full bg-slate-300/35 blur-3xl dark:bg-slate-800/30"}),e.jsx("div",{className:"absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(15,23,42,0.08),_transparent_55%)]"})]}),e.jsx("div",{className:"relative z-10 w-full max-w-lg",children:s})]});return i?w(e.jsx("div",{className:"flex min-h-[320px] items-center justify-center rounded-3xl border border-blue-200/60 bg-white/90 shadow-2xl shadow-blue-200/50 backdrop-blur-xl dark:border-slate-800/50 dark:bg-slate-900/80 dark:shadow-slate-900/60",children:e.jsx(_,{})})):n?w(e.jsxs("main",{className:"rounded-3xl border border-slate-200/70 bg-white/95 px-8 pb-10 pt-9 shadow-2xl shadow-slate-200/40 backdrop-blur-xl dark:border-slate-800/60 dark:bg-slate-900/85 dark:shadow-slate-900/60",children:[e.jsxs("header",{className:"mb-8 flex flex-col items-center gap-3 text-center",children:[e.jsx("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl bg-gradient-to-br from-slate-900 via-slate-800 to-slate-700 text-xl font-bold text-white shadow-lg shadow-slate-400/30 dark:from-blue-500 dark:via-blue-600 dark:to-indigo-600 dark:shadow-blue-900/40",children:"GW"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("h1",{className:"text-2xl font-semibold text-slate-900 dark:text-slate-50",children:a("login.title")}),e.jsx("p",{className:d(j,"text-sm leading-relaxed max-w-[360px]"),children:a("login.description")})]})]}),e.jsxs("form",{className:"space-y-5",onSubmit:N,children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:a("login.fields.username")}),e.jsx("input",{value:r.username,autoComplete:"username",autoFocus:!0,onChange:s=>h(t=>({...t,username:s.target.value})),placeholder:a("login.fields.usernamePlaceholder"),className:d(v,"h-11 font-medium")})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:a("login.fields.password")}),e.jsx("input",{type:"password",value:r.password,autoComplete:"current-password",onChange:s=>h(t=>({...t,password:s.target.value})),placeholder:a("login.fields.passwordPlaceholder"),className:d(v,"h-11")})]}),f||b?e.jsx("div",{className:"rounded-2xl border border-red-200/70 bg-red-50/80 px-4 py-3 text-sm font-medium text-red-600 shadow-sm shadow-red-200/40 dark:border-red-500/40 dark:bg-red-500/15 dark:text-red-100",children:f||b}):null,e.jsx("button",{type:"submit",className:d(L,"w-full justify-center rounded-full py-3 text-sm font-semibold"),disabled:p,children:a(p?"common.actions.loading":"login.actions.submit")})]}),e.jsx("footer",{className:"mt-7 text-center text-xs",children:e.jsx("p",{className:d(j,"leading-relaxed"),children:a("login.hint")})})]})):null}export{F as default};
1
+ import{u as y,a5 as E,a6 as C,a7 as S,r as l,j as e,d,L as _,m as j,A as v,x as L}from"./index-ChT0XT-w.js";function F(){const{t:a}=y(),o=E(),m=C(),{authEnabled:n,isAuthenticated:x,loading:i,login:k,error:b}=S(),[r,h]=l.useState({username:"",password:""}),[f,u]=l.useState(null),[p,g]=l.useState(!1),c=l.useMemo(()=>{var t;const s=m.state;return((t=s==null?void 0:s.from)==null?void 0:t.pathname)??"/"},[m.state]);l.useEffect(()=>{if(!n&&!i){o(c,{replace:!0});return}n&&x&&!i&&o(c,{replace:!0})},[n,x,i,o,c]);const N=async s=>{if(s.preventDefault(),u(null),!r.username.trim()||!r.password){u(a("login.validation.required"));return}g(!0);try{await k(r.username.trim(),r.password),o(c,{replace:!0})}catch(t){u(t instanceof Error?t.message:a("login.validation.failed"))}finally{g(!1)}},w=s=>e.jsxs("div",{className:"relative flex min-h-screen items-center justify-center overflow-hidden bg-gradient-to-br from-slate-100 via-white to-slate-200 px-4 dark:from-slate-950/95 dark:via-slate-950 dark:to-slate-900",children:[e.jsxs("div",{className:"pointer-events-none absolute inset-0",children:[e.jsx("div",{className:"absolute left-10 top-20 h-48 w-48 rounded-full bg-slate-200/40 blur-3xl dark:bg-slate-700/30"}),e.jsx("div",{className:"absolute right-16 bottom-32 h-56 w-56 rounded-full bg-slate-300/35 blur-3xl dark:bg-slate-800/30"}),e.jsx("div",{className:"absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(15,23,42,0.08),_transparent_55%)]"})]}),e.jsx("div",{className:"relative z-10 w-full max-w-lg",children:s})]});return i?w(e.jsx("div",{className:"flex min-h-[320px] items-center justify-center rounded-3xl border border-blue-200/60 bg-white/90 shadow-2xl shadow-blue-200/50 backdrop-blur-xl dark:border-slate-800/50 dark:bg-slate-900/80 dark:shadow-slate-900/60",children:e.jsx(_,{})})):n?w(e.jsxs("main",{className:"rounded-3xl border border-slate-200/70 bg-white/95 px-8 pb-10 pt-9 shadow-2xl shadow-slate-200/40 backdrop-blur-xl dark:border-slate-800/60 dark:bg-slate-900/85 dark:shadow-slate-900/60",children:[e.jsxs("header",{className:"mb-8 flex flex-col items-center gap-3 text-center",children:[e.jsx("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl bg-gradient-to-br from-slate-900 via-slate-800 to-slate-700 text-xl font-bold text-white shadow-lg shadow-slate-400/30 dark:from-blue-500 dark:via-blue-600 dark:to-indigo-600 dark:shadow-blue-900/40",children:"GW"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("h1",{className:"text-2xl font-semibold text-slate-900 dark:text-slate-50",children:a("login.title")}),e.jsx("p",{className:d(j,"text-sm leading-relaxed max-w-[360px]"),children:a("login.description")})]})]}),e.jsxs("form",{className:"space-y-5",onSubmit:N,children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:a("login.fields.username")}),e.jsx("input",{value:r.username,autoComplete:"username",autoFocus:!0,onChange:s=>h(t=>({...t,username:s.target.value})),placeholder:a("login.fields.usernamePlaceholder"),className:d(v,"h-11 font-medium")})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:a("login.fields.password")}),e.jsx("input",{type:"password",value:r.password,autoComplete:"current-password",onChange:s=>h(t=>({...t,password:s.target.value})),placeholder:a("login.fields.passwordPlaceholder"),className:d(v,"h-11")})]}),f||b?e.jsx("div",{className:"rounded-2xl border border-red-200/70 bg-red-50/80 px-4 py-3 text-sm font-medium text-red-600 shadow-sm shadow-red-200/40 dark:border-red-500/40 dark:bg-red-500/15 dark:text-red-100",children:f||b}):null,e.jsx("button",{type:"submit",className:d(L,"w-full justify-center rounded-full py-3 text-sm font-semibold"),disabled:p,children:a(p?"common.actions.loading":"login.actions.submit")})]}),e.jsx("footer",{className:"mt-7 text-center text-xs",children:e.jsx("p",{className:d(j,"leading-relaxed"),children:a("login.hint")})})]})):null}export{F as default};
@@ -0,0 +1 @@
1
+ import{u as M,a as oe,r as i,b as be,t as je,j as e,d as y,k as te,F as ye,p as ke,o as Ne,m as A,q as ve,L as we}from"./index-ChT0XT-w.js";import{u as K}from"./useApiQuery-mBT5M_Q6.js";import{P as _e,a as se}from"./PageSection-eOpSKdGw.js";import{F as T}from"./FormField-DKIC96zy.js";import{S as I,I as W}from"./Input-Cr1GbVY7.js";import{B as $}from"./Button-B4UYWk6z.js";import{S as de}from"./StatusBadge-CFXAJ2QF.js";const ae=[20,50,100];function le(t,r=!1){if(!t)return;const n=r?`${t}T23:59:59.999`:`${t}T00:00:00.000`,b=Date.parse(n);return Number.isFinite(b)?b:void 0}function ne(t){const r=new Date(t);return`${r.getFullYear()}-${`${r.getMonth()+1}`.padStart(2,"0")}-${`${r.getDate()}`.padStart(2,"0")} ${`${r.getHours()}`.padStart(2,"0")}:${`${r.getMinutes()}`.padStart(2,"0")}:${`${r.getSeconds()}`.padStart(2,"0")}`}function _(t){return t==null?"-":t.toLocaleString()}function v(t,r){const n=_(t);return n==="-"?"-":`${n} ${r}`}function re(t){return t?"true":"false"}function ie(t,r){if(!t||t.trim().length===0)return r;try{const n=JSON.parse(t);return JSON.stringify(n,null,2)}catch{return t}}function Ke(){var Z,V;const{t}=M(),{pushToast:r}=oe(),[n,b]=i.useState("all"),[j,s]=i.useState("all"),[c,N]=i.useState(""),[u,h]=i.useState("all"),[g,a]=i.useState(""),[d,o]=i.useState(""),[x,w]=i.useState(1),[m,S]=i.useState(ae[0]),[O,L]=i.useState(null),[ce,G]=i.useState(!1),[D,Q]=i.useState([]),[q,H]=i.useState(!1);i.useEffect(()=>{w(1)},[n,j,c,u,g,d,m,D]);const R=i.useMemo(()=>{const l={limit:m,offset:(x-1)*m};n!=="all"&&(l.provider=n),j!=="all"&&(l.endpoint=j),c.trim().length>0&&(l.model=c.trim()),u!=="all"&&(l.status=u);const p=le(g),P=le(d,!0);return p!==void 0&&(l.from=p),P!==void 0&&(l.to=P),D.length>0&&(l.apiKeys=D.join(",")),l},[n,j,c,u,g,d,x,m,D]),f=K(["logs",R],{url:"/api/logs",method:"GET",params:R}),E=K(["providers","all"],{url:"/api/providers",method:"GET"}),J=K(["api-keys"],{url:"/api/keys",method:"GET"});i.useEffect(()=>{f.isError&&f.error&&r({title:t("logs.toast.listError.title"),description:t("logs.toast.listError.desc",{message:f.error.message}),variant:"error"})},[f.isError,f.error,r,t]),i.useEffect(()=>{E.isError&&E.error&&r({title:t("logs.toast.providerError.title"),description:t("logs.toast.providerError.desc",{message:E.error.message}),variant:"error"})},[E.isError,E.error,r,t]);const C=((Z=f.data)==null?void 0:Z.total)??0,k=C>0?Math.ceil(C/m):0,U=((V=f.data)==null?void 0:V.items)??[];i.useEffect(()=>{k>0&&x>k&&w(k)},[k,x]),i.useEffect(()=>{const l=document.querySelector(".table-container");l&&(l.style.overflow="hidden",setTimeout(()=>{l.style.overflow="auto"},10))},[U]);const z=E.data??[],Y=i.useMemo(()=>{const l=new Map;for(const p of z)p.id&&l.set(p.id,p.label??p.id);return l},[z]),B=J.data??[],X=i.useMemo(()=>{const l=new Map;for(const p of B)l.set(p.id,p);return l},[B]),xe=i.useMemo(()=>[{value:"all",label:t("logs.filters.statusAll")},{value:"success",label:t("logs.filters.statusSuccess")},{value:"error",label:t("logs.filters.statusError")}],[t]),me=()=>{b("all"),N(""),s("all"),h("all"),a(""),o(""),Q([])},pe=i.useCallback(async()=>{if(!q){H(!0);try{const l=C>0?Math.min(C,5e3):1e3,p={...R,limit:l,offset:0},P=await be.post("/api/logs/export",p,{responseType:"blob"}),ge=new Blob([P.data],{type:"application/zip"}),fe=new Date().toISOString().replace(/[:.]/g,"-"),ee=URL.createObjectURL(ge),F=document.createElement("a");F.href=ee,F.download=`cc-gw-logs-${fe}.zip`,document.body.appendChild(F),F.click(),F.remove(),URL.revokeObjectURL(ee),r({title:t("logs.toast.exportSuccess.title"),description:t("logs.toast.exportSuccess.desc"),variant:"success"})}catch(l){const p=je(l);r({title:t("logs.toast.exportError.title"),description:t("logs.toast.exportError.desc",{message:p.message}),variant:"error"})}finally{H(!1)}}},[q,r,R,t,C]),ue=i.useCallback(l=>{L(l),G(!0)},[]),he=i.useCallback(()=>{G(!1),L(null)},[]);return e.jsxs("div",{className:"flex flex-col gap-8",style:{width:"100%",maxWidth:"100%",overflow:"hidden"},children:[e.jsx(_e,{icon:e.jsx(ye,{className:"h-6 w-6","aria-hidden":"true"}),title:t("logs.title"),description:t("logs.description"),disableAnimation:!0,variant:"plain",className:"max-w-full",actions:e.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-sm","aria-live":"polite",children:[e.jsx($,{variant:"primary",onClick:pe,loading:q,"aria-label":t("logs.actions.export"),className:"rounded-full",children:t("logs.actions.export")}),e.jsx("span",{className:y(A,"font-medium"),children:t("logs.summary.total",{value:C.toLocaleString()})}),e.jsx("button",{type:"button",onClick:()=>f.refetch(),disabled:f.isFetching,className:y(te,"h-10 rounded-full px-4",f.isFetching?"cursor-wait opacity-70":""),children:f.isFetching?t("common.actions.refreshing"):t("logs.actions.manualRefresh")})]})}),e.jsxs(se,{title:t("logs.filtersTitle"),description:t("logs.filtersDescription"),actions:e.jsx("button",{type:"button",onClick:me,className:y(te,"h-9 rounded-full px-4"),children:t("common.actions.reset")}),disableAnimation:!0,variant:"plain",className:"max-w-full",contentClassName:"grid w-full gap-3 md:grid-cols-2 xl:grid-cols-4",children:[e.jsx(T,{label:t("logs.filters.provider"),children:e.jsx(I,{value:n,onChange:l=>b(l.target.value),options:[{value:"all",label:t("logs.filters.providerAll")},...z.map(l=>({value:l.id,label:l.label??l.id}))]})}),e.jsx(T,{label:t("logs.filters.endpoint"),children:e.jsx(I,{value:j,onChange:l=>s(l.target.value),options:[{value:"all",label:t("logs.filters.endpointAll")},{value:"anthropic",label:t("logs.filters.endpointAnthropic")},{value:"openai",label:t("logs.filters.endpointOpenAI")}]})}),e.jsx(Ce,{className:"md:col-span-2",apiKeys:B,selected:D,disabled:J.isLoading,onChange:Q}),e.jsx(T,{label:t("logs.filters.modelId"),children:e.jsx(W,{value:c,onChange:l=>N(l.target.value),placeholder:t("logs.filters.modelPlaceholder")})}),e.jsx(T,{label:t("logs.filters.status"),children:e.jsx(I,{value:u,onChange:l=>h(l.target.value),options:xe})}),e.jsx(T,{label:t("logs.filters.startDate"),children:e.jsx(W,{type:"date",value:g,onChange:l=>a(l.target.value)})}),e.jsx(T,{label:t("logs.filters.endDate"),children:e.jsx(W,{type:"date",value:d,onChange:l=>o(l.target.value)})})]}),e.jsxs(se,{disableAnimation:!0,variant:"plain",className:"p-0 max-w-full",contentClassName:"gap-0",children:[e.jsx("div",{className:"w-full rounded-lg border border-slate-200 dark:border-slate-700",children:e.jsx("div",{className:"table-container",style:{overflowX:"auto",overflowY:"hidden",width:"100%"},children:e.jsx("div",{style:{width:"1270px",minWidth:"1270px"},children:e.jsxs("table",{className:"divide-y divide-slate-200 dark:divide-slate-700",style:{width:"100%",tableLayout:"fixed"},children:[e.jsxs("colgroup",{children:[e.jsx("col",{style:{width:"140px"}}),e.jsx("col",{style:{width:"80px"}}),e.jsx("col",{style:{width:"120px"}}),e.jsx("col",{style:{width:"130px"}}),e.jsx("col",{style:{width:"130px"}}),e.jsx("col",{style:{width:"100px"}}),e.jsx("col",{style:{width:"70px"}}),e.jsx("col",{style:{width:"70px"}}),e.jsx("col",{style:{width:"70px"}}),e.jsx("col",{style:{width:"70px"}}),e.jsx("col",{style:{width:"70px"}}),e.jsx("col",{style:{width:"80px"}}),e.jsx("col",{style:{width:"90px"}}),e.jsx("col",{style:{width:"120px"}}),e.jsx("col",{style:{width:"120px"}})]}),e.jsx("caption",{className:"sr-only",children:t("logs.title")}),e.jsx("thead",{className:"bg-gradient-to-b from-slate-100 to-slate-50 dark:from-slate-800 dark:to-slate-800/60 text-left font-bold uppercase tracking-wider text-slate-600 dark:text-slate-300 border-b-2 border-slate-200 dark:border-slate-700",style:{fontSize:"10px"},children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-3 py-2 text-left font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.time")}),e.jsx("th",{className:"px-3 py-2 text-left font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.endpoint")}),e.jsx("th",{className:"px-3 py-2 text-left font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.provider")}),e.jsx("th",{className:"px-3 py-2 text-left font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.requestedModel")}),e.jsx("th",{className:"px-3 py-2 text-left font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.routedModel")}),e.jsx("th",{className:"px-3 py-2 text-left font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.apiKey")}),e.jsx("th",{className:"px-3 py-2 text-right font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.inputTokens")}),e.jsx("th",{className:"px-3 py-2 text-right font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.cachedTokens")}),e.jsx("th",{className:"px-3 py-2 text-right font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.outputTokens")}),e.jsx("th",{className:"px-3 py-2 text-right font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.latency")}),e.jsx("th",{className:"px-3 py-2 text-right font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.ttft")}),e.jsx("th",{className:"px-3 py-2 text-right font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.tpot")}),e.jsx("th",{className:"px-3 py-2 text-center font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.status")}),e.jsx("th",{className:"px-3 py-2 text-left font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.error")}),e.jsx("th",{className:"px-3 py-2 text-center font-semibold text-slate-600 dark:text-slate-200",children:t("logs.table.columns.actions")})]})}),e.jsx("tbody",{className:"divide-y divide-slate-200/80 bg-white dark:divide-slate-700/80 dark:bg-slate-900",children:f.isPending?e.jsx("tr",{children:e.jsx("td",{colSpan:15,className:"px-3 py-8 text-center text-xs text-slate-400 dark:text-slate-500",children:t("logs.table.loading")})}):U.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:15,className:"px-3 py-8 text-center text-xs text-slate-400 dark:text-slate-500",children:t("logs.table.empty")})}):U.map((l,p)=>e.jsx(Se,{record:l,providerLabelMap:Y,apiKeyMap:X,onSelect:ue,isEven:p%2===0},l.id))})]})})})}),e.jsxs("div",{className:ke,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:y(A,"whitespace-nowrap"),children:t("logs.table.pagination.perPage")}),e.jsx("select",{value:m,onChange:l=>S(Number(l.target.value)),className:Ne,children:ae.map(l=>e.jsxs("option",{value:l,children:[l," ",t("logs.table.pagination.unit")]},l))})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx($,{onClick:()=>w(l=>Math.max(l-1,1)),disabled:x<=1,size:"sm",className:"rounded-full",children:t("logs.table.pagination.previous")}),e.jsx("span",{className:y(A,"font-medium"),children:t("logs.table.pagination.pageLabel",{page:k===0?0:x,total:k})}),e.jsx($,{onClick:()=>w(l=>k===0?l:Math.min(l+1,k)),disabled:k===0||x>=k,size:"sm",className:"rounded-full",children:t("logs.table.pagination.next")})]})]})]}),e.jsx(Ee,{open:ce,logId:O,onClose:he,providerLabelMap:Y,apiKeyMap:X})]})}function Se({record:t,providerLabelMap:r,apiKeyMap:n,onSelect:b,isEven:j}){const{t:s}=M(),c=r.get(t.provider)??t.provider,N=t.endpoint||"-",u=!!t.error,h=t.status_code,g=t.client_model??s("logs.table.requestedModelFallback"),a=t.api_key_id!=null?n.get(t.api_key_id):void 0,d=t.api_key_id==null?s("logs.table.apiKeyUnknown"):a!=null&&a.isWildcard?s("apiKeys.wildcard"):a!=null&&a.name?a.name:t.api_key_name?t.api_key_name:s("logs.table.apiKeyUnknown");return e.jsxs("tr",{className:y("transition-colors duration-150",j?"bg-slate-50/30 dark:bg-slate-800/20":"bg-white dark:bg-slate-900","hover:bg-blue-50/50 dark:hover:bg-blue-900/20"),children:[e.jsx("td",{className:"px-3 py-2.5 text-xs font-medium text-slate-700 dark:text-slate-100 whitespace-nowrap",children:ne(t.timestamp)}),e.jsx("td",{className:"px-3 py-2.5 text-xs text-slate-700 dark:text-slate-100 whitespace-nowrap",children:N}),e.jsx("td",{className:"px-3 py-2.5 text-xs text-slate-700 dark:text-slate-100",children:e.jsx("div",{className:"truncate",title:c,children:c})}),e.jsx("td",{className:"px-3 py-2.5 text-xs text-slate-600 dark:text-slate-200",children:e.jsx("div",{className:"truncate",title:g,children:g})}),e.jsx("td",{className:"px-3 py-2.5 text-xs text-slate-700 dark:text-slate-100",children:e.jsx("div",{className:"truncate",title:t.model,children:t.model})}),e.jsx("td",{className:"px-3 py-2.5",children:e.jsx("div",{className:y(A,"truncate text-xs"),title:d,children:d})}),e.jsx("td",{className:"px-3 py-2.5 text-right text-xs font-medium text-slate-700 dark:text-slate-100 tabular-nums",children:_(t.input_tokens)}),e.jsx("td",{className:"px-3 py-2.5 text-right text-xs font-medium text-slate-700 dark:text-slate-100 tabular-nums",children:_(t.cached_tokens)}),e.jsx("td",{className:"px-3 py-2.5 text-right text-xs font-medium text-slate-700 dark:text-slate-100 tabular-nums",children:_(t.output_tokens)}),e.jsx("td",{className:"px-3 py-2.5 text-right text-xs text-slate-700 dark:text-slate-100 tabular-nums whitespace-nowrap",children:v(t.latency_ms,"ms")}),e.jsx("td",{className:"px-3 py-2.5 text-right text-xs text-slate-700 dark:text-slate-100 tabular-nums whitespace-nowrap",children:v(t.ttft_ms,"ms")}),e.jsx("td",{className:"px-3 py-2.5 text-right text-xs text-slate-700 dark:text-slate-100 tabular-nums whitespace-nowrap",children:v(t.tpot_ms,"ms/tk")}),e.jsx("td",{className:"px-3 py-2.5 text-center",children:e.jsx(de,{variant:u?"error":"success",children:h??(u?500:200)})}),e.jsx("td",{className:"px-3 py-2.5 text-[10px] text-slate-500 dark:text-slate-400",children:e.jsx("div",{className:"truncate",title:t.error??"",children:t.error?t.error:"-"})}),e.jsx("td",{className:"px-3 py-2.5 text-center",children:e.jsx($,{onClick:()=>b(t.id),size:"sm",className:"rounded-full text-xs px-2 py-1",children:"详情"})})]})}function Ee({open:t,logId:r,onClose:n,providerLabelMap:b,apiKeyMap:j}){var x,w;const{t:s}=M(),{pushToast:c}=oe(),N=i.useRef(null),u=i.useRef(null),h=K(["log-detail",r],{url:`/api/logs/${r}`,method:"GET"},{enabled:t&&r!==null,staleTime:3e4});i.useEffect(()=>{h.isError&&h.error&&c({title:s("logs.detail.loadError"),description:h.error.message,variant:"error"})},[h.isError,h.error,c,s]),i.useEffect(()=>{if(!t)return;const m=S=>{S.key==="Escape"&&n()};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[t,n]),i.useEffect(()=>{t&&u.current&&u.current.focus()},[t,r]);const g=i.useCallback(async(m,S,O)=>{if(!S){c({title:s("logs.detail.copy.empty",{label:m}),variant:"info"});return}try{await navigator.clipboard.writeText(S),c({title:s(O),variant:"success"})}catch(L){c({title:s("logs.detail.copy.failure"),description:L instanceof Error?L.message:s("logs.detail.copy.failureFallback"),variant:"error"})}},[c,s]);if(!t)return null;const a=h.data,d=a?b.get(a.provider)??a.provider:"",o=a&&a.api_key_id!=null?j.get(a.api_key_id):void 0;return typeof document>"u"?null:ve.createPortal(e.jsxs("div",{className:"fixed inset-0 z-50 flex",children:[e.jsx("div",{className:"flex-1 bg-slate-900/60",onClick:n,"aria-hidden":"true"}),e.jsxs("aside",{ref:N,role:"dialog","aria-modal":"true","aria-labelledby":"log-detail-title","aria-describedby":"log-detail-content",className:"flex h-full w-full max-w-xl flex-col border-l border-slate-200 bg-white shadow-xl transition-all dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("header",{className:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-800",children:[e.jsxs("div",{children:[e.jsx("h2",{id:"log-detail-title",className:"text-lg font-semibold",children:s("logs.detail.title")}),a?e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.id",{id:a.id})}):null]}),e.jsx("button",{type:"button",ref:u,onClick:n,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.close")})]}),e.jsx("div",{id:"log-detail-content",className:"flex-1 overflow-y-auto",children:h.isPending?e.jsx(we,{}):a?e.jsxs("div",{className:"flex flex-col gap-6 px-6 py-5 text-sm",children:[e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.infoSection")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-md bg-slate-100 px-3 py-2 text-xs text-slate-600 dark:bg-slate-800/60 dark:text-slate-300",children:[e.jsx("span",{className:"text-sm font-medium text-slate-700 dark:text-slate-100",children:s("logs.detail.summary.route",{from:a.client_model??s("logs.detail.info.noRequestedModel"),to:a.model})}),e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.latency",{value:v(a.latency_ms,s("common.units.ms"))})}),a.ttft_ms!==null?e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.ttft",{value:v(a.ttft_ms,s("common.units.ms"))})}):null,a.tpot_ms!==null?e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.tpot",{value:v(a.tpot_ms,s("common.units.msPerToken"))})}):null,e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.stream",{value:re(a.stream)})}),e.jsxs(de,{variant:a.error?"error":"success",children:[(a.status_code??(a.error?500:200)).toString(),e.jsx("span",{children:a.error?s("common.status.error"):s("common.status.success")})]})]}),e.jsxs("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-3",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.time")}),e.jsx("dd",{className:"font-medium",children:ne(a.timestamp)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.sessionId")}),e.jsx("dd",{className:"font-medium",children:a.session_id??"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.endpoint")}),e.jsx("dd",{className:"font-medium",children:a.endpoint||"-"}),e.jsx("dt",{className:"mt-2 text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.provider")}),e.jsx("dd",{className:"font-medium",children:d})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.requestedModel")}),e.jsx("dd",{className:"font-medium",children:a.client_model??s("logs.detail.info.noRequestedModel")})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.model")}),e.jsx("dd",{className:"font-medium",children:a.model})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.stream")}),e.jsx("dd",{className:"font-medium",children:re(a.stream)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.inputTokens")}),e.jsx("dd",{className:"font-medium",children:_(a.input_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.cachedTokens")}),e.jsx("dd",{className:"font-medium",children:_(a.cached_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.outputTokens")}),e.jsx("dd",{className:"font-medium",children:_(a.output_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.ttft")}),e.jsx("dd",{className:"font-medium",children:v(a.ttft_ms,s("common.units.ms"))})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.tpot")}),e.jsx("dd",{className:"font-medium",children:v(a.tpot_ms,s("common.units.msPerToken"))})]})]}),a.error?e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.error")}),e.jsx("p",{className:"rounded-md border border-red-200 bg-red-50 p-3 text-xs leading-5 text-red-700 dark:border-red-800/70 dark:bg-red-900/40 dark:text-red-200",children:a.error})]}):null]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.apiKey.title")}),e.jsxs("dl",{className:"grid gap-x-4 gap-y-3 text-sm sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.apiKey.name")}),e.jsx("dd",{className:"font-medium",children:a.api_key_id==null&&!a.api_key_name?s("logs.detail.apiKey.missing"):o!=null&&o.isWildcard?s("apiKeys.wildcard"):(o==null?void 0:o.name)??a.api_key_name??s("logs.detail.apiKey.missing")})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.apiKey.identifier")}),e.jsx("dd",{className:"font-medium",children:a.api_key_id??s("common.noData")})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.apiKey.masked")}),e.jsx("dd",{className:"font-medium",children:o!=null&&o.isWildcard?s("apiKeys.wildcard"):(o==null?void 0:o.maskedKey)??a.api_key_name??s("logs.detail.apiKey.maskedUnavailable")})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.apiKey.lastUsed")}),e.jsx("dd",{className:"font-medium",children:o!=null&&o.lastUsedAt?new Date(o.lastUsedAt).toLocaleString():s("common.noData")})]})]}),e.jsxs("div",{className:"rounded-md border border-slate-200 bg-slate-50 px-3 py-3 text-xs text-slate-600 dark:border-slate-800 dark:bg-slate-800/60 dark:text-slate-300",children:[e.jsx("p",{className:"font-medium text-slate-700 dark:text-slate-200",children:s("logs.detail.apiKey.rawMasked")}),e.jsx("p",{className:"mt-1 break-all text-xs font-mono",children:a.api_key_value_available?a.api_key_value_masked??s("logs.detail.apiKey.rawUnavailable"):s("logs.detail.apiKey.rawUnavailable")}),e.jsx("p",{className:"mt-2 text-[11px] leading-relaxed text-slate-500 dark:text-slate-400",children:s("logs.detail.apiKey.rawMaskedHint")})]})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsxs("header",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.payload.request")}),e.jsx("button",{type:"button",onClick:()=>{var m;return g(s("logs.detail.payload.request"),(m=a.payload)==null?void 0:m.prompt,"logs.detail.copy.requestSuccess")},className:"rounded-md border border-slate-200 px-2 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.copy")})]}),e.jsx("pre",{className:"max-h-64 overflow-auto whitespace-pre-wrap rounded-md border border-slate-200 bg-slate-50 p-3 text-xs leading-5 text-slate-700 dark:border-slate-800 dark:bg-slate-900/80 dark:text-slate-200",children:ie((x=a.payload)==null?void 0:x.prompt,s("logs.detail.payload.emptyRequest"))})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsxs("header",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.payload.response")}),e.jsx("button",{type:"button",onClick:()=>{var m;return g(s("logs.detail.payload.response"),(m=a.payload)==null?void 0:m.response,"logs.detail.copy.responseSuccess")},className:"rounded-md border border-slate-200 px-2 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.copy")})]}),e.jsx("pre",{className:"max-h-64 overflow-auto whitespace-pre-wrap rounded-md border border-slate-200 bg-slate-50 p-3 text-xs leading-5 text-slate-700 dark:border-slate-800 dark:bg-slate-900/80 dark:text-slate-200",children:ie((w=a.payload)==null?void 0:w.response,s("logs.detail.payload.emptyResponse"))})]})]}):e.jsx("div",{className:"flex h-full items-center justify.center p-8 text-sm text-slate-500 dark:text-slate-400",children:s("logs.detail.loadError")})})]})]}),document.body)}function Ce({apiKeys:t,selected:r,onChange:n,disabled:b,className:j}){const{t:s}=M(),[c,N]=i.useState(!1),u=i.useRef(null);i.useEffect(()=>{if(!c)return;const d=o=>{var x;(x=u.current)!=null&&x.contains(o.target)||N(!1)};return window.addEventListener("mousedown",d),()=>window.removeEventListener("mousedown",d)},[c]);const h=i.useMemo(()=>{if(r.length===0)return[];const d=new Map;for(const o of t)d.set(o.id,o);return r.map(o=>{const x=d.get(o);return x?x.isWildcard?s("apiKeys.wildcard"):x.name:null}).filter(o=>!!o)},[t,r,s]),g=r.length===0?s("logs.filters.apiKeyAll"):s("logs.filters.apiKeySelected",{count:r.length}),a=d=>{r.includes(d)?n(r.filter(o=>o!==d)):n([...r,d])};return e.jsxs("div",{className:y("relative flex flex-col gap-2",j),ref:u,children:[e.jsx("label",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.filters.apiKey")}),e.jsxs("button",{type:"button",onClick:()=>N(d=>!d),disabled:b||t.length===0,title:s("logs.filters.apiKeyHint"),className:y("flex h-10 w-full items-center justify-between rounded-xl border border-slate-200/70 bg-white/90 px-3 text-sm font-medium text-slate-600 shadow-sm shadow-slate-200/60 transition focus:outline-none focus:ring-2 focus:ring-blue-400/30 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700/60 dark:bg-slate-900/80 dark:text-slate-200",r.length>0?"border-blue-400 text-blue-700 dark:border-blue-400 dark:text-blue-200":"",c?"ring-2 ring-blue-400/30":""),"aria-haspopup":"listbox","aria-expanded":c,children:[e.jsxs("span",{className:"truncate",children:[g,h.length>0&&e.jsx("span",{className:"ml-1 text-xs text-slate-500 dark:text-slate-400",children:h.join(", ")})]}),e.jsx("svg",{className:y("h-4 w-4 text-slate-400 transition-all dark:text-slate-300",c?"rotate-180":""),viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",children:e.jsx("path",{fillRule:"evenodd",d:"M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.71a.75.75 0 111.06 1.06l-4.24 4.25a.75.75 0 01-1.06 0L5.21 8.29a.75.75 0 01.02-1.08z",clipRule:"evenodd"})})]}),c&&e.jsxs("div",{className:"absolute left-0 top-full z-30 mt-2 w-64 rounded-2xl border border-slate-200/70 bg-white p-2 shadow-lg shadow-slate-200/70 dark:border-slate-700/60 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex items-center justify-between rounded-xl border border-slate-200/60 bg-slate-50/70 px-3 py-2 text-xs font-medium text-slate-500 dark:border-slate-700/50 dark:bg-slate-800/60 dark:text-slate-300",children:[e.jsx("span",{children:g}),e.jsx("button",{type:"button",onClick:()=>n([]),disabled:r.length===0,className:"text-blue-600 hover:underline disabled:opacity-40 dark:text-blue-400",children:s("common.actions.reset")})]}),e.jsxs("div",{className:"max-h-56 overflow-y-auto px-1 py-2",children:[t.map(d=>{const o=d.isWildcard?s("apiKeys.wildcard"):d.name,x=r.includes(d.id);return e.jsxs("label",{className:y("flex cursor-pointer items-center gap-2 rounded-xl px-3 py-2 text-sm transition hover:bg-slate-100 dark:hover:bg-slate-800",x?"bg-blue-50/70 text-blue-600 dark:bg-blue-900/30 dark:text-blue-200":"text-slate-600 dark:text-slate-200"),children:[e.jsx("input",{type:"checkbox",className:"h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600",checked:x,onChange:()=>a(d.id)}),e.jsx("span",{className:"truncate",children:o})]},d.id)}),t.length===0&&e.jsx("p",{className:"px-2 py-2 text-xs text-slate-500 dark:text-slate-400",children:s("logs.filters.apiKeyAll")})]})]})]})}export{Ke as default};
@@ -0,0 +1 @@
1
+ import{u as ve,r as p,j as e,a as Je,v as Xe,b as V,w as Ce,i as Ze,k as O,x as te,y as De,z as pe,A as be,C as et}from"./index-ChT0XT-w.js";import{u as tt}from"./useApiQuery-mBT5M_Q6.js";function ke(){return typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():Math.random().toString(36).slice(2,10)}function Pe(){return{_key:ke(),id:"",label:""}}const he={openai:{baseUrl:"https://api.openai.com/v1"},deepseek:{baseUrl:"https://api.deepseek.com/v1"},huawei:{baseUrl:"https://api.modelarts-maas.com/v1"},kimi:{baseUrl:"https://api.moonshot.cn/v1"},anthropic:{baseUrl:"https://api.anthropic.com/v1",defaultModel:"claude-sonnet-4-5-20250929",models:[{id:"claude-sonnet-4-5-20250929",label:"Claude Sonnet 4.5 (2025-09-29)"},{id:"claude-sonnet-4-20250514",label:"Claude Sonnet 4 (2025-05-14)"},{id:"claude-opus-4-1-20250805",label:"Claude Opus 4.1 (2025-08-05)"},{id:"claude-3-5-haiku-20241022",label:"Claude 3.5 Haiku (2024-10-22)"}]},custom:{}};function Se(s){return s?{id:s.id,label:s.label??s.id,baseUrl:s.baseUrl,apiKey:s.apiKey??"",type:s.type??"custom",defaultModel:s.defaultModel??"",models:(s.models??[]).map(n=>({...n,_key:ke()})),authMode:s.authMode==="authToken"?"authToken":"apiKey"}:{id:"",label:"",baseUrl:"",apiKey:"",type:"custom",defaultModel:"",models:[Pe()],authMode:"apiKey"}}function st(s){return{_key:ke(),id:s.id,label:s.label}}function at({open:s,mode:n,provider:m,existingProviderIds:L,onClose:D,onSubmit:Y}){const{t:r}=ve(),[u,f]=p.useState(()=>Se(m)),[v,A]=p.useState({}),[_,U]=p.useState(!1),[q,B]=p.useState(null),se=p.useRef(null),I=p.useRef(null),w=p.useRef(null),[F,E]=p.useState(n==="edit");p.useEffect(()=>{s&&(f(Se(m)),A({}),B(null),U(!1),E(n==="edit"))},[s,m,n]),p.useEffect(()=>{if(!s)return;const l=c=>{c.key==="Escape"&&D()};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[s,D]),p.useEffect(()=>{if(s){if(n==="create"&&w.current){w.current.focus();return}I.current&&I.current.focus()}},[s,n]);const me=p.useMemo(()=>u.models.filter(l=>l.id.trim().length>0),[u.models]),G=l=>c=>{f(h=>({...h,[l]:c}))},J=l=>{f(c=>{const b=!F||c.label.trim().length===0||c.label===c.id?l:c.label;return{...c,id:l,label:b}})},X=l=>{f(c=>{var Z;const b=he[l??"custom"]??he.custom,k=Object.values(he).map(N=>N.baseUrl).filter(N=>!!N),M=!c.baseUrl||k.includes(c.baseUrl),S=n==="create"&&(c.models.length===0||c.models.every(N=>N.id.trim().length===0)),$={...c,type:l,authMode:l==="anthropic"?c.authMode??"apiKey":"apiKey"};return b!=null&&b.baseUrl&&M&&($.baseUrl=b.baseUrl),b!=null&&b.models&&S&&($.models=b.models.map(st),$.defaultModel=b.defaultModel??((Z=b.models[0])==null?void 0:Z.id)??""),$})},ae=(l,c)=>{f(h=>{const b=[...h.models];return b[l]={...b[l],...c},{...h,models:b}})},re=(l,c)=>{f(h=>{const b=[...h.models],k=b[l];if(!k)return h;const M=!F||!k.label||k.label===k.id,S={...k,id:c,label:M?c:k.label};b[l]=S;const $=h.defaultModel===k.id?c:h.defaultModel;return{...h,models:b,defaultModel:$}})},le=l=>{f(c=>{var k;if(c.models.length<=1)return c;const h=c.models.filter((M,S)=>S!==l);let b=c.defaultModel;return h.some(M=>M.id===b)||(b=((k=h[0])==null?void 0:k.id)??""),{...c,models:h,defaultModel:b}})},W=()=>{f(l=>({...l,models:[...l.models,Pe()]}))},Q=l=>{f(c=>({...c,authMode:l}))},oe=()=>{const l={},c=u.id.trim(),h=u.baseUrl.trim();if(n==="create"&&(c.length===0?l.id=r("providers.drawer.errors.idRequired"):L.includes(c)&&(l.id=r("providers.drawer.errors.idDuplicate"))),n==="edit"&&c.length===0&&(l.id=r("providers.drawer.errors.idRequired")),h.length===0)l.baseUrl=r("providers.drawer.errors.baseUrlInvalid");else try{new URL(h)}catch{l.baseUrl=r("providers.drawer.errors.baseUrlInvalid")}const b=new Set;return u.models.some(M=>{const S=M.id.trim();return S.length===0||b.has(S)?!0:(b.add(S),!1)})&&(l.models=r("providers.drawer.errors.modelInvalid")),u.models.length===0&&(l.models=r("providers.drawer.errors.modelsRequired")),u.defaultModel&&!u.models.some(M=>M.id===u.defaultModel)&&(l.models=r("providers.drawer.errors.defaultInvalid")),A(l),Object.keys(l).length===0},xe=()=>{const l=u.models.map(b=>{var k;return{id:b.id.trim(),label:(k=b.label)!=null&&k.trim()?b.label.trim():void 0}}),c=m!=null&&m.extraHeaders&&Object.keys(m.extraHeaders).length>0?m.extraHeaders:void 0,h=u.type==="anthropic"?u.authMode:void 0;return{id:u.id.trim(),label:u.label.trim()||u.id.trim(),baseUrl:u.baseUrl.trim(),apiKey:u.apiKey.trim()||void 0,type:u.type??"custom",defaultModel:u.defaultModel||void 0,models:l,extraHeaders:c,authMode:h}},de=async()=>{if(B(null),!!oe()){U(!0);try{const l=xe();await Y(l)}catch(l){B(r("providers.drawer.toast.saveFailure",{message:l instanceof Error?l.message:"unknown"})),U(!1);return}U(!1),D()}},ie=n==="create";return s?e.jsxs("div",{className:"fixed inset-0 z-50 flex",children:[e.jsx("div",{className:"flex-1 bg-slate-900/60",onClick:D,"aria-hidden":"true"}),e.jsxs("aside",{ref:se,role:"dialog","aria-modal":"true","aria-labelledby":"provider-drawer-title","aria-describedby":"provider-drawer-desc",className:"flex h-full w-full max-w-3xl flex-col border-l border-slate-200 bg-white shadow-xl dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("header",{className:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-800",children:[e.jsxs("div",{children:[e.jsx("h2",{id:"provider-drawer-title",className:"text-lg font-semibold",children:r(ie?"providers.drawer.createTitle":"providers.drawer.editTitle")}),e.jsx("p",{id:"provider-drawer-desc",className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.description")})]}),e.jsx("button",{type:"button",ref:I,onClick:D,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:r("common.actions.close")})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-6 py-5",children:[e.jsxs("section",{className:"space-y-4","aria-labelledby":"provider-basic-fields",children:[e.jsx("div",{id:"provider-basic-fields",className:"sr-only",children:r("providers.drawer.description")}),e.jsx("div",{className:"flex items-center justify-end",children:e.jsx("button",{type:"button",onClick:()=>E(l=>!l),className:"rounded-md border border-slate-200 px-3 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:r(F?"providers.drawer.fields.hideAdvanced":"providers.drawer.fields.showAdvanced")})}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.id")}),e.jsx("input",{value:u.id,ref:w,onChange:l=>J(l.target.value),disabled:!ie,placeholder:r("providers.drawer.fields.idPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60","aria-invalid":!!v.id}),v.id?e.jsx("span",{className:"text-xs text-red-500",children:v.id}):null]}),F?e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.label")}),e.jsx("input",{value:u.label,onChange:l=>G("label")(l.target.value),placeholder:r("providers.drawer.fields.labelPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}):null]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.baseUrl")}),e.jsx("input",{value:u.baseUrl,onChange:l=>G("baseUrl")(l.target.value),placeholder:r("providers.drawer.fields.baseUrlPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60","aria-invalid":!!v.baseUrl}),v.baseUrl?e.jsx("span",{className:"text-xs text-red-500",children:v.baseUrl}):null]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.type")}),e.jsxs("select",{value:u.type??"custom",onChange:l=>X(l.target.value),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60",children:[e.jsx("option",{value:"openai",children:"OpenAI"}),e.jsx("option",{value:"deepseek",children:"DeepSeek"}),e.jsx("option",{value:"huawei",children:"华为云"}),e.jsx("option",{value:"kimi",children:"Kimi"}),e.jsx("option",{value:"anthropic",children:"Anthropic (Claude)"}),e.jsx("option",{value:"custom",children:"Custom"})]})]})]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.apiKey")}),e.jsx("input",{value:u.apiKey,onChange:l=>G("apiKey")(l.target.value),placeholder:r("providers.drawer.fields.apiKeyPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}),u.type==="anthropic"?e.jsxs("fieldset",{className:"grid gap-2 rounded-lg border border-slate-200 p-3 text-xs dark:border-slate-700",children:[e.jsx("legend",{className:"px-1 text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.authMode")}),e.jsx("p",{className:"text-[11px] text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.authModeHint")}),e.jsxs("label",{className:"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 transition hover:bg-slate-100 dark:hover:bg-slate-800",children:[e.jsx("input",{type:"radio",name:"anthropic-auth-mode",value:"apiKey",checked:u.authMode==="apiKey",onChange:()=>Q("apiKey")}),e.jsx("span",{children:r("providers.drawer.fields.authModeApiKey")})]}),e.jsxs("label",{className:"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 transition hover:bg-slate-100 dark:hover:bg-slate-800",children:[e.jsx("input",{type:"radio",name:"anthropic-auth-mode",value:"authToken",checked:u.authMode==="authToken",onChange:()=>Q("authToken")}),e.jsx("span",{children:r("providers.drawer.fields.authModeAuthToken")})]})]}):null]}),e.jsxs("section",{className:"mt-6 space-y-3","aria-labelledby":"provider-model-fields",children:[e.jsxs("header",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{id:"provider-model-fields",className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.models")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.modelsDescription")})]}),e.jsx("button",{type:"button",onClick:W,className:"rounded-md border border-slate-200 px-3 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:r("providers.drawer.fields.addModel")})]}),v.models?e.jsx("p",{className:"text-xs text-red-500",children:v.models}):null,e.jsx("div",{className:"space-y-4",children:u.models.map((l,c)=>e.jsxs("div",{className:"rounded-lg border border-slate-200 bg-slate-50 p-4 dark:border-slate-700 dark:bg-slate-800/40",children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.modelId")}),e.jsx("input",{value:l.id,onChange:h=>re(c,h.target.value),placeholder:r("providers.drawer.fields.modelIdPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}),F?e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.fields.modelLabel")}),e.jsx("input",{value:l.label??"",onChange:h=>ae(c,{label:h.target.value}),placeholder:r("providers.drawer.fields.modelLabelPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}):null]}),e.jsxs("div",{className:"mt-3 flex flex-wrap items-center justify-between gap-3 text-xs",children:[e.jsxs("label",{className:"flex items-center gap-2 text-slate-600 dark:text-slate-300",children:[e.jsx("input",{type:"radio",name:"defaultModel",value:l.id,checked:u.defaultModel===l.id,onChange:()=>f(h=>({...h,defaultModel:l.id})),disabled:l.id.trim().length===0}),r("providers.drawer.fields.setDefault")]}),e.jsx("button",{type:"button",className:"text-red-500 transition hover:text-red-600 disabled:cursor-not-allowed disabled:opacity-40",onClick:()=>le(c),disabled:u.models.length<=1,children:r("providers.drawer.fields.removeModel")})]})]},l._key))}),me.length>1?e.jsx("div",{className:"text-xs text-slate-500 dark:text-slate-400",children:r("providers.drawer.defaultHint",{model:u.defaultModel||r("providers.card.noDefault")})}):null]})]}),e.jsxs("footer",{className:"flex items-center justify-between gap-3 border-t border-slate-200 px-6 py-4 text-sm dark:border-slate-800",children:[e.jsx("div",{className:"flex flex-col text-xs text-red-500","aria-live":"polite",children:q?e.jsx("span",{children:q}):null}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{type:"button",onClick:D,className:"rounded-md border border-slate-200 px-4 py-2 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",disabled:_,children:r("common.actions.cancel")}),e.jsx("button",{type:"button",onClick:de,className:"rounded-md bg-blue-600 px-4 py-2 text-white transition hover:bg-blue-700 disabled:opacity-60",disabled:_,children:r(_?"common.actions.saving":"common.actions.save")})]})]})]})]}):null}const rt=["claude-sonnet-4-5-20250929","claude-sonnet-4-20250514","claude-opus-4-1-20250805","claude-3-5-haiku-20241022"],lt=["gpt-4o-mini","gpt-4o","o4-mini","o4-large","gpt-5-codex"];function fe(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).slice(2,10)}function z(s){return s?Object.entries(s).map(([n,m])=>({id:fe(),source:n,target:m})):[]}function ge(s){var m,L;if(!s)return{anthropic:[],openai:[]};const n=s.endpointRouting??{};return{anthropic:z(((m=n.anthropic)==null?void 0:m.modelRoutes)??s.modelRoutes??{}),openai:z(((L=n.openai)==null?void 0:L.modelRoutes)??{})}}function ct(){const{t:s}=ve(),{pushToast:n}=Je(),m=tt(["config","full"],{url:"/api/config",method:"GET"}),L=[{key:"providers",label:s("modelManagement.tabs.providers"),description:s("modelManagement.tabs.providersDesc")},{key:"anthropic",label:s("modelManagement.tabs.anthropic"),description:s("modelManagement.tabs.anthropicDesc")},{key:"openai",label:s("modelManagement.tabs.openai"),description:s("modelManagement.tabs.openaiDesc")}],[D,Y]=p.useState("providers"),[r,u]=p.useState(null),[f,v]=p.useState(!1),[A,_]=p.useState("create"),[U,q]=p.useState(void 0),[B,se]=p.useState(null),[I,w]=p.useState({anthropic:[],openai:[]}),[F,E]=p.useState({anthropic:null,openai:null}),[me,G]=p.useState(null),[J,X]=p.useState([]),[ae,re]=p.useState(""),[le,W]=p.useState(null),[Q,oe]=p.useState(!1),[xe,de]=p.useState(null),[ie,l]=p.useState(null),[c,h]=p.useState(!1),[b,k]=p.useState(null),[M,S]=p.useState(!0),[$,Z]=p.useState({}),N=(r==null?void 0:r.providers)??[],Ee=N.length,ee=p.useMemo(()=>[{key:"anthropic-beta",value:"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14",label:s("providers.testDialog.options.beta.label"),description:s("providers.testDialog.options.beta.description")},{key:"anthropic-dangerous-direct-browser-access",value:"true",label:s("providers.testDialog.options.browser.label"),description:s("providers.testDialog.options.browser.description")},{key:"x-app",value:"cli",label:s("providers.testDialog.options.xApp.label"),description:s("providers.testDialog.options.xApp.description")},{key:"user-agent",value:"claude-cli/2.0.14 (external, cli)",label:s("providers.testDialog.options.userAgent.label"),description:s("providers.testDialog.options.userAgent.description")},{key:"accept",value:"application/json",label:s("providers.testDialog.options.accept.label"),description:s("providers.testDialog.options.accept.description")},{key:"accept-language",value:"*",label:s("providers.testDialog.options.acceptLanguage.label"),description:s("providers.testDialog.options.acceptLanguage.description")},{key:"sec-fetch-mode",value:"cors",label:s("providers.testDialog.options.secFetchMode.label"),description:s("providers.testDialog.options.secFetchMode.description")},{key:"accept-encoding",value:"gzip, deflate",label:s("providers.testDialog.options.acceptEncoding.label"),description:s("providers.testDialog.options.acceptEncoding.description")},{key:"x-stainless-helper-method",value:"stream",label:s("providers.testDialog.options.stainlessHelper.label"),description:s("providers.testDialog.options.stainlessHelper.description")},{key:"x-stainless-retry-count",value:"0",label:s("providers.testDialog.options.stainlessRetry.label"),description:s("providers.testDialog.options.stainlessRetry.description")},{key:"x-stainless-timeout",value:"600",label:s("providers.testDialog.options.stainlessTimeout.label"),description:s("providers.testDialog.options.stainlessTimeout.description")},{key:"x-stainless-lang",value:"js",label:s("providers.testDialog.options.stainlessLang.label"),description:s("providers.testDialog.options.stainlessLang.description")},{key:"x-stainless-package-version",value:"0.60.0",label:s("providers.testDialog.options.stainlessPackage.label"),description:s("providers.testDialog.options.stainlessPackage.description")},{key:"x-stainless-os",value:"MacOS",label:s("providers.testDialog.options.stainlessOs.label"),description:s("providers.testDialog.options.stainlessOs.description")},{key:"x-stainless-arch",value:"arm64",label:s("providers.testDialog.options.stainlessArch.label"),description:s("providers.testDialog.options.stainlessArch.description")},{key:"x-stainless-runtime",value:"node",label:s("providers.testDialog.options.stainlessRuntime.label"),description:s("providers.testDialog.options.stainlessRuntime.description")},{key:"x-stainless-runtime-version",value:"v22.14.0",label:s("providers.testDialog.options.stainlessRuntimeVersion.label"),description:s("providers.testDialog.options.stainlessRuntimeVersion.description")}],[s]);p.useEffect(()=>{var t;if(m.data){const a=m.data;u(a),w(ge(a)),E({anthropic:null,openai:null}),X(((t=a.routingPresets)==null?void 0:t.anthropic)??[])}},[m.data]),p.useEffect(()=>{m.isError&&m.error&&n({title:s("providers.toast.loadFailure",{message:m.error.message}),variant:"error"})},[m.isError,m.error,n,s]);const Ue=p.useMemo(()=>{const t=new Map;for(const a of N){if(!a.defaultModel||!a.models)continue;const o=a.models.find(d=>d.id===a.defaultModel);o&&t.set(a.id,Re(o))}return t},[N]),je=p.useMemo(()=>{const t=[],a=new Set;for(const d of N){const i=d.label||d.id,g=d.models??[];if(g.length>0)for(const y of g){const x=`${d.id}:${y.id}`;a.has(x)||(a.add(x),t.push({value:x,label:`${i} · ${y.label??y.id}`}))}else if(d.defaultModel){const y=`${d.id}:${d.defaultModel}`;a.has(y)||(a.add(y),t.push({value:y,label:`${i} · ${d.defaultModel}`}))}const j=`${d.id}:*`;a.has(j)||(a.add(j),t.push({value:j,label:s("settings.routing.providerPassthroughOption",{provider:i})}))}const o=[...I.anthropic,...I.openai];for(const d of o){const i=d.target.trim();i&&!a.has(i)&&(a.add(i),t.push({value:i,label:i}))}return t},[N,I,s]),ye=t=>{X(t),u(a=>a&&{...a,routingPresets:{...a.routingPresets,anthropic:t}})},H=()=>r?!0:(n({title:s("settings.toast.missingConfig"),variant:"error"}),m.refetch(),!1),Le=t=>{re(t),t.trim()&&W(null)},Ae=async()=>{if(!H())return;const t=ae.trim();if(!t){W(s("modelManagement.validation.presetName"));return}if(J.some(a=>a.name.toLowerCase()===t.toLowerCase())){W(s("modelManagement.validation.presetDuplicate",{name:t}));return}oe(!0);try{const o=(await V.post("/api/routing-presets/anthropic",{name:t})).data.presets??[];ye(o),re(""),W(null),n({title:s("modelManagement.toast.presetSaved",{name:t}),variant:"success"})}catch(a){n({title:s("modelManagement.toast.presetSaveFailure",{message:a instanceof Error?a.message:"unknown"}),variant:"error"})}finally{oe(!1),m.refetch()}},Te=async t=>{var a;if(H()){de(t.name);try{const d=(await V.post("/api/routing-presets/anthropic/apply",{name:t.name})).data.config;d?(u(d),w(ge(d)),X(((a=d.routingPresets)==null?void 0:a.anthropic)??[])):w(i=>({...i,anthropic:z(t.modelRoutes)})),n({title:s("modelManagement.toast.presetApplySuccess",{name:t.name}),variant:"success"})}catch(o){n({title:s("modelManagement.toast.presetApplyFailure",{message:o instanceof Error?o.message:"unknown"}),variant:"error"})}finally{de(null),m.refetch()}}},Oe=async t=>{if(!(!H()||!window.confirm(s("modelManagement.confirm.deletePreset",{name:t.name})))){l(t.name);try{const d=(await V.delete(`/api/routing-presets/anthropic/${encodeURIComponent(t.name)}`)).data.presets??[];ye(d),n({title:s("modelManagement.toast.presetDeleteSuccess",{name:t.name}),variant:"success"})}catch(o){n({title:s("modelManagement.toast.presetDeleteFailure",{message:o instanceof Error?o.message:"unknown"}),variant:"error"})}finally{l(null),m.refetch()}}},Ie=()=>{H()&&(_("create"),q(void 0),v(!0))},$e=t=>{H()&&(_("edit"),q(t),v(!0))},Ke=async t=>{if(!r)throw new Error(s("settings.toast.missingConfig"));const a=A==="create"?[...N,t]:N.map(i=>U&&i.id===U.id?{...t,id:U.id}:i),o={...r,providers:a};await V.put("/api/config",o),u(o),w(ge(o)),m.refetch();const d=A==="create"?s("providers.toast.createSuccess",{name:t.label||t.id}):s("providers.toast.updateSuccess",{name:t.label||t.id});n({title:d,variant:"success"})},Ne=async(t,a)=>{se(t.id);try{const o=a&&(a.headers||a.query)?{headers:a.headers&&Object.keys(a.headers).length>0?a.headers:void 0,query:a.query&&a.query.trim().length>0?a.query.trim():void 0}:void 0,d=await V.post(`/api/providers/${t.id}/test`,o);d.data.ok?n({title:s("providers.toast.testSuccess"),description:s("providers.toast.testSuccessDesc",{status:d.data.status,duration:d.data.durationMs?`${d.data.durationMs} ms`:"—"}),variant:"success"}):n({title:s("providers.toast.testFailure",{message:`${d.data.status} ${d.data.statusText}`}),variant:"error"})}catch(o){n({title:s("providers.toast.testFailure",{message:o instanceof Error?o.message:"unknown"}),variant:"error"})}finally{se(null)}},_e=t=>{if(t.type==="anthropic"){const a=t.extraHeaders??{},o=new Map(ee.map(g=>[g.key.toLowerCase(),g])),d={};let i=!0;for(const g of ee){const j=Object.entries(a).find(([y])=>y.toLowerCase()===g.key.toLowerCase());if(j){const[y,x]=j;String(x??"")===g.value||(i=!1,d[y]=String(x??""))}}for(const[g,j]of Object.entries(a))o.has(g.toLowerCase())||(d[g]=String(j??""));Z(d),S(i),k(t),h(!0);return}Ne(t)},we=()=>{h(!1),k(null),S(!0),Z({})},Be=async()=>{if(!b)return;const t={};if(M)for(const d of ee)t[d.key]=d.value;const a=new Map(ee.map(d=>[d.key.toLowerCase(),d]));for(const[d,i]of Object.entries($)){const g=d.toLowerCase();a.get(g)&&M||(t[d]=i)}const o=b;we(),await Ne(o,{headers:Object.keys(t).length>0?t:void 0,query:M?"beta=true":void 0})},Fe=async t=>{var x,R,C,K;if(!H()||!window.confirm(s("providers.confirm.delete",{name:t.label||t.id})))return;const o=N.filter(T=>T.id!==t.id),d=T=>{const P={};if(!T)return P;for(const[ce,ue]of Object.entries(T)){if(!ue)continue;const[Me]=ue.split(":");Me&&Me===t.id||ue===t.id||(P[ce]=ue)}return P},i=(r==null?void 0:r.endpointRouting)??{},g=d(((x=i.anthropic)==null?void 0:x.modelRoutes)??(r==null?void 0:r.modelRoutes)??{}),j=d(((R=i.openai)==null?void 0:R.modelRoutes)??{}),y={...r,providers:o,modelRoutes:g,endpointRouting:{anthropic:{defaults:((C=i.anthropic)==null?void 0:C.defaults)??r.defaults,modelRoutes:g},openai:{defaults:((K=i.openai)==null?void 0:K.defaults)??r.defaults,modelRoutes:j}}};try{await V.put("/api/config",y),u(y),w({anthropic:z(g),openai:z(j)}),n({title:s("providers.toast.deleteSuccess",{name:t.label||t.id}),variant:"success"}),m.refetch()}catch(T){n({title:s("providers.toast.deleteFailure",{message:T instanceof Error?T.message:"unknown"}),variant:"error"})}},He=t=>{w(a=>({...a,[t]:[...a[t],{id:fe(),source:"",target:""}]})),E(a=>({...a,[t]:null}))},Ve=(t,a)=>{w(o=>o[t].some(d=>d.source.trim()===a.trim())?o:{...o,[t]:[...o[t],{id:fe(),source:a,target:""}]}),E(o=>({...o,[t]:null}))},ne=(t,a,o,d)=>{w(i=>({...i,[t]:i[t].map(g=>g.id===a?{...g,[o]:d}:g)})),E(i=>({...i,[t]:null}))},ze=(t,a)=>{w(o=>({...o,[t]:o[t].filter(d=>d.id!==a)})),E(o=>({...o,[t]:null}))},qe=t=>{var i;if(!r)return;const a=r.endpointRouting??{},o=t==="anthropic"?r.modelRoutes??{}:{},d=((i=a[t])==null?void 0:i.modelRoutes)??o;w(g=>({...g,[t]:z(d)})),E(g=>({...g,[t]:null}))},Ge=async t=>{var d,i,g,j,y;if(!H())return;const a=I[t],o={};for(const x of a){const R=x.source.trim(),C=x.target.trim();if(!(!R&&!C)){if(!R||!C){E(K=>({...K,[t]:s("settings.validation.routePair")}));return}if(o[R]){E(K=>({...K,[t]:s("settings.validation.routeDuplicate",{model:R})}));return}o[R]=C}}E(x=>({...x,[t]:null})),G(t);try{const x=r.endpointRouting??{anthropic:{defaults:r.defaults,modelRoutes:r.modelRoutes??{}},openai:{defaults:((i=(d=r.endpointRouting)==null?void 0:d.openai)==null?void 0:i.defaults)??r.defaults,modelRoutes:((j=(g=r.endpointRouting)==null?void 0:g.openai)==null?void 0:j.modelRoutes)??{}}},R={...x,[t]:{defaults:((y=x[t])==null?void 0:y.defaults)??r.defaults,modelRoutes:o}},C={...r,endpointRouting:R,modelRoutes:t==="anthropic"?o:r.modelRoutes??{}};await V.put("/api/config",C),u(C),w(K=>({...K,[t]:z(o)})),n({title:s("modelManagement.toast.routesSaved"),variant:"success"}),m.refetch()}catch(x){n({title:s("modelManagement.toast.routesSaveFailure",{message:x instanceof Error?x.message:"unknown"}),variant:"error"})}finally{G(null)}},We=()=>e.jsxs("section",{className:Ce,children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-xl font-bold text-slate-800 dark:text-slate-100",children:s("providers.title")}),e.jsx("p",{className:"text-sm text-slate-600 dark:text-slate-400",children:s("providers.description")})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("div",{className:Ze.default,children:s("providers.count",{count:Ee})}),e.jsx("button",{type:"button",className:O,onClick:()=>m.refetch(),disabled:m.isFetching,children:m.isFetching?s("common.actions.refreshing"):s("providers.actions.refresh")}),e.jsx("button",{type:"button",className:te,onClick:Ie,children:s("providers.actions.add")})]})]}),m.isPending||!r&&m.isFetching?e.jsx("section",{className:"flex min-h-[200px] items-center justify-center rounded-3xl border border-slate-200/50 bg-gradient-to-br from-white/80 to-white/70 text-sm text-slate-600 dark:border-slate-700/50 dark:from-slate-900/80 dark:to-slate-900/70 dark:text-slate-400 backdrop-blur-lg",children:s("common.loading")}):N.length===0?e.jsx("section",{className:"rounded-3xl border border-dashed border-slate-300/60 bg-gradient-to-br from-slate-50/80 to-white/70 p-12 text-center text-sm text-slate-600 dark:border-slate-600/60 dark:from-slate-900/80 dark:to-slate-800/70 dark:text-slate-400 backdrop-blur-lg",children:e.jsxs("div",{className:"flex flex-col items-center gap-4",children:[e.jsx("div",{className:"rounded-2xl bg-slate-200/50 p-4 dark:bg-slate-700/50",children:e.jsx("svg",{className:"h-8 w-8 text-slate-400 dark:text-slate-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"})})}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-slate-700 dark:text-slate-300",children:s("providers.emptyState")}),e.jsx("p",{className:"mt-2 text-xs text-slate-500 dark:text-slate-400",children:s("providers.emptyStateSub",{default:"点击上方按钮添加您的第一个提供商"})})]})]})}):e.jsx("div",{className:"grid gap-6 md:grid-cols-2 xl:grid-cols-3",children:N.map(t=>e.jsxs("article",{className:"group flex h-full flex-col gap-5 rounded-3xl border border-slate-200/50 bg-gradient-to-br from-white/85 via-white/80 to-white/75 p-6 shadow-lg shadow-slate-200/30 backdrop-blur-md transition-all duration-300 hover:border-slate-200/70 hover:shadow-xl hover:shadow-slate-200/50 hover:-translate-y-1 dark:border-slate-700/50 dark:from-slate-900/85 dark:via-slate-900/80 dark:to-slate-900/75 dark:shadow-2xl dark:shadow-slate-900/40 dark:hover:border-slate-600/70 dark:hover:bg-slate-900/90",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-12 w-12 items-center justify-center rounded-2xl bg-gradient-to-br from-blue-500 via-blue-600 to-indigo-600 text-white shadow-lg shadow-blue-500/30",children:e.jsx("span",{className:"text-lg font-bold",children:(t.label||t.id).charAt(0).toUpperCase()})}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"text-lg font-bold text-slate-800 dark:text-slate-100",children:t.label||t.id}),t.type?e.jsx(dt,{type:t.type}):null]}),e.jsxs("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:["ID: ",t.id]})]})]}),e.jsxs("div",{className:"mt-3 space-y-1",children:[e.jsx("p",{className:"text-xs text-slate-600 dark:text-slate-400 font-medium",children:"Base URL:"}),e.jsx("p",{className:"text-xs font-mono text-slate-700 dark:text-slate-300 bg-slate-100/50 dark:bg-slate-800/50 rounded-lg px-2 py-1 break-all",children:t.baseUrl})]})]}),e.jsx("div",{className:"flex flex-col gap-2",children:t.defaultModel?e.jsx("div",{className:De.success,children:s("providers.card.defaultModel",{model:Ue.get(t.id)??t.defaultModel})}):e.jsx("div",{className:De.info,children:s("providers.card.noDefault")})})]}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h4",{className:"text-xs font-bold uppercase tracking-[0.15em] text-slate-600 dark:text-slate-300",children:s("providers.card.modelsTitle")}),t.models&&t.models.length>0?e.jsx("div",{className:"flex flex-wrap gap-2",children:t.models.map(a=>e.jsxs("div",{className:"flex items-center gap-2 rounded-xl border border-slate-200/60 bg-gradient-to-r from-slate-50/80 to-slate-100/70 px-3 py-1.5 text-xs dark:border-slate-700/60 dark:from-slate-800/60 dark:to-slate-700/50 backdrop-blur-sm transition-all duration-200 hover:border-slate-300/70 hover:bg-slate-100/80 dark:hover:border-slate-600/70 dark:hover:bg-slate-700/60",children:[e.jsx("div",{className:"h-1.5 w-1.5 rounded-full bg-blue-500"}),e.jsx("span",{className:"font-medium text-slate-700 dark:text-slate-200",children:Re(a)})]},a.id))}):e.jsx("div",{className:"rounded-xl border border-dashed border-slate-300/50 bg-slate-50/50 px-4 py-3 text-xs text-slate-500 dark:border-slate-600/50 dark:bg-slate-800/30 dark:text-slate-400",children:s("providers.card.noModels")})]}),e.jsxs("footer",{className:"mt-auto flex flex-wrap gap-3 pt-2 border-t border-slate-200/30 dark:border-slate-700/30",children:[e.jsx("button",{type:"button",className:O,onClick:()=>$e(t),children:s("providers.actions.edit")}),e.jsx("button",{type:"button",onClick:()=>_e(t),disabled:B===t.id,className:B===t.id?`${O} opacity-60 cursor-not-allowed`:O,children:B===t.id?s("common.actions.testingConnection"):s("providers.actions.test")}),e.jsx("button",{type:"button",className:pe,onClick:()=>Fe(t),children:s("providers.actions.delete")})]})]},t.id))})]}),Qe=()=>e.jsxs("div",{className:"rounded-2xl border border-dashed border-slate-300/60 bg-gradient-to-br from-slate-50/80 to-white/70 p-6 dark:border-slate-600/60 dark:from-slate-800/60 dark:to-slate-900/70 backdrop-blur-sm",children:[e.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-center md:justify-between",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h3",{className:"text-base font-bold text-slate-800 dark:text-slate-100",children:s("modelManagement.presets.title")}),e.jsx("p",{className:"text-sm text-slate-600 dark:text-slate-400",children:s("modelManagement.presets.description")})]}),e.jsxs("div",{className:"flex flex-col gap-3 md:flex-row md:items-center",children:[e.jsx("input",{type:"text",value:ae,onChange:t=>Le(t.target.value),placeholder:s("modelManagement.presets.namePlaceholder"),className:be,disabled:Q}),e.jsx("button",{type:"button",onClick:Ae,className:te,disabled:Q,children:s(Q?"modelManagement.presets.saving":"modelManagement.presets.save")})]})]}),le?e.jsx("div",{className:"rounded-xl bg-red-50/80 border border-red-200/50 p-3 text-xs text-red-700 dark:bg-red-900/40 dark:border-red-800/50 dark:text-red-300 backdrop-blur-sm",children:le}):null,J.length===0?e.jsx("div",{className:"rounded-xl border border-slate-200/40 bg-slate-50/60 p-6 text-center text-sm text-slate-600 dark:border-slate-700/40 dark:bg-slate-800/40 dark:text-slate-400 backdrop-blur-sm",children:e.jsxs("div",{className:"flex flex-col items-center gap-3",children:[e.jsx("div",{className:"rounded-xl bg-slate-200/50 p-3 dark:bg-slate-700/50",children:e.jsx("svg",{className:"h-6 w-6 text-slate-400 dark:text-slate-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})})}),e.jsx("p",{className:"font-medium text-slate-700 dark:text-slate-300",children:s("modelManagement.presets.empty")})]})}):e.jsx("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:J.map(t=>{const a=xe===t.name,o=ie===t.name;return e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-slate-200/50 bg-gradient-to-r from-white/90 to-white/80 px-4 py-3 text-sm shadow-sm backdrop-blur-sm transition-all duration-200 hover:border-slate-300/70 hover:bg-white/95 hover:shadow-md dark:border-slate-700/50 dark:from-slate-900/90 dark:to-slate-900/80 dark:hover:border-slate-600/70 dark:hover:bg-slate-900/95",children:[e.jsx("span",{className:"truncate font-medium text-slate-700 dark:text-slate-200",children:t.name}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx("button",{type:"button",onClick:()=>Te(t),className:a||o?`${O} opacity-60 cursor-not-allowed text-xs px-2 py-1`:`${te} text-xs px-2 py-1`,disabled:a||o,children:s(a?"modelManagement.presets.applying":"modelManagement.presets.apply")}),e.jsx("button",{type:"button",onClick:()=>Oe(t),className:o||a?`${O} opacity-60 cursor-not-allowed text-xs px-2 py-1`:`${pe} text-xs px-2 py-1`,disabled:o||a,children:s(o?"modelManagement.presets.deleting":"modelManagement.presets.delete")})]})]},t.name)})})]}),Ye=t=>{const a=I[t],o=F[t],d=t==="anthropic"?rt:lt,i=me===t,g=s(`modelManagement.tabs.${t}`),j=`route-source-${t}`,y=`route-target-${t}`;return e.jsxs("section",{className:Ce,children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-xl font-bold text-slate-800 dark:text-slate-100",children:s("settings.routing.titleByEndpoint",{endpoint:g})}),e.jsx("p",{className:"max-w-3xl text-sm text-slate-600 dark:text-slate-400",children:s(`settings.routing.descriptionByEndpoint.${t}`)}),e.jsx("p",{className:"max-w-3xl text-xs text-slate-500 dark:text-slate-400",children:s("settings.routing.wildcardHint")})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("button",{type:"button",onClick:()=>He(t),className:O,disabled:i,children:s("settings.routing.add")}),e.jsx("button",{type:"button",onClick:()=>qe(t),className:O,disabled:i,children:s("common.actions.reset")}),e.jsx("button",{type:"button",onClick:()=>Ge(t),className:te,disabled:i,children:s(i?"common.actions.saving":"modelManagement.actions.saveRoutes")})]})]}),t==="anthropic"?Qe():null,o?e.jsx("div",{className:"rounded-xl bg-red-50/80 border border-red-200/50 p-4 text-sm text-red-700 dark:bg-red-900/40 dark:border-red-800/50 dark:text-red-300 backdrop-blur-sm",children:o}):null,a.length===0?e.jsx("div",{className:"rounded-xl border border-dashed border-slate-300/60 bg-gradient-to-br from-slate-50/80 to-white/70 p-12 text-center text-sm text-slate-600 dark:border-slate-600/60 dark:from-slate-800/60 dark:to-slate-900/70 dark:text-slate-400 backdrop-blur-sm",children:e.jsxs("div",{className:"flex flex-col items-center gap-4",children:[e.jsx("div",{className:"rounded-2xl bg-slate-200/50 p-4 dark:bg-slate-700/50",children:e.jsx("svg",{className:"h-8 w-8 text-slate-400 dark:text-slate-500",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5,d:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7"})})}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-slate-700 dark:text-slate-300",children:s("settings.routing.empty")}),e.jsx("p",{className:"mt-2 text-xs text-slate-500 dark:text-slate-400",children:s("settings.routing.emptySub",{default:"点击上方按钮添加路由规则"})})]})]})}):e.jsx("div",{className:"space-y-4",children:a.map((x,R)=>e.jsxs("div",{className:"rounded-xl border border-slate-200/50 bg-gradient-to-r from-white/90 to-white/85 p-4 shadow-sm backdrop-blur-sm transition-all duration-200 hover:border-slate-300/70 hover:bg-white/95 hover:shadow-md dark:border-slate-700/50 dark:from-slate-900/90 dark:to-slate-900/85 dark:hover:border-slate-600/70 dark:hover:bg-slate-900/95",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx("div",{className:"flex h-8 w-8 items-center justify-center rounded-lg bg-blue-100 text-blue-600 dark:bg-blue-900/40 dark:text-blue-300",children:e.jsx("span",{className:"text-sm font-bold",children:R+1})}),e.jsx("span",{className:"text-sm font-medium text-slate-700 dark:text-slate-300",children:"路由规则"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto]",children:[e.jsx("div",{className:"space-y-2",children:e.jsxs("label",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-bold uppercase tracking-[0.15em] text-slate-600 dark:text-slate-300",children:s("settings.routing.source")}),e.jsx("input",{type:"text",value:x.source,onChange:C=>ne(t,x.id,"source",C.target.value),className:be,placeholder:"claude-3.5-sonnet",list:j,disabled:i})]})}),e.jsx("div",{className:"space-y-2",children:e.jsxs("label",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-bold uppercase tracking-[0.15em] text-slate-600 dark:text-slate-300",children:s("settings.routing.target")}),(()=>{const C=x.target.trim(),T=je.some(P=>P.value===C)?C:"__custom";return e.jsxs(e.Fragment,{children:[e.jsxs("select",{value:T,onChange:P=>{const ce=P.target.value;ce==="__custom"?ne(t,x.id,"target",C):ne(t,x.id,"target",ce)},className:et,disabled:i,children:[e.jsx("option",{value:"__custom",children:s("settings.routing.customTargetOption")}),je.map(P=>e.jsx("option",{value:P.value,children:P.label},`${y}-${P.value}`))]}),T==="__custom"&&e.jsx("input",{type:"text",value:x.target,onChange:P=>ne(t,x.id,"target",P.target.value),className:be,placeholder:"providerId:modelId",disabled:i})]})})()]})}),e.jsx("div",{className:"flex items-end",children:e.jsx("button",{type:"button",className:pe,onClick:()=>ze(t,x.id),disabled:i,children:s("settings.routing.remove")})})]})]},x.id))}),e.jsx("div",{className:"rounded-xl border border-slate-200/40 bg-gradient-to-r from-slate-50/80 to-white/70 p-4 dark:border-slate-700/40 dark:from-slate-800/60 dark:to-slate-900/70 backdrop-blur-sm",children:e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("span",{className:"text-xs font-bold uppercase tracking-[0.15em] text-slate-600 dark:text-slate-300",children:s("settings.routing.suggested")}),e.jsx("div",{className:"flex flex-wrap gap-2",children:d.map(x=>e.jsx("button",{type:"button",onClick:()=>Ve(t,x),className:O,disabled:i,children:x},`${t}-${x}`))})]})}),e.jsx("datalist",{id:j,children:d.map(x=>e.jsx("option",{value:x},`${j}-${x}`))})]})};return e.jsxs("div",{className:"flex flex-col gap-8",children:[e.jsx("div",{className:Xe,children:e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h1",{className:"text-3xl font-bold bg-gradient-to-r from-slate-900 to-slate-700 bg-clip-text text-transparent dark:from-slate-100 dark:to-slate-300",children:s("modelManagement.title")}),e.jsx("p",{className:"text-base text-slate-600 dark:text-slate-400",children:s("modelManagement.description")})]})}),e.jsx("div",{className:"flex flex-wrap gap-4",children:L.map(t=>{const a=D===t.key;return e.jsxs("button",{type:"button",onClick:()=>Y(t.key),className:`flex min-w-[240px] flex-col gap-2 rounded-2xl border px-6 py-4 text-left transition-all duration-300 hover-lift ${a?"border-blue-500/30 bg-gradient-to-r from-blue-50 to-indigo-50 text-blue-700 shadow-lg shadow-blue-200/40 ring-1 ring-blue-500/20 dark:border-blue-400/30 dark:from-blue-900/40 dark:to-indigo-900/30 dark:text-blue-100 dark:shadow-xl dark:shadow-blue-500/20 dark:ring-blue-400/20":"border-slate-200/50 bg-white/80 hover:bg-white/90 hover:shadow-md hover:shadow-slate-200/30 dark:border-slate-700/50 dark:bg-slate-900/80 dark:hover:bg-slate-900/90 dark:hover:shadow-lg dark:hover:shadow-slate-900/30"}`,children:[e.jsx("span",{className:"text-base font-bold",children:t.label}),e.jsx("span",{className:"text-sm text-slate-600 dark:text-slate-400",children:t.description})]},t.key)})}),D==="providers"?We():Ye(D),e.jsx(at,{open:f,mode:A,provider:A==="edit"?U:void 0,existingProviderIds:N.map(t=>t.id).filter(t=>A==="edit"&&U?t!==U.id:!0),onClose:()=>{v(!1),q(void 0),_("create")},onSubmit:Ke}),e.jsx(ot,{open:c,provider:b,options:ee,preservedExtras:$,usePreset:M,onPresetChange:S,onConfirm:Be,onClose:we})]})}function ot({open:s,provider:n,options:m,usePreset:L,preservedExtras:D,onPresetChange:Y,onConfirm:r,onClose:u}){const{t:f}=ve();return!s||!n?null:e.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[e.jsx("div",{className:"absolute inset-0 bg-slate-900/60 backdrop-blur-sm",onClick:u,"aria-hidden":"true"}),e.jsxs("div",{role:"dialog","aria-modal":"true","aria-labelledby":"connection-test-dialog-title",className:"relative z-10 w-full max-w-lg rounded-2xl border border-slate-200/70 bg-white/95 p-6 shadow-2xl backdrop-blur-xl animate-fade-in dark:border-slate-800/60 dark:bg-slate-900/95",children:[e.jsxs("header",{className:"mb-4 space-y-1",children:[e.jsx("h2",{id:"connection-test-dialog-title",className:"text-lg font-semibold text-slate-900 dark:text-slate-100",children:f("providers.testDialog.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:f("providers.testDialog.subtitle",{name:n.label||n.id})})]}),e.jsx("p",{className:"mb-5 text-sm leading-relaxed text-slate-600 dark:text-slate-300",children:f("providers.testDialog.description")}),e.jsx("div",{className:"space-y-3",children:e.jsxs("label",{className:"flex items-start gap-3 rounded-xl border border-slate-200 bg-white/90 p-4 shadow-sm transition hover:border-blue-200 hover:bg-blue-50/70 dark:border-slate-700 dark:bg-slate-800/70 dark:hover:border-blue-500/60 dark:hover:bg-slate-800",children:[e.jsx("input",{type:"checkbox",className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-500",checked:L,onChange:v=>Y(v.target.checked)}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-800 dark:text-slate-100",children:f("providers.testDialog.presetLabel")}),e.jsx("p",{className:"text-xs leading-relaxed text-slate-500 dark:text-slate-400",children:f("providers.testDialog.presetDescription")}),e.jsxs("details",{className:"rounded-lg bg-slate-50/60 px-3 py-2 text-xs text-slate-600 transition dark:bg-slate-800/50 dark:text-slate-300",children:[e.jsx("summary",{className:"cursor-pointer text-blue-600 hover:underline dark:text-blue-300",children:f("providers.testDialog.presetPreviewSummary")}),e.jsx("div",{className:"mt-2 grid gap-1",children:m.map(v=>e.jsxs("code",{className:"rounded bg-white/80 px-2 py-1 text-[11px] text-slate-700 shadow-sm dark:bg-slate-900/60 dark:text-slate-200",children:[v.key,": ",v.value]},v.key))})]})]})]})}),Object.keys(D).length>0?e.jsxs("div",{className:"mt-6 rounded-xl border border-slate-200 bg-slate-50/80 p-4 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-800/60 dark:text-slate-300",children:[e.jsx("p",{className:"mb-2 font-semibold text-slate-700 dark:text-slate-200",children:f("providers.testDialog.preservedInfo")}),e.jsx("div",{className:"grid gap-2",children:Object.entries(D).map(([v,A])=>e.jsxs("code",{className:"rounded bg-white/70 px-2 py-1 text-[11px] text-slate-700 shadow-sm dark:bg-slate-900/70 dark:text-slate-200",children:[v,": ",A]},v))})]}):null,e.jsxs("footer",{className:"mt-6 flex justify-end gap-3",children:[e.jsx("button",{type:"button",onClick:u,className:O,children:f("providers.testDialog.cancel")}),e.jsx("button",{type:"button",onClick:()=>{r()},className:te,children:f("providers.testDialog.primary")})]})]})]})}function Re(s){return s.label&&s.label.trim().length>0?`${s.label} (${s.id})`:s.id}function dt({type:s}){const n={openai:{label:"OpenAI",color:"bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-300"},deepseek:{label:"DeepSeek",color:"bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300"},huawei:{label:"华为云",color:"bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300"},kimi:{label:"Kimi",color:"bg-purple-100 text-purple-700 dark:bg-purple-900/40 dark:text-purple-300"},anthropic:{label:"Anthropic",color:"bg-indigo-100 text-indigo-700 dark:bg-indigo-900/40 dark:text-indigo-300"},custom:{label:"Custom",color:"bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300"}},{label:m,color:L}=n[s]||n.custom;return e.jsx("span",{className:`rounded-full ${L} px-2.5 py-1 text-xs font-semibold shadow-sm`,children:m})}export{ct as default};
@@ -1 +1 @@
1
- import{j as e,d as s,a1 as u,m,a2 as h,v as f,a3 as g,a4 as o,w as p}from"./index-DOE1cGyy.js";function j({icon:a,title:r,description:l,badge:d,actions:n,className:i,disableAnimation:t,variant:x="default"}){const c=x==="plain"?h:f;return e.jsxs("div",{className:s(c,!t&&"animate-slide-up",i),children:[e.jsxs("div",{className:"flex flex-1 flex-wrap items-start gap-6",children:[a?e.jsx("div",{className:"grid h-14 w-14 place-items-center rounded-2xl bg-gradient-to-br from-blue-600/15 to-indigo-600/10 text-blue-600 shadow-lg shadow-blue-200/30 ring-1 ring-blue-500/20 backdrop-blur-sm dark:from-blue-500/25 dark:to-indigo-500/15 dark:text-blue-200 dark:shadow-xl dark:shadow-blue-500/20 dark:ring-blue-400/20",children:a}):null,e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-4",children:[e.jsx("h1",{className:"text-3xl font-bold tracking-tight text-slate-900 dark:text-slate-50 gradient-text",children:r}),d?e.jsx("span",{className:s(u,"shadow-md"),children:d}):null]}),l?e.jsx("div",{className:s(m,"max-w-3xl text-base leading-relaxed"),children:l}):null]})]}),n?e.jsx("div",{className:"flex shrink-0 flex-wrap items-center gap-4",children:n}):null]})}function N({title:a,description:r,actions:l,className:d,contentClassName:n,children:i,disableAnimation:t,variant:x="default"}){const c=x==="plain"?o:p;return e.jsxs("section",{className:s(c,!t&&"animate-slide-up",d),children:[(a||r||l)&&e.jsxs("div",{className:"mb-6 flex flex-wrap items-center justify-between gap-6",children:[e.jsxs("div",{className:"space-y-3",children:[typeof a=="string"?e.jsx("h2",{className:s(g,"text-base font-bold"),children:a}):a,r?e.jsx("div",{className:s(m,"max-w-3xl text-sm leading-relaxed"),children:r}):null]}),l?e.jsx("div",{className:"flex shrink-0 items-center gap-3",children:l}):null]}),e.jsx("div",{className:s("flex flex-col gap-6",n),children:i})]})}export{j as P,N as a};
1
+ import{j as e,d as s,a1 as u,m,a2 as h,v as f,a3 as g,a4 as o,w as p}from"./index-ChT0XT-w.js";function j({icon:a,title:r,description:l,badge:d,actions:n,className:i,disableAnimation:t,variant:x="default"}){const c=x==="plain"?h:f;return e.jsxs("div",{className:s(c,!t&&"animate-slide-up",i),children:[e.jsxs("div",{className:"flex flex-1 flex-wrap items-start gap-6",children:[a?e.jsx("div",{className:"grid h-14 w-14 place-items-center rounded-2xl bg-gradient-to-br from-blue-600/15 to-indigo-600/10 text-blue-600 shadow-lg shadow-blue-200/30 ring-1 ring-blue-500/20 backdrop-blur-sm dark:from-blue-500/25 dark:to-indigo-500/15 dark:text-blue-200 dark:shadow-xl dark:shadow-blue-500/20 dark:ring-blue-400/20",children:a}):null,e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-4",children:[e.jsx("h1",{className:"text-3xl font-bold tracking-tight text-slate-900 dark:text-slate-50 gradient-text",children:r}),d?e.jsx("span",{className:s(u,"shadow-md"),children:d}):null]}),l?e.jsx("div",{className:s(m,"max-w-3xl text-base leading-relaxed"),children:l}):null]})]}),n?e.jsx("div",{className:"flex shrink-0 flex-wrap items-center gap-4",children:n}):null]})}function N({title:a,description:r,actions:l,className:d,contentClassName:n,children:i,disableAnimation:t,variant:x="default"}){const c=x==="plain"?o:p;return e.jsxs("section",{className:s(c,!t&&"animate-slide-up",d),children:[(a||r||l)&&e.jsxs("div",{className:"mb-6 flex flex-wrap items-center justify-between gap-6",children:[e.jsxs("div",{className:"space-y-3",children:[typeof a=="string"?e.jsx("h2",{className:s(g,"text-base font-bold"),children:a}):a,r?e.jsx("div",{className:s(m,"max-w-3xl text-sm leading-relaxed"),children:r}):null]}),l?e.jsx("div",{className:"flex shrink-0 items-center gap-3",children:l}):null]}),e.jsx("div",{className:s("flex flex-col gap-6",n),children:i})]})}export{j as P,N as a};