@chenpu17/cc-gw 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/server/dist/index.js +139 -5
- package/src/web/dist/assets/{About-CH7-GnML.js → About-DpeHLv4-.js} +2 -2
- package/src/web/dist/assets/{ApiKeys-DbxeLLKa.js → ApiKeys-CTR9Ynaf.js} +1 -1
- package/src/web/dist/assets/{Button-3qj8BOTb.js → Button-CkW8jVT-.js} +1 -1
- package/src/web/dist/assets/{Dashboard-Co1ZMGdJ.js → Dashboard-D1jcy7qj.js} +1 -1
- package/src/web/dist/assets/{FormField-DmKxUoqD.js → FormField-CsiVhN9M.js} +1 -1
- package/src/web/dist/assets/{Help-DLqRglMH.js → Help-CSSGZPF_.js} +1 -1
- package/src/web/dist/assets/{Input-AVaeYH0J.js → Input-jZIOmpmG.js} +1 -1
- package/src/web/dist/assets/{Login-CQ-q3WoP.js → Login-D577Po2d.js} +1 -1
- package/src/web/dist/assets/{Logs-C5qWLb-O.js → Logs-DNLLeIq-.js} +1 -1
- package/src/web/dist/assets/{ModelManagement-DEwX4znU.js → ModelManagement-BazsfV0F.js} +1 -1
- package/src/web/dist/assets/{PageSection-819eIHwY.js → PageSection-BbmHOMiD.js} +1 -1
- package/src/web/dist/assets/{Settings-BghgyqoT.js → Settings-Btmf5gPD.js} +1 -1
- package/src/web/dist/assets/{StatusBadge-FIJj_rsA.js → StatusBadge-DCmNAKwK.js} +1 -1
- package/src/web/dist/assets/{copy-dJsIfcXG.js → copy-D50F736h.js} +1 -1
- package/src/web/dist/assets/{index-CMmlZ8am.js → index-B-8NzzZq.js} +2 -2
- package/src/web/dist/assets/{index-D4f4GIYb.js → index-BuSvAxno.js} +1 -1
- package/src/web/dist/assets/{info-Cg4yNF4Z.js → info-B7P9oOld.js} +1 -1
- package/src/web/dist/assets/{useApiQuery-qpXuOM9g.js → useApiQuery-DZHaAgf7.js} +1 -1
- package/src/web/dist/index.html +1 -1
package/package.json
CHANGED
package/src/server/dist/index.js
CHANGED
|
@@ -17094,6 +17094,13 @@ function resolveCachedTokens3(usage) {
|
|
|
17094
17094
|
return null;
|
|
17095
17095
|
}
|
|
17096
17096
|
var roundTwoDecimals3 = (value) => Math.round(value * 100) / 100;
|
|
17097
|
+
function cloneOriginalPayload2(value) {
|
|
17098
|
+
const structuredCloneFn = globalThis.structuredClone;
|
|
17099
|
+
if (structuredCloneFn) {
|
|
17100
|
+
return structuredCloneFn(value);
|
|
17101
|
+
}
|
|
17102
|
+
return JSON.parse(JSON.stringify(value));
|
|
17103
|
+
}
|
|
17097
17104
|
function computeTpot3(totalLatencyMs, outputTokens, options) {
|
|
17098
17105
|
if (!Number.isFinite(outputTokens) || outputTokens <= 0) {
|
|
17099
17106
|
return null;
|
|
@@ -17230,7 +17237,8 @@ async function registerUnifiedHandler(app, path5, endpointId) {
|
|
|
17230
17237
|
if (endpoint.paths && Array.isArray(endpoint.paths) && endpoint.paths.length > 0) {
|
|
17231
17238
|
const matchedPath = endpoint.paths.find((p) => {
|
|
17232
17239
|
const normalizedPath = p.path.startsWith("/") ? p.path : `/${p.path}`;
|
|
17233
|
-
|
|
17240
|
+
const expandedPaths = getPathsToRegister(normalizedPath, p.protocol);
|
|
17241
|
+
return expandedPaths.includes(actualPath);
|
|
17234
17242
|
});
|
|
17235
17243
|
protocol = matchedPath?.protocol;
|
|
17236
17244
|
} else if (endpoint.protocol) {
|
|
@@ -17268,6 +17276,37 @@ async function handleAnthropicProtocol(request, reply, endpoint, endpointId, app
|
|
|
17268
17276
|
reply.code(400);
|
|
17269
17277
|
return { error: "Invalid request body" };
|
|
17270
17278
|
}
|
|
17279
|
+
const rawUrl = typeof request.raw?.url === "string" ? request.raw.url : request.url ?? "";
|
|
17280
|
+
let querySuffix = null;
|
|
17281
|
+
if (typeof rawUrl === "string") {
|
|
17282
|
+
const questionIndex = rawUrl.indexOf("?");
|
|
17283
|
+
if (questionIndex !== -1) {
|
|
17284
|
+
querySuffix = rawUrl.slice(questionIndex + 1);
|
|
17285
|
+
}
|
|
17286
|
+
}
|
|
17287
|
+
if (!querySuffix && typeof request.querystring === "string") {
|
|
17288
|
+
querySuffix = request.querystring || null;
|
|
17289
|
+
}
|
|
17290
|
+
const providerHeaders = {};
|
|
17291
|
+
const headersToForward = [
|
|
17292
|
+
"anthropic-version",
|
|
17293
|
+
"anthropic-beta",
|
|
17294
|
+
"x-stainless-arch",
|
|
17295
|
+
"x-stainless-async",
|
|
17296
|
+
"x-stainless-lang",
|
|
17297
|
+
"x-stainless-os",
|
|
17298
|
+
"x-stainless-package-version",
|
|
17299
|
+
"x-stainless-runtime",
|
|
17300
|
+
"x-stainless-runtime-version"
|
|
17301
|
+
];
|
|
17302
|
+
for (const key of headersToForward) {
|
|
17303
|
+
const value = request.headers[key];
|
|
17304
|
+
if (typeof value === "string" && value.length > 0) {
|
|
17305
|
+
providerHeaders[key] = value;
|
|
17306
|
+
} else if (Array.isArray(value) && value.length > 0 && typeof value[0] === "string") {
|
|
17307
|
+
providerHeaders[key] = value[0];
|
|
17308
|
+
}
|
|
17309
|
+
}
|
|
17271
17310
|
const providedApiKey = extractApiKeyFromRequest2(request);
|
|
17272
17311
|
let apiKeyContext;
|
|
17273
17312
|
try {
|
|
@@ -17351,9 +17390,36 @@ async function handleAnthropicProtocol(request, reply, endpoint, endpointId, app
|
|
|
17351
17390
|
const providerType = target.provider.type ?? "custom";
|
|
17352
17391
|
const connector = getConnector(target.providerId);
|
|
17353
17392
|
let providerBody;
|
|
17393
|
+
let finalHeaders = providerHeaders;
|
|
17354
17394
|
if (providerType === "anthropic") {
|
|
17355
|
-
providerBody =
|
|
17395
|
+
providerBody = cloneOriginalPayload2(payload);
|
|
17356
17396
|
providerBody.model = target.modelId;
|
|
17397
|
+
if (normalized.stream !== void 0) {
|
|
17398
|
+
providerBody.stream = normalized.stream;
|
|
17399
|
+
}
|
|
17400
|
+
const collected = {};
|
|
17401
|
+
const skip = /* @__PURE__ */ new Set(["content-length", "host", "connection", "transfer-encoding"]);
|
|
17402
|
+
const sourceHeaders = request.raw?.headers ?? request.headers;
|
|
17403
|
+
for (const [headerKey, headerValue] of Object.entries(sourceHeaders)) {
|
|
17404
|
+
const lower = headerKey.toLowerCase();
|
|
17405
|
+
if (skip.has(lower))
|
|
17406
|
+
continue;
|
|
17407
|
+
let value;
|
|
17408
|
+
if (typeof headerValue === "string") {
|
|
17409
|
+
value = headerValue;
|
|
17410
|
+
} else if (Array.isArray(headerValue)) {
|
|
17411
|
+
value = headerValue.find((item) => typeof item === "string" && item.length > 0);
|
|
17412
|
+
}
|
|
17413
|
+
if (value && value.length > 0) {
|
|
17414
|
+
collected[lower] = value;
|
|
17415
|
+
}
|
|
17416
|
+
}
|
|
17417
|
+
if (!("content-type" in collected)) {
|
|
17418
|
+
collected["content-type"] = "application/json";
|
|
17419
|
+
}
|
|
17420
|
+
if (Object.keys(collected).length > 0) {
|
|
17421
|
+
finalHeaders = collected;
|
|
17422
|
+
}
|
|
17357
17423
|
} else {
|
|
17358
17424
|
providerBody = buildProviderBody(normalized, {
|
|
17359
17425
|
maxTokens: payload.max_tokens,
|
|
@@ -17363,7 +17429,9 @@ async function handleAnthropicProtocol(request, reply, endpoint, endpointId, app
|
|
|
17363
17429
|
const upstream = await connector.send({
|
|
17364
17430
|
model: target.modelId,
|
|
17365
17431
|
body: providerBody,
|
|
17366
|
-
stream: normalized.stream
|
|
17432
|
+
stream: normalized.stream,
|
|
17433
|
+
query: querySuffix,
|
|
17434
|
+
headers: finalHeaders
|
|
17367
17435
|
});
|
|
17368
17436
|
if (upstream.status >= 400) {
|
|
17369
17437
|
reply.code(upstream.status);
|
|
@@ -17522,6 +17590,37 @@ async function handleOpenAIChatProtocol(request, reply, endpoint, endpointId, ap
|
|
|
17522
17590
|
reply.code(400);
|
|
17523
17591
|
return { error: "Invalid request body" };
|
|
17524
17592
|
}
|
|
17593
|
+
const rawUrl = typeof request.raw?.url === "string" ? request.raw.url : request.url ?? "";
|
|
17594
|
+
let querySuffix = null;
|
|
17595
|
+
if (typeof rawUrl === "string") {
|
|
17596
|
+
const questionIndex = rawUrl.indexOf("?");
|
|
17597
|
+
if (questionIndex !== -1) {
|
|
17598
|
+
querySuffix = rawUrl.slice(questionIndex + 1);
|
|
17599
|
+
}
|
|
17600
|
+
}
|
|
17601
|
+
if (!querySuffix && typeof request.querystring === "string") {
|
|
17602
|
+
querySuffix = request.querystring || null;
|
|
17603
|
+
}
|
|
17604
|
+
const providerHeaders = {};
|
|
17605
|
+
const headersToForward = [
|
|
17606
|
+
"anthropic-version",
|
|
17607
|
+
"anthropic-beta",
|
|
17608
|
+
"x-stainless-arch",
|
|
17609
|
+
"x-stainless-async",
|
|
17610
|
+
"x-stainless-lang",
|
|
17611
|
+
"x-stainless-os",
|
|
17612
|
+
"x-stainless-package-version",
|
|
17613
|
+
"x-stainless-runtime",
|
|
17614
|
+
"x-stainless-runtime-version"
|
|
17615
|
+
];
|
|
17616
|
+
for (const key of headersToForward) {
|
|
17617
|
+
const value = request.headers[key];
|
|
17618
|
+
if (typeof value === "string" && value.length > 0) {
|
|
17619
|
+
providerHeaders[key] = value;
|
|
17620
|
+
} else if (Array.isArray(value) && value.length > 0 && typeof value[0] === "string") {
|
|
17621
|
+
providerHeaders[key] = value[0];
|
|
17622
|
+
}
|
|
17623
|
+
}
|
|
17525
17624
|
const providedApiKey = extractApiKeyFromRequest2(request);
|
|
17526
17625
|
let apiKeyContext;
|
|
17527
17626
|
try {
|
|
@@ -17618,7 +17717,9 @@ async function handleOpenAIChatProtocol(request, reply, endpoint, endpointId, ap
|
|
|
17618
17717
|
const upstream = await connector.send({
|
|
17619
17718
|
model: target.modelId,
|
|
17620
17719
|
body: providerBody,
|
|
17621
|
-
stream: normalized.stream
|
|
17720
|
+
stream: normalized.stream,
|
|
17721
|
+
query: querySuffix,
|
|
17722
|
+
headers: providerHeaders
|
|
17622
17723
|
});
|
|
17623
17724
|
if (upstream.status >= 400) {
|
|
17624
17725
|
reply.code(upstream.status);
|
|
@@ -17767,6 +17868,37 @@ async function handleOpenAIResponsesProtocol(request, reply, endpoint, endpointI
|
|
|
17767
17868
|
reply.code(400);
|
|
17768
17869
|
return { error: "Invalid request body" };
|
|
17769
17870
|
}
|
|
17871
|
+
const rawUrl = typeof request.raw?.url === "string" ? request.raw.url : request.url ?? "";
|
|
17872
|
+
let querySuffix = null;
|
|
17873
|
+
if (typeof rawUrl === "string") {
|
|
17874
|
+
const questionIndex = rawUrl.indexOf("?");
|
|
17875
|
+
if (questionIndex !== -1) {
|
|
17876
|
+
querySuffix = rawUrl.slice(questionIndex + 1);
|
|
17877
|
+
}
|
|
17878
|
+
}
|
|
17879
|
+
if (!querySuffix && typeof request.querystring === "string") {
|
|
17880
|
+
querySuffix = request.querystring || null;
|
|
17881
|
+
}
|
|
17882
|
+
const providerHeaders = {};
|
|
17883
|
+
const headersToForward = [
|
|
17884
|
+
"anthropic-version",
|
|
17885
|
+
"anthropic-beta",
|
|
17886
|
+
"x-stainless-arch",
|
|
17887
|
+
"x-stainless-async",
|
|
17888
|
+
"x-stainless-lang",
|
|
17889
|
+
"x-stainless-os",
|
|
17890
|
+
"x-stainless-package-version",
|
|
17891
|
+
"x-stainless-runtime",
|
|
17892
|
+
"x-stainless-runtime-version"
|
|
17893
|
+
];
|
|
17894
|
+
for (const key of headersToForward) {
|
|
17895
|
+
const value = request.headers[key];
|
|
17896
|
+
if (typeof value === "string" && value.length > 0) {
|
|
17897
|
+
providerHeaders[key] = value;
|
|
17898
|
+
} else if (Array.isArray(value) && value.length > 0 && typeof value[0] === "string") {
|
|
17899
|
+
providerHeaders[key] = value[0];
|
|
17900
|
+
}
|
|
17901
|
+
}
|
|
17770
17902
|
const providedApiKey = extractApiKeyFromRequest2(request);
|
|
17771
17903
|
let apiKeyContext;
|
|
17772
17904
|
try {
|
|
@@ -17863,7 +17995,9 @@ async function handleOpenAIResponsesProtocol(request, reply, endpoint, endpointI
|
|
|
17863
17995
|
const upstream = await connector.send({
|
|
17864
17996
|
model: target.modelId,
|
|
17865
17997
|
body: providerBody,
|
|
17866
|
-
stream: normalized.stream
|
|
17998
|
+
stream: normalized.stream,
|
|
17999
|
+
query: querySuffix,
|
|
18000
|
+
headers: providerHeaders
|
|
17867
18001
|
});
|
|
17868
18002
|
if (upstream.status >= 400) {
|
|
17869
18003
|
reply.code(upstream.status);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as p,u as v,a as k,r,j as e,d as o,U as j,m as i}from"./index-
|
|
1
|
+
import{c as p,u as v,a as k,r,j as e,d as o,U as j,m as i}from"./index-B-8NzzZq.js";import{u as N}from"./useApiQuery-DZHaAgf7.js";import{P as w,a as d}from"./PageSection-BbmHOMiD.js";import"./Input-jZIOmpmG.js";import{B as b}from"./Button-CkW8jVT-.js";import{I as y}from"./info-B7P9oOld.js";/**
|
|
2
2
|
* @license lucide-react v0.344.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -8,4 +8,4 @@ import{c as p,u as v,a as k,r,j as e,d as o,U as j,m as i}from"./index-CMmlZ8am.
|
|
|
8
8
|
*
|
|
9
9
|
* This source code is licensed under the ISC license.
|
|
10
10
|
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const E=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"}]]),I="0.4.
|
|
11
|
+
*/const E=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"}]]),I="0.4.1",_={version:I},L={VITE_BUILD_TIME:"2025-10-29T01:35:31.647Z",VITE_NODE_VERSION:"v22.14.0"};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 P(){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=_.version,l=r.useMemo(()=>{const u=L,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-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(E,{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{P 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,N as Y,d as t,b as K,m as r,H as m,E as Z,k as ee,l as ae,f as se,h as te}from"./index-
|
|
1
|
+
import{c as T,u as W,a as J,r as d,j as e,L as X,N as Y,d as t,b as K,m as r,H as m,E as Z,k as ee,l as ae,f as se,h as te}from"./index-B-8NzzZq.js";import{E as le}from"./index-BuSvAxno.js";import{u as w}from"./useApiQuery-DZHaAgf7.js";import{P as ie,a as q}from"./PageSection-BbmHOMiD.js";import{F as I}from"./FormField-CsiVhN9M.js";import{I as re}from"./Input-jZIOmpmG.js";import{B as C}from"./Button-CkW8jVT-.js";import{S as ne}from"./StatusBadge-DCmNAKwK.js";import{C as ce}from"./copy-D50F736h.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,J as i,E as p,k as b}from"./index-
|
|
1
|
+
import{j as s,d as c,J as i,E as p,k as b}from"./index-B-8NzzZq.js";function h({variant:n="subtle",size:o="md",children:a,loading:t,icon:e,className:l,disabled:r,...u}){const m={subtle:b,primary:p,danger:i}[n],x={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(m,x,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-
|
|
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-B-8NzzZq.js";import{E as le}from"./index-BuSvAxno.js";import{P as ie,a as U}from"./PageSection-BbmHOMiD.js";import{S as de}from"./Input-jZIOmpmG.js";import{S as ne}from"./StatusBadge-DCmNAKwK.js";import{u as T}from"./useApiQuery-DZHaAgf7.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,P as m,Q as x}from"./index-
|
|
1
|
+
import{j as s,d,P as m,Q as x}from"./index-B-8NzzZq.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-
|
|
1
|
+
import{c as u,u as p,r as b,j as e,d as x,m}from"./index-B-8NzzZq.js";import{P as g,a as o}from"./PageSection-BbmHOMiD.js";import{I as j}from"./info-B7P9oOld.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,M as c,K as i}from"./index-
|
|
1
|
+
import{r as d,j as e,d as n,M as c,K as i}from"./index-B-8NzzZq.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,a8 as E,a9 as C,aa as S,r as l,j as e,d,L as _,m as j,K as v,E as L}from"./index-
|
|
1
|
+
import{u as y,a8 as E,a9 as C,aa as S,r as l,j as e,d,L as _,m as j,K as v,E as L}from"./index-B-8NzzZq.js";function P(){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{P as default};
|
|
@@ -1 +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-CMmlZ8am.js";import{u as K}from"./useApiQuery-qpXuOM9g.js";import{P as _e,a as se}from"./PageSection-819eIHwY.js";import{F as T}from"./FormField-DmKxUoqD.js";import{S as I,I as W}from"./Input-AVaeYH0J.js";import{B as $}from"./Button-3qj8BOTb.js";import{S as de}from"./StatusBadge-FIJj_rsA.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};
|
|
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-B-8NzzZq.js";import{u as K}from"./useApiQuery-DZHaAgf7.js";import{P as _e,a as se}from"./PageSection-BbmHOMiD.js";import{F as T}from"./FormField-CsiVhN9M.js";import{S as I,I as W}from"./Input-jZIOmpmG.js";import{B as $}from"./Button-CkW8jVT-.js";import{S as de}from"./StatusBadge-DCmNAKwK.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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var We=s=>{throw TypeError(s)};var Ue=(s,a,u)=>a.has(s)||We("Cannot "+u);var E=(s,a,u)=>(Ue(s,a,"read from private field"),u?u.call(s):a.get(s)),le=(s,a,u)=>a.has(s)?We("Cannot add the same private member more than once"):a instanceof WeakSet?a.add(s):a.set(s,u),oe=(s,a,u,x)=>(Ue(s,a,"write to private field"),x?x.call(s,u):a.set(s,u),u),de=(s,a,u)=>(Ue(s,a,"access private method"),u);import{S as St,v as Rt,w as Je,x as Pt,y as at,z as rt,r as g,A as Dt,C as Ot,u as Se,j as e,a as lt,D as Ut,E as re,b as ae,G as fe,t as Ae,H as Ye,i as Lt,k as _,I as Xe,J as Le,K as ne,M as ot}from"./index-CMmlZ8am.js";import{u as Tt,a as $t}from"./useApiQuery-qpXuOM9g.js";var W,Z,$,J,Y,Ee,Ie,st,At=(st=class extends St{constructor(a,u){super();le(this,Y);le(this,W);le(this,Z);le(this,$);le(this,J);oe(this,W,a),this.setOptions(u),this.bindMethods(),de(this,Y,Ee).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(a){var x;const u=this.options;this.options=E(this,W).defaultMutationOptions(a),Rt(this.options,u)||E(this,W).getMutationCache().notify({type:"observerOptionsUpdated",mutation:E(this,$),observer:this}),u!=null&&u.mutationKey&&this.options.mutationKey&&Je(u.mutationKey)!==Je(this.options.mutationKey)?this.reset():((x=E(this,$))==null?void 0:x.state.status)==="pending"&&E(this,$).setOptions(this.options)}onUnsubscribe(){var a;this.hasListeners()||(a=E(this,$))==null||a.removeObserver(this)}onMutationUpdate(a){de(this,Y,Ee).call(this),de(this,Y,Ie).call(this,a)}getCurrentResult(){return E(this,Z)}reset(){var a;(a=E(this,$))==null||a.removeObserver(this),oe(this,$,void 0),de(this,Y,Ee).call(this),de(this,Y,Ie).call(this)}mutate(a,u){var x;return oe(this,J,u),(x=E(this,$))==null||x.removeObserver(this),oe(this,$,E(this,W).getMutationCache().build(E(this,W),this.options)),E(this,$).addObserver(this),E(this,$).execute(a)}},W=new WeakMap,Z=new WeakMap,$=new WeakMap,J=new WeakMap,Y=new WeakSet,Ee=function(){var u;const a=((u=E(this,$))==null?void 0:u.state)??Pt();oe(this,Z,{...a,isPending:a.status==="pending",isSuccess:a.status==="success",isError:a.status==="error",isIdle:a.status==="idle",mutate:this.mutate,reset:this.reset})},Ie=function(a){at.batch(()=>{var u,x,h,y,d,m,N,p;if(E(this,J)&&this.hasListeners()){const R=E(this,Z).variables,I=E(this,Z).context,O={client:E(this,W),meta:this.options.meta,mutationKey:this.options.mutationKey};(a==null?void 0:a.type)==="success"?((x=(u=E(this,J)).onSuccess)==null||x.call(u,a.data,R,I,O),(y=(h=E(this,J)).onSettled)==null||y.call(h,a.data,null,R,I,O)):(a==null?void 0:a.type)==="error"&&((m=(d=E(this,J)).onError)==null||m.call(d,a.error,R,I,O),(p=(N=E(this,J)).onSettled)==null||p.call(N,void 0,a.error,R,I,O))}this.listeners.forEach(R=>{R(E(this,Z))})})},st);function Ze(s,a){const u=rt(),[x]=g.useState(()=>new At(u,s));g.useEffect(()=>{x.setOptions(s)},[x,s]);const h=g.useSyncExternalStore(g.useCallback(d=>x.subscribe(at.batchCalls(d)),[x]),()=>x.getCurrentResult(),()=>x.getCurrentResult()),y=g.useCallback((d,m)=>{x.mutate(d,m).catch(Dt)},[x]);if(h.error&&Ot(x.options.throwOnError,[h.error]))throw h.error;return{...h,mutate:y,mutateAsync:h.mutate}}function Be(){return typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():Math.random().toString(36).slice(2,10)}function It(){return{_key:Be(),id:"",label:""}}const Te={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"},custom:{}};function et(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(a=>({...a,_key:Be()})),authMode:s.authMode==="authToken"?"authToken":"apiKey"}:{id:"",label:"",baseUrl:"",apiKey:"",type:"custom",defaultModel:"",models:[],authMode:"apiKey"}}function Kt(s){return{_key:Be(),id:s.id,label:s.label}}function Bt({open:s,mode:a,provider:u,existingProviderIds:x,onClose:h,onSubmit:y}){const{t:d}=Se(),[m,N]=g.useState(()=>et(u)),[p,R]=g.useState({}),[I,O]=g.useState(!1),[K,B]=g.useState(null),k=g.useRef(null),C=g.useRef(null),P=g.useRef(null),[U,ve]=g.useState(a==="edit");g.useEffect(()=>{s&&(N(et(u)),R({}),B(null),O(!1),ve(a==="edit"))},[s,u,a]),g.useEffect(()=>{if(!s)return;const i=f=>{f.key==="Escape"&&h()};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[s,h]),g.useEffect(()=>{if(s){if(a==="create"&&P.current){P.current.focus();return}C.current&&C.current.focus()}},[s,a]);const ke=g.useMemo(()=>m.models.filter(i=>i.id.trim().length>0),[m.models]),ie=i=>f=>{N(w=>({...w,[i]:f}))},je=i=>{N(f=>{const v=!U||f.label.trim().length===0||f.label===f.id?i:f.label;return{...f,id:i,label:v}})},ee=i=>{N(f=>{var we;const v=Te[i??"custom"]??Te.custom,S=Object.values(Te).map(X=>X.baseUrl).filter(X=>!!X),q=!f.baseUrl||S.includes(f.baseUrl),T=a==="create"&&(f.models.length===0||f.models.every(X=>X.id.trim().length===0)),V={...f,type:i,authMode:i==="anthropic"?f.authMode??"apiKey":"apiKey"};return v!=null&&v.baseUrl&&q&&(V.baseUrl=v.baseUrl),v!=null&&v.models&&T&&(V.models=v.models.map(Kt),V.defaultModel=v.defaultModel??((we=v.models[0])==null?void 0:we.id)??""),V})},L=(i,f)=>{N(w=>{const v=[...w.models];return v[i]={...v[i],...f},{...w,models:v}})},Re=(i,f)=>{N(w=>{const v=[...w.models],S=v[i];if(!S)return w;const q=!U||!S.label||S.label===S.id,T={...S,id:f,label:q?f:S.label};v[i]=T;const V=w.defaultModel===S.id?f:w.defaultModel;return{...w,models:v,defaultModel:V}})},F=i=>{N(f=>{if(i<0||i>=f.models.length)return f;const w=f.models.filter((S,q)=>q!==i);let v=f.defaultModel;return w.some(S=>S.id===v)||(v=""),{...f,models:w,defaultModel:v}})},Pe=()=>{N(i=>({...i,models:[...i.models,It()]}))},ce=i=>{N(f=>({...f,authMode:i}))},ye=()=>{const i={},f=m.id.trim(),w=m.baseUrl.trim();if(a==="create"&&(f.length===0?i.id=d("providers.drawer.errors.idRequired"):x.includes(f)&&(i.id=d("providers.drawer.errors.idDuplicate"))),a==="edit"&&f.length===0&&(i.id=d("providers.drawer.errors.idRequired")),w.length===0)i.baseUrl=d("providers.drawer.errors.baseUrlInvalid");else try{new URL(w)}catch{i.baseUrl=d("providers.drawer.errors.baseUrlInvalid")}if(m.models.length>0){const v=new Set;m.models.some(q=>{const T=q.id.trim();return T.length===0||v.has(T)?!0:(v.add(T),!1)})&&(i.models=d("providers.drawer.errors.modelInvalid"))}return m.defaultModel&&!m.models.some(v=>v.id===m.defaultModel)&&(i.models=d("providers.drawer.errors.defaultInvalid")),R(i),Object.keys(i).length===0},ue=()=>{const i=m.models.map(v=>{var S;return{id:v.id.trim(),label:(S=v.label)!=null&&S.trim()?v.label.trim():void 0}}).filter(v=>v.id.length>0),f=u!=null&&u.extraHeaders&&Object.keys(u.extraHeaders).length>0?u.extraHeaders:void 0,w=m.type==="anthropic"?m.authMode:void 0;return{id:m.id.trim(),label:m.label.trim()||m.id.trim(),baseUrl:m.baseUrl.trim(),apiKey:m.apiKey.trim()||void 0,type:m.type??"custom",defaultModel:m.defaultModel||void 0,models:i.length>0?i:void 0,extraHeaders:f,authMode:w}},Ne=async()=>{if(B(null),!!ye()){O(!0);try{const i=ue();await y(i)}catch(i){B(d("providers.drawer.toast.saveFailure",{message:i instanceof Error?i.message:"unknown"})),O(!1);return}O(!1),h()}},me=a==="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:h,"aria-hidden":"true"}),e.jsxs("aside",{ref:k,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:d(me?"providers.drawer.createTitle":"providers.drawer.editTitle")}),e.jsx("p",{id:"provider-drawer-desc",className:"text-xs text-slate-500 dark:text-slate-400",children:d("providers.drawer.description")})]}),e.jsx("button",{type:"button",ref:C,onClick:h,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:d("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:d("providers.drawer.description")}),e.jsx("div",{className:"flex items-center justify-end",children:e.jsx("button",{type:"button",onClick:()=>ve(i=>!i),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:d(U?"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:d("providers.drawer.fields.id")}),e.jsx("input",{value:m.id,ref:P,onChange:i=>je(i.target.value),disabled:!me,placeholder:d("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":!!p.id}),p.id?e.jsx("span",{className:"text-xs text-red-500",children:p.id}):null]}),U?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:d("providers.drawer.fields.label")}),e.jsx("input",{value:m.label,onChange:i=>ie("label")(i.target.value),placeholder:d("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:d("providers.drawer.fields.baseUrl")}),e.jsx("input",{value:m.baseUrl,onChange:i=>ie("baseUrl")(i.target.value),placeholder:d("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":!!p.baseUrl}),p.baseUrl?e.jsx("span",{className:"text-xs text-red-500",children:p.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:d("providers.drawer.fields.type")}),e.jsxs("select",{value:m.type??"custom",onChange:i=>ee(i.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:d("providers.drawer.fields.apiKey")}),e.jsx("input",{value:m.apiKey,onChange:i=>ie("apiKey")(i.target.value),placeholder:d("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"})]}),m.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:d("providers.drawer.fields.authMode")}),e.jsx("p",{className:"text-[11px] text-slate-500 dark:text-slate-400",children:d("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:m.authMode==="apiKey",onChange:()=>ce("apiKey")}),e.jsx("span",{children:d("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:m.authMode==="authToken",onChange:()=>ce("authToken")}),e.jsx("span",{children:d("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:d("providers.drawer.fields.models")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:d("providers.drawer.modelsDescription")})]}),e.jsx("button",{type:"button",onClick:Pe,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:d("providers.drawer.fields.addModel")})]}),p.models?e.jsx("p",{className:"text-xs text-red-500",children:p.models}):null,e.jsxs("div",{className:"space-y-4",children:[m.models.map((i,f)=>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:d("providers.drawer.fields.modelId")}),e.jsx("input",{value:i.id,onChange:w=>Re(f,w.target.value),placeholder:d("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"})]}),U?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:d("providers.drawer.fields.modelLabel")}),e.jsx("input",{value:i.label??"",onChange:w=>L(f,{label:w.target.value}),placeholder:d("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:i.id,checked:m.defaultModel===i.id,onChange:()=>N(w=>({...w,defaultModel:i.id})),disabled:i.id.trim().length===0}),d("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:()=>F(f),disabled:m.models.length===0,children:d("providers.drawer.fields.removeModel")})]})]},i._key)),m.models.length===0?e.jsx("div",{className:"rounded-xl border-2 border-amber-300 bg-gradient-to-br from-amber-50 to-yellow-50 p-5 shadow-md dark:border-amber-600/60 dark:from-amber-900/20 dark:to-yellow-900/20",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"flex-shrink-0 text-2xl",children:"💡"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("p",{className:"text-sm font-semibold text-amber-900 dark:text-amber-200",children:d("providers.drawer.noModelsTitle")}),e.jsx("p",{className:"text-xs leading-relaxed text-amber-800 dark:text-amber-300",children:d("providers.drawer.noModelsHint",{providerId:m.id||"provider-id"})}),e.jsxs("div",{className:"rounded-md bg-amber-100/80 p-2.5 dark:bg-amber-800/40",children:[e.jsx("p",{className:"mb-1.5 text-xs font-medium text-amber-900 dark:text-amber-200",children:d("providers.drawer.routeExample")}),e.jsxs("code",{className:"block rounded bg-white px-2.5 py-1.5 font-mono text-xs text-amber-900 shadow-sm dark:bg-slate-900 dark:text-amber-100",children:['"claude-*": "',(m.id||"provider-id").trim()||"provider-id",':*"']})]})]})]})}):null]}),ke.length>1?e.jsx("div",{className:"text-xs text-slate-500 dark:text-slate-400",children:d("providers.drawer.defaultHint",{model:m.defaultModel||d("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:K?e.jsx("span",{children:K}):null}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{type:"button",onClick:h,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:I,children:d("common.actions.cancel")}),e.jsx("button",{type:"button",onClick:Ne,className:"rounded-md bg-blue-600 px-4 py-2 text-white transition hover:bg-blue-700 disabled:opacity-60",disabled:I,children:d(I?"common.actions.saving":"common.actions.save")})]})]})]})]}):null}const Ft=["claude-sonnet-4-5-20250929","claude-sonnet-4-5-20250929-thinking","claude-sonnet-4-20250514","claude-opus-4-1-20250805","claude-opus-4-1-20250805-thinking","claude-haiku-4-5-20251001","claude-haiku-4-5-20251001-thinking","claude-3-5-haiku-20241022"],Ht=["gpt-4o-mini","gpt-4o","o4-mini","o4-large","gpt-5-codex"];function Ke(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).slice(2,10)}function G(s){return s?Object.entries(s).map(([a,u])=>({id:Ke(),source:a,target:u})):[]}function $e(s,a){var h,y,d;if(!s)return{};const u={},x=s.endpointRouting??{};u.anthropic=G(((h=x.anthropic)==null?void 0:h.modelRoutes)??s.modelRoutes??{}),u.openai=G(((y=x.openai)==null?void 0:y.modelRoutes)??{});for(const m of a)(d=m.routing)!=null&&d.modelRoutes?u[m.id]=G(m.routing.modelRoutes):u[m.id]=[];return u}function Wt(){const{t:s}=Se(),{pushToast:a}=lt(),u=rt(),x=Tt(["config","full"],{url:"/api/config",method:"GET"}),{data:h}=$t({queryKey:["custom-endpoints"],queryFn:fe.list,refetchInterval:1e4}),y=(h==null?void 0:h.endpoints)??[],d=g.useMemo(()=>{const t=[{key:"providers",label:s("modelManagement.tabs.providers"),description:s("modelManagement.tabs.providersDesc"),isSystem:!0,canDelete:!1},{key:"anthropic",label:s("modelManagement.tabs.anthropic"),description:s("modelManagement.tabs.anthropicDesc"),isSystem:!0,canDelete:!1,protocols:["anthropic"]},{key:"openai",label:s("modelManagement.tabs.openai"),description:s("modelManagement.tabs.openaiDesc"),isSystem:!0,canDelete:!1,protocols:["openai-auto","openai-chat","openai-responses"]}],l=y.map(r=>{let o,n=[];if(r.paths&&r.paths.length>0){const c=r.paths.map(b=>`${b.path} (${b.protocol})`).join(", ");o=`${s("modelManagement.tabs.customEndpoint")}: ${c}`,n=[...new Set(r.paths.map(b=>b.protocol))]}else if(r.path){const c=r.protocol||"anthropic";o=`${s("modelManagement.tabs.customEndpoint")}: ${r.path} (${c})`,n=[c]}else o=s("modelManagement.tabs.customEndpoint");return{key:r.id,label:r.label,description:o,isSystem:!1,canDelete:!0,protocols:n}});return[...t,...l]},[s,y]),[m,N]=g.useState("providers"),[p,R]=g.useState(null),[I,O]=g.useState(!1),[K,B]=g.useState("create"),[k,C]=g.useState(void 0),[P,U]=g.useState(null),[ve,ke]=g.useState(!1),[ie,je]=g.useState(void 0),[ee,L]=g.useState({}),[Re,F]=g.useState({}),[Pe,ce]=g.useState(null),[ye,ue]=g.useState({}),[Ne,me]=g.useState({}),[i,f]=g.useState({}),[w,v]=g.useState(null),[S,q]=g.useState(null),[T,V]=g.useState(null),[we,X]=g.useState(!1),[De,Fe]=g.useState(null),[Me,Oe]=g.useState(!0),[He,_e]=g.useState({}),H=(p==null?void 0:p.providers)??[],dt=H.length,xe=g.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")}],[s]);g.useEffect(()=>{var t,l;if(x.data){const r=x.data;R(r),L($e(r,y)),F({});const o={anthropic:((t=r.routingPresets)==null?void 0:t.anthropic)??[],openai:((l=r.routingPresets)==null?void 0:l.openai)??[]};for(const n of y)o[n.id]=n.routingPresets??[];ue(o)}},[x.data,y]),g.useEffect(()=>{x.isError&&x.error&&a({title:s("providers.toast.loadFailure",{message:x.error.message}),variant:"error"})},[x.isError,x.error,a,s]);const nt=g.useMemo(()=>{const t=new Map;for(const l of H){if(!l.defaultModel||!l.models)continue;const r=l.models.find(o=>o.id===l.defaultModel);r&&t.set(l.id,tt(r))}return t},[H]),qe=g.useMemo(()=>{const t=[],l=new Set;for(const o of H){const n=o.label||o.id,c=o.models??[];if(c.length>0)for(const j of c){const D=`${o.id}:${j.id}`;l.has(D)||(l.add(D),t.push({value:D,label:`${n} · ${j.label??j.id}`}))}else if(o.defaultModel){const j=`${o.id}:${o.defaultModel}`;l.has(j)||(l.add(j),t.push({value:j,label:`${n} · ${o.defaultModel}`}))}const b=`${o.id}:*`;l.has(b)||(l.add(b),t.push({value:b,label:s("settings.routing.providerPassthroughOption",{provider:n})}))}const r=[...ee.anthropic||[],...ee.openai||[]];for(const o of r){const n=o.target.trim();n&&!l.has(n)&&(l.add(n),t.push({value:n,label:n}))}return t},[H,ee,s]),Ve=(t,l)=>{ue(r=>({...r,[t]:l})),R(r=>{if(!r)return r;if(t==="anthropic"||t==="openai")return{...r,routingPresets:{...r.routingPresets,[t]:l}};const o=r.customEndpoints??[],n=o.findIndex(b=>b.id===t);if(n===-1)return r;const c=[...o];return c[n]={...c[n],routingPresets:l},{...r,customEndpoints:c}})},te=()=>p?!0:(a({title:s("settings.toast.missingConfig"),variant:"error"}),x.refetch(),!1),it=(t,l)=>{me(r=>({...r,[t]:l})),l.trim()&&f(r=>({...r,[t]:null}))},ct=async t=>{if(!te())return;const l=Ne[t].trim();if(!l){f(r=>({...r,[t]:s("modelManagement.validation.presetName")}));return}if(ye[t].some(r=>r.name.toLowerCase()===l.toLowerCase())){f(r=>({...r,[t]:s("modelManagement.validation.presetDuplicate",{name:l})}));return}v(t);try{const o=(await ae.post(`/api/routing-presets/${t}`,{name:l})).data.presets??[];Ve(t,o),me(n=>({...n,[t]:""})),f(n=>({...n,[t]:null})),a({title:s("modelManagement.toast.presetSaved",{name:l}),variant:"success"})}catch(r){a({title:s("modelManagement.toast.presetSaveFailure",{message:r instanceof Error?r.message:"unknown"}),variant:"error"})}finally{v(null),x.refetch()}},ut=async(t,l)=>{var r,o,n;if(te()){q({endpoint:t,name:l.name});try{const b=(await ae.post(`/api/routing-presets/${t}/apply`,{name:l.name})).data.config;if(b){R(b),L($e(b,y));const j={anthropic:((r=b.routingPresets)==null?void 0:r.anthropic)??[],openai:((o=b.routingPresets)==null?void 0:o.openai)??[]};for(const D of y){const A=(n=b.customEndpoints)==null?void 0:n.find(z=>z.id===D.id);j[D.id]=(A==null?void 0:A.routingPresets)??[]}ue(j)}else L(j=>({...j,[t]:G(l.modelRoutes)}));a({title:s("modelManagement.toast.presetApplySuccess",{name:l.name}),variant:"success"})}catch(c){a({title:s("modelManagement.toast.presetApplyFailure",{message:c instanceof Error?c.message:"unknown"}),variant:"error"})}finally{q(null),x.refetch()}}},mt=async(t,l)=>{if(!(!te()||!window.confirm(s("modelManagement.confirm.deletePreset",{name:l.name})))){V({endpoint:t,name:l.name});try{const n=(await ae.delete(`/api/routing-presets/${t}/${encodeURIComponent(l.name)}`)).data.presets??[];Ve(t,n),a({title:s("modelManagement.toast.presetDeleteSuccess",{name:l.name}),variant:"success"})}catch(o){a({title:s("modelManagement.toast.presetDeleteFailure",{message:o instanceof Error?o.message:"unknown"}),variant:"error"})}finally{V(null),x.refetch()}}},xt=()=>{te()&&(B("create"),C(void 0),O(!0))},ht=t=>{te()&&(B("edit"),C(t),O(!0))},bt=async t=>{if(!p)throw new Error(s("settings.toast.missingConfig"));const l=K==="create"?[...H,t]:H.map(n=>k&&n.id===k.id?{...t,id:k.id}:n),r={...p,providers:l};await ae.put("/api/config",r),R(r),L($e(r,y)),x.refetch();const o=K==="create"?s("providers.toast.createSuccess",{name:t.label||t.id}):s("providers.toast.updateSuccess",{name:t.label||t.id});a({title:o,variant:"success"})},pt=async t=>{const l=y.find(r=>r.id===t);if(l&&confirm(s("modelManagement.deleteEndpointConfirm",{label:l.label})))try{await fe.delete(t),u.invalidateQueries({queryKey:["custom-endpoints"]}),a({title:s("modelManagement.deleteEndpointSuccess"),variant:"success"}),m===t&&N("providers")}catch(r){const o=Ae(r);a({title:s("modelManagement.deleteEndpointError",{error:o.message}),variant:"error"})}},ze=async(t,l)=>{U(t.id);try{const r=l&&(l.headers||l.query)?{headers:l.headers&&Object.keys(l.headers).length>0?l.headers:void 0,query:l.query&&l.query.trim().length>0?l.query.trim():void 0}:void 0,o=await ae.post(`/api/providers/${t.id}/test`,r);o.data.ok?a({title:s("providers.toast.testSuccess"),description:s("providers.toast.testSuccessDesc",{status:o.data.status,duration:o.data.durationMs?`${o.data.durationMs} ms`:"—"}),variant:"success"}):a({title:s("providers.toast.testFailure",{message:`${o.data.status} ${o.data.statusText}`}),variant:"error"})}catch(r){a({title:s("providers.toast.testFailure",{message:r instanceof Error?r.message:"unknown"}),variant:"error"})}finally{U(null)}},gt=t=>{if(t.type==="anthropic"){const l=t.extraHeaders??{},r=new Map(xe.map(c=>[c.key.toLowerCase(),c])),o={};let n=!0;for(const c of xe){const b=Object.entries(l).find(([j])=>j.toLowerCase()===c.key.toLowerCase());if(b){const[j,D]=b;String(D??"")===c.value||(n=!1,o[j]=String(D??""))}}for(const[c,b]of Object.entries(l))r.has(c.toLowerCase())||(o[c]=String(b??""));_e(o),Oe(n),Fe(t),X(!0);return}ze(t)},Qe=()=>{X(!1),Fe(null),Oe(!0),_e({})},ft=async()=>{if(!De)return;const t={};if(Me)for(const o of xe)t[o.key]=o.value;const l=new Map(xe.map(o=>[o.key.toLowerCase(),o]));for(const[o,n]of Object.entries(He)){const c=o.toLowerCase();l.get(c)&&Me||(t[o]=n)}const r=De;Qe(),await ze(r,{headers:Object.keys(t).length>0?t:void 0,query:Me?"beta=true":void 0})},vt=async t=>{var D,A,z,he;if(!te()||!window.confirm(s("providers.confirm.delete",{name:t.label||t.id})))return;const r=H.filter(M=>M.id!==t.id),o=M=>{const be={};if(!M)return be;for(const[se,pe]of Object.entries(M)){if(!pe)continue;const[ge]=pe.split(":");ge&&ge===t.id||pe===t.id||(be[se]=pe)}return be},n=(p==null?void 0:p.endpointRouting)??{},c=o(((D=n.anthropic)==null?void 0:D.modelRoutes)??(p==null?void 0:p.modelRoutes)??{}),b=o(((A=n.openai)==null?void 0:A.modelRoutes)??{}),j={...p,providers:r,modelRoutes:c,endpointRouting:{anthropic:{defaults:((z=n.anthropic)==null?void 0:z.defaults)??p.defaults,modelRoutes:c},openai:{defaults:((he=n.openai)==null?void 0:he.defaults)??p.defaults,modelRoutes:b}}};try{await ae.put("/api/config",j),R(j),L({anthropic:G(c),openai:G(b)}),a({title:s("providers.toast.deleteSuccess",{name:t.label||t.id}),variant:"success"}),x.refetch()}catch(M){a({title:s("providers.toast.deleteFailure",{message:M instanceof Error?M.message:"unknown"}),variant:"error"})}},kt=t=>{L(l=>({...l,[t]:[...l[t]||[],{id:Ke(),source:"",target:""}]})),F(l=>({...l,[t]:null}))},jt=(t,l)=>{L(r=>{const o=r[t]||[];return o.some(n=>n.source.trim()===l.trim())?r:{...r,[t]:[...o,{id:Ke(),source:l,target:""}]}}),F(r=>({...r,[t]:null}))},Ce=(t,l,r,o)=>{L(n=>({...n,[t]:(n[t]||[]).map(c=>c.id===l?{...c,[r]:o}:c)})),F(n=>({...n,[t]:null}))},yt=(t,l)=>{L(r=>({...r,[t]:(r[t]||[]).filter(o=>o.id!==l)})),F(r=>({...r,[t]:null}))},Nt=t=>{var r,o;if(!p)return;const l=y.find(n=>n.id===t);if(l){const n=((r=l.routing)==null?void 0:r.modelRoutes)??{};L(c=>({...c,[t]:G(n)}))}else{const n=p.endpointRouting??{},c=t,b=c==="anthropic"?p.modelRoutes??{}:{},j=((o=n[c])==null?void 0:o.modelRoutes)??b;L(D=>({...D,[t]:G(j)}))}F(n=>({...n,[t]:null}))},wt=async t=>{var o;if(!te())return;const l=ee[t]||[],r={};for(const n of l){const c=n.source.trim(),b=n.target.trim();if(!(!c&&!b)){if(!c||!b){F(j=>({...j,[t]:s("settings.validation.routePair")}));return}if(r[c]){F(j=>({...j,[t]:s("settings.validation.routeDuplicate",{model:c})}));return}r[c]=b}}F(n=>({...n,[t]:null})),ce(t);try{const n=y.find(c=>c.id===t);if(n){const c={...n.routing||{},modelRoutes:r,defaults:((o=n.routing)==null?void 0:o.defaults)||p.defaults};await fe.update(t,{routing:c}),u.invalidateQueries({queryKey:["custom-endpoints"]}),a({title:s("modelManagement.toast.routesSaved"),variant:"success"})}else{const c=p.endpointRouting?{...p.endpointRouting}:{},b=t,j=c[b]??{defaults:p.defaults,modelRoutes:b==="anthropic"?p.modelRoutes??{}:{}},D={...j,defaults:j.defaults??p.defaults,modelRoutes:r},A={...c,[b]:D},z={...p,endpointRouting:A,modelRoutes:b==="anthropic"?r:p.modelRoutes??{}};await ae.put("/api/config",z),R(z),a({title:s("modelManagement.toast.routesSaved"),variant:"success"}),x.refetch()}L(c=>({...c,[t]:G(r)}))}catch(n){a({title:s("modelManagement.toast.routesSaveFailure",{message:n instanceof Error?n.message:"unknown"}),variant:"error"})}finally{ce(null)}},Mt=()=>e.jsxs("section",{className:Ye,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:Lt.default,children:s("providers.count",{count:dt})}),e.jsx("button",{type:"button",className:_,onClick:()=>x.refetch(),disabled:x.isFetching,children:x.isFetching?s("common.actions.refreshing"):s("providers.actions.refresh")}),e.jsx("button",{type:"button",className:re,onClick:xt,children:s("providers.actions.add")})]})]}),x.isPending||!p&&x.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")}):H.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:H.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(qt,{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:Xe.success,children:s("providers.card.defaultModel",{model:nt.get(t.id)??t.defaultModel})}):e.jsx("div",{className:Xe.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(l=>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:tt(l)})]},l.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:_,onClick:()=>ht(t),children:s("providers.actions.edit")}),e.jsx("button",{type:"button",onClick:()=>gt(t),disabled:P===t.id,className:P===t.id?`${_} opacity-60 cursor-not-allowed`:_,children:P===t.id?s("common.actions.testingConnection"):s("providers.actions.test")}),e.jsx("button",{type:"button",className:Le,onClick:()=>vt(t),children:s("providers.actions.delete")})]})]},t.id))})]}),Ct=t=>{const l=ye[t],r=Ne[t],o=i[t],n=w===t;return 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:r,onChange:c=>it(t,c.target.value),placeholder:s("modelManagement.presets.namePlaceholder"),className:ne,disabled:n}),e.jsx("button",{type:"button",onClick:()=>ct(t),className:re,disabled:n,children:s(n?"modelManagement.presets.saving":"modelManagement.presets.save")})]})]}),o?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:o}):null,l.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:l.map(c=>{const b=(S==null?void 0:S.endpoint)===t&&(S==null?void 0:S.name)===c.name,j=(T==null?void 0:T.endpoint)===t&&(T==null?void 0:T.name)===c.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:c.name}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx("button",{type:"button",onClick:()=>ut(t,c),className:b||j?`${_} opacity-60 cursor-not-allowed text-xs px-2 py-1`:`${re} text-xs px-2 py-1`,disabled:b||j,children:s(b?"modelManagement.presets.applying":"modelManagement.presets.apply")}),e.jsx("button",{type:"button",onClick:()=>mt(t,c),className:j||b?`${_} opacity-60 cursor-not-allowed text-xs px-2 py-1`:`${Le} text-xs px-2 py-1`,disabled:j||b,children:s(j?"modelManagement.presets.deleting":"modelManagement.presets.delete")})]})]},c.name)})})]})},Et=t=>{var he;const l=ee[t]||[],r=Re[t],o=d.find(M=>M.key===t),c=((he=o==null?void 0:o.protocols)==null?void 0:he.includes("anthropic"))??t==="anthropic"?Ft:Ht,b=Pe===t,j=(o==null?void 0:o.label)??s(`modelManagement.tabs.${t}`),D=(o==null?void 0:o.isSystem)===!1?o.description:s(`settings.routing.descriptionByEndpoint.${t}`),A=`route-source-${t}`,z=`route-target-${t}`;return e.jsxs("section",{className:Ye,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:j})}),e.jsx("p",{className:"max-w-3xl text-sm text-slate-600 dark:text-slate-400",children:D}),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:()=>kt(t),className:_,disabled:b,children:s("settings.routing.add")}),e.jsx("button",{type:"button",onClick:()=>Nt(t),className:_,disabled:b,children:s("common.actions.reset")}),e.jsx("button",{type:"button",onClick:()=>wt(t),className:re,disabled:b,children:s(b?"common.actions.saving":"modelManagement.actions.saveRoutes")})]})]}),Ct(t),r?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:r}):null,l.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:l.map((M,be)=>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:be+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:M.source,onChange:se=>Ce(t,M.id,"source",se.target.value),className:ne,placeholder:"claude-3.5-sonnet",list:A,disabled:b})]})}),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 se=M.target.trim(),ge=qe.some(Q=>Q.value===se)?se:"__custom";return e.jsxs(e.Fragment,{children:[e.jsxs("select",{value:ge,onChange:Q=>{const Ge=Q.target.value;Ge==="__custom"?Ce(t,M.id,"target",se):Ce(t,M.id,"target",Ge)},className:ot,disabled:b,children:[e.jsx("option",{value:"__custom",children:s("settings.routing.customTargetOption")}),qe.map(Q=>e.jsx("option",{value:Q.value,children:Q.label},`${z}-${Q.value}`))]}),ge==="__custom"&&e.jsx("input",{type:"text",value:M.target,onChange:Q=>Ce(t,M.id,"target",Q.target.value),className:ne,placeholder:"providerId:modelId",disabled:b})]})})()]})}),e.jsx("div",{className:"flex items-end",children:e.jsx("button",{type:"button",className:Le,onClick:()=>yt(t,M.id),disabled:b,children:s("settings.routing.remove")})})]})]},M.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:c.map(M=>e.jsx("button",{type:"button",onClick:()=>jt(t,M),className:_,disabled:b,children:M},`${t}-${M}`))})]})}),e.jsx("datalist",{id:A,children:c.map(M=>e.jsx("option",{value:M},`${A}-${M}`))})]})};return e.jsxs("div",{className:"flex flex-col gap-8",children:[e.jsx("div",{className:Ut,children:e.jsxs("div",{className:"flex items-start justify-between gap-4",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.jsxs("button",{onClick:()=>{je(void 0),ke(!0)},className:re,children:["+ ",s("modelManagement.addEndpoint")]})]})}),e.jsx("div",{className:"flex flex-wrap gap-4",children:d.map(t=>{const l=m===t.key;return e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>N(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 ${l?"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.canDelete&&e.jsx("button",{onClick:r=>{r.stopPropagation(),pt(t.key)},className:"absolute -top-2 -right-2 h-6 w-6 rounded-full bg-red-500 text-white hover:bg-red-600 flex items-center justify-center text-xs shadow-md",title:s("common.delete"),children:"×"})]},t.key)})}),m==="providers"?Mt():Et(m),e.jsx(Bt,{open:I,mode:K,provider:K==="edit"?k:void 0,existingProviderIds:H.map(t=>t.id).filter(t=>K==="edit"&&k?t!==k.id:!0),onClose:()=>{O(!1),C(void 0),B("create")},onSubmit:bt}),e.jsx(Vt,{open:ve,endpoint:ie,onClose:()=>{ke(!1),je(void 0)},onSuccess:()=>{u.invalidateQueries({queryKey:["custom-endpoints"]})}}),e.jsx(_t,{open:we,provider:De,options:xe,preservedExtras:He,usePreset:Me,onPresetChange:Oe,onConfirm:ft,onClose:Qe})]})}function _t({open:s,provider:a,options:u,usePreset:x,preservedExtras:h,onPresetChange:y,onConfirm:d,onClose:m}){const{t:N}=Se();return!s||!a?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:m,"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:N("providers.testDialog.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:N("providers.testDialog.subtitle",{name:a.label||a.id})})]}),e.jsx("p",{className:"mb-5 text-sm leading-relaxed text-slate-600 dark:text-slate-300",children:N("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:x,onChange:p=>y(p.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:N("providers.testDialog.presetLabel")}),e.jsx("p",{className:"text-xs leading-relaxed text-slate-500 dark:text-slate-400",children:N("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:N("providers.testDialog.presetPreviewSummary")}),e.jsx("div",{className:"mt-2 grid gap-1",children:u.map(p=>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:[p.key,": ",p.value]},p.key))})]})]})]})}),Object.keys(h).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:N("providers.testDialog.preservedInfo")}),e.jsx("div",{className:"grid gap-2",children:Object.entries(h).map(([p,R])=>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:[p,": ",R]},p))})]}):null,e.jsxs("footer",{className:"mt-6 flex justify-end gap-3",children:[e.jsx("button",{type:"button",onClick:m,className:_,children:N("providers.testDialog.cancel")}),e.jsx("button",{type:"button",onClick:()=>{d()},className:re,children:N("providers.testDialog.primary")})]})]})]})}function tt(s){return s.label&&s.label.trim().length>0?`${s.label} (${s.id})`:s.id}function qt({type:s}){const a={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:u,color:x}=a[s]||a.custom;return e.jsx("span",{className:`rounded-full ${x} px-2.5 py-1 text-xs font-semibold shadow-sm`,children:u})}function Vt({open:s,endpoint:a,onClose:u,onSuccess:x}){const{t:h}=Se(),{pushToast:y}=lt(),[d,m]=g.useState({id:"",label:"",paths:[{path:"",protocol:"openai-auto"}],enabled:!0});g.useEffect(()=>{if(a){let k;a.paths&&a.paths.length>0?k=a.paths:a.path&&a.protocol?k=[{path:a.path,protocol:a.protocol}]:k=[{path:"",protocol:"openai-auto"}],m({id:a.id,label:a.label,paths:k,enabled:a.enabled!==!1})}else m({id:"",label:"",paths:[{path:"",protocol:"openai-auto"}],enabled:!0})},[a,s]);const N=Ze({mutationFn:fe.create,onSuccess:()=>{y({title:h("modelManagement.createEndpointSuccess"),variant:"success"}),x(),u()},onError:k=>{const C=Ae(k);y({title:h("modelManagement.createEndpointError",{error:C.message}),variant:"error"})}}),p=Ze({mutationFn:k=>fe.update(k.id,k.updates),onSuccess:()=>{y({title:h("modelManagement.updateEndpointSuccess"),variant:"success"}),x(),u()},onError:k=>{const C=Ae(k);y({title:h("modelManagement.updateEndpointError",{error:C.message}),variant:"error"})}}),R=()=>{m({...d,paths:[...d.paths,{path:"",protocol:"anthropic"}]})},I=k=>{if(d.paths.length===1){y({title:h("modelManagement.atLeastOnePath"),variant:"error"});return}const C=d.paths.filter((P,U)=>U!==k);m({...d,paths:C})},O=(k,C,P)=>{const U=[...d.paths];U[k]={...U[k],[C]:P},m({...d,paths:U})},K=k=>{if(k.preventDefault(),!d.id.trim()||!d.label.trim()){y({title:h("modelManagement.endpointValidationError"),variant:"error"});return}for(const P of d.paths)if(!P.path.trim()){y({title:h("modelManagement.pathValidationError"),variant:"error"});return}const C=d.paths.map(P=>({path:P.path.trim(),protocol:P.protocol}));a?p.mutate({id:a.id,updates:{label:d.label.trim(),paths:C,enabled:d.enabled}}):N.mutate({id:d.id.trim(),label:d.label.trim(),paths:C,enabled:d.enabled})},B=N.isPending||p.isPending;return s?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 bg-black/50 dark:bg-black/70 z-40 transition-opacity",onClick:u}),e.jsx("div",{className:"fixed inset-y-0 right-0 w-full max-w-md bg-white dark:bg-gray-900 shadow-xl z-50 overflow-y-auto",children:e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-800",children:[e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-gray-100",children:h(a?"modelManagement.editEndpoint":"modelManagement.createEndpoint")}),e.jsx("button",{onClick:u,className:"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",children:e.jsx("svg",{className:"h-6 w-6",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),e.jsxs("form",{onSubmit:K,className:"flex-1 p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:[h("modelManagement.endpointId")," ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx("input",{type:"text",value:d.id,onChange:k=>m({...d,id:k.target.value}),className:ne,placeholder:h("modelManagement.endpointIdPlaceholder"),disabled:!!a,required:!0}),e.jsx("p",{className:"mt-1 text-xs text-gray-500 dark:text-gray-400",children:h("modelManagement.endpointIdHint")})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:[h("modelManagement.endpointLabel")," ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx("input",{type:"text",value:d.label,onChange:k=>m({...d,label:k.target.value}),className:ne,placeholder:h("modelManagement.endpointLabelPlaceholder"),required:!0})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300",children:[h("modelManagement.endpointPaths")," ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsxs("button",{type:"button",onClick:R,className:"text-sm text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300",children:["+ ",h("modelManagement.addPath")]})]}),e.jsx("div",{className:"space-y-3",children:d.paths.map((k,C)=>e.jsxs("div",{className:"p-3 border border-gray-200 dark:border-gray-700 rounded-lg space-y-2",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("input",{type:"text",value:k.path,onChange:P=>O(C,"path",P.target.value),className:ne,placeholder:h("modelManagement.endpointPathPlaceholder"),required:!0}),e.jsxs("select",{value:k.protocol,onChange:P=>O(C,"protocol",P.target.value),className:ot,required:!0,children:[e.jsx("option",{value:"anthropic",children:h("modelManagement.protocolAnthropic")}),e.jsx("option",{value:"openai-auto",children:h("modelManagement.protocolOpenAI")})]})]}),d.paths.length>1&&e.jsx("button",{type:"button",onClick:()=>I(C),className:"text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 mt-1",title:h("modelManagement.removePath"),children:e.jsx("svg",{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})})})]}),C===0&&e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:h("modelManagement.endpointPathHint")})]},C))})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"checkbox",id:"enabled",checked:d.enabled,onChange:k=>m({...d,enabled:k.target.checked}),className:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-gray-700 dark:bg-gray-800"}),e.jsx("label",{htmlFor:"enabled",className:"text-sm text-gray-700 dark:text-gray-300",children:h("modelManagement.endpointEnabled")})]}),!a&&e.jsx("div",{className:"rounded-lg bg-blue-50 dark:bg-blue-900/20 p-4",children:e.jsx("p",{className:"text-sm text-blue-800 dark:text-blue-300",children:h("modelManagement.endpointRoutingHint")})})]}),e.jsxs("div",{className:"flex gap-3 p-6 border-t border-gray-200 dark:border-gray-800",children:[e.jsx("button",{type:"button",onClick:u,className:`${_} flex-1`,disabled:B,children:h("common.cancel")}),e.jsx("button",{type:"submit",onClick:K,className:`${re} flex-1`,disabled:B,children:h(B?"common.saving":a?"common.save":"common.create")})]})]})})]}):null}export{Wt as default};
|
|
1
|
+
var We=s=>{throw TypeError(s)};var Ue=(s,a,u)=>a.has(s)||We("Cannot "+u);var E=(s,a,u)=>(Ue(s,a,"read from private field"),u?u.call(s):a.get(s)),le=(s,a,u)=>a.has(s)?We("Cannot add the same private member more than once"):a instanceof WeakSet?a.add(s):a.set(s,u),oe=(s,a,u,x)=>(Ue(s,a,"write to private field"),x?x.call(s,u):a.set(s,u),u),de=(s,a,u)=>(Ue(s,a,"access private method"),u);import{S as St,v as Rt,w as Je,x as Pt,y as at,z as rt,r as g,A as Dt,C as Ot,u as Se,j as e,a as lt,D as Ut,E as re,b as ae,G as fe,t as Ae,H as Ye,i as Lt,k as _,I as Xe,J as Le,K as ne,M as ot}from"./index-B-8NzzZq.js";import{u as Tt,a as $t}from"./useApiQuery-DZHaAgf7.js";var W,Z,$,J,Y,Ee,Ie,st,At=(st=class extends St{constructor(a,u){super();le(this,Y);le(this,W);le(this,Z);le(this,$);le(this,J);oe(this,W,a),this.setOptions(u),this.bindMethods(),de(this,Y,Ee).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(a){var x;const u=this.options;this.options=E(this,W).defaultMutationOptions(a),Rt(this.options,u)||E(this,W).getMutationCache().notify({type:"observerOptionsUpdated",mutation:E(this,$),observer:this}),u!=null&&u.mutationKey&&this.options.mutationKey&&Je(u.mutationKey)!==Je(this.options.mutationKey)?this.reset():((x=E(this,$))==null?void 0:x.state.status)==="pending"&&E(this,$).setOptions(this.options)}onUnsubscribe(){var a;this.hasListeners()||(a=E(this,$))==null||a.removeObserver(this)}onMutationUpdate(a){de(this,Y,Ee).call(this),de(this,Y,Ie).call(this,a)}getCurrentResult(){return E(this,Z)}reset(){var a;(a=E(this,$))==null||a.removeObserver(this),oe(this,$,void 0),de(this,Y,Ee).call(this),de(this,Y,Ie).call(this)}mutate(a,u){var x;return oe(this,J,u),(x=E(this,$))==null||x.removeObserver(this),oe(this,$,E(this,W).getMutationCache().build(E(this,W),this.options)),E(this,$).addObserver(this),E(this,$).execute(a)}},W=new WeakMap,Z=new WeakMap,$=new WeakMap,J=new WeakMap,Y=new WeakSet,Ee=function(){var u;const a=((u=E(this,$))==null?void 0:u.state)??Pt();oe(this,Z,{...a,isPending:a.status==="pending",isSuccess:a.status==="success",isError:a.status==="error",isIdle:a.status==="idle",mutate:this.mutate,reset:this.reset})},Ie=function(a){at.batch(()=>{var u,x,h,y,d,m,N,p;if(E(this,J)&&this.hasListeners()){const R=E(this,Z).variables,I=E(this,Z).context,O={client:E(this,W),meta:this.options.meta,mutationKey:this.options.mutationKey};(a==null?void 0:a.type)==="success"?((x=(u=E(this,J)).onSuccess)==null||x.call(u,a.data,R,I,O),(y=(h=E(this,J)).onSettled)==null||y.call(h,a.data,null,R,I,O)):(a==null?void 0:a.type)==="error"&&((m=(d=E(this,J)).onError)==null||m.call(d,a.error,R,I,O),(p=(N=E(this,J)).onSettled)==null||p.call(N,void 0,a.error,R,I,O))}this.listeners.forEach(R=>{R(E(this,Z))})})},st);function Ze(s,a){const u=rt(),[x]=g.useState(()=>new At(u,s));g.useEffect(()=>{x.setOptions(s)},[x,s]);const h=g.useSyncExternalStore(g.useCallback(d=>x.subscribe(at.batchCalls(d)),[x]),()=>x.getCurrentResult(),()=>x.getCurrentResult()),y=g.useCallback((d,m)=>{x.mutate(d,m).catch(Dt)},[x]);if(h.error&&Ot(x.options.throwOnError,[h.error]))throw h.error;return{...h,mutate:y,mutateAsync:h.mutate}}function Be(){return typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():Math.random().toString(36).slice(2,10)}function It(){return{_key:Be(),id:"",label:""}}const Te={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"},custom:{}};function et(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(a=>({...a,_key:Be()})),authMode:s.authMode==="authToken"?"authToken":"apiKey"}:{id:"",label:"",baseUrl:"",apiKey:"",type:"custom",defaultModel:"",models:[],authMode:"apiKey"}}function Kt(s){return{_key:Be(),id:s.id,label:s.label}}function Bt({open:s,mode:a,provider:u,existingProviderIds:x,onClose:h,onSubmit:y}){const{t:d}=Se(),[m,N]=g.useState(()=>et(u)),[p,R]=g.useState({}),[I,O]=g.useState(!1),[K,B]=g.useState(null),k=g.useRef(null),C=g.useRef(null),P=g.useRef(null),[U,ve]=g.useState(a==="edit");g.useEffect(()=>{s&&(N(et(u)),R({}),B(null),O(!1),ve(a==="edit"))},[s,u,a]),g.useEffect(()=>{if(!s)return;const i=f=>{f.key==="Escape"&&h()};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[s,h]),g.useEffect(()=>{if(s){if(a==="create"&&P.current){P.current.focus();return}C.current&&C.current.focus()}},[s,a]);const ke=g.useMemo(()=>m.models.filter(i=>i.id.trim().length>0),[m.models]),ie=i=>f=>{N(w=>({...w,[i]:f}))},je=i=>{N(f=>{const v=!U||f.label.trim().length===0||f.label===f.id?i:f.label;return{...f,id:i,label:v}})},ee=i=>{N(f=>{var we;const v=Te[i??"custom"]??Te.custom,S=Object.values(Te).map(X=>X.baseUrl).filter(X=>!!X),q=!f.baseUrl||S.includes(f.baseUrl),T=a==="create"&&(f.models.length===0||f.models.every(X=>X.id.trim().length===0)),V={...f,type:i,authMode:i==="anthropic"?f.authMode??"apiKey":"apiKey"};return v!=null&&v.baseUrl&&q&&(V.baseUrl=v.baseUrl),v!=null&&v.models&&T&&(V.models=v.models.map(Kt),V.defaultModel=v.defaultModel??((we=v.models[0])==null?void 0:we.id)??""),V})},L=(i,f)=>{N(w=>{const v=[...w.models];return v[i]={...v[i],...f},{...w,models:v}})},Re=(i,f)=>{N(w=>{const v=[...w.models],S=v[i];if(!S)return w;const q=!U||!S.label||S.label===S.id,T={...S,id:f,label:q?f:S.label};v[i]=T;const V=w.defaultModel===S.id?f:w.defaultModel;return{...w,models:v,defaultModel:V}})},F=i=>{N(f=>{if(i<0||i>=f.models.length)return f;const w=f.models.filter((S,q)=>q!==i);let v=f.defaultModel;return w.some(S=>S.id===v)||(v=""),{...f,models:w,defaultModel:v}})},Pe=()=>{N(i=>({...i,models:[...i.models,It()]}))},ce=i=>{N(f=>({...f,authMode:i}))},ye=()=>{const i={},f=m.id.trim(),w=m.baseUrl.trim();if(a==="create"&&(f.length===0?i.id=d("providers.drawer.errors.idRequired"):x.includes(f)&&(i.id=d("providers.drawer.errors.idDuplicate"))),a==="edit"&&f.length===0&&(i.id=d("providers.drawer.errors.idRequired")),w.length===0)i.baseUrl=d("providers.drawer.errors.baseUrlInvalid");else try{new URL(w)}catch{i.baseUrl=d("providers.drawer.errors.baseUrlInvalid")}if(m.models.length>0){const v=new Set;m.models.some(q=>{const T=q.id.trim();return T.length===0||v.has(T)?!0:(v.add(T),!1)})&&(i.models=d("providers.drawer.errors.modelInvalid"))}return m.defaultModel&&!m.models.some(v=>v.id===m.defaultModel)&&(i.models=d("providers.drawer.errors.defaultInvalid")),R(i),Object.keys(i).length===0},ue=()=>{const i=m.models.map(v=>{var S;return{id:v.id.trim(),label:(S=v.label)!=null&&S.trim()?v.label.trim():void 0}}).filter(v=>v.id.length>0),f=u!=null&&u.extraHeaders&&Object.keys(u.extraHeaders).length>0?u.extraHeaders:void 0,w=m.type==="anthropic"?m.authMode:void 0;return{id:m.id.trim(),label:m.label.trim()||m.id.trim(),baseUrl:m.baseUrl.trim(),apiKey:m.apiKey.trim()||void 0,type:m.type??"custom",defaultModel:m.defaultModel||void 0,models:i.length>0?i:void 0,extraHeaders:f,authMode:w}},Ne=async()=>{if(B(null),!!ye()){O(!0);try{const i=ue();await y(i)}catch(i){B(d("providers.drawer.toast.saveFailure",{message:i instanceof Error?i.message:"unknown"})),O(!1);return}O(!1),h()}},me=a==="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:h,"aria-hidden":"true"}),e.jsxs("aside",{ref:k,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:d(me?"providers.drawer.createTitle":"providers.drawer.editTitle")}),e.jsx("p",{id:"provider-drawer-desc",className:"text-xs text-slate-500 dark:text-slate-400",children:d("providers.drawer.description")})]}),e.jsx("button",{type:"button",ref:C,onClick:h,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:d("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:d("providers.drawer.description")}),e.jsx("div",{className:"flex items-center justify-end",children:e.jsx("button",{type:"button",onClick:()=>ve(i=>!i),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:d(U?"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:d("providers.drawer.fields.id")}),e.jsx("input",{value:m.id,ref:P,onChange:i=>je(i.target.value),disabled:!me,placeholder:d("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":!!p.id}),p.id?e.jsx("span",{className:"text-xs text-red-500",children:p.id}):null]}),U?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:d("providers.drawer.fields.label")}),e.jsx("input",{value:m.label,onChange:i=>ie("label")(i.target.value),placeholder:d("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:d("providers.drawer.fields.baseUrl")}),e.jsx("input",{value:m.baseUrl,onChange:i=>ie("baseUrl")(i.target.value),placeholder:d("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":!!p.baseUrl}),p.baseUrl?e.jsx("span",{className:"text-xs text-red-500",children:p.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:d("providers.drawer.fields.type")}),e.jsxs("select",{value:m.type??"custom",onChange:i=>ee(i.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:d("providers.drawer.fields.apiKey")}),e.jsx("input",{value:m.apiKey,onChange:i=>ie("apiKey")(i.target.value),placeholder:d("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"})]}),m.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:d("providers.drawer.fields.authMode")}),e.jsx("p",{className:"text-[11px] text-slate-500 dark:text-slate-400",children:d("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:m.authMode==="apiKey",onChange:()=>ce("apiKey")}),e.jsx("span",{children:d("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:m.authMode==="authToken",onChange:()=>ce("authToken")}),e.jsx("span",{children:d("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:d("providers.drawer.fields.models")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:d("providers.drawer.modelsDescription")})]}),e.jsx("button",{type:"button",onClick:Pe,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:d("providers.drawer.fields.addModel")})]}),p.models?e.jsx("p",{className:"text-xs text-red-500",children:p.models}):null,e.jsxs("div",{className:"space-y-4",children:[m.models.map((i,f)=>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:d("providers.drawer.fields.modelId")}),e.jsx("input",{value:i.id,onChange:w=>Re(f,w.target.value),placeholder:d("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"})]}),U?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:d("providers.drawer.fields.modelLabel")}),e.jsx("input",{value:i.label??"",onChange:w=>L(f,{label:w.target.value}),placeholder:d("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:i.id,checked:m.defaultModel===i.id,onChange:()=>N(w=>({...w,defaultModel:i.id})),disabled:i.id.trim().length===0}),d("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:()=>F(f),disabled:m.models.length===0,children:d("providers.drawer.fields.removeModel")})]})]},i._key)),m.models.length===0?e.jsx("div",{className:"rounded-xl border-2 border-amber-300 bg-gradient-to-br from-amber-50 to-yellow-50 p-5 shadow-md dark:border-amber-600/60 dark:from-amber-900/20 dark:to-yellow-900/20",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"flex-shrink-0 text-2xl",children:"💡"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("p",{className:"text-sm font-semibold text-amber-900 dark:text-amber-200",children:d("providers.drawer.noModelsTitle")}),e.jsx("p",{className:"text-xs leading-relaxed text-amber-800 dark:text-amber-300",children:d("providers.drawer.noModelsHint",{providerId:m.id||"provider-id"})}),e.jsxs("div",{className:"rounded-md bg-amber-100/80 p-2.5 dark:bg-amber-800/40",children:[e.jsx("p",{className:"mb-1.5 text-xs font-medium text-amber-900 dark:text-amber-200",children:d("providers.drawer.routeExample")}),e.jsxs("code",{className:"block rounded bg-white px-2.5 py-1.5 font-mono text-xs text-amber-900 shadow-sm dark:bg-slate-900 dark:text-amber-100",children:['"claude-*": "',(m.id||"provider-id").trim()||"provider-id",':*"']})]})]})]})}):null]}),ke.length>1?e.jsx("div",{className:"text-xs text-slate-500 dark:text-slate-400",children:d("providers.drawer.defaultHint",{model:m.defaultModel||d("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:K?e.jsx("span",{children:K}):null}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{type:"button",onClick:h,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:I,children:d("common.actions.cancel")}),e.jsx("button",{type:"button",onClick:Ne,className:"rounded-md bg-blue-600 px-4 py-2 text-white transition hover:bg-blue-700 disabled:opacity-60",disabled:I,children:d(I?"common.actions.saving":"common.actions.save")})]})]})]})]}):null}const Ft=["claude-sonnet-4-5-20250929","claude-sonnet-4-5-20250929-thinking","claude-sonnet-4-20250514","claude-opus-4-1-20250805","claude-opus-4-1-20250805-thinking","claude-haiku-4-5-20251001","claude-haiku-4-5-20251001-thinking","claude-3-5-haiku-20241022"],Ht=["gpt-4o-mini","gpt-4o","o4-mini","o4-large","gpt-5-codex"];function Ke(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).slice(2,10)}function G(s){return s?Object.entries(s).map(([a,u])=>({id:Ke(),source:a,target:u})):[]}function $e(s,a){var h,y,d;if(!s)return{};const u={},x=s.endpointRouting??{};u.anthropic=G(((h=x.anthropic)==null?void 0:h.modelRoutes)??s.modelRoutes??{}),u.openai=G(((y=x.openai)==null?void 0:y.modelRoutes)??{});for(const m of a)(d=m.routing)!=null&&d.modelRoutes?u[m.id]=G(m.routing.modelRoutes):u[m.id]=[];return u}function Wt(){const{t:s}=Se(),{pushToast:a}=lt(),u=rt(),x=Tt(["config","full"],{url:"/api/config",method:"GET"}),{data:h}=$t({queryKey:["custom-endpoints"],queryFn:fe.list,refetchInterval:1e4}),y=(h==null?void 0:h.endpoints)??[],d=g.useMemo(()=>{const t=[{key:"providers",label:s("modelManagement.tabs.providers"),description:s("modelManagement.tabs.providersDesc"),isSystem:!0,canDelete:!1},{key:"anthropic",label:s("modelManagement.tabs.anthropic"),description:s("modelManagement.tabs.anthropicDesc"),isSystem:!0,canDelete:!1,protocols:["anthropic"]},{key:"openai",label:s("modelManagement.tabs.openai"),description:s("modelManagement.tabs.openaiDesc"),isSystem:!0,canDelete:!1,protocols:["openai-auto","openai-chat","openai-responses"]}],l=y.map(r=>{let o,n=[];if(r.paths&&r.paths.length>0){const c=r.paths.map(b=>`${b.path} (${b.protocol})`).join(", ");o=`${s("modelManagement.tabs.customEndpoint")}: ${c}`,n=[...new Set(r.paths.map(b=>b.protocol))]}else if(r.path){const c=r.protocol||"anthropic";o=`${s("modelManagement.tabs.customEndpoint")}: ${r.path} (${c})`,n=[c]}else o=s("modelManagement.tabs.customEndpoint");return{key:r.id,label:r.label,description:o,isSystem:!1,canDelete:!0,protocols:n}});return[...t,...l]},[s,y]),[m,N]=g.useState("providers"),[p,R]=g.useState(null),[I,O]=g.useState(!1),[K,B]=g.useState("create"),[k,C]=g.useState(void 0),[P,U]=g.useState(null),[ve,ke]=g.useState(!1),[ie,je]=g.useState(void 0),[ee,L]=g.useState({}),[Re,F]=g.useState({}),[Pe,ce]=g.useState(null),[ye,ue]=g.useState({}),[Ne,me]=g.useState({}),[i,f]=g.useState({}),[w,v]=g.useState(null),[S,q]=g.useState(null),[T,V]=g.useState(null),[we,X]=g.useState(!1),[De,Fe]=g.useState(null),[Me,Oe]=g.useState(!0),[He,_e]=g.useState({}),H=(p==null?void 0:p.providers)??[],dt=H.length,xe=g.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")}],[s]);g.useEffect(()=>{var t,l;if(x.data){const r=x.data;R(r),L($e(r,y)),F({});const o={anthropic:((t=r.routingPresets)==null?void 0:t.anthropic)??[],openai:((l=r.routingPresets)==null?void 0:l.openai)??[]};for(const n of y)o[n.id]=n.routingPresets??[];ue(o)}},[x.data,y]),g.useEffect(()=>{x.isError&&x.error&&a({title:s("providers.toast.loadFailure",{message:x.error.message}),variant:"error"})},[x.isError,x.error,a,s]);const nt=g.useMemo(()=>{const t=new Map;for(const l of H){if(!l.defaultModel||!l.models)continue;const r=l.models.find(o=>o.id===l.defaultModel);r&&t.set(l.id,tt(r))}return t},[H]),qe=g.useMemo(()=>{const t=[],l=new Set;for(const o of H){const n=o.label||o.id,c=o.models??[];if(c.length>0)for(const j of c){const D=`${o.id}:${j.id}`;l.has(D)||(l.add(D),t.push({value:D,label:`${n} · ${j.label??j.id}`}))}else if(o.defaultModel){const j=`${o.id}:${o.defaultModel}`;l.has(j)||(l.add(j),t.push({value:j,label:`${n} · ${o.defaultModel}`}))}const b=`${o.id}:*`;l.has(b)||(l.add(b),t.push({value:b,label:s("settings.routing.providerPassthroughOption",{provider:n})}))}const r=[...ee.anthropic||[],...ee.openai||[]];for(const o of r){const n=o.target.trim();n&&!l.has(n)&&(l.add(n),t.push({value:n,label:n}))}return t},[H,ee,s]),Ve=(t,l)=>{ue(r=>({...r,[t]:l})),R(r=>{if(!r)return r;if(t==="anthropic"||t==="openai")return{...r,routingPresets:{...r.routingPresets,[t]:l}};const o=r.customEndpoints??[],n=o.findIndex(b=>b.id===t);if(n===-1)return r;const c=[...o];return c[n]={...c[n],routingPresets:l},{...r,customEndpoints:c}})},te=()=>p?!0:(a({title:s("settings.toast.missingConfig"),variant:"error"}),x.refetch(),!1),it=(t,l)=>{me(r=>({...r,[t]:l})),l.trim()&&f(r=>({...r,[t]:null}))},ct=async t=>{if(!te())return;const l=Ne[t].trim();if(!l){f(r=>({...r,[t]:s("modelManagement.validation.presetName")}));return}if(ye[t].some(r=>r.name.toLowerCase()===l.toLowerCase())){f(r=>({...r,[t]:s("modelManagement.validation.presetDuplicate",{name:l})}));return}v(t);try{const o=(await ae.post(`/api/routing-presets/${t}`,{name:l})).data.presets??[];Ve(t,o),me(n=>({...n,[t]:""})),f(n=>({...n,[t]:null})),a({title:s("modelManagement.toast.presetSaved",{name:l}),variant:"success"})}catch(r){a({title:s("modelManagement.toast.presetSaveFailure",{message:r instanceof Error?r.message:"unknown"}),variant:"error"})}finally{v(null),x.refetch()}},ut=async(t,l)=>{var r,o,n;if(te()){q({endpoint:t,name:l.name});try{const b=(await ae.post(`/api/routing-presets/${t}/apply`,{name:l.name})).data.config;if(b){R(b),L($e(b,y));const j={anthropic:((r=b.routingPresets)==null?void 0:r.anthropic)??[],openai:((o=b.routingPresets)==null?void 0:o.openai)??[]};for(const D of y){const A=(n=b.customEndpoints)==null?void 0:n.find(z=>z.id===D.id);j[D.id]=(A==null?void 0:A.routingPresets)??[]}ue(j)}else L(j=>({...j,[t]:G(l.modelRoutes)}));a({title:s("modelManagement.toast.presetApplySuccess",{name:l.name}),variant:"success"})}catch(c){a({title:s("modelManagement.toast.presetApplyFailure",{message:c instanceof Error?c.message:"unknown"}),variant:"error"})}finally{q(null),x.refetch()}}},mt=async(t,l)=>{if(!(!te()||!window.confirm(s("modelManagement.confirm.deletePreset",{name:l.name})))){V({endpoint:t,name:l.name});try{const n=(await ae.delete(`/api/routing-presets/${t}/${encodeURIComponent(l.name)}`)).data.presets??[];Ve(t,n),a({title:s("modelManagement.toast.presetDeleteSuccess",{name:l.name}),variant:"success"})}catch(o){a({title:s("modelManagement.toast.presetDeleteFailure",{message:o instanceof Error?o.message:"unknown"}),variant:"error"})}finally{V(null),x.refetch()}}},xt=()=>{te()&&(B("create"),C(void 0),O(!0))},ht=t=>{te()&&(B("edit"),C(t),O(!0))},bt=async t=>{if(!p)throw new Error(s("settings.toast.missingConfig"));const l=K==="create"?[...H,t]:H.map(n=>k&&n.id===k.id?{...t,id:k.id}:n),r={...p,providers:l};await ae.put("/api/config",r),R(r),L($e(r,y)),x.refetch();const o=K==="create"?s("providers.toast.createSuccess",{name:t.label||t.id}):s("providers.toast.updateSuccess",{name:t.label||t.id});a({title:o,variant:"success"})},pt=async t=>{const l=y.find(r=>r.id===t);if(l&&confirm(s("modelManagement.deleteEndpointConfirm",{label:l.label})))try{await fe.delete(t),u.invalidateQueries({queryKey:["custom-endpoints"]}),a({title:s("modelManagement.deleteEndpointSuccess"),variant:"success"}),m===t&&N("providers")}catch(r){const o=Ae(r);a({title:s("modelManagement.deleteEndpointError",{error:o.message}),variant:"error"})}},ze=async(t,l)=>{U(t.id);try{const r=l&&(l.headers||l.query)?{headers:l.headers&&Object.keys(l.headers).length>0?l.headers:void 0,query:l.query&&l.query.trim().length>0?l.query.trim():void 0}:void 0,o=await ae.post(`/api/providers/${t.id}/test`,r);o.data.ok?a({title:s("providers.toast.testSuccess"),description:s("providers.toast.testSuccessDesc",{status:o.data.status,duration:o.data.durationMs?`${o.data.durationMs} ms`:"—"}),variant:"success"}):a({title:s("providers.toast.testFailure",{message:`${o.data.status} ${o.data.statusText}`}),variant:"error"})}catch(r){a({title:s("providers.toast.testFailure",{message:r instanceof Error?r.message:"unknown"}),variant:"error"})}finally{U(null)}},gt=t=>{if(t.type==="anthropic"){const l=t.extraHeaders??{},r=new Map(xe.map(c=>[c.key.toLowerCase(),c])),o={};let n=!0;for(const c of xe){const b=Object.entries(l).find(([j])=>j.toLowerCase()===c.key.toLowerCase());if(b){const[j,D]=b;String(D??"")===c.value||(n=!1,o[j]=String(D??""))}}for(const[c,b]of Object.entries(l))r.has(c.toLowerCase())||(o[c]=String(b??""));_e(o),Oe(n),Fe(t),X(!0);return}ze(t)},Qe=()=>{X(!1),Fe(null),Oe(!0),_e({})},ft=async()=>{if(!De)return;const t={};if(Me)for(const o of xe)t[o.key]=o.value;const l=new Map(xe.map(o=>[o.key.toLowerCase(),o]));for(const[o,n]of Object.entries(He)){const c=o.toLowerCase();l.get(c)&&Me||(t[o]=n)}const r=De;Qe(),await ze(r,{headers:Object.keys(t).length>0?t:void 0,query:Me?"beta=true":void 0})},vt=async t=>{var D,A,z,he;if(!te()||!window.confirm(s("providers.confirm.delete",{name:t.label||t.id})))return;const r=H.filter(M=>M.id!==t.id),o=M=>{const be={};if(!M)return be;for(const[se,pe]of Object.entries(M)){if(!pe)continue;const[ge]=pe.split(":");ge&&ge===t.id||pe===t.id||(be[se]=pe)}return be},n=(p==null?void 0:p.endpointRouting)??{},c=o(((D=n.anthropic)==null?void 0:D.modelRoutes)??(p==null?void 0:p.modelRoutes)??{}),b=o(((A=n.openai)==null?void 0:A.modelRoutes)??{}),j={...p,providers:r,modelRoutes:c,endpointRouting:{anthropic:{defaults:((z=n.anthropic)==null?void 0:z.defaults)??p.defaults,modelRoutes:c},openai:{defaults:((he=n.openai)==null?void 0:he.defaults)??p.defaults,modelRoutes:b}}};try{await ae.put("/api/config",j),R(j),L({anthropic:G(c),openai:G(b)}),a({title:s("providers.toast.deleteSuccess",{name:t.label||t.id}),variant:"success"}),x.refetch()}catch(M){a({title:s("providers.toast.deleteFailure",{message:M instanceof Error?M.message:"unknown"}),variant:"error"})}},kt=t=>{L(l=>({...l,[t]:[...l[t]||[],{id:Ke(),source:"",target:""}]})),F(l=>({...l,[t]:null}))},jt=(t,l)=>{L(r=>{const o=r[t]||[];return o.some(n=>n.source.trim()===l.trim())?r:{...r,[t]:[...o,{id:Ke(),source:l,target:""}]}}),F(r=>({...r,[t]:null}))},Ce=(t,l,r,o)=>{L(n=>({...n,[t]:(n[t]||[]).map(c=>c.id===l?{...c,[r]:o}:c)})),F(n=>({...n,[t]:null}))},yt=(t,l)=>{L(r=>({...r,[t]:(r[t]||[]).filter(o=>o.id!==l)})),F(r=>({...r,[t]:null}))},Nt=t=>{var r,o;if(!p)return;const l=y.find(n=>n.id===t);if(l){const n=((r=l.routing)==null?void 0:r.modelRoutes)??{};L(c=>({...c,[t]:G(n)}))}else{const n=p.endpointRouting??{},c=t,b=c==="anthropic"?p.modelRoutes??{}:{},j=((o=n[c])==null?void 0:o.modelRoutes)??b;L(D=>({...D,[t]:G(j)}))}F(n=>({...n,[t]:null}))},wt=async t=>{var o;if(!te())return;const l=ee[t]||[],r={};for(const n of l){const c=n.source.trim(),b=n.target.trim();if(!(!c&&!b)){if(!c||!b){F(j=>({...j,[t]:s("settings.validation.routePair")}));return}if(r[c]){F(j=>({...j,[t]:s("settings.validation.routeDuplicate",{model:c})}));return}r[c]=b}}F(n=>({...n,[t]:null})),ce(t);try{const n=y.find(c=>c.id===t);if(n){const c={...n.routing||{},modelRoutes:r,defaults:((o=n.routing)==null?void 0:o.defaults)||p.defaults};await fe.update(t,{routing:c}),u.invalidateQueries({queryKey:["custom-endpoints"]}),a({title:s("modelManagement.toast.routesSaved"),variant:"success"})}else{const c=p.endpointRouting?{...p.endpointRouting}:{},b=t,j=c[b]??{defaults:p.defaults,modelRoutes:b==="anthropic"?p.modelRoutes??{}:{}},D={...j,defaults:j.defaults??p.defaults,modelRoutes:r},A={...c,[b]:D},z={...p,endpointRouting:A,modelRoutes:b==="anthropic"?r:p.modelRoutes??{}};await ae.put("/api/config",z),R(z),a({title:s("modelManagement.toast.routesSaved"),variant:"success"}),x.refetch()}L(c=>({...c,[t]:G(r)}))}catch(n){a({title:s("modelManagement.toast.routesSaveFailure",{message:n instanceof Error?n.message:"unknown"}),variant:"error"})}finally{ce(null)}},Mt=()=>e.jsxs("section",{className:Ye,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:Lt.default,children:s("providers.count",{count:dt})}),e.jsx("button",{type:"button",className:_,onClick:()=>x.refetch(),disabled:x.isFetching,children:x.isFetching?s("common.actions.refreshing"):s("providers.actions.refresh")}),e.jsx("button",{type:"button",className:re,onClick:xt,children:s("providers.actions.add")})]})]}),x.isPending||!p&&x.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")}):H.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:H.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(qt,{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:Xe.success,children:s("providers.card.defaultModel",{model:nt.get(t.id)??t.defaultModel})}):e.jsx("div",{className:Xe.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(l=>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:tt(l)})]},l.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:_,onClick:()=>ht(t),children:s("providers.actions.edit")}),e.jsx("button",{type:"button",onClick:()=>gt(t),disabled:P===t.id,className:P===t.id?`${_} opacity-60 cursor-not-allowed`:_,children:P===t.id?s("common.actions.testingConnection"):s("providers.actions.test")}),e.jsx("button",{type:"button",className:Le,onClick:()=>vt(t),children:s("providers.actions.delete")})]})]},t.id))})]}),Ct=t=>{const l=ye[t],r=Ne[t],o=i[t],n=w===t;return 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:r,onChange:c=>it(t,c.target.value),placeholder:s("modelManagement.presets.namePlaceholder"),className:ne,disabled:n}),e.jsx("button",{type:"button",onClick:()=>ct(t),className:re,disabled:n,children:s(n?"modelManagement.presets.saving":"modelManagement.presets.save")})]})]}),o?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:o}):null,l.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:l.map(c=>{const b=(S==null?void 0:S.endpoint)===t&&(S==null?void 0:S.name)===c.name,j=(T==null?void 0:T.endpoint)===t&&(T==null?void 0:T.name)===c.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:c.name}),e.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[e.jsx("button",{type:"button",onClick:()=>ut(t,c),className:b||j?`${_} opacity-60 cursor-not-allowed text-xs px-2 py-1`:`${re} text-xs px-2 py-1`,disabled:b||j,children:s(b?"modelManagement.presets.applying":"modelManagement.presets.apply")}),e.jsx("button",{type:"button",onClick:()=>mt(t,c),className:j||b?`${_} opacity-60 cursor-not-allowed text-xs px-2 py-1`:`${Le} text-xs px-2 py-1`,disabled:j||b,children:s(j?"modelManagement.presets.deleting":"modelManagement.presets.delete")})]})]},c.name)})})]})},Et=t=>{var he;const l=ee[t]||[],r=Re[t],o=d.find(M=>M.key===t),c=((he=o==null?void 0:o.protocols)==null?void 0:he.includes("anthropic"))??t==="anthropic"?Ft:Ht,b=Pe===t,j=(o==null?void 0:o.label)??s(`modelManagement.tabs.${t}`),D=(o==null?void 0:o.isSystem)===!1?o.description:s(`settings.routing.descriptionByEndpoint.${t}`),A=`route-source-${t}`,z=`route-target-${t}`;return e.jsxs("section",{className:Ye,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:j})}),e.jsx("p",{className:"max-w-3xl text-sm text-slate-600 dark:text-slate-400",children:D}),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:()=>kt(t),className:_,disabled:b,children:s("settings.routing.add")}),e.jsx("button",{type:"button",onClick:()=>Nt(t),className:_,disabled:b,children:s("common.actions.reset")}),e.jsx("button",{type:"button",onClick:()=>wt(t),className:re,disabled:b,children:s(b?"common.actions.saving":"modelManagement.actions.saveRoutes")})]})]}),Ct(t),r?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:r}):null,l.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:l.map((M,be)=>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:be+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:M.source,onChange:se=>Ce(t,M.id,"source",se.target.value),className:ne,placeholder:"claude-3.5-sonnet",list:A,disabled:b})]})}),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 se=M.target.trim(),ge=qe.some(Q=>Q.value===se)?se:"__custom";return e.jsxs(e.Fragment,{children:[e.jsxs("select",{value:ge,onChange:Q=>{const Ge=Q.target.value;Ge==="__custom"?Ce(t,M.id,"target",se):Ce(t,M.id,"target",Ge)},className:ot,disabled:b,children:[e.jsx("option",{value:"__custom",children:s("settings.routing.customTargetOption")}),qe.map(Q=>e.jsx("option",{value:Q.value,children:Q.label},`${z}-${Q.value}`))]}),ge==="__custom"&&e.jsx("input",{type:"text",value:M.target,onChange:Q=>Ce(t,M.id,"target",Q.target.value),className:ne,placeholder:"providerId:modelId",disabled:b})]})})()]})}),e.jsx("div",{className:"flex items-end",children:e.jsx("button",{type:"button",className:Le,onClick:()=>yt(t,M.id),disabled:b,children:s("settings.routing.remove")})})]})]},M.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:c.map(M=>e.jsx("button",{type:"button",onClick:()=>jt(t,M),className:_,disabled:b,children:M},`${t}-${M}`))})]})}),e.jsx("datalist",{id:A,children:c.map(M=>e.jsx("option",{value:M},`${A}-${M}`))})]})};return e.jsxs("div",{className:"flex flex-col gap-8",children:[e.jsx("div",{className:Ut,children:e.jsxs("div",{className:"flex items-start justify-between gap-4",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.jsxs("button",{onClick:()=>{je(void 0),ke(!0)},className:re,children:["+ ",s("modelManagement.addEndpoint")]})]})}),e.jsx("div",{className:"flex flex-wrap gap-4",children:d.map(t=>{const l=m===t.key;return e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>N(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 ${l?"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.canDelete&&e.jsx("button",{onClick:r=>{r.stopPropagation(),pt(t.key)},className:"absolute -top-2 -right-2 h-6 w-6 rounded-full bg-red-500 text-white hover:bg-red-600 flex items-center justify-center text-xs shadow-md",title:s("common.delete"),children:"×"})]},t.key)})}),m==="providers"?Mt():Et(m),e.jsx(Bt,{open:I,mode:K,provider:K==="edit"?k:void 0,existingProviderIds:H.map(t=>t.id).filter(t=>K==="edit"&&k?t!==k.id:!0),onClose:()=>{O(!1),C(void 0),B("create")},onSubmit:bt}),e.jsx(Vt,{open:ve,endpoint:ie,onClose:()=>{ke(!1),je(void 0)},onSuccess:()=>{u.invalidateQueries({queryKey:["custom-endpoints"]})}}),e.jsx(_t,{open:we,provider:De,options:xe,preservedExtras:He,usePreset:Me,onPresetChange:Oe,onConfirm:ft,onClose:Qe})]})}function _t({open:s,provider:a,options:u,usePreset:x,preservedExtras:h,onPresetChange:y,onConfirm:d,onClose:m}){const{t:N}=Se();return!s||!a?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:m,"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:N("providers.testDialog.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:N("providers.testDialog.subtitle",{name:a.label||a.id})})]}),e.jsx("p",{className:"mb-5 text-sm leading-relaxed text-slate-600 dark:text-slate-300",children:N("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:x,onChange:p=>y(p.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:N("providers.testDialog.presetLabel")}),e.jsx("p",{className:"text-xs leading-relaxed text-slate-500 dark:text-slate-400",children:N("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:N("providers.testDialog.presetPreviewSummary")}),e.jsx("div",{className:"mt-2 grid gap-1",children:u.map(p=>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:[p.key,": ",p.value]},p.key))})]})]})]})}),Object.keys(h).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:N("providers.testDialog.preservedInfo")}),e.jsx("div",{className:"grid gap-2",children:Object.entries(h).map(([p,R])=>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:[p,": ",R]},p))})]}):null,e.jsxs("footer",{className:"mt-6 flex justify-end gap-3",children:[e.jsx("button",{type:"button",onClick:m,className:_,children:N("providers.testDialog.cancel")}),e.jsx("button",{type:"button",onClick:()=>{d()},className:re,children:N("providers.testDialog.primary")})]})]})]})}function tt(s){return s.label&&s.label.trim().length>0?`${s.label} (${s.id})`:s.id}function qt({type:s}){const a={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:u,color:x}=a[s]||a.custom;return e.jsx("span",{className:`rounded-full ${x} px-2.5 py-1 text-xs font-semibold shadow-sm`,children:u})}function Vt({open:s,endpoint:a,onClose:u,onSuccess:x}){const{t:h}=Se(),{pushToast:y}=lt(),[d,m]=g.useState({id:"",label:"",paths:[{path:"",protocol:"openai-auto"}],enabled:!0});g.useEffect(()=>{if(a){let k;a.paths&&a.paths.length>0?k=a.paths:a.path&&a.protocol?k=[{path:a.path,protocol:a.protocol}]:k=[{path:"",protocol:"openai-auto"}],m({id:a.id,label:a.label,paths:k,enabled:a.enabled!==!1})}else m({id:"",label:"",paths:[{path:"",protocol:"openai-auto"}],enabled:!0})},[a,s]);const N=Ze({mutationFn:fe.create,onSuccess:()=>{y({title:h("modelManagement.createEndpointSuccess"),variant:"success"}),x(),u()},onError:k=>{const C=Ae(k);y({title:h("modelManagement.createEndpointError",{error:C.message}),variant:"error"})}}),p=Ze({mutationFn:k=>fe.update(k.id,k.updates),onSuccess:()=>{y({title:h("modelManagement.updateEndpointSuccess"),variant:"success"}),x(),u()},onError:k=>{const C=Ae(k);y({title:h("modelManagement.updateEndpointError",{error:C.message}),variant:"error"})}}),R=()=>{m({...d,paths:[...d.paths,{path:"",protocol:"anthropic"}]})},I=k=>{if(d.paths.length===1){y({title:h("modelManagement.atLeastOnePath"),variant:"error"});return}const C=d.paths.filter((P,U)=>U!==k);m({...d,paths:C})},O=(k,C,P)=>{const U=[...d.paths];U[k]={...U[k],[C]:P},m({...d,paths:U})},K=k=>{if(k.preventDefault(),!d.id.trim()||!d.label.trim()){y({title:h("modelManagement.endpointValidationError"),variant:"error"});return}for(const P of d.paths)if(!P.path.trim()){y({title:h("modelManagement.pathValidationError"),variant:"error"});return}const C=d.paths.map(P=>({path:P.path.trim(),protocol:P.protocol}));a?p.mutate({id:a.id,updates:{label:d.label.trim(),paths:C,enabled:d.enabled}}):N.mutate({id:d.id.trim(),label:d.label.trim(),paths:C,enabled:d.enabled})},B=N.isPending||p.isPending;return s?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 bg-black/50 dark:bg-black/70 z-40 transition-opacity",onClick:u}),e.jsx("div",{className:"fixed inset-y-0 right-0 w-full max-w-md bg-white dark:bg-gray-900 shadow-xl z-50 overflow-y-auto",children:e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsxs("div",{className:"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-800",children:[e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-gray-100",children:h(a?"modelManagement.editEndpoint":"modelManagement.createEndpoint")}),e.jsx("button",{onClick:u,className:"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",children:e.jsx("svg",{className:"h-6 w-6",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),e.jsxs("form",{onSubmit:K,className:"flex-1 p-6 space-y-6",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:[h("modelManagement.endpointId")," ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx("input",{type:"text",value:d.id,onChange:k=>m({...d,id:k.target.value}),className:ne,placeholder:h("modelManagement.endpointIdPlaceholder"),disabled:!!a,required:!0}),e.jsx("p",{className:"mt-1 text-xs text-gray-500 dark:text-gray-400",children:h("modelManagement.endpointIdHint")})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:[h("modelManagement.endpointLabel")," ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsx("input",{type:"text",value:d.label,onChange:k=>m({...d,label:k.target.value}),className:ne,placeholder:h("modelManagement.endpointLabelPlaceholder"),required:!0})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300",children:[h("modelManagement.endpointPaths")," ",e.jsx("span",{className:"text-red-500",children:"*"})]}),e.jsxs("button",{type:"button",onClick:R,className:"text-sm text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300",children:["+ ",h("modelManagement.addPath")]})]}),e.jsx("div",{className:"space-y-3",children:d.paths.map((k,C)=>e.jsxs("div",{className:"p-3 border border-gray-200 dark:border-gray-700 rounded-lg space-y-2",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("input",{type:"text",value:k.path,onChange:P=>O(C,"path",P.target.value),className:ne,placeholder:h("modelManagement.endpointPathPlaceholder"),required:!0}),e.jsxs("select",{value:k.protocol,onChange:P=>O(C,"protocol",P.target.value),className:ot,required:!0,children:[e.jsx("option",{value:"anthropic",children:h("modelManagement.protocolAnthropic")}),e.jsx("option",{value:"openai-auto",children:h("modelManagement.protocolOpenAI")})]})]}),d.paths.length>1&&e.jsx("button",{type:"button",onClick:()=>I(C),className:"text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 mt-1",title:h("modelManagement.removePath"),children:e.jsx("svg",{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})})})]}),C===0&&e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:h("modelManagement.endpointPathHint")})]},C))})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"checkbox",id:"enabled",checked:d.enabled,onChange:k=>m({...d,enabled:k.target.checked}),className:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-gray-700 dark:bg-gray-800"}),e.jsx("label",{htmlFor:"enabled",className:"text-sm text-gray-700 dark:text-gray-300",children:h("modelManagement.endpointEnabled")})]}),!a&&e.jsx("div",{className:"rounded-lg bg-blue-50 dark:bg-blue-900/20 p-4",children:e.jsx("p",{className:"text-sm text-blue-800 dark:text-blue-300",children:h("modelManagement.endpointRoutingHint")})})]}),e.jsxs("div",{className:"flex gap-3 p-6 border-t border-gray-200 dark:border-gray-800",children:[e.jsx("button",{type:"button",onClick:u,className:`${_} flex-1`,disabled:B,children:h("common.cancel")}),e.jsx("button",{type:"submit",onClick:K,className:`${re} flex-1`,disabled:B,children:h(B?"common.saving":a?"common.save":"common.create")})]})]})})]}):null}export{Wt as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as e,d as s,a4 as u,m,a5 as h,D as f,a6 as g,a7 as o,H as p}from"./index-
|
|
1
|
+
import{j as e,d as s,a4 as u,m,a5 as h,D as f,a6 as g,a7 as o,H as p}from"./index-B-8NzzZq.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 +1 @@
|
|
|
1
|
-
import{u as te,a as ae,r as u,j as e,d as c,T as re,L as O,b as N,k as C,E as V,K as y,m as h,J as B}from"./index-CMmlZ8am.js";import{u as _}from"./useApiQuery-qpXuOM9g.js";import{P as ne,a as w}from"./PageSection-819eIHwY.js";import{C as le}from"./copy-dJsIfcXG.js";const oe=[{value:"fatal",labelKey:"fatal"},{value:"error",labelKey:"error"},{value:"warn",labelKey:"warn"},{value:"info",labelKey:"info"},{value:"debug",labelKey:"debug"},{value:"trace",labelKey:"trace"}];function me(){const{t:s}=te(),{pushToast:g}=ae(),n=_(["config","info"],{url:"/api/config/info",method:"GET"}),x=_(["auth","web"],{url:"/api/auth/web",method:"GET"}),[r,F]=u.useState(null),[L,G]=u.useState(""),[o,p]=u.useState({port:"",host:"",logRetentionDays:"",storeRequestPayloads:!0,storeResponsePayloads:!0,logLevel:"info",requestLogging:!0,responseLogging:!0,bodyLimitMb:"10",enableRoutingFallback:!1}),[b,q]=u.useState({}),[P,E]=u.useState(!1),[S,A]=u.useState(!1),[M,D]=u.useState(!1),[i,H]=u.useState(null),[l,f]=u.useState({enabled:!1,username:"",password:"",confirmPassword:""}),[k,v]=u.useState({}),[R,T]=u.useState(!1),Q=u.useMemo(()=>{if(!r)return null;const t=r.defaults;if(!t)return null;const a=[];return t.completion&&a.push(s("settings.defaults.completion",{model:t.completion})),t.reasoning&&a.push(s("settings.defaults.reasoning",{model:t.reasoning})),t.background&&a.push(s("settings.defaults.background",{model:t.background})),a.length>0?a.join(" | "):s("settings.defaults.none")},[r,s]),K=u.useMemo(()=>l.enabled?i!=null&&i.hasPassword?l.username.trim()!==((i==null?void 0:i.username)??""):!0:!1,[l.enabled,l.username,i]);u.useEffect(()=>{if(n.data){F(n.data.config),G(n.data.path);const t=n.data.config.storePayloads,a=d=>typeof d=="boolean"?d:typeof t=="boolean"?t:!0;p({port:String(n.data.config.port??""),host:n.data.config.host??"127.0.0.1",logRetentionDays:String(n.data.config.logRetentionDays??30),storeRequestPayloads:a(n.data.config.storeRequestPayloads),storeResponsePayloads:a(n.data.config.storeResponsePayloads),logLevel:n.data.config.logLevel??"info",requestLogging:n.data.config.requestLogging!==!1,responseLogging:n.data.config.responseLogging??n.data.config.requestLogging!==!1,bodyLimitMb:(()=>{const d=n.data.config.bodyLimit;return typeof d=="number"&&Number.isFinite(d)&&d>0?String(Math.max(1,Math.round(d/(1024*1024)))):"10"})(),enableRoutingFallback:n.data.config.enableRoutingFallback===!0})}},[n.data]),u.useEffect(()=>{x.data&&(H(x.data),f({enabled:x.data.enabled,username:x.data.username??"",password:"",confirmPassword:""}),v({}))},[x.data]),u.useEffect(()=>{n.isError&&n.error&&g({title:s("settings.toast.loadFailure",{message:n.error.message}),variant:"error"})},[n.isError,n.error,g,s]),u.useEffect(()=>{x.isError&&x.error&&g({title:s("settings.toast.authLoadFailure",{message:x.error.message}),variant:"error"})},[x.isError,x.error,g,s]);const j=t=>a=>{p(d=>({...d,[t]:a}))},I=()=>{const t={},a=Number(o.port);(!Number.isFinite(a)||a<1||a>65535)&&(t.port=s("settings.validation.port"));const d=Number(o.logRetentionDays);(!Number.isFinite(d)||d<1||d>365)&&(t.logRetentionDays=s("settings.validation.retention"));const m=Number(o.bodyLimitMb);return(!Number.isFinite(m)||m<1||m>2048)&&(t.bodyLimitMb=s("settings.validation.bodyLimit")),q(t),Object.keys(t).length===0},J=()=>{const t={},a=l.username.trim(),d=i?a!==(i.username??""):!0,m=l.enabled&&(!(i!=null&&i.hasPassword)||d);return l.enabled&&!a&&(t.username=s("settings.auth.validation.username")),l.password&&l.password.length<6&&(t.password=s("settings.auth.validation.minLength")),m&&!l.password&&(t.password=s("settings.auth.validation.passwordRequired")),(l.password||l.confirmPassword)&&l.password!==l.confirmPassword&&(t.confirmPassword=s("settings.auth.validation.confirmMismatch")),v(t),Object.keys(t).length===0},W=async()=>{if(!r){g({title:s("settings.toast.loadFailure",{message:s("settings.toast.missingConfig")}),variant:"error"});return}if(I()){E(!0);try{const t=Number(o.port),a=Number(o.logRetentionDays),d=Number(o.bodyLimitMb),m={...r,port:t,host:o.host.trim()||void 0,logRetentionDays:a,storeRequestPayloads:o.storeRequestPayloads,storeResponsePayloads:o.storeResponsePayloads,logLevel:o.logLevel,requestLogging:o.requestLogging,responseLogging:o.responseLogging,bodyLimit:Math.max(1,Math.floor(d*1024*1024)),enableRoutingFallback:o.enableRoutingFallback},{webAuth:ie,...se}=m;await N.put("/api/config",se),F({...m,webAuth:r.webAuth}),g({title:s("settings.toast.saveSuccess"),variant:"success"}),n.refetch()}catch(t){g({title:s("settings.toast.saveFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{E(!1)}}},$=()=>{r&&(p({port:String(r.port??""),host:r.host??"",logRetentionDays:String(r.logRetentionDays??30),storeRequestPayloads:typeof r.storeRequestPayloads=="boolean"?r.storeRequestPayloads:typeof r.storePayloads=="boolean"?r.storePayloads:!0,storeResponsePayloads:typeof r.storeResponsePayloads=="boolean"?r.storeResponsePayloads:typeof r.storePayloads=="boolean"?r.storePayloads:!0,logLevel:r.logLevel??"info",requestLogging:r.requestLogging!==!1,responseLogging:r.responseLogging??r.requestLogging!==!1,bodyLimitMb:(()=>{const t=r.bodyLimit;return typeof t=="number"&&Number.isFinite(t)&&t>0?String(Math.max(1,Math.round(t/(1024*1024)))):"10"})(),enableRoutingFallback:r.enableRoutingFallback===!0}),q({}))},z=async()=>{var t;if(J()){T(!0);try{const a={enabled:l.enabled,username:l.username.trim()||void 0};l.password&&(a.password=l.password);const m=(t=(await N.post("/api/auth/web",a)).data)==null?void 0:t.auth;m&&(H(m),f({enabled:m.enabled,username:m.username??"",password:"",confirmPassword:""}),v({})),g({title:s("settings.auth.toast.success"),variant:"success"}),x.refetch()}catch(a){const d=a instanceof Error?a.message:"unknown";g({title:s("settings.auth.toast.failure",{message:d}),variant:"error"})}finally{T(!1)}}},U=()=>{i&&(f({enabled:i.enabled,username:i.username??"",password:"",confirmPassword:""}),v({}))},X=async()=>{if(!L){g({title:s("settings.toast.copyFailure",{message:s("settings.file.unknown")}),variant:"error"});return}try{await navigator.clipboard.writeText(L),g({title:s("settings.toast.copySuccess"),variant:"success"})}catch(t){g({title:s("settings.toast.copyFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}},Y=async()=>{A(!0);try{const a=(await N.post("/api/logs/cleanup")).data.deleted??0;g({title:a>0?s("settings.toast.cleanupSuccess",{count:a}):s("settings.toast.cleanupNone"),variant:"success"})}catch(t){g({title:s("settings.toast.cleanupFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{A(!1)}},Z=async()=>{D(!0);try{const t=await N.post("/api/logs/clear"),{deleted:a,metricsCleared:d}=t.data;g({title:s("settings.toast.clearAllSuccess",{logs:a,metrics:d}),variant:"success"})}catch(t){g({title:s("settings.toast.clearAllFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{D(!1)}},ee=n.isPending||!r&&n.isFetching;return e.jsxs("div",{className:"flex flex-col gap-8",children:[e.jsx(ne,{icon:e.jsx(re,{className:"h-6 w-6","aria-hidden":"true"}),title:s("settings.title"),description:s("settings.description"),actions:r?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{type:"button",onClick:$,className:c(C,"h-10 rounded-full px-4"),disabled:P,children:s("common.actions.reset")}),e.jsx("button",{type:"button",onClick:W,className:c(V,"h-10 rounded-full px-4"),disabled:P,children:s(P?"common.actions.saving":"common.actions.save")})]}):null}),ee?e.jsx(w,{className:"flex min-h-[220px] items-center justify-center",children:e.jsx(O,{})}):r?e.jsxs(e.Fragment,{children:[e.jsxs(w,{title:s("settings.sections.basics"),contentClassName:"grid w-full gap-5 md:grid-cols-2",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:s("settings.fields.port")}),e.jsx("input",{type:"number",min:1,max:65535,value:o.port,onChange:t=>j("port")(t.target.value),className:c(y,"h-11"),"aria-invalid":!!b.port}),b.port?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:b.port}):null]}),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:s("settings.fields.host")}),e.jsx("input",{value:o.host,onChange:t=>j("host")(t.target.value),placeholder:s("settings.fields.hostPlaceholder"),className:c(y,"h-11")})]}),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:s("settings.fields.retention")}),e.jsx("input",{type:"number",min:1,max:365,value:o.logRetentionDays,onChange:t=>j("logRetentionDays")(t.target.value),className:c(y,"h-11"),"aria-invalid":!!b.logRetentionDays}),b.logRetentionDays?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:b.logRetentionDays}):null]}),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:s("settings.fields.bodyLimit")}),e.jsx("input",{type:"number",min:1,max:2048,value:o.bodyLimitMb,onChange:t=>j("bodyLimitMb")(t.target.value),className:c(y,"h-11"),"aria-invalid":!!b.bodyLimitMb}),e.jsx("p",{className:c(h,"text-[11px] leading-relaxed"),children:s("settings.fields.bodyLimitHint")}),b.bodyLimitMb?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:b.bodyLimitMb}):null]}),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:s("settings.fields.logLevel")}),e.jsx("select",{value:o.logLevel,onChange:t=>p(a=>({...a,logLevel:t.target.value})),className:"h-10",children:oe.map(t=>e.jsx("option",{value:t.value,children:s(`settings.fields.logLevelOption.${t.labelKey}`)},t.value))})]}),e.jsxs("div",{className:"md:col-span-2 grid gap-4 sm:grid-cols-2",children:[e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 shadow-sm shadow-slate-200/60 transition hover:border-slate-300 dark:border-slate-700/60 dark:bg-slate-900/70 dark:hover:border-slate-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.storeRequestPayloads,onChange:t=>p(a=>({...a,storeRequestPayloads:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-700 dark:text-slate-100",children:s("settings.fields.storeRequestPayloads")}),e.jsx("p",{className:c(h,"text-xs"),children:s("settings.fields.storeRequestPayloadsHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 shadow-sm shadow-slate-200/60 transition hover:border-slate-300 dark:border-slate-700/60 dark:bg-slate-900/70 dark:hover:border-slate-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.storeResponsePayloads,onChange:t=>p(a=>({...a,storeResponsePayloads:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-700 dark:text-slate-100",children:s("settings.fields.storeResponsePayloads")}),e.jsx("p",{className:c(h,"text-xs"),children:s("settings.fields.storeResponsePayloadsHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 shadow-sm shadow-slate-200/60 transition hover:border-slate-300 dark:border-slate-700/60 dark:bg-slate-900/70 dark:hover:border-slate-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.requestLogging,onChange:t=>p(a=>({...a,requestLogging:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-700 dark:text-slate-100",children:s("settings.fields.requestLogging")}),e.jsx("p",{className:c(h,"text-xs"),children:s("settings.fields.requestLoggingHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 shadow-sm shadow-slate-200/60 transition hover:border-slate-300 dark:border-slate-700/60 dark:bg-slate-900/70 dark:hover:border-slate-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.responseLogging,onChange:t=>p(a=>({...a,responseLogging:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-700 dark:text-slate-100",children:s("settings.fields.responseLogging")}),e.jsx("p",{className:c(h,"text-xs"),children:s("settings.fields.responseLoggingHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-amber-200/70 bg-amber-50/80 px-4 py-3 shadow-sm shadow-amber-200/60 transition hover:border-amber-300 dark:border-amber-700/60 dark:bg-amber-900/30 dark:hover:border-amber-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.enableRoutingFallback,onChange:t=>p(a=>({...a,enableRoutingFallback:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-amber-300 text-amber-600 focus:ring-amber-400 dark:border-amber-500"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-amber-700 dark:text-amber-200",children:s("settings.fields.enableRoutingFallback")}),e.jsx("p",{className:c(h,"text-xs text-amber-800/80 dark:text-amber-200/80"),children:s("settings.fields.enableRoutingFallbackHint")})]})]})]}),e.jsxs("div",{className:"md:col-span-2 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 text-sm text-slate-700 shadow-sm shadow-slate-200/60 dark:border-slate-700/60 dark:bg-slate-900/70 dark:text-slate-200",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("settings.fields.defaults")}),e.jsx("p",{className:"mt-2 text-sm",children:Q??s("settings.defaults.none")})]})]}),e.jsx(w,{title:s("settings.sections.security"),description:s("settings.auth.description"),contentClassName:"space-y-5",children:x.isPending&&!i?e.jsx("div",{className:"flex min-h-[120px] items-center justify-center",children:e.jsx(O,{})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"rounded-2xl border border-slate-200/70 bg-white/90 p-5 shadow-sm shadow-slate-200/50 transition dark:border-slate-700/60 dark:bg-slate-900/80 dark:shadow-slate-900/40",children:e.jsxs("label",{className:"flex cursor-pointer select-none items-start gap-3",children:[e.jsx("input",{type:"checkbox",checked:l.enabled,onChange:t=>f(a=>({...a,enabled:t.target.checked})),className:"mt-1 h-5 w-5 rounded border-slate-300 bg-white text-blue-600 shadow-sm transition focus:ring-blue-400/40 dark:border-slate-600 dark:bg-slate-900 dark:text-blue-200"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-800 dark:text-slate-100",children:s("settings.auth.enable")}),e.jsx("p",{className:c(h,"text-xs leading-relaxed"),children:s("settings.auth.enableHint")}),e.jsxs("div",{className:"flex flex-wrap gap-2 text-[11px] font-medium text-slate-500 dark:text-slate-400",children:[e.jsx("span",{className:"rounded-full bg-slate-100/90 px-3 py-1 shadow-sm shadow-slate-200/40 dark:bg-slate-800/70",children:"/ui"}),e.jsx("span",{className:"rounded-full bg-slate-100/90 px-3 py-1 shadow-sm shadow-slate-200/40 dark:bg-slate-800/70",children:"/api/*"}),e.jsx("span",{className:"rounded-full bg-slate-100/90 px-3 py-1 shadow-sm shadow-slate-200/40 dark:bg-slate-800/70",children:"Cookie Session"})]})]})]})}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-[minmax(0,1fr)_minmax(0,0.85fr)]",children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:col-span-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("settings.auth.username")}),e.jsx("input",{value:l.username,onChange:t=>f(a=>({...a,username:t.target.value})),placeholder:s("settings.auth.usernamePlaceholder"),className:c(y,"h-11 font-medium")}),k.username?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:k.username}):null]}),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:s("settings.auth.password")}),e.jsx("input",{type:"password",value:l.password,disabled:!l.enabled,onChange:t=>f(a=>({...a,password:t.target.value})),placeholder:s("settings.auth.passwordPlaceholder"),className:c(y,"h-11 disabled:cursor-not-allowed disabled:bg-slate-100 dark:disabled:bg-slate-900/40")}),k.password?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:k.password}):e.jsx("span",{className:c(h,"text-xs leading-relaxed"),children:s(K?"settings.auth.passwordHintRequired":"settings.auth.passwordHintOptional")})]}),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:s("settings.auth.confirmPassword")}),e.jsx("input",{type:"password",value:l.confirmPassword,disabled:!l.enabled,onChange:t=>f(a=>({...a,confirmPassword:t.target.value})),placeholder:s("settings.auth.confirmPasswordPlaceholder"),className:c(y,"h-11 disabled:cursor-not-allowed disabled:bg-slate-100 dark:disabled:bg-slate-900/40")}),k.confirmPassword?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:k.confirmPassword}):null]})]}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"rounded-2xl border border-slate-200/70 bg-white/95 px-5 py-4 text-sm shadow-sm shadow-slate-200/40 dark:border-slate-700/60 dark:bg-slate-900/75 dark:text-slate-200 dark:shadow-slate-900/40",children:[e.jsx("div",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500/90 dark:text-slate-400",children:s("settings.auth.status")}),e.jsx("div",{className:"mt-2 text-base font-semibold text-slate-800 dark:text-slate-100",children:i!=null&&i.enabled?s("settings.auth.statusEnabled"):s("settings.auth.statusDisabled")}),i!=null&&i.username?e.jsxs("div",{className:"mt-3 rounded-2xl bg-blue-50/80 px-3 py-2 text-xs font-medium text-blue-700 shadow-sm shadow-blue-200/40 dark:bg-blue-500/20 dark:text-blue-100",children:[s("settings.auth.username"),": ",i.username]}):null]}),e.jsx("div",{className:"rounded-2xl border border-slate-200/60 bg-slate-50/80 px-5 py-4 text-xs leading-relaxed text-slate-600 shadow-sm shadow-slate-200/40 dark:border-slate-700/50 dark:bg-slate-800/60 dark:text-slate-300",children:s(K?"settings.auth.passwordHintRequired":"settings.auth.passwordHintOptional")})]})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-3",children:[e.jsx("button",{type:"button",onClick:z,className:c(V,"h-10 rounded-full px-6"),disabled:R,children:s(R?"common.actions.saving":"settings.auth.actions.save")}),e.jsx("button",{type:"button",onClick:U,className:c(C,"h-10 rounded-full px-4"),disabled:R,children:s("common.actions.reset")})]})]})}),e.jsx(w,{title:s("settings.sections.configFile"),description:s("settings.file.description"),actions:e.jsxs("button",{type:"button",onClick:X,className:c(C,"h-10 rounded-full px-4"),children:[e.jsx(le,{className:"h-4 w-4","aria-hidden":"true"}),s("common.actions.copy")]}),contentClassName:"gap-3",children:e.jsx("code",{className:"block break-all rounded-2xl border border-slate-200/60 bg-slate-100 px-4 py-3 text-xs text-slate-700 dark:border-slate-700/60 dark:bg-slate-900 dark:text-slate-200",children:L||s("settings.file.unknown")})}),e.jsxs(w,{title:s("settings.sections.cleanup"),description:s("settings.cleanup.description"),contentClassName:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-wrap gap-3",children:[e.jsx("button",{type:"button",onClick:Y,className:c(B,"px-5"),disabled:S,children:s(S?"common.actions.cleaning":"common.actions.cleanup")}),e.jsx("button",{type:"button",onClick:Z,className:c(B,"px-5 border-red-500/70 bg-red-600 text-white hover:bg-red-600/90 dark:border-red-500 dark:bg-red-500 dark:text-white"),disabled:M,children:s(M?"settings.cleanup.clearingAll":"settings.cleanup.clearAll")})]}),e.jsx("p",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:s("settings.cleanup.clearAllWarning")})]})]}):e.jsx(w,{children:e.jsx("p",{className:"text-sm font-medium text-red-500 dark:text-red-300",children:s("settings.toast.missingConfig")})})]})}export{me as default};
|
|
1
|
+
import{u as te,a as ae,r as u,j as e,d as c,T as re,L as O,b as N,k as C,E as V,K as y,m as h,J as B}from"./index-B-8NzzZq.js";import{u as _}from"./useApiQuery-DZHaAgf7.js";import{P as ne,a as w}from"./PageSection-BbmHOMiD.js";import{C as le}from"./copy-D50F736h.js";const oe=[{value:"fatal",labelKey:"fatal"},{value:"error",labelKey:"error"},{value:"warn",labelKey:"warn"},{value:"info",labelKey:"info"},{value:"debug",labelKey:"debug"},{value:"trace",labelKey:"trace"}];function me(){const{t:s}=te(),{pushToast:g}=ae(),n=_(["config","info"],{url:"/api/config/info",method:"GET"}),x=_(["auth","web"],{url:"/api/auth/web",method:"GET"}),[r,F]=u.useState(null),[L,G]=u.useState(""),[o,p]=u.useState({port:"",host:"",logRetentionDays:"",storeRequestPayloads:!0,storeResponsePayloads:!0,logLevel:"info",requestLogging:!0,responseLogging:!0,bodyLimitMb:"10",enableRoutingFallback:!1}),[b,q]=u.useState({}),[P,E]=u.useState(!1),[S,A]=u.useState(!1),[M,D]=u.useState(!1),[i,H]=u.useState(null),[l,f]=u.useState({enabled:!1,username:"",password:"",confirmPassword:""}),[k,v]=u.useState({}),[R,T]=u.useState(!1),Q=u.useMemo(()=>{if(!r)return null;const t=r.defaults;if(!t)return null;const a=[];return t.completion&&a.push(s("settings.defaults.completion",{model:t.completion})),t.reasoning&&a.push(s("settings.defaults.reasoning",{model:t.reasoning})),t.background&&a.push(s("settings.defaults.background",{model:t.background})),a.length>0?a.join(" | "):s("settings.defaults.none")},[r,s]),K=u.useMemo(()=>l.enabled?i!=null&&i.hasPassword?l.username.trim()!==((i==null?void 0:i.username)??""):!0:!1,[l.enabled,l.username,i]);u.useEffect(()=>{if(n.data){F(n.data.config),G(n.data.path);const t=n.data.config.storePayloads,a=d=>typeof d=="boolean"?d:typeof t=="boolean"?t:!0;p({port:String(n.data.config.port??""),host:n.data.config.host??"127.0.0.1",logRetentionDays:String(n.data.config.logRetentionDays??30),storeRequestPayloads:a(n.data.config.storeRequestPayloads),storeResponsePayloads:a(n.data.config.storeResponsePayloads),logLevel:n.data.config.logLevel??"info",requestLogging:n.data.config.requestLogging!==!1,responseLogging:n.data.config.responseLogging??n.data.config.requestLogging!==!1,bodyLimitMb:(()=>{const d=n.data.config.bodyLimit;return typeof d=="number"&&Number.isFinite(d)&&d>0?String(Math.max(1,Math.round(d/(1024*1024)))):"10"})(),enableRoutingFallback:n.data.config.enableRoutingFallback===!0})}},[n.data]),u.useEffect(()=>{x.data&&(H(x.data),f({enabled:x.data.enabled,username:x.data.username??"",password:"",confirmPassword:""}),v({}))},[x.data]),u.useEffect(()=>{n.isError&&n.error&&g({title:s("settings.toast.loadFailure",{message:n.error.message}),variant:"error"})},[n.isError,n.error,g,s]),u.useEffect(()=>{x.isError&&x.error&&g({title:s("settings.toast.authLoadFailure",{message:x.error.message}),variant:"error"})},[x.isError,x.error,g,s]);const j=t=>a=>{p(d=>({...d,[t]:a}))},I=()=>{const t={},a=Number(o.port);(!Number.isFinite(a)||a<1||a>65535)&&(t.port=s("settings.validation.port"));const d=Number(o.logRetentionDays);(!Number.isFinite(d)||d<1||d>365)&&(t.logRetentionDays=s("settings.validation.retention"));const m=Number(o.bodyLimitMb);return(!Number.isFinite(m)||m<1||m>2048)&&(t.bodyLimitMb=s("settings.validation.bodyLimit")),q(t),Object.keys(t).length===0},J=()=>{const t={},a=l.username.trim(),d=i?a!==(i.username??""):!0,m=l.enabled&&(!(i!=null&&i.hasPassword)||d);return l.enabled&&!a&&(t.username=s("settings.auth.validation.username")),l.password&&l.password.length<6&&(t.password=s("settings.auth.validation.minLength")),m&&!l.password&&(t.password=s("settings.auth.validation.passwordRequired")),(l.password||l.confirmPassword)&&l.password!==l.confirmPassword&&(t.confirmPassword=s("settings.auth.validation.confirmMismatch")),v(t),Object.keys(t).length===0},W=async()=>{if(!r){g({title:s("settings.toast.loadFailure",{message:s("settings.toast.missingConfig")}),variant:"error"});return}if(I()){E(!0);try{const t=Number(o.port),a=Number(o.logRetentionDays),d=Number(o.bodyLimitMb),m={...r,port:t,host:o.host.trim()||void 0,logRetentionDays:a,storeRequestPayloads:o.storeRequestPayloads,storeResponsePayloads:o.storeResponsePayloads,logLevel:o.logLevel,requestLogging:o.requestLogging,responseLogging:o.responseLogging,bodyLimit:Math.max(1,Math.floor(d*1024*1024)),enableRoutingFallback:o.enableRoutingFallback},{webAuth:ie,...se}=m;await N.put("/api/config",se),F({...m,webAuth:r.webAuth}),g({title:s("settings.toast.saveSuccess"),variant:"success"}),n.refetch()}catch(t){g({title:s("settings.toast.saveFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{E(!1)}}},$=()=>{r&&(p({port:String(r.port??""),host:r.host??"",logRetentionDays:String(r.logRetentionDays??30),storeRequestPayloads:typeof r.storeRequestPayloads=="boolean"?r.storeRequestPayloads:typeof r.storePayloads=="boolean"?r.storePayloads:!0,storeResponsePayloads:typeof r.storeResponsePayloads=="boolean"?r.storeResponsePayloads:typeof r.storePayloads=="boolean"?r.storePayloads:!0,logLevel:r.logLevel??"info",requestLogging:r.requestLogging!==!1,responseLogging:r.responseLogging??r.requestLogging!==!1,bodyLimitMb:(()=>{const t=r.bodyLimit;return typeof t=="number"&&Number.isFinite(t)&&t>0?String(Math.max(1,Math.round(t/(1024*1024)))):"10"})(),enableRoutingFallback:r.enableRoutingFallback===!0}),q({}))},z=async()=>{var t;if(J()){T(!0);try{const a={enabled:l.enabled,username:l.username.trim()||void 0};l.password&&(a.password=l.password);const m=(t=(await N.post("/api/auth/web",a)).data)==null?void 0:t.auth;m&&(H(m),f({enabled:m.enabled,username:m.username??"",password:"",confirmPassword:""}),v({})),g({title:s("settings.auth.toast.success"),variant:"success"}),x.refetch()}catch(a){const d=a instanceof Error?a.message:"unknown";g({title:s("settings.auth.toast.failure",{message:d}),variant:"error"})}finally{T(!1)}}},U=()=>{i&&(f({enabled:i.enabled,username:i.username??"",password:"",confirmPassword:""}),v({}))},X=async()=>{if(!L){g({title:s("settings.toast.copyFailure",{message:s("settings.file.unknown")}),variant:"error"});return}try{await navigator.clipboard.writeText(L),g({title:s("settings.toast.copySuccess"),variant:"success"})}catch(t){g({title:s("settings.toast.copyFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}},Y=async()=>{A(!0);try{const a=(await N.post("/api/logs/cleanup")).data.deleted??0;g({title:a>0?s("settings.toast.cleanupSuccess",{count:a}):s("settings.toast.cleanupNone"),variant:"success"})}catch(t){g({title:s("settings.toast.cleanupFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{A(!1)}},Z=async()=>{D(!0);try{const t=await N.post("/api/logs/clear"),{deleted:a,metricsCleared:d}=t.data;g({title:s("settings.toast.clearAllSuccess",{logs:a,metrics:d}),variant:"success"})}catch(t){g({title:s("settings.toast.clearAllFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{D(!1)}},ee=n.isPending||!r&&n.isFetching;return e.jsxs("div",{className:"flex flex-col gap-8",children:[e.jsx(ne,{icon:e.jsx(re,{className:"h-6 w-6","aria-hidden":"true"}),title:s("settings.title"),description:s("settings.description"),actions:r?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{type:"button",onClick:$,className:c(C,"h-10 rounded-full px-4"),disabled:P,children:s("common.actions.reset")}),e.jsx("button",{type:"button",onClick:W,className:c(V,"h-10 rounded-full px-4"),disabled:P,children:s(P?"common.actions.saving":"common.actions.save")})]}):null}),ee?e.jsx(w,{className:"flex min-h-[220px] items-center justify-center",children:e.jsx(O,{})}):r?e.jsxs(e.Fragment,{children:[e.jsxs(w,{title:s("settings.sections.basics"),contentClassName:"grid w-full gap-5 md:grid-cols-2",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:s("settings.fields.port")}),e.jsx("input",{type:"number",min:1,max:65535,value:o.port,onChange:t=>j("port")(t.target.value),className:c(y,"h-11"),"aria-invalid":!!b.port}),b.port?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:b.port}):null]}),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:s("settings.fields.host")}),e.jsx("input",{value:o.host,onChange:t=>j("host")(t.target.value),placeholder:s("settings.fields.hostPlaceholder"),className:c(y,"h-11")})]}),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:s("settings.fields.retention")}),e.jsx("input",{type:"number",min:1,max:365,value:o.logRetentionDays,onChange:t=>j("logRetentionDays")(t.target.value),className:c(y,"h-11"),"aria-invalid":!!b.logRetentionDays}),b.logRetentionDays?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:b.logRetentionDays}):null]}),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:s("settings.fields.bodyLimit")}),e.jsx("input",{type:"number",min:1,max:2048,value:o.bodyLimitMb,onChange:t=>j("bodyLimitMb")(t.target.value),className:c(y,"h-11"),"aria-invalid":!!b.bodyLimitMb}),e.jsx("p",{className:c(h,"text-[11px] leading-relaxed"),children:s("settings.fields.bodyLimitHint")}),b.bodyLimitMb?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:b.bodyLimitMb}):null]}),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:s("settings.fields.logLevel")}),e.jsx("select",{value:o.logLevel,onChange:t=>p(a=>({...a,logLevel:t.target.value})),className:"h-10",children:oe.map(t=>e.jsx("option",{value:t.value,children:s(`settings.fields.logLevelOption.${t.labelKey}`)},t.value))})]}),e.jsxs("div",{className:"md:col-span-2 grid gap-4 sm:grid-cols-2",children:[e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 shadow-sm shadow-slate-200/60 transition hover:border-slate-300 dark:border-slate-700/60 dark:bg-slate-900/70 dark:hover:border-slate-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.storeRequestPayloads,onChange:t=>p(a=>({...a,storeRequestPayloads:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-700 dark:text-slate-100",children:s("settings.fields.storeRequestPayloads")}),e.jsx("p",{className:c(h,"text-xs"),children:s("settings.fields.storeRequestPayloadsHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 shadow-sm shadow-slate-200/60 transition hover:border-slate-300 dark:border-slate-700/60 dark:bg-slate-900/70 dark:hover:border-slate-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.storeResponsePayloads,onChange:t=>p(a=>({...a,storeResponsePayloads:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-700 dark:text-slate-100",children:s("settings.fields.storeResponsePayloads")}),e.jsx("p",{className:c(h,"text-xs"),children:s("settings.fields.storeResponsePayloadsHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 shadow-sm shadow-slate-200/60 transition hover:border-slate-300 dark:border-slate-700/60 dark:bg-slate-900/70 dark:hover:border-slate-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.requestLogging,onChange:t=>p(a=>({...a,requestLogging:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-700 dark:text-slate-100",children:s("settings.fields.requestLogging")}),e.jsx("p",{className:c(h,"text-xs"),children:s("settings.fields.requestLoggingHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 shadow-sm shadow-slate-200/60 transition hover:border-slate-300 dark:border-slate-700/60 dark:bg-slate-900/70 dark:hover:border-slate-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.responseLogging,onChange:t=>p(a=>({...a,responseLogging:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-400 dark:border-slate-600"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-700 dark:text-slate-100",children:s("settings.fields.responseLogging")}),e.jsx("p",{className:c(h,"text-xs"),children:s("settings.fields.responseLoggingHint")})]})]}),e.jsxs("label",{className:"flex items-start gap-3 rounded-2xl border border-amber-200/70 bg-amber-50/80 px-4 py-3 shadow-sm shadow-amber-200/60 transition hover:border-amber-300 dark:border-amber-700/60 dark:bg-amber-900/30 dark:hover:border-amber-500/60",children:[e.jsx("input",{type:"checkbox",checked:o.enableRoutingFallback,onChange:t=>p(a=>({...a,enableRoutingFallback:t.target.checked})),className:"mt-1 h-4 w-4 rounded border-amber-300 text-amber-600 focus:ring-amber-400 dark:border-amber-500"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("span",{className:"text-sm font-semibold text-amber-700 dark:text-amber-200",children:s("settings.fields.enableRoutingFallback")}),e.jsx("p",{className:c(h,"text-xs text-amber-800/80 dark:text-amber-200/80"),children:s("settings.fields.enableRoutingFallbackHint")})]})]})]}),e.jsxs("div",{className:"md:col-span-2 rounded-2xl border border-slate-200/70 bg-white/80 px-4 py-3 text-sm text-slate-700 shadow-sm shadow-slate-200/60 dark:border-slate-700/60 dark:bg-slate-900/70 dark:text-slate-200",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("settings.fields.defaults")}),e.jsx("p",{className:"mt-2 text-sm",children:Q??s("settings.defaults.none")})]})]}),e.jsx(w,{title:s("settings.sections.security"),description:s("settings.auth.description"),contentClassName:"space-y-5",children:x.isPending&&!i?e.jsx("div",{className:"flex min-h-[120px] items-center justify-center",children:e.jsx(O,{})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"rounded-2xl border border-slate-200/70 bg-white/90 p-5 shadow-sm shadow-slate-200/50 transition dark:border-slate-700/60 dark:bg-slate-900/80 dark:shadow-slate-900/40",children:e.jsxs("label",{className:"flex cursor-pointer select-none items-start gap-3",children:[e.jsx("input",{type:"checkbox",checked:l.enabled,onChange:t=>f(a=>({...a,enabled:t.target.checked})),className:"mt-1 h-5 w-5 rounded border-slate-300 bg-white text-blue-600 shadow-sm transition focus:ring-blue-400/40 dark:border-slate-600 dark:bg-slate-900 dark:text-blue-200"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("span",{className:"text-sm font-semibold text-slate-800 dark:text-slate-100",children:s("settings.auth.enable")}),e.jsx("p",{className:c(h,"text-xs leading-relaxed"),children:s("settings.auth.enableHint")}),e.jsxs("div",{className:"flex flex-wrap gap-2 text-[11px] font-medium text-slate-500 dark:text-slate-400",children:[e.jsx("span",{className:"rounded-full bg-slate-100/90 px-3 py-1 shadow-sm shadow-slate-200/40 dark:bg-slate-800/70",children:"/ui"}),e.jsx("span",{className:"rounded-full bg-slate-100/90 px-3 py-1 shadow-sm shadow-slate-200/40 dark:bg-slate-800/70",children:"/api/*"}),e.jsx("span",{className:"rounded-full bg-slate-100/90 px-3 py-1 shadow-sm shadow-slate-200/40 dark:bg-slate-800/70",children:"Cookie Session"})]})]})]})}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-[minmax(0,1fr)_minmax(0,0.85fr)]",children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:col-span-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("settings.auth.username")}),e.jsx("input",{value:l.username,onChange:t=>f(a=>({...a,username:t.target.value})),placeholder:s("settings.auth.usernamePlaceholder"),className:c(y,"h-11 font-medium")}),k.username?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:k.username}):null]}),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:s("settings.auth.password")}),e.jsx("input",{type:"password",value:l.password,disabled:!l.enabled,onChange:t=>f(a=>({...a,password:t.target.value})),placeholder:s("settings.auth.passwordPlaceholder"),className:c(y,"h-11 disabled:cursor-not-allowed disabled:bg-slate-100 dark:disabled:bg-slate-900/40")}),k.password?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:k.password}):e.jsx("span",{className:c(h,"text-xs leading-relaxed"),children:s(K?"settings.auth.passwordHintRequired":"settings.auth.passwordHintOptional")})]}),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:s("settings.auth.confirmPassword")}),e.jsx("input",{type:"password",value:l.confirmPassword,disabled:!l.enabled,onChange:t=>f(a=>({...a,confirmPassword:t.target.value})),placeholder:s("settings.auth.confirmPasswordPlaceholder"),className:c(y,"h-11 disabled:cursor-not-allowed disabled:bg-slate-100 dark:disabled:bg-slate-900/40")}),k.confirmPassword?e.jsx("span",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:k.confirmPassword}):null]})]}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"rounded-2xl border border-slate-200/70 bg-white/95 px-5 py-4 text-sm shadow-sm shadow-slate-200/40 dark:border-slate-700/60 dark:bg-slate-900/75 dark:text-slate-200 dark:shadow-slate-900/40",children:[e.jsx("div",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500/90 dark:text-slate-400",children:s("settings.auth.status")}),e.jsx("div",{className:"mt-2 text-base font-semibold text-slate-800 dark:text-slate-100",children:i!=null&&i.enabled?s("settings.auth.statusEnabled"):s("settings.auth.statusDisabled")}),i!=null&&i.username?e.jsxs("div",{className:"mt-3 rounded-2xl bg-blue-50/80 px-3 py-2 text-xs font-medium text-blue-700 shadow-sm shadow-blue-200/40 dark:bg-blue-500/20 dark:text-blue-100",children:[s("settings.auth.username"),": ",i.username]}):null]}),e.jsx("div",{className:"rounded-2xl border border-slate-200/60 bg-slate-50/80 px-5 py-4 text-xs leading-relaxed text-slate-600 shadow-sm shadow-slate-200/40 dark:border-slate-700/50 dark:bg-slate-800/60 dark:text-slate-300",children:s(K?"settings.auth.passwordHintRequired":"settings.auth.passwordHintOptional")})]})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-3",children:[e.jsx("button",{type:"button",onClick:z,className:c(V,"h-10 rounded-full px-6"),disabled:R,children:s(R?"common.actions.saving":"settings.auth.actions.save")}),e.jsx("button",{type:"button",onClick:U,className:c(C,"h-10 rounded-full px-4"),disabled:R,children:s("common.actions.reset")})]})]})}),e.jsx(w,{title:s("settings.sections.configFile"),description:s("settings.file.description"),actions:e.jsxs("button",{type:"button",onClick:X,className:c(C,"h-10 rounded-full px-4"),children:[e.jsx(le,{className:"h-4 w-4","aria-hidden":"true"}),s("common.actions.copy")]}),contentClassName:"gap-3",children:e.jsx("code",{className:"block break-all rounded-2xl border border-slate-200/60 bg-slate-100 px-4 py-3 text-xs text-slate-700 dark:border-slate-700/60 dark:bg-slate-900 dark:text-slate-200",children:L||s("settings.file.unknown")})}),e.jsxs(w,{title:s("settings.sections.cleanup"),description:s("settings.cleanup.description"),contentClassName:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-wrap gap-3",children:[e.jsx("button",{type:"button",onClick:Y,className:c(B,"px-5"),disabled:S,children:s(S?"common.actions.cleaning":"common.actions.cleanup")}),e.jsx("button",{type:"button",onClick:Z,className:c(B,"px-5 border-red-500/70 bg-red-600 text-white hover:bg-red-600/90 dark:border-red-500 dark:bg-red-500 dark:text-white"),disabled:M,children:s(M?"settings.cleanup.clearingAll":"settings.cleanup.clearAll")})]}),e.jsx("p",{className:"text-xs font-medium text-red-500 dark:text-red-300",children:s("settings.cleanup.clearAllWarning")})]})]}):e.jsx(w,{children:e.jsx("p",{className:"text-sm font-medium text-red-500 dark:text-red-300",children:s("settings.toast.missingConfig")})})]})}export{me as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as s,d as n,I as u}from"./index-
|
|
1
|
+
import{j as s,d as n,I as u}from"./index-B-8NzzZq.js";function c({variant:a,children:e,icon:r,className:t}){return s.jsxs("span",{className:n(u[a],t),children:[r||s.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-current","aria-hidden":"true"}),e]})}export{c as S};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Dashboard-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Dashboard-D1jcy7qj.js","assets/index-BuSvAxno.js","assets/PageSection-BbmHOMiD.js","assets/Input-jZIOmpmG.js","assets/StatusBadge-DCmNAKwK.js","assets/useApiQuery-DZHaAgf7.js","assets/Logs-DNLLeIq-.js","assets/FormField-CsiVhN9M.js","assets/Button-CkW8jVT-.js","assets/ModelManagement-BazsfV0F.js","assets/ApiKeys-CTR9Ynaf.js","assets/copy-D50F736h.js","assets/Settings-Btmf5gPD.js","assets/About-DpeHLv4-.js","assets/info-B7P9oOld.js","assets/Help-CSSGZPF_.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
var nm=Object.defineProperty;var wu=e=>{throw TypeError(e)};var rm=(e,t,n)=>t in e?nm(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var xu=(e,t,n)=>rm(e,typeof t!="symbol"?t+"":t,n),Ro=(e,t,n)=>t.has(e)||wu("Cannot "+n);var P=(e,t,n)=>(Ro(e,t,"read from private field"),n?n.call(e):t.get(e)),z=(e,t,n)=>t.has(e)?wu("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),_=(e,t,n,r)=>(Ro(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),ge=(e,t,n)=>(Ro(e,t,"access private method"),n);var zs=(e,t,n,r)=>({set _(s){_(e,t,s,n)},get _(){return P(e,t,r)}});function sm(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="string"&&!Array.isArray(r)){for(const s in r)if(s!=="default"&&!(s in e)){const i=Object.getOwnPropertyDescriptor(r,s);i&&Object.defineProperty(e,s,i.get?i:{enumerable:!0,get:()=>r[s]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(s){if(s.ep)return;s.ep=!0;const i=n(s);fetch(s.href,i)}})();function im(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var jd={exports:{}},eo={},Md={exports:{}},M={};/**
|
|
3
3
|
* @license React
|
|
4
4
|
* react.production.min.js
|
|
@@ -204,4 +204,4 @@ env_key = "cc_gw_key"
|
|
|
204
204
|
"protocol": "anthropic"
|
|
205
205
|
}
|
|
206
206
|
\`\`\`
|
|
207
|
-
After configuration, clients access via \`http://127.0.0.1:4100/claude/v1/messages\` (path auto-expansion).`,'Enable "Store request/response bodies" to copy raw payloads from the log drawer when troubleshooting.',"Turn off request or response logs individually to keep the console quiet while preserving metrics and database records.","Use **routing presets** to save common routing configurations and quickly switch between different provider setups.","If you edit ~/.cc-gw/config.json manually, refresh the Settings page or restart cc-gw so the UI reflects the latest configuration."]}},faq:{title:"Frequently asked questions",items:[{q:"How can I change the default model for each endpoint?",a:'Go to "Model Management → Routing" and choose defaults for /anthropic and /openai. Saving applies the change right away.'},{q:"How do I use custom endpoints?",a:'Create a custom endpoint in the "Model Management" page by configuring a base path (e.g., `/my-endpoint`) and protocol type. The system automatically registers full API paths based on the protocol. For example, after configuring `/claude` + `anthropic` protocol, clients access via `http://127.0.0.1:4100/claude/v1/messages`.\n\nIf you encounter 404 errors, check:\n1) Is the endpoint enabled?\n2) Are clients using the complete path (including protocol subpath)?\n3) Check server logs to confirm route registration'},{q:"Why are cached token numbers missing?",a:"Upstream providers must return cached_tokens or input_tokens_details.cached_tokens. Enable cache metrics on the provider if supported."},{q:"How can I use different models for different clients?",a:'Create separate API keys for each client and configure different routing rules in "Model Management → Routing". You can also create dedicated custom endpoints for different clients.'}]}},apiKeys:{title:"API Keys Management",description:"Create and manage API keys for gateway access",createNew:"Create New Key",createAction:"Create",createDescription:"Create a new API key for authentication and optionally add a description.",descriptionLabel:"Key description (optional)",keyDescriptionPlaceholder:"e.g. Internal staging access only",keyNamePlaceholder:"Enter key name",keyCreated:"API Key Created",saveKeyWarning:"This is the only time you'll see the full key. Save it securely!",wildcard:"Any Key",wildcardHint:"When enabled, any custom key — including an empty key — is accepted. Disable this key to enforce strict authentication.",status:{enabled:"Enabled",disabled:"Disabled"},actions:{enable:"Enable",disable:"Disable",delete:"Delete"},created:"Created",lastUsed:"Last Used",requestCount:"Requests",totalTokens:"Total Tokens",confirmDelete:"Are you sure you want to delete this API key? This action cannot be undone.",errors:{nameRequired:"Key name is required"},analytics:{title:"Key Usage Analytics",description:"Highlights for the past {{days}} days of API key activity",range:{today:"Today",week:"Last 7 days",month:"Last 30 days"},cards:{total:"Total keys",enabled:"Enabled keys",active:"Active keys ({{days}} days)"},charts:{requests:"Top 10 keys by request count",tokens:"Top 10 keys by token usage"},tokens:{input:"Input tokens",output:"Output tokens"},requestsSeries:"Requests",empty:"No activity for the selected range.",unknownKey:"Unknown key"},list:{title:"Key Inventory",empty:"No API keys found. Use the button above to create one."},toast:{keyCreated:"API key created successfully",keyUpdated:"API key updated successfully",keyDeleted:"API key deleted successfully",keyCopied:"Key copied to clipboard",createFailure:"Failed to create: {{message}}",updateFailure:"Failed to update: {{message}}",deleteFailure:"Failed to delete: {{message}}"}},about:{title:"About",description:"Review cc-gw version details, build metadata, and current runtime status.",app:{title:"Application",subtitle:"Gateway build metadata at a glance.",labels:{name:"Name",version:"Version",buildTime:"Build time",node:"Node version"},hint:{buildTime:"Timestamps are recorded in UTC so you can trace deployments easily."}},status:{title:"Runtime status",subtitle:"Live metrics reported by the running gateway.",loading:"Fetching status...",empty:"Unable to retrieve status information.",labels:{host:"Listen host",port:"Listen port",providers:"Providers configured",active:"Active requests"},hint:{active:"Active request totals refresh roughly every minute."}},support:{title:"Operational notes",subtitle:"Maintenance guidance",description:"Manage providers, routing, and logs in the Web UI; advanced settings live in ~/.cc-gw/config.json.",tip:"Consider keeping ~/.cc-gw/config.json under version control or managing it via automation scripts.",actions:{checkUpdates:"Check for updates"}},toast:{statusError:{title:"Failed to load status"},updatesPlanned:"Update checks will arrive in a future release."}},endpoints:{title:"Custom Endpoints",description:"Manage custom API endpoints with multiple protocol support.",createButton:"Add Endpoint",createTitle:"Create Endpoint",editTitle:"Edit Endpoint",emptyTitle:"No custom endpoints",emptyDescription:'Click "Add Endpoint" to create your first custom endpoint.',loadError:"Failed to load endpoints",id:"ID",path:"Path",disabled:"Disabled",hasRouting:"Routing configured",protocols:{anthropic:"Anthropic Protocol","openai-chat":"OpenAI Chat","openai-responses":"OpenAI Responses"},protocolHints:{anthropic:"Anthropic Messages API protocol (/v1/messages)","openai-chat":"OpenAI Chat Completions API protocol (/v1/chat/completions)","openai-responses":"OpenAI Responses API protocol (/v1/responses)"},form:{id:"Endpoint ID",idPlaceholder:"e.g. custom-api",idHint:"ID cannot be changed after creation, used for internal identification.",label:"Display Name",labelPlaceholder:"e.g. My Custom API",path:"Access Path",pathPlaceholder:"e.g. /custom/api",pathHint:"Path must start with /. Changes take effect immediately.",protocol:"Protocol Type",enabled:"Enable this endpoint"},routing:{title:"Routing Configuration (Optional)",modelRoutes:"Model Routing Rules",addRoute:"Add Rule",noRoutes:"No routing rules",sourceModelPlaceholder:"Source model (e.g. claude-3-5-sonnet-20241022)",targetPlaceholder:"Target (e.g. anthropic:claude-3-5-sonnet-20241022)",modelRoutesHint:"Format: source model → provider:model, wildcards supported (e.g. gpt-* → openai:*)",defaults:"Default Model Configuration",defaultCompletion:"Default for completion tasks",defaultReasoning:"Default for reasoning tasks",defaultBackground:"Default for background tasks",longContextThreshold:"Long context threshold (tokens)",defaultPlaceholder:"e.g. anthropic:claude-3-5-sonnet-20241022"},createSuccess:"Endpoint created successfully",createError:"Failed to create: {{error}}",updateSuccess:"Endpoint updated successfully",updateError:"Failed to update: {{error}}",deleteSuccess:"Endpoint deleted successfully",deleteError:"Failed to delete: {{error}}",deleteConfirm:'Are you sure you want to delete endpoint "{{label}}"? This action cannot be undone.',validationError:"Please fill in all required fields"}}}};de.isInitialized||de.use(ev).init({resources:Gw,lng:"zh",fallbackLng:"en",interpolation:{escapeValue:!1}});const Zh=S.createContext(void 0);function Yw(){return`toast_${Math.random().toString(36).slice(2)}`}function Xw({children:e}){const[t,n]=S.useState([]),r=S.useCallback(o=>{n(a=>a.filter(l=>l.id!==o))},[]),s=S.useCallback(o=>{const a=o.id??Yw();n(u=>[...u,{...o,id:a}]);const l=o.durationMs??3e3;l>0&&setTimeout(()=>r(a),l)},[r]),i=S.useMemo(()=>({toasts:t,pushToast:s,dismissToast:r}),[t,r,s]);return E.jsxs(Zh.Provider,{value:i,children:[e,E.jsx("div",{className:"fixed right-6 top-6 z-50 flex w-80 flex-col gap-3",children:t.map(o=>E.jsx("div",{className:`rounded-md border border-slate-200 bg-white p-4 shadow-lg dark:border-slate-700 dark:bg-slate-800 ${o.variant==="error"?"border-red-200 bg-red-50 text-red-900 dark:border-red-700 dark:bg-red-900/40 dark:text-red-200":o.variant==="success"?"border-emerald-200 bg-emerald-50 text-emerald-900 dark:border-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-200":""}`,children:E.jsxs("div",{className:"flex items-start justify-between gap-4",children:[E.jsxs("div",{children:[E.jsx("p",{className:"text-sm font-semibold",children:o.title}),o.description?E.jsx("p",{className:"mt-1 text-sm opacity-75",children:o.description}):null]}),E.jsx("button",{type:"button",className:"text-sm text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100",onClick:()=>r(o.id),children:"×"})]})},o.id))})]})}function rk(){const e=S.useContext(Zh);if(!e)throw new Error("useToast must be used within ToastProvider");return e}function Zw({children:e}){const[t]=S.useState(()=>new Ew);return E.jsx(bw,{client:t,children:E.jsx(sv,{i18n:de,children:E.jsx(vv,{children:E.jsx(Xw,{children:E.jsx(Y1,{children:e})})})})})}function em(){const{t:e}=Fs();return E.jsx("div",{className:"flex h-full items-center justify-center p-12",role:"status","aria-live":"polite",children:E.jsxs("div",{className:"flex flex-col items-center gap-4",children:[E.jsx("div",{className:"h-12 w-12 animate-spin rounded-full border-4 border-primary border-t-transparent"}),E.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:e("common.loading")})]})})}const ex=S.lazy(()=>mn(()=>import("./Dashboard-Co1ZMGdJ.js"),__vite__mapDeps([0,1,2,3,4,5]))),tx=S.lazy(()=>mn(()=>import("./Logs-C5qWLb-O.js"),__vite__mapDeps([6,5,2,7,3,8,4]))),Td=S.lazy(()=>mn(()=>import("./ModelManagement-DEwX4znU.js"),__vite__mapDeps([9,5]))),nx=S.lazy(()=>mn(()=>import("./ApiKeys-DbxeLLKa.js"),__vite__mapDeps([10,1,5,2,7,3,8,4,11]))),rx=S.lazy(()=>mn(()=>import("./Settings-BghgyqoT.js"),__vite__mapDeps([12,5,2,11]))),sx=S.lazy(()=>mn(()=>import("./About-CH7-GnML.js"),__vite__mapDeps([13,5,2,3,8,14]))),ix=S.lazy(()=>mn(()=>import("./Help-DLqRglMH.js"),__vite__mapDeps([15,2,14]))),ox=S.lazy(()=>mn(()=>import("./Login-CQ-q3WoP.js"),[]));function ax({children:e}){const{authEnabled:t,isAuthenticated:n,loading:r}=Hh(),s=gn();return r?E.jsx(em,{}):!t||n?e:E.jsx(lh,{to:"/login",replace:!0,state:{from:s}})}function lx(){return E.jsx(Zw,{children:E.jsx(Fy,{basename:typeof window<"u"&&window.location.pathname.startsWith("/ui")?"/ui":"/",children:E.jsx(S.Suspense,{fallback:E.jsx(em,{}),children:E.jsxs(by,{children:[E.jsxs(Ke,{path:"/",element:E.jsx(ax,{children:E.jsx(Z1,{})}),children:[E.jsx(Ke,{index:!0,element:E.jsx(ex,{})}),E.jsx(Ke,{path:"logs",element:E.jsx(tx,{})}),E.jsx(Ke,{path:"models",element:E.jsx(Td,{})}),E.jsx(Ke,{path:"providers",element:E.jsx(Td,{})}),E.jsx(Ke,{path:"api-keys",element:E.jsx(nx,{})}),E.jsx(Ke,{path:"settings",element:E.jsx(rx,{})}),E.jsx(Ke,{path:"about",element:E.jsx(sx,{})}),E.jsx(Ke,{path:"help",element:E.jsx(ix,{})})]}),E.jsx(Ke,{path:"/login",element:E.jsx(ox,{})}),E.jsx(Ke,{path:"*",element:E.jsx(lh,{to:"/",replace:!0})})]})})})})}const tm=document.getElementById("root");if(!tm)throw new Error("Root element #root not found");la.createRoot(tm).render(E.jsx(Wd.StrictMode,{children:E.jsx(lx,{})}));export{fl as $,tt as A,av as B,tk as C,cx as D,gx as E,uv as F,Xx as G,fx as H,Rx as I,yx as J,kx as K,em as L,Sx as M,cv as N,im as O,Px as P,Ex as Q,Wd as R,Eo as S,gv as T,pv as U,pw as V,ow as W,pl as X,bo as Y,sw as Z,iw as _,rk as a,Vh as a0,ww as a1,uw as a2,ek as a3,vx as a4,dx as a5,hx as a6,px as a7,sh as a8,gn as a9,Hh as aa,vt as b,Be as c,Lt as d,Ix as e,Lx as f,wx as g,Nx as h,Cx as i,E as j,yh as k,Ox as l,mx as m,Ax as n,Tx as o,bx as p,A0 as q,S as r,xx as s,ia as t,Fs as u,Zx as v,Cs as w,Sw as x,Pe as y,nk as z};
|
|
207
|
+
After configuration, clients access via \`http://127.0.0.1:4100/claude/v1/messages\` (path auto-expansion).`,'Enable "Store request/response bodies" to copy raw payloads from the log drawer when troubleshooting.',"Turn off request or response logs individually to keep the console quiet while preserving metrics and database records.","Use **routing presets** to save common routing configurations and quickly switch between different provider setups.","If you edit ~/.cc-gw/config.json manually, refresh the Settings page or restart cc-gw so the UI reflects the latest configuration."]}},faq:{title:"Frequently asked questions",items:[{q:"How can I change the default model for each endpoint?",a:'Go to "Model Management → Routing" and choose defaults for /anthropic and /openai. Saving applies the change right away.'},{q:"How do I use custom endpoints?",a:'Create a custom endpoint in the "Model Management" page by configuring a base path (e.g., `/my-endpoint`) and protocol type. The system automatically registers full API paths based on the protocol. For example, after configuring `/claude` + `anthropic` protocol, clients access via `http://127.0.0.1:4100/claude/v1/messages`.\n\nIf you encounter 404 errors, check:\n1) Is the endpoint enabled?\n2) Are clients using the complete path (including protocol subpath)?\n3) Check server logs to confirm route registration'},{q:"Why are cached token numbers missing?",a:"Upstream providers must return cached_tokens or input_tokens_details.cached_tokens. Enable cache metrics on the provider if supported."},{q:"How can I use different models for different clients?",a:'Create separate API keys for each client and configure different routing rules in "Model Management → Routing". You can also create dedicated custom endpoints for different clients.'}]}},apiKeys:{title:"API Keys Management",description:"Create and manage API keys for gateway access",createNew:"Create New Key",createAction:"Create",createDescription:"Create a new API key for authentication and optionally add a description.",descriptionLabel:"Key description (optional)",keyDescriptionPlaceholder:"e.g. Internal staging access only",keyNamePlaceholder:"Enter key name",keyCreated:"API Key Created",saveKeyWarning:"This is the only time you'll see the full key. Save it securely!",wildcard:"Any Key",wildcardHint:"When enabled, any custom key — including an empty key — is accepted. Disable this key to enforce strict authentication.",status:{enabled:"Enabled",disabled:"Disabled"},actions:{enable:"Enable",disable:"Disable",delete:"Delete"},created:"Created",lastUsed:"Last Used",requestCount:"Requests",totalTokens:"Total Tokens",confirmDelete:"Are you sure you want to delete this API key? This action cannot be undone.",errors:{nameRequired:"Key name is required"},analytics:{title:"Key Usage Analytics",description:"Highlights for the past {{days}} days of API key activity",range:{today:"Today",week:"Last 7 days",month:"Last 30 days"},cards:{total:"Total keys",enabled:"Enabled keys",active:"Active keys ({{days}} days)"},charts:{requests:"Top 10 keys by request count",tokens:"Top 10 keys by token usage"},tokens:{input:"Input tokens",output:"Output tokens"},requestsSeries:"Requests",empty:"No activity for the selected range.",unknownKey:"Unknown key"},list:{title:"Key Inventory",empty:"No API keys found. Use the button above to create one."},toast:{keyCreated:"API key created successfully",keyUpdated:"API key updated successfully",keyDeleted:"API key deleted successfully",keyCopied:"Key copied to clipboard",createFailure:"Failed to create: {{message}}",updateFailure:"Failed to update: {{message}}",deleteFailure:"Failed to delete: {{message}}"}},about:{title:"About",description:"Review cc-gw version details, build metadata, and current runtime status.",app:{title:"Application",subtitle:"Gateway build metadata at a glance.",labels:{name:"Name",version:"Version",buildTime:"Build time",node:"Node version"},hint:{buildTime:"Timestamps are recorded in UTC so you can trace deployments easily."}},status:{title:"Runtime status",subtitle:"Live metrics reported by the running gateway.",loading:"Fetching status...",empty:"Unable to retrieve status information.",labels:{host:"Listen host",port:"Listen port",providers:"Providers configured",active:"Active requests"},hint:{active:"Active request totals refresh roughly every minute."}},support:{title:"Operational notes",subtitle:"Maintenance guidance",description:"Manage providers, routing, and logs in the Web UI; advanced settings live in ~/.cc-gw/config.json.",tip:"Consider keeping ~/.cc-gw/config.json under version control or managing it via automation scripts.",actions:{checkUpdates:"Check for updates"}},toast:{statusError:{title:"Failed to load status"},updatesPlanned:"Update checks will arrive in a future release."}},endpoints:{title:"Custom Endpoints",description:"Manage custom API endpoints with multiple protocol support.",createButton:"Add Endpoint",createTitle:"Create Endpoint",editTitle:"Edit Endpoint",emptyTitle:"No custom endpoints",emptyDescription:'Click "Add Endpoint" to create your first custom endpoint.',loadError:"Failed to load endpoints",id:"ID",path:"Path",disabled:"Disabled",hasRouting:"Routing configured",protocols:{anthropic:"Anthropic Protocol","openai-chat":"OpenAI Chat","openai-responses":"OpenAI Responses"},protocolHints:{anthropic:"Anthropic Messages API protocol (/v1/messages)","openai-chat":"OpenAI Chat Completions API protocol (/v1/chat/completions)","openai-responses":"OpenAI Responses API protocol (/v1/responses)"},form:{id:"Endpoint ID",idPlaceholder:"e.g. custom-api",idHint:"ID cannot be changed after creation, used for internal identification.",label:"Display Name",labelPlaceholder:"e.g. My Custom API",path:"Access Path",pathPlaceholder:"e.g. /custom/api",pathHint:"Path must start with /. Changes take effect immediately.",protocol:"Protocol Type",enabled:"Enable this endpoint"},routing:{title:"Routing Configuration (Optional)",modelRoutes:"Model Routing Rules",addRoute:"Add Rule",noRoutes:"No routing rules",sourceModelPlaceholder:"Source model (e.g. claude-3-5-sonnet-20241022)",targetPlaceholder:"Target (e.g. anthropic:claude-3-5-sonnet-20241022)",modelRoutesHint:"Format: source model → provider:model, wildcards supported (e.g. gpt-* → openai:*)",defaults:"Default Model Configuration",defaultCompletion:"Default for completion tasks",defaultReasoning:"Default for reasoning tasks",defaultBackground:"Default for background tasks",longContextThreshold:"Long context threshold (tokens)",defaultPlaceholder:"e.g. anthropic:claude-3-5-sonnet-20241022"},createSuccess:"Endpoint created successfully",createError:"Failed to create: {{error}}",updateSuccess:"Endpoint updated successfully",updateError:"Failed to update: {{error}}",deleteSuccess:"Endpoint deleted successfully",deleteError:"Failed to delete: {{error}}",deleteConfirm:'Are you sure you want to delete endpoint "{{label}}"? This action cannot be undone.',validationError:"Please fill in all required fields"}}}};de.isInitialized||de.use(ev).init({resources:Gw,lng:"zh",fallbackLng:"en",interpolation:{escapeValue:!1}});const Zh=S.createContext(void 0);function Yw(){return`toast_${Math.random().toString(36).slice(2)}`}function Xw({children:e}){const[t,n]=S.useState([]),r=S.useCallback(o=>{n(a=>a.filter(l=>l.id!==o))},[]),s=S.useCallback(o=>{const a=o.id??Yw();n(u=>[...u,{...o,id:a}]);const l=o.durationMs??3e3;l>0&&setTimeout(()=>r(a),l)},[r]),i=S.useMemo(()=>({toasts:t,pushToast:s,dismissToast:r}),[t,r,s]);return E.jsxs(Zh.Provider,{value:i,children:[e,E.jsx("div",{className:"fixed right-6 top-6 z-50 flex w-80 flex-col gap-3",children:t.map(o=>E.jsx("div",{className:`rounded-md border border-slate-200 bg-white p-4 shadow-lg dark:border-slate-700 dark:bg-slate-800 ${o.variant==="error"?"border-red-200 bg-red-50 text-red-900 dark:border-red-700 dark:bg-red-900/40 dark:text-red-200":o.variant==="success"?"border-emerald-200 bg-emerald-50 text-emerald-900 dark:border-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-200":""}`,children:E.jsxs("div",{className:"flex items-start justify-between gap-4",children:[E.jsxs("div",{children:[E.jsx("p",{className:"text-sm font-semibold",children:o.title}),o.description?E.jsx("p",{className:"mt-1 text-sm opacity-75",children:o.description}):null]}),E.jsx("button",{type:"button",className:"text-sm text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100",onClick:()=>r(o.id),children:"×"})]})},o.id))})]})}function rk(){const e=S.useContext(Zh);if(!e)throw new Error("useToast must be used within ToastProvider");return e}function Zw({children:e}){const[t]=S.useState(()=>new Ew);return E.jsx(bw,{client:t,children:E.jsx(sv,{i18n:de,children:E.jsx(vv,{children:E.jsx(Xw,{children:E.jsx(Y1,{children:e})})})})})}function em(){const{t:e}=Fs();return E.jsx("div",{className:"flex h-full items-center justify-center p-12",role:"status","aria-live":"polite",children:E.jsxs("div",{className:"flex flex-col items-center gap-4",children:[E.jsx("div",{className:"h-12 w-12 animate-spin rounded-full border-4 border-primary border-t-transparent"}),E.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:e("common.loading")})]})})}const ex=S.lazy(()=>mn(()=>import("./Dashboard-D1jcy7qj.js"),__vite__mapDeps([0,1,2,3,4,5]))),tx=S.lazy(()=>mn(()=>import("./Logs-DNLLeIq-.js"),__vite__mapDeps([6,5,2,7,3,8,4]))),Td=S.lazy(()=>mn(()=>import("./ModelManagement-BazsfV0F.js"),__vite__mapDeps([9,5]))),nx=S.lazy(()=>mn(()=>import("./ApiKeys-CTR9Ynaf.js"),__vite__mapDeps([10,1,5,2,7,3,8,4,11]))),rx=S.lazy(()=>mn(()=>import("./Settings-Btmf5gPD.js"),__vite__mapDeps([12,5,2,11]))),sx=S.lazy(()=>mn(()=>import("./About-DpeHLv4-.js"),__vite__mapDeps([13,5,2,3,8,14]))),ix=S.lazy(()=>mn(()=>import("./Help-CSSGZPF_.js"),__vite__mapDeps([15,2,14]))),ox=S.lazy(()=>mn(()=>import("./Login-D577Po2d.js"),[]));function ax({children:e}){const{authEnabled:t,isAuthenticated:n,loading:r}=Hh(),s=gn();return r?E.jsx(em,{}):!t||n?e:E.jsx(lh,{to:"/login",replace:!0,state:{from:s}})}function lx(){return E.jsx(Zw,{children:E.jsx(Fy,{basename:typeof window<"u"&&window.location.pathname.startsWith("/ui")?"/ui":"/",children:E.jsx(S.Suspense,{fallback:E.jsx(em,{}),children:E.jsxs(by,{children:[E.jsxs(Ke,{path:"/",element:E.jsx(ax,{children:E.jsx(Z1,{})}),children:[E.jsx(Ke,{index:!0,element:E.jsx(ex,{})}),E.jsx(Ke,{path:"logs",element:E.jsx(tx,{})}),E.jsx(Ke,{path:"models",element:E.jsx(Td,{})}),E.jsx(Ke,{path:"providers",element:E.jsx(Td,{})}),E.jsx(Ke,{path:"api-keys",element:E.jsx(nx,{})}),E.jsx(Ke,{path:"settings",element:E.jsx(rx,{})}),E.jsx(Ke,{path:"about",element:E.jsx(sx,{})}),E.jsx(Ke,{path:"help",element:E.jsx(ix,{})})]}),E.jsx(Ke,{path:"/login",element:E.jsx(ox,{})}),E.jsx(Ke,{path:"*",element:E.jsx(lh,{to:"/",replace:!0})})]})})})})}const tm=document.getElementById("root");if(!tm)throw new Error("Root element #root not found");la.createRoot(tm).render(E.jsx(Wd.StrictMode,{children:E.jsx(lx,{})}));export{fl as $,tt as A,av as B,tk as C,cx as D,gx as E,uv as F,Xx as G,fx as H,Rx as I,yx as J,kx as K,em as L,Sx as M,cv as N,im as O,Px as P,Ex as Q,Wd as R,Eo as S,gv as T,pv as U,pw as V,ow as W,pl as X,bo as Y,sw as Z,iw as _,rk as a,Vh as a0,ww as a1,uw as a2,ek as a3,vx as a4,dx as a5,hx as a6,px as a7,sh as a8,gn as a9,Hh as aa,vt as b,Be as c,Lt as d,Ix as e,Lx as f,wx as g,Nx as h,Cx as i,E as j,yh as k,Ox as l,mx as m,Ax as n,Tx as o,bx as p,A0 as q,S as r,xx as s,ia as t,Fs as u,Zx as v,Cs as w,Sw as x,Pe as y,nk as z};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{O as VL,R as zL,r as GL}from"./index-
|
|
1
|
+
import{O as VL,R as zL,r as GL}from"./index-B-8NzzZq.js";/*! *****************************************************************************
|
|
2
2
|
Copyright (c) Microsoft Corporation.
|
|
3
3
|
|
|
4
4
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var ft=e=>{throw TypeError(e)};var $=(e,t,s)=>t.has(e)||ft("Cannot "+s);var i=(e,t,s)=>($(e,t,"read from private field"),s?s.call(e):t.get(e)),b=(e,t,s)=>t.has(e)?ft("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),u=(e,t,s,r)=>($(e,t,"write to private field"),r?r.call(e,s):t.set(e,s),s),d=(e,t,s)=>($(e,t,"access private method"),s);import{S as It,V as pt,W as S,v as G,X as H,A as J,Y as tt,Z as bt,_ as Ot,$ as q,a0 as Tt,a1 as wt,a2 as yt,y as St,r as I,C as Qt,z as Mt,a3 as _t,b as xt,t as Ut}from"./index-CMmlZ8am.js";var g,a,j,y,Q,U,E,O,z,F,D,M,_,T,P,n,B,et,st,it,rt,at,nt,ht,Ct,vt,Ft=(vt=class extends It{constructor(t,s){super();b(this,n);b(this,g);b(this,a);b(this,j);b(this,y);b(this,Q);b(this,U);b(this,E);b(this,O);b(this,z);b(this,F);b(this,D);b(this,M);b(this,_);b(this,T);b(this,P,new Set);this.options=s,u(this,g,t),u(this,O,null),u(this,E,pt()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(i(this,a).addObserver(this),gt(i(this,a),this.options)?d(this,n,B).call(this):this.updateResult(),d(this,n,rt).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return ot(i(this,a),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return ot(i(this,a),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,d(this,n,at).call(this),d(this,n,nt).call(this),i(this,a).removeObserver(this)}setOptions(t){const s=this.options,r=i(this,a);if(this.options=i(this,g).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof S(this.options.enabled,i(this,a))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");d(this,n,ht).call(this),i(this,a).setOptions(this.options),s._defaulted&&!G(this.options,s)&&i(this,g).getQueryCache().notify({type:"observerOptionsUpdated",query:i(this,a),observer:this});const h=this.hasListeners();h&&mt(i(this,a),r,this.options,s)&&d(this,n,B).call(this),this.updateResult(),h&&(i(this,a)!==r||S(this.options.enabled,i(this,a))!==S(s.enabled,i(this,a))||H(this.options.staleTime,i(this,a))!==H(s.staleTime,i(this,a)))&&d(this,n,et).call(this);const o=d(this,n,st).call(this);h&&(i(this,a)!==r||S(this.options.enabled,i(this,a))!==S(s.enabled,i(this,a))||o!==i(this,T))&&d(this,n,it).call(this,o)}getOptimisticResult(t){const s=i(this,g).getQueryCache().build(i(this,g),t),r=this.createResult(s,t);return Pt(this,r)&&(u(this,y,r),u(this,U,this.options),u(this,Q,i(this,a).state)),r}getCurrentResult(){return i(this,y)}trackResult(t,s){return new Proxy(t,{get:(r,h)=>(this.trackProp(h),s==null||s(h),h==="promise"&&!this.options.experimental_prefetchInRender&&i(this,E).status==="pending"&&i(this,E).reject(new Error("experimental_prefetchInRender feature flag is not enabled")),Reflect.get(r,h))})}trackProp(t){i(this,P).add(t)}getCurrentQuery(){return i(this,a)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=i(this,g).defaultQueryOptions(t),r=i(this,g).getQueryCache().build(i(this,g),s);return r.fetch().then(()=>this.createResult(r,s))}fetch(t){return d(this,n,B).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),i(this,y)))}createResult(t,s){var dt;const r=i(this,a),h=this.options,o=i(this,y),c=i(this,Q),w=i(this,U),v=t!==r?t.state:i(this,j),{state:L}=t;let l={...L},N=!1,f;if(s._optimisticResults){const R=this.hasListeners(),W=!R&>(t,s),x=R&&mt(t,r,s,h);(W||x)&&(l={...l,...wt(L.data,t.options)}),s._optimisticResults==="isRestoring"&&(l.fetchStatus="idle")}let{error:A,errorUpdatedAt:k,status:m}=l;f=l.data;let V=!1;if(s.placeholderData!==void 0&&f===void 0&&m==="pending"){let R;o!=null&&o.isPlaceholderData&&s.placeholderData===(w==null?void 0:w.placeholderData)?(R=o.data,V=!0):R=typeof s.placeholderData=="function"?s.placeholderData((dt=i(this,D))==null?void 0:dt.state.data,i(this,D)):s.placeholderData,R!==void 0&&(m="success",f=yt(o==null?void 0:o.data,R,s),N=!0)}if(s.select&&f!==void 0&&!V)if(o&&f===(c==null?void 0:c.data)&&s.select===i(this,z))f=i(this,F);else try{u(this,z,s.select),f=s.select(f),f=yt(o==null?void 0:o.data,f,s),u(this,F,f),u(this,O,null)}catch(R){u(this,O,R)}i(this,O)&&(A=i(this,O),f=i(this,F),k=Date.now(),m="error");const X=l.fetchStatus==="fetching",Y=m==="pending",Z=m==="error",ut=Y&&X,lt=f!==void 0,C={status:m,fetchStatus:l.fetchStatus,isPending:Y,isSuccess:m==="success",isError:Z,isInitialLoading:ut,isLoading:ut,data:f,dataUpdatedAt:l.dataUpdatedAt,error:A,errorUpdatedAt:k,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:l.dataUpdateCount>0||l.errorUpdateCount>0,isFetchedAfterMount:l.dataUpdateCount>v.dataUpdateCount||l.errorUpdateCount>v.errorUpdateCount,isFetching:X,isRefetching:X&&!Y,isLoadingError:Z&&!lt,isPaused:l.fetchStatus==="paused",isPlaceholderData:N,isRefetchError:Z&<,isStale:ct(t,s),refetch:this.refetch,promise:i(this,E),isEnabled:S(s.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const R=K=>{C.status==="error"?K.reject(C.error):C.data!==void 0&&K.resolve(C.data)},W=()=>{const K=u(this,E,C.promise=pt());R(K)},x=i(this,E);switch(x.status){case"pending":t.queryHash===r.queryHash&&R(x);break;case"fulfilled":(C.status==="error"||C.data!==x.value)&&W();break;case"rejected":(C.status!=="error"||C.error!==x.reason)&&W();break}}return C}updateResult(){const t=i(this,y),s=this.createResult(i(this,a),this.options);if(u(this,Q,i(this,a).state),u(this,U,this.options),i(this,Q).data!==void 0&&u(this,D,i(this,a)),G(s,t))return;u(this,y,s);const r=()=>{if(!t)return!0;const{notifyOnChangeProps:h}=this.options,o=typeof h=="function"?h():h;if(o==="all"||!o&&!i(this,P).size)return!0;const c=new Set(o??i(this,P));return this.options.throwOnError&&c.add("error"),Object.keys(i(this,y)).some(w=>{const p=w;return i(this,y)[p]!==t[p]&&c.has(p)})};d(this,n,Ct).call(this,{listeners:r()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&d(this,n,rt).call(this)}},g=new WeakMap,a=new WeakMap,j=new WeakMap,y=new WeakMap,Q=new WeakMap,U=new WeakMap,E=new WeakMap,O=new WeakMap,z=new WeakMap,F=new WeakMap,D=new WeakMap,M=new WeakMap,_=new WeakMap,T=new WeakMap,P=new WeakMap,n=new WeakSet,B=function(t){d(this,n,ht).call(this);let s=i(this,a).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(J)),s},et=function(){d(this,n,at).call(this);const t=H(this.options.staleTime,i(this,a));if(tt||i(this,y).isStale||!bt(t))return;const r=Ot(i(this,y).dataUpdatedAt,t)+1;u(this,M,q.setTimeout(()=>{i(this,y).isStale||this.updateResult()},r))},st=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(i(this,a)):this.options.refetchInterval)??!1},it=function(t){d(this,n,nt).call(this),u(this,T,t),!(tt||S(this.options.enabled,i(this,a))===!1||!bt(i(this,T))||i(this,T)===0)&&u(this,_,q.setInterval(()=>{(this.options.refetchIntervalInBackground||Tt.isFocused())&&d(this,n,B).call(this)},i(this,T)))},rt=function(){d(this,n,et).call(this),d(this,n,it).call(this,d(this,n,st).call(this))},at=function(){i(this,M)&&(q.clearTimeout(i(this,M)),u(this,M,void 0))},nt=function(){i(this,_)&&(q.clearInterval(i(this,_)),u(this,_,void 0))},ht=function(){const t=i(this,g).getQueryCache().build(i(this,g),this.options);if(t===i(this,a))return;const s=i(this,a);u(this,a,t),u(this,j,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},Ct=function(t){St.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(i(this,y))}),i(this,g).getQueryCache().notify({query:i(this,a),type:"observerResultsUpdated"})})},vt);function Dt(e,t){return S(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&t.retryOnMount===!1)}function gt(e,t){return Dt(e,t)||e.state.data!==void 0&&ot(e,t,t.refetchOnMount)}function ot(e,t,s){if(S(t.enabled,e)!==!1&&H(t.staleTime,e)!=="static"){const r=typeof s=="function"?s(e):s;return r==="always"||r!==!1&&ct(e,t)}return!1}function mt(e,t,s,r){return(e!==t||S(r.enabled,e)===!1)&&(!s.suspense||e.state.status!=="error")&&ct(e,s)}function ct(e,t){return S(t.enabled,e)!==!1&&e.isStaleByTime(H(t.staleTime,e))}function Pt(e,t){return!G(e.getCurrentResult(),t)}var Et=I.createContext(!1),Lt=()=>I.useContext(Et);Et.Provider;function Nt(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var At=I.createContext(Nt()),kt=()=>I.useContext(At),Bt=(e,t)=>{(e.suspense||e.throwOnError||e.experimental_prefetchInRender)&&(t.isReset()||(e.retryOnMount=!1))},Ht=e=>{I.useEffect(()=>{e.clearReset()},[e])},jt=({result:e,errorResetBoundary:t,throwOnError:s,query:r,suspense:h})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(h&&e.data===void 0||Qt(s,[e.error,r])),zt=e=>{if(e.suspense){const s=h=>h==="static"?h:Math.max(h??1e3,1e3),r=e.staleTime;e.staleTime=typeof r=="function"?(...h)=>s(r(...h)):s(r),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},Vt=(e,t)=>e.isLoading&&e.isFetching&&!t,Wt=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,Rt=(e,t,s)=>t.fetchOptimistic(e).catch(()=>{s.clearReset()});function Kt(e,t,s){var l,N,f,A,k;const r=Lt(),h=kt(),o=Mt(),c=o.defaultQueryOptions(e);(N=(l=o.getDefaultOptions().queries)==null?void 0:l._experimental_beforeQuery)==null||N.call(l,c),c._optimisticResults=r?"isRestoring":"optimistic",zt(c),Bt(c,h),Ht(h);const w=!o.getQueryCache().get(c.queryHash),[p]=I.useState(()=>new t(o,c)),v=p.getOptimisticResult(c),L=!r&&e.subscribed!==!1;if(I.useSyncExternalStore(I.useCallback(m=>{const V=L?p.subscribe(St.batchCalls(m)):J;return p.updateResult(),V},[p,L]),()=>p.getCurrentResult(),()=>p.getCurrentResult()),I.useEffect(()=>{p.setOptions(c)},[c,p]),Wt(c,v))throw Rt(c,p,h);if(jt({result:v,errorResetBoundary:h,throwOnError:c.throwOnError,query:o.getQueryCache().get(c.queryHash),suspense:c.suspense}))throw v.error;if((A=(f=o.getDefaultOptions().queries)==null?void 0:f._experimental_afterQuery)==null||A.call(f,c,v),c.experimental_prefetchInRender&&!tt&&Vt(v,r)){const m=w?Rt(c,p,h):(k=o.getQueryCache().get(c.queryHash))==null?void 0:k.promise;m==null||m.catch(J).finally(()=>{p.updateResult()})}return c.notifyOnChangeProps?v:p.trackResult(v)}function qt(e,t){return Kt(e,Ft)}function $t(e,t,s){return qt({queryKey:e,placeholderData:_t,...s,queryFn:async()=>{try{return(await xt.request(t)).data}catch(r){throw Ut(r)}}})}export{qt as a,$t as u};
|
|
1
|
+
var ft=e=>{throw TypeError(e)};var $=(e,t,s)=>t.has(e)||ft("Cannot "+s);var i=(e,t,s)=>($(e,t,"read from private field"),s?s.call(e):t.get(e)),b=(e,t,s)=>t.has(e)?ft("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),u=(e,t,s,r)=>($(e,t,"write to private field"),r?r.call(e,s):t.set(e,s),s),d=(e,t,s)=>($(e,t,"access private method"),s);import{S as It,V as pt,W as S,v as G,X as H,A as J,Y as tt,Z as bt,_ as Ot,$ as q,a0 as Tt,a1 as wt,a2 as yt,y as St,r as I,C as Qt,z as Mt,a3 as _t,b as xt,t as Ut}from"./index-B-8NzzZq.js";var g,a,j,y,Q,U,E,O,z,F,D,M,_,T,P,n,B,et,st,it,rt,at,nt,ht,Ct,vt,Ft=(vt=class extends It{constructor(t,s){super();b(this,n);b(this,g);b(this,a);b(this,j);b(this,y);b(this,Q);b(this,U);b(this,E);b(this,O);b(this,z);b(this,F);b(this,D);b(this,M);b(this,_);b(this,T);b(this,P,new Set);this.options=s,u(this,g,t),u(this,O,null),u(this,E,pt()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(i(this,a).addObserver(this),gt(i(this,a),this.options)?d(this,n,B).call(this):this.updateResult(),d(this,n,rt).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return ot(i(this,a),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return ot(i(this,a),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,d(this,n,at).call(this),d(this,n,nt).call(this),i(this,a).removeObserver(this)}setOptions(t){const s=this.options,r=i(this,a);if(this.options=i(this,g).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof S(this.options.enabled,i(this,a))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");d(this,n,ht).call(this),i(this,a).setOptions(this.options),s._defaulted&&!G(this.options,s)&&i(this,g).getQueryCache().notify({type:"observerOptionsUpdated",query:i(this,a),observer:this});const h=this.hasListeners();h&&mt(i(this,a),r,this.options,s)&&d(this,n,B).call(this),this.updateResult(),h&&(i(this,a)!==r||S(this.options.enabled,i(this,a))!==S(s.enabled,i(this,a))||H(this.options.staleTime,i(this,a))!==H(s.staleTime,i(this,a)))&&d(this,n,et).call(this);const o=d(this,n,st).call(this);h&&(i(this,a)!==r||S(this.options.enabled,i(this,a))!==S(s.enabled,i(this,a))||o!==i(this,T))&&d(this,n,it).call(this,o)}getOptimisticResult(t){const s=i(this,g).getQueryCache().build(i(this,g),t),r=this.createResult(s,t);return Pt(this,r)&&(u(this,y,r),u(this,U,this.options),u(this,Q,i(this,a).state)),r}getCurrentResult(){return i(this,y)}trackResult(t,s){return new Proxy(t,{get:(r,h)=>(this.trackProp(h),s==null||s(h),h==="promise"&&!this.options.experimental_prefetchInRender&&i(this,E).status==="pending"&&i(this,E).reject(new Error("experimental_prefetchInRender feature flag is not enabled")),Reflect.get(r,h))})}trackProp(t){i(this,P).add(t)}getCurrentQuery(){return i(this,a)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=i(this,g).defaultQueryOptions(t),r=i(this,g).getQueryCache().build(i(this,g),s);return r.fetch().then(()=>this.createResult(r,s))}fetch(t){return d(this,n,B).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),i(this,y)))}createResult(t,s){var dt;const r=i(this,a),h=this.options,o=i(this,y),c=i(this,Q),w=i(this,U),v=t!==r?t.state:i(this,j),{state:L}=t;let l={...L},N=!1,f;if(s._optimisticResults){const R=this.hasListeners(),W=!R&>(t,s),x=R&&mt(t,r,s,h);(W||x)&&(l={...l,...wt(L.data,t.options)}),s._optimisticResults==="isRestoring"&&(l.fetchStatus="idle")}let{error:A,errorUpdatedAt:k,status:m}=l;f=l.data;let V=!1;if(s.placeholderData!==void 0&&f===void 0&&m==="pending"){let R;o!=null&&o.isPlaceholderData&&s.placeholderData===(w==null?void 0:w.placeholderData)?(R=o.data,V=!0):R=typeof s.placeholderData=="function"?s.placeholderData((dt=i(this,D))==null?void 0:dt.state.data,i(this,D)):s.placeholderData,R!==void 0&&(m="success",f=yt(o==null?void 0:o.data,R,s),N=!0)}if(s.select&&f!==void 0&&!V)if(o&&f===(c==null?void 0:c.data)&&s.select===i(this,z))f=i(this,F);else try{u(this,z,s.select),f=s.select(f),f=yt(o==null?void 0:o.data,f,s),u(this,F,f),u(this,O,null)}catch(R){u(this,O,R)}i(this,O)&&(A=i(this,O),f=i(this,F),k=Date.now(),m="error");const X=l.fetchStatus==="fetching",Y=m==="pending",Z=m==="error",ut=Y&&X,lt=f!==void 0,C={status:m,fetchStatus:l.fetchStatus,isPending:Y,isSuccess:m==="success",isError:Z,isInitialLoading:ut,isLoading:ut,data:f,dataUpdatedAt:l.dataUpdatedAt,error:A,errorUpdatedAt:k,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:l.dataUpdateCount>0||l.errorUpdateCount>0,isFetchedAfterMount:l.dataUpdateCount>v.dataUpdateCount||l.errorUpdateCount>v.errorUpdateCount,isFetching:X,isRefetching:X&&!Y,isLoadingError:Z&&!lt,isPaused:l.fetchStatus==="paused",isPlaceholderData:N,isRefetchError:Z&<,isStale:ct(t,s),refetch:this.refetch,promise:i(this,E),isEnabled:S(s.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const R=K=>{C.status==="error"?K.reject(C.error):C.data!==void 0&&K.resolve(C.data)},W=()=>{const K=u(this,E,C.promise=pt());R(K)},x=i(this,E);switch(x.status){case"pending":t.queryHash===r.queryHash&&R(x);break;case"fulfilled":(C.status==="error"||C.data!==x.value)&&W();break;case"rejected":(C.status!=="error"||C.error!==x.reason)&&W();break}}return C}updateResult(){const t=i(this,y),s=this.createResult(i(this,a),this.options);if(u(this,Q,i(this,a).state),u(this,U,this.options),i(this,Q).data!==void 0&&u(this,D,i(this,a)),G(s,t))return;u(this,y,s);const r=()=>{if(!t)return!0;const{notifyOnChangeProps:h}=this.options,o=typeof h=="function"?h():h;if(o==="all"||!o&&!i(this,P).size)return!0;const c=new Set(o??i(this,P));return this.options.throwOnError&&c.add("error"),Object.keys(i(this,y)).some(w=>{const p=w;return i(this,y)[p]!==t[p]&&c.has(p)})};d(this,n,Ct).call(this,{listeners:r()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&d(this,n,rt).call(this)}},g=new WeakMap,a=new WeakMap,j=new WeakMap,y=new WeakMap,Q=new WeakMap,U=new WeakMap,E=new WeakMap,O=new WeakMap,z=new WeakMap,F=new WeakMap,D=new WeakMap,M=new WeakMap,_=new WeakMap,T=new WeakMap,P=new WeakMap,n=new WeakSet,B=function(t){d(this,n,ht).call(this);let s=i(this,a).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(J)),s},et=function(){d(this,n,at).call(this);const t=H(this.options.staleTime,i(this,a));if(tt||i(this,y).isStale||!bt(t))return;const r=Ot(i(this,y).dataUpdatedAt,t)+1;u(this,M,q.setTimeout(()=>{i(this,y).isStale||this.updateResult()},r))},st=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(i(this,a)):this.options.refetchInterval)??!1},it=function(t){d(this,n,nt).call(this),u(this,T,t),!(tt||S(this.options.enabled,i(this,a))===!1||!bt(i(this,T))||i(this,T)===0)&&u(this,_,q.setInterval(()=>{(this.options.refetchIntervalInBackground||Tt.isFocused())&&d(this,n,B).call(this)},i(this,T)))},rt=function(){d(this,n,et).call(this),d(this,n,it).call(this,d(this,n,st).call(this))},at=function(){i(this,M)&&(q.clearTimeout(i(this,M)),u(this,M,void 0))},nt=function(){i(this,_)&&(q.clearInterval(i(this,_)),u(this,_,void 0))},ht=function(){const t=i(this,g).getQueryCache().build(i(this,g),this.options);if(t===i(this,a))return;const s=i(this,a);u(this,a,t),u(this,j,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},Ct=function(t){St.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(i(this,y))}),i(this,g).getQueryCache().notify({query:i(this,a),type:"observerResultsUpdated"})})},vt);function Dt(e,t){return S(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&t.retryOnMount===!1)}function gt(e,t){return Dt(e,t)||e.state.data!==void 0&&ot(e,t,t.refetchOnMount)}function ot(e,t,s){if(S(t.enabled,e)!==!1&&H(t.staleTime,e)!=="static"){const r=typeof s=="function"?s(e):s;return r==="always"||r!==!1&&ct(e,t)}return!1}function mt(e,t,s,r){return(e!==t||S(r.enabled,e)===!1)&&(!s.suspense||e.state.status!=="error")&&ct(e,s)}function ct(e,t){return S(t.enabled,e)!==!1&&e.isStaleByTime(H(t.staleTime,e))}function Pt(e,t){return!G(e.getCurrentResult(),t)}var Et=I.createContext(!1),Lt=()=>I.useContext(Et);Et.Provider;function Nt(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var At=I.createContext(Nt()),kt=()=>I.useContext(At),Bt=(e,t)=>{(e.suspense||e.throwOnError||e.experimental_prefetchInRender)&&(t.isReset()||(e.retryOnMount=!1))},Ht=e=>{I.useEffect(()=>{e.clearReset()},[e])},jt=({result:e,errorResetBoundary:t,throwOnError:s,query:r,suspense:h})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(h&&e.data===void 0||Qt(s,[e.error,r])),zt=e=>{if(e.suspense){const s=h=>h==="static"?h:Math.max(h??1e3,1e3),r=e.staleTime;e.staleTime=typeof r=="function"?(...h)=>s(r(...h)):s(r),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},Vt=(e,t)=>e.isLoading&&e.isFetching&&!t,Wt=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,Rt=(e,t,s)=>t.fetchOptimistic(e).catch(()=>{s.clearReset()});function Kt(e,t,s){var l,N,f,A,k;const r=Lt(),h=kt(),o=Mt(),c=o.defaultQueryOptions(e);(N=(l=o.getDefaultOptions().queries)==null?void 0:l._experimental_beforeQuery)==null||N.call(l,c),c._optimisticResults=r?"isRestoring":"optimistic",zt(c),Bt(c,h),Ht(h);const w=!o.getQueryCache().get(c.queryHash),[p]=I.useState(()=>new t(o,c)),v=p.getOptimisticResult(c),L=!r&&e.subscribed!==!1;if(I.useSyncExternalStore(I.useCallback(m=>{const V=L?p.subscribe(St.batchCalls(m)):J;return p.updateResult(),V},[p,L]),()=>p.getCurrentResult(),()=>p.getCurrentResult()),I.useEffect(()=>{p.setOptions(c)},[c,p]),Wt(c,v))throw Rt(c,p,h);if(jt({result:v,errorResetBoundary:h,throwOnError:c.throwOnError,query:o.getQueryCache().get(c.queryHash),suspense:c.suspense}))throw v.error;if((A=(f=o.getDefaultOptions().queries)==null?void 0:f._experimental_afterQuery)==null||A.call(f,c,v),c.experimental_prefetchInRender&&!tt&&Vt(v,r)){const m=w?Rt(c,p,h):(k=o.getQueryCache().get(c.queryHash))==null?void 0:k.promise;m==null||m.catch(J).finally(()=>{p.updateResult()})}return c.notifyOnChangeProps?v:p.trackResult(v)}function qt(e,t){return Kt(e,Ft)}function $t(e,t,s){return qt({queryKey:e,placeholderData:_t,...s,queryFn:async()=>{try{return(await xt.request(t)).data}catch(r){throw Ut(r)}}})}export{qt as a,$t as u};
|
package/src/web/dist/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
|
6
6
|
<meta name="format-detection" content="telephone=no" />
|
|
7
7
|
<title>cc-gw 控制台</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-B-8NzzZq.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-But5PyJC.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body class="bg-slate-50 text-slate-900 dark:bg-slate-900 dark:text-slate-50">
|