llm-simple-router 0.3.7 → 0.4.0
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/README.md +81 -49
- package/dist/admin/constants.d.ts +1 -8
- package/dist/admin/constants.js +2 -8
- package/dist/admin/logs.js +18 -3
- package/dist/admin/router-keys.js +1 -2
- package/dist/cli.js +0 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.js +9 -0
- package/dist/db/index.d.ts +4 -4
- package/dist/db/index.js +2 -2
- package/dist/db/logs.d.ts +18 -33
- package/dist/db/logs.js +40 -17
- package/dist/db/metrics.d.ts +33 -0
- package/dist/db/metrics.js +7 -0
- package/dist/db/migrations/018_add_failover_field.sql +2 -0
- package/dist/db/retry-rules.d.ts +2 -2
- package/dist/db/retry-rules.js +26 -13
- package/dist/index.js +3 -5
- package/dist/monitor/request-tracker.d.ts +6 -0
- package/dist/monitor/request-tracker.js +23 -54
- package/dist/monitor/stream-extractor.d.ts +11 -0
- package/dist/monitor/stream-extractor.js +51 -0
- package/dist/proxy/anthropic.js +19 -32
- package/dist/proxy/log-helpers.d.ts +11 -4
- package/dist/proxy/log-helpers.js +5 -3
- package/dist/proxy/openai.js +18 -34
- package/dist/proxy/orchestrator.d.ts +52 -0
- package/dist/proxy/orchestrator.js +100 -0
- package/dist/proxy/proxy-core.d.ts +14 -26
- package/dist/proxy/proxy-core.js +40 -337
- package/dist/proxy/proxy-handler.d.ts +18 -0
- package/dist/proxy/proxy-handler.js +223 -0
- package/dist/proxy/proxy-logging.d.ts +28 -0
- package/dist/proxy/proxy-logging.js +122 -0
- package/dist/proxy/resilience.d.ts +63 -0
- package/dist/proxy/resilience.js +188 -0
- package/dist/proxy/scope.d.ts +18 -0
- package/dist/proxy/scope.js +37 -0
- package/dist/proxy/semaphore.d.ts +9 -2
- package/dist/proxy/semaphore.js +34 -7
- package/dist/proxy/stream-proxy.d.ts +7 -0
- package/dist/proxy/stream-proxy.js +263 -0
- package/dist/proxy/{upstream-call.d.ts → transport.d.ts} +25 -18
- package/dist/proxy/transport.js +128 -0
- package/dist/proxy/types.d.ts +58 -0
- package/dist/proxy/types.js +30 -0
- package/frontend-dist/assets/{CardContent-CucI6u41.js → CardContent-CTnwqTdL.js} +1 -1
- package/frontend-dist/assets/{CardHeader-d-DYsWxe.js → CardHeader-CfUeY7tk.js} +1 -1
- package/frontend-dist/assets/{CardTitle-CIDEQkWB.js → CardTitle-CWiDwWqd.js} +1 -1
- package/frontend-dist/assets/{Checkbox-CybCw3zS.js → Checkbox-BxNz70R_.js} +1 -1
- package/frontend-dist/assets/{CollapsibleTrigger-BFNhb19_.js → CollapsibleTrigger-Uz1aGdtH.js} +1 -1
- package/frontend-dist/assets/{Collection-DUBb4r6h.js → Collection-1EHC87X5.js} +1 -1
- package/frontend-dist/assets/{Dashboard-DLB6iqH1.js → Dashboard-C3FL30UN.js} +2 -2
- package/frontend-dist/assets/{DialogTitle-Dq-5o7nJ.js → DialogTitle-CAOFxr83.js} +1 -1
- package/frontend-dist/assets/{Input-HN3Il0-c.js → Input-DRIid2C6.js} +1 -1
- package/frontend-dist/assets/{Label-CXAeFn-r.js → Label-UyNN2jyE.js} +1 -1
- package/frontend-dist/assets/LogDetailDialog-8BT4vIlV.js +3 -0
- package/frontend-dist/assets/{Login-Br3qsdxf.js → Login-CnzH6TdS.js} +1 -1
- package/frontend-dist/assets/Logs-CbK8NB_X.js +1 -0
- package/frontend-dist/assets/{ModelMappings-DXC0sNH5.js → ModelMappings-DeRFgsYG.js} +1 -1
- package/frontend-dist/assets/Monitor-Dd80bdUn.js +1 -0
- package/frontend-dist/assets/{PopperContent-CnZejY31.js → PopperContent-B3fZao7v.js} +1 -1
- package/frontend-dist/assets/{Providers-8CHhW4uH.js → Providers-B_DbV-_y.js} +1 -1
- package/frontend-dist/assets/ProxyEnhancement-up1fnPzq.js +5 -0
- package/frontend-dist/assets/RetryRules-Dkuhjh0u.js +1 -0
- package/frontend-dist/assets/RouterKeys-CvMMAa4t.js +1 -0
- package/frontend-dist/assets/{RovingFocusItem-B7ZIkplZ.js → RovingFocusItem-X0bfqWWS.js} +1 -1
- package/frontend-dist/assets/{SelectValue-B32pgmTJ.js → SelectValue-zO8t-tx1.js} +1 -1
- package/frontend-dist/assets/{Setup-Df9IQo2x.js → Setup-ByT2ThOQ.js} +1 -1
- package/frontend-dist/assets/{Switch-CLeo7H6d.js → Switch-BEMjVugO.js} +1 -1
- package/frontend-dist/assets/{TableHeader-BpscAtT3.js → TableHeader-DpHWSnxK.js} +1 -1
- package/frontend-dist/assets/{TabsTrigger-DErAbTuM.js → TabsTrigger-Db6RqsZc.js} +1 -1
- package/frontend-dist/assets/{VisuallyHidden-CJBR3YB3.js → VisuallyHidden-hs8pj8OP.js} +1 -1
- package/frontend-dist/assets/{VisuallyHiddenInput-Cy0VuE1l.js → VisuallyHiddenInput-1m0nNADN.js} +1 -1
- package/frontend-dist/assets/{alert-dialog-BAR1JRmT.js → alert-dialog-PP91kaO8.js} +1 -1
- package/frontend-dist/assets/{button-D54q76GQ.js → button-Dcc0gF5i.js} +1 -1
- package/frontend-dist/assets/{client-Mb8fy_bC.js → client-DIIo9zPK.js} +2 -2
- package/frontend-dist/assets/{createLucideIcon-CCmQ9QKM.js → createLucideIcon-DGZkBjcJ.js} +1 -1
- package/frontend-dist/assets/{dialog-DSH5k5Kj.js → dialog-CxSyR-fN.js} +1 -1
- package/frontend-dist/assets/format-CPdJtjZ5.js +1 -0
- package/frontend-dist/assets/index-BL-LAtac.css +1 -0
- package/frontend-dist/assets/{index-BQBtSfem.js → index-CvT41fGL.js} +1 -1
- package/frontend-dist/assets/{lib-BgOqOzXI.js → lib-Bl0OuBjh.js} +1 -1
- package/frontend-dist/assets/{ohash.D__AXeF1-p4vp6Svt.js → ohash.D__AXeF1-B64hB831.js} +1 -1
- package/frontend-dist/assets/{useClipboard-DO-38TXr.js → useClipboard-CWc1cTDo.js} +1 -1
- package/frontend-dist/assets/{useForwardExpose-CzQFheaD.js → useForwardExpose-AkE0lq8y.js} +1 -1
- package/frontend-dist/assets/useNonce-DGyPxdjq.js +1 -0
- package/frontend-dist/assets/x-BuUpx9Fr.js +1 -0
- package/frontend-dist/index.html +7 -7
- package/package.json +1 -1
- package/dist/admin/services.d.ts +0 -7
- package/dist/admin/services.js +0 -63
- package/dist/proxy/retry.d.ts +0 -43
- package/dist/proxy/retry.js +0 -121
- package/dist/proxy/upstream-call.js +0 -208
- package/frontend-dist/assets/LogResponseViewer-CyBzv02a.js +0 -3
- package/frontend-dist/assets/Logs-Cu_IftdS.js +0 -1
- package/frontend-dist/assets/Monitor-CKlid1sC.js +0 -1
- package/frontend-dist/assets/ProxyEnhancement-CkYeXwgH.js +0 -5
- package/frontend-dist/assets/RetryRules-Csb7u9W4.js +0 -1
- package/frontend-dist/assets/RouterKeys-C6YIufmj.js +0 -1
- package/frontend-dist/assets/index-H-lnTkMr.css +0 -1
- package/frontend-dist/assets/useNonce-CU-NirfM.js +0 -1
- package/frontend-dist/assets/x-DEJ1xpi5.js +0 -1
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { request as httpRequestFn } from "http";
|
|
2
|
-
import { request as httpsRequestFn } from "https";
|
|
3
|
-
import { PassThrough } from "stream";
|
|
4
|
-
// ---------- Constants ----------
|
|
5
|
-
const UPSTREAM_SUCCESS = 200;
|
|
6
|
-
const UPSTREAM_BAD_GATEWAY = 502;
|
|
7
|
-
const HTTPS_DEFAULT_PORT = 443;
|
|
8
|
-
const HTTP_DEFAULT_PORT = 80;
|
|
9
|
-
// ---------- Request utilities ----------
|
|
10
|
-
/** 根据 URL scheme 选择 http 或 https 模块 */
|
|
11
|
-
export function createUpstreamRequest(url, options) {
|
|
12
|
-
return url.protocol === "https:" ? httpsRequestFn(options) : httpRequestFn(options);
|
|
13
|
-
}
|
|
14
|
-
/** 从 URL + headers 构造 Node.js http.request 所需的 options */
|
|
15
|
-
export function buildRequestOptions(url, headers, method = "POST") {
|
|
16
|
-
return {
|
|
17
|
-
hostname: url.hostname,
|
|
18
|
-
port: Number(url.port) || (url.protocol === "https:" ? HTTPS_DEFAULT_PORT : HTTP_DEFAULT_PORT),
|
|
19
|
-
path: url.pathname,
|
|
20
|
-
method,
|
|
21
|
-
headers,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
// ---------- Non-stream proxy ----------
|
|
25
|
-
export function proxyNonStream(backend, apiKey, body, clientHeaders, upstreamPath, buildHeaders) {
|
|
26
|
-
return new Promise((resolve, reject) => {
|
|
27
|
-
const url = new URL(`${backend.base_url}${upstreamPath}`);
|
|
28
|
-
const payload = JSON.stringify(body);
|
|
29
|
-
const upstreamHeaders = buildHeaders(clientHeaders, apiKey, Buffer.byteLength(payload));
|
|
30
|
-
const options = buildRequestOptions(url, upstreamHeaders);
|
|
31
|
-
const req = createUpstreamRequest(url, options);
|
|
32
|
-
req.on("response", (res) => {
|
|
33
|
-
const chunks = [];
|
|
34
|
-
res.on("data", (chunk) => chunks.push(chunk));
|
|
35
|
-
res.on("end", () => {
|
|
36
|
-
resolve({
|
|
37
|
-
statusCode: res.statusCode || UPSTREAM_BAD_GATEWAY,
|
|
38
|
-
body: Buffer.concat(chunks).toString("utf-8"),
|
|
39
|
-
headers: filterHeaders(res.headers),
|
|
40
|
-
sentHeaders: { ...upstreamHeaders },
|
|
41
|
-
sentBody: payload,
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
req.on("error", (err) => reject(err));
|
|
46
|
-
req.write(payload);
|
|
47
|
-
req.end();
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
// ---------- Stream proxy (SSE) ----------
|
|
51
|
-
export function proxyStream(backend, apiKey, body, clientHeaders, reply, timeoutMs, upstreamPath, buildHeaders, metricsTransform) {
|
|
52
|
-
return new Promise((resolve, reject) => {
|
|
53
|
-
const url = new URL(`${backend.base_url}${upstreamPath}`);
|
|
54
|
-
const payload = JSON.stringify(body);
|
|
55
|
-
const upstreamHeaders = buildHeaders(clientHeaders, apiKey, Buffer.byteLength(payload));
|
|
56
|
-
const options = buildRequestOptions(url, upstreamHeaders);
|
|
57
|
-
const upstreamReq = createUpstreamRequest(url, options);
|
|
58
|
-
upstreamReq.on("response", (upstreamRes) => {
|
|
59
|
-
const statusCode = upstreamRes.statusCode || UPSTREAM_BAD_GATEWAY;
|
|
60
|
-
if (statusCode !== UPSTREAM_SUCCESS) {
|
|
61
|
-
const chunks = [];
|
|
62
|
-
upstreamRes.on("data", (chunk) => chunks.push(chunk));
|
|
63
|
-
upstreamRes.on("end", () => {
|
|
64
|
-
const errorBody = Buffer.concat(chunks).toString("utf-8");
|
|
65
|
-
resolve({
|
|
66
|
-
statusCode,
|
|
67
|
-
responseBody: errorBody,
|
|
68
|
-
upstreamResponseHeaders: filterHeaders(upstreamRes.headers),
|
|
69
|
-
sentHeaders: upstreamHeaders,
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const sseHeaders = filterHeaders(upstreamRes.headers);
|
|
75
|
-
sseHeaders["Content-Type"] = "text/event-stream";
|
|
76
|
-
sseHeaders["Cache-Control"] = "no-cache";
|
|
77
|
-
sseHeaders["Connection"] = "keep-alive";
|
|
78
|
-
reply.raw.writeHead(statusCode, sseHeaders);
|
|
79
|
-
const passThrough = new PassThrough();
|
|
80
|
-
if (metricsTransform) {
|
|
81
|
-
metricsTransform.pipe(passThrough).pipe(reply.raw);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
passThrough.pipe(reply.raw);
|
|
85
|
-
}
|
|
86
|
-
const pipeEntry = metricsTransform ?? passThrough;
|
|
87
|
-
const captureChunks = [];
|
|
88
|
-
let idleTimer = null;
|
|
89
|
-
let resolved = false;
|
|
90
|
-
function cleanup() {
|
|
91
|
-
if (idleTimer)
|
|
92
|
-
clearTimeout(idleTimer);
|
|
93
|
-
idleTimer = null;
|
|
94
|
-
if (!passThrough.destroyed)
|
|
95
|
-
passThrough.destroy();
|
|
96
|
-
if (metricsTransform && !metricsTransform.destroyed)
|
|
97
|
-
metricsTransform.destroy();
|
|
98
|
-
if (!upstreamRes.destroyed)
|
|
99
|
-
upstreamRes.destroy();
|
|
100
|
-
}
|
|
101
|
-
function collectMetrics(isComplete) {
|
|
102
|
-
if (!metricsTransform)
|
|
103
|
-
return undefined;
|
|
104
|
-
const result = metricsTransform.getExtractor().getMetrics();
|
|
105
|
-
if (!isComplete) {
|
|
106
|
-
return { ...result, is_complete: 0 };
|
|
107
|
-
}
|
|
108
|
-
return result;
|
|
109
|
-
}
|
|
110
|
-
reply.raw.on("close", () => {
|
|
111
|
-
if (!resolved) {
|
|
112
|
-
cleanup();
|
|
113
|
-
resolve({ statusCode, responseBody: undefined, upstreamResponseHeaders: sseHeaders, sentHeaders: upstreamHeaders, metricsResult: collectMetrics(false) });
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
passThrough.on("error", () => {
|
|
117
|
-
cleanup();
|
|
118
|
-
if (!resolved) {
|
|
119
|
-
resolved = true;
|
|
120
|
-
resolve({ statusCode, responseBody: undefined, upstreamResponseHeaders: sseHeaders, sentHeaders: upstreamHeaders, metricsResult: collectMetrics(false) });
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
function resetIdleTimer() {
|
|
124
|
-
if (idleTimer)
|
|
125
|
-
clearTimeout(idleTimer);
|
|
126
|
-
idleTimer = setTimeout(() => {
|
|
127
|
-
cleanup();
|
|
128
|
-
if (!resolved) {
|
|
129
|
-
resolved = true;
|
|
130
|
-
resolve({ statusCode, responseBody: undefined, upstreamResponseHeaders: sseHeaders, sentHeaders: upstreamHeaders, metricsResult: collectMetrics(false) });
|
|
131
|
-
}
|
|
132
|
-
}, timeoutMs);
|
|
133
|
-
}
|
|
134
|
-
resetIdleTimer();
|
|
135
|
-
upstreamRes.on("data", (chunk) => {
|
|
136
|
-
if (resolved)
|
|
137
|
-
return;
|
|
138
|
-
resetIdleTimer();
|
|
139
|
-
pipeEntry.write(chunk);
|
|
140
|
-
captureChunks.push(chunk);
|
|
141
|
-
});
|
|
142
|
-
upstreamRes.on("end", () => {
|
|
143
|
-
if (resolved)
|
|
144
|
-
return;
|
|
145
|
-
resolved = true;
|
|
146
|
-
if (idleTimer)
|
|
147
|
-
clearTimeout(idleTimer);
|
|
148
|
-
pipeEntry.end();
|
|
149
|
-
reply.raw.end();
|
|
150
|
-
resolve({
|
|
151
|
-
statusCode,
|
|
152
|
-
responseBody: Buffer.concat(captureChunks).toString("utf-8"),
|
|
153
|
-
upstreamResponseHeaders: sseHeaders,
|
|
154
|
-
sentHeaders: upstreamHeaders,
|
|
155
|
-
metricsResult: collectMetrics(true),
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
upstreamRes.on("error", (err) => {
|
|
159
|
-
if (resolved)
|
|
160
|
-
return;
|
|
161
|
-
resolved = true;
|
|
162
|
-
cleanup();
|
|
163
|
-
reject(err);
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
upstreamReq.on("error", (err) => reject(err));
|
|
167
|
-
upstreamReq.write(payload);
|
|
168
|
-
upstreamReq.end();
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
// ---------- GET proxy ----------
|
|
172
|
-
export function proxyGetRequest(backend, apiKey, clientHeaders, upstreamPath, buildHeaders) {
|
|
173
|
-
return new Promise((resolve, reject) => {
|
|
174
|
-
const url = new URL(`${backend.base_url}${upstreamPath}`);
|
|
175
|
-
const headers = buildHeaders(clientHeaders, apiKey);
|
|
176
|
-
const options = buildRequestOptions(url, headers, "GET");
|
|
177
|
-
const req = createUpstreamRequest(url, options);
|
|
178
|
-
req.on("response", (res) => {
|
|
179
|
-
const chunks = [];
|
|
180
|
-
res.on("data", (chunk) => chunks.push(chunk));
|
|
181
|
-
res.on("end", () => {
|
|
182
|
-
resolve({
|
|
183
|
-
statusCode: res.statusCode || UPSTREAM_BAD_GATEWAY,
|
|
184
|
-
body: Buffer.concat(chunks).toString("utf-8"),
|
|
185
|
-
headers: filterHeaders(res.headers),
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
req.on("error", (err) => reject(err));
|
|
190
|
-
req.end();
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
// ---------- Shared header filter ----------
|
|
194
|
-
const SKIP_DOWNSTREAM = new Set([
|
|
195
|
-
"content-length",
|
|
196
|
-
"transfer-encoding",
|
|
197
|
-
"connection",
|
|
198
|
-
"keep-alive",
|
|
199
|
-
]);
|
|
200
|
-
function filterHeaders(raw) {
|
|
201
|
-
const out = {};
|
|
202
|
-
for (const [key, value] of Object.entries(raw)) {
|
|
203
|
-
if (value == null || SKIP_DOWNSTREAM.has(key.toLowerCase()))
|
|
204
|
-
continue;
|
|
205
|
-
out[key] = Array.isArray(value) ? value.join(", ") : value;
|
|
206
|
-
}
|
|
207
|
-
return out;
|
|
208
|
-
}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{F as e,L as t,S as n,Y as r,_ as i,b as a,f as o,g as s,gt as c,h as l,it as u,mt as d,ot as ee,v as f,x as p,y as m,yt as h}from"./client-Mb8fy_bC.js";import{n as g,r as _}from"./button-D54q76GQ.js";import{n as v,r as y,t as b}from"./CollapsibleTrigger-BFNhb19_.js";import{i as te,n as ne,r as x,t as S}from"./TabsTrigger-DErAbTuM.js";import{r as C}from"./lib-BgOqOzXI.js";import{n as w,t as T}from"./CardContent-CucI6u41.js";import{t as re}from"./CardHeader-d-DYsWxe.js";import{a as ie,i as E,n as D,o as ae,r as O,t as oe}from"./TableHeader-BpscAtT3.js";import{t as se}from"./useClipboard-DO-38TXr.js";var k=n({__name:`Skeleton`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(t){let n=t;return(t,r)=>(e(),m(`div`,{"data-slot":`skeleton`,class:c(d(_)(`bg-muted rounded-md animate-pulse`,n.class))},null,2))}}),A={class:`relative`},j={class:`bg-background text-foreground rounded-md p-3 text-xs overflow-auto max-h-[40vh] whitespace-pre-wrap break-all border`},ce=n({__name:`JsonCopyBlock`,props:{content:{},hideCopyButton:{type:Boolean}},setup(t){let n=t,{copied:o,copy:c}=se();async function l(){await c(n.content)}return(n,c)=>(e(),m(`div`,A,[t.hideCopyButton?f(``,!0):(e(),i(d(g),{key:0,variant:`outline`,size:`sm`,class:`absolute top-2 right-2 h-7 text-xs`,onClick:l},{default:r(()=>[a(h(d(o)?`已复制`:`复制`),1)]),_:1})),s(`pre`,j,h(t.content),1)]))}}),M={class:`opacity-70`},N=n({__name:`StatPill`,props:{label:{},value:{},highlight:{type:Boolean}},setup(t){return(n,o)=>(e(),i(d(C),{variant:t.highlight?`default`:`secondary`,class:`font-mono text-sm px-3 py-1.5 rounded-md gap-1`},{default:r(()=>[s(`span`,M,h(t.label)+`:`,1),a(` `+h(t.value),1)]),_:1},8,[`variant`]))}}),P=n({__name:`TagPill`,props:{label:{}},setup(t){return(n,o)=>(e(),i(d(C),{variant:`outline`,class:`font-mono text-[10px] rounded-full px-2 py-0.5`},{default:r(()=>[a(h(t.label),1)]),_:1}))}}),F={system:`bg-muted text-muted-foreground`,user:`bg-info-light text-info-dark dark:text-info`,assistant:`bg-success-light text-success-dark dark:text-success`,tool:`bg-warning-light text-warning-dark dark:text-warning`},I={thinking:`bg-info-light text-info-dark dark:text-info`,tool_use:`bg-warning-light text-warning-dark dark:text-warning`,tool_result:`bg-success-light text-success-dark dark:text-success`,text:`bg-success-light text-success-dark dark:text-success`,error:`bg-danger-light text-danger-dark dark:text-danger`},L={thinking:`border-info`,tool_use:`border-warning`,tool_result:`border-success`,text:`border-success`,error:`border-danger`},R={"system-reminder":`bg-muted text-muted-foreground`,thinking:`bg-info-light text-info-dark dark:text-info`,"antml:function_calls":`bg-warning-light text-warning-dark dark:text-warning`,"antml:function_results":`bg-success-light text-success-dark dark:text-success`,tool_use:`bg-warning-light text-warning-dark dark:text-warning`,tool_result:`bg-success-light text-success-dark dark:text-success`,"env-info":`bg-info-light text-info-dark dark:text-info`,feedback:`bg-warning-light text-warning-dark dark:text-warning`,error:`bg-danger-light text-danger-dark dark:text-danger`,"local-command-caveat":`bg-muted text-muted-foreground`,"local-command-stdout":`bg-muted text-muted-foreground`,"command-name":`bg-info-light text-info-dark dark:text-info`,"command-message":`bg-info-light text-info-dark dark:text-info`,"command-args":`bg-info-light text-info-dark dark:text-info`},z=`bg-muted text-muted-foreground`,B=e=>F[e]??z,V=e=>I[e]??z,le=e=>L[e]??`border-muted`,H=e=>R[e]??z,U={class:`w-8 h-8 rounded-full bg-teal-600 text-white flex items-center justify-center text-xs font-bold`},W={class:`flex-1`},G={class:`text-sm font-medium text-teal-900 dark:text-teal-100`},K={key:0,class:`text-xs text-teal-700 dark:text-teal-300`},q={key:0,class:`text-right text-xs text-teal-700 dark:text-teal-300 space-y-0.5`},ue=n({__name:`InfoBanner`,props:{icon:{},title:{},subtitle:{},details:{}},setup(n){return(a,c)=>(e(),i(d(w),{class:`border-teal-200 dark:border-teal-800`},{default:r(()=>[p(d(T),{class:`p-3 flex items-center gap-3 bg-teal-50 dark:bg-teal-900`},{default:r(()=>[s(`div`,U,h(n.icon),1),s(`div`,W,[s(`div`,G,h(n.title),1),n.subtitle?(e(),m(`div`,K,h(n.subtitle),1)):f(``,!0)]),n.details?.length?(e(),m(`div`,q,[(e(!0),m(o,null,t(n.details,t=>(e(),m(`div`,{key:t},h(t),1))),128))])):f(``,!0)]),_:1})]),_:1}))}}),J=2,Y=/<([a-zA-Z][a-zA-Z0-9:_-]*)(?:\s[^>]*)?>([\s\S]*?)<\/\1>/g;function X(e){let t=new RegExp(Y.source,`g`),n=[],r=0,i;for(;(i=t.exec(e))!==null;){let a=e.slice(r,i.index).trim();a&&n.push({type:`text`,text:a}),n.push({type:i[1],text:i[2]}),r=t.lastIndex}let a=e.slice(r).trim();return a&&n.push({type:`text`,text:a}),n.length>0?n:[{type:`text`,text:e}]}function Z(e){return typeof e==`string`?X(e):Array.isArray(e)?e.flatMap(e=>{let t=e,n=String(t.type||`unknown`);if(n===`text`&&typeof t.text==`string`)return X(t.text);if(n===`image`)return[{type:`image`,text:``}];if(n===`tool_use`){let e=String(t.name||``);return[{type:`tool_use`,text:t.input?JSON.stringify(t.input,null,J):``,label:e||void 0}]}if(n===`tool_result`){let e=t.content,n=``;return typeof e==`string`?n=e:Array.isArray(e)&&(n=e.map(e=>typeof e.text==`string`?e.text:JSON.stringify(e)).join(`
|
|
2
|
-
`)),[{type:`tool_result`,text:n}]}return n===`thinking`?[{type:`thinking`,text:String(t.thinking||``)}]:[{type:n,text:typeof t.text==`string`?t.text:``}]}):[{type:`text`,text:String(e??``)}]}var de={key:0,class:`flex items-center justify-between py-2 border-b mb-2 sticky top-0 z-10 bg-background`},Q={key:0,class:`text-destructive text-sm`},fe={key:1,class:`text-xs text-muted-foreground break-all`},pe={class:`flex flex-wrap gap-2`},me={class:`rounded-md border overflow-hidden mt-1`},he={key:2,class:`space-y-2`},ge={key:0,class:`text-xs text-muted-foreground`},_e={key:0},ve={key:0,class:`text-sm`},ye={key:1,class:`text-sm whitespace-pre-wrap break-all`},be={key:1,class:`text-xs text-muted-foreground`},xe={class:`mt-1 whitespace-pre-wrap break-all text-[11px] bg-muted rounded-md p-2 border`},Se={key:2,class:`text-xs`},Ce={key:3},we={class:`flex flex-wrap gap-1`},Te={key:4},Ee={key:0},De={class:`mt-1 whitespace-pre-wrap break-all text-xs bg-muted rounded p-2 border`},Oe=8,ke=1024,Ae=n({__name:`LogRequestViewer`,props:{raw:{},apiType:{},showUrl:{type:Boolean},mode:{}},setup(n){let _=n,k=ee(!1),A=u({}),j=ee(!1),{copied:M,copy:F}=se(),I=l(()=>{try{return JSON.parse(_.raw)}catch{return{}}}),L=l(()=>{try{return JSON.parse(_.raw),!1}catch{return!0}});async function R(){await F(_.raw)}let z=l(()=>{let e=I.value.headers||{},t=new Set(Object.keys(e));return Object.entries(e).filter(([e])=>t.has(e)).map(([e,t])=>e.toLowerCase()===`authorization`?[e,`Bearer sk-****`]:[e,t])}),V=l(()=>{let e=I.value.body;if(typeof e==`string`)try{return JSON.parse(e)}catch{return{}}return e||{}}),le=l(()=>(I.value.headers?.[`user-agent`]||``).includes(`claude-cli`)),U=l(()=>{let e=(I.value.headers?.[`user-agent`]||``).match(/claude-cli\/[^\s]+\s+\(([^)]+)\)/);return e?e[1]:`external, cli`}),W=l(()=>{let e=V.value.thinking;return e&&typeof e.budget_tokens==`number`?e.budget_tokens:void 0}),G=l(()=>{let e=V.value.tools;return Array.isArray(e)?e.length:void 0}),K=l(()=>{let e=[];return W.value!=null&&e.push(`thinking: ${W.value} tokens`),G.value!=null&&e.push(`tools: ${G.value} 个`),e}),q=l(()=>(V.value.messages||[]).map(e=>{let t=Z(e.content),n={};for(let e of t)e.type!==`text`&&e.text&&(n[e.type]=(n[e.type]||0)+1);let r=new Set(Object.keys(n)),i=Object.entries(n).filter(([e])=>r.has(e)).map(([e,t])=>`${e}${t>1?` x${t}`:``}`).join(`, `)||void 0;return{role:e.role,blocks:t,blockSummary:i}})),J=l(()=>(V.value.tools||[]).map(e=>e.function?.name||e.name||`unknown`).filter(Boolean)),Y=l(()=>j.value?J.value:J.value.slice(0,Oe)),X=l(()=>{let e=V.value.system;return e?Array.isArray(e)?e.map(e=>({type:e.type||`text`,text:e.text||``})):typeof e==`string`?[{type:`text`,text:e}]:[{type:`unknown`,text:JSON.stringify(e)}]:[]}),Ae=new Set([`model`,`stream`,`max_tokens`,`thinking`,`messages`,`tools`,`system`]),je=l(()=>{let e={};for(let t of Object.keys(V.value))Ae.has(t)||(e[t]=V.value[t]);return e}),$=l(()=>Object.keys(je.value));function Me(e){let t=new TextEncoder().encode(e).length;return t<ke?`${t}B`:`${(t/ke).toFixed(1)}KB`}return(l,u)=>(e(),i(d(te),{"default-value":n.mode??`structured`,"model-value":n.mode,class:`w-full`},{default:r(()=>[n.mode?f(``,!0):(e(),m(`div`,de,[p(d(ne),null,{default:r(()=>[p(d(S),{value:`structured`},{default:r(()=>[...u[2]||=[a(`结构化`,-1)]]),_:1}),p(d(S),{value:`raw`},{default:r(()=>[...u[3]||=[a(`原始 JSON`,-1)]]),_:1})]),_:1}),p(d(g),{variant:`ghost`,size:`xs`,class:`h-auto py-1`,onClick:R},{default:r(()=>[a(h(d(M)?`已复制`:`复制 JSON`),1)]),_:1})])),p(d(x),{value:`structured`,class:`space-y-3`},{default:r(()=>[L.value?(e(),m(`div`,Q,`解析失败,请切换到原始 JSON 查看`)):(e(),m(o,{key:1},[le.value?(e(),i(ue,{key:0,icon:`CC`,title:`Claude Code 请求`,subtitle:`user-agent: ${U.value}`,details:K.value},null,8,[`subtitle`,`details`])):f(``,!0),n.showUrl&&I.value.url?(e(),m(`div`,fe,h(I.value.url),1)):f(``,!0),s(`div`,pe,[I.value.body?.model?(e(),i(N,{key:0,label:`model`,value:String(I.value.body.model),highlight:!0},null,8,[`value`])):f(``,!0),I.value.body?.stream==null?f(``,!0):(e(),i(N,{key:1,label:`stream`,value:String(I.value.body.stream)},null,8,[`value`])),I.value.body?.max_tokens==null?f(``,!0):(e(),i(N,{key:2,label:`max_tokens`,value:String(I.value.body.max_tokens)},null,8,[`value`])),I.value.body?.thinking==null?f(``,!0):(e(),i(P,{key:3,label:`thinking`}))]),p(d(y),{open:k.value,"onUpdate:open":u[0]||=e=>k.value=e},{default:r(()=>[p(d(b),{"as-child":``},{default:r(()=>[p(d(g),{variant:`ghost`,size:`xs`,class:`px-0 h-auto`},{default:r(()=>[a(` Headers (`+h(z.value.length)+` 个) `,1)]),_:1})]),_:1}),p(d(v),null,{default:r(()=>[s(`div`,me,[p(d(ae),null,{default:r(()=>[p(d(oe),null,{default:r(()=>[p(d(O),null,{default:r(()=>[p(d(D),{class:`w-1/3`},{default:r(()=>[...u[4]||=[a(`Key`,-1)]]),_:1}),p(d(D),null,{default:r(()=>[...u[5]||=[a(`Value`,-1)]]),_:1})]),_:1})]),_:1}),p(d(ie),null,{default:r(()=>[(e(!0),m(o,null,t(z.value,([t,n])=>(e(),i(d(O),{key:t},{default:r(()=>[p(d(E),{class:`font-medium`},{default:r(()=>[a(h(t),1)]),_:2},1024),p(d(E),{class:`break-all`},{default:r(()=>[a(h(n),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})])]),_:1})]),_:1},8,[`open`]),q.value.length?(e(),m(`div`,he,[u[7]||=s(`div`,{class:`text-xs font-medium text-muted-foreground`},`Messages`,-1),(e(!0),m(o,null,t(q.value,(n,l)=>(e(),i(d(w),{key:l,class:`bg-muted/40`},{default:r(()=>[p(d(re),{class:`pb-2 flex flex-row items-center gap-2`},{default:r(()=>[p(d(C),{class:c(d(B)(n.role))},{default:r(()=>[a(h(n.role),1)]),_:2},1032,[`class`]),n.blockSummary?(e(),m(`span`,ge,h(n.blockSummary),1)):f(``,!0)]),_:2},1024),p(d(T),{class:`space-y-2`},{default:r(()=>[(e(!0),m(o,null,t(n.blocks,(t,n)=>(e(),m(`div`,{key:n},[t.type===`text`?(e(),m(`div`,_e,[t.text.length>120&&!A[`${l}-${n}`]?(e(),m(`div`,ve,[a(h(t.text.slice(0,120))+` `,1),p(d(g),{variant:`link`,size:`xs`,class:`px-0 h-auto`,onClick:e=>A[`${l}-${n}`]=!0},{default:r(()=>[...u[6]||=[a(`展开`,-1)]]),_:1},8,[`onClick`])])):(e(),m(`div`,ye,h(t.text),1))])):t.text?(e(),m(`div`,be,[p(d(y),null,{default:r(()=>[p(d(b),{"as-child":``},{default:r(()=>[p(d(g),{variant:`ghost`,size:`xs`,class:`px-0 h-auto`},{default:r(()=>[p(d(C),{class:c([d(H)(t.type),`mr-1`])},{default:r(()=>[a(h(t.label||t.type),1)]),_:2},1032,[`class`]),a(` `+h(Me(t.text)),1)]),_:2},1024)]),_:2},1024),p(d(v),null,{default:r(()=>[s(`pre`,xe,h(t.text),1)]),_:2},1024)]),_:2},1024)])):(e(),m(`div`,Se,[p(d(C),{class:c([d(H)(t.type),`mr-1`])},{default:r(()=>[a(h(t.label||t.type),1)]),_:2},1032,[`class`])]))]))),128))]),_:2},1024)]),_:2},1024))),128))])):f(``,!0),J.value.length?(e(),m(`div`,Ce,[u[8]||=s(`div`,{class:`text-xs font-medium text-muted-foreground mb-1`},`Tools`,-1),s(`div`,we,[(e(!0),m(o,null,t(Y.value,t=>(e(),i(P,{key:t,label:t},null,8,[`label`]))),128)),J.value.length>8?(e(),i(d(g),{key:0,variant:`ghost`,size:`xs`,class:`px-1 h-5`,onClick:u[1]||=e=>j.value=!j.value},{default:r(()=>[a(h(j.value?`收起`:`+${J.value.length-8}`),1)]),_:1})):f(``,!0)])])):f(``,!0),X.value.length?(e(),m(`div`,Te,[u[9]||=s(`div`,{class:`text-xs font-medium text-muted-foreground mb-1`},`System`,-1),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`space-y-2`},{default:r(()=>[(e(!0),m(o,null,t(X.value,(t,n)=>(e(),m(`div`,{key:n,class:`text-sm whitespace-pre-wrap break-all`},[p(d(C),{variant:`outline`,class:`mb-1`},{default:r(()=>[a(h(t.type),1)]),_:2},1024),t.text?(e(),m(`div`,Ee,h(t.text),1)):f(``,!0)]))),128))]),_:1})]),_:1})])):f(``,!0),$.value.length?(e(),i(d(y),{key:5},{default:r(()=>[p(d(b),{"as-child":``},{default:r(()=>[p(d(g),{variant:`ghost`,size:`xs`,class:`px-0 h-auto`},{default:r(()=>[...u[10]||=[a(` 其他字段 `,-1)]]),_:1})]),_:1}),p(d(v),null,{default:r(()=>[s(`pre`,De,h(JSON.stringify(je.value,null,2)),1)]),_:1})]),_:1})):f(``,!0)],64))]),_:1}),p(d(x),{value:`raw`},{default:r(()=>[p(ce,{content:n.raw,"hide-copy-button":``},null,8,[`content`])]),_:1})]),_:1},8,[`default-value`,`model-value`]))}}),je={class:`text-xs text-foreground`},$=n({__name:`SseEventLine`,props:{eventType:{},summary:{},highlight:{type:Boolean}},setup(t){return(n,r)=>(e(),m(`div`,{class:c([`px-3 py-2 flex items-center gap-2`,t.highlight?`bg-warning/10`:``])},[s(`span`,{class:c([`px-1.5 py-0.5 rounded text-[10px] font-medium`,{"bg-teal-200 text-teal-700 dark:bg-teal-800 dark:text-teal-300":t.eventType===`message_start`,"bg-teal-300 text-teal-700 dark:bg-teal-700 dark:text-teal-200":t.eventType===`content_block_start`,"bg-muted text-muted-foreground":t.eventType===`content_block_delta`,"bg-teal-500 text-white dark:bg-teal-600":t.eventType===`message_delta`,"bg-success-light text-success":t.eventType===`message_stop`}])},h(t.eventType),3),s(`span`,je,h(t.summary),1)],2))}}),Me=5,Ne=2,Pe=3;function Fe(e,t,n){let r=l(()=>{if(!t||!e.value)return[];let n=e.value.split(`
|
|
3
|
-
`),r=[];for(let e of n){let t=e.trim();if(!t.startsWith(`data:`))continue;let n=t.slice(Me).trim();if(n===`[DONE]`){r.push({type:`done`,data:n});continue}try{let e=JSON.parse(n);r.push({type:`data`,data:e})}catch{r.push({type:`raw`,data:n})}}return r});return{sseEvents:r,assembledBlocks:l(()=>{if(!t||!e.value)return[];let n=[],i=null;for(let e of r.value){if(e.type!==`data`)continue;let t=e.data;if(t.type===`content_block_start`){let e=t.content_block;if(i={type:String(e?.type||``),content:``,eventCount:0,toolName:e?.name?String(e.name):void 0},i.type===`tool_use`&&e?.input){let t=e.input;Object.keys(t).length>0&&(i.content=JSON.stringify(t,null,Ne))}continue}if(t.type===`content_block_delta`&&i){let e=t.delta;i.content+=e.thinking||e.text||e.partial_json||``,i.eventCount++;continue}t.type===`content_block_stop`&&i&&(n.push(i),i=null)}return i&&n.push(i),n}),sseMeta:l(()=>{let e=``,t=``,n=0,i=0,a=``;for(let o of r.value){if(o.type!==`data`)continue;let r=o.data;if(r.type===`message_start`){let i=r.message;e=String(i?.id||``),t=String(i?.model||``),n=Number(i?.usage?.input_tokens??0)}if(r.type===`message_delta`){let e=r.delta,t=r.usage;a=String(e?.stop_reason||``),i=Number(t?.output_tokens??0)}}return{id:e,model:t,inputTokens:n,outputTokens:i,stopReason:a}}),openaiAssembled:l(()=>{if(n!==`openai`||!t)return null;let e=``,i=``,a=``,o=null,s=0;for(let t of r.value){if(t.type!==`data`)continue;let n=t.data,r=n.choices||[],c=r[0]?.delta;c?.role&&(e=String(c.role)),c?.content&&(i+=String(c.content),s++),r[0]?.finish_reason&&(a=String(r[0].finish_reason)),n.usage&&(o=n.usage)}return{role:e,content:i,contentEventCount:s,finishReason:a,usage:o}}),anthropicMessageStart:l(()=>{for(let e of r.value){if(e.type!==`data`)continue;let t=e.data;if(t.type===`message_start`){let e=t.message;return{id:String(e?.id||``),model:String(e?.model||``),input_tokens:Number(e?.usage?.input_tokens??0)}}}return null}),anthropicContentBlockStarts:l(()=>{let e=[];for(let t of r.value){if(t.type!==`data`)continue;let n=t.data;if(n.type===`content_block_start`){let t=n.content_block;e.push({index:Number(n.index??0),type:String(t?.type||``)})}}return e}),anthropicDeltaGroups:l(()=>{let e={};for(let t of r.value){if(t.type!==`data`)continue;let n=t.data;if(n.type!==`content_block_delta`)continue;let r=n.delta,i=String(r?.type||`unknown`);e[i]||(e[i]={deltaType:i,kept:0,folded:0,foldedChars:0});let a=e[i];if(a.kept<Pe)a.kept++;else{a.folded++;let e=r,t=String(e.thinking||e.text||e.partial_json||``);a.foldedChars+=t.length}}return Object.values(e).filter(e=>e.kept>0||e.folded>0)}),anthropicMessageDelta:l(()=>{for(let e of r.value){if(e.type!==`data`)continue;let t=e.data;if(t.type===`message_delta`){let e=t.delta,n=t.usage;return{output_tokens:Number(n?.output_tokens??0),stop_reason:String(e?.stop_reason||``)}}}return null}),anthropicMessageStop:l(()=>r.value.some(e=>e.type===`data`&&e.data.type===`message_stop`)),openaiSseRole:l(()=>{for(let e of r.value){if(e.type!==`data`)continue;let t=(e.data.choices||[])[0]?.delta;if(t?.role)return String(t.role)}return null}),openaiSseFirstContent:l(()=>{for(let e of r.value){if(e.type!==`data`)continue;let t=(e.data.choices||[])[0]?.delta;if(t?.content)return String(t.content)}return null}),openaiSseFinishReason:l(()=>{for(let e of r.value){if(e.type!==`data`)continue;let t=(e.data.choices||[])[0]?.finish_reason;if(t)return String(t)}return null}),openaiSseCollapsedCount:l(()=>{let e=0,t=!1;for(let n of r.value){if(n.type!==`data`)continue;let r=(n.data.choices||[])[0]?.delta;if(!t){r?.content&&(t=!0);continue}(r?.content||r?.role)&&e++}return e}),openaiSseUsage:l(()=>{for(let e=r.value.length-1;e>=0;e--){let t=r.value[e];if(t.type!==`data`)continue;let n=t.data.usage;if(n)return{prompt_tokens:n.prompt_tokens,completion_tokens:n.completion_tokens,total_tokens:n.total_tokens,cached_tokens:n.cached_tokens??n.prompt_tokens_details?.cached_tokens}}return null})}}var Ie={key:0,class:`flex items-center justify-between py-2 border-b mb-2 sticky top-0 z-10 bg-background`},Le={key:0,class:`text-destructive text-sm`},Re={class:`flex items-center gap-2`},ze={class:`rounded-md border overflow-hidden mt-1`},Be={class:`flex flex-wrap gap-2`},Ve={key:0,class:`space-y-2`},He={class:`mt-1 whitespace-pre-wrap break-all text-xs bg-muted rounded-md p-2 border`},Ue={key:1,class:`grid grid-cols-2 sm:grid-cols-4 gap-2`},We={class:`font-medium`},Ge={class:`font-medium`},Ke={class:`font-medium`},qe={class:`font-medium`},Je={class:`flex flex-wrap gap-2`},Ye={key:0,class:`space-y-2`},Xe={class:`flex items-center gap-2 mb-2`},Ze={key:0,class:`text-sm`},Qe={key:1,class:`grid grid-cols-2 sm:grid-cols-4 gap-2`},$e={class:`font-medium`},et={class:`font-medium`},tt={class:`font-medium`},nt={class:`font-medium`},rt={key:1,class:`space-y-3`},it={class:`flex gap-1`},at={class:`flex flex-wrap gap-2`},ot={class:`flex items-center gap-2 mb-2`},st={class:`text-xs text-muted-foreground`},ct={key:0,class:`text-xs font-mono`},lt={class:`whitespace-pre-wrap break-all text-sm bg-muted rounded-md p-3 border`},ut={key:1,class:`whitespace-pre-wrap break-all text-sm bg-muted rounded-md p-3 border max-h-[40vh] overflow-auto`},dt={class:`flex flex-wrap gap-2`},ft={class:`flex flex-wrap gap-2`},pt={class:`whitespace-pre-wrap break-all text-sm bg-muted rounded-md p-3 max-h-[40vh] overflow-auto`},mt={key:0,class:`grid grid-cols-2 sm:grid-cols-4 gap-2`},ht={class:`font-medium`},gt={class:`font-medium`},_t={class:`font-medium`},vt={key:0,class:`text-sm`},yt={key:1,class:`text-sm`},bt={key:2,class:`text-sm`},xt={key:3,class:`text-xs text-muted-foreground`},St={key:4,class:`grid grid-cols-2 sm:grid-cols-4 gap-2`},Ct={class:`font-medium`},wt={class:`font-medium`},Tt={class:`font-medium`},Et={class:`font-medium`},Dt=400,Ot=n({__name:`LogResponseViewer`,props:{raw:{},apiType:{},isStream:{type:Boolean},mode:{}},setup(n){let _=n,k=l(()=>{try{return JSON.parse(_.raw)}catch{return null}}),A=l(()=>k.value===null),j=l(()=>(k.value?.statusCode??0)>=Dt?`destructive`:`default`),M=l(()=>{let e=k.value?.headers||{};return Object.entries(e)}),P=l(()=>{if(!_.isStream&&k.value?.body)try{return JSON.parse(k.value.body)}catch{return{}}return{}}),F=l(()=>(P.value.choices||[]).map(e=>({role:e.message?.role||`assistant`,content:e.message?.content||``,finish_reason:e.finish_reason||``}))),I=l(()=>{let e=P.value.usage;return e?{prompt_tokens:e.prompt_tokens,completion_tokens:e.completion_tokens,total_tokens:e.total_tokens,cached_tokens:e.cached_tokens??e.prompt_tokens_details?.cached_tokens}:null}),L=l(()=>P.value.content||[]),R=l(()=>{let e=P.value.usage;return e?{input_tokens:e.input_tokens,output_tokens:e.output_tokens,cache_creation_input_tokens:e.cache_creation_input_tokens,cache_read_input_tokens:e.cache_read_input_tokens}:null}),{assembledBlocks:z,sseMeta:B,openaiAssembled:H,anthropicMessageStart:U,anthropicContentBlockStarts:W,anthropicDeltaGroups:G,anthropicMessageDelta:K,anthropicMessageStop:q,openaiSseRole:ue,openaiSseFirstContent:J,openaiSseFinishReason:Y,openaiSseCollapsedCount:X,openaiSseUsage:Z}=Fe(l(()=>k.value?.body),_.isStream,_.apiType),de=u({}),Q=ee(`assembled`),{copied:fe,copy:pe}=se();async function me(){await pe(_.raw)}return(l,u)=>(e(),i(d(te),{"default-value":n.mode??`structured`,"model-value":n.mode,class:`w-full`},{default:r(()=>[n.mode?f(``,!0):(e(),m(`div`,Ie,[p(d(ne),null,{default:r(()=>[p(d(S),{value:`structured`},{default:r(()=>[...u[2]||=[a(`结构化`,-1)]]),_:1}),p(d(S),{value:`raw`},{default:r(()=>[a(h(n.isStream?`原始 SSE 文本`:`原始 JSON`),1)]),_:1})]),_:1}),p(d(g),{variant:`ghost`,size:`xs`,class:`h-auto py-1`,onClick:me},{default:r(()=>[a(h(d(fe)?`已复制`:`复制`),1)]),_:1})])),p(d(x),{value:`structured`,class:`space-y-3`},{default:r(()=>[A.value?(e(),m(`div`,Le,`解析失败,请切换到原始 JSON 查看`)):(e(),m(o,{key:1},[s(`div`,Re,[p(d(C),{variant:j.value},{default:r(()=>[a(`status: `+h(k.value.statusCode),1)]),_:1},8,[`variant`])]),p(d(y),null,{default:r(()=>[p(d(b),{"as-child":``},{default:r(()=>[p(d(g),{variant:`ghost`,size:`xs`,class:`px-0 h-auto text-xs`},{default:r(()=>[a(` Headers (`+h(M.value.length)+` 个) `,1)]),_:1})]),_:1}),p(d(v),null,{default:r(()=>[s(`div`,ze,[p(d(ae),null,{default:r(()=>[p(d(oe),null,{default:r(()=>[p(d(O),null,{default:r(()=>[p(d(D),{class:`w-1/3`},{default:r(()=>[...u[3]||=[a(`Key`,-1)]]),_:1}),p(d(D),null,{default:r(()=>[...u[4]||=[a(`Value`,-1)]]),_:1})]),_:1})]),_:1}),p(d(ie),null,{default:r(()=>[(e(!0),m(o,null,t(M.value,([t,n])=>(e(),i(d(O),{key:t},{default:r(()=>[p(d(E),{class:`font-medium`},{default:r(()=>[a(h(t),1)]),_:2},1024),p(d(E),{class:`break-all`},{default:r(()=>[a(h(n),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})])]),_:1})]),_:1}),n.isStream?(e(),m(`div`,rt,[s(`div`,it,[p(d(g),{variant:`ghost`,class:c([Q.value===`assembled`?`bg-secondary`:``,`h-auto py-1`]),size:`xs`,onClick:u[0]||=e=>Q.value=`assembled`},{default:r(()=>[...u[16]||=[a(`完整响应`,-1)]]),_:1},8,[`class`]),p(d(g),{variant:`ghost`,class:c([Q.value===`raw-events`?`bg-secondary`:``,`h-auto py-1`]),size:`xs`,onClick:u[1]||=e=>Q.value=`raw-events`},{default:r(()=>[...u[17]||=[a(`原始事件流`,-1)]]),_:1},8,[`class`])]),Q.value===`assembled`?(e(),m(o,{key:0},[n.apiType===`anthropic`?(e(),m(o,{key:0},[s(`div`,at,[d(B).id?(e(),i(N,{key:0,label:`id`,value:d(B).id},null,8,[`value`])):f(``,!0),d(B).model?(e(),i(N,{key:1,label:`model`,value:d(B).model,highlight:!0},null,8,[`value`])):f(``,!0),p(N,{label:`input`,value:String(d(B).inputTokens)},null,8,[`value`])]),(e(!0),m(o,null,t(d(z),(t,n)=>(e(),m(`div`,{key:n,class:c([`rounded-md border p-3`,d(le)(t.type)])},[s(`div`,ot,[p(d(C),{class:c(d(V)(t.type))},{default:r(()=>[a(h(t.type),1)]),_:2},1032,[`class`]),s(`span`,st,h(t.eventCount)+` 个 delta 事件`,1),t.toolName?(e(),m(`span`,ct,h(t.toolName),1)):f(``,!0)]),t.content.length>500&&!de[n]?(e(),m(o,{key:0},[s(`pre`,lt,h(t.content.slice(0,500))+`...`,1),p(d(g),{variant:`link`,size:`xs`,class:`px-0`,onClick:e=>de[n]=!0},{default:r(()=>[...u[18]||=[a(`展开全部`,-1)]]),_:1},8,[`onClick`])],64)):(e(),m(`pre`,ut,h(t.content),1))],2))),128)),s(`div`,dt,[p(N,{label:`stop_reason`,value:d(B).stopReason||`-`},null,8,[`value`]),p(N,{label:`output_tokens`,value:String(d(B).outputTokens||`-`)},null,8,[`value`])])],64)):f(``,!0),n.apiType===`openai`&&d(H)?(e(),m(o,{key:1},[s(`div`,ft,[d(H).role?(e(),i(N,{key:0,label:`role`,value:d(H).role},null,8,[`value`])):f(``,!0),p(N,{label:`content delta`,value:String(d(H).contentEventCount)},null,8,[`value`]),d(H).finishReason?(e(),i(N,{key:1,label:`finish`,value:d(H).finishReason},null,8,[`value`])):f(``,!0)]),s(`div`,{class:c([`rounded-md border p-3`,d(le)(`text`)])},[s(`pre`,pt,h(d(H).content),1)],2),d(H).usage?(e(),m(`div`,mt,[p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[19]||=s(`div`,{class:`text-muted-foreground`},`prompt_tokens`,-1),s(`div`,ht,h(d(H).usage.prompt_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[20]||=s(`div`,{class:`text-muted-foreground`},`completion_tokens`,-1),s(`div`,gt,h(d(H).usage.completion_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[21]||=s(`div`,{class:`text-muted-foreground`},`total_tokens`,-1),s(`div`,_t,h(d(H).usage.total_tokens??`-`),1)]),_:1})]),_:1})])):f(``,!0)],64)):f(``,!0)],64)):f(``,!0),Q.value===`raw-events`?(e(),m(o,{key:1},[n.apiType===`openai`?(e(),m(o,{key:0},[d(ue)?(e(),m(`div`,vt,[u[22]||=s(`span`,{class:`text-muted-foreground`},`role:`,-1),a(` `+h(d(ue)),1)])):f(``,!0),d(J)?(e(),m(`div`,yt,[u[23]||=s(`span`,{class:`text-muted-foreground`},`first content delta:`,-1),a(` `+h(d(J)),1)])):f(``,!0),d(Y)?(e(),m(`div`,bt,[u[24]||=s(`span`,{class:`text-muted-foreground`},`finish_reason:`,-1),a(` `+h(d(Y)),1)])):f(``,!0),d(X)>0?(e(),m(`div`,xt,` +`+h(d(X))+` 个 delta 事件已折叠 `,1)):f(``,!0),d(Z)?(e(),m(`div`,St,[p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[25]||=s(`div`,{class:`text-muted-foreground`},`prompt_tokens`,-1),s(`div`,Ct,h(d(Z).prompt_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[26]||=s(`div`,{class:`text-muted-foreground`},`completion_tokens`,-1),s(`div`,wt,h(d(Z).completion_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[27]||=s(`div`,{class:`text-muted-foreground`},`total_tokens`,-1),s(`div`,Tt,h(d(Z).total_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[28]||=s(`div`,{class:`text-muted-foreground`},`cached_tokens`,-1),s(`div`,Et,h(d(Z).cached_tokens??`-`),1)]),_:1})]),_:1})])):f(``,!0)],64)):f(``,!0),n.apiType===`anthropic`?(e(),m(o,{key:1},[d(U)?(e(),i($,{key:0,"event-type":`message_start`,summary:`id=${d(U).id} model=${d(U).model} input_tokens=${d(U).input_tokens}`},null,8,[`summary`])):f(``,!0),(e(!0),m(o,null,t(d(W),(t,n)=>(e(),i($,{key:`cbs-`+n,"event-type":`content_block_start`,summary:`[${t.index}] ${t.type}`},null,8,[`summary`]))),128)),(e(!0),m(o,null,t(d(G),(t,n)=>(e(),i($,{key:`dg-`+n,"event-type":`content_block_delta`,summary:`${t.deltaType} · keep ${t.kept} 个${t.folded>0?` +${t.folded} 个已折叠 (${t.foldedChars} 字符)`:``}`},null,8,[`summary`]))),128)),d(K)?(e(),i($,{key:1,"event-type":`message_delta`,summary:`output_tokens=${d(K).output_tokens} stop_reason=${d(K).stop_reason}`,highlight:!0},null,8,[`summary`])):f(``,!0),d(q)?(e(),i($,{key:2,"event-type":`message_stop`,summary:`流结束`})):f(``,!0)],64)):f(``,!0)],64)):f(``,!0)])):(e(),m(o,{key:0},[n.apiType===`openai`?(e(),m(o,{key:0},[s(`div`,Be,[P.value.id?(e(),i(N,{key:0,label:`id`,value:String(P.value.id)},null,8,[`value`])):f(``,!0),P.value.model?(e(),i(N,{key:1,label:`model`,value:String(P.value.model),highlight:!0},null,8,[`value`])):f(``,!0),P.value.system_fingerprint?(e(),i(N,{key:2,label:`fingerprint`,value:String(P.value.system_fingerprint)},null,8,[`value`])):f(``,!0)]),F.value.length?(e(),m(`div`,Ve,[u[6]||=s(`div`,{class:`text-xs font-medium text-muted-foreground`},`Choices`,-1),(e(!0),m(o,null,t(F.value,(t,n)=>(e(),i(d(w),{key:n,class:`bg-muted/40`},{default:r(()=>[p(d(re),{class:`pb-2 flex flex-row items-center gap-2`},{default:r(()=>[p(d(C),{variant:`secondary`},{default:r(()=>[a(h(t.role||`assistant`),1)]),_:2},1024),t.finish_reason?(e(),i(d(C),{key:0,variant:`outline`},{default:r(()=>[a(h(t.finish_reason),1)]),_:2},1024)):f(``,!0)]),_:2},1024),p(d(T),null,{default:r(()=>[p(d(y),null,{default:r(()=>[p(d(b),{"as-child":``},{default:r(()=>[p(d(g),{variant:`ghost`,size:`xs`,class:`px-0 h-auto text-xs`},{default:r(()=>[...u[5]||=[a(`内容`,-1)]]),_:1})]),_:1}),p(d(v),null,{default:r(()=>[s(`pre`,He,h(t.content),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))])):f(``,!0),I.value?(e(),m(`div`,Ue,[p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[7]||=s(`div`,{class:`text-muted-foreground`},`prompt_tokens`,-1),s(`div`,We,h(I.value.prompt_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[8]||=s(`div`,{class:`text-muted-foreground`},`completion_tokens`,-1),s(`div`,Ge,h(I.value.completion_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[9]||=s(`div`,{class:`text-muted-foreground`},`total_tokens`,-1),s(`div`,Ke,h(I.value.total_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[10]||=s(`div`,{class:`text-muted-foreground`},`cached_tokens`,-1),s(`div`,qe,h(I.value.cached_tokens??`-`),1)]),_:1})]),_:1})])):f(``,!0)],64)):f(``,!0),n.apiType===`anthropic`?(e(),m(o,{key:1},[s(`div`,Je,[P.value.id?(e(),i(N,{key:0,label:`id`,value:String(P.value.id)},null,8,[`value`])):f(``,!0),P.value.type?(e(),i(N,{key:1,label:`type`,value:String(P.value.type)},null,8,[`value`])):f(``,!0),P.value.model?(e(),i(N,{key:2,label:`model`,value:String(P.value.model),highlight:!0},null,8,[`value`])):f(``,!0),P.value.stop_reason?(e(),i(N,{key:3,label:`stop_reason`,value:String(P.value.stop_reason)},null,8,[`value`])):f(``,!0)]),L.value.length?(e(),m(`div`,Ye,[u[11]||=s(`div`,{class:`text-xs font-medium text-muted-foreground`},`Content`,-1),(e(!0),m(o,null,t(L.value,(t,n)=>(e(),m(`div`,{key:n,class:`rounded-md border p-3`},[s(`div`,Xe,[p(d(C),{class:c(d(V)(t.type))},{default:r(()=>[a(h(t.type),1)]),_:2},1032,[`class`]),t.text?(e(),m(`span`,Ze,h(t.text),1)):f(``,!0)])]))),128))])):f(``,!0),R.value?(e(),m(`div`,Qe,[p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[12]||=s(`div`,{class:`text-muted-foreground`},`input_tokens`,-1),s(`div`,$e,h(R.value.input_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[13]||=s(`div`,{class:`text-muted-foreground`},`output_tokens`,-1),s(`div`,et,h(R.value.output_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[14]||=s(`div`,{class:`text-muted-foreground`},`cache_creation`,-1),s(`div`,tt,h(R.value.cache_creation_input_tokens??`-`),1)]),_:1})]),_:1}),p(d(w),{class:`bg-muted/40`},{default:r(()=>[p(d(T),{class:`py-2 px-3 text-xs`},{default:r(()=>[u[15]||=s(`div`,{class:`text-muted-foreground`},`cache_read`,-1),s(`div`,nt,h(R.value.cache_read_input_tokens??`-`),1)]),_:1})]),_:1})])):f(``,!0)],64)):f(``,!0)],64))],64))]),_:1}),p(d(x),{value:`raw`},{default:r(()=>[p(ce,{content:n.raw,"hide-copy-button":``},null,8,[`content`])]),_:1})]),_:1},8,[`default-value`,`model-value`]))}});export{Ae as n,k as r,Ot as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{F as e,L as t,M as ee,S as n,Y as r,_ as i,b as a,f as o,g as s,gt as c,it as te,mt as l,ot as u,t as d,v as f,x as p,y as m,yt as h}from"./client-Mb8fy_bC.js";import{a as ne,i as re,n as ie,r as g,t as ae}from"./SelectValue-B32pgmTJ.js";import{n as _}from"./button-D54q76GQ.js";import{n as v,r as y,t as b}from"./CollapsibleTrigger-BFNhb19_.js";import{a as oe,i as se,n as ce,o as le,r as x,s as S,t as C}from"./dialog-DSH5k5Kj.js";import{t as ue}from"./Label-CXAeFn-r.js";import{n as w,r as T}from"./lib-BgOqOzXI.js";import{n as de,t as fe}from"./CardContent-CucI6u41.js";import{a as pe,i as E,n as D,o as me,r as O,t as he}from"./TableHeader-BpscAtT3.js";import{t as ge}from"./Input-HN3Il0-c.js";import{t as _e}from"./useClipboard-DO-38TXr.js";import{n as k,r as A,t as j}from"./LogResponseViewer-CyBzv02a.js";var ve={class:`p-6`},ye={class:`flex items-center justify-between mb-4`},be={class:`flex items-center gap-2`},xe={class:`bg-card rounded-lg border overflow-hidden`},Se={class:`font-mono`},Ce={key:2,class:`text-muted-foreground`},we={key:1,class:`text-muted-foreground`},Te={class:`flex items-center justify-between mt-4`},Ee={class:`text-sm text-muted-foreground`},De={class:`flex gap-1`},Oe={class:`px-3 py-1 text-sm text-muted-foreground`},ke={key:0,class:`font-mono text-xs text-muted-foreground font-normal select-all`},Ae={key:0,class:`space-y-3 py-4`},je={class:`flex gap-2`},Me={key:0,class:`flex items-center gap-2 mb-3 px-1`},Ne={class:`text-xs text-muted-foreground`},Pe={class:`bg-muted/50 rounded-md p-3 text-sm grid grid-cols-3 gap-2`},Fe={class:`font-medium font-mono`},Ie={key:0,class:`col-span-3`},Le={class:`font-mono text-xs`},Re={class:`font-medium`},ze={class:`font-medium`},Be={class:`font-medium`},Ve={class:`flex items-center justify-between px-4 py-2 border-b sticky top-0 z-10 bg-background`},He={class:`inline-flex h-8 items-center gap-1 rounded-md bg-muted p-1`},Ue={class:`p-4`},We={class:`flex items-center justify-between px-4 py-2 border-b sticky top-0 z-10 bg-background`},Ge={class:`inline-flex h-8 items-center gap-1 rounded-md bg-muted p-1`},Ke={class:`p-4`},qe={class:`flex items-center justify-between px-4 py-2 border-b sticky top-0 z-10 bg-background`},Je={class:`inline-flex h-8 items-center gap-1 rounded-md bg-muted p-1`},Ye={class:`p-4`},Xe={class:`flex items-center justify-between px-4 py-2 border-b sticky top-0 z-10 bg-background`},Ze={class:`inline-flex h-8 items-center gap-1 rounded-md bg-muted p-1`},Qe={class:`p-4`},$e={key:2,class:`py-8 text-center text-muted-foreground`},et={class:`mb-4`},M=20,N=n({__name:`Logs`,setup(n){let N=u([]),P=u(0),F=u(1),I=u(`all`),L=u(`all`),R=u([]),z=u(!1),B=u(30),V=u(!1),H=u(!1),U=u(null),W=u(!0),G=u(!1),K=u(!1),q=u(!1),J=te({client_request:`structured`,upstream_request:`structured`,upstream_response:`structured`,client_response:`structured`}),Y=u(null),{copy:tt}=_e();function nt(e){return U.value?{client_request:at(U.value),upstream_request:U.value.upstream_request||`{}`,upstream_response:U.value.upstream_response||U.value.response_body||`{}`,client_response:Q(U.value)}[e]:`{}`}async function X(e){await tt(nt(e))?(Y.value=e,setTimeout(()=>{Y.value=null},2e3)):w.error(`复制失败`)}function Z(e){return e===`openai`?`openai`:`anthropic`}function rt(e){if(!e)return`未知`;try{let t=JSON.parse(e);return t.action?t.detail?`${t.action}: ${t.detail}`:t.action:e}catch{return`未知`}}function it(e){return e.provider_id===`router`}function at(e){if(!e.client_request)return e.request_body||`{}`;try{let t=JSON.parse(e.client_request);if(t.body!=null)return e.client_request;if(e.request_body){try{t.body=JSON.parse(e.request_body)}catch{t.body=e.request_body}return JSON.stringify(t)}return e.client_request}catch{return e.client_request}}function Q(e){return e.client_response?e.client_response:e.response_body?JSON.stringify({statusCode:e.status_code,body:e.response_body}):``}async function ot(e){V.value=!0,H.value=!0,U.value=null,W.value=!0,G.value=!1,K.value=!1,q.value=!1,J.client_request=`structured`,J.upstream_request=`structured`,J.upstream_response=`structured`,J.client_response=`structured`;try{U.value=(await d.getLogDetail(e)).data}catch(e){console.error(`Failed to load log detail:`,e),w.error(`加载日志详情失败`)}finally{H.value=!1}}function st(e){ot(e)}function ct(e){return new Date(e).toLocaleString(`zh-CN`)}async function $(){try{let e={page:F.value,limit:M};I.value&&I.value!==`all`&&(e.api_type=I.value),L.value&&L.value!==`all`&&(e.router_key_id=L.value);let t=await d.getLogs(e);N.value=t.data.data,P.value=t.data.total}catch(e){console.error(`Failed to load logs:`,e),w.error(`加载日志失败`)}}function lt(){F.value=1,$()}function ut(){F.value>1&&(F.value--,$())}function dt(){F.value++,$()}async function ft(){try{let e=new Date(Date.now()-B.value*864e5).toISOString(),t=await d.deleteLogsBefore(e);z.value=!1,F.value=1,await $(),w.success(`已清理 ${t.data.deleted} 条日志`)}catch(e){console.error(`Failed to cleanup logs:`,e),w.error(`清理日志失败`)}}async function pt(){try{R.value=(await d.getRouterKeys()).data}catch(e){console.error(`Failed to load router keys:`,e),w.error(`加载密钥列表失败`)}}return ee(()=>{pt(),$()}),(ee,n)=>(e(),m(`div`,ve,[s(`div`,ye,[n[29]||=s(`h2`,{class:`text-lg font-semibold text-foreground`},`请求日志`,-1),s(`div`,be,[p(l(ne),{modelValue:I.value,"onUpdate:modelValue":[n[0]||=e=>I.value=e,lt]},{default:r(()=>[p(l(ie),{class:`w-[140px]`},{default:r(()=>[p(l(ae),{placeholder:`全部类型`})]),_:1}),p(l(re),null,{default:r(()=>[p(l(g),{value:`all`},{default:r(()=>[...n[24]||=[a(`全部类型`,-1)]]),_:1}),p(l(g),{value:`openai`},{default:r(()=>[...n[25]||=[a(`OpenAI`,-1)]]),_:1}),p(l(g),{value:`anthropic`},{default:r(()=>[...n[26]||=[a(`Anthropic`,-1)]]),_:1})]),_:1})]),_:1},8,[`modelValue`]),p(l(ne),{modelValue:L.value,"onUpdate:modelValue":[n[1]||=e=>L.value=e,lt]},{default:r(()=>[p(l(ie),{class:`w-48`},{default:r(()=>[p(l(ae),{placeholder:`全部密钥`})]),_:1}),p(l(re),null,{default:r(()=>[p(l(g),{value:`all`},{default:r(()=>[...n[27]||=[a(`全部密钥`,-1)]]),_:1}),(e(!0),m(o,null,t(R.value,t=>(e(),i(l(g),{key:t.id,value:t.id},{default:r(()=>[a(h(t.name),1)]),_:2},1032,[`value`]))),128))]),_:1})]),_:1},8,[`modelValue`]),p(l(_),{variant:`outline`,class:`text-destructive border-destructive hover:bg-destructive/10`,onClick:n[2]||=e=>z.value=!0},{default:r(()=>[...n[28]||=[a(` 清理日志 `,-1)]]),_:1})])]),s(`div`,xe,[p(l(me),null,{default:r(()=>[p(l(he),null,{default:r(()=>[p(l(O),{class:`bg-muted`},{default:r(()=>[p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[30]||=[a(`ID`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[31]||=[a(`时间`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[32]||=[a(`类型`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[33]||=[a(`模型`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[34]||=[a(`实际转发`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[35]||=[a(`状态码`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[36]||=[a(`延迟`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[37]||=[a(`流式`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[38]||=[a(`重试`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[39]||=[a(`错误`,-1)]]),_:1}),p(l(D),{class:`text-muted-foreground`},{default:r(()=>[...n[40]||=[a(`操作`,-1)]]),_:1})]),_:1})]),_:1}),p(l(pe),null,{default:r(()=>[(e(!0),m(o,null,t(N.value,t=>(e(),i(l(O),{key:t.id,class:c({"bg-destructive/10":(t.status_code??0)>=400,"bg-warning-light":t.is_retry})},{default:r(()=>[p(l(E),{class:`font-mono text-xs text-muted-foreground`,title:t.id},{default:r(()=>[a(h(t.id.slice(0,8)),1)]),_:2},1032,[`title`]),p(l(E),{class:`text-muted-foreground`},{default:r(()=>[a(h(ct(t.created_at)),1)]),_:2},1024),p(l(E),null,{default:r(()=>[p(l(T),{variant:t.api_type===`openai`?`default`:`secondary`},{default:r(()=>[a(h(t.api_type),1)]),_:2},1032,[`variant`])]),_:2},1024),p(l(E),{class:`font-mono text-xs`},{default:r(()=>[a(h(t.model||`-`)+` `,1),t.original_model?(e(),i(l(T),{key:0,variant:`secondary`,class:`ml-1 text-xs`},{default:r(()=>[...n[41]||=[a(`已替换`,-1)]]),_:1})):f(``,!0)]),_:2},1024),p(l(E),{class:`text-xs`},{default:r(()=>[t.provider_id===`router`?(e(),i(l(T),{key:0,variant:`secondary`,class:`text-[10px] px-1 py-0`},{default:r(()=>[a(`代理增强:`+h(rt(t.upstream_request)),1)]),_:2},1024)):t.backend_model||t.provider_name?(e(),m(o,{key:1},[s(`span`,Se,h(t.backend_model||`-`),1),n[42]||=s(`span`,{class:`text-muted-foreground`},` @ `,-1),p(l(T),{variant:`outline`,class:`text-[10px] px-1 py-0`},{default:r(()=>[a(h(t.provider_name||t.provider_id||`-`),1)]),_:2},1024)],64)):(e(),m(`span`,Ce,`-`))]),_:2},1024),p(l(E),null,{default:r(()=>[p(l(T),{variant:(t.status_code??0)<400?`default`:`destructive`},{default:r(()=>[a(h(t.status_code||`-`),1)]),_:2},1032,[`variant`])]),_:2},1024),p(l(E),null,{default:r(()=>[a(h(t.latency_ms?t.latency_ms+`ms`:`-`),1)]),_:2},1024),p(l(E),null,{default:r(()=>[a(h(t.is_stream?`Yes`:`No`),1)]),_:2},1024),p(l(E),null,{default:r(()=>[t.is_retry?(e(),i(l(T),{key:0,variant:`outline`,class:`text-warning-dark border-warning`},{default:r(()=>[...n[43]||=[a(`重试`,-1)]]),_:1})):(e(),m(`span`,we,`-`))]),_:2},1024),p(l(E),{class:`text-destructive text-xs`},{default:r(()=>[a(h(t.error_message||`-`),1)]),_:2},1024),p(l(E),null,{default:r(()=>[p(l(_),{variant:`ghost`,size:`sm`,onClick:e=>ot(t.id)},{default:r(()=>[...n[44]||=[a(`详情`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1032,[`class`]))),128)),N.value.length===0?(e(),i(l(O),{key:0},{default:r(()=>[p(l(E),{colspan:`10`,class:`text-center text-muted-foreground py-8`},{default:r(()=>[...n[45]||=[a(`暂无日志`,-1)]]),_:1})]),_:1})):f(``,!0)]),_:1})]),_:1})]),s(`div`,Te,[s(`p`,Ee,`共 `+h(P.value)+` 条`,1),s(`div`,De,[p(l(_),{variant:`outline`,size:`sm`,onClick:ut,disabled:F.value<=1},{default:r(()=>[...n[46]||=[a(`上一页`,-1)]]),_:1},8,[`disabled`]),s(`span`,Oe,`第 `+h(F.value)+` 页`,1),p(l(_),{variant:`outline`,size:`sm`,onClick:dt,disabled:N.value.length<M},{default:r(()=>[...n[47]||=[a(`下一页`,-1)]]),_:1},8,[`disabled`])])]),p(l(S),{open:V.value,"onUpdate:open":n[20]||=e=>V.value=e},{default:r(()=>[p(l(ce),{class:`max-w-4xl max-h-[85vh]`},{default:r(()=>[p(l(x),null,{default:r(()=>[p(l(C),{class:`flex items-center gap-2`},{default:r(()=>[n[48]||=a(`请求详情 `,-1),U.value?(e(),m(`span`,ke,h(U.value.id),1)):f(``,!0)]),_:1}),p(l(oe),{class:`sr-only`},{default:r(()=>[...n[49]||=[a(`请求日志详情`,-1)]]),_:1})]),_:1}),H.value?(e(),m(`div`,Ae,[s(`div`,je,[p(l(A),{class:`h-6 w-16`}),p(l(A),{class:`h-6 w-48`}),p(l(A),{class:`h-6 w-12`})]),(e(),m(o,null,t(4,e=>p(l(A),{class:`h-12 w-full`,key:e})),64))])):U.value?(e(),m(o,{key:1},[U.value.is_retry?(e(),m(`div`,Me,[p(l(T),{variant:`outline`,class:`text-warning-dark border-warning`},{default:r(()=>[...n[50]||=[a(`重试请求`,-1)]]),_:1}),s(`span`,Ne,[n[51]||=a(` 原始请求: `,-1),p(l(_),{variant:`link`,class:`h-auto p-0 text-xs font-mono text-primary underline`,onClick:n[3]||=e=>st(U.value.original_request_id)},{default:r(()=>[a(h(U.value.original_request_id?.slice(0,8)),1)]),_:1})])])):f(``,!0),s(`div`,Pe,[s(`div`,null,[n[52]||=s(`span`,{class:`text-muted-foreground`},`类型:`,-1),n[53]||=a(),p(l(T),{variant:U.value.api_type===`openai`?`default`:`secondary`,class:`text-xs`},{default:r(()=>[a(h(U.value.api_type),1)]),_:1},8,[`variant`])]),s(`div`,null,[n[54]||=s(`span`,{class:`text-muted-foreground`},`模型:`,-1),n[55]||=a(),s(`span`,Fe,h(U.value.model||`-`),1)]),U.value.original_model?(e(),m(`div`,Ie,[n[56]||=s(`span`,{class:`text-muted-foreground`},`模型替换:`,-1),n[57]||=a(),s(`span`,Le,h(U.value.original_model)+` → `+h(U.value.backend_model||U.value.model),1)])):f(``,!0),s(`div`,null,[n[58]||=s(`span`,{class:`text-muted-foreground`},`状态码:`,-1),n[59]||=a(),p(l(T),{variant:(U.value.status_code??0)<400?`default`:`destructive`,class:`text-xs`},{default:r(()=>[a(h(U.value.status_code||`-`),1)]),_:1},8,[`variant`])]),s(`div`,null,[n[60]||=s(`span`,{class:`text-muted-foreground`},`延迟:`,-1),n[61]||=a(),s(`span`,Re,h(U.value.latency_ms?U.value.latency_ms+`ms`:`-`),1)]),s(`div`,null,[n[62]||=s(`span`,{class:`text-muted-foreground`},`流式:`,-1),n[63]||=a(),s(`span`,ze,h(U.value.is_stream?`Yes`:`No`),1)]),s(`div`,null,[n[64]||=s(`span`,{class:`text-muted-foreground`},`时间:`,-1),n[65]||=a(),s(`span`,Be,h(ct(U.value.created_at)),1)])]),p(l(y),{open:W.value,"onUpdate:open":n[7]||=e=>W.value=e,class:`border rounded-md`},{default:r(()=>[p(l(b),{"as-child":``},{default:r(()=>[p(l(_),{variant:`ghost`,class:`w-full px-4 py-3 text-left text-sm font-medium text-foreground bg-muted/50 hover:bg-muted rounded-none rounded-t-md flex items-center gap-2`},{default:r(()=>[s(`span`,{class:c([`text-xs transition-transform`,W.value?`rotate-0`:`-rotate-90`])},`▼`,2),n[66]||=a(` 客户端原始请求 `,-1)]),_:1})]),_:1}),p(l(v),null,{default:r(()=>[s(`div`,Ve,[s(`div`,He,[p(l(_),{variant:`ghost`,size:`xs`,class:c(J.client_request===`structured`?`bg-background shadow`:``),onClick:n[4]||=e=>J.client_request=`structured`},{default:r(()=>[...n[67]||=[a(`结构化`,-1)]]),_:1},8,[`class`]),p(l(_),{variant:`ghost`,size:`xs`,class:c(J.client_request===`raw`?`bg-background shadow`:``),onClick:n[5]||=e=>J.client_request=`raw`},{default:r(()=>[...n[68]||=[a(`原始 JSON`,-1)]]),_:1},8,[`class`])]),p(l(_),{variant:`ghost`,size:`xs`,class:`h-auto py-1`,onClick:n[6]||=e=>X(`client_request`)},{default:r(()=>[a(h(Y.value===`client_request`?`已复制`:`复制`),1)]),_:1})]),s(`div`,Ue,[p(k,{raw:at(U.value),"api-type":Z(U.value.api_type),mode:J.client_request},null,8,[`raw`,`api-type`,`mode`])])]),_:1})]),_:1},8,[`open`]),U.value.upstream_request&&!it(U.value)?(e(),i(l(y),{key:1,open:G.value,"onUpdate:open":n[11]||=e=>G.value=e,class:`border rounded-md`},{default:r(()=>[p(l(b),{"as-child":``},{default:r(()=>[p(l(_),{variant:`ghost`,class:`w-full px-4 py-3 text-left text-sm font-medium text-foreground bg-muted/50 hover:bg-muted rounded-none rounded-t-md flex items-center gap-2`},{default:r(()=>[s(`span`,{class:c([`text-xs transition-transform`,G.value?`rotate-0`:`-rotate-90`])},`▼`,2),n[69]||=a(` Router → LLM API 请求 `,-1)]),_:1})]),_:1}),p(l(v),null,{default:r(()=>[s(`div`,We,[s(`div`,Ge,[p(l(_),{variant:`ghost`,size:`xs`,class:c(J.upstream_request===`structured`?`bg-background shadow`:``),onClick:n[8]||=e=>J.upstream_request=`structured`},{default:r(()=>[...n[70]||=[a(`结构化`,-1)]]),_:1},8,[`class`]),p(l(_),{variant:`ghost`,size:`xs`,class:c(J.upstream_request===`raw`?`bg-background shadow`:``),onClick:n[9]||=e=>J.upstream_request=`raw`},{default:r(()=>[...n[71]||=[a(`原始 JSON`,-1)]]),_:1},8,[`class`])]),p(l(_),{variant:`ghost`,size:`xs`,class:`h-auto py-1`,onClick:n[10]||=e=>X(`upstream_request`)},{default:r(()=>[a(h(Y.value===`upstream_request`?`已复制`:`复制`),1)]),_:1})]),s(`div`,Ke,[p(k,{raw:U.value.upstream_request,"api-type":Z(U.value.api_type),"show-url":!0,mode:J.upstream_request},null,8,[`raw`,`api-type`,`mode`])])]),_:1})]),_:1},8,[`open`])):f(``,!0),it(U.value)?f(``,!0):(e(),i(l(y),{key:2,open:K.value,"onUpdate:open":n[15]||=e=>K.value=e,class:`border rounded-md`},{default:r(()=>[p(l(b),{"as-child":``},{default:r(()=>[p(l(_),{variant:`ghost`,class:`w-full px-4 py-3 text-left text-sm font-medium text-foreground bg-muted/50 hover:bg-muted rounded-none rounded-t-md flex items-center gap-2`},{default:r(()=>[s(`span`,{class:c([`text-xs transition-transform`,K.value?`rotate-0`:`-rotate-90`])},`▼`,2),n[72]||=a(` LLM API 返回的原始响应 `,-1)]),_:1})]),_:1}),p(l(v),null,{default:r(()=>[s(`div`,qe,[s(`div`,Je,[p(l(_),{variant:`ghost`,size:`xs`,class:c(J.upstream_response===`structured`?`bg-background shadow`:``),onClick:n[12]||=e=>J.upstream_response=`structured`},{default:r(()=>[...n[73]||=[a(`结构化`,-1)]]),_:1},8,[`class`]),p(l(_),{variant:`ghost`,size:`xs`,class:c(J.upstream_response===`raw`?`bg-background shadow`:``),onClick:n[13]||=e=>J.upstream_response=`raw`},{default:r(()=>[a(h(U.value.is_stream?`原始 SSE 文本`:`原始 JSON`),1)]),_:1},8,[`class`])]),p(l(_),{variant:`ghost`,size:`xs`,class:`h-auto py-1`,onClick:n[14]||=e=>X(`upstream_response`)},{default:r(()=>[a(h(Y.value===`upstream_response`?`已复制`:`复制`),1)]),_:1})]),s(`div`,Ye,[p(j,{raw:U.value.upstream_response||U.value.response_body||`{}`,"api-type":Z(U.value.api_type),"is-stream":!!U.value.is_stream,mode:J.upstream_response},null,8,[`raw`,`api-type`,`is-stream`,`mode`])])]),_:1})]),_:1},8,[`open`])),Q(U.value)?(e(),i(l(y),{key:3,open:q.value,"onUpdate:open":n[19]||=e=>q.value=e,class:`border rounded-md`},{default:r(()=>[p(l(b),{"as-child":``},{default:r(()=>[p(l(_),{variant:`ghost`,class:`w-full px-4 py-3 text-left text-sm font-medium text-foreground bg-muted/50 hover:bg-muted rounded-none rounded-t-md flex items-center gap-2`},{default:r(()=>[s(`span`,{class:c([`text-xs transition-transform`,q.value?`rotate-0`:`-rotate-90`])},`▼`,2),n[74]||=a(` Router → 客户端响应 `,-1)]),_:1})]),_:1}),p(l(v),null,{default:r(()=>[s(`div`,Xe,[s(`div`,Ze,[p(l(_),{variant:`ghost`,size:`xs`,class:c(J.client_response===`structured`?`bg-background shadow`:``),onClick:n[16]||=e=>J.client_response=`structured`},{default:r(()=>[...n[75]||=[a(`结构化`,-1)]]),_:1},8,[`class`]),p(l(_),{variant:`ghost`,size:`xs`,class:c(J.client_response===`raw`?`bg-background shadow`:``),onClick:n[17]||=e=>J.client_response=`raw`},{default:r(()=>[a(h(U.value.is_stream?`原始 SSE 文本`:`原始 JSON`),1)]),_:1},8,[`class`])]),p(l(_),{variant:`ghost`,size:`xs`,class:`h-auto py-1`,onClick:n[18]||=e=>X(`client_response`)},{default:r(()=>[a(h(Y.value===`client_response`?`已复制`:`复制`),1)]),_:1})]),s(`div`,Qe,[p(j,{raw:Q(U.value),"api-type":Z(U.value.api_type),"is-stream":!!U.value.is_stream,mode:J.client_response},null,8,[`raw`,`api-type`,`is-stream`,`mode`])])]),_:1})]),_:1},8,[`open`])):f(``,!0),U.value.error_message?(e(),i(l(de),{key:4,class:`bg-destructive/10 ring-destructive/20`},{default:r(()=>[p(l(fe),{class:`py-3 text-sm text-destructive`},{default:r(()=>[a(h(U.value.error_message),1)]),_:1})]),_:1})):f(``,!0)],64)):(e(),m(`div`,$e,`未找到日志`))]),_:1})]),_:1},8,[`open`]),p(l(S),{open:z.value,"onUpdate:open":n[23]||=e=>z.value=e},{default:r(()=>[p(l(le),null,{default:r(()=>[p(l(x),null,{default:r(()=>[p(l(C),null,{default:r(()=>[...n[76]||=[a(`清理日志`,-1)]]),_:1})]),_:1}),n[80]||=s(`p`,{class:`text-sm text-muted-foreground`},`删除指定天数之前的日志`,-1),s(`div`,et,[p(l(ue),{class:`block text-sm font-medium text-foreground mb-1`},{default:r(()=>[...n[77]||=[a(`保留最近天数`,-1)]]),_:1}),p(l(ge),{modelValue:B.value,"onUpdate:modelValue":n[21]||=e=>B.value=e,modelModifiers:{number:!0},type:`number`,min:1},null,8,[`modelValue`])]),p(l(se),null,{default:r(()=>[p(l(_),{variant:`outline`,onClick:n[22]||=e=>z.value=!1},{default:r(()=>[...n[78]||=[a(`取消`,-1)]]),_:1}),p(l(_),{variant:`destructive`,onClick:ft},{default:r(()=>[...n[79]||=[a(`确认清理`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])]))}});export{N as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as e,F as t,K as n,L as r,M as i,N as a,R as o,S as s,W as c,Y as l,_ as u,_t as d,b as f,dt as p,f as m,g as h,gt as g,h as _,it as v,k as y,mt as b,ot as x,q as S,t as C,v as w,vt as T,w as E,x as D,y as O,yt as k}from"./client-Mb8fy_bC.js";import{t as A}from"./createLucideIcon-CCmQ9QKM.js";import{E as j,b as M,f as N,i as P,n as F,r as I,w as L}from"./button-D54q76GQ.js";import{n as R,t as ee}from"./useNonce-CU-NirfM.js";import{S as te,c as z,h as ne,l as re}from"./Collection-DUBb4r6h.js";import{t as B}from"./useForwardExpose-CzQFheaD.js";import{n as V,r as H,t as U}from"./CollapsibleTrigger-BFNhb19_.js";import{n as ie,r as ae,s as oe,t as se}from"./dialog-DSH5k5Kj.js";import{i as ce,n as le,r as ue,t as de}from"./TabsTrigger-DErAbTuM.js";import{n as fe,r as W}from"./lib-BgOqOzXI.js";import{n as G,t as K}from"./CardContent-CucI6u41.js";import{t as q}from"./CardHeader-d-DYsWxe.js";import{t as J}from"./CardTitle-CIDEQkWB.js";import{a as pe,i as Y,n as X,o as me,r as he,t as ge}from"./TableHeader-BpscAtT3.js";import{n as _e,r as ve,t as ye}from"./LogResponseViewer-CyBzv02a.js";var be=A(`brain`,[[`path`,{d:`M12 18V5`,key:`adv99a`}],[`path`,{d:`M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4`,key:`1e3is1`}],[`path`,{d:`M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5`,key:`1gqd8o`}],[`path`,{d:`M17.997 5.125a4 4 0 0 1 2.526 5.77`,key:`iwvgf7`}],[`path`,{d:`M18 18a4 4 0 0 0 2-7.464`,key:`efp6ie`}],[`path`,{d:`M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517`,key:`1gq6am`}],[`path`,{d:`M6 18a4 4 0 0 1-2-7.464`,key:`k1g0md`}],[`path`,{d:`M6.003 5.125a4 4 0 0 0-2.526 5.77`,key:`q97ue3`}]]),xe=A(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),Se=A(`message-square`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}]]),Ce=A(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]),[Z,we]=te(`ScrollAreaRoot`),Te=s({__name:`ScrollAreaRoot`,props:{type:{type:String,required:!1,default:`hover`},dir:{type:String,required:!1},scrollHideDelay:{type:Number,required:!1,default:600},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e,{expose:n}){let r=e,i=x(0),a=x(0),s=x(),c=x(),d=x(),f=x(),m=x(!1),h=x(!1),{type:g,dir:_,scrollHideDelay:v}=p(r),y=ne(_);function S(){s.value?.scrollTo({top:0})}function C(){s.value?.scrollTo({top:0,left:0})}n({viewport:s,scrollTop:S,scrollTopLeft:C});let{forwardRef:w,currentElement:E}=B();return we({type:g,dir:y,scrollHideDelay:v,scrollArea:E,viewport:s,onViewportChange:e=>{s.value=e||void 0},content:c,onContentChange:e=>{c.value=e},scrollbarX:d,scrollbarXEnabled:m,scrollbarY:f,scrollbarYEnabled:h,onScrollbarXChange:e=>{d.value=e||void 0},onScrollbarYChange:e=>{f.value=e||void 0},onScrollbarXEnabledChange:e=>{m.value=e},onScrollbarYEnabledChange:e=>{h.value=e},onCornerWidthChange:e=>{i.value=e},onCornerHeightChange:e=>{a.value=e}}),(e,n)=>(t(),u(b(P),{ref:b(w),"as-child":r.asChild,as:e.as,dir:b(y),style:T({position:`relative`,"--reka-scroll-area-corner-width":`${i.value}px`,"--reka-scroll-area-corner-height":`${a.value}px`})},{default:l(()=>[o(e.$slots,`default`)]),_:3},8,[`as-child`,`as`,`dir`,`style`]))}}),Ee=s({__name:`ScrollAreaCornerImpl`,setup(e){let r=Z(),i=x(0),a=x(0),s=_(()=>!!i.value&&!!a.value);function c(){let e=r.scrollbarX.value?.offsetHeight||0;r.onCornerHeightChange(e),a.value=e}function d(){let e=r.scrollbarY.value?.offsetWidth||0;r.onCornerWidthChange(e),i.value=e}return N(r.scrollbarX.value,c),N(r.scrollbarY.value,d),n(()=>r.scrollbarX.value,c),n(()=>r.scrollbarY.value,d),(e,n)=>s.value?(t(),u(b(P),y({key:0,style:{width:`${i.value}px`,height:`${a.value}px`,position:`absolute`,right:b(r).dir.value===`ltr`?0:void 0,left:b(r).dir.value===`rtl`?0:void 0,bottom:0}},e.$parent?.$props),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`style`])):w(`v-if`,!0)}}),De=s({__name:`ScrollAreaCorner`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let n=e,{forwardRef:r}=B(),i=Z(),a=_(()=>!!i.scrollbarX.value&&!!i.scrollbarY.value),s=_(()=>i.type.value!==`scroll`&&a.value);return(e,i)=>s.value?(t(),u(Ee,y({key:0},n,{ref:b(r)}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16)):w(`v-if`,!0)}});function Oe(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];let r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function ke(e){let t=Ae(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function Ae(e,t){let n=e/t;return Number.isNaN(n)?0:n}function je(e,t=()=>{}){let n={left:e.scrollLeft,top:e.scrollTop},r=0;return(function i(){let a={left:e.scrollLeft,top:e.scrollTop},o=n.left!==a.left,s=n.top!==a.top;(o||s)&&t(),n=a,r=window.requestAnimationFrame(i)})(),()=>window.cancelAnimationFrame(r)}function Me(e,t,n=`ltr`){let r=ke(t),i=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,a=t.scrollbar.size-i,o=t.content-t.viewport,s=a-r,c=n===`ltr`?[0,o]:[o*-1,0],l=R(e,c[0],c[1]);return Oe([0,o],[0,s])(l)}function Ne(e){return e?Number.parseInt(e,10):0}function Pe(e,t,n,r=`ltr`){let i=ke(n),a=i/2,o=t||a,s=i-o,c=n.scrollbar.paddingStart+o,l=n.scrollbar.size-n.scrollbar.paddingEnd-s,u=n.content-n.viewport,d=r===`ltr`?[0,u]:[u*-1,0];return Oe([c,l],d)(e)}function Fe(e,t){return e>0&&e<t}var Ie=s({__name:`ScrollAreaScrollbarX`,setup(e){let n=Z(),r=We(),{forwardRef:a,currentElement:s}=B();i(()=>{s.value&&n.onScrollbarXChange(s.value)});let c=_(()=>r.sizes.value);return(e,i)=>(t(),u(qe,{ref:b(a),"is-horizontal":!0,"data-orientation":`horizontal`,style:T({bottom:0,left:b(n).dir.value===`rtl`?`var(--reka-scroll-area-corner-width)`:0,right:b(n).dir.value===`ltr`?`var(--reka-scroll-area-corner-width)`:0,"--reka-scroll-area-thumb-width":c.value?`${b(ke)(c.value)}px`:void 0}),onOnDragScroll:i[0]||=e=>b(r).onDragScroll(e.x)},{default:l(()=>[o(e.$slots,`default`)]),_:3},8,[`style`]))}}),Le=s({__name:`ScrollAreaScrollbarY`,setup(e){let n=Z(),r=We(),{forwardRef:a,currentElement:s}=B();i(()=>{s.value&&n.onScrollbarYChange(s.value)});let c=_(()=>r.sizes.value);return(e,i)=>(t(),u(qe,{ref:b(a),"is-horizontal":!1,"data-orientation":`vertical`,style:T({top:0,right:b(n).dir.value===`ltr`?0:void 0,left:b(n).dir.value===`rtl`?0:void 0,bottom:`var(--reka-scroll-area-corner-height)`,"--reka-scroll-area-thumb-height":c.value?`${b(ke)(c.value)}px`:void 0}),onOnDragScroll:i[0]||=e=>b(r).onDragScroll(e.y)},{default:l(()=>[o(e.$slots,`default`)]),_:3},8,[`style`]))}}),Re=s({__name:`ScrollAreaScrollbarAuto`,props:{forceMount:{type:Boolean,required:!1}},setup(e){let n=Z(),r=Q(),{forwardRef:a}=B(),s=x(!1),c=L(()=>{if(n.viewport.value){let e=n.viewport.value.offsetWidth<n.viewport.value.scrollWidth,t=n.viewport.value.offsetHeight<n.viewport.value.scrollHeight;s.value=r.isHorizontal.value?e:t}},10);return i(()=>c()),N(n.viewport,c),N(n.content,c),(e,n)=>(t(),u(b(z),{present:e.forceMount||s.value},{default:l(()=>[D(Ke,y(e.$attrs,{ref:b(a),"data-state":s.value?`visible`:`hidden`}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`data-state`])]),_:3},8,[`present`]))}}),ze=s({inheritAttrs:!1,__name:`ScrollAreaScrollbarGlimpse`,props:{forceMount:{type:Boolean,required:!1}},setup(e){let n=Z(),r=Q(),{forwardRef:s}=B(),{state:c,dispatch:d}=re(`hidden`,{hidden:{POINTER_ENTER:`glimpse`,SCROLL:`scrolling`},glimpse:{HIDE:`hidden`,POINTER_LEAVE:`hidden`,SCROLL:`scrolling`,POINTER_ENTER:`glimpse`},scrolling:{SCROLL_END:`idle`,POINTER_ENTER:`interacting`},interacting:{SCROLL:`interacting`,POINTER_LEAVE:`idle`},idle:{HIDE:`hidden`,SCROLL:`scrolling`,POINTER_ENTER:`interacting`}}),f=_(()=>c.value!==`hidden`);function p(){d(`POINTER_ENTER`)}function m(){d(`POINTER_LEAVE`)}let h=L(()=>d(`SCROLL_END`),100);return S(e=>{if(c.value===`glimpse`){let t=window.setTimeout(d,n.scrollHideDelay.value,`HIDE`);e(()=>{window.clearTimeout(t)})}}),S(e=>{if(c.value===`idle`){let t=window.setTimeout(d,n.scrollHideDelay.value,`HIDE`);e(()=>{window.clearTimeout(t)})}}),S(e=>{let t=n.viewport.value,i=r.isHorizontal.value?`scrollLeft`:`scrollTop`;if(t){let n=t[i],r=()=>{let e=t[i];n!==e&&(d(`SCROLL`),h()),n=e};t.addEventListener(`scroll`,r),e(()=>{t.removeEventListener(`scroll`,r)})}}),i(()=>{let e=n.scrollArea.value;e&&(e.addEventListener(`pointerenter`,p),e.addEventListener(`pointerleave`,m))}),a(()=>{let e=n.scrollArea.value;e&&(e.removeEventListener(`pointerenter`,p),e.removeEventListener(`pointerleave`,m))}),(e,n)=>(t(),u(b(z),{present:e.forceMount||f.value},{default:l(()=>[D(Re,y(e.$attrs,{ref:b(s),"data-state":f.value?`visible`:`hidden`}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`data-state`])]),_:3},8,[`present`]))}}),Be=s({inheritAttrs:!1,__name:`ScrollAreaScrollbarHover`,props:{forceMount:{type:Boolean,required:!1}},setup(e){let n=Z(),{forwardRef:r}=B(),s,c=x(!1);function d(){window.clearTimeout(s),c.value=!0}function f(){s=window.setTimeout(()=>{c.value=!1},n.scrollHideDelay.value)}return i(()=>{let e=n.scrollArea.value;e&&(e.addEventListener(`pointerenter`,d),e.addEventListener(`pointerleave`,f))}),a(()=>{let e=n.scrollArea.value;e&&(window.clearTimeout(s),e.removeEventListener(`pointerenter`,d),e.removeEventListener(`pointerleave`,f))}),(e,n)=>(t(),u(b(z),{present:e.forceMount||c.value},{default:l(()=>[D(Re,y(e.$attrs,{ref:b(r),"data-state":c.value?`visible`:`hidden`}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`data-state`])]),_:3},8,[`present`]))}}),Ve=s({__name:`ScrollAreaScrollbarScroll`,props:{forceMount:{type:Boolean,required:!1}},setup(e){let n=Z(),r=Q(),{forwardRef:i}=B(),{state:a,dispatch:s}=re(`hidden`,{hidden:{SCROLL:`scrolling`},scrolling:{SCROLL_END:`idle`,POINTER_ENTER:`interacting`},interacting:{SCROLL:`interacting`,POINTER_LEAVE:`idle`},idle:{HIDE:`hidden`,SCROLL:`scrolling`,POINTER_ENTER:`interacting`}}),c=_(()=>a.value!==`hidden`);S(e=>{if(a.value===`idle`){let t=window.setTimeout(s,n.scrollHideDelay.value,`HIDE`);e(()=>{window.clearTimeout(t)})}});let d=L(()=>s(`SCROLL_END`),100);return S(e=>{let t=n.viewport.value,i=r.isHorizontal.value?`scrollLeft`:`scrollTop`;if(t){let n=t[i],r=()=>{let e=t[i];n!==e&&(s(`SCROLL`),d()),n=e};t.addEventListener(`scroll`,r),e(()=>{t.removeEventListener(`scroll`,r)})}}),(e,n)=>(t(),u(b(z),{present:e.forceMount||c.value},{default:l(()=>[D(Ke,y(e.$attrs,{ref:b(i),"data-state":c.value?`visible`:`hidden`}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`data-state`])]),_:3},8,[`present`]))}}),[Q,He]=te(`ScrollAreaScrollbar`),Ue=s({inheritAttrs:!1,__name:`ScrollAreaScrollbar`,props:{orientation:{type:String,required:!1,default:`vertical`},forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`div`}},setup(e){let r=e,{forwardRef:i}=B(),s=Z(),c=_(()=>r.orientation===`horizontal`);n(c,()=>{c.value?s.onScrollbarXEnabledChange(!0):s.onScrollbarYEnabledChange(!0)},{immediate:!0}),a(()=>{s.onScrollbarXEnabledChange(!1),s.onScrollbarYEnabledChange(!1)});let{orientation:d,forceMount:f,asChild:m,as:h}=p(r);return He({orientation:d,forceMount:f,isHorizontal:c,as:h,asChild:m}),(e,n)=>b(s).type.value===`hover`?(t(),u(Be,y({key:0},e.$attrs,{ref:b(i),"force-mount":b(f)}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`force-mount`])):b(s).type.value===`scroll`?(t(),u(Ve,y({key:1},e.$attrs,{ref:b(i),"force-mount":b(f)}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`force-mount`])):b(s).type.value===`glimpse`?(t(),u(ze,y({key:2},e.$attrs,{ref:b(i),"force-mount":b(f)}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`force-mount`])):b(s).type.value===`auto`?(t(),u(Re,y({key:3},e.$attrs,{ref:b(i),"force-mount":b(f)}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`force-mount`])):b(s).type.value===`always`?(t(),u(Ke,y({key:4},e.$attrs,{ref:b(i),"data-state":`visible`}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16)):w(`v-if`,!0)}}),[We,Ge]=te(`ScrollAreaScrollbarVisible`),Ke=s({__name:`ScrollAreaScrollbarVisible`,setup(e){let n=Z(),r=Q(),{forwardRef:i}=B(),a=x({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),s=_(()=>{let e=Ae(a.value.viewport,a.value.content);return e>0&&e<1}),c=x(),d=x(0);function f(e,t){if(v.value){let r=n.viewport.value.scrollLeft+e.deltaY;n.viewport.value.scrollLeft=r,Fe(r,t)&&e.preventDefault()}else{let r=n.viewport.value.scrollTop+e.deltaY;n.viewport.value.scrollTop=r,Fe(r,t)&&e.preventDefault()}}function p(e,t){v.value?d.value=t.x:d.value=t.y}function m(e){d.value=0}function h(e){a.value=e}function g(e,t){return Pe(e,d.value,a.value,t)}let v=_(()=>r.isHorizontal.value);function S(e){v.value?n.viewport.value.scrollLeft=g(e,n.dir.value):n.viewport.value.scrollTop=g(e)}function C(){if(v.value){if(n.viewport.value&&c.value){let e=n.viewport.value.scrollLeft,t=Me(e,a.value,n.dir.value);c.value.style.transform=`translate3d(${t}px, 0, 0)`}}else if(n.viewport.value&&c.value){let e=n.viewport.value.scrollTop,t=Me(e,a.value);c.value.style.transform=`translate3d(0, ${t}px, 0)`}}function w(e){c.value=e}return Ge({sizes:a,hasThumb:s,handleWheelScroll:f,handleThumbDown:p,handleThumbUp:m,handleSizeChange:h,onThumbPositionChange:C,onThumbChange:w,onDragScroll:S}),(e,n)=>v.value?(t(),u(Ie,y({key:0},e.$attrs,{ref:b(i)}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16)):(t(),u(Le,y({key:1},e.$attrs,{ref:b(i)}),{default:l(()=>[o(e.$slots,`default`)]),_:3},16))}}),qe=s({__name:`ScrollAreaScrollbarImpl`,props:{isHorizontal:{type:Boolean,required:!0}},emits:[`onDragScroll`,`onWheelScroll`,`onThumbPointerDown`],setup(e,{emit:n}){let r=e,s=n,c=Z(),d=We(),f=Q(),{forwardRef:p,currentElement:m}=B(),h=x(``),g=x();function _(e){g.value&&s(`onDragScroll`,{x:e.clientX-g.value?.left,y:e.clientY-g.value?.top})}function v(e){e.button===0&&(e.target.setPointerCapture(e.pointerId),g.value=m.value.getBoundingClientRect(),h.value=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect=`none`,c.viewport&&(c.viewport.value.style.scrollBehavior=`auto`),_(e))}function y(e){_(e)}function S(e){let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=h.value,c.viewport&&(c.viewport.value.style.scrollBehavior=``),g.value=void 0}function C(e){let t=e.target,n=m.value?.contains(t),r=d.sizes.value.content-d.sizes.value.viewport;n&&d.handleWheelScroll(e,r)}i(()=>{document.addEventListener(`wheel`,C,{passive:!1})}),a(()=>{document.removeEventListener(`wheel`,C)});function w(){m.value&&(r.isHorizontal?d.handleSizeChange({content:c.viewport.value?.scrollWidth??0,viewport:c.viewport.value?.offsetWidth??0,scrollbar:{size:m.value.clientWidth??0,paddingStart:Ne(getComputedStyle(m.value).paddingLeft),paddingEnd:Ne(getComputedStyle(m.value).paddingRight)}}):d.handleSizeChange({content:c.viewport.value?.scrollHeight??0,viewport:c.viewport.value?.offsetHeight??0,scrollbar:{size:m.value?.clientHeight??0,paddingStart:Ne(getComputedStyle(m.value).paddingTop),paddingEnd:Ne(getComputedStyle(m.value).paddingBottom)}}),d.onThumbPositionChange())}return N(m,w),N(c.content,w),(e,n)=>(t(),u(b(P),{ref:b(p),style:{position:`absolute`},"data-scrollbarimpl":``,as:b(f).as.value,"as-child":b(f).asChild.value,onPointerdown:v,onPointermove:y,onPointerup:S},{default:l(()=>[o(e.$slots,`default`)]),_:3},8,[`as`,`as-child`]))}}),Je=s({__name:`ScrollAreaThumb`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let n=e,r=Z(),i=We();function s(e){let t=e.target.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;i.handleThumbDown(e,{x:n,y:r})}function c(e){i.handleThumbUp(e)}let{forwardRef:d,currentElement:f}=B(),p=x(),m=_(()=>r.viewport.value);function h(){p.value||(p.value=je(m.value,i.onThumbPositionChange),i.onThumbPositionChange())}return j(_(()=>i.sizes.value),()=>{i.onThumbChange(f.value),m.value&&(i.onThumbPositionChange(),m.value.addEventListener(`scroll`,h))}),a(()=>{m.value.removeEventListener(`scroll`,h),r.viewport.value?.removeEventListener(`scroll`,h)}),(e,r)=>(t(),u(b(P),{ref:b(d),"data-state":b(i).hasThumb?`visible`:`hidden`,style:{width:`var(--reka-scroll-area-thumb-width)`,height:`var(--reka-scroll-area-thumb-height)`},"as-child":n.asChild,as:e.as,onPointerdown:s,onPointerup:c},{default:l(()=>[o(e.$slots,`default`)]),_:3},8,[`data-state`,`as-child`,`as`]))}}),Ye=s({inheritAttrs:!1,__name:`ScrollAreaViewport`,props:{nonce:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e,{expose:n}){let r=e,{nonce:a}=p(r),s=ee(a),c=Z(),u=x();i(()=>{c.onViewportChange(u.value),c.onContentChange(g.value)}),n({viewportElement:u});let{forwardRef:d,currentElement:g}=B();return(e,n)=>(t(),O(m,null,[h(`div`,y({ref_key:`viewportElement`,ref:u,"data-reka-scroll-area-viewport":``,style:{overflowX:b(c).scrollbarXEnabled.value?`scroll`:`hidden`,overflowY:b(c).scrollbarYEnabled.value?`scroll`:`hidden`}},e.$attrs,{tabindex:0}),[D(b(P),{ref:b(d),style:T({minWidth:b(c).scrollbarXEnabled.value?`fit-content`:void 0}),"as-child":r.asChild,as:e.as},{default:l(()=>[o(e.$slots,`default`)]),_:3},8,[`style`,`as-child`,`as`])],16),D(b(P),{as:`style`,nonce:b(s)},{default:l(()=>n[0]||=[f(` /* Hide scrollbars cross-browser and enable momentum scroll for touch devices */ [data-reka-scroll-area-viewport] { scrollbar-width:none; -ms-overflow-style:none; -webkit-overflow-scrolling:touch; } [data-reka-scroll-area-viewport]::-webkit-scrollbar { display:none; } `)]),_:1,__:[0]},8,[`nonce`])],64))}}),Xe=s({__name:`BaseSeparator`,props:{orientation:{type:String,required:!1,default:`horizontal`},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let n=e,r=[`horizontal`,`vertical`];function i(e){return r.includes(e)}let a=_(()=>i(n.orientation)?n.orientation:`horizontal`),s=_(()=>a.value===`vertical`?n.orientation:void 0),c=_(()=>n.decorative?{role:`none`}:{"aria-orientation":s.value,role:`separator`});return(e,n)=>(t(),u(b(P),y({as:e.as,"as-child":e.asChild,"data-orientation":a.value},c.value),{default:l(()=>[o(e.$slots,`default`)]),_:3},16,[`as`,`as-child`,`data-orientation`]))}}),Ze=s({__name:`Separator`,props:{orientation:{type:String,required:!1,default:`horizontal`},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(e){let n=e;return(e,r)=>(t(),u(Xe,d(E(n)),{default:l(()=>[o(e.$slots,`default`)]),_:3},16))}}),Qe=s({__name:`ScrollBar`,props:{orientation:{default:`vertical`},forceMount:{type:Boolean},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let n=e,r=M(n,`class`);return(i,a)=>(t(),u(b(Ue),y({"data-slot":`scroll-area-scrollbar`,"data-orientation":e.orientation},b(r),{class:b(I)(`data-[orientation=horizontal]:h-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:border-t data-[orientation=horizontal]:border-t-transparent data-[orientation=vertical]:h-full data-[orientation=vertical]:w-2.5 data-[orientation=vertical]:border-l data-[orientation=vertical]:border-l-transparent flex touch-none p-px transition-colors select-none`,n.class)}),{default:l(()=>[D(b(Je),{"data-slot":`scroll-area-thumb`,class:`rounded-full relative flex-1 bg-border`})]),_:1},16,[`data-orientation`,`class`]))}}),$e=s({__name:`ScrollArea`,props:{type:{},dir:{},scrollHideDelay:{},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let n=e,r=M(n,`class`);return(e,i)=>(t(),u(b(Te),y({"data-slot":`scroll-area`},b(r),{class:b(I)(`relative`,n.class)}),{default:l(()=>[D(b(Ye),{"data-slot":`scroll-area-viewport`,class:`size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1`},{default:l(()=>[o(e.$slots,`default`)]),_:3}),D(Qe),D(b(De))]),_:3},16,[`class`]))}}),et={class:`grid grid-cols-2 lg:grid-cols-4 gap-4 mb-6`},tt={class:`text-2xl font-bold text-foreground mt-1`},nt={class:`text-xs text-muted-foreground mt-1`},rt={class:`text-2xl font-bold text-foreground mt-1`},it={class:`text-xs text-muted-foreground mt-1`},at={class:`text-2xl font-bold text-foreground mt-1`},ot={class:`text-xs text-muted-foreground mt-1`},st={class:`text-2xl font-bold text-foreground mt-1`},ct={class:`text-xs text-muted-foreground mt-1`},lt=s({__name:`MonitorHeader`,props:{stats:{},activeCount:{},streamCount:{}},setup(e){let n=e,r=_(()=>!n.stats||n.stats.totalRequests===0?`0.0`:(n.stats.errorCount/n.stats.totalRequests*100).toFixed(1)),i=_(()=>!n.stats||n.stats.totalRequests===0?`0.0`:(n.stats.retryCount/n.stats.totalRequests*100).toFixed(1)),a=_(()=>n.stats?n.stats.p50LatencyMs.toFixed(0):`--`);return(n,o)=>(t(),O(`div`,et,[D(b(G),null,{default:l(()=>[D(b(K),{class:`p-4`},{default:l(()=>[o[0]||=h(`p`,{class:`text-sm text-muted-foreground`},`活跃请求`,-1),h(`p`,tt,k(e.activeCount),1),h(`p`,nt,k(e.streamCount)+` 流式 / `+k(e.activeCount-e.streamCount)+` 非流式 `,1)]),_:1})]),_:1}),D(b(G),null,{default:l(()=>[D(b(K),{class:`p-4`},{default:l(()=>[o[1]||=h(`p`,{class:`text-sm text-muted-foreground`},`错误率`,-1),h(`p`,rt,k(r.value)+`%`,1),h(`p`,it,k(e.stats?.errorCount??0)+` / `+k(e.stats?.totalRequests??0),1)]),_:1})]),_:1}),D(b(G),null,{default:l(()=>[D(b(K),{class:`p-4`},{default:l(()=>[o[2]||=h(`p`,{class:`text-sm text-muted-foreground`},`P50 延迟`,-1),h(`p`,at,k(a.value)+`ms`,1),h(`p`,ot,` 平均 `+k(e.stats?.avgLatencyMs?.toFixed(0)??`--`)+`ms `,1)]),_:1})]),_:1}),D(b(G),null,{default:l(()=>[D(b(K),{class:`p-4`},{default:l(()=>[o[3]||=h(`p`,{class:`text-sm text-muted-foreground`},`重试率`,-1),h(`p`,st,k(i.value)+`%`,1),h(`p`,ct,k(e.stats?.retryCount??0)+` / `+k(e.stats?.totalRequests??0),1)]),_:1})]),_:1})]))}}),ut={class:`space-y-3`},dt={key:0,class:`text-sm text-muted-foreground`},ft={class:`flex items-center justify-between text-sm`},pt={class:`font-medium text-foreground`},mt={class:`text-muted-foreground`},ht={key:0,class:`h-2 bg-muted rounded-full overflow-hidden`},gt={key:1,class:`flex gap-3 text-xs text-muted-foreground`},_t=s({__name:`ConcurrencyPanel`,props:{providers:{}},setup(e){function n(e,t){let n=e/t;return n>=1?`bg-red-500`:n>=.8?`bg-orange-500`:n>=.5?`bg-yellow-500`:`bg-green-500`}return(i,a)=>(t(),O(`div`,ut,[e.providers.length===0?(t(),O(`div`,dt,` 暂无并发数据 `)):w(``,!0),(t(!0),O(m,null,r(e.providers,e=>(t(),O(`div`,{key:e.providerId,class:`space-y-1`},[h(`div`,ft,[h(`span`,pt,k(e.providerName),1),h(`span`,mt,[e.maxConcurrency===0?(t(),O(m,{key:0},[f(`未限制`)],64)):(t(),O(m,{key:1},[f(k(e.active)+` / `+k(e.maxConcurrency),1)],64))])]),e.maxConcurrency>0?(t(),O(`div`,ht,[h(`div`,{class:g([`h-full rounded-full transition-all duration-300`,n(e.active,e.maxConcurrency)]),style:T({width:`${Math.min(100,e.active/e.maxConcurrency*100)}%`})},null,6)])):w(``,!0),e.maxConcurrency>0?(t(),O(`div`,gt,[h(`span`,null,`排队: `+k(e.queued),1),h(`span`,null,`队列上限: `+k(e.maxQueueSize),1)])):w(``,!0)]))),128))]))}}),vt={key:0,class:`text-sm text-muted-foreground`},yt={key:1,class:`grid grid-cols-2 gap-3 text-sm`},bt={class:`font-medium text-foreground`},xt={class:`font-medium text-foreground`},St={class:`col-span-2`},Ct={class:`flex items-center justify-between`},wt={class:`text-muted-foreground`},Tt={class:`h-2 bg-muted rounded-full overflow-hidden mt-1`},Et={class:`font-medium text-foreground`},Dt={class:`font-medium text-foreground`},Ot={class:`col-span-2`},kt={class:`font-medium text-foreground`},At=s({__name:`RuntimePanel`,props:{runtime:{}},setup(e){let n=e,r=_(()=>!n.runtime||n.runtime.memoryUsage.heapTotal===0?0:Math.min(100,n.runtime.memoryUsage.heapUsed/n.runtime.memoryUsage.heapTotal*100));function i(e){let t=Math.floor(e/1e3);return`${Math.floor(t/3600)}h ${Math.floor(t%3600/60)}m ${t%60}s`}function a(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(1)}MB`}return(n,o)=>e.runtime?(t(),O(`div`,yt,[h(`div`,null,[o[0]||=h(`p`,{class:`text-muted-foreground`},`运行时间`,-1),h(`p`,bt,k(i(e.runtime.uptimeMs)),1)]),h(`div`,null,[o[1]||=h(`p`,{class:`text-muted-foreground`},`内存 RSS`,-1),h(`p`,xt,k(a(e.runtime.memoryUsage.rss)),1)]),h(`div`,St,[h(`div`,Ct,[o[2]||=h(`p`,{class:`text-muted-foreground`},`Heap 使用`,-1),h(`p`,wt,k(a(e.runtime.memoryUsage.heapUsed))+` / `+k(a(e.runtime.memoryUsage.heapTotal)),1)]),h(`div`,Tt,[h(`div`,{class:`h-full bg-blue-500 rounded-full transition-all duration-300`,style:T({width:`${r.value}%`})},null,4)])]),h(`div`,null,[o[3]||=h(`p`,{class:`text-muted-foreground`},`Active Handles`,-1),h(`p`,Et,k(e.runtime.activeHandles),1)]),h(`div`,null,[o[4]||=h(`p`,{class:`text-muted-foreground`},`Active Requests`,-1),h(`p`,Dt,k(e.runtime.activeRequests),1)]),h(`div`,Ot,[o[5]||=h(`p`,{class:`text-muted-foreground`},`Event Loop 延迟`,-1),h(`p`,kt,k(e.runtime.eventLoopDelayMs.toFixed(2))+`ms`,1)])])):(t(),O(`div`,vt,`暂无运行时数据`))}}),jt={key:0,class:`text-sm text-muted-foreground`},Mt={key:1,class:`space-y-2`},Nt={class:`flex items-center justify-between text-sm`},Pt={class:`text-muted-foreground`},Ft={class:`h-2 bg-muted rounded-full overflow-hidden`},It=s({__name:`StatusCodePanel`,props:{byStatusCode:{}},setup(e){let n=e,i=_(()=>Object.values(n.byStatusCode).reduce((e,t)=>e+t,0)),a=_(()=>{let e=n.byStatusCode,t=i.value||1,r=o(e,200,299),a=o(e,400,499)-(e[429]||0),s=e[429]||0,c=o(e,500,599);return[{label:`2xx 成功`,count:r,percent:(r/t*100).toFixed(1),textClass:`text-green-600 dark:text-green-400`,barClass:`bg-green-500`},{label:`4xx 客户端错误`,count:a,percent:(a/t*100).toFixed(1),textClass:`text-yellow-600 dark:text-yellow-400`,barClass:`bg-yellow-500`},{label:`429 限流`,count:s,percent:(s/t*100).toFixed(1),textClass:`text-orange-600 dark:text-orange-400`,barClass:`bg-orange-500`},{label:`5xx 服务端错误`,count:c,percent:(c/t*100).toFixed(1),textClass:`text-red-600 dark:text-red-400`,barClass:`bg-red-500`}].filter(e=>e.count>0)});function o(e,t,n){let r=0;for(let[i,a]of Object.entries(e)){let e=Number(i);e>=t&&e<=n&&(r+=a)}return r}return(e,n)=>i.value===0?(t(),O(`div`,jt,`暂无状态码数据`)):(t(),O(`div`,Mt,[(t(!0),O(m,null,r(a.value,e=>(t(),O(`div`,{key:e.label,class:`space-y-1`},[h(`div`,Nt,[h(`span`,{class:g(e.textClass)},k(e.label),3),h(`span`,Pt,k(e.count)+` (`+k(e.percent)+`%) `,1)]),h(`div`,Ft,[h(`div`,{class:g([`h-full rounded-full transition-all duration-300`,e.barClass]),style:T({width:`${e.percent}%`})},null,6)])]))),128))]))}}),$=s({__name:`Separator`,props:{orientation:{default:`horizontal`},decorative:{type:Boolean,default:!0},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(e){let n=e,r=M(n,`class`);return(e,i)=>(t(),u(b(Ze),y({"data-slot":`separator`},b(r),{class:b(I)(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch`,n.class)}),null,16,[`class`]))}}),Lt={key:0,class:`text-sm text-muted-foreground py-4 text-center`},Rt={key:1,class:`space-y-3`},zt={class:`flex items-center gap-2`},Bt={class:`font-medium text-foreground`},Vt={class:`text-xs text-muted-foreground font-mono`},Ht={class:`space-y-1.5 text-sm`},Ut={class:`flex justify-between`},Wt={class:`font-medium text-foreground`},Gt={class:`flex justify-between`},Kt={class:`font-medium text-foreground text-right max-w-[140px] truncate`},qt={class:`flex justify-between`},Jt={class:`font-medium text-foreground`},Yt={class:`flex justify-between`},Xt={class:`font-medium text-foreground`},Zt={class:`flex justify-between`},Qt={class:`font-medium text-foreground`},$t={class:`flex justify-between`},en={class:`font-medium text-foreground`},tn={class:`flex justify-between`},nn={class:`font-medium text-foreground`},rn={key:0,class:`flex items-center gap-1.5`},an={key:1,class:`flex items-center gap-1.5`},on={key:2},sn={class:`space-y-1`},cn={class:`text-muted-foreground w-4`},ln={class:`text-muted-foreground`},un={key:0,class:`text-red-500 truncate`},dn={key:3,class:`text-xs text-muted-foreground`},fn={key:4,class:`pt-2`},pn=s({__name:`RequestDetailPanel`,props:{request:{}},emits:[`viewDetail`],setup(e){let n=e,i=_(()=>n.request?(((n.request.completedAt??Date.now())-n.request.startTime)/1e3).toFixed(1):`--`),a=_(()=>{if(!n.request?.streamMetrics)return`--`;let e=n.request.streamMetrics;if(e.outputTokens==null||e.ttftMs==null)return`--`;let t=(n.request.completedAt??Date.now())-n.request.startTime;return t<=0?`--`:`${(e.outputTokens/(t/1e3)).toFixed(1)} tok/s`});function o(e){switch(e){case`pending`:return`default`;case`failed`:return`destructive`;case`completed`:return`secondary`;default:return`outline`}}function s(e){switch(e){case`pending`:return`进行中`;case`failed`:return`失败`;case`completed`:return`完成`;default:return e}}return(n,c)=>e.request?(t(),O(`div`,Rt,[h(`div`,zt,[h(`span`,Bt,k(e.request.model),1),e.request.isStream?(t(),u(b(W),{key:0,variant:`outline`,class:`text-xs`},{default:l(()=>[...c[1]||=[f(`SSE`,-1)]]),_:1})):w(``,!0),D(b(W),{variant:o(e.request.status)},{default:l(()=>[f(k(s(e.request.status)),1)]),_:1},8,[`variant`])]),h(`p`,Vt,k(e.request.id.slice(0,8)),1),h(`div`,Ht,[h(`div`,Ut,[c[2]||=h(`span`,{class:`text-muted-foreground`},`API 类型`,-1),h(`span`,Wt,k(e.request.apiType.toUpperCase()),1)]),D(b($)),h(`div`,Gt,[c[3]||=h(`span`,{class:`text-muted-foreground`},`Provider`,-1),h(`span`,Kt,k(e.request.providerName),1)]),D(b($)),h(`div`,qt,[c[4]||=h(`span`,{class:`text-muted-foreground`},`耗时`,-1),h(`span`,Jt,k(i.value)+`s`,1)]),D(b($)),h(`div`,Yt,[c[5]||=h(`span`,{class:`text-muted-foreground`},`TTFT`,-1),h(`span`,Xt,k(e.request.streamMetrics?.ttftMs==null?`--`:`${e.request.streamMetrics.ttftMs.toFixed(0)}ms`),1)]),D(b($)),h(`div`,Zt,[c[6]||=h(`span`,{class:`text-muted-foreground`},`Input Tokens`,-1),h(`span`,Qt,k(e.request.streamMetrics?.inputTokens??`--`),1)]),D(b($)),h(`div`,$t,[c[7]||=h(`span`,{class:`text-muted-foreground`},`Output Tokens`,-1),h(`span`,en,k(e.request.streamMetrics?.outputTokens==null?`--`:e.request.streamMetrics.outputTokens),1)]),D(b($)),h(`div`,tn,[c[8]||=h(`span`,{class:`text-muted-foreground`},`速度`,-1),h(`span`,nn,k(a.value),1)])]),e.request.streamMetrics?.isComplete?(t(),O(`div`,rn,[D(b(W),{variant:`secondary`},{default:l(()=>[...c[9]||=[f(`已完成`,-1)]]),_:1}),e.request.streamMetrics.stopReason?(t(),u(b(W),{key:0,variant:`outline`},{default:l(()=>[f(k(e.request.streamMetrics.stopReason),1)]),_:1})):w(``,!0)])):e.request.status===`pending`?(t(),O(`div`,an,[D(b(W),null,{default:l(()=>[...c[10]||=[f(`进行中`,-1)]]),_:1})])):w(``,!0),e.request.attempts.length>0?(t(),O(`div`,on,[c[11]||=h(`p`,{class:`text-xs text-muted-foreground mb-1`},`尝试历史`,-1),h(`div`,sn,[(t(!0),O(m,null,r(e.request.attempts,(e,n)=>(t(),O(`div`,{key:n,class:`flex items-center gap-2 text-xs bg-muted/50 rounded px-2 py-1`},[h(`span`,cn,`#`+k(n+1),1),h(`span`,{class:g(e.statusCode&&e.statusCode<400?`text-green-600`:`text-red-500`)},k(e.statusCode??`N/A`),3),h(`span`,ln,k(e.latencyMs.toFixed(0))+`ms`,1),e.error?(t(),O(`span`,un,k(e.error),1)):w(``,!0)]))),128))])])):w(``,!0),e.request.clientIp?(t(),O(`div`,dn,` IP: `+k(e.request.clientIp),1)):w(``,!0),e.request.status===`completed`||e.request.status===`failed`?(t(),O(`div`,fn,[D(b(F),{variant:`outline`,size:`sm`,class:`w-full`,onClick:c[0]||=t=>n.$emit(`viewDetail`,e.request.id)},{default:l(()=>[...c[12]||=[f(` 查看完整日志 `,-1)]]),_:1})])):w(``,!0)])):(t(),O(`div`,Lt,` 点击请求查看详情 `))}}),mn={key:0,class:`flex items-center justify-center h-full text-sm text-muted-foreground`},hn={key:1,class:`flex items-center justify-center h-full text-sm text-muted-foreground`},gn={key:0,class:`space-y-2`},_n={class:`rounded-md border bg-card`},vn={class:`flex items-center gap-1.5 px-2.5 py-1.5 cursor-pointer hover:bg-muted/50 rounded-t-md`},yn={class:`text-xs text-muted-foreground`},bn={class:`px-2.5 pb-2`},xn={class:`text-xs bg-muted/50 rounded p-2 overflow-y-auto whitespace-pre-wrap break-words max-h-60 text-muted-foreground italic`},Sn={key:1,class:`rounded-md border bg-card`},Cn={class:`flex items-center gap-1.5 px-2.5 py-1.5 border-b`},wn={class:`px-2.5 py-2`},Tn={class:`rounded-md border bg-card`},En={class:`flex items-center gap-1.5 px-2.5 py-1.5 cursor-pointer hover:bg-muted/50 rounded-t-md`},Dn={class:`px-2.5 pb-2`},On={class:`text-xs bg-muted/50 rounded p-2 overflow-y-auto whitespace-pre-wrap break-words max-h-60`},kn={key:1},An={class:`rounded-md border bg-card`},jn={class:`flex items-center gap-1.5 px-2.5 py-1.5 border-b`},Mn={class:`px-2.5 py-2`},Nn={key:2,class:`text-sm text-muted-foreground py-4 text-center`},Pn={key:0,class:`text-xs bg-muted/50 rounded p-2 overflow-y-auto whitespace-pre-wrap break-words max-h-[60vh]`},Fn={key:1,class:`text-sm text-muted-foreground py-4 text-center`},In=s({__name:`StreamResponseViewer`,props:{metrics:{},isStream:{type:Boolean},streamContent:{}},setup(i){let a=i,o=x(null),s=x([]),c=x({}),d=x({}),p=_(()=>{let e=a.streamContent?.blocks;return!!(e&&e.length>0&&e.some(e=>e.type!==`text`||e.content.length>0))});return n(()=>a.streamContent?.textContent,()=>{e(()=>{o.value&&(o.value.scrollTop=o.value.scrollHeight);for(let e of s.value)e.scrollTop=e.scrollHeight})}),(e,n)=>i.isStream?i.streamContent?(t(),u(b(ce),{key:2,"default-value":`structured`,class:`flex flex-col h-full`},{default:l(()=>[D(b(le),{class:`w-fit`},{default:l(()=>[D(b(de),{value:`structured`},{default:l(()=>[...n[0]||=[f(`响应内容`,-1)]]),_:1}),D(b(de),{value:`raw`},{default:l(()=>[...n[1]||=[f(`原始 SSE`,-1)]]),_:1})]),_:1}),D(b(ue),{value:`structured`,class:`flex-1 overflow-y-auto mt-2`},{default:l(()=>[p.value?(t(),O(`div`,gn,[(t(!0),O(m,null,r(i.streamContent.blocks,(e,r)=>(t(),O(m,{key:r},[e.type===`thinking`&&e.content?(t(),u(b(H),{key:0,open:c.value[r]??!0,"onUpdate:open":e=>c.value[r]=e},{default:l(()=>[h(`div`,_n,[D(b(U),{"as-child":``},{default:l(()=>[h(`div`,vn,[D(b(xe),{class:g([`h-3 w-3 transition-transform`,{"rotate-90":c.value[r]??!0}])},null,8,[`class`]),D(b(be),{class:`h-3.5 w-3.5 text-muted-foreground`}),n[2]||=h(`span`,{class:`text-xs font-medium`},`Thinking`,-1),h(`span`,yn,`(`+k(e.content.length)+` 字符)`,1)])]),_:2},1024),D(b(V),null,{default:l(()=>[h(`div`,bn,[h(`pre`,xn,[h(`code`,null,k(e.content),1)])])]),_:2},1024)])]),_:2},1032,[`open`,`onUpdate:open`])):e.type===`text`&&e.content?(t(),O(`div`,Sn,[h(`div`,Cn,[D(b(Se),{class:`h-3.5 w-3.5 text-muted-foreground`}),n[3]||=h(`span`,{class:`text-xs font-medium`},`Reply`,-1)]),h(`div`,wn,[h(`pre`,{ref_for:!0,ref_key:`textContentRefs`,ref:s,class:`text-xs overflow-y-auto whitespace-pre-wrap break-words max-h-60`},[h(`code`,null,k(e.content),1)],512)])])):e.type===`tool_use`?(t(),u(b(H),{key:2,open:d.value[r]??!1,"onUpdate:open":e=>d.value[r]=e},{default:l(()=>[h(`div`,Tn,[D(b(U),{"as-child":``},{default:l(()=>[h(`div`,En,[D(b(xe),{class:g([`h-3 w-3 transition-transform`,{"rotate-90":d.value[r]??!1}])},null,8,[`class`]),D(b(Ce),{class:`h-3.5 w-3.5 text-muted-foreground`}),n[4]||=h(`span`,{class:`text-xs font-medium`},`Tool Use`,-1),e.name?(t(),u(b(W),{key:0,variant:`outline`,class:`text-xs`},{default:l(()=>[f(k(e.name),1)]),_:2},1024)):w(``,!0)])]),_:2},1024),D(b(V),null,{default:l(()=>[h(`div`,Dn,[h(`pre`,On,[h(`code`,null,k(e.content||`(等待数据...)`),1)])])]),_:2},1024)])]),_:2},1032,[`open`,`onUpdate:open`])):w(``,!0)],64))),128))])):i.streamContent.textContent?(t(),O(`div`,kn,[h(`div`,An,[h(`div`,jn,[D(b(Se),{class:`h-3.5 w-3.5 text-muted-foreground`}),n[5]||=h(`span`,{class:`text-xs font-medium`},`Reply`,-1)]),h(`div`,Mn,[h(`pre`,{ref_key:`textContentRef`,ref:o,class:`text-xs overflow-y-auto whitespace-pre-wrap break-words max-h-80`},[h(`code`,null,k(i.streamContent.textContent),1)],512)])])])):(t(),O(`div`,Nn,` 暂无内容 `))]),_:1}),D(b(ue),{value:`raw`,class:`flex-1 overflow-y-auto mt-2`},{default:l(()=>[i.streamContent.rawChunks?(t(),O(`pre`,Pn,[h(`code`,null,k(i.streamContent.rawChunks),1)])):(t(),O(`div`,Fn,` 暂无数据 `))]),_:1})]),_:1})):(t(),O(`div`,hn,` 等待流数据... `)):(t(),O(`div`,mn,` 非流式请求无实时内容 `))}}),Ln={key:0,class:`text-sm text-muted-foreground py-4 text-center`},Rn={key:1,class:`text-sm text-muted-foreground py-4 text-center`},zn={class:`flex flex-wrap gap-1`},Bn={key:0,class:`text-xs text-muted-foreground`},Vn=s({__name:`ProviderStatsTable`,props:{stats:{}},setup(e){let n=e,i=_(()=>n.stats?Object.entries(n.stats.byProvider).filter(([e])=>typeof e==`string`).map(([e,t])=>({id:e,name:t.providerName,stats:t,successRate:t.totalRequests>0?t.successCount/t.totalRequests*100:0,retryRate:t.totalRequests>0?t.retryCount/t.totalRequests*100:0,p99Latency:n.stats.p99LatencyMs.toFixed(0)+`ms`})):[]);return(n,a)=>e.stats?i.value.length===0?(t(),O(`div`,Rn,` 暂无 Provider 统计 `)):(t(),u(b(me),{key:2},{default:l(()=>[D(b(ge),null,{default:l(()=>[D(b(he),null,{default:l(()=>[D(b(X),null,{default:l(()=>[...a[0]||=[f(`Provider`,-1)]]),_:1}),D(b(X),{class:`text-right`},{default:l(()=>[...a[1]||=[f(`请求数`,-1)]]),_:1}),D(b(X),{class:`text-right`},{default:l(()=>[...a[2]||=[f(`成功率`,-1)]]),_:1}),D(b(X),{class:`text-right`},{default:l(()=>[...a[3]||=[f(`平均延迟`,-1)]]),_:1}),D(b(X),{class:`text-right`},{default:l(()=>[...a[4]||=[f(`P99 延迟`,-1)]]),_:1}),D(b(X),{class:`text-right`},{default:l(()=>[...a[5]||=[f(`重试率`,-1)]]),_:1}),D(b(X),null,{default:l(()=>[...a[6]||=[f(`Top Errors`,-1)]]),_:1})]),_:1})]),_:1}),D(b(pe),null,{default:l(()=>[(t(!0),O(m,null,r(i.value,e=>(t(),u(b(he),{key:e.id},{default:l(()=>[D(b(Y),{class:`font-medium`},{default:l(()=>[f(k(e.name),1)]),_:2},1024),D(b(Y),{class:`text-right`},{default:l(()=>[f(k(e.stats.totalRequests),1)]),_:2},1024),D(b(Y),{class:`text-right`},{default:l(()=>[h(`span`,{class:g(e.successRate>=95?`text-green-600`:e.successRate>=80?`text-yellow-600`:`text-red-500`)},k(e.successRate.toFixed(1))+`% `,3)]),_:2},1024),D(b(Y),{class:`text-right`},{default:l(()=>[f(k(e.stats.avgLatencyMs.toFixed(0))+`ms`,1)]),_:2},1024),D(b(Y),{class:`text-right`},{default:l(()=>[f(k(e.p99Latency),1)]),_:2},1024),D(b(Y),{class:`text-right`},{default:l(()=>[h(`span`,{class:g(e.retryRate>10?`text-yellow-600`:``)},k(e.retryRate.toFixed(1))+`% `,3)]),_:2},1024),D(b(Y),null,{default:l(()=>[h(`div`,zn,[(t(!0),O(m,null,r(e.stats.topErrors.slice(0,3),e=>(t(),u(b(W),{key:e.code,variant:`destructive`,class:`text-xs`},{default:l(()=>[f(k(e.code)+` (`+k(e.count)+`) `,1)]),_:2},1024))),128)),e.stats.topErrors.length===0?(t(),O(`span`,Bn,`--`)):w(``,!0)])]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})):(t(),O(`div`,Ln,` 暂无数据 `))}}),Hn={key:0,class:`font-mono text-xs text-muted-foreground font-normal select-all`},Un={key:0,class:`space-y-3 py-4`},Wn={class:`p-4`},Gn={class:`p-4`},Kn={class:`p-4`},qn={class:`p-4`},Jn={key:2,class:`py-8 text-center text-muted-foreground`},Yn=s({__name:`LogDetailDialog`,props:{open:{type:Boolean,required:!0},openModifiers:{}},emits:[`update:open`],setup(e,{expose:n}){let i=c(e,`open`),a=x(!1),o=x(null),s=x([!0,!1,!1,!1]),d=v({client_request:`structured`,upstream_request:`structured`,upstream_response:`structured`,client_response:`structured`}),p=_(()=>o.value?.api_type===`openai`?`openai`:`anthropic`),y=_(()=>{let e=o.value;if(!e)return`{}`;if(!e.client_request)return e.request_body||`{}`;try{let t=JSON.parse(e.client_request);if(t.body!=null)return e.client_request;if(e.request_body){try{t.body=JSON.parse(e.request_body)}catch{t.body=e.request_body}return JSON.stringify(t)}}catch{return e.client_request}return e.client_request}),S=_(()=>{let e=o.value;return e?e.client_response?e.client_response:e.response_body?JSON.stringify({statusCode:e.status_code,body:e.response_body}):``:``});async function T(e){a.value=!0,o.value=null,s.value=[!0,!1,!1,!1],Object.assign(d,{client_request:`structured`,upstream_request:`structured`,upstream_response:`structured`,client_response:`structured`});try{o.value=(await C.getLogDetail(e)).data}catch(e){console.error(`Failed to load log detail:`,e),fe.error(`加载日志详情失败`)}finally{a.value=!1}}return n({load:T}),(e,n)=>(t(),u(b(oe),{open:i.value,"onUpdate:open":n[4]||=e=>i.value=e},{default:l(()=>[D(b(ie),{class:`max-w-4xl max-h-[85vh]`},{default:l(()=>[D(b(ae),null,{default:l(()=>[D(b(se),null,{default:l(()=>[n[5]||=f(`请求详情 `,-1),o.value?(t(),O(`span`,Hn,k(o.value.id.slice(0,8)),1)):w(``,!0)]),_:1})]),_:1}),a.value?(t(),O(`div`,Un,[D(b(ve),{class:`h-6 w-48`}),(t(),O(m,null,r(4,e=>D(b(ve),{key:e,class:`h-12 w-full`})),64))])):o.value?(t(),O(m,{key:1},[D(b(H),{open:s.value[0],"onUpdate:open":n[0]||=e=>s.value[0]=e,class:`border rounded-md mb-2`},{default:l(()=>[D(b(U),{"as-child":``},{default:l(()=>[D(b(F),{variant:`ghost`,class:`w-full px-4 py-3 text-left text-sm font-medium text-foreground bg-muted/50 hover:bg-muted rounded-md flex items-center gap-2`},{default:l(()=>[h(`span`,{class:g([`text-xs transition-transform`,s.value[0]?``:`-rotate-90`])},`▼`,2),n[6]||=f(` 客户端原始请求 `,-1)]),_:1})]),_:1}),D(b(V),null,{default:l(()=>[h(`div`,Wn,[D(_e,{raw:y.value,"api-type":p.value,mode:d.client_request},null,8,[`raw`,`api-type`,`mode`])])]),_:1})]),_:1},8,[`open`]),o.value.upstream_request?(t(),u(b(H),{key:0,open:s.value[1],"onUpdate:open":n[1]||=e=>s.value[1]=e,class:`border rounded-md mb-2`},{default:l(()=>[D(b(U),{"as-child":``},{default:l(()=>[D(b(F),{variant:`ghost`,class:`w-full px-4 py-3 text-left text-sm font-medium text-foreground bg-muted/50 hover:bg-muted rounded-md flex items-center gap-2`},{default:l(()=>[h(`span`,{class:g([`text-xs transition-transform`,s.value[1]?``:`-rotate-90`])},`▼`,2),n[7]||=f(` Router → LLM API 请求 `,-1)]),_:1})]),_:1}),D(b(V),null,{default:l(()=>[h(`div`,Gn,[D(_e,{raw:o.value.upstream_request,"api-type":p.value,"show-url":!0,mode:d.upstream_request},null,8,[`raw`,`api-type`,`mode`])])]),_:1})]),_:1},8,[`open`])):w(``,!0),o.value.upstream_response||o.value.response_body?(t(),u(b(H),{key:1,open:s.value[2],"onUpdate:open":n[2]||=e=>s.value[2]=e,class:`border rounded-md mb-2`},{default:l(()=>[D(b(U),{"as-child":``},{default:l(()=>[D(b(F),{variant:`ghost`,class:`w-full px-4 py-3 text-left text-sm font-medium text-foreground bg-muted/50 hover:bg-muted rounded-md flex items-center gap-2`},{default:l(()=>[h(`span`,{class:g([`text-xs transition-transform`,s.value[2]?``:`-rotate-90`])},`▼`,2),n[8]||=f(` LLM API 返回的原始响应 `,-1)]),_:1})]),_:1}),D(b(V),null,{default:l(()=>[h(`div`,Kn,[D(ye,{raw:o.value.upstream_response||o.value.response_body||`{}`,"api-type":p.value,"is-stream":!!o.value.is_stream,mode:d.upstream_response},null,8,[`raw`,`api-type`,`is-stream`,`mode`])])]),_:1})]),_:1},8,[`open`])):w(``,!0),S.value?(t(),u(b(H),{key:2,open:s.value[3],"onUpdate:open":n[3]||=e=>s.value[3]=e,class:`border rounded-md`},{default:l(()=>[D(b(U),{"as-child":``},{default:l(()=>[D(b(F),{variant:`ghost`,class:`w-full px-4 py-3 text-left text-sm font-medium text-foreground bg-muted/50 hover:bg-muted rounded-md flex items-center gap-2`},{default:l(()=>[h(`span`,{class:g([`text-xs transition-transform`,s.value[3]?``:`-rotate-90`])},`▼`,2),n[9]||=f(` Router → 客户端响应 `,-1)]),_:1})]),_:1}),D(b(V),null,{default:l(()=>[h(`div`,qn,[D(ye,{raw:S.value,"api-type":p.value,"is-stream":!!o.value.is_stream,mode:d.client_response},null,8,[`raw`,`api-type`,`is-stream`,`mode`])])]),_:1})]),_:1},8,[`open`])):w(``,!0),o.value.error_message?(t(),u(b(G),{key:3,class:`bg-destructive/10 ring-destructive/20 mt-2`},{default:l(()=>[D(b(K),{class:`py-3 text-sm text-destructive`},{default:l(()=>[f(k(o.value.error_message),1)]),_:1})]),_:1})):w(``,!0)],64)):(t(),O(`div`,Jn,`未找到日志`))]),_:1})]),_:1},8,[`open`]))}}),Xn={class:`p-6`},Zn={class:`flex items-center justify-between mb-4`},Qn={class:`flex items-center gap-2`},$n={class:`grid grid-cols-3 gap-4 mb-6`},er={class:`flex items-center justify-between`},tr={key:0,class:`text-sm text-muted-foreground py-2`},nr=[`onClick`],rr={class:`text-sm text-foreground truncate flex-1`},ir={class:`text-xs text-muted-foreground shrink-0`},ar={class:`flex items-center justify-between`},or={key:0,class:`text-sm text-muted-foreground py-2`},sr=[`onClick`],cr={class:`text-sm text-foreground truncate flex-1`},lr={class:`text-xs text-muted-foreground shrink-0`},ur={class:`flex items-center justify-between`},dr={key:0,class:`text-sm text-muted-foreground py-2`},fr=[`onClick`],pr={class:`text-sm text-foreground truncate flex-1`},mr={class:`grid grid-cols-1 lg:grid-cols-3 gap-4`},hr={key:0,class:`flex gap-4 min-h-0`},gr={class:`w-[260px] shrink-0 overflow-y-auto pr-2 border-r`},_r={class:`flex-1 min-w-0 overflow-y-auto`},vr={key:1,class:`text-sm text-muted-foreground py-4 text-center`},yr=200,br=s({__name:`Monitor`,setup(e){let n=x([]),o=x([]),s=x(null),c=x(!1),d=x(null),p=x([]),v=x(null),y=x(!1),S=_(()=>n.value.filter(e=>e.isStream).length),T=_(()=>n.value.filter(e=>!e.queued)),E=_(()=>n.value.filter(e=>e.queued===!0));function A(e){s.value=e,c.value=!0}let j=_(()=>s.value?n.value.find(e=>e.id===s.value)??o.value.find(e=>e.id===s.value)??null:null),M=x(!1),N=x(null);function P(e){c.value=!1,M.value=!0,N.value?.load(e)}function F(e){switch(e){case`pending`:return`default`;case`failed`:return`destructive`;case`completed`:return`secondary`;default:return`outline`}}function I(e){switch(e){case`pending`:return`进行中`;case`failed`:return`失败`;case`completed`:return`完成`;default:return e}}function L(e){return((Date.now()-e)/1e3).toFixed(1)}let R=null;function ee(e){let t;try{t=JSON.parse(e.data)}catch{return}switch(e.type){case`request_start`:{let e=t;o.value.some(t=>t.id===e.id)||n.value.unshift(e);break}case`request_update`:n.value=t;break;case`request_complete`:{let e=t;n.value=n.value.filter(t=>t.id!==e.id),o.value.unshift(e),o.value.length>yr&&(o.value.length=yr);break}case`concurrency_update`:p.value=t;break;case`stats_update`:d.value=t;break;case`runtime_update`:v.value=t;break}}function te(){R=new EventSource(`/admin/api/monitor/stream`),R.onopen=()=>{y.value=!0};for(let e of[`request_start`,`request_update`,`request_complete`,`concurrency_update`,`stats_update`,`runtime_update`])R.addEventListener(e,ee);R.onerror=()=>{y.value=!1,R?.close(),R=null}}function z(){R&&=(R.close(),null),y.value=!1}async function ne(){try{let[e,t,r,i,a]=await Promise.allSettled([C.getMonitorActive(),C.getMonitorRecent(),C.getMonitorStats(),C.getMonitorConcurrency(),C.getMonitorRuntime()]);e.status===`fulfilled`&&(n.value=e.value),t.status===`fulfilled`&&(o.value=t.value),r.status===`fulfilled`&&(d.value=r.value),i.status===`fulfilled`&&(p.value=i.value),a.status===`fulfilled`&&(v.value=a.value)}catch(e){console.error(`Failed to load initial monitor data:`,e),d.value=null,p.value=[],v.value=null}}return i(async()=>{await ne(),te()}),a(()=>{z()}),(e,i)=>(t(),O(`div`,Xn,[h(`div`,Zn,[i[2]||=h(`h2`,{class:`text-lg font-semibold text-foreground`},`实时监控`,-1),h(`div`,Qn,[D(b(W),{variant:y.value?`default`:`destructive`},{default:l(()=>[f(k(y.value?`已连接`:`未连接`),1)]),_:1},8,[`variant`])])]),D(lt,{stats:d.value,"active-count":n.value.length,"stream-count":S.value},null,8,[`stats`,`active-count`,`stream-count`]),h(`div`,$n,[D(b(G),null,{default:l(()=>[D(b(q),{class:`pb-2`},{default:l(()=>[h(`div`,er,[D(b(J),{class:`text-sm font-medium text-foreground`},{default:l(()=>[...i[3]||=[f(`活跃请求`,-1)]]),_:1}),D(b(W),{variant:`secondary`},{default:l(()=>[f(k(T.value.length),1)]),_:1})])]),_:1}),D(b(K),null,{default:l(()=>[D(b($e),{class:`h-64`},{default:l(()=>[T.value.length===0?(t(),O(`div`,tr,` 暂无活跃请求 `)):w(``,!0),(t(!0),O(m,null,r(T.value,e=>(t(),O(`div`,{key:e.id,class:g([`flex items-center gap-2 py-2 px-2 rounded cursor-pointer hover:bg-muted/50 transition-colors`,{"bg-muted":s.value===e.id}]),onClick:t=>A(e.id)},[D(b(W),{variant:F(e.status),class:`shrink-0`},{default:l(()=>[f(k(I(e.status)),1)]),_:2},1032,[`variant`]),h(`span`,rr,k(e.model),1),D(b(W),{variant:`outline`,class:`shrink-0 text-xs`},{default:l(()=>[f(k(e.providerName),1)]),_:2},1024),h(`span`,ir,k(L(e.startTime))+`s`,1),e.isStream?(t(),u(b(W),{key:0,variant:`outline`,class:`shrink-0 text-xs`},{default:l(()=>[...i[4]||=[f(`SSE`,-1)]]),_:1})):w(``,!0)],10,nr))),128))]),_:1})]),_:1})]),_:1}),D(b(G),null,{default:l(()=>[D(b(q),{class:`pb-2`},{default:l(()=>[h(`div`,ar,[D(b(J),{class:`text-sm font-medium text-foreground`},{default:l(()=>[...i[5]||=[f(`队列请求`,-1)]]),_:1}),D(b(W),{variant:`secondary`},{default:l(()=>[f(k(E.value.length),1)]),_:1})])]),_:1}),D(b(K),null,{default:l(()=>[D(b($e),{class:`h-64`},{default:l(()=>[E.value.length===0?(t(),O(`div`,or,` 暂无排队请求 `)):w(``,!0),(t(!0),O(m,null,r(E.value,e=>(t(),O(`div`,{key:e.id,class:g([`flex items-center gap-2 py-2 px-2 rounded cursor-pointer hover:bg-muted/50 transition-colors`,{"bg-muted":s.value===e.id}]),onClick:t=>A(e.id)},[D(b(W),{variant:`outline`,class:`shrink-0`},{default:l(()=>[...i[6]||=[f(` 排队 `,-1)]]),_:1}),h(`span`,cr,k(e.model),1),D(b(W),{variant:`outline`,class:`shrink-0 text-xs`},{default:l(()=>[f(k(e.providerName),1)]),_:2},1024),h(`span`,lr,k(L(e.startTime))+`s`,1)],10,sr))),128))]),_:1})]),_:1})]),_:1}),D(b(G),null,{default:l(()=>[D(b(q),{class:`pb-2`},{default:l(()=>[h(`div`,ur,[D(b(J),{class:`text-sm font-medium text-foreground`},{default:l(()=>[...i[7]||=[f(`已完成`,-1)]]),_:1}),D(b(W),{variant:`secondary`},{default:l(()=>[f(k(o.value.length),1)]),_:1})])]),_:1}),D(b(K),null,{default:l(()=>[D(b($e),{class:`h-64`},{default:l(()=>[o.value.length===0?(t(),O(`div`,dr,` 暂无已完成请求 `)):w(``,!0),(t(!0),O(m,null,r(o.value,e=>(t(),O(`div`,{key:e.id,class:g([`flex items-center gap-2 py-1.5 px-2 rounded cursor-pointer opacity-60 hover:opacity-80 hover:bg-muted/50 transition-colors`,{"bg-muted":s.value===e.id}]),onClick:t=>A(e.id)},[D(b(W),{variant:F(e.status),class:`shrink-0`},{default:l(()=>[f(k(I(e.status)),1)]),_:2},1032,[`variant`]),h(`span`,pr,k(e.model),1),D(b(W),{variant:`outline`,class:`shrink-0 text-xs`},{default:l(()=>[f(k(e.providerName),1)]),_:2},1024),e.isStream?(t(),u(b(W),{key:0,variant:`outline`,class:`shrink-0 text-xs`},{default:l(()=>[...i[8]||=[f(`SSE`,-1)]]),_:1})):w(``,!0)],10,fr))),128))]),_:1})]),_:1})]),_:1})]),D(b(G),{class:`mb-4`},{default:l(()=>[D(b(q),null,{default:l(()=>[D(b(J),{class:`text-sm font-medium text-foreground`},{default:l(()=>[...i[9]||=[f(`Provider 统计`,-1)]]),_:1})]),_:1}),D(b(K),null,{default:l(()=>[D(Vn,{stats:d.value},null,8,[`stats`])]),_:1})]),_:1}),h(`div`,mr,[D(b(G),null,{default:l(()=>[D(b(q),null,{default:l(()=>[D(b(J),{class:`text-sm font-medium text-foreground`},{default:l(()=>[...i[10]||=[f(`并发度`,-1)]]),_:1})]),_:1}),D(b(K),null,{default:l(()=>[D(_t,{providers:p.value},null,8,[`providers`])]),_:1})]),_:1}),D(b(G),null,{default:l(()=>[D(b(q),null,{default:l(()=>[D(b(J),{class:`text-sm font-medium text-foreground`},{default:l(()=>[...i[11]||=[f(`状态码分布`,-1)]]),_:1})]),_:1}),D(b(K),null,{default:l(()=>[D(It,{"by-status-code":d.value?.byStatusCode??{}},null,8,[`by-status-code`])]),_:1})]),_:1}),D(b(G),null,{default:l(()=>[D(b(q),null,{default:l(()=>[D(b(J),{class:`text-sm font-medium text-foreground`},{default:l(()=>[...i[12]||=[f(`运行时`,-1)]]),_:1})]),_:1}),D(b(K),null,{default:l(()=>[D(At,{runtime:v.value},null,8,[`runtime`])]),_:1})]),_:1})]),D(b(oe),{open:c.value,"onUpdate:open":i[0]||=e=>c.value=e},{default:l(()=>[D(b(ie),{class:`max-w-5xl max-h-[80vh]`},{default:l(()=>[D(b(ae),null,{default:l(()=>[D(b(se),null,{default:l(()=>[...i[13]||=[f(`请求详情`,-1)]]),_:1})]),_:1}),j.value?(t(),O(`div`,hr,[h(`div`,gr,[D(pn,{request:j.value,onViewDetail:P},null,8,[`request`])]),h(`div`,_r,[D(In,{metrics:j.value.streamMetrics??null,"is-stream":j.value.isStream,"stream-content":j.value.streamContent??void 0},null,8,[`metrics`,`is-stream`,`stream-content`])])])):(t(),O(`div`,vr,` 点击请求查看详情 `))]),_:1})]),_:1},8,[`open`]),D(Yn,{ref_key:`logDetailDialog`,ref:N,open:M.value,"onUpdate:open":i[1]||=e=>M.value=e},null,8,[`open`])]))}});export{br as default};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{B as e,F as t,K as n,L as r,M as i,R as a,S as o,V as s,Y as c,_ as l,_t as u,b as d,dt as f,f as p,g as m,gt as h,h as g,k as _,mt as v,ot as y,q as b,t as x,u as S,v as C,vt as w,w as T,x as E,y as D,yt as O}from"./client-Mb8fy_bC.js";import{C as ee,T as k,b as te,h as ne,i as A,n as j,p as re,r as M,u as N,x as ie}from"./button-D54q76GQ.js";import{S as P,_ as ae,c as oe,f as F,n as se,o as ce,p as le,u as ue}from"./Collection-DUBb4r6h.js";import{t as de}from"./VisuallyHidden-CJBR3YB3.js";import{t as I}from"./useForwardExpose-CzQFheaD.js";import{i as fe,n as pe,r as me,t as he}from"./PopperContent-CnZejY31.js";import{n as ge,r as _e,t as ve}from"./CollapsibleTrigger-BFNhb19_.js";import{a as ye,c as be,i as xe,n as Se,o as Ce,r as we,s as Te,t as Ee}from"./alert-dialog-BAR1JRmT.js";import{t as De}from"./Label-CXAeFn-r.js";import{t as Oe}from"./Switch-CLeo7H6d.js";import{i as ke,n as Ae,r as L,t as R}from"./TabsTrigger-DErAbTuM.js";import{n as z,r as B}from"./lib-BgOqOzXI.js";import{n as V,t as H}from"./CardContent-CucI6u41.js";import{t as U}from"./CardHeader-d-DYsWxe.js";import{t as W}from"./CardTitle-CIDEQkWB.js";import{a as je,i as G,n as K,o as Me,r as q,t as Ne}from"./TableHeader-BpscAtT3.js";function Pe(e,t){let n=ie(!1,300);ee(()=>{n.value=!1});let r=y(null),i=ne();function a(){r.value=null,n.value=!1}function o(e,t){if(!t)return;let i=e.currentTarget,a={x:e.clientX,y:e.clientY},o=Ie(a,Fe(a,i.getBoundingClientRect()),1),s=Le(t.getBoundingClientRect());r.value=ze([...o,...s]),n.value=!0}return b(n=>{if(e.value&&t.value){let r=e=>o(e,t.value),i=t=>o(t,e.value);e.value.addEventListener(`pointerleave`,r),t.value.addEventListener(`pointerleave`,i),n(()=>{e.value?.removeEventListener(`pointerleave`,r),t.value?.removeEventListener(`pointerleave`,i)})}}),b(n=>{if(r.value){let o=n=>{if(!r.value||!(n.target instanceof Element))return;let o=n.target,s={x:n.clientX,y:n.clientY},c=e.value?.contains(o)||t.value?.contains(o),l=!Re(s,r.value),u=!!o.closest(`[data-grace-area-trigger]`);c?a():(l||u)&&(a(),i.trigger())};e.value?.ownerDocument.addEventListener(`pointermove`,o),n(()=>e.value?.ownerDocument.removeEventListener(`pointermove`,o))}}),{isPointerInTransit:n,onPointerExit:i.on}}function Fe(e,t){let n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),i=Math.abs(t.right-e.x),a=Math.abs(t.left-e.x);switch(Math.min(n,r,i,a)){case a:return`left`;case i:return`right`;case n:return`top`;case r:return`bottom`;default:throw Error(`unreachable`)}}function Ie(e,t,n=5){let r=[];switch(t){case`top`:r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case`bottom`:r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case`left`:r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case`right`:r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}function Le(e){let{top:t,right:n,bottom:r,left:i}=e;return[{x:i,y:t},{x:n,y:t},{x:n,y:r},{x:i,y:r}]}function Re(e,t){let{x:n,y:r}=e,i=!1;for(let e=0,a=t.length-1;e<t.length;a=e++){let o=t[e].x,s=t[e].y,c=t[a].x,l=t[a].y;s>r!=l>r&&n<(c-o)*(r-s)/(l-s)+o&&(i=!i)}return i}function ze(e){let t=e.slice();return t.sort((e,t)=>e.x<t.x?-1:e.x>t.x?1:e.y<t.y?-1:+(e.y>t.y)),Be(t)}function Be(e){if(e.length<=1)return e.slice();let t=[];for(let n=0;n<e.length;n++){let r=e[n];for(;t.length>=2;){let e=t.at(-1),n=t[t.length-2];if((e.x-n.x)*(r.y-n.y)>=(e.y-n.y)*(r.x-n.x))t.pop();else break}t.push(r)}t.pop();let n=[];for(let t=e.length-1;t>=0;t--){let r=e[t];for(;n.length>=2;){let e=n.at(-1),t=n[n.length-2];if((e.x-t.x)*(r.y-t.y)>=(e.y-t.y)*(r.x-t.x))n.pop();else break}n.push(r)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}var Ve={key:0,d:`M0 0L6 6L12 0`},He={key:1,d:`M0 0L4.58579 4.58579C5.36683 5.36683 6.63316 5.36684 7.41421 4.58579L12 0`},Ue=o({__name:`Arrow`,props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`svg`}},setup(e){let n=e;return I(),(e,r)=>(t(),l(v(A),_(n,{width:e.width,height:e.height,viewBox:e.asChild?void 0:`0 0 12 6`,preserveAspectRatio:e.asChild?void 0:`none`}),{default:c(()=>[a(e.$slots,`default`,{},()=>[e.rounded?(t(),D(`path`,He)):(t(),D(`path`,Ve))])]),_:3},16,[`width`,`height`,`viewBox`,`preserveAspectRatio`]))}}),We={top:`bottom`,right:`left`,bottom:`top`,left:`right`},Ge=o({inheritAttrs:!1,__name:`PopperArrow`,props:{width:{type:Number,required:!1},height:{type:Number,required:!1},rounded:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`svg`}},setup(e){let{forwardRef:n}=I(),r=pe(),i=g(()=>We[r.placedSide.value]);return(e,o)=>(t(),D(`span`,{ref:e=>{v(r).onArrowChange(e??void 0)},style:w({position:`absolute`,left:v(r).arrowX?.value?`${v(r).arrowX?.value}px`:void 0,top:v(r).arrowY?.value?`${v(r).arrowY?.value}px`:void 0,[i.value]:0,transformOrigin:{top:``,right:`0 0`,bottom:`center 0`,left:`100% 0`}[v(r).placedSide.value],transform:{top:`translateY(100%)`,right:`translateY(50%) rotate(90deg) translateX(-50%)`,bottom:`rotate(180deg)`,left:`translateY(50%) rotate(-90deg) translateX(50%)`}[v(r).placedSide.value],visibility:v(r).shouldHideArrow.value?`hidden`:void 0})},[E(Ue,_(e.$attrs,{ref:v(n),style:{display:`block`},as:e.as,"as-child":e.asChild,rounded:e.rounded,width:e.width,height:e.height}),{default:c(()=>[a(e.$slots,`default`)]),_:3},16,[`as`,`as-child`,`rounded`,`width`,`height`])],4))}}),Ke=o({__name:`TooltipArrow`,props:{width:{type:Number,required:!1,default:10},height:{type:Number,required:!1,default:5},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`svg`}},setup(e){let n=e;return I(),(e,r)=>(t(),l(v(Ge),u(T(n)),{default:c(()=>[a(e.$slots,`default`)]),_:3},16))}}),[J,qe]=P(`TooltipProvider`),Je=o({inheritAttrs:!1,__name:`TooltipProvider`,props:{delayDuration:{type:Number,required:!1,default:700},skipDelayDuration:{type:Number,required:!1,default:300},disableHoverableContent:{type:Boolean,required:!1,default:!1},disableClosingTrigger:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},ignoreNonKeyboardFocus:{type:Boolean,required:!1,default:!1},content:{type:Object,required:!1}},setup(e){let{delayDuration:t,skipDelayDuration:n,disableHoverableContent:r,disableClosingTrigger:i,ignoreNonKeyboardFocus:o,disabled:s,content:c}=f(e);I();let l=y(!0),u=y(!1),{start:d,stop:p}=k(()=>{l.value=!0},n,{immediate:!1});return qe({isOpenDelayed:l,delayDuration:t,onOpen(){p(),l.value=!1},onClose(){d()},isPointerInTransitRef:u,disableHoverableContent:r,disableClosingTrigger:i,disabled:s,ignoreNonKeyboardFocus:o,content:c}),(e,t)=>a(e.$slots,`default`)}}),Y=`tooltip.open`,[X,Ye]=P(`TooltipRoot`),Xe=o({__name:`TooltipRoot`,props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},delayDuration:{type:Number,required:!1,default:void 0},disableHoverableContent:{type:Boolean,required:!1,default:void 0},disableClosingTrigger:{type:Boolean,required:!1,default:void 0},disabled:{type:Boolean,required:!1,default:void 0},ignoreNonKeyboardFocus:{type:Boolean,required:!1,default:void 0}},emits:[`update:open`],setup(e,{emit:r}){let i=e,o=r;I();let s=J(),u=g(()=>i.disableHoverableContent??s.disableHoverableContent.value),d=g(()=>i.disableClosingTrigger??s.disableClosingTrigger.value),f=g(()=>i.disabled??s.disabled.value),p=g(()=>i.delayDuration??s.delayDuration.value),m=g(()=>i.ignoreNonKeyboardFocus??s.ignoreNonKeyboardFocus.value),h=re(i,`open`,o,{defaultValue:i.defaultOpen,passive:i.open===void 0});n(h,e=>{s.onClose&&(e?(s.onOpen(),document.dispatchEvent(new CustomEvent(Y))):s.onClose())});let _=y(!1),b=y(),x=g(()=>h.value?_.value?`delayed-open`:`instant-open`:`closed`),{start:S,stop:C}=k(()=>{_.value=!0,h.value=!0},p,{immediate:!1});function w(){C(),_.value=!1,h.value=!0}function T(){C(),h.value=!1}function E(){S()}return Ye({contentId:``,open:h,stateAttribute:x,trigger:b,onTriggerChange(e){b.value=e},onTriggerEnter(){s.isOpenDelayed.value?E():w()},onTriggerLeave(){u.value?T():C()},onOpen:w,onClose:T,disableHoverableContent:u,disableClosingTrigger:d,disabled:f,ignoreNonKeyboardFocus:m}),(e,n)=>(t(),l(v(fe),null,{default:c(()=>[a(e.$slots,`default`,{open:v(h)})]),_:3}))}}),Z=o({__name:`TooltipContentImpl`,props:{ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1,default:void 0},as:{type:null,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1,default:void 0},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1,default:void 0},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},emits:[`escapeKeyDown`,`pointerDownOutside`],setup(e,{emit:n}){let r=e,o=n,s=X(),u=J(),{forwardRef:f,currentElement:p}=I(),m=g(()=>r.ariaLabel||p.value?.textContent),h=g(()=>{let{ariaLabel:e,...t}=r;return ae(t,u.content.value??{},{side:`top`,sideOffset:0,align:`center`,avoidCollisions:!0,collisionBoundary:[],collisionPadding:0,arrowPadding:0,sticky:`partial`,hideWhenDetached:!1})});return i(()=>{N(window,`scroll`,e=>{e.target?.contains(s.trigger.value)&&s.onClose()},{capture:!0}),N(window,Y,s.onClose)}),(e,n)=>(t(),l(v(ce),{"as-child":``,"disable-outside-pointer-events":!1,onEscapeKeyDown:n[0]||=e=>o(`escapeKeyDown`,e),onPointerDownOutside:n[1]||=e=>{v(s).disableClosingTrigger.value&&v(s).trigger.value?.contains(e.target)&&e.preventDefault(),o(`pointerDownOutside`,e)},onFocusOutside:n[2]||=S(()=>{},[`prevent`]),onDismiss:n[3]||=e=>v(s).onClose()},{default:c(()=>[E(v(he),_({ref:v(f),"data-state":v(s).stateAttribute.value},{...e.$attrs,...h.value},{style:{"--reka-tooltip-content-transform-origin":`var(--reka-popper-transform-origin)`,"--reka-tooltip-content-available-width":`var(--reka-popper-available-width)`,"--reka-tooltip-content-available-height":`var(--reka-popper-available-height)`,"--reka-tooltip-trigger-width":`var(--reka-popper-anchor-width)`,"--reka-tooltip-trigger-height":`var(--reka-popper-anchor-height)`}}),{default:c(()=>[a(e.$slots,`default`),E(v(de),{id:v(s).contentId,role:`tooltip`},{default:c(()=>[d(O(m.value),1)]),_:1},8,[`id`])]),_:3},16,[`data-state`])]),_:3}))}}),Ze=o({__name:`TooltipContentHoverable`,props:{ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},setup(e){let n=le(e),{forwardRef:r,currentElement:i}=I(),{trigger:o,onClose:s}=X(),u=J(),{isPointerInTransit:d,onPointerExit:f}=Pe(o,i);return u.isPointerInTransitRef=d,f(()=>{s()}),(e,i)=>(t(),l(Z,_({ref:v(r)},v(n)),{default:c(()=>[a(e.$slots,`default`)]),_:3},16))}}),Qe=o({__name:`TooltipContent`,props:{forceMount:{type:Boolean,required:!1},ariaLabel:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},side:{type:null,required:!1},sideOffset:{type:Number,required:!1},align:{type:null,required:!1},alignOffset:{type:Number,required:!1},avoidCollisions:{type:Boolean,required:!1},collisionBoundary:{type:null,required:!1},collisionPadding:{type:[Number,Object],required:!1},arrowPadding:{type:Number,required:!1},sticky:{type:String,required:!1},hideWhenDetached:{type:Boolean,required:!1},positionStrategy:{type:String,required:!1},updatePositionStrategy:{type:String,required:!1}},emits:[`escapeKeyDown`,`pointerDownOutside`],setup(n,{emit:r}){let i=n,o=r,s=X(),u=F(i,o),{forwardRef:d}=I();return(n,r)=>(t(),l(v(oe),{present:n.forceMount||v(s).open.value},{default:c(()=>[(t(),l(e(v(s).disableHoverableContent.value?Z:Ze),_({ref:v(d)},v(u)),{default:c(()=>[a(n.$slots,`default`)]),_:3},16))]),_:3},8,[`present`]))}}),$e=o({__name:`TooltipPortal`,props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(e){let n=e;return(e,r)=>(t(),l(v(se),u(T(n)),{default:c(()=>[a(e.$slots,`default`)]),_:3},16))}}),et=o({__name:`TooltipTrigger`,props:{reference:{type:null,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(e){let n=e,r=X(),o=J();r.contentId||=ue(void 0,`reka-tooltip-content`);let{forwardRef:u,currentElement:d}=I(),f=y(!1),p=y(!1),m=g(()=>r.disabled.value?{}:{click:T,focus:C,pointermove:x,pointerleave:S,pointerdown:b,blur:w});i(()=>{r.onTriggerChange(d.value)});function h(){setTimeout(()=>{f.value=!1},1)}function b(){r.open&&!r.disableClosingTrigger.value&&r.onClose(),f.value=!0,document.addEventListener(`pointerup`,h,{once:!0})}function x(e){e.pointerType!==`touch`&&!p.value&&!o.isPointerInTransitRef.value&&(r.onTriggerEnter(),p.value=!0)}function S(){r.onTriggerLeave(),p.value=!1}function C(e){f.value||r.ignoreNonKeyboardFocus.value&&!e.target.matches?.(`:focus-visible`)||r.onOpen()}function w(){r.onClose()}function T(){r.disableClosingTrigger.value||r.onClose()}return(e,i)=>(t(),l(v(me),{"as-child":``,reference:e.reference},{default:c(()=>[E(v(A),_({ref:v(u),"aria-describedby":v(r).open.value?v(r).contentId:void 0,"data-state":v(r).stateAttribute.value,as:e.as,"as-child":n.asChild,"data-grace-area-trigger":``},s(m.value)),{default:c(()=>[a(e.$slots,`default`)]),_:3},16,[`aria-describedby`,`data-state`,`as`,`as-child`])]),_:3},8,[`reference`]))}}),Q=o({__name:`CardDescription`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let n=e;return(e,r)=>(t(),D(`div`,{"data-slot":`card-description`,class:h(v(M)(`text-muted-foreground text-sm`,n.class))},[a(e.$slots,`default`)],2))}}),tt=o({__name:`Tooltip`,props:{defaultOpen:{type:Boolean},open:{type:Boolean},delayDuration:{},disableHoverableContent:{type:Boolean},disableClosingTrigger:{type:Boolean},disabled:{type:Boolean},ignoreNonKeyboardFocus:{type:Boolean}},emits:[`update:open`],setup(e,{emit:n}){let r=F(e,n);return(e,n)=>(t(),l(v(Xe),_({"data-slot":`tooltip`},v(r)),{default:c(t=>[a(e.$slots,`default`,u(T(t)))]),_:3},16))}}),nt=o({inheritAttrs:!1,__name:`TooltipContent`,props:{forceMount:{type:Boolean},ariaLabel:{},asChild:{type:Boolean},as:{},side:{},sideOffset:{default:0},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},positionStrategy:{},updatePositionStrategy:{},class:{type:[Boolean,null,String,Object,Array]}},emits:[`escapeKeyDown`,`pointerDownOutside`],setup(e,{emit:n}){let r=e,i=n,o=F(te(r,`class`),i);return(e,n)=>(t(),l(v($e),null,{default:c(()=>[E(v(Qe),_({"data-slot":`tooltip-content`},{...v(o),...e.$attrs},{class:v(M)(`data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs has-data-[slot=kbd]:pr-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-dropdown **:data-[slot=kbd]:rounded-sm bg-foreground text-background z-dropdown w-fit max-w-xs origin-(--reka-tooltip-content-transform-origin)`,r.class)}),{default:c(()=>[a(e.$slots,`default`),E(v(Ke),{class:`size-2.5 rotate-45 rounded-[2px] bg-foreground fill-foreground z-dropdown translate-y-[calc(-50%_-_2px)]`})]),_:3},16,[`class`])]),_:3}))}}),rt=o({__name:`TooltipProvider`,props:{delayDuration:{default:0},skipDelayDuration:{},disableHoverableContent:{type:Boolean},disableClosingTrigger:{type:Boolean},disabled:{type:Boolean},ignoreNonKeyboardFocus:{type:Boolean},content:{}},setup(e){let n=e;return(e,r)=>(t(),l(v(Je),u(T(n)),{default:c(()=>[a(e.$slots,`default`)]),_:3},16))}}),it=o({__name:`TooltipTrigger`,props:{reference:{},asChild:{type:Boolean},as:{}},setup(e){let n=e;return(e,r)=>(t(),l(v(et),_({"data-slot":`tooltip-trigger`},n),{default:c(()=>[a(e.$slots,`default`)]),_:3},16))}}),at={key:0,class:`py-8 text-center text-muted-foreground`},ot={key:1,class:`py-8 text-center text-muted-foreground`},st={class:`cursor-default font-mono text-xs`},ct={class:`font-mono text-xs`},lt={key:0,class:`text-muted-foreground`},ut={key:1,class:`text-muted-foreground`},dt={class:`flex items-center gap-2`},ft={class:`space-y-2`},pt={class:`text-muted-foreground whitespace-nowrap`},mt={class:`text-muted-foreground`},ht={class:`font-medium`},gt=8,_t=6e4,$=60,vt=24,yt=o({__name:`SessionTable`,props:{sessions:{},loading:{type:Boolean},historyMap:{}},emits:[`clear`,`viewHistory`],setup(e,{emit:n}){let i=n,a=y(!1),o=y(null);function s(e){o.value=e,a.value=!0}function u(){o.value&&=(i(`clear`,o.value),null)}function f(e){return e.slice(0,gt)+`...`}function h(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/_t);if(n<1)return`刚刚`;if(n<$)return`${n} 分钟前`;let r=Math.floor(n/$);return r<vt?`${r} 小时前`:`${Math.floor(r/vt)} 天前`}function g(e){return new Date(e).toLocaleString()}return(n,i)=>(t(),D(p,null,[e.loading?(t(),D(`div`,at,`加载中...`)):e.sessions.length===0?(t(),D(`div`,ot,`暂无活跃 Session`)):(t(),l(v(Me),{key:2},{default:c(()=>[E(v(Ne),null,{default:c(()=>[E(v(q),null,{default:c(()=>[E(v(K),null,{default:c(()=>[...i[1]||=[d(`密钥名称`,-1)]]),_:1}),E(v(K),null,{default:c(()=>[...i[2]||=[d(`Session ID`,-1)]]),_:1}),E(v(K),null,{default:c(()=>[...i[3]||=[d(`当前模型`,-1)]]),_:1}),E(v(K),null,{default:c(()=>[...i[4]||=[d(`原始模型`,-1)]]),_:1}),E(v(K),null,{default:c(()=>[...i[5]||=[d(`最后活跃`,-1)]]),_:1}),E(v(K),null,{default:c(()=>[...i[6]||=[d(`操作`,-1)]]),_:1})]),_:1})]),_:1}),E(v(je),null,{default:c(()=>[(t(!0),D(p,null,r(e.sessions,a=>(t(),D(p,{key:a.id},[E(v(q),null,{default:c(()=>[E(v(G),{class:`font-medium`},{default:c(()=>[d(O(a.router_key_name),1)]),_:2},1024),E(v(G),null,{default:c(()=>[E(v(rt),null,{default:c(()=>[E(v(tt),null,{default:c(()=>[E(v(it),{"as-child":``},{default:c(()=>[m(`span`,st,O(f(a.session_id)),1)]),_:2},1024),E(v(nt),null,{default:c(()=>[m(`p`,ct,O(a.session_id),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024),E(v(G),null,{default:c(()=>[E(v(B),{variant:`secondary`},{default:c(()=>[d(O(a.current_model),1)]),_:2},1024)]),_:2},1024),E(v(G),null,{default:c(()=>[a.original_model?(t(),D(`span`,lt,O(a.original_model),1)):(t(),D(`span`,ut,`-`))]),_:2},1024),E(v(G),{class:`text-muted-foreground text-sm`},{default:c(()=>[d(O(h(a.last_active_at)),1)]),_:2},1024),E(v(G),null,{default:c(()=>[m(`div`,dt,[E(v(j),{variant:`ghost`,size:`sm`,onClick:e=>n.$emit(`viewHistory`,a)},{default:c(()=>[d(O(e.historyMap[a.session_id]?`收起`:`历史`),1)]),_:2},1032,[`onClick`]),E(v(j),{variant:`ghost`,size:`sm`,class:`text-destructive hover:text-destructive`,onClick:e=>s(a)},{default:c(()=>[...i[7]||=[d(` 清除 `,-1)]]),_:1},8,[`onClick`])])]),_:2},1024)]),_:2},1024),e.historyMap[a.session_id]?(t(),l(v(q),{key:0},{default:c(()=>[E(v(G),{colspan:`6`,class:`bg-muted/50 px-6 py-3`},{default:c(()=>[m(`div`,ft,[i[9]||=m(`p`,{class:`text-sm font-medium text-foreground`},`切换历史`,-1),(t(!0),D(p,null,r(e.historyMap[a.session_id],e=>(t(),D(`div`,{key:e.id,class:`flex items-center gap-3 text-sm`},[m(`span`,pt,O(g(e.created_at)),1),E(v(B),{variant:`outline`,class:`text-xs`},{default:c(()=>[d(O(e.trigger_type),1)]),_:2},1024),m(`span`,null,[m(`span`,mt,O(e.old_model||`默认`),1),i[8]||=m(`span`,{class:`mx-1`},`→`,-1),m(`span`,ht,O(e.new_model),1)])]))),128))])]),_:2},1024)]),_:2},1024)):C(``,!0)],64))),128))]),_:1})]),_:1})),E(v(be),{open:a.value,"onUpdate:open":i[0]||=e=>a.value=e},{default:c(()=>[E(v(ye),null,{default:c(()=>[E(v(Se),null,{default:c(()=>[E(v(Ee),null,{default:c(()=>[...i[10]||=[d(`确认清除 Session`,-1)]]),_:1}),E(v(xe),null,{default:c(()=>[...i[11]||=[d(` 清除后,该 Session 将恢复使用默认模型映射。此操作不可撤销。 `,-1)]]),_:1})]),_:1}),E(v(we),null,{default:c(()=>[E(v(Ce),null,{default:c(()=>[...i[12]||=[d(`取消`,-1)]]),_:1}),E(v(Te),{onClick:u},{default:c(()=>[...i[13]||=[d(`确认清除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])],64))}}),bt={class:`p-6`},xt={class:`flex items-center justify-between mb-4`},St={key:0,class:`flex items-center gap-1`},Ct={key:1},wt={class:`flex items-center gap-3`},Tt={class:`flex items-center justify-between`},Et=`---
|
|
2
|
-
description: 切换代理路由模型
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
[router-command: select-model $ARGUMENTS]`,Dt=o({__name:`ProxyEnhancement`,setup(e){let n=y(!1),r=y(!1),a=y(!0),o=y([]),s=y(!1),l=y({});async function u(){try{n.value=(await x.getProxyEnhancement()).claude_code_enabled}catch(e){console.error(`Failed to load proxy enhancement config:`,e),z.error(`加载配置失败`)}}async function f(){r.value=!0;try{await x.updateProxyEnhancement({claude_code_enabled:n.value}),z.success(`保存成功`)}catch(e){console.error(`Failed to save proxy enhancement config:`,e),z.error(`保存失败`)}finally{r.value=!1}}async function p(){s.value=!0;try{o.value=await x.getSessionStates()}catch(e){console.error(`Failed to load sessions:`,e),z.error(`加载 Session 列表失败`)}finally{s.value=!1}}async function g(e){try{await x.deleteSessionState(e.router_key_id,e.session_id),z.success(`Session 已清除`),p()}catch(e){console.error(`Failed to clear session:`,e),z.error(`清除 Session 失败`)}}async function _(e){let t=e.session_id;if(l.value[t]){delete l.value[t];return}try{let n=await x.getSessionHistory(e.router_key_id,e.session_id);l.value[t]=n}catch(e){console.error(`Failed to load history:`,e),z.error(`加载历史记录失败`)}}return i(()=>{u(),p()}),(e,i)=>(t(),D(`div`,bt,[m(`div`,xt,[i[3]||=m(`h2`,{class:`text-lg font-semibold text-foreground`},`代理增强(实验性)`,-1),E(v(j),{disabled:r.value,onClick:f},{default:c(()=>[r.value?(t(),D(`span`,St,[...i[2]||=[m(`svg`,{class:`w-4 h-4 animate-spin`,fill:`none`,viewBox:`0 0 24 24`},[m(`circle`,{class:`opacity-25`,cx:`12`,cy:`12`,r:`10`,stroke:`currentColor`,"stroke-width":`4`}),m(`path`,{class:`opacity-75`,fill:`currentColor`,d:`M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z`})],-1),d(` 保存中... `,-1)]])):(t(),D(`span`,Ct,`保存`))]),_:1},8,[`disabled`])]),E(v(ke),{"default-value":`claude-code`},{default:c(()=>[E(v(Ae),null,{default:c(()=>[E(v(R),{value:`claude-code`},{default:c(()=>[...i[4]||=[d(`Claude Code`,-1)]]),_:1}),E(v(R),{value:`opencode`},{default:c(()=>[...i[5]||=[d(`OpenCode`,-1)]]),_:1})]),_:1}),E(v(L),{value:`claude-code`},{default:c(()=>[E(v(V),null,{default:c(()=>[E(v(U),null,{default:c(()=>[E(v(W),null,{default:c(()=>[...i[6]||=[d(`Claude Code 动态模型切换`,-1)]]),_:1}),E(v(Q),null,{default:c(()=>[...i[7]||=[d(` 在 Claude Code 对话中通过 /select-model 命令动态切换后端模型。模型选择在当前会话内有效(24h),不影响路由配置。 `,-1)]]),_:1})]),_:1}),E(v(H),null,{default:c(()=>[m(`div`,wt,[E(v(Oe),{id:`claude-code-toggle`,modelValue:n.value,"onUpdate:modelValue":i[0]||=e=>n.value=e},null,8,[`modelValue`]),E(v(De),{for:`claude-code-toggle`},{default:c(()=>[d(O(n.value?`已启用`:`已禁用`),1)]),_:1})])]),_:1})]),_:1}),E(v(_e),{open:a.value,"onUpdate:open":i[1]||=e=>a.value=e,class:`mt-4`},{default:c(()=>[E(v(ve),{"as-child":``},{default:c(()=>[E(v(j),{variant:`ghost`,class:`w-full justify-between`},{default:c(()=>[i[9]||=m(`span`,null,`使用说明`,-1),(t(),D(`svg`,{class:h([`w-4 h-4 transition-transform`,{"rotate-180":a.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...i[8]||=[m(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`},null,-1)]],2))]),_:1})]),_:1}),E(v(ge),{class:`mt-2`},{default:c(()=>[E(v(V),null,{default:c(()=>[E(v(H),{class:`space-y-4 text-sm`},{default:c(()=>[m(`div`,null,[i[10]||=m(`p`,{class:`font-medium text-foreground mb-1 leading-relaxed`},`配置方法`,-1),i[11]||=m(`p`,{class:`text-muted-foreground leading-relaxed`},` 在 Claude Code 项目级或全局级目录下创建 Command 文件: `,-1),i[12]||=m(`code`,{class:`block mt-1 px-3 py-2 bg-muted rounded text-xs font-mono whitespace-pre-wrap leading-relaxed`},[d(` # 项目级 .claude/commands/select-model.md`),m(`br`),d(` # 全局级 ~/.claude/commands/select-model.md `)],-1),i[13]||=m(`p`,{class:`text-muted-foreground leading-relaxed mt-2`},` 文件内容: `,-1),m(`code`,{class:`block mt-1 px-3 py-2 bg-muted rounded text-xs font-mono whitespace-pre-wrap leading-relaxed`,textContent:Et})]),i[14]||=m(`div`,null,[m(`p`,{class:`font-medium text-foreground mb-1 leading-relaxed`},`使用方法`),m(`p`,{class:`text-muted-foreground leading-relaxed`},` 查看可用模型列表(格式为 provider_name/backend_model): `),m(`code`,{class:`block mt-1 px-3 py-2 bg-muted rounded text-xs font-mono whitespace-pre-wrap leading-relaxed`},` /select-model `),m(`p`,{class:`text-muted-foreground leading-relaxed mt-2`},` 选择模型并记住到当前会话: `),m(`code`,{class:`block mt-1 px-3 py-2 bg-muted rounded text-xs font-mono whitespace-pre-wrap leading-relaxed`},` /select-model provider_name/backend_model `),m(`p`,{class:`text-muted-foreground leading-relaxed mt-2`},` 切换后在下方活跃 Session 表中确认状态,请求日志中可验证路由是否生效。 `)],-1)]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`]),E(v(V),{class:`mt-4`},{default:c(()=>[E(v(U),null,{default:c(()=>[m(`div`,Tt,[m(`div`,null,[E(v(W),null,{default:c(()=>[...i[15]||=[d(`活跃 Session`,-1)]]),_:1}),E(v(Q),null,{default:c(()=>[...i[16]||=[d(`查看和管理当前已配置模型的 session`,-1)]]),_:1})]),E(v(j),{variant:`outline`,size:`sm`,onClick:p,disabled:s.value},{default:c(()=>[...i[17]||=[d(`刷新`,-1)]]),_:1},8,[`disabled`])])]),_:1}),E(v(H),null,{default:c(()=>[E(yt,{sessions:o.value,loading:s.value,"history-map":l.value,onClear:g,onViewHistory:_},null,8,[`sessions`,`loading`,`history-map`])]),_:1})]),_:1})]),_:1}),E(v(L),{value:`opencode`},{default:c(()=>[...i[18]||=[m(`div`,{class:`flex flex-col items-center justify-center py-16 text-muted-foreground`},[m(`p`,{class:`text-lg`},`暂未支持 OpenCode 增强`)],-1)]]),_:1})]),_:1})]))}});export{Dt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{F as e,L as t,M as n,S as r,Y as i,_ as a,b as o,f as s,g as c,mt as l,ot as u,t as d,u as f,v as p,x as m,y as h,yt as g}from"./client-Mb8fy_bC.js";import{a as ee,i as te,n as _,r as v,t as ne}from"./SelectValue-B32pgmTJ.js";import{n as y}from"./button-D54q76GQ.js";import{t as re}from"./Checkbox-CybCw3zS.js";import{i as ie,o as b,r as ae,s as oe,t as se}from"./dialog-DSH5k5Kj.js";import{a as x,c as S,i as ce,n as le,o as ue,r as de,t as fe}from"./alert-dialog-BAR1JRmT.js";import{t as C}from"./Label-CXAeFn-r.js";import{n as w,r as T}from"./lib-BgOqOzXI.js";import{a as E,i as D,n as O,o as k,r as A,t as j}from"./TableHeader-BpscAtT3.js";import{t as M}from"./Input-HN3Il0-c.js";var N={class:`p-6`},P={class:`flex items-center justify-between mb-4`},F={class:`bg-card rounded-lg border overflow-hidden`},I={class:`flex items-center gap-2`},L={class:`text-xs text-muted-foreground`},R={key:0,class:`text-sm text-destructive mt-1`},z={key:0,class:`text-sm text-destructive mt-1`},B={key:0,class:`text-sm text-destructive mt-1`},V={class:`grid grid-cols-2 gap-3`},pe={key:0,class:`text-sm text-destructive mt-1`},me={key:0,class:`text-sm text-destructive mt-1`},he={key:0},ge={key:0,class:`text-sm text-destructive mt-1`},_e={class:`flex items-center gap-2`},H=100,U=599,W=100,G=100,K=r({__name:`RetryRules`,setup(r){let K={name:``,status_code:429,body_pattern:``,is_active:!0,retry_strategy:`exponential`,retry_delay_ms:5e3,max_retries:10,max_delay_ms:6e4},q=u([]),J=u(!1),Y=u(null),X=u(null),Z=u({...K}),Q=u({});function ve(){let e={};Z.value.name.trim()||(e.name=`请输入名称`);let t=Number(Z.value.status_code);if((!Number.isInteger(t)||t<H||t>U)&&(e.status_code=`范围 ${H}-${U}`),!Z.value.body_pattern.trim())e.body_pattern=`请输入匹配规则`;else try{new RegExp(Z.value.body_pattern)}catch{e.body_pattern=`不是合法的正则表达式`}let n=Number(Z.value.retry_delay_ms);(!n||n<W)&&(e.retry_delay_ms=`不能小于 ${W}ms`);let r=Number(Z.value.max_retries);if((!Number.isInteger(r)||r<0||r>G)&&(e.max_retries=`范围 0-${G}`),Z.value.retry_strategy===`exponential`){let t=Number(Z.value.max_delay_ms);(!t||t<W)&&(e.max_delay_ms=`不能小于 ${W}ms`)}return Q.value=e,Object.keys(e).length===0}async function $(){try{q.value=(await d.getRetryRules()).data}catch(e){console.error(`Failed to load retry rules:`,e),w.error(`加载数据失败`)}}function ye(){Y.value=null,Z.value={...K},Q.value={},J.value=!0}function be(e){Y.value=e.id,Z.value={name:e.name,status_code:e.status_code,body_pattern:e.body_pattern,is_active:!!e.is_active,retry_strategy:e.retry_strategy,retry_delay_ms:e.retry_delay_ms,max_retries:e.max_retries,max_delay_ms:e.max_delay_ms},Q.value={},J.value=!0}async function xe(){if(ve())try{let e={name:Z.value.name,status_code:Number(Z.value.status_code),body_pattern:Z.value.body_pattern,is_active:+!!Z.value.is_active,retry_strategy:Z.value.retry_strategy,retry_delay_ms:Number(Z.value.retry_delay_ms),max_retries:Number(Z.value.max_retries),max_delay_ms:Number(Z.value.max_delay_ms)};Y.value?await d.updateRetryRule(Y.value,e):await d.createRetryRule(e),J.value=!1,await $()}catch(e){console.error(`Failed to save retry rule:`,e),w.error(`保存规则失败`)}}function Se(e){X.value=e}async function Ce(){let e=X.value;if(e){X.value=null;try{await d.deleteRetryRule(e.id),await $()}catch(e){console.error(`Failed to delete retry rule:`,e),w.error(`删除规则失败`)}}}return n($),(n,r)=>(e(),h(`div`,N,[c(`div`,P,[r[18]||=c(`h2`,{class:`text-lg font-semibold text-foreground`},`重试规则`,-1),m(l(y),{onClick:ye,class:`flex items-center gap-1`},{default:i(()=>[...r[17]||=[c(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[c(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})],-1),o(` 添加规则 `,-1)]]),_:1})]),c(`div`,F,[m(l(k),null,{default:i(()=>[m(l(j),null,{default:i(()=>[m(l(A),{class:`bg-muted`},{default:i(()=>[m(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[19]||=[o(`名称`,-1)]]),_:1}),m(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[20]||=[o(`HTTP 状态码`,-1)]]),_:1}),m(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[21]||=[o(`响应体匹配`,-1)]]),_:1}),m(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[22]||=[o(`重试策略`,-1)]]),_:1}),m(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[23]||=[o(`状态`,-1)]]),_:1}),m(l(O),{class:`text-right text-muted-foreground`},{default:i(()=>[...r[24]||=[o(`操作`,-1)]]),_:1})]),_:1})]),_:1}),m(l(E),null,{default:i(()=>[(e(!0),h(s,null,t(q.value,t=>(e(),a(l(A),{key:t.id},{default:i(()=>[m(l(D),{class:`font-mono text-sm`},{default:i(()=>[o(g(t.name),1)]),_:2},1024),m(l(D),null,{default:i(()=>[o(g(t.status_code),1)]),_:2},1024),m(l(D),{class:`font-mono text-xs text-muted-foreground`},{default:i(()=>[o(g(t.body_pattern),1)]),_:2},1024),m(l(D),null,{default:i(()=>[c(`div`,I,[m(l(T),{variant:`outline`},{default:i(()=>[o(g(t.retry_strategy===`fixed`?`固定间隔`:`指数退避`),1)]),_:2},1024),c(`span`,L,[o(g(t.retry_delay_ms/1e3)+`s · `+g(t.max_retries)+`次 `,1),t.retry_strategy===`exponential`?(e(),h(s,{key:0},[o(` · 上限`+g(t.max_delay_ms/1e3)+`s`,1)],64)):p(``,!0)])])]),_:2},1024),m(l(D),null,{default:i(()=>[m(l(T),{variant:t.is_active?`default`:`secondary`},{default:i(()=>[o(g(t.is_active?`启用`:`禁用`),1)]),_:2},1032,[`variant`])]),_:2},1024),m(l(D),{class:`text-right`},{default:i(()=>[m(l(y),{variant:`ghost`,size:`sm`,onClick:e=>be(t),class:`mr-2`},{default:i(()=>[...r[25]||=[o(`编辑`,-1)]]),_:1},8,[`onClick`]),m(l(y),{variant:`ghost`,size:`sm`,class:`text-destructive hover:text-destructive`,onClick:e=>Se(t)},{default:i(()=>[...r[26]||=[o(`删除`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1024))),128)),q.value.length===0?(e(),a(l(A),{key:0},{default:i(()=>[m(l(D),{colspan:`6`,class:`text-center text-muted-foreground py-8`},{default:i(()=>[...r[27]||=[o(`暂无规则`,-1)]]),_:1})]),_:1})):p(``,!0)]),_:1})]),_:1})]),m(l(oe),{open:J.value,"onUpdate:open":r[15]||=e=>J.value=e},{default:i(()=>[m(l(b),null,{default:i(()=>[m(l(ae),null,{default:i(()=>[m(l(se),null,{default:i(()=>[o(g(Y.value?`编辑规则`:`添加规则`),1)]),_:1})]),_:1}),c(`form`,{onSubmit:f(xe,[`prevent`]),class:`space-y-3`},[c(`div`,null,[m(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[...r[28]||=[o(`名称`,-1)]]),_:1}),m(l(M),{modelValue:Z.value.name,"onUpdate:modelValue":r[0]||=e=>Z.value.name=e,type:`text`,required:``,onInput:r[1]||=e=>delete Q.value.name},null,8,[`modelValue`]),Q.value.name?(e(),h(`p`,R,g(Q.value.name),1)):p(``,!0)]),c(`div`,null,[m(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[...r[29]||=[o(`HTTP 状态码`,-1)]]),_:1}),m(l(M),{modelValue:Z.value.status_code,"onUpdate:modelValue":r[2]||=e=>Z.value.status_code=e,modelModifiers:{number:!0},type:`number`,required:``,onInput:r[3]||=e=>delete Q.value.status_code},null,8,[`modelValue`]),Q.value.status_code?(e(),h(`p`,z,g(Q.value.status_code),1)):p(``,!0)]),c(`div`,null,[m(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[...r[30]||=[o(`响应体匹配`,-1)]]),_:1}),m(l(M),{modelValue:Z.value.body_pattern,"onUpdate:modelValue":r[4]||=e=>Z.value.body_pattern=e,type:`text`,placeholder:`正则表达式,例如 .*rate_limit.*`,required:``,onInput:r[5]||=e=>delete Q.value.body_pattern},null,8,[`modelValue`]),Q.value.body_pattern?(e(),h(`p`,B,g(Q.value.body_pattern),1)):p(``,!0)]),c(`div`,null,[m(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[...r[31]||=[o(`重试策略`,-1)]]),_:1}),m(l(ee),{modelValue:Z.value.retry_strategy,"onUpdate:modelValue":r[6]||=e=>Z.value.retry_strategy=e},{default:i(()=>[m(l(_),{class:`w-full`},{default:i(()=>[m(l(ne),{placeholder:`选择策略`})]),_:1}),m(l(te),null,{default:i(()=>[m(l(v),{value:`exponential`},{default:i(()=>[...r[32]||=[o(`指数退避`,-1)]]),_:1}),m(l(v),{value:`fixed`},{default:i(()=>[...r[33]||=[o(`固定间隔`,-1)]]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),c(`div`,V,[c(`div`,null,[m(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[o(g(Z.value.retry_strategy===`fixed`?`间隔时间 (ms)`:`初始延迟 (ms)`),1)]),_:1}),m(l(M),{modelValue:Z.value.retry_delay_ms,"onUpdate:modelValue":r[7]||=e=>Z.value.retry_delay_ms=e,modelModifiers:{number:!0},type:`number`,min:100,required:``,onInput:r[8]||=e=>delete Q.value.retry_delay_ms},null,8,[`modelValue`]),Q.value.retry_delay_ms?(e(),h(`p`,pe,g(Q.value.retry_delay_ms),1)):p(``,!0)]),c(`div`,null,[m(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[...r[34]||=[o(`最大重试次数`,-1)]]),_:1}),m(l(M),{modelValue:Z.value.max_retries,"onUpdate:modelValue":r[9]||=e=>Z.value.max_retries=e,modelModifiers:{number:!0},type:`number`,min:0,max:100,required:``,onInput:r[10]||=e=>delete Q.value.max_retries},null,8,[`modelValue`]),Q.value.max_retries?(e(),h(`p`,me,g(Q.value.max_retries),1)):p(``,!0)])]),Z.value.retry_strategy===`exponential`?(e(),h(`div`,he,[m(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[...r[35]||=[o(`延迟上限 (ms)`,-1)]]),_:1}),m(l(M),{modelValue:Z.value.max_delay_ms,"onUpdate:modelValue":r[11]||=e=>Z.value.max_delay_ms=e,modelModifiers:{number:!0},type:`number`,min:100,required:``,onInput:r[12]||=e=>delete Q.value.max_delay_ms},null,8,[`modelValue`]),Q.value.max_delay_ms?(e(),h(`p`,ge,g(Q.value.max_delay_ms),1)):p(``,!0)])):p(``,!0),c(`div`,_e,[m(l(re),{modelValue:Z.value.is_active,"onUpdate:modelValue":r[13]||=e=>Z.value.is_active=e,id:`rule-active`},null,8,[`modelValue`]),m(l(C),{for:`rule-active`,class:`text-sm text-foreground`},{default:i(()=>[...r[36]||=[o(`启用`,-1)]]),_:1})]),m(l(ie),null,{default:i(()=>[m(l(y),{type:`button`,variant:`outline`,onClick:r[14]||=e=>J.value=!1},{default:i(()=>[...r[37]||=[o(`取消`,-1)]]),_:1}),m(l(y),{type:`submit`},{default:i(()=>[...r[38]||=[o(`保存`,-1)]]),_:1})]),_:1})],32)]),_:1})]),_:1},8,[`open`]),m(l(S),{open:!!X.value,"onUpdate:open":r[16]||=e=>{e||(X.value=null)}},{default:i(()=>[m(l(x),null,{default:i(()=>[m(l(le),null,{default:i(()=>[m(l(fe),null,{default:i(()=>[...r[39]||=[o(`确认删除`,-1)]]),_:1}),m(l(ce),null,{default:i(()=>[o(`确定要删除规则「`+g(X.value?.name)+`」吗?`,1)]),_:1})]),_:1}),m(l(de),null,{default:i(()=>[m(l(ue),null,{default:i(()=>[...r[40]||=[o(`取消`,-1)]]),_:1}),m(l(y),{variant:`destructive`,onClick:Ce},{default:i(()=>[...r[41]||=[o(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])]))}});export{K as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{F as e,L as t,M as n,S as r,Y as i,_ as a,b as o,f as s,g as c,gt as ee,mt as l,ot as u,t as d,u as te,v as f,x as p,y as m,yt as h}from"./client-Mb8fy_bC.js";import{n as g}from"./button-D54q76GQ.js";import{t as _}from"./Checkbox-CybCw3zS.js";import{i as v,o as ne,r as re,s as ie,t as ae}from"./dialog-DSH5k5Kj.js";import{a as oe,c as se,i as y,n as b,o as ce,r as x,t as S}from"./alert-dialog-BAR1JRmT.js";import{t as C}from"./Label-CXAeFn-r.js";import{n as w,r as T}from"./lib-BgOqOzXI.js";import{a as E,i as D,n as O,o as k,r as A,t as j}from"./TableHeader-BpscAtT3.js";import{t as M}from"./Input-HN3Il0-c.js";import{t as N}from"./useClipboard-DO-38TXr.js";var P={class:`p-6`},F={class:`flex items-center justify-between mb-4`},I={class:`bg-card rounded-lg border overflow-hidden`},L={class:`flex items-center gap-1`},R={class:`font-mono text-xs text-muted-foreground`},z={key:0,class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},B={key:1,class:`w-3.5 h-3.5 text-success`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},V={key:0,class:`flex flex-wrap gap-1`},H={key:0,class:`text-sm text-destructive mt-1`},U={class:`border rounded-md p-3 max-h-48 overflow-y-auto space-y-2 bg-muted`},W={class:`font-mono text-xs`},le={key:0,class:`text-muted-foreground text-sm text-center py-2`},ue={key:0,class:`flex flex-wrap gap-1 mt-2`},de={key:0,class:`flex items-center gap-2`},G=r({__name:`RouterKeys`,setup(r){let G={name:``,allowed_models:[],is_active:!0},K=u([]),q=u([]),J=u(!1),Y=u(null),X=u(null),Z=u({...G,allowed_models:[]}),Q=u({}),{copied:fe,copy:pe}=N();function me(e){return e?e.slice(0,7)+`*`.repeat(7):``}function he(e){return new Date(e).toLocaleString(`zh-CN`)}function ge(e){let t=Z.value.allowed_models.indexOf(e);t>=0&&Z.value.allowed_models.splice(t,1)}async function $(){try{let[e,t]=await Promise.allSettled([d.getRouterKeys(),d.getAvailableModels()]);e.status===`fulfilled`&&(K.value=e.value.data),t.status===`fulfilled`&&(q.value=t.value.data)}catch(e){console.error(`Failed to load data:`,e),w.error(`加载数据失败`)}}function _e(){Y.value=null,Z.value={...G,allowed_models:[]},Q.value={},J.value=!0}function ve(e){Y.value=e.id,Z.value={name:e.name,allowed_models:e.allowed_models?[...e.allowed_models]:[],is_active:!!e.is_active},Q.value={},J.value=!0}function ye(){return{name:Z.value.name,allowed_models:Z.value.allowed_models.length>0?Z.value.allowed_models:null,is_active:+!!Z.value.is_active}}function be(){return{name:Z.value.name,allowed_models:Z.value.allowed_models.length>0?Z.value.allowed_models:null}}async function xe(){let e={};if(Z.value.name.trim()||(e.name=`请输入名称`),Q.value=e,!(Object.keys(e).length>0))try{Y.value?await d.updateRouterKey(Y.value,ye()):await d.createRouterKey(be()),J.value=!1,await $()}catch(e){console.error(`Failed to save router key:`,e),w.error(`保存密钥失败`)}}function Se(e){X.value=e}async function Ce(){let e=X.value;if(e){X.value=null;try{await d.deleteRouterKey(e.id),await $()}catch(e){console.error(`Failed to delete router key:`,e),w.error(`删除密钥失败`)}}}return n($),(n,r)=>(e(),m(`div`,P,[c(`div`,F,[r[7]||=c(`h2`,{class:`text-lg font-semibold text-foreground`},`API 密钥`,-1),p(l(g),{onClick:_e,class:`flex items-center gap-1`},{default:i(()=>[...r[6]||=[c(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[c(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})],-1),o(` 创建密钥 `,-1)]]),_:1})]),c(`div`,I,[p(l(k),null,{default:i(()=>[p(l(j),null,{default:i(()=>[p(l(A),{class:`bg-muted`},{default:i(()=>[p(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[8]||=[o(`名称`,-1)]]),_:1}),p(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[9]||=[o(`密钥`,-1)]]),_:1}),p(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[10]||=[o(`白名单模型`,-1)]]),_:1}),p(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[11]||=[o(`状态`,-1)]]),_:1}),p(l(O),{class:`text-muted-foreground`},{default:i(()=>[...r[12]||=[o(`创建时间`,-1)]]),_:1}),p(l(O),{class:`text-right text-muted-foreground`},{default:i(()=>[...r[13]||=[o(`操作`,-1)]]),_:1})]),_:1})]),_:1}),p(l(E),null,{default:i(()=>[(e(!0),m(s,null,t(K.value,n=>(e(),a(l(A),{key:n.id,class:ee({"opacity-60":!n.is_active})},{default:i(()=>[p(l(D),{class:`font-medium`},{default:i(()=>[o(h(n.name),1)]),_:2},1024),p(l(D),null,{default:i(()=>[c(`div`,L,[c(`span`,R,h(me(n.key)),1),p(l(g),{variant:`ghost`,size:`sm`,class:`h-6 w-6 p-0`,onClick:e=>l(pe)(n.key)},{default:i(()=>[l(fe)?(e(),m(`svg`,B,[...r[15]||=[c(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`},null,-1)]])):(e(),m(`svg`,z,[...r[14]||=[c(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`},null,-1)]]))]),_:1},8,[`onClick`])])]),_:2},1024),p(l(D),null,{default:i(()=>[n.allowed_models&&n.allowed_models.length>0?(e(),m(`div`,V,[(e(!0),m(s,null,t(n.allowed_models,t=>(e(),a(l(T),{key:t,variant:`outline`,class:`text-xs`},{default:i(()=>[o(h(t),1)]),_:2},1024))),128))])):(e(),a(l(T),{key:1,variant:`secondary`},{default:i(()=>[...r[16]||=[o(`全部模型`,-1)]]),_:1}))]),_:2},1024),p(l(D),null,{default:i(()=>[p(l(T),{variant:n.is_active?`default`:`secondary`},{default:i(()=>[o(h(n.is_active?`启用`:`禁用`),1)]),_:2},1032,[`variant`])]),_:2},1024),p(l(D),{class:`text-muted-foreground text-sm`},{default:i(()=>[o(h(he(n.created_at)),1)]),_:2},1024),p(l(D),{class:`text-right`},{default:i(()=>[p(l(g),{variant:`ghost`,size:`sm`,onClick:e=>ve(n),class:`text-muted-foreground hover:text-primary mr-2`},{default:i(()=>[...r[17]||=[o(`编辑`,-1)]]),_:1},8,[`onClick`]),p(l(g),{variant:`ghost`,size:`sm`,onClick:e=>Se(n),class:`text-muted-foreground hover:text-destructive`},{default:i(()=>[...r[18]||=[o(`删除`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:2},1032,[`class`]))),128)),K.value.length===0?(e(),a(l(A),{key:0},{default:i(()=>[p(l(D),{colspan:`6`,class:`text-center text-muted-foreground py-8`},{default:i(()=>[...r[19]||=[o(`暂无密钥`,-1)]]),_:1})]),_:1})):f(``,!0)]),_:1})]),_:1})]),p(l(ie),{open:J.value,"onUpdate:open":r[4]||=e=>J.value=e},{default:i(()=>[p(l(ne),{class:`sm:max-w-lg`},{default:i(()=>[p(l(re),null,{default:i(()=>[p(l(ae),null,{default:i(()=>[o(h(Y.value?`编辑密钥`:`创建密钥`),1)]),_:1})]),_:1}),c(`form`,{onSubmit:te(xe,[`prevent`]),class:`space-y-4`},[c(`div`,null,[p(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[...r[20]||=[o(`名称`,-1)]]),_:1}),p(l(M),{modelValue:Z.value.name,"onUpdate:modelValue":r[0]||=e=>Z.value.name=e,type:`text`,required:``,placeholder:`例如:生产环境`,onInput:r[1]||=e=>delete Q.value.name},null,8,[`modelValue`]),Q.value.name?(e(),m(`p`,H,h(Q.value.name),1)):f(``,!0)]),c(`div`,null,[p(l(C),{class:`block text-sm font-medium text-foreground mb-1`},{default:i(()=>[...r[21]||=[o(`白名单模型`,-1)]]),_:1}),r[23]||=c(`div`,{class:`text-xs text-muted-foreground mb-2`},`不选择 = 允许所有模型`,-1),c(`div`,U,[(e(!0),m(s,null,t(q.value,t=>(e(),a(l(C),{key:t,class:`flex items-center gap-2 cursor-pointer text-sm font-normal`},{default:i(()=>[p(l(_),{"model-value":Z.value.allowed_models.includes(t),"onUpdate:modelValue":e=>{if(e&&e!==`indeterminate`&&!Z.value.allowed_models.includes(t))Z.value.allowed_models.push(t);else if(!e){let e=Z.value.allowed_models.indexOf(t);e>=0&&Z.value.allowed_models.splice(e,1)}}},null,8,[`model-value`,`onUpdate:modelValue`]),c(`span`,W,h(t),1)]),_:2},1024))),128)),q.value.length===0?(e(),m(`div`,le,` 暂无可用模型,请先配置模型映射 `)):f(``,!0)]),Z.value.allowed_models.length>0?(e(),m(`div`,ue,[(e(!0),m(s,null,t(Z.value.allowed_models,t=>(e(),a(l(T),{key:t,variant:`outline`,class:`text-xs`},{default:i(()=>[o(h(t)+` `,1),p(l(g),{type:`button`,variant:`ghost`,size:`sm`,class:`ml-1 h-4 w-4 p-0 text-muted-foreground hover:text-destructive`,onClick:e=>ge(t)},{default:i(()=>[...r[22]||=[o(`×`,-1)]]),_:1},8,[`onClick`])]),_:2},1024))),128))])):f(``,!0)]),Y.value?(e(),m(`div`,de,[p(l(_),{modelValue:Z.value.is_active,"onUpdate:modelValue":r[2]||=e=>Z.value.is_active=e,id:`key-active`},null,8,[`modelValue`]),p(l(C),{for:`key-active`,class:`text-sm text-foreground`},{default:i(()=>[...r[24]||=[o(`启用`,-1)]]),_:1})])):f(``,!0),p(l(v),null,{default:i(()=>[p(l(g),{type:`button`,variant:`outline`,onClick:r[3]||=e=>J.value=!1},{default:i(()=>[...r[25]||=[o(`取消`,-1)]]),_:1}),p(l(g),{type:`submit`},{default:i(()=>[...r[26]||=[o(`保存`,-1)]]),_:1})]),_:1})],32)]),_:1})]),_:1},8,[`open`]),p(l(se),{open:!!X.value,"onUpdate:open":r[5]||=e=>{e||(X.value=null)}},{default:i(()=>[p(l(oe),null,{default:i(()=>[p(l(b),null,{default:i(()=>[p(l(S),null,{default:i(()=>[...r[27]||=[o(`确认删除`,-1)]]),_:1}),p(l(y),null,{default:i(()=>[o(`确定要删除密钥「`+h(X.value?.name)+`」吗?使用此密钥的所有请求将被拒绝,此操作不可撤销。`,1)]),_:1})]),_:1}),p(l(x),null,{default:i(()=>[p(l(ce),null,{default:i(()=>[...r[28]||=[o(`取消`,-1)]]),_:1}),p(l(g),{variant:`destructive`,onClick:Ce},{default:i(()=>[...r[29]||=[o(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])]))}});export{G as default};
|