@chenpu17/cc-gw 0.2.3 → 0.2.5
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 +23 -13
- package/package.json +1 -1
- package/src/web/dist/assets/{About-ChfDc2NI.js → About-B7UuxVKg.js} +1 -1
- package/src/web/dist/assets/{Dashboard-CDJyyn7X.js → Dashboard-Bvkc9Nqm.js} +1 -1
- package/src/web/dist/assets/{Logs-D05vFMv1.js → Logs-D1s40rEu.js} +1 -1
- package/src/web/dist/assets/ModelManagement-j5J5TDOy.js +1 -0
- package/src/web/dist/assets/{Settings-DAYDEvz0.js → Settings-CgAFUZes.js} +1 -1
- package/src/web/dist/assets/{index-B82tYC06.js → index-B_Unl5wz.js} +2 -2
- package/src/web/dist/assets/{useApiQuery-BKzEW-RR.js → useApiQuery-DZqtpbk3.js} +1 -1
- package/src/web/dist/index.html +1 -1
- package/src/web/dist/assets/ModelManagement-B3YFArK5.js +0 -1
package/README.md
CHANGED
|
@@ -41,6 +41,27 @@ pnpm --filter @cc-gw/web build
|
|
|
41
41
|
pnpm --filter @cc-gw/cli exec tsx index.ts start --daemon --port 4100
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
> ✅ 首次启动后推荐直接使用 Web 管理台完成 Provider、模型、日志等设置;仅在自动化或高级场景下再手动编辑配置文件。
|
|
45
|
+
|
|
46
|
+
## Web 管理台
|
|
47
|
+
|
|
48
|
+
强烈建议以 Web 管理台作为主要的配置入口,可视化界面涵盖仪表盘、请求日志、模型管理与系统设置,所见即所得,避免手工改动 JSON 引入错误。
|
|
49
|
+
|
|
50
|
+
访问 `http://<host>:<port>/ui`,主要页面:
|
|
51
|
+
|
|
52
|
+
- **Dashboard**:展示请求量、Token 使用、缓存命中、各模型 TTFT(Time To First Token)/TPOT(Total Processing Time)、SQLite 数据库占用。
|
|
53
|
+
- **请求日志**:多条件筛选(时间、Provider、模型、状态),查看压缩日志详情,支持分页导出与清理。
|
|
54
|
+
- **模型管理**:维护 Provider 列表、预置模型、路由策略;一键测试连通性(发送诊断 PROMPT)。
|
|
55
|
+
- **系统设置**:端口、日志保留策略、是否存储请求 payload、日志级别与访问日志开关、日志清理工具。
|
|
56
|
+
|
|
57
|
+
UI 支持中英文、深色/浅色主题以及移动端响应式布局,提供键盘可达性(Skip Link、焦点管理)。
|
|
58
|
+
|
|
59
|
+
#### 界面预览
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+

|
|
64
|
+
|
|
44
65
|
### 连接 Claude Code
|
|
45
66
|
1. 启动 cc-gw 并确认配置中 `host` 为 `127.0.0.1`,`port` 与 CLI 启动一致。
|
|
46
67
|
2. 在安装了 Claude Code 的终端设置环境变量:
|
|
@@ -52,7 +73,7 @@ pnpm --filter @cc-gw/cli exec tsx index.ts start --daemon --port 4100
|
|
|
52
73
|
|
|
53
74
|
## 配置说明
|
|
54
75
|
|
|
55
|
-
|
|
76
|
+
大多数场景请通过 Web 管理台调整设置,以下仅作为 `~/.cc-gw/config.json` 结构参考,便于脚本化或排查:
|
|
56
77
|
|
|
57
78
|
```json
|
|
58
79
|
{
|
|
@@ -87,7 +108,7 @@ pnpm --filter @cc-gw/cli exec tsx index.ts start --daemon --port 4100
|
|
|
87
108
|
"longContextThreshold": 60000
|
|
88
109
|
},
|
|
89
110
|
"modelRoutes": {
|
|
90
|
-
"claude-sonnet-4-
|
|
111
|
+
"claude-sonnet-4-5-20250929": "kimi:kimi-k2-0905-preview",
|
|
91
112
|
"claude-opus-4-1-20250805": "anthropic:claude-3-5-sonnet-latest"
|
|
92
113
|
},
|
|
93
114
|
"logRetentionDays": 30,
|
|
@@ -121,17 +142,6 @@ pnpm --filter @cc-gw/cli exec tsx index.ts start --daemon --port 4100
|
|
|
121
142
|
| `CC_GW_UI_ROOT` | 指定 Web UI 静态目录(默认自动检测 `@cc-gw/web` build 结果) |
|
|
122
143
|
| `CC_GW_DEBUG_ENDPOINTS` | 设为 `1` 可在日志中输出下游请求 URL |
|
|
123
144
|
|
|
124
|
-
## Web 管理台
|
|
125
|
-
|
|
126
|
-
访问 `http://<host>:<port>/ui`,主要页面:
|
|
127
|
-
|
|
128
|
-
- **Dashboard**:展示请求量、Token 使用、缓存命中、各模型 TTFT(Time To First Token)/TPOT(Total Processing Time)、SQLite 数据库占用。
|
|
129
|
-
- **请求日志**:多条件筛选(时间、Provider、模型、状态),查看压缩日志详情,支持分页导出与清理。
|
|
130
|
-
- **模型管理**:维护 Provider 列表、预置模型、路由策略;一键测试连通性(发送诊断 PROMPT)。
|
|
131
|
-
- **系统设置**:端口、日志保留策略、是否存储请求 payload、日志级别与访问日志开关、日志清理工具。
|
|
132
|
-
|
|
133
|
-
UI 支持中英文、深色/浅色主题以及移动端响应式布局,提供键盘可达性(Skip Link、焦点管理)。
|
|
134
|
-
|
|
135
145
|
## CLI 守护
|
|
136
146
|
|
|
137
147
|
```bash
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as x,a as p,r as o,j as e}from"./index-
|
|
1
|
+
import{u as x,a as p,r as o,j as e}from"./index-B_Unl5wz.js";import{u as m}from"./useApiQuery-DZqtpbk3.js";const h="0.2.5",v={version:h},g={};function N(){const{t:s}=x(),{pushToast:l}=p(),t=m(["status","gateway"],{url:"/api/status",method:"GET"},{staleTime:6e4});o.useEffect(()=>{t.isError&&t.error&&l({title:s("about.toast.statusError.title"),description:t.error.message,variant:"error"})},[t.isError,t.error,l,s]);const d=v.version,r=o.useMemo(()=>{const a=g,u=a.VITE_BUILD_TIME??"-",b=a.VITE_NODE_VERSION??"-";return{buildTime:u,nodeVersion:b}},[]),i=()=>{l({title:s("about.toast.updatesPlanned"),variant:"info"})},n=[{label:s("about.app.labels.name"),value:"cc-local-gw"},{label:s("about.app.labels.version"),value:d},{label:s("about.app.labels.buildTime"),value:r.buildTime},{label:s("about.app.labels.node"),value:r.nodeVersion}],c=t.data?[{label:s("about.status.labels.host"),value:t.data.host??"127.0.0.1"},{label:s("about.status.labels.port"),value:t.data.port},{label:s("about.status.labels.providers"),value:t.data.providers},{label:s("about.status.labels.active"),value:t.data.activeRequests??0}]:[];return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsxs("header",{className:"flex flex-col gap-2",children:[e.jsx("h1",{className:"text-2xl font-semibold",children:s("about.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:s("about.description")})]}),e.jsxs("section",{className:"grid gap-4 rounded-lg border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900 md:grid-cols-2",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:s("about.app.title")}),e.jsx("dl",{className:"grid grid-cols-[160px_1fr] gap-2 text-sm text-slate-600 dark:text-slate-300",children:n.map(a=>e.jsxs("div",{className:"contents",children:[e.jsx("dt",{className:"font-medium",children:a.label}),e.jsx("dd",{children:a.value})]},a.label))})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:s("about.status.title")}),t.isLoading?e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:s("about.status.loading")}):t.data?e.jsx("dl",{className:"grid grid-cols-[160px_1fr] gap-2 text-sm text-slate-600 dark:text-slate-300",children:c.map(a=>e.jsxs("div",{className:"contents",children:[e.jsx("dt",{className:"font-medium",children:a.label}),e.jsx("dd",{children:a.value})]},a.label))}):e.jsx("p",{className:"text-sm text-red-500",children:s("about.status.empty")})]})]}),e.jsxs("section",{className:"rounded-lg border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:s("about.support.title")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("about.support.subtitle")})]}),e.jsx("button",{type:"button",onClick:i,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("about.support.actions.checkUpdates")})]}),e.jsx("p",{className:"mt-4 text-sm leading-6 text-slate-600 dark:text-slate-300",children:s("about.support.description")})]})]})}export{N as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as Y2,R as $2,r as _r,u as Sh,a as X2,j as X,L as Z2}from"./index-
|
|
1
|
+
import{g as Y2,R as $2,r as _r,u as Sh,a as X2,j as X,L as Z2}from"./index-B_Unl5wz.js";import{u as Di}from"./useApiQuery-DZqtpbk3.js";/*! *****************************************************************************
|
|
2
2
|
Copyright (c) Microsoft Corporation.
|
|
3
3
|
|
|
4
4
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as E,a as Q,r as d,j as e,L as U}from"./index-B82tYC06.js";import{u as $}from"./useApiQuery-BKzEW-RR.js";const I=[20,50,100];function A(t,r=!1){if(!t)return;const o=r?`${t}T23:59:59.999`:`${t}T00:00:00.000`,n=Date.parse(o);return Number.isFinite(n)?n:void 0}function B(t){const r=new Date(t);return`${r.getFullYear()}-${`${r.getMonth()+1}`.padStart(2,"0")}-${`${r.getDate()}`.padStart(2,"0")} ${`${r.getHours()}`.padStart(2,"0")}:${`${r.getMinutes()}`.padStart(2,"0")}:${`${r.getSeconds()}`.padStart(2,"0")}`}function j(t){return t==null?"-":t.toLocaleString()}function g(t,r){const o=j(t);return o==="-"?"-":`${o} ${r}`}function D(t){return t?"true":"false"}function G(t,r){if(!t||t.trim().length===0)return r;try{const o=JSON.parse(t);return JSON.stringify(o,null,2)}catch{return t}}function te(){var R,q;const{t}=E(),{pushToast:r}=Q(),[o,n]=d.useState("all"),[s,x]=d.useState(""),[h,k]=d.useState("all"),[c,v]=d.useState(""),[l,S]=d.useState(""),[u,b]=d.useState(1),[i,N]=d.useState(I[0]),[T,w]=d.useState(null),[z,M]=d.useState(!1);d.useEffect(()=>{b(1)},[o,s,h,c,l,i]);const L=d.useMemo(()=>{const a={limit:i,offset:(u-1)*i};o!=="all"&&(a.provider=o),s.trim().length>0&&(a.model=s.trim()),h!=="all"&&(a.status=h);const f=A(c),O=A(l,!0);return f!==void 0&&(a.from=f),O!==void 0&&(a.to=O),a},[o,s,h,c,l,u,i]),m=$(["logs",L],{url:"/api/logs",method:"GET",params:L}),y=$(["providers","all"],{url:"/api/providers",method:"GET"});d.useEffect(()=>{m.isError&&m.error&&r({title:t("logs.toast.listError.title"),description:t("logs.toast.listError.desc",{message:m.error.message}),variant:"error"})},[m.isError,m.error,r,t]),d.useEffect(()=>{y.isError&&y.error&&r({title:t("logs.toast.providerError.title"),description:t("logs.toast.providerError.desc",{message:y.error.message}),variant:"error"})},[y.isError,y.error,r,t]);const _=((R=m.data)==null?void 0:R.total)??0,p=_>0?Math.ceil(_/i):0,P=((q=m.data)==null?void 0:q.items)??[];d.useEffect(()=>{p>0&&u>p&&b(p)},[p,u]);const C=y.data??[],F=d.useMemo(()=>{const a=new Map;for(const f of C)f.id&&a.set(f.id,f.label??f.id);return a},[C]),H=d.useMemo(()=>[{value:"all",label:t("logs.filters.statusAll")},{value:"success",label:t("logs.filters.statusSuccess")},{value:"error",label:t("logs.filters.statusError")}],[t]),Y=()=>{n("all"),x(""),k("all"),v(""),S("")},Z=d.useCallback(a=>{w(a),M(!0)},[]),K=d.useCallback(()=>{M(!1),w(null)},[]);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold",children:t("logs.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:t("logs.description")})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400","aria-live":"polite",children:[e.jsx("span",{children:t("logs.summary.total",{value:_.toLocaleString()})}),e.jsx("button",{type:"button",className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",onClick:()=>m.refetch(),disabled:m.isFetching,children:m.isFetching?t("common.actions.refreshing"):t("logs.actions.manualRefresh")})]})]}),e.jsxs("div",{className:"flex flex-wrap items-end gap-3 rounded-lg border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.provider")}),e.jsxs("select",{value:o,onChange:a=>n(a.target.value),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40",children:[e.jsx("option",{value:"all",children:t("logs.filters.statusAll")}),C.map(a=>e.jsx("option",{value:a.id,children:a.label??a.id},a.id))]})]}),e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.modelId")}),e.jsx("input",{value:s,onChange:a=>x(a.target.value),placeholder:t("logs.filters.modelPlaceholder"),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40"})]}),e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.status")}),e.jsx("select",{value:h,onChange:a=>k(a.target.value),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40",children:H.map(a=>e.jsx("option",{value:a.value,children:a.label},a.value))})]}),e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.startDate")}),e.jsx("input",{type:"date",value:c,onChange:a=>v(a.target.value),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40"})]}),e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.endDate")}),e.jsx("input",{type:"date",value:l,onChange:a=>S(a.target.value),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40"})]}),e.jsx("div",{className:"ml-auto flex items-center gap-2 text-sm",children:e.jsx("button",{type:"button",onClick:Y,className:"rounded-md border border-slate-200 px-3 py-2 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:t("common.actions.reset")})})]})]}),e.jsxs("section",{className:"rounded-lg border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"min-w-full divide-y divide-slate-200 text-sm dark:divide-slate-800",children:[e.jsx("caption",{className:"sr-only",children:t("logs.title")}),e.jsx("thead",{className:"bg-slate-100 dark:bg-slate-800/50",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.time")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.provider")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.requestedModel")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.routedModel")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.inputTokens")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.cachedTokens")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.outputTokens")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.stream")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.latency")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.ttft")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.tpot")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.status")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.error")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.actions")})]})}),e.jsx("tbody",{className:"divide-y divide-slate-200 dark:divide-slate-800",children:m.isPending?e.jsx("tr",{children:e.jsx("td",{colSpan:14,className:"px-4 py-10 text-center text-sm text-slate-400",children:t("logs.table.loading")})}):P.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:14,className:"px-4 py-10 text-center text-sm text-slate-400",children:t("logs.table.empty")})}):P.map(a=>e.jsx(V,{record:a,providerLabelMap:F,onSelect:Z},a.id))})]})}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 border-t border-slate-200 px-4 py-3 text-sm dark:border-slate-800",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{children:t("logs.table.pagination.perPage")}),e.jsx("select",{value:i,onChange:a=>N(Number(a.target.value)),className:"rounded-md border border-slate-200 bg-white px-2 py-1 text-sm dark:border-slate-700 dark:bg-slate-800",children:I.map(a=>e.jsx("option",{value:a,children:a},a))}),e.jsx("span",{children:t("logs.table.pagination.unit")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{type:"button",onClick:()=>b(a=>Math.max(a-1,1)),disabled:u<=1,className:"rounded-md border border-slate-200 px-3 py-1 transition enabled:hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700 dark:enabled:hover:bg-slate-800",children:t("logs.table.pagination.previous")}),e.jsx("span",{children:t("logs.table.pagination.pageLabel",{page:p===0?0:u,total:p})}),e.jsx("button",{type:"button",onClick:()=>b(a=>p===0?a:Math.min(a+1,p)),disabled:p===0||u>=p,className:"rounded-md border border-slate-200 px-3 py-1 transition enabled:hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700 dark:enabled:hover:bg-slate-800",children:t("logs.table.pagination.next")})]})]})]}),e.jsx(W,{open:z,logId:T,onClose:K,providerLabelMap:F})]})}function V({record:t,providerLabelMap:r,onSelect:o}){const{t:n}=E(),s=r.get(t.provider)??t.provider,x=!!t.error,h=t.client_model??n("logs.table.requestedModelFallback");return e.jsxs("tr",{className:"hover:bg-slate-50 dark:hover:bg-slate-800/60",children:[e.jsx("td",{className:"px-4 py-2 text-xs text-slate-500 dark:text-slate-400",children:B(t.timestamp)}),e.jsx("td",{className:"px-4 py-2",children:s}),e.jsx("td",{className:"px-4 py-2",children:h}),e.jsx("td",{className:"px-4 py-2",children:t.model}),e.jsx("td",{className:"px-4 py-2 text-right",children:j(t.input_tokens)}),e.jsx("td",{className:"px-4 py-2 text-right",children:j(t.cached_tokens)}),e.jsx("td",{className:"px-4 py-2 text-right",children:j(t.output_tokens)}),e.jsx("td",{className:"px-4 py-2 text-right",children:D(t.stream)}),e.jsx("td",{className:"px-4 py-2 text-right",children:g(t.latency_ms,n("common.units.ms"))}),e.jsx("td",{className:"px-4 py-2 text-right",children:g(t.ttft_ms,n("common.units.ms"))}),e.jsx("td",{className:"px-4 py-2 text-right",children:g(t.tpot_ms,n("common.units.msPerToken"))}),e.jsx("td",{className:"px-4 py-2",children:e.jsx(J,{success:!x,statusCode:t.status_code})}),e.jsx("td",{className:"max-w-xs px-4 py-2 text-xs text-slate-500 dark:text-slate-400",children:e.jsx("span",{className:"block truncate",title:t.error??"",children:t.error?t.error:"-"})}),e.jsx("td",{className:"px-4 py-2",children:e.jsx("button",{type:"button",onClick:()=>o(t.id),"aria-haspopup":"dialog",className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:n("logs.actions.detail")})})]})}function J({success:t,statusCode:r}){const{t:o}=E(),n="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium",s=t?"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-200":"bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-200";return e.jsxs("span",{className:`${n} ${s}`,children:[o(t?"common.status.success":"common.status.error"),r?` · ${r}`:""]})}function W({open:t,logId:r,onClose:o,providerLabelMap:n}){var u,b;const{t:s}=E(),{pushToast:x}=Q(),h=d.useRef(null),k=d.useRef(null),c=$(["log-detail",r],{url:`/api/logs/${r}`,method:"GET"},{enabled:t&&r!==null,staleTime:3e4});d.useEffect(()=>{c.isError&&c.error&&x({title:s("logs.detail.loadError"),description:c.error.message,variant:"error"})},[c.isError,c.error,x,s]),d.useEffect(()=>{if(!t)return;const i=N=>{N.key==="Escape"&&o()};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[t,o]),d.useEffect(()=>{t&&k.current&&k.current.focus()},[t,r]);const v=d.useCallback(async(i,N,T)=>{if(!N){x({title:s("logs.detail.copy.empty",{label:i}),variant:"info"});return}try{await navigator.clipboard.writeText(N),x({title:s(T),variant:"success"})}catch(w){x({title:s("logs.detail.copy.failure"),description:w instanceof Error?w.message:s("logs.detail.copy.failureFallback"),variant:"error"})}},[x,s]);if(!t)return null;const l=c.data,S=l?n.get(l.provider)??l.provider:"";return e.jsxs("div",{className:"fixed inset-0 z-50 flex",children:[e.jsx("div",{className:"flex-1 bg-slate-900/60",onClick:o,"aria-hidden":"true"}),e.jsxs("aside",{ref:h,role:"dialog","aria-modal":"true","aria-labelledby":"log-detail-title","aria-describedby":"log-detail-content",className:"flex h-full w-full max-w-xl flex-col border-l border-slate-200 bg-white shadow-xl transition-transform dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("header",{className:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-800",children:[e.jsxs("div",{children:[e.jsx("h2",{id:"log-detail-title",className:"text-lg font-semibold",children:s("logs.detail.title")}),l?e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.id",{id:l.id})}):null]}),e.jsx("button",{type:"button",ref:k,onClick:o,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.close")})]}),e.jsx("div",{id:"log-detail-content",className:"flex-1 overflow-y-auto",children:c.isPending?e.jsx(U,{}):l?e.jsxs("div",{className:"flex flex-col gap-6 px-6 py-5 text-sm",children:[e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.infoSection")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-md bg-slate-100 px-3 py-2 text-xs text-slate-600 dark:bg-slate-800/60 dark:text-slate-300",children:[e.jsx("span",{className:"text-sm font-medium text-slate-700 dark:text-slate-100",children:s("logs.detail.summary.route",{from:l.client_model??s("logs.detail.info.noRequestedModel"),to:l.model})}),e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.latency",{value:g(l.latency_ms,s("common.units.ms"))})}),l.ttft_ms!==null?e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.ttft",{value:g(l.ttft_ms,s("common.units.ms"))})}):null,l.tpot_ms!==null?e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.tpot",{value:g(l.tpot_ms,s("common.units.msPerToken"))})}):null,e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.stream",{value:D(l.stream)})}),e.jsx(J,{success:!l.error,statusCode:l.status_code})]}),e.jsxs("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-3",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.time")}),e.jsx("dd",{className:"font-medium",children:B(l.timestamp)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.sessionId")}),e.jsx("dd",{className:"font-medium",children:l.session_id??"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.provider")}),e.jsx("dd",{className:"font-medium",children:S})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.requestedModel")}),e.jsx("dd",{className:"font-medium",children:l.client_model??s("logs.detail.info.noRequestedModel")})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.model")}),e.jsx("dd",{className:"font-medium",children:l.model})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.stream")}),e.jsx("dd",{className:"font-medium",children:D(l.stream)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.inputTokens")}),e.jsx("dd",{className:"font-medium",children:j(l.input_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.cachedTokens")}),e.jsx("dd",{className:"font-medium",children:j(l.cached_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.outputTokens")}),e.jsx("dd",{className:"font-medium",children:j(l.output_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.ttft")}),e.jsx("dd",{className:"font-medium",children:g(l.ttft_ms,s("common.units.ms"))})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.tpot")}),e.jsx("dd",{className:"font-medium",children:g(l.tpot_ms,s("common.units.msPerToken"))})]})]}),l.error?e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.error")}),e.jsx("p",{className:"rounded-md border border-red-200 bg-red-50 p-3 text-xs leading-5 text-red-700 dark:border-red-800/70 dark:bg-red-900/40 dark:text-red-200",children:l.error})]}):null]}),e.jsxs("section",{className:"space-y-2",children:[e.jsxs("header",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.payload.request")}),e.jsx("button",{type:"button",onClick:()=>{var i;return v(s("logs.detail.payload.request"),(i=l.payload)==null?void 0:i.prompt,"logs.detail.copy.requestSuccess")},className:"rounded-md border border-slate-200 px-2 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.copy")})]}),e.jsx("pre",{className:"max-h-64 overflow-auto whitespace-pre-wrap rounded-md border border-slate-200 bg-slate-50 p-3 text-xs leading-5 text-slate-700 dark:border-slate-800 dark:bg-slate-900/80 dark:text-slate-200",children:G((u=l.payload)==null?void 0:u.prompt,s("logs.detail.payload.emptyRequest"))})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsxs("header",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.payload.response")}),e.jsx("button",{type:"button",onClick:()=>{var i;return v(s("logs.detail.payload.response"),(i=l.payload)==null?void 0:i.response,"logs.detail.copy.responseSuccess")},className:"rounded-md border border-slate-200 px-2 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.copy")})]}),e.jsx("pre",{className:"max-h-64 overflow-auto whitespace-pre-wrap rounded-md border border-slate-200 bg-slate-50 p-3 text-xs leading-5 text-slate-700 dark:border-slate-800 dark:bg-slate-900/80 dark:text-slate-200",children:G((b=l.payload)==null?void 0:b.response,s("logs.detail.payload.emptyResponse"))})]})]}):e.jsx("div",{className:"flex h-full items-center justify.center p-8 text-sm text-slate-500 dark:text-slate-400",children:s("logs.detail.loadError")})})]})]})}export{te as default};
|
|
1
|
+
import{u as E,a as Q,r as d,j as e,L as U}from"./index-B_Unl5wz.js";import{u as $}from"./useApiQuery-DZqtpbk3.js";const I=[20,50,100];function A(t,r=!1){if(!t)return;const o=r?`${t}T23:59:59.999`:`${t}T00:00:00.000`,n=Date.parse(o);return Number.isFinite(n)?n:void 0}function B(t){const r=new Date(t);return`${r.getFullYear()}-${`${r.getMonth()+1}`.padStart(2,"0")}-${`${r.getDate()}`.padStart(2,"0")} ${`${r.getHours()}`.padStart(2,"0")}:${`${r.getMinutes()}`.padStart(2,"0")}:${`${r.getSeconds()}`.padStart(2,"0")}`}function j(t){return t==null?"-":t.toLocaleString()}function g(t,r){const o=j(t);return o==="-"?"-":`${o} ${r}`}function D(t){return t?"true":"false"}function G(t,r){if(!t||t.trim().length===0)return r;try{const o=JSON.parse(t);return JSON.stringify(o,null,2)}catch{return t}}function te(){var R,q;const{t}=E(),{pushToast:r}=Q(),[o,n]=d.useState("all"),[s,x]=d.useState(""),[h,k]=d.useState("all"),[c,v]=d.useState(""),[l,S]=d.useState(""),[u,b]=d.useState(1),[i,N]=d.useState(I[0]),[T,w]=d.useState(null),[z,M]=d.useState(!1);d.useEffect(()=>{b(1)},[o,s,h,c,l,i]);const L=d.useMemo(()=>{const a={limit:i,offset:(u-1)*i};o!=="all"&&(a.provider=o),s.trim().length>0&&(a.model=s.trim()),h!=="all"&&(a.status=h);const f=A(c),O=A(l,!0);return f!==void 0&&(a.from=f),O!==void 0&&(a.to=O),a},[o,s,h,c,l,u,i]),m=$(["logs",L],{url:"/api/logs",method:"GET",params:L}),y=$(["providers","all"],{url:"/api/providers",method:"GET"});d.useEffect(()=>{m.isError&&m.error&&r({title:t("logs.toast.listError.title"),description:t("logs.toast.listError.desc",{message:m.error.message}),variant:"error"})},[m.isError,m.error,r,t]),d.useEffect(()=>{y.isError&&y.error&&r({title:t("logs.toast.providerError.title"),description:t("logs.toast.providerError.desc",{message:y.error.message}),variant:"error"})},[y.isError,y.error,r,t]);const _=((R=m.data)==null?void 0:R.total)??0,p=_>0?Math.ceil(_/i):0,P=((q=m.data)==null?void 0:q.items)??[];d.useEffect(()=>{p>0&&u>p&&b(p)},[p,u]);const C=y.data??[],F=d.useMemo(()=>{const a=new Map;for(const f of C)f.id&&a.set(f.id,f.label??f.id);return a},[C]),H=d.useMemo(()=>[{value:"all",label:t("logs.filters.statusAll")},{value:"success",label:t("logs.filters.statusSuccess")},{value:"error",label:t("logs.filters.statusError")}],[t]),Y=()=>{n("all"),x(""),k("all"),v(""),S("")},Z=d.useCallback(a=>{w(a),M(!0)},[]),K=d.useCallback(()=>{M(!1),w(null)},[]);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold",children:t("logs.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:t("logs.description")})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400","aria-live":"polite",children:[e.jsx("span",{children:t("logs.summary.total",{value:_.toLocaleString()})}),e.jsx("button",{type:"button",className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",onClick:()=>m.refetch(),disabled:m.isFetching,children:m.isFetching?t("common.actions.refreshing"):t("logs.actions.manualRefresh")})]})]}),e.jsxs("div",{className:"flex flex-wrap items-end gap-3 rounded-lg border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.provider")}),e.jsxs("select",{value:o,onChange:a=>n(a.target.value),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40",children:[e.jsx("option",{value:"all",children:t("logs.filters.statusAll")}),C.map(a=>e.jsx("option",{value:a.id,children:a.label??a.id},a.id))]})]}),e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.modelId")}),e.jsx("input",{value:s,onChange:a=>x(a.target.value),placeholder:t("logs.filters.modelPlaceholder"),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40"})]}),e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.status")}),e.jsx("select",{value:h,onChange:a=>k(a.target.value),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40",children:H.map(a=>e.jsx("option",{value:a.value,children:a.label},a.value))})]}),e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.startDate")}),e.jsx("input",{type:"date",value:c,onChange:a=>v(a.target.value),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40"})]}),e.jsxs("div",{className:"flex flex-col text-sm",children:[e.jsx("label",{className:"mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:t("logs.filters.endDate")}),e.jsx("input",{type:"date",value:l,onChange:a=>S(a.target.value),className:"h-10 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200 dark:focus:border-blue-400 dark:focus:ring-blue-400/40"})]}),e.jsx("div",{className:"ml-auto flex items-center gap-2 text-sm",children:e.jsx("button",{type:"button",onClick:Y,className:"rounded-md border border-slate-200 px-3 py-2 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:t("common.actions.reset")})})]})]}),e.jsxs("section",{className:"rounded-lg border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"min-w-full divide-y divide-slate-200 text-sm dark:divide-slate-800",children:[e.jsx("caption",{className:"sr-only",children:t("logs.title")}),e.jsx("thead",{className:"bg-slate-100 dark:bg-slate-800/50",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.time")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.provider")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.requestedModel")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.routedModel")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.inputTokens")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.cachedTokens")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.outputTokens")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.stream")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.latency")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.ttft")}),e.jsx("th",{className:"px-4 py-2 text-right font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.tpot")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.status")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.error")}),e.jsx("th",{className:"px-4 py-2 text-left font-medium text-slate-500 dark:text-slate-400",children:t("logs.table.columns.actions")})]})}),e.jsx("tbody",{className:"divide-y divide-slate-200 dark:divide-slate-800",children:m.isPending?e.jsx("tr",{children:e.jsx("td",{colSpan:14,className:"px-4 py-10 text-center text-sm text-slate-400",children:t("logs.table.loading")})}):P.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:14,className:"px-4 py-10 text-center text-sm text-slate-400",children:t("logs.table.empty")})}):P.map(a=>e.jsx(V,{record:a,providerLabelMap:F,onSelect:Z},a.id))})]})}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 border-t border-slate-200 px-4 py-3 text-sm dark:border-slate-800",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{children:t("logs.table.pagination.perPage")}),e.jsx("select",{value:i,onChange:a=>N(Number(a.target.value)),className:"rounded-md border border-slate-200 bg-white px-2 py-1 text-sm dark:border-slate-700 dark:bg-slate-800",children:I.map(a=>e.jsx("option",{value:a,children:a},a))}),e.jsx("span",{children:t("logs.table.pagination.unit")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{type:"button",onClick:()=>b(a=>Math.max(a-1,1)),disabled:u<=1,className:"rounded-md border border-slate-200 px-3 py-1 transition enabled:hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700 dark:enabled:hover:bg-slate-800",children:t("logs.table.pagination.previous")}),e.jsx("span",{children:t("logs.table.pagination.pageLabel",{page:p===0?0:u,total:p})}),e.jsx("button",{type:"button",onClick:()=>b(a=>p===0?a:Math.min(a+1,p)),disabled:p===0||u>=p,className:"rounded-md border border-slate-200 px-3 py-1 transition enabled:hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-700 dark:enabled:hover:bg-slate-800",children:t("logs.table.pagination.next")})]})]})]}),e.jsx(W,{open:z,logId:T,onClose:K,providerLabelMap:F})]})}function V({record:t,providerLabelMap:r,onSelect:o}){const{t:n}=E(),s=r.get(t.provider)??t.provider,x=!!t.error,h=t.client_model??n("logs.table.requestedModelFallback");return e.jsxs("tr",{className:"hover:bg-slate-50 dark:hover:bg-slate-800/60",children:[e.jsx("td",{className:"px-4 py-2 text-xs text-slate-500 dark:text-slate-400",children:B(t.timestamp)}),e.jsx("td",{className:"px-4 py-2",children:s}),e.jsx("td",{className:"px-4 py-2",children:h}),e.jsx("td",{className:"px-4 py-2",children:t.model}),e.jsx("td",{className:"px-4 py-2 text-right",children:j(t.input_tokens)}),e.jsx("td",{className:"px-4 py-2 text-right",children:j(t.cached_tokens)}),e.jsx("td",{className:"px-4 py-2 text-right",children:j(t.output_tokens)}),e.jsx("td",{className:"px-4 py-2 text-right",children:D(t.stream)}),e.jsx("td",{className:"px-4 py-2 text-right",children:g(t.latency_ms,n("common.units.ms"))}),e.jsx("td",{className:"px-4 py-2 text-right",children:g(t.ttft_ms,n("common.units.ms"))}),e.jsx("td",{className:"px-4 py-2 text-right",children:g(t.tpot_ms,n("common.units.msPerToken"))}),e.jsx("td",{className:"px-4 py-2",children:e.jsx(J,{success:!x,statusCode:t.status_code})}),e.jsx("td",{className:"max-w-xs px-4 py-2 text-xs text-slate-500 dark:text-slate-400",children:e.jsx("span",{className:"block truncate",title:t.error??"",children:t.error?t.error:"-"})}),e.jsx("td",{className:"px-4 py-2",children:e.jsx("button",{type:"button",onClick:()=>o(t.id),"aria-haspopup":"dialog",className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:n("logs.actions.detail")})})]})}function J({success:t,statusCode:r}){const{t:o}=E(),n="inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium",s=t?"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-200":"bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-200";return e.jsxs("span",{className:`${n} ${s}`,children:[o(t?"common.status.success":"common.status.error"),r?` · ${r}`:""]})}function W({open:t,logId:r,onClose:o,providerLabelMap:n}){var u,b;const{t:s}=E(),{pushToast:x}=Q(),h=d.useRef(null),k=d.useRef(null),c=$(["log-detail",r],{url:`/api/logs/${r}`,method:"GET"},{enabled:t&&r!==null,staleTime:3e4});d.useEffect(()=>{c.isError&&c.error&&x({title:s("logs.detail.loadError"),description:c.error.message,variant:"error"})},[c.isError,c.error,x,s]),d.useEffect(()=>{if(!t)return;const i=N=>{N.key==="Escape"&&o()};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[t,o]),d.useEffect(()=>{t&&k.current&&k.current.focus()},[t,r]);const v=d.useCallback(async(i,N,T)=>{if(!N){x({title:s("logs.detail.copy.empty",{label:i}),variant:"info"});return}try{await navigator.clipboard.writeText(N),x({title:s(T),variant:"success"})}catch(w){x({title:s("logs.detail.copy.failure"),description:w instanceof Error?w.message:s("logs.detail.copy.failureFallback"),variant:"error"})}},[x,s]);if(!t)return null;const l=c.data,S=l?n.get(l.provider)??l.provider:"";return e.jsxs("div",{className:"fixed inset-0 z-50 flex",children:[e.jsx("div",{className:"flex-1 bg-slate-900/60",onClick:o,"aria-hidden":"true"}),e.jsxs("aside",{ref:h,role:"dialog","aria-modal":"true","aria-labelledby":"log-detail-title","aria-describedby":"log-detail-content",className:"flex h-full w-full max-w-xl flex-col border-l border-slate-200 bg-white shadow-xl transition-transform dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("header",{className:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-800",children:[e.jsxs("div",{children:[e.jsx("h2",{id:"log-detail-title",className:"text-lg font-semibold",children:s("logs.detail.title")}),l?e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.id",{id:l.id})}):null]}),e.jsx("button",{type:"button",ref:k,onClick:o,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.close")})]}),e.jsx("div",{id:"log-detail-content",className:"flex-1 overflow-y-auto",children:c.isPending?e.jsx(U,{}):l?e.jsxs("div",{className:"flex flex-col gap-6 px-6 py-5 text-sm",children:[e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.infoSection")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-md bg-slate-100 px-3 py-2 text-xs text-slate-600 dark:bg-slate-800/60 dark:text-slate-300",children:[e.jsx("span",{className:"text-sm font-medium text-slate-700 dark:text-slate-100",children:s("logs.detail.summary.route",{from:l.client_model??s("logs.detail.info.noRequestedModel"),to:l.model})}),e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.latency",{value:g(l.latency_ms,s("common.units.ms"))})}),l.ttft_ms!==null?e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.ttft",{value:g(l.ttft_ms,s("common.units.ms"))})}):null,l.tpot_ms!==null?e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.tpot",{value:g(l.tpot_ms,s("common.units.msPerToken"))})}):null,e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.summary.stream",{value:D(l.stream)})}),e.jsx(J,{success:!l.error,statusCode:l.status_code})]}),e.jsxs("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-3",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.time")}),e.jsx("dd",{className:"font-medium",children:B(l.timestamp)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.sessionId")}),e.jsx("dd",{className:"font-medium",children:l.session_id??"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.provider")}),e.jsx("dd",{className:"font-medium",children:S})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.requestedModel")}),e.jsx("dd",{className:"font-medium",children:l.client_model??s("logs.detail.info.noRequestedModel")})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.model")}),e.jsx("dd",{className:"font-medium",children:l.model})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.stream")}),e.jsx("dd",{className:"font-medium",children:D(l.stream)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.inputTokens")}),e.jsx("dd",{className:"font-medium",children:j(l.input_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.cachedTokens")}),e.jsx("dd",{className:"font-medium",children:j(l.cached_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.outputTokens")}),e.jsx("dd",{className:"font-medium",children:j(l.output_tokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.ttft")}),e.jsx("dd",{className:"font-medium",children:g(l.ttft_ms,s("common.units.ms"))})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.tpot")}),e.jsx("dd",{className:"font-medium",children:g(l.tpot_ms,s("common.units.msPerToken"))})]})]}),l.error?e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("logs.detail.info.error")}),e.jsx("p",{className:"rounded-md border border-red-200 bg-red-50 p-3 text-xs leading-5 text-red-700 dark:border-red-800/70 dark:bg-red-900/40 dark:text-red-200",children:l.error})]}):null]}),e.jsxs("section",{className:"space-y-2",children:[e.jsxs("header",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.payload.request")}),e.jsx("button",{type:"button",onClick:()=>{var i;return v(s("logs.detail.payload.request"),(i=l.payload)==null?void 0:i.prompt,"logs.detail.copy.requestSuccess")},className:"rounded-md border border-slate-200 px-2 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.copy")})]}),e.jsx("pre",{className:"max-h-64 overflow-auto whitespace-pre-wrap rounded-md border border-slate-200 bg-slate-50 p-3 text-xs leading-5 text-slate-700 dark:border-slate-800 dark:bg-slate-900/80 dark:text-slate-200",children:G((u=l.payload)==null?void 0:u.prompt,s("logs.detail.payload.emptyRequest"))})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsxs("header",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("logs.detail.payload.response")}),e.jsx("button",{type:"button",onClick:()=>{var i;return v(s("logs.detail.payload.response"),(i=l.payload)==null?void 0:i.response,"logs.detail.copy.responseSuccess")},className:"rounded-md border border-slate-200 px-2 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("common.actions.copy")})]}),e.jsx("pre",{className:"max-h-64 overflow-auto whitespace-pre-wrap rounded-md border border-slate-200 bg-slate-50 p-3 text-xs leading-5 text-slate-700 dark:border-slate-800 dark:bg-slate-900/80 dark:text-slate-200",children:G((b=l.payload)==null?void 0:b.response,s("logs.detail.payload.emptyResponse"))})]})]}):e.jsx("div",{className:"flex h-full items-center justify.center p-8 text-sm text-slate-500 dark:text-slate-400",children:s("logs.detail.loadError")})})]})]})}export{te as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as te,r as p,j as e,a as ue}from"./index-B_Unl5wz.js";import{u as be,a as F}from"./useApiQuery-DZqtpbk3.js";function ae(){return typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():Math.random().toString(36).slice(2,10)}function ie(){return{_key:ae(),id:"",label:"",capabilities:{thinking:!1,tools:!1}}}const ee={openai:{baseUrl:"https://api.openai.com/v1"},deepseek:{baseUrl:"https://api.deepseek.com/v1"},huawei:{baseUrl:"https://api.modelarts-maas.com/v1"},kimi:{baseUrl:"https://api.moonshot.cn/v1"},anthropic:{baseUrl:"https://api.anthropic.com/v1",defaultModel:"claude-sonnet-4-5-20250929",models:[{id:"claude-sonnet-4-5-20250929",label:"Claude Sonnet 4.5 (2025-09-29)",capabilities:{thinking:!0,tools:!0},maxTokens:2e5},{id:"claude-sonnet-4-20250514",label:"Claude Sonnet 4 (2025-05-14)",capabilities:{thinking:!0,tools:!0},maxTokens:2e5},{id:"claude-opus-4-1-20250805",label:"Claude Opus 4.1 (2025-08-05)",capabilities:{thinking:!0,tools:!0},maxTokens:2e5},{id:"claude-3-5-haiku-20241022",label:"Claude 3.5 Haiku (2024-10-22)",capabilities:{thinking:!0,tools:!0},maxTokens:2e5}]},custom:{}};function le(s){return s?{id:s.id,label:s.label??s.id,baseUrl:s.baseUrl,apiKey:s.apiKey??"",type:s.type??"custom",defaultModel:s.defaultModel??"",models:(s.models??[]).map(o=>({...o,_key:ae(),capabilities:o.capabilities??{}}))}:{id:"",label:"",baseUrl:"",apiKey:"",type:"custom",defaultModel:"",models:[ie()]}}function xe(s){var o,n;return{_key:ae(),id:s.id,label:s.label,maxTokens:s.maxTokens,capabilities:{thinking:!!((o=s.capabilities)!=null&&o.thinking),tools:!!((n=s.capabilities)!=null&&n.tools)}}}function me({open:s,mode:o,provider:n,existingProviderIds:x,onClose:v,onSubmit:P}){const{t:l}=te(),[i,k]=p.useState(()=>le(n)),[j,q]=p.useState({}),[L,D]=p.useState(!1),[R,w]=p.useState(null),_=p.useRef(null),N=p.useRef(null),C=p.useRef(null),[U,Q]=p.useState(o==="edit");p.useEffect(()=>{s&&(k(le(n)),q({}),w(null),D(!1),Q(o==="edit"))},[s,n,o]),p.useEffect(()=>{if(!s)return;const a=d=>{d.key==="Escape"&&v()};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[s,v]),p.useEffect(()=>{if(s){if(o==="create"&&C.current){C.current.focus();return}N.current&&N.current.focus()}},[s,o]);const $=p.useMemo(()=>i.models.filter(a=>a.id.trim().length>0),[i.models]),H=a=>d=>{k(u=>({...u,[a]:d}))},z=a=>{k(d=>{const c=!U||d.label.trim().length===0||d.label===d.id?a:d.label;return{...d,id:a,label:c}})},G=a=>{k(d=>{var J;const c=ee[a??"custom"]??ee.custom,m=Object.values(ee).map(T=>T.baseUrl).filter(T=>!!T),y=!d.baseUrl||m.includes(d.baseUrl),S=o==="create"&&(d.models.length===0||d.models.every(T=>T.id.trim().length===0)),E={...d,type:a};return c!=null&&c.baseUrl&&y&&(E.baseUrl=c.baseUrl),c!=null&&c.models&&S&&(E.models=c.models.map(xe),E.defaultModel=c.defaultModel??((J=c.models[0])==null?void 0:J.id)??""),E})},A=(a,d)=>{k(u=>{const c=[...u.models];return c[a]={...c[a],...d},{...u,models:c}})},V=(a,d)=>{k(u=>{const c=[...u.models],m=c[a];if(!m)return u;const y=!U||!m.label||m.label===m.id,S={...m,id:d,label:y?d:m.label};c[a]=S;const E=u.defaultModel===m.id?d:u.defaultModel;return{...u,models:c,defaultModel:E}})},B=(a,d)=>{k(u=>{var y;const c=[...u.models],m=c[a];return c[a]={...m,capabilities:{...m.capabilities,[d]:!((y=m.capabilities)!=null&&y[d])}},{...u,models:c}})},M=a=>{k(d=>{var m;if(d.models.length<=1)return d;const u=d.models.filter((y,S)=>S!==a);let c=d.defaultModel;return u.some(y=>y.id===c)||(c=((m=u[0])==null?void 0:m.id)??""),{...d,models:u,defaultModel:c}})},W=()=>{k(a=>({...a,models:[...a.models,ie()]}))},X=()=>{const a={},d=i.id.trim(),u=i.baseUrl.trim();if(o==="create"&&(d.length===0?a.id=l("providers.drawer.errors.idRequired"):x.includes(d)&&(a.id=l("providers.drawer.errors.idDuplicate"))),o==="edit"&&d.length===0&&(a.id=l("providers.drawer.errors.idRequired")),u.length===0)a.baseUrl=l("providers.drawer.errors.baseUrlInvalid");else try{new URL(u)}catch{a.baseUrl=l("providers.drawer.errors.baseUrlInvalid")}const c=new Set;return i.models.some(y=>{const S=y.id.trim();return S.length===0||c.has(S)?!0:(c.add(S),!1)})&&(a.models=l("providers.drawer.errors.modelInvalid")),i.models.length===0&&(a.models=l("providers.drawer.errors.modelsRequired")),i.defaultModel&&!i.models.some(y=>y.id===i.defaultModel)&&(a.models=l("providers.drawer.errors.defaultInvalid")),q(a),Object.keys(a).length===0},Z=()=>{const a=i.models.map(u=>{var c;return{id:u.id.trim(),label:(c=u.label)!=null&&c.trim()?u.label.trim():void 0,capabilities:u.capabilities,maxTokens:typeof u.maxTokens=="number"&&Number.isFinite(u.maxTokens)?u.maxTokens:void 0}}),d=n!=null&&n.extraHeaders&&Object.keys(n.extraHeaders).length>0?n.extraHeaders:void 0;return{id:i.id.trim(),label:i.label.trim()||i.id.trim(),baseUrl:i.baseUrl.trim(),apiKey:i.apiKey.trim()||void 0,type:i.type??"custom",defaultModel:i.defaultModel||void 0,models:a,extraHeaders:d}},K=async()=>{if(w(null),!!X()){D(!0);try{const a=Z();await P(a)}catch(a){w(l("providers.drawer.toast.saveFailure",{message:a instanceof Error?a.message:"unknown"})),D(!1);return}D(!1),v()}},Y=o==="create";return s?e.jsxs("div",{className:"fixed inset-0 z-50 flex",children:[e.jsx("div",{className:"flex-1 bg-slate-900/60",onClick:v,"aria-hidden":"true"}),e.jsxs("aside",{ref:_,role:"dialog","aria-modal":"true","aria-labelledby":"provider-drawer-title","aria-describedby":"provider-drawer-desc",className:"flex h-full w-full max-w-3xl flex-col border-l border-slate-200 bg-white shadow-xl dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("header",{className:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-800",children:[e.jsxs("div",{children:[e.jsx("h2",{id:"provider-drawer-title",className:"text-lg font-semibold",children:l(Y?"providers.drawer.createTitle":"providers.drawer.editTitle")}),e.jsx("p",{id:"provider-drawer-desc",className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.description")})]}),e.jsx("button",{type:"button",ref:N,onClick:v,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:l("common.actions.close")})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-6 py-5",children:[e.jsxs("section",{className:"space-y-4","aria-labelledby":"provider-basic-fields",children:[e.jsx("div",{id:"provider-basic-fields",className:"sr-only",children:l("providers.drawer.description")}),e.jsx("div",{className:"flex items-center justify-end",children:e.jsx("button",{type:"button",onClick:()=>Q(a=>!a),className:"rounded-md border border-slate-200 px-3 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:l(U?"providers.drawer.fields.hideAdvanced":"providers.drawer.fields.showAdvanced")})}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.id")}),e.jsx("input",{value:i.id,ref:C,onChange:a=>z(a.target.value),disabled:!Y,placeholder:l("providers.drawer.fields.idPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60","aria-invalid":!!j.id}),j.id?e.jsx("span",{className:"text-xs text-red-500",children:j.id}):null]}),U?e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.label")}),e.jsx("input",{value:i.label,onChange:a=>H("label")(a.target.value),placeholder:l("providers.drawer.fields.labelPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}):null]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.baseUrl")}),e.jsx("input",{value:i.baseUrl,onChange:a=>H("baseUrl")(a.target.value),placeholder:l("providers.drawer.fields.baseUrlPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60","aria-invalid":!!j.baseUrl}),j.baseUrl?e.jsx("span",{className:"text-xs text-red-500",children:j.baseUrl}):null]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.type")}),e.jsxs("select",{value:i.type??"custom",onChange:a=>G(a.target.value),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60",children:[e.jsx("option",{value:"openai",children:"OpenAI"}),e.jsx("option",{value:"deepseek",children:"DeepSeek"}),e.jsx("option",{value:"huawei",children:"华为云"}),e.jsx("option",{value:"kimi",children:"Kimi"}),e.jsx("option",{value:"anthropic",children:"Anthropic (Claude)"}),e.jsx("option",{value:"custom",children:"Custom"})]})]})]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.apiKey")}),e.jsx("input",{value:i.apiKey,onChange:a=>H("apiKey")(a.target.value),placeholder:l("providers.drawer.fields.apiKeyPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]})]}),e.jsxs("section",{className:"mt-6 space-y-3","aria-labelledby":"provider-model-fields",children:[e.jsxs("header",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h3",{id:"provider-model-fields",className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.models")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.modelsDescription")})]}),e.jsx("button",{type:"button",onClick:W,className:"rounded-md border border-slate-200 px-3 py-1 text-xs transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:l("providers.drawer.fields.addModel")})]}),j.models?e.jsx("p",{className:"text-xs text-red-500",children:j.models}):null,e.jsx("div",{className:"space-y-4",children:i.models.map((a,d)=>{var u,c;return e.jsxs("div",{className:"rounded-lg border border-slate-200 bg-slate-50 p-4 dark:border-slate-700 dark:bg-slate-800/40",children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.modelId")}),e.jsx("input",{value:a.id,onChange:m=>V(d,m.target.value),placeholder:l("providers.drawer.fields.modelIdPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}),U?e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.modelLabel")}),e.jsx("input",{value:a.label??"",onChange:m=>A(d,{label:m.target.value}),placeholder:l("providers.drawer.fields.modelLabelPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}):null]}),U?e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.maxTokens")}),e.jsx("input",{type:"number",min:1,value:a.maxTokens??"",onChange:m=>A(d,{maxTokens:m.target.value?Number(m.target.value):void 0}),placeholder:"128000",className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}),e.jsxs("div",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.fields.capabilities")}),e.jsxs("div",{className:"flex flex-wrap gap-3",children:[e.jsxs("label",{className:"inline-flex items-center gap-2 text-xs text-slate-600 dark:text-slate-300",children:[e.jsx("input",{type:"checkbox",checked:!!((u=a.capabilities)!=null&&u.thinking),onChange:()=>B(d,"thinking"),className:"h-4 w-4 rounded border-slate-300"}),l("providers.drawer.fields.capabilityThinking")]}),e.jsxs("label",{className:"inline-flex items-center gap-2 text-xs text-slate-600 dark:text-slate-300",children:[e.jsx("input",{type:"checkbox",checked:!!((c=a.capabilities)!=null&&c.tools),onChange:()=>B(d,"tools"),className:"h-4 w-4 rounded border-slate-300"}),l("providers.drawer.fields.capabilityTools")]})]})]})]}):null,e.jsxs("div",{className:"mt-3 flex flex-wrap items-center justify-between gap-3 text-xs",children:[e.jsxs("label",{className:"flex items-center gap-2 text-slate-600 dark:text-slate-300",children:[e.jsx("input",{type:"radio",name:"defaultModel",value:a.id,checked:i.defaultModel===a.id,onChange:()=>k(m=>({...m,defaultModel:a.id})),disabled:a.id.trim().length===0}),l("providers.drawer.fields.setDefault")]}),e.jsx("button",{type:"button",className:"text-red-500 transition hover:text-red-600 disabled:cursor-not-allowed disabled:opacity-40",onClick:()=>M(d),disabled:i.models.length<=1,children:l("providers.drawer.fields.removeModel")})]})]},a._key)})}),$.length>1?e.jsx("div",{className:"text-xs text-slate-500 dark:text-slate-400",children:l("providers.drawer.defaultHint",{model:i.defaultModel||l("providers.card.noDefault")})}):null]})]}),e.jsxs("footer",{className:"flex items-center justify-between gap-3 border-t border-slate-200 px-6 py-4 text-sm dark:border-slate-800",children:[e.jsx("div",{className:"flex flex-col text-xs text-red-500","aria-live":"polite",children:R?e.jsx("span",{children:R}):null}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{type:"button",onClick:v,className:"rounded-md border border-slate-200 px-4 py-2 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",disabled:L,children:l("common.actions.cancel")}),e.jsx("button",{type:"button",onClick:K,className:"rounded-md bg-blue-600 px-4 py-2 text-white transition hover:bg-blue-700 disabled:opacity-60",disabled:L,children:l(L?"common.actions.saving":"common.actions.save")})]})]})]})]}):null}const pe=["claude-sonnet-4-5-20250929","claude-sonnet-4-20250514","claude-opus-4-1-20250805","claude-3-5-haiku-20241022"];function se(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).slice(2,10)}function O(s){return s?Object.entries(s).map(([o,n])=>({id:se(),source:o,target:n})):[]}function je(){const{t:s}=te(),{pushToast:o}=ue(),n=be(["config","full"],{url:"/api/config",method:"GET"}),[x,v]=p.useState(null),[P,l]=p.useState(!1),[i,k]=p.useState("create"),[j,q]=p.useState(void 0),[L,D]=p.useState(null),[R,w]=p.useState([]),[_,N]=p.useState(null),[C,U]=p.useState(!1),[Q,$]=p.useState(!1),[H,z]=p.useState(""),[G,A]=p.useState(null),[V,B]=p.useState(!1),M=(x==null?void 0:x.providers)??[],W=M.length;p.useEffect(()=>{n.data&&(v(n.data),w(O(n.data.modelRoutes)),N(null))},[n.data]),p.useEffect(()=>{n.isError&&n.error&&o({title:s("providers.toast.loadFailure",{message:n.error.message}),variant:"error"})},[n.isError,n.error,o,s]);const X=p.useMemo(()=>{const t=new Map;for(const r of M){if(!r.defaultModel||!r.models)continue;const b=r.models.find(f=>f.id===r.defaultModel);b&&t.set(r.id,de(b))}return t},[M]),Z=p.useMemo(()=>{const t=[],r=new Set;for(const b of M){const f=b.label||b.id,h=b.models??[];if(h.length>0)for(const g of h){const I=`${b.id}:${g.id}`;r.has(I)||(r.add(I),t.push({value:I,label:`${f} · ${g.label??g.id}`}))}else if(b.defaultModel){const g=`${b.id}:${b.defaultModel}`;r.has(g)||(r.add(g),t.push({value:g,label:`${f} · ${b.defaultModel}`}))}}for(const b of R){const f=b.target.trim();f&&!r.has(f)&&(r.add(f),t.push({value:f,label:f}))}return t},[M,R]),K=()=>x?!0:(o({title:s("settings.toast.missingConfig"),variant:"error"}),n.refetch(),!1),Y=t=>{if(!x)return t;let r=t,b=1;for(;x.providers.some(f=>f.id===r);)r=`${t}-${b}`,b+=1;return r},a=()=>{K()&&(k("create"),q(void 0),l(!0))},d=()=>{K()&&(z(""),A(null),$(!0))},u=t=>{K()&&(k("edit"),q(t),l(!0))},c=async()=>{if(!x){o({title:s("settings.toast.missingConfig"),variant:"error"});return}const t=H.trim();if(!t){A(s("providers.quickAddHuawei.validation.apiKey"));return}const f={id:Y("huawei-cloud"),label:s("providers.quickAddHuawei.providerLabel"),baseUrl:"https://api.modelarts-maas.com/v1",apiKey:t,type:"huawei",defaultModel:"deepseek-v3.1",models:[{id:"deepseek-v3.1",label:"DeepSeek V3.1",capabilities:{thinking:!1,tools:!0}},{id:"KIMI-K2",label:"KIMI-K2",capabilities:{thinking:!1,tools:!0}},{id:"qwen3-235b-a22b",label:"Qwen3 235B A22B",capabilities:{thinking:!1,tools:!0}}]},h={...x,providers:[...x.providers,f]};try{B(!0),await F.put("/api/config",h),v(h),w(O(h.modelRoutes)),$(!1),o({title:s("providers.quickAddHuawei.toast.success"),description:s("providers.quickAddHuawei.toast.added",{name:f.label||f.id}),variant:"success"}),n.refetch()}catch(g){A(g instanceof Error?g.message:s("providers.quickAddHuawei.toast.failure"))}finally{B(!1)}},m=async t=>{if(!x)throw new Error(s("settings.toast.missingConfig"));const r=i==="create"?[...M,t]:M.map(h=>j&&h.id===j.id?{...t,id:j.id}:h),b={...x,providers:r};await F.put("/api/config",b),v(b),w(O(b.modelRoutes)),n.refetch();const f=i==="create"?s("providers.toast.createSuccess",{name:t.label||t.id}):s("providers.toast.updateSuccess",{name:t.label||t.id});o({title:f,variant:"success"})},y=async t=>{D(t.id);try{const r=await F.post(`/api/providers/${t.id}/test`);r.data.ok?o({title:s("providers.toast.testSuccess"),description:s("providers.toast.testSuccessDesc",{status:r.data.status,duration:r.data.durationMs?`${r.data.durationMs} ms`:"—"}),variant:"success"}):o({title:s("providers.toast.testFailure",{message:`${r.data.status} ${r.data.statusText}`}),variant:"error"})}catch(r){o({title:s("providers.toast.testFailure",{message:r instanceof Error?r.message:"unknown"}),variant:"error"})}finally{D(null)}},S=async t=>{if(!K()||!window.confirm(s("providers.confirm.delete",{name:t.label||t.id})))return;const b=M.filter(g=>g.id!==t.id),f={};if(x!=null&&x.modelRoutes)for(const[g,I]of Object.entries(x.modelRoutes)){if(!I)continue;const[re]=I.split(":");re&&re===t.id||I===t.id||(f[g]=I)}const h={...x,providers:b,modelRoutes:f};try{await F.put("/api/config",h),v(h),w(O(h.modelRoutes)),o({title:s("providers.toast.deleteSuccess",{name:t.label||t.id}),variant:"success"}),n.refetch()}catch(g){o({title:s("providers.toast.deleteFailure",{message:g instanceof Error?g.message:"unknown"}),variant:"error"})}},E=()=>{w(t=>[...t,{id:se(),source:"",target:""}]),N(null)},J=t=>{w(r=>r.some(b=>b.source.trim()===t)?r:[...r,{id:se(),source:t,target:""}]),N(null)},T=(t,r,b)=>{w(f=>f.map(h=>h.id===t?{...h,[r]:b}:h)),N(null)},oe=t=>{w(r=>r.filter(b=>b.id!==t)),N(null)},ne=()=>{x&&(w(O(x.modelRoutes)),N(null))},ce=async()=>{if(!K())return;const t={};for(const r of R){const b=r.source.trim(),f=r.target.trim();if(!(!b&&!f)){if(!b||!f){N(s("settings.validation.routePair"));return}if(t[b]){N(s("settings.validation.routeDuplicate",{model:b}));return}t[b]=f}}N(null),U(!0);try{const r={...x,modelRoutes:t};await F.put("/api/config",r),v(r),w(O(r.modelRoutes)),o({title:s("modelManagement.toast.routesSaved"),variant:"success"}),n.refetch()}catch(r){o({title:s("modelManagement.toast.routesSaveFailure",{message:r instanceof Error?r.message:"unknown"}),variant:"error"})}finally{U(!1)}};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsxs("header",{className:"flex flex-col gap-2",children:[e.jsx("h1",{className:"text-2xl font-semibold",children:s("modelManagement.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:s("modelManagement.description")})]}),e.jsxs("section",{className:"space-y-4 rounded-lg border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold",children:s("providers.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:s("providers.description")})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm text-slate-500 dark:text-slate-400",children:[e.jsx("span",{children:s("providers.count",{count:W})}),e.jsx("button",{type:"button",className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",onClick:()=>n.refetch(),disabled:n.isFetching,children:n.isFetching?s("common.actions.refreshing"):s("providers.actions.refresh")}),e.jsx("button",{type:"button",className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",onClick:d,children:s("providers.quickAddHuawei.button")}),e.jsx("button",{type:"button",className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",onClick:a,children:s("providers.actions.add")})]})]}),n.isPending||!x&&n.isFetching?e.jsx("section",{className:"flex min-h-[200px] items-center justify-center rounded-lg border border-slate-200 bg-white text-sm text-slate-500 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-400",children:s("common.loading")}):M.length===0?e.jsx("section",{className:"rounded-lg border border-dashed border-slate-300 bg-white p-8 text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-400",children:s("providers.emptyState")}):e.jsx("div",{className:"grid gap-4 md:grid-cols-2 xl:grid-cols-3",children:M.map(t=>e.jsxs("article",{className:"flex h-full flex-col gap-4 rounded-lg border border-slate-200 bg-white p-5 shadow-sm transition hover:shadow-md dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"text-lg font-semibold",children:t.label||t.id}),t.type?e.jsx(ge,{type:t.type}):null]}),e.jsxs("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:["ID:",t.id]}),e.jsxs("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:["Base URL:",e.jsx("span",{className:"break-all text-slate-600 dark:text-slate-300",children:t.baseUrl})]})]}),e.jsx("div",{className:"flex flex-col gap-2 text-xs text-slate-500 dark:text-slate-400",children:t.defaultModel?e.jsx("span",{className:"inline-flex items-center rounded-full bg-emerald-100 px-2 py-0.5 font-medium text-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-200",children:s("providers.card.defaultModel",{model:X.get(t.id)??t.defaultModel})}):e.jsx("span",{className:"inline-flex items-center rounded-full bg-slate-100 px-2 py-0.5 font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-300",children:s("providers.card.noDefault")})})]}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h4",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400",children:s("providers.card.modelsTitle")}),t.models&&t.models.length>0?e.jsx("ul",{className:"flex flex-wrap gap-2",children:t.models.map(r=>e.jsxs("li",{className:"flex items-center gap-2 rounded-md border border-slate-200 bg-slate-50 px-3 py-1 text-xs dark:border-slate-700 dark:bg-slate-800/60",children:[e.jsx("span",{className:"font-medium text-slate-700 dark:text-slate-200",children:de(r)}),e.jsx(he,{model:r})]},r.id))}):e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:s("providers.card.noModels")})]}),e.jsxs("footer",{className:"mt-auto flex flex-wrap gap-2",children:[e.jsx("button",{type:"button",className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",onClick:()=>u(t),children:s("providers.actions.edit")}),e.jsx("button",{type:"button",onClick:()=>y(t),disabled:L===t.id,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition enabled:hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-60 dark:border-slate-700 dark:enabled:hover:bg-slate-800",children:L===t.id?s("common.actions.testingConnection"):s("providers.actions.test")}),e.jsx("button",{type:"button",className:"rounded-md border border-red-200 px-3 py-1 text-sm text-red-600 transition hover:bg-red-50 dark:border-red-800 dark:text-red-300 dark:hover:bg-red-900/40",onClick:()=>S(t),children:s("providers.actions.delete")})]})]},t.id))})]}),e.jsxs("section",{className:"space-y-4 rounded-lg border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("h2",{className:"text-lg font-semibold",children:s("settings.routing.title")}),e.jsx("p",{className:"max-w-3xl text-xs text-slate-500 dark:text-slate-400",children:s("settings.routing.description")})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[e.jsx("button",{type:"button",onClick:E,className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:s("settings.routing.add")}),e.jsx("button",{type:"button",onClick:ne,className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",disabled:C,children:s("common.actions.reset")}),e.jsx("button",{type:"button",onClick:ce,className:"rounded-md bg-blue-600 px-3 py-1 text-white transition hover:bg-blue-700 disabled:opacity-60",disabled:C,children:s(C?"common.actions.saving":"modelManagement.actions.saveRoutes")})]})]}),_?e.jsx("p",{className:"text-xs text-red-500",children:_}):null,R.length===0?e.jsx("p",{className:"rounded-md border border-dashed border-slate-200 bg-slate-50 px-3 py-6 text-center text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-800/60 dark:text-slate-300",children:s("settings.routing.empty")}):e.jsx("div",{className:"grid gap-3",children:R.map(t=>e.jsxs("div",{className:"grid gap-3 md:grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto]",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-xs",children:[e.jsx("span",{className:"text-slate-500 dark:text-slate-400",children:s("settings.routing.sourceLabel")}),e.jsx("input",{value:t.source,onChange:r=>T(t.id,"source",r.target.value),placeholder:s("settings.routing.sourcePlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40",disabled:C})]}),e.jsxs("label",{className:"flex flex-col gap-2 text-xs",children:[e.jsx("span",{className:"text-slate-500 dark:text-slate-400",children:s("settings.routing.targetLabel")}),e.jsxs("select",{value:t.target,onChange:r=>T(t.id,"target",r.target.value),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60",disabled:C,children:[e.jsx("option",{value:"",children:s("modelManagement.routing.selectTarget")}),Z.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))]})]}),e.jsx("div",{className:"flex items-end justify-start pb-1 md:justify-end",children:e.jsx("button",{type:"button",onClick:()=>oe(t.id),className:"rounded-md border border-slate-200 px-3 py-2 text-xs text-slate-600 transition hover:bg-slate-100 dark:border-slate-700 dark:text-slate-300 dark:hover:bg-slate-800",disabled:C,children:s("settings.routing.remove")})})]},t.id))}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs text-slate-500 dark:text-slate-400",children:[e.jsx("span",{children:s("settings.routing.suggested")}),pe.map(t=>e.jsx("button",{type:"button",onClick:()=>J(t),className:"rounded-md border border-slate-200 px-2 py-1 text-xs text-slate-600 transition hover:bg-slate-100 dark:border-slate-700 dark:text-slate-300 dark:hover:bg-slate-800",disabled:C,children:t},t))]})]}),e.jsx(me,{open:P,mode:i,provider:i==="edit"?j:void 0,existingProviderIds:M.map(t=>t.id).filter(t=>i==="edit"&&j?t!==j.id:!0),onClose:()=>{l(!1),q(void 0),k("create")},onSubmit:m}),e.jsx(fe,{open:Q,apiKey:H,onApiKeyChange:t=>{z(t),G&&A(null)},loading:V,error:G,onClose:()=>{V||($(!1),A(null))},onSubmit:c})]})}function fe({open:s,apiKey:o,onApiKeyChange:n,loading:x,error:v,onClose:P,onSubmit:l}){const{t:i}=te();return s?e.jsxs("div",{className:"fixed inset-0 z-50 flex",children:[e.jsx("div",{className:"flex-1 bg-slate-900/60",onClick:P,"aria-hidden":"true"}),e.jsxs("aside",{role:"dialog","aria-modal":"true","aria-labelledby":"quick-add-huawei",className:"flex h-full w-full max-w-md flex-col border-l border-slate-200 bg-white shadow-xl dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("header",{className:"flex items-center justify-between border-b border-slate-200 px-6 py-4 dark:border-slate-800",children:[e.jsxs("div",{children:[e.jsx("h2",{id:"quick-add-huawei",className:"text-lg font-semibold",children:i("providers.quickAddHuawei.title")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:i("providers.quickAddHuawei.description")})]}),e.jsx("button",{type:"button",onClick:P,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",disabled:x,children:i("common.actions.close")})]}),e.jsxs("div",{className:"flex flex-1 flex-col gap-4 px-6 py-5 text-sm",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:i("providers.quickAddHuawei.apiKeyLabel")}),e.jsx("input",{type:"password",value:o,onChange:k=>n(k.target.value),placeholder:i("providers.quickAddHuawei.apiKeyPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40",disabled:x})]}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:i("providers.quickAddHuawei.note")}),v?e.jsx("p",{className:"text-xs text-red-500",children:v}):null]}),e.jsxs("footer",{className:"flex items-center justify-end gap-2 border-t border-slate-200 px-6 py-4 text-sm dark:border-slate-800",children:[e.jsx("button",{type:"button",onClick:P,className:"rounded-md border border-slate-200 px-4 py-2 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",disabled:x,children:i("common.actions.cancel")}),e.jsx("button",{type:"button",onClick:l,className:"rounded-md bg-blue-600 px-4 py-2 text-white transition hover:bg-blue-700 disabled:opacity-60",disabled:x,children:i(x?"common.actions.saving":"providers.quickAddHuawei.submit")})]})]})]}):null}function de(s){return s.label&&s.label.trim().length>0?`${s.label} (${s.id})`:s.id}function he({model:s}){const o=s.capabilities;if(!o)return null;const n=[];return o.thinking&&n.push("Thinking"),o.tools&&n.push("Tools"),n.length===0?null:e.jsx("span",{className:"rounded-full bg-sky-100 px-2 py-0.5 text-[11px] font-medium text-sky-700 dark:bg-sky-900/40 dark:text-sky-200",children:n.join(" · ")})}function ge({type:s}){const o={openai:"OpenAI",deepseek:"DeepSeek",huawei:"华为云",kimi:"Kimi",anthropic:"Anthropic",custom:"Custom"};return e.jsx("span",{className:"rounded-full bg-slate-100 px-2 py-0.5 text-xs font-medium text-slate-600 dark:bg-slate-800 dark:text-slate-300",children:o[s]??s})}export{je as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as F,a as q,r as d,j as e,L as A}from"./index-B82tYC06.js";import{u as K,a as m}from"./useApiQuery-BKzEW-RR.js";const T=[{value:"fatal",labelKey:"fatal"},{value:"error",labelKey:"error"},{value:"warn",labelKey:"warn"},{value:"info",labelKey:"info"},{value:"debug",labelKey:"debug"},{value:"trace",labelKey:"trace"}];function B(){const{t}=F(),{pushToast:o}=q(),r=K(["config","info"],{url:"/api/config/info",method:"GET"}),[l,f]=d.useState(null),[u,N]=d.useState(""),[n,c]=d.useState({port:"",host:"",logRetentionDays:"",storePayloads:!0,logLevel:"info",requestLogging:!0}),[g,p]=d.useState({}),[x,h]=d.useState(!1),[k,y]=d.useState(!1),[v,j]=d.useState(!1),w=d.useMemo(()=>{if(!l)return null;const s=l.defaults;if(!s)return null;const a=[];return s.completion&&a.push(t("settings.defaults.completion",{model:s.completion})),s.reasoning&&a.push(t("settings.defaults.reasoning",{model:s.reasoning})),s.background&&a.push(t("settings.defaults.background",{model:s.background})),a.length>0?a.join(" | "):t("settings.defaults.none")},[l,t]);d.useEffect(()=>{r.data&&(f(r.data.config),N(r.data.path),c({port:String(r.data.config.port??""),host:r.data.config.host??"",logRetentionDays:String(r.data.config.logRetentionDays??30),storePayloads:r.data.config.storePayloads!==!1,logLevel:r.data.config.logLevel??"info",requestLogging:r.data.config.requestLogging!==!1}))},[r.data]),d.useEffect(()=>{r.isError&&r.error&&o({title:t("settings.toast.loadFailure",{message:r.error.message}),variant:"error"})},[r.isError,r.error,o,t]);const b=s=>a=>{c(i=>({...i,[s]:a}))},L=()=>{const s={},a=Number(n.port);(!Number.isFinite(a)||a<1||a>65535)&&(s.port=t("settings.validation.port"));const i=Number(n.logRetentionDays);return(!Number.isFinite(i)||i<1||i>365)&&(s.logRetentionDays=t("settings.validation.retention")),p(s),Object.keys(s).length===0},C=async()=>{if(!l){o({title:t("settings.toast.loadFailure",{message:t("settings.toast.missingConfig")}),variant:"error"});return}if(L()){h(!0);try{const s=Number(n.port),a=Number(n.logRetentionDays),i={...l,port:s,host:n.host.trim()||void 0,logRetentionDays:a,storePayloads:n.storePayloads,logLevel:n.logLevel,requestLogging:n.requestLogging};await m.put("/api/config",i),f(i),o({title:t("settings.toast.saveSuccess"),variant:"success"}),r.refetch()}catch(s){o({title:t("settings.toast.saveFailure",{message:s instanceof Error?s.message:"unknown"}),variant:"error"})}finally{h(!1)}}},S=()=>{l&&(c({port:String(l.port??""),host:l.host??"",logRetentionDays:String(l.logRetentionDays??30),storePayloads:l.storePayloads!==!1,logLevel:l.logLevel??"info",requestLogging:l.requestLogging!==!1}),p({}))},P=async()=>{if(!u){o({title:t("settings.toast.copyFailure",{message:t("settings.file.unknown")}),variant:"error"});return}try{await navigator.clipboard.writeText(u),o({title:t("settings.toast.copySuccess"),variant:"success"})}catch(s){o({title:t("settings.toast.copyFailure",{message:s instanceof Error?s.message:"unknown"}),variant:"error"})}},R=async()=>{y(!0);try{const a=(await m.post("/api/logs/cleanup")).data.deleted??0;o({title:a>0?t("settings.toast.cleanupSuccess",{count:a}):t("settings.toast.cleanupNone"),variant:"success"})}catch(s){o({title:t("settings.toast.cleanupFailure",{message:s instanceof Error?s.message:"unknown"}),variant:"error"})}finally{y(!1)}},E=async()=>{j(!0);try{const s=await m.post("/api/logs/clear"),{deleted:a,metricsCleared:i}=s.data;o({title:t("settings.toast.clearAllSuccess",{logs:a,metrics:i}),variant:"success"})}catch(s){o({title:t("settings.toast.clearAllFailure",{message:s instanceof Error?s.message:"unknown"}),variant:"error"})}finally{j(!1)}},D=r.isPending||!l&&r.isFetching;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsxs("header",{className:"flex flex-col gap-2",children:[e.jsx("h1",{className:"text-2xl font-semibold",children:t("settings.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:t("settings.description")})]}),D?e.jsx("section",{className:"rounded-lg border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900",children:e.jsx(A,{})}):l?e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"space-y-6 rounded-lg border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h2",{className:"text-lg font-semibold",children:t("settings.sections.basics")}),e.jsxs("div",{className:"flex gap-2 text-sm",children:[e.jsx("button",{type:"button",onClick:S,className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",disabled:x,children:t("common.actions.reset")}),e.jsx("button",{type:"button",onClick:C,className:"rounded-md bg-blue-600 px-3 py-1 text-white transition hover:bg-blue-700 disabled:opacity-60",disabled:x,children:t(x?"common.actions.saving":"common.actions.save")})]})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.port")}),e.jsx("input",{type:"number",min:1,max:65535,value:n.port,onChange:s=>b("port")(s.target.value),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60","aria-invalid":!!g.port}),g.port?e.jsx("span",{className:"text-xs text-red-500",children:g.port}):null]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.host")}),e.jsx("input",{value:n.host,onChange:s=>b("host")(s.target.value),placeholder:t("settings.fields.hostPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.retention")}),e.jsx("input",{type:"number",min:1,max:365,value:n.logRetentionDays,onChange:s=>b("logRetentionDays")(s.target.value),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60","aria-invalid":!!g.logRetentionDays}),g.logRetentionDays?e.jsx("span",{className:"text-xs text-red-500",children:g.logRetentionDays}):null]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.logLevel")}),e.jsx("select",{value:n.logLevel,onChange:s=>c(a=>({...a,logLevel:s.target.value})),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40",children:T.map(s=>e.jsx("option",{value:s.value,children:t(`settings.fields.logLevelOption.${s.labelKey}`)},s.value))})]}),e.jsxs("label",{className:"flex items-center gap-3 rounded-md border border-slate-200 bg-slate-50 p-3 text-sm dark:border-slate-700 dark:bg-slate-800/60",children:[e.jsx("input",{type:"checkbox",checked:n.storePayloads,onChange:s=>c(a=>({...a,storePayloads:s.target.checked})),className:"h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-500 dark:border-slate-600"}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"font-medium text-slate-700 dark:text-slate-200",children:t("settings.fields.storePayloads")}),e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.storePayloadsHint")})]})]}),e.jsxs("label",{className:"flex items-center gap-3 rounded-md border border-slate-200 bg-slate-50 p-3 text-sm dark:border-slate-700 dark:bg-slate-800/60",children:[e.jsx("input",{type:"checkbox",checked:n.requestLogging,onChange:s=>c(a=>({...a,requestLogging:s.target.checked})),className:"h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-500 dark:border-slate-600"}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"font-medium text-slate-700 dark:text-slate-200",children:t("settings.fields.requestLogging")}),e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.requestLoggingHint")})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.defaults")}),e.jsx("p",{className:"rounded-md border border-slate-200 bg-slate-50 px-3 py-2 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-800/60 dark:text-slate-300",children:w??t("settings.defaults.none")})]})]})]}),e.jsxs("section",{className:"grid gap-4 rounded-lg border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900 md:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:t("settings.sections.configFile")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.file.description")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"flex-1 break-all rounded-md bg-slate-100 px-3 py-2 text-xs text-slate-600 dark:bg-slate-800 dark:text-slate-200",children:u||t("settings.file.unknown")}),e.jsx("button",{type:"button",onClick:P,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:t("common.actions.copy")})]})]}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:t("settings.sections.cleanup")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.cleanup.description")}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("button",{type:"button",onClick:R,className:"w-fit rounded-md border border-red-200 px-4 py-2 text-sm text-red-600 transition hover:bg-red-50 dark:border-red-800 dark:text-red-300 dark:hover:bg-red-900/40",disabled:k,children:t(k?"common.actions.cleaning":"common.actions.cleanup")}),e.jsx("button",{type:"button",onClick:E,className:"w-fit rounded-md border border-red-200 px-4 py-2 text-sm text-red-600 transition hover:bg-red-50 dark:border-red-800 dark:text-red-300 dark:hover:bg-red-900/40",disabled:v,children:t(v?"settings.cleanup.clearingAll":"settings.cleanup.clearAll")})]}),e.jsx("p",{className:"text-xs text-red-500 dark:text-red-300",children:t("settings.cleanup.clearAllWarning")})]})]})]}):e.jsx("section",{className:"flex min-h-[200px] items-center justify-center rounded-lg border border-slate-200 bg-white p-6 text-sm text-red-500 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:t("settings.toast.missingConfig")})]})}export{B as default};
|
|
1
|
+
import{u as F,a as q,r as d,j as e,L as A}from"./index-B_Unl5wz.js";import{u as K,a as m}from"./useApiQuery-DZqtpbk3.js";const T=[{value:"fatal",labelKey:"fatal"},{value:"error",labelKey:"error"},{value:"warn",labelKey:"warn"},{value:"info",labelKey:"info"},{value:"debug",labelKey:"debug"},{value:"trace",labelKey:"trace"}];function B(){const{t}=F(),{pushToast:o}=q(),r=K(["config","info"],{url:"/api/config/info",method:"GET"}),[l,f]=d.useState(null),[u,N]=d.useState(""),[n,c]=d.useState({port:"",host:"",logRetentionDays:"",storePayloads:!0,logLevel:"info",requestLogging:!0}),[g,p]=d.useState({}),[x,h]=d.useState(!1),[k,y]=d.useState(!1),[v,j]=d.useState(!1),w=d.useMemo(()=>{if(!l)return null;const s=l.defaults;if(!s)return null;const a=[];return s.completion&&a.push(t("settings.defaults.completion",{model:s.completion})),s.reasoning&&a.push(t("settings.defaults.reasoning",{model:s.reasoning})),s.background&&a.push(t("settings.defaults.background",{model:s.background})),a.length>0?a.join(" | "):t("settings.defaults.none")},[l,t]);d.useEffect(()=>{r.data&&(f(r.data.config),N(r.data.path),c({port:String(r.data.config.port??""),host:r.data.config.host??"",logRetentionDays:String(r.data.config.logRetentionDays??30),storePayloads:r.data.config.storePayloads!==!1,logLevel:r.data.config.logLevel??"info",requestLogging:r.data.config.requestLogging!==!1}))},[r.data]),d.useEffect(()=>{r.isError&&r.error&&o({title:t("settings.toast.loadFailure",{message:r.error.message}),variant:"error"})},[r.isError,r.error,o,t]);const b=s=>a=>{c(i=>({...i,[s]:a}))},L=()=>{const s={},a=Number(n.port);(!Number.isFinite(a)||a<1||a>65535)&&(s.port=t("settings.validation.port"));const i=Number(n.logRetentionDays);return(!Number.isFinite(i)||i<1||i>365)&&(s.logRetentionDays=t("settings.validation.retention")),p(s),Object.keys(s).length===0},C=async()=>{if(!l){o({title:t("settings.toast.loadFailure",{message:t("settings.toast.missingConfig")}),variant:"error"});return}if(L()){h(!0);try{const s=Number(n.port),a=Number(n.logRetentionDays),i={...l,port:s,host:n.host.trim()||void 0,logRetentionDays:a,storePayloads:n.storePayloads,logLevel:n.logLevel,requestLogging:n.requestLogging};await m.put("/api/config",i),f(i),o({title:t("settings.toast.saveSuccess"),variant:"success"}),r.refetch()}catch(s){o({title:t("settings.toast.saveFailure",{message:s instanceof Error?s.message:"unknown"}),variant:"error"})}finally{h(!1)}}},S=()=>{l&&(c({port:String(l.port??""),host:l.host??"",logRetentionDays:String(l.logRetentionDays??30),storePayloads:l.storePayloads!==!1,logLevel:l.logLevel??"info",requestLogging:l.requestLogging!==!1}),p({}))},P=async()=>{if(!u){o({title:t("settings.toast.copyFailure",{message:t("settings.file.unknown")}),variant:"error"});return}try{await navigator.clipboard.writeText(u),o({title:t("settings.toast.copySuccess"),variant:"success"})}catch(s){o({title:t("settings.toast.copyFailure",{message:s instanceof Error?s.message:"unknown"}),variant:"error"})}},R=async()=>{y(!0);try{const a=(await m.post("/api/logs/cleanup")).data.deleted??0;o({title:a>0?t("settings.toast.cleanupSuccess",{count:a}):t("settings.toast.cleanupNone"),variant:"success"})}catch(s){o({title:t("settings.toast.cleanupFailure",{message:s instanceof Error?s.message:"unknown"}),variant:"error"})}finally{y(!1)}},E=async()=>{j(!0);try{const s=await m.post("/api/logs/clear"),{deleted:a,metricsCleared:i}=s.data;o({title:t("settings.toast.clearAllSuccess",{logs:a,metrics:i}),variant:"success"})}catch(s){o({title:t("settings.toast.clearAllFailure",{message:s instanceof Error?s.message:"unknown"}),variant:"error"})}finally{j(!1)}},D=r.isPending||!l&&r.isFetching;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsxs("header",{className:"flex flex-col gap-2",children:[e.jsx("h1",{className:"text-2xl font-semibold",children:t("settings.title")}),e.jsx("p",{className:"text-sm text-slate-500 dark:text-slate-400",children:t("settings.description")})]}),D?e.jsx("section",{className:"rounded-lg border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900",children:e.jsx(A,{})}):l?e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"space-y-6 rounded-lg border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h2",{className:"text-lg font-semibold",children:t("settings.sections.basics")}),e.jsxs("div",{className:"flex gap-2 text-sm",children:[e.jsx("button",{type:"button",onClick:S,className:"rounded-md border border-slate-200 px-3 py-1 transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",disabled:x,children:t("common.actions.reset")}),e.jsx("button",{type:"button",onClick:C,className:"rounded-md bg-blue-600 px-3 py-1 text-white transition hover:bg-blue-700 disabled:opacity-60",disabled:x,children:t(x?"common.actions.saving":"common.actions.save")})]})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.port")}),e.jsx("input",{type:"number",min:1,max:65535,value:n.port,onChange:s=>b("port")(s.target.value),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60","aria-invalid":!!g.port}),g.port?e.jsx("span",{className:"text-xs text-red-500",children:g.port}):null]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.host")}),e.jsx("input",{value:n.host,onChange:s=>b("host")(s.target.value),placeholder:t("settings.fields.hostPlaceholder"),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60"})]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.retention")}),e.jsx("input",{type:"number",min:1,max:365,value:n.logRetentionDays,onChange:s=>b("logRetentionDays")(s.target.value),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:bg-slate-100 disabled:text-slate-400 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40 dark:disabled:bg-slate-800/60","aria-invalid":!!g.logRetentionDays}),g.logRetentionDays?e.jsx("span",{className:"text-xs text-red-500",children:g.logRetentionDays}):null]}),e.jsxs("label",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.logLevel")}),e.jsx("select",{value:n.logLevel,onChange:s=>c(a=>({...a,logLevel:s.target.value})),className:"rounded-md border border-slate-200 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200 dark:border-slate-700 dark:bg-slate-800 dark:focus:border-blue-400 dark:focus:ring-blue-400/40",children:T.map(s=>e.jsx("option",{value:s.value,children:t(`settings.fields.logLevelOption.${s.labelKey}`)},s.value))})]}),e.jsxs("label",{className:"flex items-center gap-3 rounded-md border border-slate-200 bg-slate-50 p-3 text-sm dark:border-slate-700 dark:bg-slate-800/60",children:[e.jsx("input",{type:"checkbox",checked:n.storePayloads,onChange:s=>c(a=>({...a,storePayloads:s.target.checked})),className:"h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-500 dark:border-slate-600"}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"font-medium text-slate-700 dark:text-slate-200",children:t("settings.fields.storePayloads")}),e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.storePayloadsHint")})]})]}),e.jsxs("label",{className:"flex items-center gap-3 rounded-md border border-slate-200 bg-slate-50 p-3 text-sm dark:border-slate-700 dark:bg-slate-800/60",children:[e.jsx("input",{type:"checkbox",checked:n.requestLogging,onChange:s=>c(a=>({...a,requestLogging:s.target.checked})),className:"h-4 w-4 rounded border-slate-300 text-blue-600 focus:ring-blue-500 dark:border-slate-600"}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"font-medium text-slate-700 dark:text-slate-200",children:t("settings.fields.requestLogging")}),e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.requestLoggingHint")})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.fields.defaults")}),e.jsx("p",{className:"rounded-md border border-slate-200 bg-slate-50 px-3 py-2 text-xs text-slate-600 dark:border-slate-700 dark:bg-slate-800/60 dark:text-slate-300",children:w??t("settings.defaults.none")})]})]})]}),e.jsxs("section",{className:"grid gap-4 rounded-lg border border-slate-200 bg-white p-6 shadow-sm dark:border-slate-800 dark:bg-slate-900 md:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:t("settings.sections.configFile")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.file.description")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"flex-1 break-all rounded-md bg-slate-100 px-3 py-2 text-xs text-slate-600 dark:bg-slate-800 dark:text-slate-200",children:u||t("settings.file.unknown")}),e.jsx("button",{type:"button",onClick:P,className:"rounded-md border border-slate-200 px-3 py-1 text-sm transition hover:bg-slate-100 dark:border-slate-700 dark:hover:bg-slate-800",children:t("common.actions.copy")})]})]}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:t("settings.sections.cleanup")}),e.jsx("p",{className:"text-xs text-slate-500 dark:text-slate-400",children:t("settings.cleanup.description")}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("button",{type:"button",onClick:R,className:"w-fit rounded-md border border-red-200 px-4 py-2 text-sm text-red-600 transition hover:bg-red-50 dark:border-red-800 dark:text-red-300 dark:hover:bg-red-900/40",disabled:k,children:t(k?"common.actions.cleaning":"common.actions.cleanup")}),e.jsx("button",{type:"button",onClick:E,className:"w-fit rounded-md border border-red-200 px-4 py-2 text-sm text-red-600 transition hover:bg-red-50 dark:border-red-800 dark:text-red-300 dark:hover:bg-red-900/40",disabled:v,children:t(v?"settings.cleanup.clearingAll":"settings.cleanup.clearAll")})]}),e.jsx("p",{className:"text-xs text-red-500 dark:text-red-300",children:t("settings.cleanup.clearAllWarning")})]})]})]}):e.jsx("section",{className:"flex min-h-[200px] items-center justify-center rounded-lg border border-slate-200 bg-white p-6 text-sm text-red-500 shadow-sm dark:border-slate-800 dark:bg-slate-900",children:t("settings.toast.missingConfig")})]})}export{B as default};
|