@chenpu17/cc-gw 0.8.13 → 0.8.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/web/dist/assets/{About-BtrUwqVl.js → About-BGBg2q_J.js} +1 -1
- package/src/web/dist/assets/{ApiKeys-BgtU9Z5t.js → ApiKeys-DUuKvZ5b.js} +1 -1
- package/src/web/dist/assets/{ConfirmDialog-BHrsB4gR.js → ConfirmDialog-BHfhtrze.js} +1 -1
- package/src/web/dist/assets/{Dashboard-DIguazuF.js → Dashboard-DZdfzGEK.js} +1 -1
- package/src/web/dist/assets/{DialogShell-DcG-SXEV.js → DialogShell-BpzUpswv.js} +1 -1
- package/src/web/dist/assets/{Events-mZNIWc7c.js → Events-9Yq8nG75.js} +1 -1
- package/src/web/dist/assets/Help-qSGvYIjs.js +5 -0
- package/src/web/dist/assets/{Login-DugtPFxy.js → Login-CJwzn0Sh.js} +1 -1
- package/src/web/dist/assets/{Logs-BJBm-efJ.js → Logs--D9Xm5KV.js} +1 -1
- package/src/web/dist/assets/ModelManagement-zi8mFqEf.js +1 -0
- package/src/web/dist/assets/{PageHeader--Lg_YQVw.js → PageHeader-DLI9m-gU.js} +1 -1
- package/src/web/dist/assets/{PageSection-DIAhP18t.js → PageSection-Mw-tAM8I.js} +1 -1
- package/src/web/dist/assets/{PageState-DKba6Ew1.js → PageState-Bb3fEov-.js} +1 -1
- package/src/web/dist/assets/{Profiler-DTPqRwx7.js → Profiler-D6Akb9_x.js} +1 -1
- package/src/web/dist/assets/RoutingManagement-CeIC-QD2.js +1 -0
- package/src/web/dist/assets/{Settings-Ddx0C5eQ.js → Settings-G5Pswxtq.js} +1 -1
- package/src/web/dist/assets/{Skeleton-cyuMRxwQ.js → Skeleton-DEv_MFPR.js} +1 -1
- package/src/web/dist/assets/app-CfipX5HX.js +61 -0
- package/src/web/dist/assets/{card-CwTuH2Iq.js → card-BE_b5SvI.js} +1 -1
- package/src/web/dist/assets/{charts-core-D9OugzV_.js → charts-core-DzWzxST6.js} +1 -1
- package/src/web/dist/assets/{charts-engine-DleyglMn.js → charts-engine-Ds7lwC51.js} +1 -1
- package/src/web/dist/assets/{charts-react-BqhUp1x_.js → charts-react-D0nWbUCA.js} +1 -1
- package/src/web/dist/assets/{gateway-CExOTXeI.js → gateway-Zpcl3bpd.js} +1 -1
- package/src/web/dist/assets/global-D8jT4xUX.css +1 -0
- package/src/web/dist/assets/{global-CKvMKvrn.js → global-xoXYOIOz.js} +1 -1
- package/src/web/dist/assets/{i18n-B3N4Df3E.js → i18n-Bl2BcCDG.js} +1 -1
- package/src/web/dist/assets/{input-scp9nKJc.js → input-Brr3avKW.js} +1 -1
- package/src/web/dist/assets/{label-fMXEnAEx.js → label-Bc4vkpLF.js} +1 -1
- package/src/web/dist/assets/landing-D9E0GJD9.js +17 -0
- package/src/web/dist/assets/live-en-api-keys-Bx8N-eoh.png +0 -0
- package/src/web/dist/assets/live-en-dashboard-CJoX7IQT.png +0 -0
- package/src/web/dist/assets/live-en-events-DJwaP-WW.png +0 -0
- package/src/web/dist/assets/live-en-logs-BGGL53ab.png +0 -0
- package/src/web/dist/assets/live-en-model-management-BpjNblfR.png +0 -0
- package/src/web/dist/assets/package-GpB9DOR2.js +1 -0
- package/src/web/dist/assets/{popover-BGSWKBlu.js → popover-D8l2FwYm.js} +1 -1
- package/src/web/dist/assets/{query-Cpxr1dul.js → query-BbGWgOFk.js} +1 -1
- package/src/web/dist/assets/{queryKeys-DTnZc8Yy.js → queryKeys-DifG1fTh.js} +1 -1
- package/src/web/dist/assets/{radix-bG5h1Ymq.js → radix-mHySgtou.js} +1 -1
- package/src/web/dist/assets/{router-DspBTS8b.js → router-CL3rf_uf.js} +1 -1
- package/src/web/dist/assets/{select-BjYpeVvo.js → select-zM5TPRdZ.js} +1 -1
- package/src/web/dist/assets/{switch-CgwYcn5P.js → switch-fb9u33D-.js} +1 -1
- package/src/web/dist/assets/{table-BtnjYcvG.js → table-BpLpq7tJ.js} +1 -1
- package/src/web/dist/assets/{useApiQuery-jSeDDFuv.js → useApiQuery-DCgUtGKI.js} +1 -1
- package/src/web/dist/assets/{useAppMutation-ChCrgiP6.js → useAppMutation-BjZN2gaQ.js} +1 -1
- package/src/web/dist/assets/useModelManagementState-1NXqPQ5M.js +1 -0
- package/src/web/dist/assets/{vendor-LWJeAdU1.js → vendor-z22RpOY0.js} +86 -66
- package/src/web/dist/index.html +8 -8
- package/src/web/dist/landing.html +11 -11
- package/src/web/dist/assets/Help-BHbnZJeo.js +0 -5
- package/src/web/dist/assets/ModelManagement-C32W7nDe.js +0 -1
- package/src/web/dist/assets/RoutingManagement-B9Z0l4LZ.js +0 -1
- package/src/web/dist/assets/app-BG16DmZH.js +0 -61
- package/src/web/dist/assets/global-CUpRxoFd.css +0 -1
- package/src/web/dist/assets/landing-CHY6qfgq.js +0 -5
- package/src/web/dist/assets/package-BMIMFcQR.js +0 -1
- package/src/web/dist/assets/useModelManagementState-9RhvWh8Y.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as n,j as e,
|
|
1
|
+
import{r as n,j as e,aB as S,aV as E}from"./vendor-z22RpOY0.js";import{h as k,L as F,B as L}from"./app-CfipX5HX.js";import{C as j,a as N,b as B,c as P,d as T,e as A}from"./card-BE_b5SvI.js";import{I as b}from"./input-Brr3avKW.js";import{L as y}from"./label-Bc4vkpLF.js";import{u as D}from"./i18n-Bl2BcCDG.js";import{c as G,u as I}from"./router-CL3rf_uf.js";import"./global-xoXYOIOz.js";import"./query-BbGWgOFk.js";import"./radix-mHySgtou.js";function O(){const{t:s}=D(),a=G(),l=I(),{authEnabled:o,isAuthenticated:u,loading:c,login:v,error:x}=k(),[i,p]=n.useState({username:"",password:""}),[h,m]=n.useState(null),[f,g]=n.useState(!1),d=n.useMemo(()=>{var r;const t=l.state;return((r=t==null?void 0:t.from)==null?void 0:r.pathname)??"/"},[l.state]);n.useEffect(()=>{if(!o&&!c){a(d,{replace:!0});return}o&&u&&!c&&a(d,{replace:!0})},[o,d,u,c,a]);const C=async t=>{if(t.preventDefault(),m(null),!i.username.trim()||!i.password){m(s("login.validation.required"));return}g(!0);try{await v(i.username.trim(),i.password),a(d,{replace:!0})}catch(r){m(r instanceof Error?r.message:s("login.validation.failed"))}finally{g(!1)}};return c?e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-background px-4",children:e.jsx(j,{className:"w-full max-w-md",children:e.jsx(N,{className:"flex min-h-[320px] items-center justify-center",children:e.jsx(F,{})})})}):o?e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-background px-4 py-10",children:e.jsxs("div",{className:"mx-auto grid w-full max-w-5xl items-center gap-8 lg:grid-cols-[minmax(0,1fr)_minmax(400px,0.8fr)]",children:[e.jsx("div",{className:"hidden lg:block",children:e.jsxs("div",{className:"max-w-lg space-y-6",children:[e.jsx("div",{className:"inline-flex items-center gap-1.5 rounded-full bg-primary/10 px-3 py-1 text-xs font-semibold text-primary",children:"Secure Gateway Control"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h1",{className:"text-4xl font-semibold tracking-tight text-foreground",children:s("login.title")}),e.jsx("p",{className:"max-w-md text-base leading-7 text-muted-foreground",children:s("login.description")})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsx(w,{icon:e.jsx(S,{className:"h-5 w-5","aria-hidden":"true"}),title:s("login.hint"),description:s("about.support.tip")}),e.jsx(w,{icon:e.jsx(E,{className:"h-5 w-5","aria-hidden":"true"}),title:"Session protected",description:s("help.note")})]})]})}),e.jsxs(j,{className:"w-full",children:[e.jsxs(B,{className:"pb-4 text-center",children:[e.jsx("div",{className:"mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-xl bg-primary text-sm font-bold text-primary-foreground",children:"GW"}),e.jsx(P,{className:"text-xl",children:s("login.title")}),e.jsx(T,{children:s("login.description")})]}),e.jsx(N,{children:e.jsxs("form",{className:"space-y-4",onSubmit:C,children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(y,{htmlFor:"username",children:s("login.fields.username")}),e.jsx(b,{id:"username",value:i.username,autoComplete:"username",autoFocus:!0,onChange:t=>p(r=>({...r,username:t.target.value})),placeholder:s("login.fields.usernamePlaceholder")})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(y,{htmlFor:"password",children:s("login.fields.password")}),e.jsx(b,{id:"password",type:"password",value:i.password,autoComplete:"current-password",onChange:t=>p(r=>({...r,password:t.target.value})),placeholder:s("login.fields.passwordPlaceholder")})]}),h||x?e.jsx("div",{className:"rounded-lg bg-destructive/10 px-4 py-3 text-sm text-destructive",children:h||x}):null,e.jsx(L,{type:"submit",className:"w-full",disabled:f,children:s(f?"common.actions.loading":"login.actions.submit")})]})}),e.jsx(A,{className:"justify-center pt-2",children:e.jsx("p",{className:"text-center text-xs text-muted-foreground",children:s("login.hint")})})]})]})}):null}function w({description:s,icon:a,title:l}){return e.jsxs("div",{className:"rounded-lg bg-card px-4 py-4 shadow-[var(--surface-shadow)]",children:[e.jsx("div",{className:"flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10 text-primary",children:a}),e.jsx("p",{className:"mt-3 text-sm font-semibold text-foreground",children:l}),e.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:s})]})}export{O as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as m,j as e,au as Ze,af as Ye,a7 as et,av as tt,at as st,U as lt,P as Ee}from"./vendor-LWJeAdU1.js";import{P as at}from"./PageHeader--Lg_YQVw.js";import{c as j}from"./global-CKvMKvrn.js";import{B as _,b as rt,u as fe,s as D,t as ot,a as K}from"./app-BG16DmZH.js";import{B as A,q as V}from"./queryKeys-DTnZc8Yy.js";import{C as De,a as Fe}from"./card-CwTuH2Iq.js";import{I as xe}from"./input-scp9nKJc.js";import{L as U}from"./label-fMXEnAEx.js";import{S as te,a as se,b as le,c as ae,d as M}from"./select-BjYpeVvo.js";import{u as P}from"./i18n-B3N4Df3E.js";import{D as it,A as nt,a as dt,b as ct,c as pt,d as ut}from"./DialogShell-DcG-SXEV.js";import{P as mt,a as re}from"./PageState-DKba6Ew1.js";import{c as xt}from"./clipboard-CALi6bTW.js";import{u as B}from"./useApiQuery-jSeDDFuv.js";import{g as Te,f as gt,a as q,b as Re,c as ft,d as Q,e as ht}from"./utils-DSaa7c6v.js";import{P as yt,a as bt,b as jt}from"./popover-BGSWKBlu.js";import{L as vt}from"./router-DspBTS8b.js";import{T as wt}from"./Skeleton-cyuMRxwQ.js";import{u as Nt}from"./query-Cpxr1dul.js";import{g as Ce}from"./gateway-CExOTXeI.js";import"./radix-bG5h1Ymq.js";function kt({apiKeys:l,selected:t,onChange:d,disabled:r,className:c}){const{t:s}=P(),[o,h]=m.useState(!1),x=m.useRef(null);m.useEffect(()=>{if(!o)return;const n=a=>{var i;(i=x.current)!=null&&i.contains(a.target)||h(!1)};return window.addEventListener("mousedown",n),()=>window.removeEventListener("mousedown",n)},[o]);const f=m.useMemo(()=>{if(t.length===0)return[];const n=new Map;for(const a of l)n.set(a.id,a);return t.map(a=>{const i=n.get(a);return i?i.isWildcard?s("apiKeys.wildcard"):i.name:null}).filter(a=>!!a)},[l,t,s]),y=t.length===0?s("logs.filters.apiKeyAll"):s("logs.filters.apiKeySelected",{count:t.length}),g=n=>{t.includes(n)?d(t.filter(a=>a!==n)):d([...t,n])};return e.jsxs("div",{className:j("relative space-y-2",c),ref:x,children:[e.jsx(U,{children:s("logs.filters.apiKey")}),e.jsxs("button",{type:"button",onClick:()=>h(n=>!n),disabled:r||l.length===0,title:s("logs.filters.apiKeyHint"),className:j("flex h-10 w-full items-center justify-between rounded-lg border border-input bg-background px-3 text-sm ring-offset-background transition-all focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",t.length>0&&"border-primary",o&&"ring-2 ring-ring ring-offset-2"),children:[e.jsxs("span",{className:"truncate",children:[y,f.length>0&&e.jsx("span",{className:"ml-1 text-xs text-muted-foreground",children:f.join(", ")})]}),e.jsx("svg",{className:j("h-4 w-4 opacity-50 transition-transform",o&&"rotate-180"),viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.71a.75.75 0 111.06 1.06l-4.24 4.25a.75.75 0 01-1.06 0L5.21 8.29a.75.75 0 01.02-1.08z",clipRule:"evenodd"})})]}),o&&e.jsxs("div",{className:"absolute left-0 top-full z-30 mt-2 w-64 rounded-lg border bg-popover p-2 shadow-[var(--surface-shadow-lg)]",children:[e.jsxs("div",{className:"flex items-center justify-between rounded-lg bg-secondary px-3 py-2 text-xs",children:[e.jsx("span",{children:y}),e.jsx("button",{type:"button",onClick:()=>d([]),disabled:t.length===0,className:"text-primary hover:underline disabled:opacity-40",children:s("common.actions.reset")})]}),e.jsxs("div",{className:"max-h-56 overflow-y-auto py-2",children:[l.map(n=>{const a=n.isWildcard?s("apiKeys.wildcard"):n.name,i=t.includes(n.id);return e.jsxs("label",{className:j("flex cursor-pointer items-center gap-3 rounded-xl px-3 py-2 text-sm transition hover:bg-primary/5",i&&"bg-primary/10 text-primary"),children:[e.jsx("input",{type:"checkbox",className:"h-4 w-4 rounded border-border",checked:i,onChange:()=>g(n.id)}),e.jsx("span",{className:"truncate",children:a})]},n.id)}),l.length===0&&e.jsx("p",{className:"px-2 py-2 text-xs text-muted-foreground",children:s("logs.filters.apiKeyAll")})]})]})]})}function St(l){const{t}=P(),{total:d,activeFilters:r,filtersExpanded:c,setFiltersExpanded:s,handleResetFilters:o,activeQuickView:h,applyQuickView:x,providerFilter:f,setProviderFilter:y,endpointFilter:g,setEndpointFilter:n,selectedApiKeys:a,setSelectedApiKeys:i,modelFilter:N,setModelFilter:u,statusFilter:E,setStatusFilter:k,fromDate:C,setFromDate:F,toDate:w,setToDate:L,providerOptions:S,apiKeys:G,apiKeysLoading:ie,customEndpoints:J}=l;return e.jsx(De,{"data-testid":"logs-filters-card",className:"overflow-hidden rounded-[1.25rem] border border-white/70 bg-card/95 shadow-[0_20px_50px_-42px_rgba(15,23,42,0.24)]",children:e.jsxs(Fe,{className:"space-y-3 p-4",children:[e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("p",{className:"text-sm font-semibold text-foreground",children:t("logs.filtersTitle")}),e.jsx(A,{variant:"secondary",className:"rounded-full px-2.5 py-0.5 text-[11px] font-semibold",children:t("logs.summary.total",{value:d.toLocaleString()})}),r.length>0&&e.jsx(A,{variant:"outline",className:"rounded-full border-transparent bg-primary/10 px-2.5 py-0.5 text-[11px] font-semibold text-primary",children:t("common.filters.activeCount",{count:r.length})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t("logs.filtersDescription")})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[r.length>0&&e.jsx(_,{variant:"ghost",size:"sm",onClick:o,className:"h-8 rounded-full px-3 text-xs",children:t("common.actions.reset")}),e.jsx(_,{variant:"ghost",size:"sm",onClick:()=>s(b=>!b),className:"h-8 rounded-full px-3 text-xs",children:c?e.jsxs(e.Fragment,{children:[t("common.filters.collapse"),e.jsx(Ze,{className:"ml-1 h-4 w-4"})]}):e.jsxs(e.Fragment,{children:[t("common.filters.expand"),e.jsx(Ye,{className:"ml-1 h-4 w-4"})]})})]})]}),e.jsxs("div",{className:"grid gap-2 lg:grid-cols-[minmax(0,1fr)_auto]",children:[e.jsx("div",{className:"flex min-h-10 items-center rounded-[0.9rem] bg-secondary/70 px-3 py-2",children:r.length>0?e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:r.map(b=>e.jsxs(A,{variant:"outline",role:"button",tabIndex:0,className:"flex cursor-pointer items-center gap-1 rounded-full border border-border bg-card/90 px-2.5 py-1 text-[11px] font-semibold text-foreground/90 transition hover:bg-secondary/80",onClick:b.onRemove,onKeyDown:X=>{(X.key==="Enter"||X.key===" ")&&(X.preventDefault(),b.onRemove())},children:[b.label,e.jsx(et,{className:"h-3 w-3","aria-hidden":"true"})]},b.key))}):e.jsx("span",{className:"text-xs text-muted-foreground",children:t("common.filters.allRequests")})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 lg:justify-end",children:[e.jsx(ge,{label:t("logs.filters.apiKey"),value:a.length.toString()}),e.jsx(ge,{label:t("logs.filters.provider"),value:f==="all"?"0":"1"}),e.jsx(ge,{label:t("logs.filters.endpoint"),value:g==="all"?"0":"1"})]})]}),e.jsx("div",{className:"flex flex-wrap items-center gap-1.5 rounded-[0.9rem] bg-secondary/70 px-2 py-1.5",children:["all","errors","today","anthropic","openai"].map(b=>e.jsx(_,{variant:"ghost",size:"sm",className:j("h-7 rounded-full px-3 text-[11px] font-semibold transition-colors",h===b?"bg-card text-foreground shadow-[0_12px_28px_-24px_rgba(15,23,42,0.32)]":"text-muted-foreground"),onClick:()=>x(b),children:t(`logs.quickViews.${b}`)},b))})]}),c&&e.jsxs("div",{className:"mt-3 grid gap-3 rounded-[1rem] bg-secondary/45 p-3 md:grid-cols-2 xl:grid-cols-4 animate-in fade-in slide-in-from-top-2 duration-200",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.provider")}),e.jsxs(te,{value:f,onValueChange:y,children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(M,{value:"all",children:t("logs.filters.providerAll")}),S.map(b=>e.jsx(M,{value:b.id,children:b.label??b.id},b.id))]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.endpoint")}),e.jsxs(te,{value:g,onValueChange:n,children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(M,{value:"all",children:t("logs.filters.endpointAll")}),e.jsx(M,{value:"anthropic",children:t("logs.filters.endpointAnthropic")}),e.jsx(M,{value:"openai",children:t("logs.filters.endpointOpenAI")}),J==null?void 0:J.map(b=>e.jsx(M,{value:b.id,children:b.label||b.id},b.id))]})]})]}),e.jsx(kt,{className:"md:col-span-2",apiKeys:G,selected:a,disabled:ie,onChange:i}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.modelId")}),e.jsx(xe,{value:N,onChange:b=>u(b.target.value),placeholder:t("logs.filters.modelPlaceholder")})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.status")}),e.jsxs(te,{value:E,onValueChange:b=>k(b),children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(M,{value:"all",children:t("logs.filters.statusAll")}),e.jsx(M,{value:"success",children:t("logs.filters.statusSuccess")}),e.jsx(M,{value:"error",children:t("logs.filters.statusError")})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.startDate")}),e.jsx(xe,{type:"date",value:C,onChange:b=>F(b.target.value)})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.endDate")}),e.jsx(xe,{type:"date",value:w,onChange:b=>L(b.target.value)})]})]})]})})}function ge({label:l,value:t}){return e.jsxs("div",{className:"inline-flex items-center gap-1.5 rounded-full border border-border/60 bg-card/92 px-2.5 py-1 text-[11px] text-muted-foreground shadow-[0_10px_24px_-22px_rgba(15,23,42,0.28)]",children:[e.jsx("span",{children:l}),e.jsx("span",{className:"metric-number font-semibold text-foreground",children:t})]})}const he={listRequest(l){return{url:"/api/logs",method:"GET",params:l}},detailRequest(l){return{url:l===null?"":`/api/logs/${l}`,method:"GET"}},async exportArchive(l,t){const d=await rt.post("/api/logs/export",l,{responseType:"blob",timeout:t});return new Blob([d.data],{type:"application/zip"})}};function Ct({apiKeyMap:l,logId:t,open:d,providerLabelMap:r}){var n;const{t:c}=P(),{pushToast:s}=fe(),o=B(V.logs.detail(t),he.detailRequest(t),{enabled:d&&t!==null,staleTime:3e4,gcTime:15e3,placeholderData:void 0});m.useEffect(()=>{!o.isError||!o.error||s({title:c("logs.detail.loadError"),description:o.error.message,variant:"error"})},[o.error,o.isError,s,c]);const h=m.useCallback(async(a,i,N)=>{if(!i){s({title:c("logs.detail.copy.empty",{label:a}),variant:"info"});return}try{await xt(i),s({title:c(N),variant:"success"})}catch(u){s({title:c("logs.detail.copy.failure"),description:u instanceof Error?u.message:c("logs.detail.copy.failureFallback"),variant:"error"})}},[s,c]),x=o.data,f=x?r.get(x.provider)??x.provider:"",y=x&&x.api_key_id!=null?l.get(x.api_key_id):void 0,g=x?Te(x,c):null;return{apiKeyMeta:y,errorMessage:o.isError?((n=o.error)==null?void 0:n.message)??null:null,handleCopy:h,isError:o.isError,isPending:o.isPending,providerLabel:f,refetch:o.refetch,record:x,statusMeta:g}}function _t({open:l,logId:t,onClose:d,providerLabelMap:r,apiKeyMap:c}){var u,E;const{t:s}=P(),{apiKeyMeta:o,errorMessage:h,handleCopy:x,isError:f,isPending:y,providerLabel:g,refetch:n,record:a,statusMeta:i}=Ct({apiKeyMap:c,logId:t,open:l,providerLabelMap:r}),N=m.useMemo(()=>{var C,F,w,L;return a?[{key:"client-request",title:s("logs.detail.payload.clientRequest"),value:((C=a.payload)==null?void 0:C.client_request)??null,emptyLabel:s("logs.detail.payload.emptyRequest"),copyToast:"logs.detail.copy.requestSuccess"},...(F=a.payload)!=null&&F.upstream_request?[{key:"upstream-request",title:s("logs.detail.payload.upstreamRequest"),value:a.payload.upstream_request,emptyLabel:s("logs.detail.payload.emptyRequest"),copyToast:"logs.detail.copy.requestSuccess"}]:[],...(w=a.payload)!=null&&w.upstream_response?[{key:"upstream-response",title:s("logs.detail.payload.upstreamResponse"),value:a.payload.upstream_response,emptyLabel:s("logs.detail.payload.emptyResponse"),copyToast:"logs.detail.copy.responseSuccess"}]:[],{key:"client-response",title:s("logs.detail.payload.clientResponse"),value:((L=a.payload)==null?void 0:L.client_response)??null,emptyLabel:s("logs.detail.payload.emptyResponse"),copyToast:"logs.detail.copy.responseSuccess"}].map(S=>({...S,displayValue:gt(S.value,S.emptyLabel)})):[]},[a,s]);return e.jsx(it,{open:l,onOpenChange:k=>{k||d()},children:e.jsxs(nt,{className:"w-[min(96vw,1200px)] max-w-[1200px]",children:[e.jsxs(dt,{className:"pr-14",children:[e.jsx(ct,{children:s("logs.detail.title")}),e.jsx(pt,{children:a?s("logs.detail.id",{id:a.id}):s("logs.detail.loadError")})]}),e.jsx(ut,{className:"max-h-[78vh]",children:y?e.jsx(mt,{compact:!0,className:"min-h-[240px]",label:s("common.loading")}):f?e.jsx(re,{compact:!0,className:"min-h-[240px]",tone:"danger",title:s("logs.detail.loadError"),description:h??s("common.unknownError"),action:e.jsx(_,{variant:"outline",onClick:()=>void n(),children:s("common.actions.refresh")})}):a?e.jsxs("div",{className:"space-y-6 text-sm",children:[e.jsxs("section",{className:"space-y-4 rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:s("logs.detail.infoSection")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 rounded-lg border bg-secondary p-3 text-xs",children:[e.jsx("span",{className:"font-medium",children:s("logs.detail.summary.route",{from:a.client_model??s("logs.detail.info.noRequestedModel"),to:a.model})}),e.jsx("span",{className:"text-muted-foreground",children:s("logs.detail.summary.latency",{value:q(a.latency_ms,s("common.units.ms"))})}),a.ttft_ms!==null?e.jsxs("span",{className:"text-muted-foreground",children:["TTFT: ",q(a.ttft_ms,s("common.units.ms"))]}):null]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(A,{variant:i==null?void 0:i.variant,children:(i==null?void 0:i.label)??"-"}),e.jsx(A,{variant:"outline",children:a.stream?s("logs.stream.streaming"):s("logs.stream.single")})]})]}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-4",children:[e.jsx(z,{label:s("logs.detail.info.latency"),value:q(a.latency_ms,s("common.units.ms"))}),e.jsx(z,{label:s("logs.detail.info.ttft"),value:q(a.ttft_ms,s("common.units.ms"))}),e.jsx(z,{label:s("logs.detail.info.tpot"),value:q(a.tpot_ms,s("common.units.msPerToken"))}),e.jsx(z,{label:s("logs.detail.info.status"),value:(i==null?void 0:i.label)??"-"})]}),e.jsxs("dl",{className:"grid gap-x-4 gap-y-3 md:grid-cols-2 xl:grid-cols-4",children:[e.jsx(R,{label:s("logs.detail.info.time"),value:Re(a.timestamp)}),e.jsx(R,{label:s("logs.detail.info.sessionId"),value:a.session_id??"-"}),e.jsx(R,{label:s("logs.detail.info.endpoint"),value:a.endpoint||"-"}),e.jsx(R,{label:s("logs.detail.info.provider"),value:g}),e.jsx(R,{label:s("logs.detail.info.requestedModel"),value:a.client_model??s("logs.detail.info.noRequestedModel")}),e.jsx(R,{label:s("logs.detail.info.model"),value:a.model}),e.jsx(R,{label:s("logs.detail.info.stream"),value:ft(a.stream)}),e.jsx(R,{label:s("logs.detail.info.status"),value:(i==null?void 0:i.label)??"-"})]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4",children:[e.jsx(z,{label:s("logs.detail.info.inputTokens"),value:Q(a.input_tokens)}),e.jsx(z,{label:s("logs.detail.info.cacheReadTokens"),value:Q(a.cache_read_tokens)}),e.jsx(z,{label:s("logs.detail.info.cacheCreationTokens"),value:Q(a.cache_creation_tokens)}),e.jsx(z,{label:s("logs.detail.info.outputTokens"),value:Q(a.output_tokens)})]}),a.error?e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:s("logs.detail.info.error")}),e.jsx("p",{className:"rounded-xl border border-destructive/50 bg-destructive/10 p-3 text-xs text-destructive",children:a.error})]}):null]}),e.jsxs("div",{className:"grid gap-6 xl:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",children:[e.jsxs("section",{className:"space-y-3 rounded-lg border bg-card p-4",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:s("logs.detail.apiKey.title")}),e.jsxs("dl",{className:"grid gap-x-4 gap-y-3 sm:grid-cols-2",children:[e.jsx(R,{label:s("logs.detail.apiKey.name"),value:a.api_key_id==null&&!a.api_key_name?s("logs.detail.apiKey.missing"):o!=null&&o.isWildcard?s("apiKeys.wildcard"):(o==null?void 0:o.name)??a.api_key_name??s("logs.detail.apiKey.missing")}),e.jsx(R,{label:s("logs.detail.apiKey.identifier"),value:a.api_key_id??s("common.noData")}),e.jsx(R,{label:s("logs.detail.apiKey.masked"),value:o!=null&&o.isWildcard?s("apiKeys.wildcard"):(o==null?void 0:o.maskedKey)??a.api_key_name??s("logs.detail.apiKey.maskedUnavailable")}),e.jsx(R,{label:s("logs.detail.apiKey.lastUsed"),value:o!=null&&o.lastUsedAt?new Date(o.lastUsedAt).toLocaleString():s("common.noData")})]}),e.jsxs("div",{className:"rounded-lg border bg-secondary p-3 text-xs",children:[e.jsx("p",{className:"font-medium",children:s("logs.detail.apiKey.rawMasked")}),e.jsx("p",{className:"mt-1 break-all font-mono",children:a.api_key_value_available?a.api_key_value_masked??s("logs.detail.apiKey.rawUnavailable"):s("logs.detail.apiKey.rawUnavailable")}),e.jsx("p",{className:"mt-2 text-[11px] text-muted-foreground",children:s("logs.detail.apiKey.rawMaskedHint")})]})]}),e.jsxs("section",{className:"space-y-4 rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:s("logs.detail.payload.title")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:(u=a.payload)!=null&&u.upstream_request||(E=a.payload)!=null&&E.upstream_response?s("logs.detail.payload.helperWithUpstream"):s("logs.detail.payload.helperClientOnly")})]}),e.jsx("div",{className:"grid gap-4 xl:grid-cols-2",children:N.map(k=>e.jsx(Et,{title:k.title,value:k.value,displayValue:k.displayValue,onCopy:()=>x(k.title,k.value,k.copyToast),t:s},k.key))})]})]})]}):e.jsx(re,{compact:!0,className:"min-h-[240px]",title:s("logs.detail.loadError"),description:s("common.noData")})})]})})}function z({label:l,value:t}){return e.jsxs("div",{className:"min-w-0 rounded-lg border bg-secondary px-3 py-3",children:[e.jsx("p",{className:"text-[11px] font-medium uppercase tracking-wider text-muted-foreground",children:l}),e.jsx("p",{className:"mt-2 break-all text-sm font-semibold leading-6",children:t})]})}function R({label:l,value:t}){return e.jsxs("div",{className:"min-w-0 space-y-1",children:[e.jsx("dt",{className:"text-xs text-muted-foreground",children:l}),e.jsx("dd",{className:"min-w-0 break-all whitespace-pre-wrap text-sm font-medium leading-6 text-foreground",children:t??"-"})]})}function Et({displayValue:l,onCopy:t,title:d,value:r,t:c}){return e.jsxs("div",{className:"space-y-3 rounded-lg border bg-secondary/40 p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsx("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:d}),e.jsx(_,{variant:"outline",size:"sm",onClick:t,children:c("common.actions.copy")})]}),e.jsx("pre",{className:"max-h-72 overflow-auto whitespace-pre-wrap rounded-lg border bg-secondary p-3 text-xs",children:l})]})}const W=[20,50,100],$=["endpoint","provider","requestedModel","routedModel","apiKey","inputTokens","cacheReadTokens","cacheCreationTokens","outputTokens","latency","ttft","tpot","status","error"],oe=["endpoint","provider","requestedModel","routedModel","apiKey","inputTokens","cacheReadTokens","cacheCreationTokens","outputTokens","latency","ttft","tpot","status","error"];function Dt(){if(typeof window>"u")return $;try{const l=window.localStorage.getItem(D.logs.visibleColumns);if(!l)return $;const t=JSON.parse(l);if(!Array.isArray(t))return $;const d=t.filter(r=>oe.includes(r));return d.length>0?d:$}catch{return $}}function Ft(){return typeof window>"u"?"comfortable":window.localStorage.getItem(D.logs.density)==="compact"?"compact":"comfortable"}function Tt(){if(typeof window>"u")return W[0];const l=window.localStorage.getItem(D.logs.pageSize),t=Number(l);return W.includes(t)?t:W[0]}function Rt(){if(typeof window>"u")return[];try{const l=window.localStorage.getItem(D.logs.selectedApiKeys);if(!l)return[];const t=JSON.parse(l);return Array.isArray(t)?t.map(d=>Number(d)).filter(d=>Number.isInteger(d)&&d>0):[]}catch{return[]}}function _e(l,t=!1){if(!l)return;const d=t?`${l}T23:59:59.999`:`${l}T00:00:00.000`,r=Date.parse(d);return Number.isFinite(r)?r:void 0}function Lt(l,t,d){return l===d&&t===d}function Kt({columnOptions:l,exporting:t,onExport:d,onRefresh:r,onResetColumns:c,onSetDensity:s,onToggleColumn:o,refreshing:h,rowDensity:x,total:f,visibleColumns:y,visibleColumnSet:g}){const{t:n}=P(),a=JSON.stringify(y)===JSON.stringify($);return e.jsxs("div",{className:"flex w-full flex-col gap-3 xl:w-auto xl:flex-row xl:items-center",children:[e.jsxs("div",{className:"flex w-full flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center xl:w-auto xl:flex-nowrap",children:[e.jsxs("div",{className:"flex w-full items-center gap-1 overflow-x-auto rounded-full bg-secondary p-1 sm:w-auto",children:[e.jsx("button",{type:"button",onClick:()=>s("comfortable"),className:j("inline-flex h-8 flex-1 items-center justify-center whitespace-nowrap rounded-full px-3.5 text-xs font-medium transition-all sm:flex-none",x==="comfortable"?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:n("logs.table.density.comfortable")}),e.jsx("button",{type:"button",onClick:()=>s("compact"),className:j("inline-flex h-8 flex-1 items-center justify-center whitespace-nowrap rounded-full px-3.5 text-xs font-medium transition-all sm:flex-none",x==="compact"?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:n("logs.table.density.compact")})]}),e.jsxs(yt,{children:[e.jsx(bt,{asChild:!0,children:e.jsx(_,{variant:"outline",size:"sm",className:"w-full sm:w-auto",children:n("logs.actions.columns")})}),e.jsxs(jt,{align:"end",className:"w-64 p-3",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-semibold",children:n("logs.actions.columns")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n("logs.actions.visibleCount",{count:y.length})})]}),e.jsx(_,{variant:"ghost",size:"sm",onClick:c,disabled:a,children:n("common.actions.reset")})]}),e.jsx("div",{className:"grid gap-1.5",children:l.map(i=>{const N=g.has(i.id);return e.jsxs("label",{className:j("flex cursor-pointer items-center gap-3 rounded-xl px-3 py-2 text-sm transition hover:bg-accent",N&&"bg-primary/10 text-primary"),children:[e.jsx("input",{type:"checkbox",checked:N,onChange:()=>o(i.id),className:"h-4 w-4 rounded border-border"}),e.jsx("span",{children:i.label})]},i.id)})})]})]}),e.jsxs(_,{onClick:d,disabled:t,className:"w-full sm:w-auto",children:[e.jsx(tt,{className:"mr-2 h-4 w-4"}),n(t?"logs.actions.exporting":"logs.actions.export")]})]}),e.jsxs("div",{className:"flex w-full items-center justify-between gap-3 xl:w-auto xl:justify-start",children:[e.jsx("span",{className:"text-xs text-muted-foreground sm:text-sm",children:n("logs.summary.total",{value:f.toLocaleString()})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:r,disabled:h,className:"shrink-0",children:[e.jsx(st,{className:j("mr-2 h-4 w-4",h&&"animate-spin")}),n(h?"common.actions.refreshing":"logs.actions.manualRefresh")]})]})]})}function Mt({record:l,providerLabelMap:t,apiKeyMap:d,onSelect:r,isEven:c,density:s,visibleColumnSet:o}){const{t:h}=P(),x=t.get(l.provider)??l.provider,f=l.endpoint||"-",y=Te(l,h),g=l.client_model??h("logs.table.requestedModelFallback"),n=l.api_key_id!=null?d.get(l.api_key_id):void 0,a=l.api_key_id==null?h("logs.table.apiKeyUnknown"):n!=null&&n.isWildcard?h("apiKeys.wildcard"):n!=null&&n.name?n.name:l.api_key_name?l.api_key_name:h("logs.table.apiKeyUnknown"),i=s==="compact"?"px-3 py-1.5":"px-3 py-2",N=c?"bg-muted/30":"bg-background",u=ht(l.session_id),E=u==null?void 0:u.rowStyle,k=u==null?void 0:u.stickyStyle,C=u?{...u.stickyStyle,...u.accentStyle}:void 0;return e.jsxs("tr",{"data-session-id":u==null?void 0:u.sessionId,"data-session-color":u==null?void 0:u.colorKey,className:j("transition-colors",u?"":c?"bg-muted/30":"",u?"":"hover:bg-muted/50"),style:E,onMouseEnter:F=>{u&&Object.assign(F.currentTarget.style,u.hoverStyle)},onMouseLeave:F=>{u&&Object.assign(F.currentTarget.style,u.rowStyle)},children:[e.jsx("td",{className:j("sticky left-0 z-10 text-xs",i,u?"":N),style:C,children:Re(l.timestamp)}),o.has("endpoint")&&e.jsx("td",{className:j(i,"text-xs"),children:f}),o.has("provider")&&e.jsx("td",{className:j(i,"text-xs"),children:e.jsx("div",{className:"max-w-[100px] truncate",title:x,children:x})}),o.has("requestedModel")&&e.jsx("td",{className:j(i,"text-xs text-muted-foreground"),children:e.jsx("div",{className:"max-w-[120px] truncate",title:g,children:g})}),o.has("routedModel")&&e.jsx("td",{className:j(i,"text-xs"),children:e.jsx("div",{className:"max-w-[120px] truncate",title:l.model,children:l.model})}),o.has("apiKey")&&e.jsx("td",{className:j(i,"text-xs text-muted-foreground"),children:e.jsx("div",{className:"max-w-[90px] truncate",title:a,children:a})}),o.has("inputTokens")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:Q(l.input_tokens)}),o.has("cacheReadTokens")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:Q(l.cache_read_tokens)}),o.has("cacheCreationTokens")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:Q(l.cache_creation_tokens)}),o.has("outputTokens")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:Q(l.output_tokens)}),o.has("latency")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:q(l.latency_ms,"ms")}),o.has("ttft")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:q(l.ttft_ms,"ms")}),o.has("tpot")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:q(l.tpot_ms,"ms/tk")}),o.has("status")&&e.jsx("td",{className:j(i,"text-center"),children:e.jsx(A,{variant:y.variant,className:"text-xs",children:y.label})}),o.has("error")&&e.jsx("td",{className:j(i,"text-xs text-muted-foreground"),children:e.jsx("div",{className:"max-w-[100px] truncate",title:l.error??"",children:l.error?l.error:"-"})}),e.jsx("td",{className:j("sticky right-0 z-10 text-center",i,u?"":N),style:k,children:e.jsx(_,{variant:"outline",size:"sm",onClick:()=>r(l.id),children:h("logs.actions.detail")})})]})}function Pt(l){const{t}=P(),{tableScrollRef:d,visibleColumnSet:r,visibleColumnCount:c,logsError:s,logsPending:o,items:h,activeFiltersCount:x,handleResetFilters:f,handleRetry:y,providerLabelMap:g,apiKeyMap:n,handleOpenDetail:a,rowDensity:i,showScrollHint:N,pageSize:u,setPageSize:E,page:k,totalPages:C,setPage:F}=l;return e.jsx(De,{className:"overflow-hidden bg-card shadow-[var(--surface-shadow)]",children:e.jsxs(Fe,{className:"p-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 bg-secondary/50 px-4 py-3 border-b border-border",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-semibold",children:t("logs.title")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t("logs.actions.visibleCount",{count:c-2})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(A,{variant:"secondary",children:"Wide Table"}),e.jsx(A,{variant:"outline",className:"bg-background",children:t(i==="compact"?"logs.table.density.compact":"logs.table.density.comfortable")}),N?e.jsx(A,{variant:"warning",children:"Scroll for more"}):null]})]}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{ref:d,className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full min-w-[1480px] text-sm",children:[e.jsx("thead",{className:"border-b border-border/50 bg-secondary/50",children:e.jsxs("tr",{children:[e.jsx("th",{className:"sticky left-0 z-20 bg-secondary px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.time")}),r.has("endpoint")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.endpoint")}),r.has("provider")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.provider")}),r.has("requestedModel")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.requestedModel")}),r.has("routedModel")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.routedModel")}),r.has("apiKey")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.apiKey")}),r.has("inputTokens")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.inputTokens")}),r.has("cacheReadTokens")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.cacheReadTokens")}),r.has("cacheCreationTokens")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.cacheCreationTokens")}),r.has("outputTokens")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.outputTokens")}),r.has("latency")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.latency")}),r.has("ttft")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.ttft")}),r.has("tpot")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.tpot")}),r.has("status")&&e.jsx("th",{className:"px-3 py-2.5 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.status")}),r.has("error")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.error")}),e.jsx("th",{className:"sticky right-0 z-20 bg-secondary px-3 py-2.5 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.actions")})]})}),e.jsx("tbody",{className:"divide-y divide-border/50",children:o?Array.from({length:8}).map((w,L)=>e.jsx(wt,{columns:c},L)):s&&h.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:c,className:"px-3 py-6",children:e.jsx(re,{compact:!0,tone:"danger",icon:e.jsx(lt,{className:"h-5 w-5","aria-hidden":"true"}),title:t("logs.toast.listError.title"),description:s,action:e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:y,children:t("common.actions.refresh")}),x>0?e.jsx(_,{variant:"ghost",size:"sm",onClick:f,children:t("common.actions.reset")}):null]})})})}):h.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:c,className:"px-3 py-8 text-center text-sm text-muted-foreground",children:e.jsx(re,{compact:!0,tone:"primary",icon:e.jsx(Ee,{className:"h-5 w-5","aria-hidden":"true"}),title:x>0?t("logs.empty.filteredTitle"):t("logs.empty.title"),description:x>0?t("logs.empty.filteredSubtitle"):t("logs.empty.subtitle"),action:e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[x>0?e.jsx(_,{variant:"outline",size:"sm",onClick:f,children:t("logs.empty.actions.reset")}):null,e.jsx(_,{asChild:!0,variant:"ghost",size:"sm",children:e.jsx(vt,{to:"/api-keys",children:t("logs.empty.actions.apiKeys")})})]})})})}):h.map((w,L)=>e.jsx(Mt,{record:w,providerLabelMap:g,apiKeyMap:n,onSelect:a,isEven:L%2===0,density:i,visibleColumnSet:r},w.id))})]})}),N&&e.jsx("div",{className:"table-scroll-hint"})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4 bg-secondary/50 p-4 border-t border-border",children:[e.jsxs("div",{className:"flex items-center gap-2 rounded-full bg-secondary px-3 py-2",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:t("logs.table.pagination.perPage")}),e.jsxs(te,{value:u.toString(),onValueChange:w=>E(Number(w)),children:[e.jsx(se,{className:"h-8 w-[80px] bg-background",children:e.jsx(le,{})}),e.jsx(ae,{children:W.map(w=>e.jsx(M,{value:w.toString(),children:w},w))})]})]}),e.jsxs("div",{className:"flex items-center gap-2 rounded-full bg-secondary px-2 py-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>F(w=>Math.max(w-1,1)),disabled:k<=1,children:t("logs.table.pagination.previous")}),e.jsx("span",{className:"metric-number px-1 text-sm text-muted-foreground",children:t("logs.table.pagination.pageLabel",{page:C===0?0:k,total:C})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>F(w=>C===0?w:Math.min(w+1,C)),disabled:C===0||k>=C,children:t("logs.table.pagination.next")})]})]})]})})}function At({exportTimeoutMs:l,queryParams:t,total:d}){const{t:r}=P(),{pushToast:c}=fe(),[s,o]=m.useState(!1),h=m.useCallback(async()=>{if(!s){o(!0);try{const x=d>0?Math.min(d,5e3):1e3,f={...t,limit:x,offset:0},y=await he.exportArchive(f,l),g=new Date().toISOString().replace(/[:.]/g,"-"),n=URL.createObjectURL(y),a=document.createElement("a");a.href=n,a.download=`cc-gw-logs-${g}.zip`,document.body.appendChild(a),a.click(),a.remove(),URL.revokeObjectURL(n),c({title:r("logs.toast.exportSuccess.title"),description:r("logs.toast.exportSuccess.desc"),variant:"success"})}catch(x){const f=ot(x);c({title:r("logs.toast.exportError.title"),description:r("logs.toast.exportError.desc",{message:f.message}),variant:"error"})}finally{o(!1)}}},[l,s,c,t,r,d]);return{exporting:s,handleExport:h}}function Ot(){const l=m.useRef(null),[t,d]=m.useState(!1),r=m.useCallback(()=>{const c=l.current;if(!c)return;const s=c.scrollWidth-c.scrollLeft-c.clientWidth>1;d(s)},[]);return m.useEffect(()=>{const c=l.current;if(!c)return;r(),c.addEventListener("scroll",r,{passive:!0});const s=new ResizeObserver(r);return s.observe(c),()=>{c.removeEventListener("scroll",r),s.disconnect()}},[r]),{scrollRef:l,showScrollHint:t,updateScrollHint:r}}function zt(){const[l,t]=K(D.logs.density,Ft,{serialize:y=>y,deserialize:y=>y==="compact"?"compact":"comfortable"}),[d,r]=K(D.logs.visibleColumns,Dt),{scrollRef:c,showScrollHint:s}=Ot(),o=m.useMemo(()=>new Set(d),[d]),h=d.length+2,x=m.useCallback(y=>{r(g=>{if(g.includes(y))return g.length===1?g:g.filter(a=>a!==y);const n=[...g,y];return n.sort((a,i)=>oe.indexOf(a)-oe.indexOf(i)),n})},[]);return{resetVisibleColumns:m.useCallback(()=>{r($)},[]),rowDensity:l,setRowDensity:t,showScrollHint:s,tableScrollRef:c,toggleColumn:x,visibleColumnCount:h,visibleColumns:d,visibleColumnSet:o}}function qt(){var ve,we,Ne,ke,Se;const{t:l}=P(),{pushToast:t}=fe(),d=Nt(),[r,c]=K(D.logs.providerFilter,"all"),[s,o]=K(D.logs.endpointFilter,"all"),[h,x]=K(D.logs.modelFilter,""),[f,y]=K(D.logs.statusFilter,"all"),[g,n]=K(D.logs.fromDate,""),[a,i]=K(D.logs.toDate,""),[N,u]=m.useState(1),[E,k]=K(D.logs.pageSize,Tt,{serialize:p=>String(p),deserialize:p=>{const v=Number(p);return W.includes(v)?v:W[0]}}),[C,F]=m.useState(null),[w,L]=m.useState(!1),[S,G]=K(D.logs.selectedApiKeys,Rt),[ie,J]=K(D.logs.filtersExpanded,!1),{resetVisibleColumns:b,rowDensity:X,setRowDensity:Le,showScrollHint:Ke,tableScrollRef:Me,toggleColumn:Pe,visibleColumnCount:Ae,visibleColumns:Oe,visibleColumnSet:ze}=zt(),qe=m.useDeferredValue(h),T=h===""?"":qe;m.useEffect(()=>{u(1)},[r,s,T,f,g,a,E,S]);const ne=m.useMemo(()=>{const p={limit:E,offset:(N-1)*E};r!=="all"&&(p.provider=r),s!=="all"&&(p.endpoint=s),T.trim().length>0&&(p.model=T.trim()),f!=="all"&&(p.status=f);const v=_e(g),I=_e(a,!0);return v!==void 0&&(p.from=v),I!==void 0&&(p.to=I),S.length>0&&(p.apiKeys=S.join(",")),p},[T,s,g,N,E,r,S,f,a]),O=B(V.logs.list(ne),he.listRequest(ne),{gcTime:6e4}),H=B(V.providers.all(),Ce.providersRequest()),ye=B(V.apiKeys.all(),{url:"/api/keys",method:"GET"}),de=B(V.customEndpoints.all(),{url:"/api/custom-endpoints",method:"GET"}),be=B(V.config.exportTimeout(),Ce.configRequest());m.useEffect(()=>{!O.isError||!O.error||t({title:l("logs.toast.listError.title"),description:l("logs.toast.listError.desc",{message:O.error.message}),variant:"error"})},[O.error,O.isError,t,l]),m.useEffect(()=>{!H.isError||!H.error||t({title:l("logs.toast.providerError.title"),description:l("logs.toast.providerError.desc",{message:H.error.message}),variant:"error"})},[H.error,H.isError,t,l]);const ee=((ve=O.data)==null?void 0:ve.total)??0,Z=ee>0?Math.ceil(ee/E):0,Qe=((we=O.data)==null?void 0:we.items)??[],Ie=m.useMemo(()=>{var v;const p=(v=be.data)==null?void 0:v.logExportTimeoutSeconds;return typeof p=="number"&&Number.isFinite(p)?Math.min(Math.max(Math.round(p),5),600)*1e3:6e4},[(Ne=be.data)==null?void 0:Ne.logExportTimeoutSeconds]);m.useEffect(()=>{Z>0&&N>Z&&u(Z)},[N,Z]);const ce=H.data??[],pe=m.useMemo(()=>{const p=new Map;for(const v of ce)v.id&&p.set(v.id,v.label??v.id);return p},[ce]),je=m.useMemo(()=>{var v;const p=new Map;p.set("anthropic",l("logs.filters.endpointAnthropic")),p.set("openai",l("logs.filters.endpointOpenAI"));for(const I of((v=de.data)==null?void 0:v.endpoints)??[])p.set(I.id,I.label||I.id);return p},[(ke=de.data)==null?void 0:ke.endpoints,l]),Ve=m.useMemo(()=>{const p=[];if(r!=="all"){const v=pe.get(r)??r;p.push({key:"provider",label:`${l("logs.filters.provider")}: ${v}`,onRemove:()=>c("all")})}if(s!=="all"){const v=je.get(s)??s;p.push({key:"endpoint",label:`${l("logs.filters.endpoint")}: ${v}`,onRemove:()=>o("all")})}if(T.trim()&&p.push({key:"model",label:`${l("logs.filters.modelId")}: ${T.trim()}`,onRemove:()=>x("")}),f!=="all"){const v=l(f==="success"?"logs.filters.statusSuccess":"logs.filters.statusError");p.push({key:"status",label:`${l("logs.filters.status")}: ${v}`,onRemove:()=>y("all")})}return g&&p.push({key:"from",label:`${l("logs.filters.startDate")}: ${g}`,onRemove:()=>n("")}),a&&p.push({key:"to",label:`${l("logs.filters.endDate")}: ${a}`,onRemove:()=>i("")}),S.length>0&&p.push({key:"apiKeys",label:l("logs.filters.apiKeySelected",{count:S.length}),onRemove:()=>G([])}),p},[T,s,je,g,r,pe,S.length,f,l,a]),ue=ye.data??[],Ue=m.useMemo(()=>{const p=new Map;for(const v of ue)p.set(v.id,v);return p},[ue]),$e=m.useMemo(()=>oe.map(p=>({id:p,label:l(`logs.table.columns.${p}`)})),[l]),Y=m.useMemo(()=>new Date().toISOString().slice(0,10),[]),He=m.useMemo(()=>r==="all"&&s==="all"&&T.trim()===""&&f==="all"&&g===""&&a===""&&S.length===0?"all":f==="error"&&s==="all"&&r==="all"&&T.trim()===""&&g===""&&a===""&&S.length===0?"errors":Lt(g,a,Y)&&s==="all"&&r==="all"&&T.trim()===""&&f==="all"&&S.length===0?"today":s==="anthropic"&&r==="all"&&T.trim()===""&&f==="all"&&g===""&&a===""&&S.length===0?"anthropic":s==="openai"&&r==="all"&&T.trim()===""&&f==="all"&&g===""&&a===""&&S.length===0?"openai":null,[T,s,g,r,S.length,f,a,Y]),me=m.useCallback(()=>{c("all"),x(""),o("all"),y("all"),n(""),i(""),G([])},[]),Be=m.useCallback(p=>{if(u(1),me(),p!=="all"){if(p==="errors"){y("error");return}if(p==="today"){n(Y),i(Y);return}if(p==="anthropic"){o("anthropic");return}p==="openai"&&o("openai")}},[me,Y]),{exporting:We,handleExport:Ge}=At({exportTimeoutMs:Ie,queryParams:ne,total:ee}),Je=m.useCallback(p=>{d.removeQueries({queryKey:["logs","detail"],type:"inactive"}),F(p),L(!0)},[d]),Xe=m.useCallback(()=>{L(!1)},[]);return m.useEffect(()=>{w||C===null||(d.removeQueries({queryKey:V.logs.detail(C),exact:!0}),F(null))},[w,d,C]),{activeFilters:Ve,activeQuickView:He,apiKeyMap:Ue,apiKeys:ue,apiKeysQuery:ye,applyQuickView:Be,columnOptions:$e,customEndpoints:(Se=de.data)==null?void 0:Se.endpoints,endpointFilter:s,exporting:We,filtersExpanded:ie,fromDate:g,handleCloseDetail:Xe,handleExport:Ge,handleOpenDetail:Je,handleResetFilters:me,isDetailOpen:w,items:Qe,logsQuery:O,modelFilter:h,page:N,pageSize:E,providerFilter:r,providerLabelMap:pe,providerOptions:ce,rowDensity:X,resetVisibleColumns:b,selectedApiKeys:S,selectedLogId:C,setEndpointFilter:o,setFiltersExpanded:J,setFromDate:n,setModelFilter:x,setPage:u,setPageSize:k,setProviderFilter:c,setRowDensity:Le,setSelectedApiKeys:G,setStatusFilter:y,setToDate:i,showScrollHint:Ke,statusFilter:f,tableScrollRef:Me,toDate:a,toggleColumn:Pe,total:ee,totalPages:Z,visibleColumnCount:Ae,visibleColumns:Oe,visibleColumnSet:ze}}function ns(){var d;const{t:l}=P(),t=qt();return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(at,{icon:e.jsx(Ee,{className:"h-5 w-5","aria-hidden":"true"}),title:l("logs.title"),description:l("logs.description"),eyebrow:"Traffic Explorer",breadcrumb:"Gateway / Logs",helper:l("logs.filtersDescription"),badge:t.total>0?l("logs.summary.total",{value:t.total.toLocaleString()}):void 0,actions:e.jsx(Kt,{columnOptions:t.columnOptions,exporting:t.exporting,onExport:()=>void t.handleExport(),onRefresh:()=>void t.logsQuery.refetch(),onResetColumns:t.resetVisibleColumns,onSetDensity:t.setRowDensity,onToggleColumn:t.toggleColumn,refreshing:t.logsQuery.isFetching,rowDensity:t.rowDensity,total:t.total,visibleColumns:t.visibleColumns,visibleColumnSet:t.visibleColumnSet})}),e.jsx(St,{total:t.total,activeFilters:t.activeFilters,filtersExpanded:t.filtersExpanded,setFiltersExpanded:t.setFiltersExpanded,handleResetFilters:t.handleResetFilters,activeQuickView:t.activeQuickView,applyQuickView:t.applyQuickView,providerFilter:t.providerFilter,setProviderFilter:t.setProviderFilter,endpointFilter:t.endpointFilter,setEndpointFilter:t.setEndpointFilter,selectedApiKeys:t.selectedApiKeys,setSelectedApiKeys:t.setSelectedApiKeys,modelFilter:t.modelFilter,setModelFilter:t.setModelFilter,statusFilter:t.statusFilter,setStatusFilter:t.setStatusFilter,fromDate:t.fromDate,setFromDate:t.setFromDate,toDate:t.toDate,setToDate:t.setToDate,providerOptions:t.providerOptions,apiKeys:t.apiKeys,apiKeysLoading:t.apiKeysQuery.isLoading,customEndpoints:t.customEndpoints}),e.jsx(Pt,{tableScrollRef:t.tableScrollRef,visibleColumnSet:t.visibleColumnSet,visibleColumnCount:t.visibleColumnCount,logsError:t.logsQuery.isError?((d=t.logsQuery.error)==null?void 0:d.message)??null:null,logsPending:t.logsQuery.isPending,items:t.items,activeFiltersCount:t.activeFilters.length,handleResetFilters:t.handleResetFilters,handleRetry:()=>void t.logsQuery.refetch(),providerLabelMap:t.providerLabelMap,apiKeyMap:t.apiKeyMap,handleOpenDetail:t.handleOpenDetail,rowDensity:t.rowDensity,showScrollHint:t.showScrollHint,pageSize:t.pageSize,setPageSize:t.setPageSize,page:t.page,totalPages:t.totalPages,setPage:t.setPage}),e.jsx(_t,{open:t.isDetailOpen,logId:t.selectedLogId,onClose:t.handleCloseDetail,providerLabelMap:t.providerLabelMap,apiKeyMap:t.apiKeyMap})]})}export{ns as default};
|
|
1
|
+
import{r as m,j as e,ay as Ze,al as Ye,a7 as et,az as tt,ax as st,U as lt,P as Ee}from"./vendor-z22RpOY0.js";import{P as at}from"./PageHeader-DLI9m-gU.js";import{c as j}from"./global-xoXYOIOz.js";import{B as _,b as rt,u as fe,s as D,t as ot,a as K}from"./app-CfipX5HX.js";import{B as A,q as V}from"./queryKeys-DifG1fTh.js";import{C as De,a as Fe}from"./card-BE_b5SvI.js";import{I as xe}from"./input-Brr3avKW.js";import{L as U}from"./label-Bc4vkpLF.js";import{S as te,a as se,b as le,c as ae,d as M}from"./select-zM5TPRdZ.js";import{u as P}from"./i18n-Bl2BcCDG.js";import{D as it,A as nt,a as dt,b as ct,c as pt,d as ut}from"./DialogShell-BpzUpswv.js";import{P as mt,a as re}from"./PageState-Bb3fEov-.js";import{c as xt}from"./clipboard-CALi6bTW.js";import{u as B}from"./useApiQuery-DCgUtGKI.js";import{g as Te,f as gt,a as q,b as Re,c as ft,d as Q,e as ht}from"./utils-DSaa7c6v.js";import{P as yt,a as bt,b as jt}from"./popover-D8l2FwYm.js";import{L as vt}from"./router-CL3rf_uf.js";import{T as wt}from"./Skeleton-DEv_MFPR.js";import{u as Nt}from"./query-BbGWgOFk.js";import{g as Ce}from"./gateway-Zpcl3bpd.js";import"./radix-mHySgtou.js";function kt({apiKeys:l,selected:t,onChange:d,disabled:r,className:c}){const{t:s}=P(),[o,h]=m.useState(!1),x=m.useRef(null);m.useEffect(()=>{if(!o)return;const n=a=>{var i;(i=x.current)!=null&&i.contains(a.target)||h(!1)};return window.addEventListener("mousedown",n),()=>window.removeEventListener("mousedown",n)},[o]);const f=m.useMemo(()=>{if(t.length===0)return[];const n=new Map;for(const a of l)n.set(a.id,a);return t.map(a=>{const i=n.get(a);return i?i.isWildcard?s("apiKeys.wildcard"):i.name:null}).filter(a=>!!a)},[l,t,s]),y=t.length===0?s("logs.filters.apiKeyAll"):s("logs.filters.apiKeySelected",{count:t.length}),g=n=>{t.includes(n)?d(t.filter(a=>a!==n)):d([...t,n])};return e.jsxs("div",{className:j("relative space-y-2",c),ref:x,children:[e.jsx(U,{children:s("logs.filters.apiKey")}),e.jsxs("button",{type:"button",onClick:()=>h(n=>!n),disabled:r||l.length===0,title:s("logs.filters.apiKeyHint"),className:j("flex h-10 w-full items-center justify-between rounded-lg border border-input bg-background px-3 text-sm ring-offset-background transition-all focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",t.length>0&&"border-primary",o&&"ring-2 ring-ring ring-offset-2"),children:[e.jsxs("span",{className:"truncate",children:[y,f.length>0&&e.jsx("span",{className:"ml-1 text-xs text-muted-foreground",children:f.join(", ")})]}),e.jsx("svg",{className:j("h-4 w-4 opacity-50 transition-transform",o&&"rotate-180"),viewBox:"0 0 20 20",fill:"currentColor",children:e.jsx("path",{fillRule:"evenodd",d:"M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.71a.75.75 0 111.06 1.06l-4.24 4.25a.75.75 0 01-1.06 0L5.21 8.29a.75.75 0 01.02-1.08z",clipRule:"evenodd"})})]}),o&&e.jsxs("div",{className:"absolute left-0 top-full z-30 mt-2 w-64 rounded-lg border bg-popover p-2 shadow-[var(--surface-shadow-lg)]",children:[e.jsxs("div",{className:"flex items-center justify-between rounded-lg bg-secondary px-3 py-2 text-xs",children:[e.jsx("span",{children:y}),e.jsx("button",{type:"button",onClick:()=>d([]),disabled:t.length===0,className:"text-primary hover:underline disabled:opacity-40",children:s("common.actions.reset")})]}),e.jsxs("div",{className:"max-h-56 overflow-y-auto py-2",children:[l.map(n=>{const a=n.isWildcard?s("apiKeys.wildcard"):n.name,i=t.includes(n.id);return e.jsxs("label",{className:j("flex cursor-pointer items-center gap-3 rounded-xl px-3 py-2 text-sm transition hover:bg-primary/5",i&&"bg-primary/10 text-primary"),children:[e.jsx("input",{type:"checkbox",className:"h-4 w-4 rounded border-border",checked:i,onChange:()=>g(n.id)}),e.jsx("span",{className:"truncate",children:a})]},n.id)}),l.length===0&&e.jsx("p",{className:"px-2 py-2 text-xs text-muted-foreground",children:s("logs.filters.apiKeyAll")})]})]})]})}function St(l){const{t}=P(),{total:d,activeFilters:r,filtersExpanded:c,setFiltersExpanded:s,handleResetFilters:o,activeQuickView:h,applyQuickView:x,providerFilter:f,setProviderFilter:y,endpointFilter:g,setEndpointFilter:n,selectedApiKeys:a,setSelectedApiKeys:i,modelFilter:N,setModelFilter:u,statusFilter:E,setStatusFilter:k,fromDate:C,setFromDate:F,toDate:w,setToDate:L,providerOptions:S,apiKeys:G,apiKeysLoading:ie,customEndpoints:J}=l;return e.jsx(De,{"data-testid":"logs-filters-card",className:"overflow-hidden rounded-[1.25rem] border border-white/70 bg-card/95 shadow-[0_20px_50px_-42px_rgba(15,23,42,0.24)]",children:e.jsxs(Fe,{className:"space-y-3 p-4",children:[e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("p",{className:"text-sm font-semibold text-foreground",children:t("logs.filtersTitle")}),e.jsx(A,{variant:"secondary",className:"rounded-full px-2.5 py-0.5 text-[11px] font-semibold",children:t("logs.summary.total",{value:d.toLocaleString()})}),r.length>0&&e.jsx(A,{variant:"outline",className:"rounded-full border-transparent bg-primary/10 px-2.5 py-0.5 text-[11px] font-semibold text-primary",children:t("common.filters.activeCount",{count:r.length})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t("logs.filtersDescription")})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[r.length>0&&e.jsx(_,{variant:"ghost",size:"sm",onClick:o,className:"h-8 rounded-full px-3 text-xs",children:t("common.actions.reset")}),e.jsx(_,{variant:"ghost",size:"sm",onClick:()=>s(b=>!b),className:"h-8 rounded-full px-3 text-xs",children:c?e.jsxs(e.Fragment,{children:[t("common.filters.collapse"),e.jsx(Ze,{className:"ml-1 h-4 w-4"})]}):e.jsxs(e.Fragment,{children:[t("common.filters.expand"),e.jsx(Ye,{className:"ml-1 h-4 w-4"})]})})]})]}),e.jsxs("div",{className:"grid gap-2 lg:grid-cols-[minmax(0,1fr)_auto]",children:[e.jsx("div",{className:"flex min-h-10 items-center rounded-[0.9rem] bg-secondary/70 px-3 py-2",children:r.length>0?e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:r.map(b=>e.jsxs(A,{variant:"outline",role:"button",tabIndex:0,className:"flex cursor-pointer items-center gap-1 rounded-full border border-border bg-card/90 px-2.5 py-1 text-[11px] font-semibold text-foreground/90 transition hover:bg-secondary/80",onClick:b.onRemove,onKeyDown:X=>{(X.key==="Enter"||X.key===" ")&&(X.preventDefault(),b.onRemove())},children:[b.label,e.jsx(et,{className:"h-3 w-3","aria-hidden":"true"})]},b.key))}):e.jsx("span",{className:"text-xs text-muted-foreground",children:t("common.filters.allRequests")})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 lg:justify-end",children:[e.jsx(ge,{label:t("logs.filters.apiKey"),value:a.length.toString()}),e.jsx(ge,{label:t("logs.filters.provider"),value:f==="all"?"0":"1"}),e.jsx(ge,{label:t("logs.filters.endpoint"),value:g==="all"?"0":"1"})]})]}),e.jsx("div",{className:"flex flex-wrap items-center gap-1.5 rounded-[0.9rem] bg-secondary/70 px-2 py-1.5",children:["all","errors","today","anthropic","openai"].map(b=>e.jsx(_,{variant:"ghost",size:"sm",className:j("h-7 rounded-full px-3 text-[11px] font-semibold transition-colors",h===b?"bg-card text-foreground shadow-[0_12px_28px_-24px_rgba(15,23,42,0.32)]":"text-muted-foreground"),onClick:()=>x(b),children:t(`logs.quickViews.${b}`)},b))})]}),c&&e.jsxs("div",{className:"mt-3 grid gap-3 rounded-[1rem] bg-secondary/45 p-3 md:grid-cols-2 xl:grid-cols-4 animate-in fade-in slide-in-from-top-2 duration-200",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.provider")}),e.jsxs(te,{value:f,onValueChange:y,children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(M,{value:"all",children:t("logs.filters.providerAll")}),S.map(b=>e.jsx(M,{value:b.id,children:b.label??b.id},b.id))]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.endpoint")}),e.jsxs(te,{value:g,onValueChange:n,children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(M,{value:"all",children:t("logs.filters.endpointAll")}),e.jsx(M,{value:"anthropic",children:t("logs.filters.endpointAnthropic")}),e.jsx(M,{value:"openai",children:t("logs.filters.endpointOpenAI")}),J==null?void 0:J.map(b=>e.jsx(M,{value:b.id,children:b.label||b.id},b.id))]})]})]}),e.jsx(kt,{className:"md:col-span-2",apiKeys:G,selected:a,disabled:ie,onChange:i}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.modelId")}),e.jsx(xe,{value:N,onChange:b=>u(b.target.value),placeholder:t("logs.filters.modelPlaceholder")})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.status")}),e.jsxs(te,{value:E,onValueChange:b=>k(b),children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(M,{value:"all",children:t("logs.filters.statusAll")}),e.jsx(M,{value:"success",children:t("logs.filters.statusSuccess")}),e.jsx(M,{value:"error",children:t("logs.filters.statusError")})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.startDate")}),e.jsx(xe,{type:"date",value:C,onChange:b=>F(b.target.value)})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(U,{children:t("logs.filters.endDate")}),e.jsx(xe,{type:"date",value:w,onChange:b=>L(b.target.value)})]})]})]})})}function ge({label:l,value:t}){return e.jsxs("div",{className:"inline-flex items-center gap-1.5 rounded-full border border-border/60 bg-card/92 px-2.5 py-1 text-[11px] text-muted-foreground shadow-[0_10px_24px_-22px_rgba(15,23,42,0.28)]",children:[e.jsx("span",{children:l}),e.jsx("span",{className:"metric-number font-semibold text-foreground",children:t})]})}const he={listRequest(l){return{url:"/api/logs",method:"GET",params:l}},detailRequest(l){return{url:l===null?"":`/api/logs/${l}`,method:"GET"}},async exportArchive(l,t){const d=await rt.post("/api/logs/export",l,{responseType:"blob",timeout:t});return new Blob([d.data],{type:"application/zip"})}};function Ct({apiKeyMap:l,logId:t,open:d,providerLabelMap:r}){var n;const{t:c}=P(),{pushToast:s}=fe(),o=B(V.logs.detail(t),he.detailRequest(t),{enabled:d&&t!==null,staleTime:3e4,gcTime:15e3,placeholderData:void 0});m.useEffect(()=>{!o.isError||!o.error||s({title:c("logs.detail.loadError"),description:o.error.message,variant:"error"})},[o.error,o.isError,s,c]);const h=m.useCallback(async(a,i,N)=>{if(!i){s({title:c("logs.detail.copy.empty",{label:a}),variant:"info"});return}try{await xt(i),s({title:c(N),variant:"success"})}catch(u){s({title:c("logs.detail.copy.failure"),description:u instanceof Error?u.message:c("logs.detail.copy.failureFallback"),variant:"error"})}},[s,c]),x=o.data,f=x?r.get(x.provider)??x.provider:"",y=x&&x.api_key_id!=null?l.get(x.api_key_id):void 0,g=x?Te(x,c):null;return{apiKeyMeta:y,errorMessage:o.isError?((n=o.error)==null?void 0:n.message)??null:null,handleCopy:h,isError:o.isError,isPending:o.isPending,providerLabel:f,refetch:o.refetch,record:x,statusMeta:g}}function _t({open:l,logId:t,onClose:d,providerLabelMap:r,apiKeyMap:c}){var u,E;const{t:s}=P(),{apiKeyMeta:o,errorMessage:h,handleCopy:x,isError:f,isPending:y,providerLabel:g,refetch:n,record:a,statusMeta:i}=Ct({apiKeyMap:c,logId:t,open:l,providerLabelMap:r}),N=m.useMemo(()=>{var C,F,w,L;return a?[{key:"client-request",title:s("logs.detail.payload.clientRequest"),value:((C=a.payload)==null?void 0:C.client_request)??null,emptyLabel:s("logs.detail.payload.emptyRequest"),copyToast:"logs.detail.copy.requestSuccess"},...(F=a.payload)!=null&&F.upstream_request?[{key:"upstream-request",title:s("logs.detail.payload.upstreamRequest"),value:a.payload.upstream_request,emptyLabel:s("logs.detail.payload.emptyRequest"),copyToast:"logs.detail.copy.requestSuccess"}]:[],...(w=a.payload)!=null&&w.upstream_response?[{key:"upstream-response",title:s("logs.detail.payload.upstreamResponse"),value:a.payload.upstream_response,emptyLabel:s("logs.detail.payload.emptyResponse"),copyToast:"logs.detail.copy.responseSuccess"}]:[],{key:"client-response",title:s("logs.detail.payload.clientResponse"),value:((L=a.payload)==null?void 0:L.client_response)??null,emptyLabel:s("logs.detail.payload.emptyResponse"),copyToast:"logs.detail.copy.responseSuccess"}].map(S=>({...S,displayValue:gt(S.value,S.emptyLabel)})):[]},[a,s]);return e.jsx(it,{open:l,onOpenChange:k=>{k||d()},children:e.jsxs(nt,{className:"w-[min(96vw,1200px)] max-w-[1200px]",children:[e.jsxs(dt,{className:"pr-14",children:[e.jsx(ct,{children:s("logs.detail.title")}),e.jsx(pt,{children:a?s("logs.detail.id",{id:a.id}):s("logs.detail.loadError")})]}),e.jsx(ut,{className:"max-h-[78vh]",children:y?e.jsx(mt,{compact:!0,className:"min-h-[240px]",label:s("common.loading")}):f?e.jsx(re,{compact:!0,className:"min-h-[240px]",tone:"danger",title:s("logs.detail.loadError"),description:h??s("common.unknownError"),action:e.jsx(_,{variant:"outline",onClick:()=>void n(),children:s("common.actions.refresh")})}):a?e.jsxs("div",{className:"space-y-6 text-sm",children:[e.jsxs("section",{className:"space-y-4 rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:s("logs.detail.infoSection")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 rounded-lg border bg-secondary p-3 text-xs",children:[e.jsx("span",{className:"font-medium",children:s("logs.detail.summary.route",{from:a.client_model??s("logs.detail.info.noRequestedModel"),to:a.model})}),e.jsx("span",{className:"text-muted-foreground",children:s("logs.detail.summary.latency",{value:q(a.latency_ms,s("common.units.ms"))})}),a.ttft_ms!==null?e.jsxs("span",{className:"text-muted-foreground",children:["TTFT: ",q(a.ttft_ms,s("common.units.ms"))]}):null]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(A,{variant:i==null?void 0:i.variant,children:(i==null?void 0:i.label)??"-"}),e.jsx(A,{variant:"outline",children:a.stream?s("logs.stream.streaming"):s("logs.stream.single")})]})]}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-4",children:[e.jsx(O,{label:s("logs.detail.info.latency"),value:q(a.latency_ms,s("common.units.ms"))}),e.jsx(O,{label:s("logs.detail.info.ttft"),value:q(a.ttft_ms,s("common.units.ms"))}),e.jsx(O,{label:s("logs.detail.info.tpot"),value:q(a.tpot_ms,s("common.units.msPerToken"))}),e.jsx(O,{label:s("logs.detail.info.status"),value:(i==null?void 0:i.label)??"-"})]}),e.jsxs("dl",{className:"grid gap-x-4 gap-y-3 md:grid-cols-2 xl:grid-cols-4",children:[e.jsx(R,{label:s("logs.detail.info.time"),value:Re(a.timestamp)}),e.jsx(R,{label:s("logs.detail.info.sessionId"),value:a.session_id??"-"}),e.jsx(R,{label:s("logs.detail.info.endpoint"),value:a.endpoint||"-"}),e.jsx(R,{label:s("logs.detail.info.provider"),value:g}),e.jsx(R,{label:s("logs.detail.info.requestedModel"),value:a.client_model??s("logs.detail.info.noRequestedModel")}),e.jsx(R,{label:s("logs.detail.info.model"),value:a.model}),e.jsx(R,{label:s("logs.detail.info.stream"),value:ft(a.stream)}),e.jsx(R,{label:s("logs.detail.info.status"),value:(i==null?void 0:i.label)??"-"})]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4",children:[e.jsx(O,{label:s("logs.detail.info.inputTokens"),value:Q(a.input_tokens)}),e.jsx(O,{label:s("logs.detail.info.cacheReadTokens"),value:Q(a.cache_read_tokens)}),e.jsx(O,{label:s("logs.detail.info.cacheCreationTokens"),value:Q(a.cache_creation_tokens)}),e.jsx(O,{label:s("logs.detail.info.outputTokens"),value:Q(a.output_tokens)})]}),a.error?e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:s("logs.detail.info.error")}),e.jsx("p",{className:"rounded-xl border border-destructive/50 bg-destructive/10 p-3 text-xs text-destructive",children:a.error})]}):null]}),e.jsxs("div",{className:"grid gap-6 xl:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",children:[e.jsxs("section",{className:"space-y-3 rounded-lg border bg-card p-4",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:s("logs.detail.apiKey.title")}),e.jsxs("dl",{className:"grid gap-x-4 gap-y-3 sm:grid-cols-2",children:[e.jsx(R,{label:s("logs.detail.apiKey.name"),value:a.api_key_id==null&&!a.api_key_name?s("logs.detail.apiKey.missing"):o!=null&&o.isWildcard?s("apiKeys.wildcard"):(o==null?void 0:o.name)??a.api_key_name??s("logs.detail.apiKey.missing")}),e.jsx(R,{label:s("logs.detail.apiKey.identifier"),value:a.api_key_id??s("common.noData")}),e.jsx(R,{label:s("logs.detail.apiKey.masked"),value:o!=null&&o.isWildcard?s("apiKeys.wildcard"):(o==null?void 0:o.maskedKey)??a.api_key_name??s("logs.detail.apiKey.maskedUnavailable")}),e.jsx(R,{label:s("logs.detail.apiKey.lastUsed"),value:o!=null&&o.lastUsedAt?new Date(o.lastUsedAt).toLocaleString():s("common.noData")})]}),e.jsxs("div",{className:"rounded-lg border bg-secondary p-3 text-xs",children:[e.jsx("p",{className:"font-medium",children:s("logs.detail.apiKey.rawMasked")}),e.jsx("p",{className:"mt-1 break-all font-mono",children:a.api_key_value_available?a.api_key_value_masked??s("logs.detail.apiKey.rawUnavailable"):s("logs.detail.apiKey.rawUnavailable")}),e.jsx("p",{className:"mt-2 text-[11px] text-muted-foreground",children:s("logs.detail.apiKey.rawMaskedHint")})]})]}),e.jsxs("section",{className:"space-y-4 rounded-lg border bg-card p-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:s("logs.detail.payload.title")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:(u=a.payload)!=null&&u.upstream_request||(E=a.payload)!=null&&E.upstream_response?s("logs.detail.payload.helperWithUpstream"):s("logs.detail.payload.helperClientOnly")})]}),e.jsx("div",{className:"grid gap-4 xl:grid-cols-2",children:N.map(k=>e.jsx(Et,{title:k.title,value:k.value,displayValue:k.displayValue,onCopy:()=>x(k.title,k.value,k.copyToast),t:s},k.key))})]})]})]}):e.jsx(re,{compact:!0,className:"min-h-[240px]",title:s("logs.detail.loadError"),description:s("common.noData")})})]})})}function O({label:l,value:t}){return e.jsxs("div",{className:"min-w-0 rounded-lg border bg-secondary px-3 py-3",children:[e.jsx("p",{className:"text-[11px] font-medium uppercase tracking-wider text-muted-foreground",children:l}),e.jsx("p",{className:"mt-2 break-all text-sm font-semibold leading-6",children:t})]})}function R({label:l,value:t}){return e.jsxs("div",{className:"min-w-0 space-y-1",children:[e.jsx("dt",{className:"text-xs text-muted-foreground",children:l}),e.jsx("dd",{className:"min-w-0 break-all whitespace-pre-wrap text-sm font-medium leading-6 text-foreground",children:t??"-"})]})}function Et({displayValue:l,onCopy:t,title:d,value:r,t:c}){return e.jsxs("div",{className:"space-y-3 rounded-lg border bg-secondary/40 p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsx("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:d}),e.jsx(_,{variant:"outline",size:"sm",onClick:t,children:c("common.actions.copy")})]}),e.jsx("pre",{className:"max-h-72 overflow-auto whitespace-pre-wrap rounded-lg border bg-secondary p-3 text-xs",children:l})]})}const W=[20,50,100],$=["endpoint","provider","requestedModel","routedModel","apiKey","inputTokens","cacheReadTokens","cacheCreationTokens","outputTokens","latency","ttft","tpot","status","error"],oe=["endpoint","provider","requestedModel","routedModel","apiKey","inputTokens","cacheReadTokens","cacheCreationTokens","outputTokens","latency","ttft","tpot","status","error"];function Dt(){if(typeof window>"u")return $;try{const l=window.localStorage.getItem(D.logs.visibleColumns);if(!l)return $;const t=JSON.parse(l);if(!Array.isArray(t))return $;const d=t.filter(r=>oe.includes(r));return d.length>0?d:$}catch{return $}}function Ft(){return typeof window>"u"?"comfortable":window.localStorage.getItem(D.logs.density)==="compact"?"compact":"comfortable"}function Tt(){if(typeof window>"u")return W[0];const l=window.localStorage.getItem(D.logs.pageSize),t=Number(l);return W.includes(t)?t:W[0]}function Rt(){if(typeof window>"u")return[];try{const l=window.localStorage.getItem(D.logs.selectedApiKeys);if(!l)return[];const t=JSON.parse(l);return Array.isArray(t)?t.map(d=>Number(d)).filter(d=>Number.isInteger(d)&&d>0):[]}catch{return[]}}function _e(l,t=!1){if(!l)return;const d=t?`${l}T23:59:59.999`:`${l}T00:00:00.000`,r=Date.parse(d);return Number.isFinite(r)?r:void 0}function Lt(l,t,d){return l===d&&t===d}function Kt({columnOptions:l,exporting:t,onExport:d,onRefresh:r,onResetColumns:c,onSetDensity:s,onToggleColumn:o,refreshing:h,rowDensity:x,total:f,visibleColumns:y,visibleColumnSet:g}){const{t:n}=P(),a=JSON.stringify(y)===JSON.stringify($);return e.jsxs("div",{className:"flex w-full flex-col gap-3 xl:w-auto xl:flex-row xl:items-center",children:[e.jsxs("div",{className:"flex w-full flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center xl:w-auto xl:flex-nowrap",children:[e.jsxs("div",{className:"flex w-full items-center gap-1 overflow-x-auto rounded-full bg-secondary p-1 sm:w-auto",children:[e.jsx("button",{type:"button",onClick:()=>s("comfortable"),className:j("inline-flex h-8 flex-1 items-center justify-center whitespace-nowrap rounded-full px-3.5 text-xs font-medium transition-all sm:flex-none",x==="comfortable"?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:n("logs.table.density.comfortable")}),e.jsx("button",{type:"button",onClick:()=>s("compact"),className:j("inline-flex h-8 flex-1 items-center justify-center whitespace-nowrap rounded-full px-3.5 text-xs font-medium transition-all sm:flex-none",x==="compact"?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:n("logs.table.density.compact")})]}),e.jsxs(yt,{children:[e.jsx(bt,{asChild:!0,children:e.jsx(_,{variant:"outline",size:"sm",className:"w-full sm:w-auto",children:n("logs.actions.columns")})}),e.jsxs(jt,{align:"end",className:"w-64 p-3",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-semibold",children:n("logs.actions.columns")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n("logs.actions.visibleCount",{count:y.length})})]}),e.jsx(_,{variant:"ghost",size:"sm",onClick:c,disabled:a,children:n("common.actions.reset")})]}),e.jsx("div",{className:"grid gap-1.5",children:l.map(i=>{const N=g.has(i.id);return e.jsxs("label",{className:j("flex cursor-pointer items-center gap-3 rounded-xl px-3 py-2 text-sm transition hover:bg-accent",N&&"bg-primary/10 text-primary"),children:[e.jsx("input",{type:"checkbox",checked:N,onChange:()=>o(i.id),className:"h-4 w-4 rounded border-border"}),e.jsx("span",{children:i.label})]},i.id)})})]})]}),e.jsxs(_,{onClick:d,disabled:t,className:"w-full sm:w-auto",children:[e.jsx(tt,{className:"mr-2 h-4 w-4"}),n(t?"logs.actions.exporting":"logs.actions.export")]})]}),e.jsxs("div",{className:"flex w-full items-center justify-between gap-3 xl:w-auto xl:justify-start",children:[e.jsx("span",{className:"text-xs text-muted-foreground sm:text-sm",children:n("logs.summary.total",{value:f.toLocaleString()})}),e.jsxs(_,{variant:"outline",size:"sm",onClick:r,disabled:h,className:"shrink-0",children:[e.jsx(st,{className:j("mr-2 h-4 w-4",h&&"animate-spin")}),n(h?"common.actions.refreshing":"logs.actions.manualRefresh")]})]})]})}function Mt({record:l,providerLabelMap:t,apiKeyMap:d,onSelect:r,isEven:c,density:s,visibleColumnSet:o}){const{t:h}=P(),x=t.get(l.provider)??l.provider,f=l.endpoint||"-",y=Te(l,h),g=l.client_model??h("logs.table.requestedModelFallback"),n=l.api_key_id!=null?d.get(l.api_key_id):void 0,a=l.api_key_id==null?h("logs.table.apiKeyUnknown"):n!=null&&n.isWildcard?h("apiKeys.wildcard"):n!=null&&n.name?n.name:l.api_key_name?l.api_key_name:h("logs.table.apiKeyUnknown"),i=s==="compact"?"px-3 py-1.5":"px-3 py-2",N=c?"bg-muted/30":"bg-background",u=ht(l.session_id),E=u==null?void 0:u.rowStyle,k=u==null?void 0:u.stickyStyle,C=u?{...u.stickyStyle,...u.accentStyle}:void 0;return e.jsxs("tr",{"data-session-id":u==null?void 0:u.sessionId,"data-session-color":u==null?void 0:u.colorKey,className:j("transition-colors",u?"":c?"bg-muted/30":"",u?"":"hover:bg-muted/50"),style:E,onMouseEnter:F=>{u&&Object.assign(F.currentTarget.style,u.hoverStyle)},onMouseLeave:F=>{u&&Object.assign(F.currentTarget.style,u.rowStyle)},children:[e.jsx("td",{className:j("sticky left-0 z-10 text-xs",i,u?"":N),style:C,children:Re(l.timestamp)}),o.has("endpoint")&&e.jsx("td",{className:j(i,"text-xs"),children:f}),o.has("provider")&&e.jsx("td",{className:j(i,"text-xs"),children:e.jsx("div",{className:"max-w-[100px] truncate",title:x,children:x})}),o.has("requestedModel")&&e.jsx("td",{className:j(i,"text-xs text-muted-foreground"),children:e.jsx("div",{className:"max-w-[120px] truncate",title:g,children:g})}),o.has("routedModel")&&e.jsx("td",{className:j(i,"text-xs"),children:e.jsx("div",{className:"max-w-[120px] truncate",title:l.model,children:l.model})}),o.has("apiKey")&&e.jsx("td",{className:j(i,"text-xs text-muted-foreground"),children:e.jsx("div",{className:"max-w-[90px] truncate",title:a,children:a})}),o.has("inputTokens")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:Q(l.input_tokens)}),o.has("cacheReadTokens")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:Q(l.cache_read_tokens)}),o.has("cacheCreationTokens")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:Q(l.cache_creation_tokens)}),o.has("outputTokens")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:Q(l.output_tokens)}),o.has("latency")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:q(l.latency_ms,"ms")}),o.has("ttft")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:q(l.ttft_ms,"ms")}),o.has("tpot")&&e.jsx("td",{className:j(i,"text-right text-xs tabular-nums"),children:q(l.tpot_ms,"ms/tk")}),o.has("status")&&e.jsx("td",{className:j(i,"text-center"),children:e.jsx(A,{variant:y.variant,className:"text-xs",children:y.label})}),o.has("error")&&e.jsx("td",{className:j(i,"text-xs text-muted-foreground"),children:e.jsx("div",{className:"max-w-[100px] truncate",title:l.error??"",children:l.error?l.error:"-"})}),e.jsx("td",{className:j("sticky right-0 z-10 text-center",i,u?"":N),style:k,children:e.jsx(_,{variant:"outline",size:"sm",onClick:()=>r(l.id),children:h("logs.actions.detail")})})]})}function Pt(l){const{t}=P(),{tableScrollRef:d,visibleColumnSet:r,visibleColumnCount:c,logsError:s,logsPending:o,items:h,activeFiltersCount:x,handleResetFilters:f,handleRetry:y,providerLabelMap:g,apiKeyMap:n,handleOpenDetail:a,rowDensity:i,showScrollHint:N,pageSize:u,setPageSize:E,page:k,totalPages:C,setPage:F}=l;return e.jsx(De,{className:"overflow-hidden bg-card shadow-[var(--surface-shadow)]",children:e.jsxs(Fe,{className:"p-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 bg-secondary/50 px-4 py-3 border-b border-border",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-semibold",children:t("logs.title")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t("logs.actions.visibleCount",{count:c-2})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(A,{variant:"secondary",children:"Wide Table"}),e.jsx(A,{variant:"outline",className:"bg-background",children:t(i==="compact"?"logs.table.density.compact":"logs.table.density.comfortable")}),N?e.jsx(A,{variant:"warning",children:"Scroll for more"}):null]})]}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{ref:d,className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full min-w-[1480px] text-sm",children:[e.jsx("thead",{className:"border-b border-border/50 bg-secondary/50",children:e.jsxs("tr",{children:[e.jsx("th",{className:"sticky left-0 z-20 bg-secondary px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.time")}),r.has("endpoint")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.endpoint")}),r.has("provider")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.provider")}),r.has("requestedModel")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.requestedModel")}),r.has("routedModel")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.routedModel")}),r.has("apiKey")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.apiKey")}),r.has("inputTokens")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.inputTokens")}),r.has("cacheReadTokens")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.cacheReadTokens")}),r.has("cacheCreationTokens")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.cacheCreationTokens")}),r.has("outputTokens")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.outputTokens")}),r.has("latency")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.latency")}),r.has("ttft")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.ttft")}),r.has("tpot")&&e.jsx("th",{className:"px-3 py-2.5 text-right text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.tpot")}),r.has("status")&&e.jsx("th",{className:"px-3 py-2.5 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.status")}),r.has("error")&&e.jsx("th",{className:"px-3 py-2.5 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.error")}),e.jsx("th",{className:"sticky right-0 z-20 bg-secondary px-3 py-2.5 text-center text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:t("logs.table.columns.actions")})]})}),e.jsx("tbody",{className:"divide-y divide-border/50",children:o?Array.from({length:8}).map((w,L)=>e.jsx(wt,{columns:c},L)):s&&h.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:c,className:"px-3 py-6",children:e.jsx(re,{compact:!0,tone:"danger",icon:e.jsx(lt,{className:"h-5 w-5","aria-hidden":"true"}),title:t("logs.toast.listError.title"),description:s,action:e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:y,children:t("common.actions.refresh")}),x>0?e.jsx(_,{variant:"ghost",size:"sm",onClick:f,children:t("common.actions.reset")}):null]})})})}):h.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:c,className:"px-3 py-8 text-center text-sm text-muted-foreground",children:e.jsx(re,{compact:!0,tone:"primary",icon:e.jsx(Ee,{className:"h-5 w-5","aria-hidden":"true"}),title:x>0?t("logs.empty.filteredTitle"):t("logs.empty.title"),description:x>0?t("logs.empty.filteredSubtitle"):t("logs.empty.subtitle"),action:e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[x>0?e.jsx(_,{variant:"outline",size:"sm",onClick:f,children:t("logs.empty.actions.reset")}):null,e.jsx(_,{asChild:!0,variant:"ghost",size:"sm",children:e.jsx(vt,{to:"/api-keys",children:t("logs.empty.actions.apiKeys")})})]})})})}):h.map((w,L)=>e.jsx(Mt,{record:w,providerLabelMap:g,apiKeyMap:n,onSelect:a,isEven:L%2===0,density:i,visibleColumnSet:r},w.id))})]})}),N&&e.jsx("div",{className:"table-scroll-hint"})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4 bg-secondary/50 p-4 border-t border-border",children:[e.jsxs("div",{className:"flex items-center gap-2 rounded-full bg-secondary px-3 py-2",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:t("logs.table.pagination.perPage")}),e.jsxs(te,{value:u.toString(),onValueChange:w=>E(Number(w)),children:[e.jsx(se,{className:"h-8 w-[80px] bg-background",children:e.jsx(le,{})}),e.jsx(ae,{children:W.map(w=>e.jsx(M,{value:w.toString(),children:w},w))})]})]}),e.jsxs("div",{className:"flex items-center gap-2 rounded-full bg-secondary px-2 py-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:()=>F(w=>Math.max(w-1,1)),disabled:k<=1,children:t("logs.table.pagination.previous")}),e.jsx("span",{className:"metric-number px-1 text-sm text-muted-foreground",children:t("logs.table.pagination.pageLabel",{page:C===0?0:k,total:C})}),e.jsx(_,{variant:"outline",size:"sm",onClick:()=>F(w=>C===0?w:Math.min(w+1,C)),disabled:C===0||k>=C,children:t("logs.table.pagination.next")})]})]})]})})}function At({exportTimeoutMs:l,queryParams:t,total:d}){const{t:r}=P(),{pushToast:c}=fe(),[s,o]=m.useState(!1),h=m.useCallback(async()=>{if(!s){o(!0);try{const x=d>0?Math.min(d,5e3):1e3,f={...t,limit:x,offset:0},y=await he.exportArchive(f,l),g=new Date().toISOString().replace(/[:.]/g,"-"),n=URL.createObjectURL(y),a=document.createElement("a");a.href=n,a.download=`cc-gw-logs-${g}.zip`,document.body.appendChild(a),a.click(),a.remove(),URL.revokeObjectURL(n),c({title:r("logs.toast.exportSuccess.title"),description:r("logs.toast.exportSuccess.desc"),variant:"success"})}catch(x){const f=ot(x);c({title:r("logs.toast.exportError.title"),description:r("logs.toast.exportError.desc",{message:f.message}),variant:"error"})}finally{o(!1)}}},[l,s,c,t,r,d]);return{exporting:s,handleExport:h}}function zt(){const l=m.useRef(null),[t,d]=m.useState(!1),r=m.useCallback(()=>{const c=l.current;if(!c)return;const s=c.scrollWidth-c.scrollLeft-c.clientWidth>1;d(s)},[]);return m.useEffect(()=>{const c=l.current;if(!c)return;r(),c.addEventListener("scroll",r,{passive:!0});const s=new ResizeObserver(r);return s.observe(c),()=>{c.removeEventListener("scroll",r),s.disconnect()}},[r]),{scrollRef:l,showScrollHint:t,updateScrollHint:r}}function Ot(){const[l,t]=K(D.logs.density,Ft,{serialize:y=>y,deserialize:y=>y==="compact"?"compact":"comfortable"}),[d,r]=K(D.logs.visibleColumns,Dt),{scrollRef:c,showScrollHint:s}=zt(),o=m.useMemo(()=>new Set(d),[d]),h=d.length+2,x=m.useCallback(y=>{r(g=>{if(g.includes(y))return g.length===1?g:g.filter(a=>a!==y);const n=[...g,y];return n.sort((a,i)=>oe.indexOf(a)-oe.indexOf(i)),n})},[]);return{resetVisibleColumns:m.useCallback(()=>{r($)},[]),rowDensity:l,setRowDensity:t,showScrollHint:s,tableScrollRef:c,toggleColumn:x,visibleColumnCount:h,visibleColumns:d,visibleColumnSet:o}}function qt(){var ve,we,Ne,ke,Se;const{t:l}=P(),{pushToast:t}=fe(),d=Nt(),[r,c]=K(D.logs.providerFilter,"all"),[s,o]=K(D.logs.endpointFilter,"all"),[h,x]=K(D.logs.modelFilter,""),[f,y]=K(D.logs.statusFilter,"all"),[g,n]=K(D.logs.fromDate,""),[a,i]=K(D.logs.toDate,""),[N,u]=m.useState(1),[E,k]=K(D.logs.pageSize,Tt,{serialize:p=>String(p),deserialize:p=>{const v=Number(p);return W.includes(v)?v:W[0]}}),[C,F]=m.useState(null),[w,L]=m.useState(!1),[S,G]=K(D.logs.selectedApiKeys,Rt),[ie,J]=K(D.logs.filtersExpanded,!1),{resetVisibleColumns:b,rowDensity:X,setRowDensity:Le,showScrollHint:Ke,tableScrollRef:Me,toggleColumn:Pe,visibleColumnCount:Ae,visibleColumns:ze,visibleColumnSet:Oe}=Ot(),qe=m.useDeferredValue(h),T=h===""?"":qe;m.useEffect(()=>{u(1)},[r,s,T,f,g,a,E,S]);const ne=m.useMemo(()=>{const p={limit:E,offset:(N-1)*E};r!=="all"&&(p.provider=r),s!=="all"&&(p.endpoint=s),T.trim().length>0&&(p.model=T.trim()),f!=="all"&&(p.status=f);const v=_e(g),I=_e(a,!0);return v!==void 0&&(p.from=v),I!==void 0&&(p.to=I),S.length>0&&(p.apiKeys=S.join(",")),p},[T,s,g,N,E,r,S,f,a]),z=B(V.logs.list(ne),he.listRequest(ne),{gcTime:6e4}),H=B(V.providers.all(),Ce.providersRequest()),ye=B(V.apiKeys.all(),{url:"/api/keys",method:"GET"}),de=B(V.customEndpoints.all(),{url:"/api/custom-endpoints",method:"GET"}),be=B(V.config.exportTimeout(),Ce.configRequest());m.useEffect(()=>{!z.isError||!z.error||t({title:l("logs.toast.listError.title"),description:l("logs.toast.listError.desc",{message:z.error.message}),variant:"error"})},[z.error,z.isError,t,l]),m.useEffect(()=>{!H.isError||!H.error||t({title:l("logs.toast.providerError.title"),description:l("logs.toast.providerError.desc",{message:H.error.message}),variant:"error"})},[H.error,H.isError,t,l]);const ee=((ve=z.data)==null?void 0:ve.total)??0,Z=ee>0?Math.ceil(ee/E):0,Qe=((we=z.data)==null?void 0:we.items)??[],Ie=m.useMemo(()=>{var v;const p=(v=be.data)==null?void 0:v.logExportTimeoutSeconds;return typeof p=="number"&&Number.isFinite(p)?Math.min(Math.max(Math.round(p),5),600)*1e3:6e4},[(Ne=be.data)==null?void 0:Ne.logExportTimeoutSeconds]);m.useEffect(()=>{Z>0&&N>Z&&u(Z)},[N,Z]);const ce=H.data??[],pe=m.useMemo(()=>{const p=new Map;for(const v of ce)v.id&&p.set(v.id,v.label??v.id);return p},[ce]),je=m.useMemo(()=>{var v;const p=new Map;p.set("anthropic",l("logs.filters.endpointAnthropic")),p.set("openai",l("logs.filters.endpointOpenAI"));for(const I of((v=de.data)==null?void 0:v.endpoints)??[])p.set(I.id,I.label||I.id);return p},[(ke=de.data)==null?void 0:ke.endpoints,l]),Ve=m.useMemo(()=>{const p=[];if(r!=="all"){const v=pe.get(r)??r;p.push({key:"provider",label:`${l("logs.filters.provider")}: ${v}`,onRemove:()=>c("all")})}if(s!=="all"){const v=je.get(s)??s;p.push({key:"endpoint",label:`${l("logs.filters.endpoint")}: ${v}`,onRemove:()=>o("all")})}if(T.trim()&&p.push({key:"model",label:`${l("logs.filters.modelId")}: ${T.trim()}`,onRemove:()=>x("")}),f!=="all"){const v=l(f==="success"?"logs.filters.statusSuccess":"logs.filters.statusError");p.push({key:"status",label:`${l("logs.filters.status")}: ${v}`,onRemove:()=>y("all")})}return g&&p.push({key:"from",label:`${l("logs.filters.startDate")}: ${g}`,onRemove:()=>n("")}),a&&p.push({key:"to",label:`${l("logs.filters.endDate")}: ${a}`,onRemove:()=>i("")}),S.length>0&&p.push({key:"apiKeys",label:l("logs.filters.apiKeySelected",{count:S.length}),onRemove:()=>G([])}),p},[T,s,je,g,r,pe,S.length,f,l,a]),ue=ye.data??[],Ue=m.useMemo(()=>{const p=new Map;for(const v of ue)p.set(v.id,v);return p},[ue]),$e=m.useMemo(()=>oe.map(p=>({id:p,label:l(`logs.table.columns.${p}`)})),[l]),Y=m.useMemo(()=>new Date().toISOString().slice(0,10),[]),He=m.useMemo(()=>r==="all"&&s==="all"&&T.trim()===""&&f==="all"&&g===""&&a===""&&S.length===0?"all":f==="error"&&s==="all"&&r==="all"&&T.trim()===""&&g===""&&a===""&&S.length===0?"errors":Lt(g,a,Y)&&s==="all"&&r==="all"&&T.trim()===""&&f==="all"&&S.length===0?"today":s==="anthropic"&&r==="all"&&T.trim()===""&&f==="all"&&g===""&&a===""&&S.length===0?"anthropic":s==="openai"&&r==="all"&&T.trim()===""&&f==="all"&&g===""&&a===""&&S.length===0?"openai":null,[T,s,g,r,S.length,f,a,Y]),me=m.useCallback(()=>{c("all"),x(""),o("all"),y("all"),n(""),i(""),G([])},[]),Be=m.useCallback(p=>{if(u(1),me(),p!=="all"){if(p==="errors"){y("error");return}if(p==="today"){n(Y),i(Y);return}if(p==="anthropic"){o("anthropic");return}p==="openai"&&o("openai")}},[me,Y]),{exporting:We,handleExport:Ge}=At({exportTimeoutMs:Ie,queryParams:ne,total:ee}),Je=m.useCallback(p=>{d.removeQueries({queryKey:["logs","detail"],type:"inactive"}),F(p),L(!0)},[d]),Xe=m.useCallback(()=>{L(!1)},[]);return m.useEffect(()=>{w||C===null||(d.removeQueries({queryKey:V.logs.detail(C),exact:!0}),F(null))},[w,d,C]),{activeFilters:Ve,activeQuickView:He,apiKeyMap:Ue,apiKeys:ue,apiKeysQuery:ye,applyQuickView:Be,columnOptions:$e,customEndpoints:(Se=de.data)==null?void 0:Se.endpoints,endpointFilter:s,exporting:We,filtersExpanded:ie,fromDate:g,handleCloseDetail:Xe,handleExport:Ge,handleOpenDetail:Je,handleResetFilters:me,isDetailOpen:w,items:Qe,logsQuery:z,modelFilter:h,page:N,pageSize:E,providerFilter:r,providerLabelMap:pe,providerOptions:ce,rowDensity:X,resetVisibleColumns:b,selectedApiKeys:S,selectedLogId:C,setEndpointFilter:o,setFiltersExpanded:J,setFromDate:n,setModelFilter:x,setPage:u,setPageSize:k,setProviderFilter:c,setRowDensity:Le,setSelectedApiKeys:G,setStatusFilter:y,setToDate:i,showScrollHint:Ke,statusFilter:f,tableScrollRef:Me,toDate:a,toggleColumn:Pe,total:ee,totalPages:Z,visibleColumnCount:Ae,visibleColumns:ze,visibleColumnSet:Oe}}function ns(){var d;const{t:l}=P(),t=qt();return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(at,{icon:e.jsx(Ee,{className:"h-5 w-5","aria-hidden":"true"}),title:l("logs.title"),description:l("logs.description"),eyebrow:"Traffic Explorer",breadcrumb:"Gateway / Logs",helper:l("logs.filtersDescription"),badge:t.total>0?l("logs.summary.total",{value:t.total.toLocaleString()}):void 0,actions:e.jsx(Kt,{columnOptions:t.columnOptions,exporting:t.exporting,onExport:()=>void t.handleExport(),onRefresh:()=>void t.logsQuery.refetch(),onResetColumns:t.resetVisibleColumns,onSetDensity:t.setRowDensity,onToggleColumn:t.toggleColumn,refreshing:t.logsQuery.isFetching,rowDensity:t.rowDensity,total:t.total,visibleColumns:t.visibleColumns,visibleColumnSet:t.visibleColumnSet})}),e.jsx(St,{total:t.total,activeFilters:t.activeFilters,filtersExpanded:t.filtersExpanded,setFiltersExpanded:t.setFiltersExpanded,handleResetFilters:t.handleResetFilters,activeQuickView:t.activeQuickView,applyQuickView:t.applyQuickView,providerFilter:t.providerFilter,setProviderFilter:t.setProviderFilter,endpointFilter:t.endpointFilter,setEndpointFilter:t.setEndpointFilter,selectedApiKeys:t.selectedApiKeys,setSelectedApiKeys:t.setSelectedApiKeys,modelFilter:t.modelFilter,setModelFilter:t.setModelFilter,statusFilter:t.statusFilter,setStatusFilter:t.setStatusFilter,fromDate:t.fromDate,setFromDate:t.setFromDate,toDate:t.toDate,setToDate:t.setToDate,providerOptions:t.providerOptions,apiKeys:t.apiKeys,apiKeysLoading:t.apiKeysQuery.isLoading,customEndpoints:t.customEndpoints}),e.jsx(Pt,{tableScrollRef:t.tableScrollRef,visibleColumnSet:t.visibleColumnSet,visibleColumnCount:t.visibleColumnCount,logsError:t.logsQuery.isError?((d=t.logsQuery.error)==null?void 0:d.message)??null:null,logsPending:t.logsQuery.isPending,items:t.items,activeFiltersCount:t.activeFilters.length,handleResetFilters:t.handleResetFilters,handleRetry:()=>void t.logsQuery.refetch(),providerLabelMap:t.providerLabelMap,apiKeyMap:t.apiKeyMap,handleOpenDetail:t.handleOpenDetail,rowDensity:t.rowDensity,showScrollHint:t.showScrollHint,pageSize:t.pageSize,setPageSize:t.setPageSize,page:t.page,totalPages:t.totalPages,setPage:t.setPage}),e.jsx(_t,{open:t.isDetailOpen,logId:t.selectedLogId,onClose:t.handleCloseDetail,providerLabelMap:t.providerLabelMap,apiKeyMap:t.apiKeyMap})]})}export{ns as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e,aB as ge,aF as be,aG as ve,N as je,r as b,ac as ye,S as Ne}from"./vendor-z22RpOY0.js";import{L as we}from"./router-CL3rf_uf.js";import{C as ke}from"./ConfirmDialog-BHfhtrze.js";import{P as Me}from"./PageHeader-DLI9m-gU.js";import{B as h}from"./app-CfipX5HX.js";import{D as W,A as J,a as Z,b as $,c as ee,d as re,e as se}from"./DialogShell-BpzUpswv.js";import{u as A}from"./i18n-Bl2BcCDG.js";import{B as ae}from"./queryKeys-DifG1fTh.js";import{C as te,a as de}from"./card-BE_b5SvI.js";import{I as M}from"./input-Brr3avKW.js";import{L as D}from"./label-Bc4vkpLF.js";import{S as De}from"./switch-fb9u33D-.js";import{u as Ce}from"./useModelManagementState-1NXqPQ5M.js";import{c as Pe}from"./global-xoXYOIOz.js";import"./query-BbGWgOFk.js";import"./radix-mHySgtou.js";import"./gateway-Zpcl3bpd.js";import"./useAppMutation-BjZN2gaQ.js";import"./useApiQuery-DCgUtGKI.js";function Te({open:t,provider:s,onClose:n,onEdit:f}){const{t:u}=A();return s?e.jsx(W,{open:t,onOpenChange:v=>!v&&n(),children:e.jsxs(J,{className:"max-w-md",children:[e.jsxs(Z,{children:[e.jsx($,{children:u("providers.noModelDialog.title")}),e.jsx(ee,{children:u("providers.noModelDialog.subtitle",{name:s.label||s.id})})]}),e.jsxs(re,{className:"space-y-4",children:[e.jsx("div",{className:"rounded-xl bg-accent p-4 text-sm text-primary",children:u("providers.noModelDialog.description")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:u("providers.noModelDialog.hint")})]}),e.jsxs(se,{children:[e.jsx(h,{variant:"outline",onClick:n,children:u("common.actions.close")}),e.jsx(h,{onClick:()=>f(s),children:u("providers.noModelDialog.primary")})]})]})}):null}function Ue({providersLength:t,filteredProviders:s,defaultLabels:n,providerSearch:f,providerTypeFilter:u,configPending:v,testingProviderId:a,onOpenEdit:d,onTestConnection:i,onRequestDelete:m,onProviderSearchChange:j,onResetFilters:N}){const{t:g}=A(),S=x=>{const C=x.authMode??(x.type==="anthropic"?"authToken":"apiKey");return C==="authToken"?"Bearer":C==="xAuthToken"?"X-Auth-Token":x.type==="anthropic"?"X-API-Key":g("providers.card.providerDefault")};return e.jsx(te,{className:"rounded-[1.35rem] border border-white/70 bg-card/95 shadow-[0_22px_56px_-46px_rgba(15,23,42,0.24)]",children:e.jsxs(de,{className:"space-y-4 p-4 sm:p-5",children:[e.jsxs("div",{className:"flex flex-col gap-3 rounded-[1.1rem] bg-secondary/60 p-3 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx(M,{value:f,onChange:x=>j(x.target.value),placeholder:g("providers.filters.searchPlaceholder"),className:"h-10 bg-card/90 sm:max-w-[520px]"})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(ae,{variant:"secondary",className:"rounded-full px-3 py-1 text-xs",children:g("providers.count",{count:s.length})}),e.jsx(h,{variant:"ghost",size:"sm",onClick:N,disabled:!f.trim()&&u==="all",className:"h-8 rounded-full px-3 text-xs",children:g("common.actions.reset")})]})]}),v?e.jsx("div",{className:"flex min-h-[200px] items-center justify-center rounded-lg bg-secondary text-sm text-muted-foreground",children:g("common.loading")}):t===0?e.jsxs("div",{className:"rounded-lg border-2 border-dashed border-border/30 p-12 text-center text-sm text-muted-foreground",children:[e.jsx("p",{className:"font-medium",children:g("providers.emptyState")}),e.jsx("p",{className:"mt-2 text-xs",children:g("providers.emptyStateSub",{default:"点击上方按钮添加您的第一个提供商"})})]}):s.length===0?e.jsx("div",{className:"rounded-lg border-2 border-dashed border-border/30 p-12 text-center text-sm text-muted-foreground",children:e.jsx("p",{className:"font-medium",children:g("providers.emptyFiltered")})}):e.jsx("div",{className:"space-y-3",children:e.jsx("div",{className:"grid gap-2.5 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5",children:s.map(x=>{var y;const C=S(x),P=((y=x.models)==null?void 0:y.length)??0,T=n.get(x.id);return e.jsx(Ae,{provider:x,authMode:C,modelCount:P,defaultModel:T,isTesting:a===x.id,onEdit:()=>d(x),onTest:()=>i(x),onDelete:()=>m(x),t:g},x.id)})})})]})})}function Ae({provider:t,authMode:s,modelCount:n,defaultModel:f,isTesting:u,onEdit:v,onTest:a,onDelete:d,t:i}){const m=!!f,j=m?"success":"warning",N=i(m?"providers.status.ready":"providers.status.needsDefault");return e.jsx(te,{"data-testid":"provider-card",className:"overflow-hidden rounded-[1rem] border border-border/60 bg-[linear-gradient(180deg,rgba(255,255,255,0.97)_0%,rgba(250,251,253,0.94)_100%)] shadow-[0_14px_32px_-30px_rgba(15,23,42,0.2)] transition-all duration-200 hover:-translate-y-0.5 hover:shadow-[0_20px_38px_-32px_rgba(59,130,246,0.18)] dark:border-white/10 dark:bg-[linear-gradient(180deg,rgba(15,23,42,0.92)_0%,rgba(2,6,23,0.88)_100%)]",children:e.jsxs(de,{className:"space-y-2.5 p-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2.5",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"flex min-w-0 items-center gap-2.5",children:e.jsx("h3",{className:"truncate text-[14px] font-semibold tracking-[-0.02em] text-foreground",title:t.label||t.id,children:t.label||t.id})}),e.jsx("code",{className:"mt-0.5 block truncate text-[11px] text-muted-foreground",title:t.id,children:t.id})]}),e.jsx(ae,{variant:j,className:"shrink-0 rounded-full px-2 py-0.5 text-[10px]",children:N})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-1.5 text-[11px]",children:[e.jsx(Q,{icon:e.jsx(ge,{className:"h-3.5 w-3.5"}),label:i("providers.card.authMode"),value:s}),e.jsx(Q,{icon:e.jsx(be,{className:"h-3.5 w-3.5"}),label:i("providers.card.modelsTitle"),value:n>0?i("providers.card.modelCount",{count:n}):i("providers.card.passthrough")})]}),e.jsxs("div",{className:"space-y-1.5 rounded-[0.85rem] bg-secondary/45 p-2 shadow-[inset_0_1px_0_rgba(255,255,255,0.55)] dark:bg-slate-900/[0.42]",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2 text-[11px] text-muted-foreground",children:[e.jsx(ve,{className:"h-3.5 w-3.5 shrink-0"}),e.jsx("code",{className:"truncate",title:t.baseUrl,children:t.baseUrl})]}),e.jsxs("div",{className:"flex min-w-0 items-center justify-between gap-2",children:[e.jsx("span",{className:"shrink-0 text-[10px] font-medium uppercase tracking-[0.14em] text-muted-foreground/70",children:i("providers.card.defaultModelLabel")}),f?e.jsx("code",{className:"min-w-0 truncate rounded-full border border-border/65 bg-background/82 px-2 py-0.5 text-[10px] text-foreground dark:border-white/10 dark:bg-slate-950/[0.58]",title:f,children:f}):e.jsx("span",{className:"truncate text-[11px] text-muted-foreground",children:i("providers.card.noDefault")})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-1 border-t border-border/45 pt-2",children:[e.jsx(h,{variant:"ghost",size:"sm",onClick:v,className:"h-7 rounded-full px-2 text-[11px]",children:i("providers.actions.edit")}),e.jsx(h,{variant:"ghost",size:"sm",onClick:a,disabled:u,className:"h-7 rounded-full px-2 text-[11px]",children:u?e.jsxs(e.Fragment,{children:[e.jsx(je,{className:"mr-1 h-3 w-3 animate-spin"}),i("common.actions.testingConnection")]}):i("providers.actions.test")}),e.jsx(h,{variant:"ghost",size:"sm",onClick:d,className:"h-7 rounded-full px-2 text-[11px] text-destructive hover:bg-destructive/10 hover:text-destructive",children:i("providers.actions.delete")})]})]})})}function Q({icon:t,label:s,value:n}){return e.jsxs("div",{className:"min-w-0 rounded-[0.75rem] bg-secondary/55 px-2 py-1.5 shadow-[inset_0_1px_0_rgba(255,255,255,0.58)] dark:bg-slate-900/[0.5]",children:[e.jsxs("div",{className:"mb-0.5 flex min-w-0 items-center gap-1.5 text-[10px] font-medium text-muted-foreground",children:[t,e.jsx("span",{className:"truncate",children:s})]}),e.jsx("p",{className:"truncate text-[11px] font-medium text-foreground",title:n,children:n})]})}function Se({open:t,provider:s,options:n,usePreset:f,preservedExtras:u,onPresetChange:v,onConfirm:a,onClose:d}){const{t:i}=A();return s?e.jsx(W,{open:t,onOpenChange:m=>!m&&d(),children:e.jsxs(J,{className:"max-w-2xl",children:[e.jsxs(Z,{children:[e.jsx($,{children:i("providers.testDialog.title")}),e.jsx(ee,{children:i("providers.testDialog.subtitle",{name:s.label||s.id})})]}),e.jsxs(re,{className:"space-y-4",children:[e.jsx("div",{className:"rounded-xl bg-accent p-4 text-sm text-primary",children:i("providers.testDialog.description")}),e.jsxs("div",{className:"space-y-4 rounded-xl bg-secondary/50 p-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"provider-test-preset",children:i("providers.testDialog.presetLabel")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:i("providers.testDialog.presetDescription")})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(De,{id:"provider-test-preset",checked:f,onCheckedChange:v})})]}),f?e.jsx("div",{className:"space-y-2",children:e.jsxs("details",{className:"rounded-xl border border-transparent bg-card p-2 text-xs shadow-[var(--surface-shadow)]",children:[e.jsx("summary",{className:"cursor-pointer text-primary hover:underline",children:i("providers.testDialog.presetPreviewSummary")}),e.jsx("div",{className:"mt-2 space-y-1",children:n.map(m=>e.jsxs("code",{className:"block rounded-lg bg-secondary px-2 py-1 text-xs",children:[m.key,": ",m.value]},m.key))})]})}):e.jsx("p",{className:"text-xs text-muted-foreground",children:i("providers.testDialog.presetDescription")})]}),Object.keys(u).length>0&&e.jsxs("div",{className:"space-y-2 rounded-xl bg-secondary/50 p-4 text-xs",children:[e.jsx("p",{className:"font-medium",children:i("providers.testDialog.preservedInfo")}),Object.entries(u).map(([m,j])=>e.jsxs("code",{className:"block rounded-lg border border-transparent bg-card px-2 py-1 shadow-[var(--surface-shadow)]",children:[m,": ",j]},m))]})]}),e.jsxs(se,{children:[e.jsx(h,{variant:"outline",onClick:d,children:i("providers.testDialog.cancel")}),e.jsx(h,{onClick:()=>void a(),children:i("providers.testDialog.primary")})]})]})}):null}function F(){return typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function"?globalThis.crypto.randomUUID():Math.random().toString(36).slice(2,10)}function _e(){return{_key:F(),id:"",label:""}}const E={openai:{baseUrl:"https://api.openai.com/v1"},deepseek:{baseUrl:"https://api.deepseek.com/v1"},huawei:{baseUrl:"https://api.modelarts-maas.com/v1"},kimi:{baseUrl:"https://api.moonshot.cn/v1"},anthropic:{baseUrl:"https://api.anthropic.com/v1"},custom:{}},V=[{value:"openai",label:"OpenAI"},{value:"deepseek",label:"DeepSeek"},{value:"huawei",label:"Huawei Cloud"},{value:"kimi",label:"Kimi"},{value:"anthropic",label:"Anthropic"},{value:"custom",label:"Custom"}];function I(t){return t==="anthropic"?"authToken":"apiKey"}function Y(t){return t?{id:t.id,label:t.label??t.id,baseUrl:t.baseUrl,apiKey:t.apiKey??"",type:t.type??"custom",defaultModel:t.defaultModel??"",models:(t.models??[]).map(s=>({...s,_key:F()})),authMode:t.authMode??I(t.type??"custom")}:{id:"",label:"",baseUrl:"",apiKey:"",type:"custom",defaultModel:"",models:[],authMode:I("custom")}}function Ee(t){return{_key:F(),id:t.id,label:t.label}}function Ie({open:t,mode:s,provider:n,existingProviderIds:f,onClose:u,onSubmit:v}){const{t:a}=A(),[d,i]=b.useState(()=>Y(n)),[m,j]=b.useState({}),[N,g]=b.useState(!1),[S,x]=b.useState(null),C=b.useRef(null),P=b.useRef(null),T=b.useRef(null),[y,H]=b.useState(s==="edit");b.useEffect(()=>{t&&(i(Y(n)),j({}),x(null),g(!1),H(s==="edit"))},[t,n,s]),b.useEffect(()=>{if(!t)return;const r=l=>{l.key==="Escape"&&u()};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[t,u]),b.useEffect(()=>{if(t){if(s==="create"&&T.current){T.current.focus();return}P.current&&P.current.focus()}},[t,s]);const L=s==="create",K=b.useMemo(()=>d.models.filter(r=>r.id.trim().length>0),[d.models]),z=b.useMemo(()=>{var r;return((r=V.find(l=>l.value===d.type))==null?void 0:r.label)??"Custom"},[d.type]),q=(r,l)=>a(l==="authToken"?"providers.drawer.fields.authModeAuthToken":l==="xAuthToken"?"providers.drawer.fields.authModeXAuthToken":r==="anthropic"?"providers.drawer.fields.authModeApiKey":"providers.drawer.fields.authModeProviderDefault"),le=d.label.trim()||d.id.trim()||a("providers.drawer.summary.untitled"),X=b.useMemo(()=>[{label:a("providers.drawer.summary.type"),value:z},{label:a("providers.drawer.summary.auth"),value:q(d.type,d.authMode)},{label:a("providers.drawer.summary.models"),value:K.length.toLocaleString()}],[K.length,d.authMode,d.type,z,a]),O=r=>l=>{i(c=>({...c,[r]:l}))},ie=r=>{i(l=>{const o=!y||l.label.trim().length===0||l.label===l.id?r:l.label;return{...l,id:r,label:o}})},oe=r=>{i(l=>{var G;const o=E[r??"custom"]??E.custom,p=I(l.type),w=I(r),k=Object.values(E).map(U=>U.baseUrl).filter(U=>!!U),B=!l.baseUrl||k.includes(l.baseUrl),fe=s==="create"&&(l.models.length===0||l.models.every(U=>U.id.trim().length===0)),_={...l,type:r,authMode:l.authMode===p?w:l.authMode};return o!=null&&o.baseUrl&&B&&(_.baseUrl=o.baseUrl),o!=null&&o.models&&fe&&(_.models=o.models.map(Ee),_.defaultModel=o.defaultModel??((G=o.models[0])==null?void 0:G.id)??""),_})},ne=(r,l)=>{i(c=>{const o=[...c.models];return o[r]={...o[r],...l},{...c,models:o}})},ce=(r,l)=>{i(c=>{const o=[...c.models],p=o[r];if(!p)return c;const w=!y||!p.label||p.label===p.id,k={...p,id:l,label:w?l:p.label};o[r]=k;const B=c.defaultModel===p.id?l:c.defaultModel;return{...c,models:o,defaultModel:B}})},me=r=>{i(l=>{if(r<0||r>=l.models.length)return l;const c=l.models.filter((p,w)=>w!==r);let o=l.defaultModel;return c.some(p=>p.id===o)||(o=""),{...l,models:c,defaultModel:o}})},ue=()=>{i(r=>({...r,models:[...r.models,_e()]}))},R=r=>{i(l=>({...l,authMode:r}))},xe=()=>{const r={},l=d.id.trim(),c=d.baseUrl.trim();if(s==="create"&&(l.length===0?r.id=a("providers.drawer.errors.idRequired"):f.includes(l)&&(r.id=a("providers.drawer.errors.idDuplicate"))),s==="edit"&&l.length===0&&(r.id=a("providers.drawer.errors.idRequired")),c.length===0)r.baseUrl=a("providers.drawer.errors.baseUrlInvalid");else try{new URL(c)}catch{r.baseUrl=a("providers.drawer.errors.baseUrlInvalid")}if(d.models.length>0){const o=new Set;d.models.some(w=>{const k=w.id.trim();return k.length===0||o.has(k)?!0:(o.add(k),!1)})&&(r.models=a("providers.drawer.errors.modelInvalid"))}return d.defaultModel&&!d.models.some(o=>o.id===d.defaultModel)&&(r.models=a("providers.drawer.errors.defaultInvalid")),j(r),Object.keys(r).length===0},pe=()=>{const r=d.models.map(o=>{var p;return{id:o.id.trim(),label:(p=o.label)!=null&&p.trim()?o.label.trim():void 0}}).filter(o=>o.id.length>0),l=n!=null&&n.extraHeaders&&Object.keys(n.extraHeaders).length>0?n.extraHeaders:void 0,c=d.authMode==="apiKey"&&d.type!=="anthropic"?void 0:d.authMode;return{id:d.id.trim(),label:d.label.trim()||d.id.trim(),baseUrl:d.baseUrl.trim(),apiKey:d.apiKey.trim()||void 0,type:d.type??"custom",defaultModel:d.defaultModel||void 0,models:r.length>0?r:void 0,extraHeaders:l,authMode:c}},he=async()=>{if(x(null),!!xe()){g(!0);try{const r=pe();await v(r)}catch(r){x(a("providers.drawer.toast.saveFailure",{message:r instanceof Error?r.message:"unknown"})),g(!1);return}g(!1),u()}};return t?e.jsxs("div",{className:"fixed inset-0 z-50 flex",children:[e.jsx("div",{className:"flex-1 bg-background/80 backdrop-blur-sm",onClick:u,"aria-hidden":"true"}),e.jsxs("aside",{ref:C,role:"dialog","aria-modal":"true","aria-labelledby":"provider-drawer-title","aria-describedby":"provider-drawer-desc",className:"flex h-full min-h-0 w-full max-w-5xl flex-col border-l border-border/45 bg-background/96 shadow-[var(--surface-shadow-lg)] backdrop-blur",children:[e.jsxs("header",{className:"border-b border-border/45 bg-secondary/45 px-6 py-5 backdrop-blur-sm",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"inline-flex rounded-full border border-primary/20 bg-primary/10 px-3 py-1 text-[11px] font-medium uppercase tracking-[0.18em] text-primary",children:a(L?"providers.drawer.quickStart":"providers.drawer.editTitle")}),e.jsxs("div",{children:[e.jsx("h2",{id:"provider-drawer-title",className:"text-lg font-semibold tracking-[-0.02em]",children:a(L?"providers.drawer.createTitle":"providers.drawer.editTitle")}),e.jsx("p",{id:"provider-drawer-desc",className:"text-sm text-muted-foreground",children:a("providers.drawer.description")})]})]}),e.jsx(h,{type:"button",ref:P,variant:"outline",onClick:u,className:"bg-card",children:a("common.actions.close")})]}),e.jsx("div",{className:"mt-4 grid gap-3 md:grid-cols-3",children:X.map(r=>e.jsxs("div",{className:"rounded-xl border border-transparent bg-card px-4 py-3 shadow-[var(--surface-shadow)]",children:[e.jsx("p",{className:"text-[11px] font-medium uppercase tracking-[0.16em] text-muted-foreground",children:r.label}),e.jsx("p",{className:"mt-2 text-sm font-semibold text-foreground",children:r.value})]},r.label))})]}),e.jsxs("div",{className:"grid min-h-0 flex-1 overflow-hidden xl:grid-cols-[minmax(0,1fr)_280px]",children:[e.jsxs("div",{className:"min-h-0 overflow-y-auto px-6 py-5 pb-10",children:[e.jsxs("section",{className:"space-y-5","aria-labelledby":"provider-type-fields",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h3",{id:"provider-type-fields",className:"text-sm font-semibold",children:a("providers.drawer.sections.type")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("providers.drawer.hints.type")})]}),e.jsx("div",{className:"grid gap-2 md:grid-cols-3",children:V.map(r=>{var c;const l=r.value===d.type;return e.jsxs("button",{type:"button",onClick:()=>oe(r.value),className:Pe("rounded-2xl border px-4 py-3 text-left transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",l?"border-primary bg-primary/10 text-primary shadow-sm":"border-border bg-card text-foreground hover:border-primary/20 hover:bg-accent/50"),children:[e.jsx("div",{className:"text-sm font-semibold",children:r.label}),e.jsx("div",{className:"mt-1 text-xs text-muted-foreground",children:((c=E[r.value??"custom"])==null?void 0:c.baseUrl)??a("providers.drawer.hints.customProvider")})]},r.value??"custom")})})]}),e.jsxs("section",{className:"mt-8 space-y-4","aria-labelledby":"provider-basic-info",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h3",{id:"provider-basic-info",className:"text-sm font-semibold",children:a("providers.drawer.sections.basic")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("providers.drawer.hints.basic")})]}),e.jsx(h,{type:"button",variant:"outline",size:"sm",onClick:()=>H(r=>!r),className:"bg-card text-xs",children:a(y?"providers.drawer.fields.hideAdvanced":"providers.drawer.fields.showAdvanced")})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(D,{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:a("providers.drawer.fields.id")}),e.jsx(M,{value:d.id,ref:T,onChange:r=>ie(r.target.value),disabled:!L,placeholder:a("providers.drawer.fields.idPlaceholder"),"aria-invalid":!!m.id}),m.id?e.jsx("span",{className:"text-xs text-destructive",children:m.id}):null]}),e.jsxs(D,{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:a("providers.drawer.fields.label")}),e.jsx(M,{value:d.label,onChange:r=>O("label")(r.target.value),placeholder:a("providers.drawer.fields.labelPlaceholder")})]})]}),e.jsxs(D,{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:a("providers.drawer.fields.baseUrl")}),e.jsx(M,{value:d.baseUrl,onChange:r=>O("baseUrl")(r.target.value),placeholder:a("providers.drawer.fields.baseUrlPlaceholder"),"aria-invalid":!!m.baseUrl}),m.baseUrl?e.jsx("span",{className:"text-xs text-destructive",children:m.baseUrl}):null]})]}),e.jsxs("section",{className:"mt-8 space-y-4","aria-labelledby":"provider-auth-fields",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h3",{id:"provider-auth-fields",className:"text-sm font-semibold",children:a("providers.drawer.sections.auth")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("providers.drawer.hints.auth")})]}),e.jsxs(D,{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:a("providers.drawer.fields.apiKey")}),e.jsx(M,{value:d.apiKey,onChange:r=>O("apiKey")(r.target.value),placeholder:a("providers.drawer.fields.apiKeyPlaceholder")})]}),e.jsxs("fieldset",{className:"grid gap-2 rounded-xl border border-transparent bg-card p-4 text-xs shadow-[var(--surface-shadow)]",children:[e.jsx("legend",{className:"px-1 text-muted-foreground",children:a("providers.drawer.fields.authMode")}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:a("providers.drawer.fields.authModeHint")}),e.jsxs("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-transparent px-3 py-2 transition hover:bg-accent focus-within:bg-accent",children:[e.jsx("input",{type:"radio",name:"provider-auth-mode",value:"apiKey",checked:d.authMode==="apiKey",onChange:()=>R("apiKey"),className:"mt-0.5 h-4 w-4 accent-[hsl(var(--primary))]"}),e.jsx("span",{children:q(d.type,"apiKey")})]}),e.jsxs("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-transparent px-3 py-2 transition hover:bg-accent focus-within:bg-accent",children:[e.jsx("input",{type:"radio",name:"provider-auth-mode",value:"authToken",checked:d.authMode==="authToken",onChange:()=>R("authToken"),className:"mt-0.5 h-4 w-4 accent-[hsl(var(--primary))]"}),e.jsx("span",{children:a("providers.drawer.fields.authModeAuthToken")})]}),e.jsxs("label",{className:"flex cursor-pointer items-start gap-3 rounded-xl border border-transparent px-3 py-2 transition hover:bg-accent focus-within:bg-accent",children:[e.jsx("input",{type:"radio",name:"provider-auth-mode",value:"xAuthToken",checked:d.authMode==="xAuthToken",onChange:()=>R("xAuthToken"),className:"mt-0.5 h-4 w-4 accent-[hsl(var(--primary))]"}),e.jsx("span",{children:a("providers.drawer.fields.authModeXAuthToken")})]})]})]}),e.jsxs("section",{className:"mt-8 space-y-4","aria-labelledby":"provider-model-fields",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h3",{id:"provider-model-fields",className:"text-sm font-semibold",children:a("providers.drawer.fields.models")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:a("providers.drawer.modelsDescription")})]}),e.jsx(h,{type:"button",variant:"outline",size:"sm",onClick:ue,className:"bg-card text-xs",children:a("providers.drawer.fields.addModel")})]}),m.models?e.jsx("p",{className:"text-xs text-destructive",children:m.models}):null,e.jsxs("div",{className:"space-y-4",children:[d.models.map((r,l)=>e.jsxs("div",{className:"rounded-xl border border-transparent bg-card p-4 shadow-[var(--surface-shadow)]",children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs(D,{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:a("providers.drawer.fields.modelId")}),e.jsx(M,{value:r.id,onChange:c=>ce(l,c.target.value),placeholder:a("providers.drawer.fields.modelIdPlaceholder")})]}),y?e.jsxs(D,{className:"flex flex-col gap-2 text-sm",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:a("providers.drawer.fields.modelLabel")}),e.jsx(M,{value:r.label??"",onChange:c=>ne(l,{label:c.target.value}),placeholder:a("providers.drawer.fields.modelLabelPlaceholder")})]}):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-muted-foreground",children:[e.jsx("input",{type:"radio",name:"defaultModel",value:r.id,checked:d.defaultModel===r.id,onChange:()=>i(c=>({...c,defaultModel:r.id})),disabled:r.id.trim().length===0,className:"h-4 w-4 accent-[hsl(var(--primary))]"}),a("providers.drawer.fields.setDefault")]}),e.jsx(h,{type:"button",variant:"ghost",size:"sm",className:"h-auto px-2 text-destructive",onClick:()=>me(l),disabled:d.models.length===0,children:a("providers.drawer.fields.removeModel")})]})]},r._key)),d.models.length===0?e.jsx("div",{className:"rounded-xl border border-amber-200 bg-amber-50 p-5 dark:border-amber-800 dark:bg-amber-950/30",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-semibold text-amber-900 dark:text-amber-200",children:a("providers.drawer.noModelsTitle")}),e.jsx("p",{className:"text-xs leading-relaxed text-amber-800 dark:text-amber-300",children:a("providers.drawer.noModelsHint",{providerId:d.id||"provider-id"})}),e.jsxs("div",{className:"rounded-lg bg-secondary/50 p-2.5",children:[e.jsx("p",{className:"mb-1.5 text-xs font-medium text-foreground",children:a("providers.drawer.routeExample")}),e.jsxs("code",{className:"block rounded-lg border border-transparent bg-card px-2.5 py-1.5 font-mono text-xs text-foreground shadow-[var(--surface-shadow)]",children:['"claude-*": "',(d.id||"provider-id").trim()||"provider-id",':*"']})]})]})}):null]}),K.length>1?e.jsx("div",{className:"text-xs text-muted-foreground",children:a("providers.drawer.defaultHint",{model:d.defaultModel||a("providers.card.noDefault")})}):null]})]}),e.jsx("aside",{className:"hidden min-h-0 overflow-y-auto border-l border-border/45 bg-secondary/40 px-5 py-5 xl:block",children:e.jsxs("div",{className:"sticky top-0 space-y-5",children:[e.jsxs("div",{className:"rounded-xl border border-transparent bg-card p-4 shadow-[var(--surface-shadow)]",children:[e.jsx("p",{className:"text-[11px] font-medium uppercase tracking-[0.16em] text-muted-foreground",children:a("providers.drawer.formSummary")}),e.jsx("p",{className:"mt-2 text-base font-semibold",children:le}),e.jsx("div",{className:"mt-4 space-y-3 text-sm",children:X.map(r=>e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:r.label}),e.jsx("span",{className:"text-right font-medium",children:r.value})]},r.label))})]}),e.jsxs("div",{className:"rounded-xl border border-transparent bg-card p-4 shadow-[var(--surface-shadow)]",children:[e.jsx("p",{className:"text-[11px] font-medium uppercase tracking-[0.16em] text-muted-foreground",children:a("providers.drawer.sections.checklist")}),e.jsxs("ul",{className:"mt-3 space-y-2 text-sm text-muted-foreground",children:[e.jsx("li",{children:a("providers.drawer.hints.checkUrl")}),e.jsx("li",{children:a("providers.drawer.hints.checkAuth")}),e.jsx("li",{children:a("providers.drawer.hints.checkModels")})]})]}),y&&e.jsxs("div",{className:"rounded-xl bg-accent p-4 text-sm text-foreground",children:[e.jsx("p",{className:"font-medium text-primary",children:a("providers.drawer.hints.advancedTitle")}),e.jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:a("providers.drawer.hints.advancedBody")})]})]})})]}),e.jsxs("footer",{className:"flex items-center justify-between gap-3 border-t border-border/45 bg-secondary/45 px-6 py-4 text-sm backdrop-blur-sm",children:[e.jsx("div",{className:"flex flex-col text-xs text-destructive","aria-live":"polite",children:S?e.jsx("span",{children:S}):null}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{type:"button",variant:"outline",onClick:u,disabled:N,className:"bg-card",children:a("common.actions.cancel")}),e.jsx(h,{type:"button",onClick:he,disabled:N,children:a(N?"common.actions.saving":"common.actions.save")})]})]})]})]}):null}function rr(){const{t}=A(),s=Ce();return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Me,{icon:e.jsx(Ne,{className:"h-5 w-5","aria-hidden":"true"}),title:t("providers.title"),description:t("providers.description"),eyebrow:t("modelManagement.providersEyebrow"),breadcrumb:"Gateway / Providers",badge:t("providers.count",{count:s.providerCount}),actions:e.jsxs("div",{className:"flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:flex-wrap sm:justify-end",children:[e.jsx(h,{asChild:!0,variant:"outline",className:"w-full sm:w-auto",children:e.jsxs(we,{to:"/routing",children:[t("nav.routing"),e.jsx(ye,{className:"h-4 w-4","aria-hidden":"true"})]})}),e.jsx(h,{onClick:s.handleOpenCreate,className:"w-full sm:w-auto",children:t("providers.actions.add")})]})}),e.jsx(Ue,{configPending:s.configQuery.isPending||!s.config&&s.configQuery.isFetching,defaultLabels:s.defaultLabels,filteredProviders:s.filteredProviders,onOpenEdit:s.handleOpenEdit,onRequestDelete:n=>s.setConfirmAction({kind:"provider",provider:n}),onResetFilters:()=>{s.setProviderSearch(""),s.setProviderTypeFilter("all")},onProviderSearchChange:s.setProviderSearch,onProviderTypeChange:s.setProviderTypeFilter,onTestConnection:s.initiateTestConnection,providerSearch:s.providerSearch,providerTypeFilter:s.providerTypeFilter,providersLength:s.providers.length,testingProviderId:s.testingProviderId}),e.jsx(Ie,{open:s.drawerOpen,mode:s.drawerMode,provider:s.drawerMode==="edit"?s.editingProvider:void 0,existingProviderIds:s.providers.map(n=>n.id).filter(n=>s.drawerMode==="edit"&&s.editingProvider?n!==s.editingProvider.id:!0),onClose:()=>{s.setDrawerOpen(!1),s.setEditingProvider(void 0),s.setDrawerMode("create")},onSubmit:s.handleProviderSubmit}),e.jsx(Se,{open:s.testDialogOpen,provider:s.testDialogProvider,options:s.anthropicTestHeaderOptions,preservedExtras:s.testDialogPreservedExtras,usePreset:s.testDialogUsePreset,onPresetChange:s.setTestDialogUsePreset,onConfirm:s.confirmTestDialog,onClose:s.closeTestDialog}),e.jsx(Te,{open:!!s.noModelDialogProvider,provider:s.noModelDialogProvider,onClose:()=>s.setNoModelDialogProvider(null),onEdit:n=>{s.setNoModelDialogProvider(null),s.handleOpenEdit(n)}}),e.jsx(ke,{open:!!s.confirmAction,onOpenChange:n=>{!n&&!s.confirmingAction&&s.setConfirmAction(null)},title:s.confirmDialogTitle,description:s.confirmDialogDescription,confirmLabel:s.confirmingAction?t("common.actions.loading"):t("common.delete"),cancelLabel:t("common.actions.cancel"),loading:s.confirmingAction,onConfirm:s.handleConfirmDialog,children:s.confirmDialogName?e.jsx("div",{className:"rounded-xl border border-destructive/20 bg-destructive/5 px-3 py-2 font-mono text-xs text-foreground",children:s.confirmDialogName}):null})]})}export{rr as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as e}from"./vendor-
|
|
1
|
+
import{j as e}from"./vendor-z22RpOY0.js";import{c as m}from"./global-xoXYOIOz.js";function c({icon:a,title:i,description:t,badge:d,eyebrow:r,breadcrumb:s,helper:l,actions:n,className:x}){return e.jsxs("div",{className:m("flex flex-col gap-4 rounded-[1.45rem] border border-white/70 bg-[linear-gradient(180deg,rgba(255,255,255,0.78)_0%,rgba(255,255,255,0.46)_100%)] p-5 shadow-[0_24px_64px_-48px_rgba(15,23,42,0.22)] backdrop-blur dark:border-white/10 dark:bg-[linear-gradient(180deg,rgba(15,23,42,0.78)_0%,rgba(2,6,23,0.52)_100%)] dark:shadow-[0_24px_64px_-48px_rgba(0,0,0,0.7)] sm:flex-row sm:items-start sm:justify-between sm:p-6",x),children:[e.jsxs("div",{className:"min-w-0 space-y-3",children:[(r||s)&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-[11px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/75",children:[r?e.jsx("span",{className:"inline-flex items-center rounded-full bg-primary/10 px-2.5 py-1 text-primary/80",children:r}):null,s?e.jsx("span",{children:s}):null]}),e.jsxs("div",{className:"flex flex-wrap items-start gap-3",children:[a?e.jsx("span",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl bg-[linear-gradient(135deg,hsl(var(--primary)/0.14),hsl(var(--primary)/0.04))] text-primary shadow-[inset_0_1px_0_rgba(255,255,255,0.68)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]",children:a}):null,e.jsxs("div",{className:"min-w-0 space-y-1.5",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-[1.75rem] font-semibold tracking-[-0.03em] text-foreground",children:i}),d&&e.jsx("span",{className:"inline-flex items-center rounded-full bg-secondary px-3 py-1 text-xs font-medium text-muted-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.68)] dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.06)]",children:d})]}),t&&e.jsx("p",{className:"max-w-3xl text-sm leading-6 text-muted-foreground",children:t}),l&&e.jsx("div",{className:"inline-flex max-w-full items-center rounded-full border border-border/55 bg-background/72 px-3 py-1.5 text-xs text-muted-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.7)] dark:border-white/10 dark:bg-slate-950/42 dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.05)]",children:l})]})]})]}),n&&e.jsx("div",{className:"w-full shrink-0 self-start sm:w-auto",children:n})]})}export{c as P};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as s}from"./vendor-
|
|
1
|
+
import{j as s}from"./vendor-z22RpOY0.js";import{c as x}from"./global-xoXYOIOz.js";function i({title:r,description:e,eyebrow:a,actions:t,className:d,contentClassName:l,children:c}){const m=r||e||a||t;return s.jsxs("div",{className:x("rounded-[1.35rem] border border-white/70 bg-card/95 shadow-[0_22px_56px_-46px_rgba(15,23,42,0.24)] backdrop-blur",d),children:[m&&s.jsxs("div",{className:"flex flex-col gap-4 p-6 pb-0 sm:flex-row sm:items-start sm:justify-between",children:[s.jsxs("div",{className:"min-w-0 space-y-1.5",children:[a?s.jsx("div",{className:"text-[11px] font-semibold uppercase tracking-[0.16em] text-primary/78",children:a}):null,typeof r=="string"?s.jsx("h2",{className:"text-base font-semibold text-foreground",children:r}):r,e&&(typeof e=="string"?s.jsx("p",{className:"text-sm text-muted-foreground/70",children:e}):s.jsx("div",{className:"text-sm text-muted-foreground/70",children:e}))]}),t&&s.jsx("div",{className:"w-full shrink-0 sm:w-auto",children:t})]}),s.jsx("div",{className:x("p-6",!m&&"pt-6",l),children:c})]})}export{i as P};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as e,N as c}from"./vendor-
|
|
1
|
+
import{j as e,N as c}from"./vendor-z22RpOY0.js";import{c as i}from"./global-xoXYOIOz.js";const m={default:"border-border/30 bg-card shadow-sm",primary:"border-primary/10 bg-card shadow-sm",danger:"border-destructive/15 bg-card shadow-sm"},o={default:"bg-secondary text-primary",primary:"bg-primary/10 text-primary",danger:"bg-destructive/10 text-destructive"};function x({icon:r,title:a,description:s,action:t,className:n,compact:l=!1,tone:d="default"}){return e.jsxs("div",{className:i("flex flex-col items-center justify-center rounded-xl border-2 border-dashed px-6 text-center",l?"min-h-[180px] py-8":"min-h-[260px] py-12",m[d],n),children:[r?e.jsx("div",{className:i("mb-4 flex h-12 w-12 items-center justify-center rounded-2xl",o[d]),children:r}):null,e.jsxs("div",{className:"max-w-xl space-y-1.5",children:[e.jsx("div",{className:"text-base font-semibold tracking-[-0.01em]",children:a}),s?e.jsx("div",{className:"text-sm text-muted-foreground",children:s}):null]}),t?e.jsx("div",{className:"mt-5 flex flex-wrap items-center justify-center gap-2",children:t}):null]})}function p({label:r,className:a,compact:s=!1}){return e.jsx(x,{className:a,compact:s,tone:"primary",icon:e.jsx(c,{className:"h-5 w-5 animate-spin","aria-hidden":"true"}),title:r})}export{p as P,x as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as b,j as e,av as ue,aK as ne,W as le,aS as xe,aT as pe,O as fe,aA as he,a0 as be,af as ge}from"./vendor-LWJeAdU1.js";import{u as je,a as Q,b as I}from"./query-Cpxr1dul.js";import{L as ye}from"./router-DspBTS8b.js";import{P as Ne}from"./PageHeader--Lg_YQVw.js";import{P as oe,a as C}from"./PageState-DKba6Ew1.js";import{B,q as j}from"./queryKeys-DTnZc8Yy.js";import{g as P,b as L,r as J,B as T}from"./app-BG16DmZH.js";import{c as x}from"./global-CKvMKvrn.js";import{f as ve}from"./utils-DSaa7c6v.js";import{u as _}from"./i18n-B3N4Df3E.js";import"./radix-bG5h1Ymq.js";const v={getStatus:()=>J({url:"/api/profiler/status",method:"GET"}),start:()=>P(L.post("/api/profiler/start")),stop:()=>P(L.post("/api/profiler/stop")),listSessions:t=>J({url:"/api/profiler/sessions",method:"GET",params:t}),getSession:t=>J({url:`/api/profiler/sessions/${t}`,method:"GET"}),deleteSession:t=>P(L.delete(`/api/profiler/sessions/${t}`)),clearAll:()=>P(L.post("/api/profiler/sessions/clear"))};function y(t){return t==null?"-":t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function D(t){return t==null?"-":t>=1e3?`${(t/1e3).toFixed(1)}s`:`${Math.round(t)}ms`}function S(t){return t==null?"-":t.toLocaleString()}function W(t){return t==null?"-":t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}K`:t.toLocaleString()}function R(t){return t.endedAt==null||t.turnCount===0?t.totalLatencyMs??0:t.endedAt-t.startedAt}function we(t){const s=t.sessionId;return s.length>18?`${s.slice(0,8)}…${s.slice(-6)}`:s}function ke(t){switch(t){case"claude-code":return"Claude Code";case"codex":return"Codex";case"opencode":return"OpenCode";case"anthropic-compatible":return"Anthropic Compatible";case"openai-compatible":return"OpenAI Compatible";default:return t||null}}function Te(t,s){const n=Math.max(0,Date.now()-t),r=Math.floor(n/6e4);if(r<1)return s("profiler.relativeTime.justNow");if(r<60)return s("profiler.relativeTime.minutesAgo",{count:r});const l=Math.floor(r/60);if(l<24)return s("profiler.relativeTime.hoursAgo",{count:l});const a=Math.floor(l/24);return s("profiler.relativeTime.daysAgo",{count:a})}function Me(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function G(t,s){if(Array.isArray(t)){for(const n of t)G(n,s);return}if(t&&typeof t=="object"){const n=t,r=n.type;(r==="tool_use"||r==="tool_call"||r==="function_call"||r==="computer_call"||r==="web_search_call"||r==="file_search_call"||r==="mcp_call"||r==="custom_tool_call")&&s.push(n);const l=n.tool_calls;Array.isArray(l)&&s.push(...l);const a=n.content;if(Array.isArray(a)){for(const i of a)if(i&&typeof i=="object"){const o=i;o.type==="tool_use"&&s.push(o)}}for(const i of Object.values(n))G(i,s)}}function O(t){const s=[];return G(Me(t.clientResponse),s),s}function de(t,s){const n=t.timestamp-s,r=n+(t.latencyMs??0);return`${(n/1e3).toFixed(3)}s → ${(r/1e3).toFixed(3)}s`}function V(t,s){return ve(t??null,s)}function Ce(t,s){const n=new Blob([JSON.stringify(s,null,2)],{type:"application/json"}),r=URL.createObjectURL(n),l=document.createElement("a");l.href=r,l.download=t,l.click(),URL.revokeObjectURL(r)}function z({tone:t="default",children:s}){return e.jsx("span",{className:x("inline-flex items-center rounded-full px-2.5 py-1 text-[11px] font-medium",t==="accent"?"bg-primary/10 text-primary":"bg-secondary text-muted-foreground"),children:s})}function Se({session:t,selected:s,index:n,onClick:r}){const{t:l}=_(),a=["bg-indigo-500","bg-emerald-500","bg-amber-500"],i=s?"bg-indigo-500":a[n%a.length],o=(t.totalInputTokens??0)+(t.totalOutputTokens??0);return e.jsxs("button",{type:"button",onClick:r,className:x("w-full border-b border-border/45 px-4 py-3 text-left transition-colors",s?"bg-secondary":"hover:bg-secondary/50"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:x("h-2 w-2 flex-shrink-0 rounded-full",i)}),e.jsx("span",{className:x("truncate text-sm font-semibold",s?"text-primary":"text-foreground"),children:we(t)})]}),e.jsx("span",{className:"text-[11px] text-muted-foreground",children:Te(t.startedAt,l)})]}),e.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-2 pl-4",children:[e.jsx(z,{tone:s?"accent":"default",children:l("profiler.metricTurns",{count:t.turnCount})}),e.jsx(z,{children:D(R(t))}),e.jsx(z,{children:l("profiler.metricTokens",{value:W(o)})})]})]})}function ae({active:t,icon:s,label:n,onClick:r}){return e.jsxs("button",{type:"button",onClick:r,className:x("inline-flex h-8 items-center gap-1.5 rounded-full border px-3 text-xs font-medium transition-all",t?"border-primary/20 bg-primary/10 text-primary":"border-transparent bg-secondary text-muted-foreground hover:bg-secondary/80 hover:text-foreground"),children:[e.jsx(s,{className:"h-3.5 w-3.5"}),n]})}function U({active:t,label:s,count:n,onClick:r}){return e.jsxs("button",{type:"button",onClick:r,className:x("inline-flex h-7 items-center gap-1.5 rounded-full border px-3 text-[11px] font-medium transition-all",t?"border-primary/20 bg-primary/10 text-primary":"border-transparent bg-transparent text-muted-foreground hover:bg-secondary hover:text-foreground"),children:[e.jsx("span",{children:s}),typeof n=="number"&&e.jsx("span",{className:"rounded-full bg-amber-100 px-1.5 py-0.5 text-[11px] font-semibold text-amber-700",children:n})]})}function _e({detail:t,selectedTurn:s,onSelectTurn:n}){const{t:r}=_(),l=t.records;if(l.length===0)return e.jsx(C,{compact:!0,className:"min-h-[220px]",title:r("profiler.empty.noTurnsTitle"),description:r("profiler.empty.noTurnsDescription")});const a=R(t),i=Math.max(1,...l.map(o=>Math.max(o.latencyMs??0,o.ttftMs??0,1)));return Math.max(1,...l.map(o=>O(o).length)),e.jsxs("div",{className:"rounded-xl bg-card shadow-[var(--surface-shadow)]",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 border-b border-border/45 px-5 py-3.5",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:r("profiler.timeline.summary")}),e.jsxs("div",{className:"flex items-center gap-2 text-[11px]",children:[e.jsx("span",{className:"text-muted-foreground",children:r("profiler.timeline.mode")}),e.jsx("span",{className:"rounded-full border border-border bg-secondary/70 px-2.5 py-1 font-medium text-foreground",children:r("profiler.timeline.compressed")}),e.jsx("span",{className:"rounded-full border border-border bg-card px-2.5 py-1 font-medium text-foreground",children:r("profiler.timeline.sessionDuration",{duration:D(a)})})]})]}),e.jsxs("div",{className:"px-5 pb-4",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between text-[11px] text-muted-foreground/70",children:[e.jsx("span",{children:r("profiler.timeline.start")}),e.jsxs("span",{children:[(a/1e3).toFixed(1),"s"]})]}),e.jsx("div",{className:"grid gap-x-2 gap-y-5",style:{gridTemplateColumns:"repeat(10, minmax(0, 1fr))"},children:l.map((o,p)=>{const f=p===s,w=Math.max(o.latencyMs??0,1),d=`${Math.max(28,Math.min(100,w/i*100))}%`,u=o.ttftMs!=null?`${Math.max(0,Math.min(100,Math.min(o.ttftMs,i)/i*100))}%`:null,F=Math.max(0,o.timestamp-t.startedAt),k=O(o);return e.jsxs("button",{type:"button",onClick:()=>n(p),className:x("rounded-xl border border-transparent bg-card px-2 py-2 text-left shadow-sm transition-all",f?"border-primary/20 bg-primary/5":"hover:bg-secondary/50"),title:r("profiler.turn.title",{index:o.turnIndex+1}),children:[e.jsx("div",{className:"flex min-w-0 items-center gap-2",children:e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:x("inline-flex h-5 min-w-5 items-center justify-center rounded-full border px-1.5 text-[11px] font-semibold",f?"border-primary/30 bg-primary/10 text-primary":"border-border bg-card text-foreground"),children:o.turnIndex+1}),e.jsx("span",{className:"truncate text-[15px] font-semibold text-foreground",children:D(o.latencyMs)})]})}),e.jsx("p",{className:"mt-1 text-[11px] text-muted-foreground",children:r("profiler.timeline.startAt",{time:(F/1e3).toFixed(1)})}),e.jsxs("div",{className:"mt-2",children:[e.jsx("div",{className:"flex items-center justify-between text-[11px] text-muted-foreground",children:e.jsxs("span",{children:[y(o.ttftMs)," TTFT"]})}),e.jsxs("div",{className:"relative mt-1 h-4 rounded-sm bg-secondary",children:[e.jsx("div",{className:"h-4 rounded-sm bg-primary/20",style:{width:d}}),u!=null&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"absolute top-[-3px] h-5 w-[3px] -translate-x-1/2 rounded-full bg-violet-500 ring-1 ring-white",style:{left:u}}),e.jsx("span",{className:"absolute top-[-6px] h-2.5 w-2.5 -translate-x-1/2 rounded-full border border-white bg-violet-500",style:{left:u}})]})]})]}),e.jsxs("div",{className:"mt-2",children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between text-[11px] text-muted-foreground",children:[e.jsx("span",{children:r("profiler.timeline.tools")}),e.jsx("span",{children:k.length})]}),e.jsx("div",{className:"flex h-5 items-center gap-1",children:e.jsx("span",{className:x("inline-flex h-5 min-w-5 items-center justify-center rounded-md border text-[11px] font-semibold",k.length>0?"border-amber-400 bg-amber-200 text-amber-900":"border-border bg-card text-muted-foreground"),children:k.length})})]})]},o.id)})}),e.jsxs("div",{className:"mt-4 flex flex-wrap items-center gap-4 text-[11px] text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm bg-blue-200"}),r("profiler.timeline.legend.totalLatency")]}),e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"relative inline-block h-2.5 w-2.5 rounded-full border border-white bg-violet-500 ring-1 ring-violet-500/35"}),r("profiler.timeline.legend.firstToken")]}),e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm border border-amber-400 bg-amber-200"}),r("profiler.timeline.legend.toolExecuting")]}),e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm border border-rose-300 bg-rose-50"}),r("profiler.timeline.legend.selectedTurn")]})]})]})]})}function Fe({detail:t,selectedTurn:s,detailTab:n,onDetailTabChange:r,onSelectTurn:l}){const{t:a}=_(),i=t.records[s];if(!i)return null;const o=O(i),p=(i.inputTokens??0)+(i.outputTokens??0),f=n==="request"?V(i.clientRequest,a("profiler.payload.emptyRequest")):n==="response"?V(i.clientResponse,a("profiler.payload.emptyResponse")):o.length>0?JSON.stringify(o,null,2):a("profiler.payload.noToolCalls");return e.jsxs("div",{"data-testid":"profiler-turn-detail",className:"mt-3 shrink-0 rounded-xl bg-card shadow-[var(--surface-shadow)]",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 border-b border-border px-5 py-3",children:[e.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2 text-xs",children:[e.jsx("span",{className:"rounded-full bg-primary px-2 py-1 font-semibold text-primary-foreground",children:a("profiler.turn.title",{index:i.turnIndex+1})}),e.jsx("span",{className:"text-muted-foreground",children:de(i,t.startedAt)}),e.jsxs("span",{className:"rounded-full bg-violet-50 border border-violet-200 px-2 py-1 font-semibold text-violet-700 dark:bg-violet-500/16 dark:border-violet-400/20 dark:text-violet-200",children:["TTFT ",y(i.ttftMs)]}),e.jsxs("span",{className:"rounded-full bg-sky-50 border border-sky-200 px-2 py-1 font-semibold text-sky-700 dark:bg-sky-500/16 dark:border-sky-400/20 dark:text-sky-200",children:[W(p)," tokens"]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx("button",{type:"button",onClick:()=>l(Math.max(0,s-1)),disabled:s===0,className:"rounded-full p-1.5 transition-colors hover:bg-secondary disabled:cursor-not-allowed disabled:opacity-40","aria-label":a("profiler.turn.previous"),children:e.jsx(he,{className:"h-4 w-4"})}),e.jsxs("span",{className:"min-w-10 text-center font-medium text-muted-foreground",children:[s+1," / ",t.records.length]}),e.jsx("button",{type:"button",onClick:()=>l(Math.min(t.records.length-1,s+1)),disabled:s===t.records.length-1,className:"rounded-full p-1.5 transition-colors hover:bg-secondary disabled:cursor-not-allowed disabled:opacity-40","aria-label":a("profiler.turn.next"),children:e.jsx(be,{className:"h-4 w-4"})})]})]}),e.jsx("div",{className:"border-b border-border bg-secondary/30 px-5 py-2",children:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(U,{active:n==="request",label:a("profiler.payload.request"),onClick:()=>r("request")}),e.jsx(U,{active:n==="response",label:a("profiler.payload.response"),onClick:()=>r("response")}),e.jsx(U,{active:n==="tools",label:a("profiler.payload.toolCalls"),count:o.length,onClick:()=>r("tools")})]})}),e.jsxs("div",{className:"bg-secondary/30 p-5",children:[e.jsx("pre",{className:"max-h-[420px] overflow-auto rounded-xl bg-[#1E1E2E] p-4 text-xs leading-5 text-slate-200",children:f}),i.error&&e.jsx("p",{className:"mt-3 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700",children:i.error})]})]})}function qe({detail:t,selectedTurn:s,detailTab:n,onSelectTurn:r,onDetailTabChange:l}){return e.jsxs("div",{className:"flex min-h-full flex-col",children:[e.jsx(_e,{detail:t,selectedTurn:s,onSelectTurn:r}),e.jsx(Fe,{detail:t,selectedTurn:s,detailTab:n,onDetailTabChange:l,onSelectTurn:r})]})}function ie({title:t,payload:s,accentClass:n,emptyLabel:r}){return e.jsxs("div",{className:"rounded-xl border border-white/45 bg-white/88 p-3 shadow-[0_12px_28px_rgba(15,23,42,0.06)] dark:border-white/10 dark:bg-slate-950/[0.58] dark:shadow-[0_12px_28px_rgba(0,0,0,0.28)]",children:[e.jsx("p",{className:x("mb-2 text-[11px] font-semibold uppercase tracking-wider",n),children:t}),e.jsx("pre",{className:"max-h-64 overflow-auto rounded-lg bg-slate-950/95 p-3 text-xs leading-5 text-slate-200",children:V(s,r)})]})}function M({label:t,value:s,sub:n,accentClass:r}){return e.jsxs("div",{className:"rounded-xl bg-card p-4 shadow-sm",children:[e.jsx("p",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:t}),e.jsx("p",{className:x("metric-number mt-2 text-2xl font-semibold text-foreground",r),children:s}),n&&e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:n})]})}function Ae({record:t,sessionStart:s,expanded:n,onToggle:r}){const{t:l}=_(),a=O(t);return e.jsxs("div",{className:"overflow-hidden rounded-xl bg-card shadow-sm",children:[e.jsxs("button",{type:"button",onClick:r,className:"flex w-full items-center gap-4 px-4 py-3 text-left transition-colors hover:bg-secondary/50",children:[e.jsxs("div",{className:"flex min-w-0 flex-1 items-center gap-3",children:[e.jsxs("span",{className:"rounded-full bg-primary px-2 py-0.5 text-[11px] font-semibold text-primary-foreground",children:["T",t.turnIndex+1]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-foreground",children:de(t,s)}),e.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-2 text-[11px] text-muted-foreground",children:[e.jsx("span",{children:l("profiler.breakdown.total",{value:y(t.latencyMs)})}),e.jsxs("span",{children:["TTFT ",y(t.ttftMs)]}),e.jsxs("span",{children:["TPOT ",t.tpotMs!=null?`${t.tpotMs.toFixed(1)} ms/tok`:"-"]}),e.jsxs("span",{children:["↑ ",S(t.inputTokens)]}),e.jsxs("span",{children:["↓ ",S(t.outputTokens)]}),e.jsx("span",{children:l("profiler.breakdown.toolCallsCount",{count:a.length})}),t.error&&e.jsx("span",{className:"rounded-full bg-red-50 px-2 py-0.5 font-medium text-red-600 dark:bg-red-500/14 dark:text-red-300",children:l("profiler.breakdown.error")})]})]})]}),e.jsx(ge,{className:x("h-4 w-4 flex-shrink-0 text-muted-foreground/70 transition-transform",n&&"rotate-180")})]}),n&&e.jsxs("div",{className:"border-t border-border bg-secondary/30 p-4",children:[e.jsxs("div",{className:"grid gap-3 xl:grid-cols-2",children:[e.jsx(ie,{title:l("profiler.payload.request"),payload:t.clientRequest,accentClass:"text-blue-600",emptyLabel:l("profiler.payload.empty")}),e.jsx(ie,{title:l("profiler.payload.response"),payload:t.clientResponse,accentClass:"text-violet-600",emptyLabel:l("profiler.payload.empty")})]}),e.jsxs("div",{className:"mt-3 grid gap-3 xl:grid-cols-[minmax(0,1fr)_280px]",children:[e.jsxs("div",{className:"rounded-xl bg-card p-3 shadow-sm",children:[e.jsx("p",{className:"mb-2 text-[11px] font-semibold uppercase tracking-wider text-amber-600",children:l("profiler.payload.toolCalls")}),e.jsx("pre",{className:"max-h-64 overflow-auto rounded-lg bg-slate-950/95 p-3 text-xs leading-5 text-slate-200",children:a.length>0?JSON.stringify(a,null,2):l("profiler.payload.noToolCalls")})]}),e.jsxs("div",{className:"rounded-xl bg-card p-3 shadow-sm",children:[e.jsx("p",{className:"mb-2 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:l("profiler.breakdown.turnMetrics")}),e.jsxs("dl",{className:"grid grid-cols-2 gap-x-3 gap-y-2 text-xs",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:l("profiler.breakdown.duration")}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:y(t.latencyMs)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:"TTFT"}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:y(t.ttftMs)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:"TPOT"}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:t.tpotMs!=null?`${t.tpotMs.toFixed(1)} ms/tok`:"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:l("profiler.breakdown.status")}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:t.statusCode??"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:l("profiler.breakdown.input")}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:S(t.inputTokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:l("profiler.breakdown.output")}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:S(t.outputTokens)})]})]}),t.error&&e.jsx("p",{className:"mt-3 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700",children:t.error})]})]})]})]})}function Ie({detail:t,expandedTurn:s,onToggleTurn:n}){const{t:r}=_();if(t.records.length===0)return e.jsx(C,{compact:!0,className:"min-h-[220px]",title:r("profiler.empty.noTurnsTitle"),description:r("profiler.empty.noTurnsDescription")});const l=R(t),a=t.records.reduce((d,u)=>{const F=u.latencyMs??0,k=u.ttftMs??0;return d+Math.max(F-k,0)},0),i=l>0?(a/l*100).toFixed(1):"-",o=t.records.map(d=>d.ttftMs).filter(d=>d!=null),p=t.records.map(d=>d.tpotMs).filter(d=>d!=null),f=o.length>0?o.reduce((d,u)=>d+u,0)/o.length:null,w=p.length>0?p.reduce((d,u)=>d+u,0)/p.length:null;return e.jsxs("div",{className:"space-y-5 p-5",children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-6",children:[e.jsx(M,{label:r("profiler.breakdown.totalDuration"),value:y(l),sub:r("profiler.breakdown.turnsSub",{count:t.records.length})}),e.jsx(M,{label:r("profiler.breakdown.llmTime"),value:y(a),sub:r("profiler.breakdown.sessionShare",{value:i}),accentClass:"text-violet-700"}),e.jsx(M,{label:r("profiler.breakdown.avgTtft"),value:y(f)}),e.jsx(M,{label:r("profiler.breakdown.avgTpot"),value:w!=null?`${w.toFixed(1)} ms/tok`:"-"}),e.jsx(M,{label:r("profiler.breakdown.inputTokens"),value:S(t.totalInputTokens)}),e.jsx(M,{label:r("profiler.breakdown.outputTokens"),value:S(t.totalOutputTokens)})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold text-foreground",children:r("profiler.breakdown.perTurnTitle")}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:r("profiler.breakdown.perTurnDescription")})]})}),t.records.map(d=>e.jsx(Ae,{record:d,sessionStart:t.startedAt,expanded:s===d.turnIndex,onToggle:()=>n(d.turnIndex)},d.id))]})]})}function ze(){var te,re,se;const{t}=_(),s=je(),[n,r]=b.useState(null),[l,a]=b.useState("timeline"),[i,o]=b.useState("request"),[p,f]=b.useState(0),[w,d]=b.useState(0),[u,F]=b.useState(""),h=((te=Q({queryKey:j.profiler.status(),queryFn:()=>v.getStatus(),refetchInterval:3e3}).data)==null?void 0:te.active)??!1,H=Q({queryKey:j.profiler.sessions({}),queryFn:()=>v.listSessions({limit:100}),refetchInterval:h?2e3:!1}),g=((re=H.data)==null?void 0:re.items)??[],$=Q({queryKey:j.profiler.session(n),queryFn:()=>v.getSession(n),enabled:n!=null,refetchInterval:h&&n!=null?2e3:!1}),A=I({mutationFn:()=>v.start(),onSuccess:()=>{s.invalidateQueries({queryKey:j.profiler.status()}),s.invalidateQueries({queryKey:j.profiler.sessions({})})}}),X=I({mutationFn:()=>v.stop(),onSuccess:()=>{s.invalidateQueries({queryKey:j.profiler.status()}),s.invalidateQueries({queryKey:j.profiler.sessions({})})}}),Y=I({mutationFn:m=>v.deleteSession(m),onSuccess:(m,N)=>{n===N&&r(null),s.invalidateQueries({queryKey:j.profiler.sessions({})})}}),ce=I({mutationFn:()=>v.clearAll(),onSuccess:()=>{r(null),s.invalidateQueries({queryKey:j.profiler.sessions({})})}}),q=b.useMemo(()=>{const m=u.trim().toLowerCase();return m?g.filter(N=>N.sessionId.toLowerCase().includes(m)):g},[u,g]),E=u.trim().length>0,c=$.data,K=g.find(m=>m.id===n)??null,Z=(c==null?void 0:c.records[p])??null,ee=ke(((se=c==null?void 0:c.records[0])==null?void 0:se.clientKind)??null);b.useEffect(()=>{n&&!g.some(m=>m.id===n)&&r(null)},[n,g]),b.useEffect(()=>{!n&&q.length>0&&r(q[0].id)},[q,n]),b.useEffect(()=>{f(0),d(0),o("request")},[n]),b.useEffect(()=>{if(!c){f(0),d(0);return}f(m=>Math.min(m,Math.max(c.records.length-1,0))),d(m=>m==null?0:Math.min(m,Math.max(c.records.length-1,0)))},[c]);const me=()=>{c&&Ce(`profiler-${c.sessionId}.json`,c)};return e.jsxs("div",{className:"flex min-h-0 flex-col gap-3 lg:h-[calc(100vh-64px)]",children:[e.jsx(Ne,{className:"flex-none",icon:e.jsx(le,{className:"h-5 w-5","aria-hidden":"true"}),title:t("profiler.title"),description:t("profiler.description"),eyebrow:t("profiler.eyebrow"),breadcrumb:t("profiler.breadcrumb"),helper:n?t("profiler.empty.selectDescription"):void 0,badge:e.jsxs("span",{className:x("inline-flex items-center gap-1.5",h?"text-red-600 dark:text-red-300":"text-muted-foreground"),children:[e.jsx("span",{className:x("inline-block h-1.5 w-1.5 rounded-full",h?"bg-red-500":"bg-muted-foreground/70")}),t(h?"profiler.status.recording":"profiler.status.idle")]}),actions:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(B,{variant:"secondary",className:"rounded-full px-3 py-1 text-[11px]",children:t("profiler.sessionsCount",{count:g.length})}),e.jsx(T,{size:"sm",variant:h?"destructive":"default",onClick:()=>h?X.mutate():A.mutate(),disabled:A.isPending||X.isPending,children:t(h?"profiler.actions.stop":"profiler.actions.start")}),e.jsxs(T,{size:"sm",variant:"outline",onClick:me,disabled:!c,children:[e.jsx(ue,{className:"mr-1.5 h-3.5 w-3.5"}),t("profiler.actions.export")]}),e.jsxs(T,{size:"sm",variant:"outline",onClick:()=>ce.mutate(),disabled:g.length===0,className:"border-red-200 bg-red-50 text-red-700 hover:bg-red-100 hover:text-red-800 dark:border-red-400/20 dark:bg-red-500/14 dark:text-red-300 dark:hover:bg-red-500/20 dark:hover:text-red-200",children:[e.jsx(ne,{className:"mr-1.5 h-3.5 w-3.5"}),t("profiler.actions.clear")]})]})}),e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col gap-3 bg-background lg:flex-row lg:gap-0 lg:overflow-hidden",children:[e.jsxs("div",{className:"flex w-full flex-shrink-0 flex-col overflow-hidden rounded-[1.2rem] border border-white/70 bg-card/96 shadow-[0_20px_48px_-42px_rgba(15,23,42,0.26)] lg:w-[300px]",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/45 px-4 py-3",children:[e.jsx("span",{className:"text-sm font-semibold text-foreground",children:t("profiler.sessionsTitle")}),e.jsx(B,{variant:"secondary",className:"rounded-full px-2 py-0.5",children:g.length})]}),e.jsxs("div",{className:"flex items-center gap-2 border-b border-border bg-secondary/50 px-3 py-2.5",children:[e.jsx(xe,{className:"h-3.5 w-3.5 text-muted-foreground/70"}),e.jsx("input",{className:"w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground/70",placeholder:t("profiler.searchPlaceholder"),value:u,onChange:m=>F(m.target.value)})]}),e.jsx("div",{className:"max-h-[240px] overflow-y-auto lg:min-h-0 lg:max-h-none lg:flex-1",children:H.isPending?e.jsx(oe,{compact:!0,className:"min-h-[160px]",label:t("common.loading")}):q.length===0?e.jsx(C,{compact:!0,className:"m-4 min-h-[160px]",title:t(E?"profiler.empty.searchTitle":h?"profiler.empty.waitingTitle":"profiler.empty.idleTitle"),description:t(E?"profiler.empty.searchDescription":h?"profiler.empty.waitingDescription":"profiler.empty.idleDescription"),action:E?void 0:h?e.jsx(T,{asChild:!0,variant:"ghost",size:"sm",children:e.jsx(ye,{to:"/logs",children:t("profiler.empty.actions.logs")})}):e.jsx(T,{size:"sm",onClick:()=>A.mutate(),disabled:A.isPending,children:t("profiler.actions.start")})}):q.map((m,N)=>e.jsx(Se,{session:m,selected:n===m.id,index:N,onClick:()=>r(m.id)},m.id))})]}),e.jsx("div",{className:"flex min-w-0 flex-1 flex-col overflow-hidden rounded-[1.2rem] border border-white/70 bg-card/96 shadow-[0_20px_48px_-42px_rgba(15,23,42,0.26)] lg:ml-3",children:n?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 border-b border-border bg-card px-5 py-3.5",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 flex-shrink-0 rounded-full bg-indigo-500"}),e.jsx("span",{className:"truncate text-sm font-semibold text-foreground",children:(c==null?void 0:c.sessionId)??(K==null?void 0:K.sessionId)??n}),ee&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-muted-foreground/70",children:"·"}),e.jsx(B,{variant:"secondary",className:"rounded-full px-2 py-0.5 text-[10px]",children:ee})]}),e.jsx("span",{className:"text-muted-foreground/70",children:"·"}),e.jsx("span",{className:"truncate text-sm text-muted-foreground",children:c?t("profiler.sessionSummary",{turns:c.turnCount,duration:D(R(c)),tokens:W((c.totalInputTokens??0)+(c.totalOutputTokens??0))}):t("profiler.loadingSession")})]}),e.jsx(T,{variant:"ghost",size:"sm",onClick:()=>n&&Y.mutate(n),disabled:!n||Y.isPending,className:"text-muted-foreground hover:text-red-700",children:e.jsx(ne,{className:"h-3.5 w-3.5"})})]}),e.jsx("div",{className:"border-b border-border bg-secondary/30 px-5 py-2.5",children:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(ae,{active:l==="timeline",icon:pe,label:t("profiler.tabs.timeline"),onClick:()=>a("timeline")}),e.jsx(ae,{active:l==="breakdown",icon:fe,label:t("profiler.tabs.breakdown"),onClick:()=>a("breakdown")})]})}),e.jsx("div",{"data-testid":"profiler-session-content",className:"min-h-0 flex-1 overflow-auto bg-secondary/20",children:$.isPending?e.jsx(oe,{compact:!0,className:"min-h-[240px]",label:t("profiler.loadingSession")}):$.isError?e.jsx(C,{compact:!0,className:"m-5 min-h-[220px]",tone:"danger",title:t("profiler.errors.loadFailed")}):c?l==="timeline"?e.jsx(qe,{detail:c,selectedTurn:p,detailTab:i,onSelectTurn:f,onDetailTabChange:o}):e.jsx(Ie,{detail:c,expandedTurn:w,onToggleTurn:m=>d(N=>N===m?null:m)}):e.jsx(C,{compact:!0,className:"m-5 min-h-[220px]",title:t("profiler.errors.notFound")})}),Z&&e.jsxs("span",{className:"sr-only",children:["Selected turn ",Z.turnIndex+1]})]}):e.jsx("div",{className:"flex flex-1 items-center justify-center",children:e.jsx(C,{title:t("profiler.empty.selectTitle"),description:t("profiler.empty.selectDescription"),icon:e.jsx(le,{className:"h-5 w-5"})})})})]})]})}export{ze as default};
|
|
1
|
+
import{r as b,j as e,az as ue,aO as ne,W as le,aW as xe,aX as pe,O as fe,aE as he,a0 as be,al as ge}from"./vendor-z22RpOY0.js";import{u as je,a as K,b as I}from"./query-BbGWgOFk.js";import{L as ye}from"./router-CL3rf_uf.js";import{P as Ne}from"./PageHeader-DLI9m-gU.js";import{P as oe,a as C}from"./PageState-Bb3fEov-.js";import{B,q as j}from"./queryKeys-DifG1fTh.js";import{g as P,b as L,r as z,B as T}from"./app-CfipX5HX.js";import{c as x}from"./global-xoXYOIOz.js";import{f as ve}from"./utils-DSaa7c6v.js";import{u as _}from"./i18n-Bl2BcCDG.js";import"./radix-mHySgtou.js";const v={getStatus:()=>z({url:"/api/profiler/status",method:"GET"}),start:()=>P(L.post("/api/profiler/start")),stop:()=>P(L.post("/api/profiler/stop")),listSessions:t=>z({url:"/api/profiler/sessions",method:"GET",params:t}),getSession:t=>z({url:`/api/profiler/sessions/${t}`,method:"GET"}),deleteSession:t=>P(L.delete(`/api/profiler/sessions/${t}`)),clearAll:()=>P(L.post("/api/profiler/sessions/clear"))};function y(t){return t==null?"-":t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function D(t){return t==null?"-":t>=1e3?`${(t/1e3).toFixed(1)}s`:`${Math.round(t)}ms`}function S(t){return t==null?"-":t.toLocaleString()}function V(t){return t==null?"-":t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}K`:t.toLocaleString()}function R(t){return t.endedAt==null||t.turnCount===0?t.totalLatencyMs??0:t.endedAt-t.startedAt}function we(t){const s=t.sessionId;return s.length>18?`${s.slice(0,8)}…${s.slice(-6)}`:s}function ke(t){switch(t){case"claude-code":return"Claude Code";case"codex":return"Codex";case"opencode":return"OpenCode";case"anthropic-compatible":return"Anthropic Compatible";case"openai-compatible":return"OpenAI Compatible";default:return t||null}}function Te(t,s){const n=Math.max(0,Date.now()-t),r=Math.floor(n/6e4);if(r<1)return s("profiler.relativeTime.justNow");if(r<60)return s("profiler.relativeTime.minutesAgo",{count:r});const l=Math.floor(r/60);if(l<24)return s("profiler.relativeTime.hoursAgo",{count:l});const a=Math.floor(l/24);return s("profiler.relativeTime.daysAgo",{count:a})}function Me(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function G(t,s){if(Array.isArray(t)){for(const n of t)G(n,s);return}if(t&&typeof t=="object"){const n=t,r=n.type;(r==="tool_use"||r==="tool_call"||r==="function_call"||r==="computer_call"||r==="web_search_call"||r==="file_search_call"||r==="mcp_call"||r==="custom_tool_call")&&s.push(n);const l=n.tool_calls;Array.isArray(l)&&s.push(...l);const a=n.content;if(Array.isArray(a)){for(const i of a)if(i&&typeof i=="object"){const o=i;o.type==="tool_use"&&s.push(o)}}for(const i of Object.values(n))G(i,s)}}function O(t){const s=[];return G(Me(t.clientResponse),s),s}function de(t,s){const n=t.timestamp-s,r=n+(t.latencyMs??0);return`${(n/1e3).toFixed(3)}s → ${(r/1e3).toFixed(3)}s`}function W(t,s){return ve(t??null,s)}function Ce(t,s){const n=new Blob([JSON.stringify(s,null,2)],{type:"application/json"}),r=URL.createObjectURL(n),l=document.createElement("a");l.href=r,l.download=t,l.click(),URL.revokeObjectURL(r)}function J({tone:t="default",children:s}){return e.jsx("span",{className:x("inline-flex items-center rounded-full px-2.5 py-1 text-[11px] font-medium",t==="accent"?"bg-primary/10 text-primary":"bg-secondary text-muted-foreground"),children:s})}function Se({session:t,selected:s,index:n,onClick:r}){const{t:l}=_(),a=["bg-indigo-500","bg-emerald-500","bg-amber-500"],i=s?"bg-indigo-500":a[n%a.length],o=(t.totalInputTokens??0)+(t.totalOutputTokens??0);return e.jsxs("button",{type:"button",onClick:r,className:x("w-full border-b border-border/45 px-4 py-3 text-left transition-colors",s?"bg-secondary":"hover:bg-secondary/50"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:x("h-2 w-2 flex-shrink-0 rounded-full",i)}),e.jsx("span",{className:x("truncate text-sm font-semibold",s?"text-primary":"text-foreground"),children:we(t)})]}),e.jsx("span",{className:"text-[11px] text-muted-foreground",children:Te(t.startedAt,l)})]}),e.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-2 pl-4",children:[e.jsx(J,{tone:s?"accent":"default",children:l("profiler.metricTurns",{count:t.turnCount})}),e.jsx(J,{children:D(R(t))}),e.jsx(J,{children:l("profiler.metricTokens",{value:V(o)})})]})]})}function ae({active:t,icon:s,label:n,onClick:r}){return e.jsxs("button",{type:"button",onClick:r,className:x("inline-flex h-8 items-center gap-1.5 rounded-full border px-3 text-xs font-medium transition-all",t?"border-primary/20 bg-primary/10 text-primary":"border-transparent bg-secondary text-muted-foreground hover:bg-secondary/80 hover:text-foreground"),children:[e.jsx(s,{className:"h-3.5 w-3.5"}),n]})}function U({active:t,label:s,count:n,onClick:r}){return e.jsxs("button",{type:"button",onClick:r,className:x("inline-flex h-7 items-center gap-1.5 rounded-full border px-3 text-[11px] font-medium transition-all",t?"border-primary/20 bg-primary/10 text-primary":"border-transparent bg-transparent text-muted-foreground hover:bg-secondary hover:text-foreground"),children:[e.jsx("span",{children:s}),typeof n=="number"&&e.jsx("span",{className:"rounded-full bg-amber-100 px-1.5 py-0.5 text-[11px] font-semibold text-amber-700",children:n})]})}function _e({detail:t,selectedTurn:s,onSelectTurn:n}){const{t:r}=_(),l=t.records;if(l.length===0)return e.jsx(C,{compact:!0,className:"min-h-[220px]",title:r("profiler.empty.noTurnsTitle"),description:r("profiler.empty.noTurnsDescription")});const a=R(t),i=Math.max(1,...l.map(o=>Math.max(o.latencyMs??0,o.ttftMs??0,1)));return Math.max(1,...l.map(o=>O(o).length)),e.jsxs("div",{className:"rounded-xl bg-card shadow-[var(--surface-shadow)]",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 border-b border-border/45 px-5 py-3.5",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:r("profiler.timeline.summary")}),e.jsxs("div",{className:"flex items-center gap-2 text-[11px]",children:[e.jsx("span",{className:"text-muted-foreground",children:r("profiler.timeline.mode")}),e.jsx("span",{className:"rounded-full border border-border bg-secondary/70 px-2.5 py-1 font-medium text-foreground",children:r("profiler.timeline.compressed")}),e.jsx("span",{className:"rounded-full border border-border bg-card px-2.5 py-1 font-medium text-foreground",children:r("profiler.timeline.sessionDuration",{duration:D(a)})})]})]}),e.jsxs("div",{className:"px-5 pb-4",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between text-[11px] text-muted-foreground/70",children:[e.jsx("span",{children:r("profiler.timeline.start")}),e.jsxs("span",{children:[(a/1e3).toFixed(1),"s"]})]}),e.jsx("div",{className:"grid gap-x-2 gap-y-5",style:{gridTemplateColumns:"repeat(10, minmax(0, 1fr))"},children:l.map((o,p)=>{const f=p===s,w=Math.max(o.latencyMs??0,1),d=`${Math.max(28,Math.min(100,w/i*100))}%`,u=o.ttftMs!=null?`${Math.max(0,Math.min(100,Math.min(o.ttftMs,i)/i*100))}%`:null,F=Math.max(0,o.timestamp-t.startedAt),k=O(o);return e.jsxs("button",{type:"button",onClick:()=>n(p),className:x("rounded-xl border border-transparent bg-card px-2 py-2 text-left shadow-sm transition-all",f?"border-primary/20 bg-primary/5":"hover:bg-secondary/50"),title:r("profiler.turn.title",{index:o.turnIndex+1}),children:[e.jsx("div",{className:"flex min-w-0 items-center gap-2",children:e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:x("inline-flex h-5 min-w-5 items-center justify-center rounded-full border px-1.5 text-[11px] font-semibold",f?"border-primary/30 bg-primary/10 text-primary":"border-border bg-card text-foreground"),children:o.turnIndex+1}),e.jsx("span",{className:"truncate text-[15px] font-semibold text-foreground",children:D(o.latencyMs)})]})}),e.jsx("p",{className:"mt-1 text-[11px] text-muted-foreground",children:r("profiler.timeline.startAt",{time:(F/1e3).toFixed(1)})}),e.jsxs("div",{className:"mt-2",children:[e.jsx("div",{className:"flex items-center justify-between text-[11px] text-muted-foreground",children:e.jsxs("span",{children:[y(o.ttftMs)," TTFT"]})}),e.jsxs("div",{className:"relative mt-1 h-4 rounded-sm bg-secondary",children:[e.jsx("div",{className:"h-4 rounded-sm bg-primary/20",style:{width:d}}),u!=null&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"absolute top-[-3px] h-5 w-[3px] -translate-x-1/2 rounded-full bg-violet-500 ring-1 ring-white",style:{left:u}}),e.jsx("span",{className:"absolute top-[-6px] h-2.5 w-2.5 -translate-x-1/2 rounded-full border border-white bg-violet-500",style:{left:u}})]})]})]}),e.jsxs("div",{className:"mt-2",children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between text-[11px] text-muted-foreground",children:[e.jsx("span",{children:r("profiler.timeline.tools")}),e.jsx("span",{children:k.length})]}),e.jsx("div",{className:"flex h-5 items-center gap-1",children:e.jsx("span",{className:x("inline-flex h-5 min-w-5 items-center justify-center rounded-md border text-[11px] font-semibold",k.length>0?"border-amber-400 bg-amber-200 text-amber-900":"border-border bg-card text-muted-foreground"),children:k.length})})]})]},o.id)})}),e.jsxs("div",{className:"mt-4 flex flex-wrap items-center gap-4 text-[11px] text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm bg-blue-200"}),r("profiler.timeline.legend.totalLatency")]}),e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"relative inline-block h-2.5 w-2.5 rounded-full border border-white bg-violet-500 ring-1 ring-violet-500/35"}),r("profiler.timeline.legend.firstToken")]}),e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm border border-amber-400 bg-amber-200"}),r("profiler.timeline.legend.toolExecuting")]}),e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm border border-rose-300 bg-rose-50"}),r("profiler.timeline.legend.selectedTurn")]})]})]})]})}function Fe({detail:t,selectedTurn:s,detailTab:n,onDetailTabChange:r,onSelectTurn:l}){const{t:a}=_(),i=t.records[s];if(!i)return null;const o=O(i),p=(i.inputTokens??0)+(i.outputTokens??0),f=n==="request"?W(i.clientRequest,a("profiler.payload.emptyRequest")):n==="response"?W(i.clientResponse,a("profiler.payload.emptyResponse")):o.length>0?JSON.stringify(o,null,2):a("profiler.payload.noToolCalls");return e.jsxs("div",{"data-testid":"profiler-turn-detail",className:"mt-3 shrink-0 rounded-xl bg-card shadow-[var(--surface-shadow)]",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 border-b border-border px-5 py-3",children:[e.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2 text-xs",children:[e.jsx("span",{className:"rounded-full bg-primary px-2 py-1 font-semibold text-primary-foreground",children:a("profiler.turn.title",{index:i.turnIndex+1})}),e.jsx("span",{className:"text-muted-foreground",children:de(i,t.startedAt)}),e.jsxs("span",{className:"rounded-full bg-violet-50 border border-violet-200 px-2 py-1 font-semibold text-violet-700 dark:bg-violet-500/16 dark:border-violet-400/20 dark:text-violet-200",children:["TTFT ",y(i.ttftMs)]}),e.jsxs("span",{className:"rounded-full bg-sky-50 border border-sky-200 px-2 py-1 font-semibold text-sky-700 dark:bg-sky-500/16 dark:border-sky-400/20 dark:text-sky-200",children:[V(p)," tokens"]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx("button",{type:"button",onClick:()=>l(Math.max(0,s-1)),disabled:s===0,className:"rounded-full p-1.5 transition-colors hover:bg-secondary disabled:cursor-not-allowed disabled:opacity-40","aria-label":a("profiler.turn.previous"),children:e.jsx(he,{className:"h-4 w-4"})}),e.jsxs("span",{className:"min-w-10 text-center font-medium text-muted-foreground",children:[s+1," / ",t.records.length]}),e.jsx("button",{type:"button",onClick:()=>l(Math.min(t.records.length-1,s+1)),disabled:s===t.records.length-1,className:"rounded-full p-1.5 transition-colors hover:bg-secondary disabled:cursor-not-allowed disabled:opacity-40","aria-label":a("profiler.turn.next"),children:e.jsx(be,{className:"h-4 w-4"})})]})]}),e.jsx("div",{className:"border-b border-border bg-secondary/30 px-5 py-2",children:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(U,{active:n==="request",label:a("profiler.payload.request"),onClick:()=>r("request")}),e.jsx(U,{active:n==="response",label:a("profiler.payload.response"),onClick:()=>r("response")}),e.jsx(U,{active:n==="tools",label:a("profiler.payload.toolCalls"),count:o.length,onClick:()=>r("tools")})]})}),e.jsxs("div",{className:"bg-secondary/30 p-5",children:[e.jsx("pre",{className:"max-h-[420px] overflow-auto rounded-xl bg-[#1E1E2E] p-4 text-xs leading-5 text-slate-200",children:f}),i.error&&e.jsx("p",{className:"mt-3 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700",children:i.error})]})]})}function qe({detail:t,selectedTurn:s,detailTab:n,onSelectTurn:r,onDetailTabChange:l}){return e.jsxs("div",{className:"flex min-h-full flex-col",children:[e.jsx(_e,{detail:t,selectedTurn:s,onSelectTurn:r}),e.jsx(Fe,{detail:t,selectedTurn:s,detailTab:n,onDetailTabChange:l,onSelectTurn:r})]})}function ie({title:t,payload:s,accentClass:n,emptyLabel:r}){return e.jsxs("div",{className:"rounded-xl border border-white/45 bg-white/88 p-3 shadow-[0_12px_28px_rgba(15,23,42,0.06)] dark:border-white/10 dark:bg-slate-950/[0.58] dark:shadow-[0_12px_28px_rgba(0,0,0,0.28)]",children:[e.jsx("p",{className:x("mb-2 text-[11px] font-semibold uppercase tracking-wider",n),children:t}),e.jsx("pre",{className:"max-h-64 overflow-auto rounded-lg bg-slate-950/95 p-3 text-xs leading-5 text-slate-200",children:W(s,r)})]})}function M({label:t,value:s,sub:n,accentClass:r}){return e.jsxs("div",{className:"rounded-xl bg-card p-4 shadow-sm",children:[e.jsx("p",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:t}),e.jsx("p",{className:x("metric-number mt-2 text-2xl font-semibold text-foreground",r),children:s}),n&&e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:n})]})}function Ae({record:t,sessionStart:s,expanded:n,onToggle:r}){const{t:l}=_(),a=O(t);return e.jsxs("div",{className:"overflow-hidden rounded-xl bg-card shadow-sm",children:[e.jsxs("button",{type:"button",onClick:r,className:"flex w-full items-center gap-4 px-4 py-3 text-left transition-colors hover:bg-secondary/50",children:[e.jsxs("div",{className:"flex min-w-0 flex-1 items-center gap-3",children:[e.jsxs("span",{className:"rounded-full bg-primary px-2 py-0.5 text-[11px] font-semibold text-primary-foreground",children:["T",t.turnIndex+1]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-foreground",children:de(t,s)}),e.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-2 text-[11px] text-muted-foreground",children:[e.jsx("span",{children:l("profiler.breakdown.total",{value:y(t.latencyMs)})}),e.jsxs("span",{children:["TTFT ",y(t.ttftMs)]}),e.jsxs("span",{children:["TPOT ",t.tpotMs!=null?`${t.tpotMs.toFixed(1)} ms/tok`:"-"]}),e.jsxs("span",{children:["↑ ",S(t.inputTokens)]}),e.jsxs("span",{children:["↓ ",S(t.outputTokens)]}),e.jsx("span",{children:l("profiler.breakdown.toolCallsCount",{count:a.length})}),t.error&&e.jsx("span",{className:"rounded-full bg-red-50 px-2 py-0.5 font-medium text-red-600 dark:bg-red-500/14 dark:text-red-300",children:l("profiler.breakdown.error")})]})]})]}),e.jsx(ge,{className:x("h-4 w-4 flex-shrink-0 text-muted-foreground/70 transition-transform",n&&"rotate-180")})]}),n&&e.jsxs("div",{className:"border-t border-border bg-secondary/30 p-4",children:[e.jsxs("div",{className:"grid gap-3 xl:grid-cols-2",children:[e.jsx(ie,{title:l("profiler.payload.request"),payload:t.clientRequest,accentClass:"text-blue-600",emptyLabel:l("profiler.payload.empty")}),e.jsx(ie,{title:l("profiler.payload.response"),payload:t.clientResponse,accentClass:"text-violet-600",emptyLabel:l("profiler.payload.empty")})]}),e.jsxs("div",{className:"mt-3 grid gap-3 xl:grid-cols-[minmax(0,1fr)_280px]",children:[e.jsxs("div",{className:"rounded-xl bg-card p-3 shadow-sm",children:[e.jsx("p",{className:"mb-2 text-[11px] font-semibold uppercase tracking-wider text-amber-600",children:l("profiler.payload.toolCalls")}),e.jsx("pre",{className:"max-h-64 overflow-auto rounded-lg bg-slate-950/95 p-3 text-xs leading-5 text-slate-200",children:a.length>0?JSON.stringify(a,null,2):l("profiler.payload.noToolCalls")})]}),e.jsxs("div",{className:"rounded-xl bg-card p-3 shadow-sm",children:[e.jsx("p",{className:"mb-2 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:l("profiler.breakdown.turnMetrics")}),e.jsxs("dl",{className:"grid grid-cols-2 gap-x-3 gap-y-2 text-xs",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:l("profiler.breakdown.duration")}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:y(t.latencyMs)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:"TTFT"}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:y(t.ttftMs)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:"TPOT"}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:t.tpotMs!=null?`${t.tpotMs.toFixed(1)} ms/tok`:"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:l("profiler.breakdown.status")}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:t.statusCode??"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:l("profiler.breakdown.input")}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:S(t.inputTokens)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-muted-foreground",children:l("profiler.breakdown.output")}),e.jsx("dd",{className:"mt-0.5 font-medium text-foreground",children:S(t.outputTokens)})]})]}),t.error&&e.jsx("p",{className:"mt-3 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700",children:t.error})]})]})]})]})}function Ie({detail:t,expandedTurn:s,onToggleTurn:n}){const{t:r}=_();if(t.records.length===0)return e.jsx(C,{compact:!0,className:"min-h-[220px]",title:r("profiler.empty.noTurnsTitle"),description:r("profiler.empty.noTurnsDescription")});const l=R(t),a=t.records.reduce((d,u)=>{const F=u.latencyMs??0,k=u.ttftMs??0;return d+Math.max(F-k,0)},0),i=l>0?(a/l*100).toFixed(1):"-",o=t.records.map(d=>d.ttftMs).filter(d=>d!=null),p=t.records.map(d=>d.tpotMs).filter(d=>d!=null),f=o.length>0?o.reduce((d,u)=>d+u,0)/o.length:null,w=p.length>0?p.reduce((d,u)=>d+u,0)/p.length:null;return e.jsxs("div",{className:"space-y-5 p-5",children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-6",children:[e.jsx(M,{label:r("profiler.breakdown.totalDuration"),value:y(l),sub:r("profiler.breakdown.turnsSub",{count:t.records.length})}),e.jsx(M,{label:r("profiler.breakdown.llmTime"),value:y(a),sub:r("profiler.breakdown.sessionShare",{value:i}),accentClass:"text-violet-700"}),e.jsx(M,{label:r("profiler.breakdown.avgTtft"),value:y(f)}),e.jsx(M,{label:r("profiler.breakdown.avgTpot"),value:w!=null?`${w.toFixed(1)} ms/tok`:"-"}),e.jsx(M,{label:r("profiler.breakdown.inputTokens"),value:S(t.totalInputTokens)}),e.jsx(M,{label:r("profiler.breakdown.outputTokens"),value:S(t.totalOutputTokens)})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold text-foreground",children:r("profiler.breakdown.perTurnTitle")}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:r("profiler.breakdown.perTurnDescription")})]})}),t.records.map(d=>e.jsx(Ae,{record:d,sessionStart:t.startedAt,expanded:s===d.turnIndex,onToggle:()=>n(d.turnIndex)},d.id))]})]})}function Je(){var te,re,se;const{t}=_(),s=je(),[n,r]=b.useState(null),[l,a]=b.useState("timeline"),[i,o]=b.useState("request"),[p,f]=b.useState(0),[w,d]=b.useState(0),[u,F]=b.useState(""),h=((te=K({queryKey:j.profiler.status(),queryFn:()=>v.getStatus(),refetchInterval:3e3}).data)==null?void 0:te.active)??!1,H=K({queryKey:j.profiler.sessions({}),queryFn:()=>v.listSessions({limit:100}),refetchInterval:h?2e3:!1}),g=((re=H.data)==null?void 0:re.items)??[],$=K({queryKey:j.profiler.session(n),queryFn:()=>v.getSession(n),enabled:n!=null,refetchInterval:h&&n!=null?2e3:!1}),A=I({mutationFn:()=>v.start(),onSuccess:()=>{s.invalidateQueries({queryKey:j.profiler.status()}),s.invalidateQueries({queryKey:j.profiler.sessions({})})}}),X=I({mutationFn:()=>v.stop(),onSuccess:()=>{s.invalidateQueries({queryKey:j.profiler.status()}),s.invalidateQueries({queryKey:j.profiler.sessions({})})}}),Y=I({mutationFn:m=>v.deleteSession(m),onSuccess:(m,N)=>{n===N&&r(null),s.invalidateQueries({queryKey:j.profiler.sessions({})})}}),ce=I({mutationFn:()=>v.clearAll(),onSuccess:()=>{r(null),s.invalidateQueries({queryKey:j.profiler.sessions({})})}}),q=b.useMemo(()=>{const m=u.trim().toLowerCase();return m?g.filter(N=>N.sessionId.toLowerCase().includes(m)):g},[u,g]),E=u.trim().length>0,c=$.data,Q=g.find(m=>m.id===n)??null,Z=(c==null?void 0:c.records[p])??null,ee=ke(((se=c==null?void 0:c.records[0])==null?void 0:se.clientKind)??null);b.useEffect(()=>{n&&!g.some(m=>m.id===n)&&r(null)},[n,g]),b.useEffect(()=>{!n&&q.length>0&&r(q[0].id)},[q,n]),b.useEffect(()=>{f(0),d(0),o("request")},[n]),b.useEffect(()=>{if(!c){f(0),d(0);return}f(m=>Math.min(m,Math.max(c.records.length-1,0))),d(m=>m==null?0:Math.min(m,Math.max(c.records.length-1,0)))},[c]);const me=()=>{c&&Ce(`profiler-${c.sessionId}.json`,c)};return e.jsxs("div",{className:"flex min-h-0 flex-col gap-3 lg:h-[calc(100vh-64px)]",children:[e.jsx(Ne,{className:"flex-none",icon:e.jsx(le,{className:"h-5 w-5","aria-hidden":"true"}),title:t("profiler.title"),description:t("profiler.description"),eyebrow:t("profiler.eyebrow"),breadcrumb:t("profiler.breadcrumb"),helper:n?t("profiler.empty.selectDescription"):void 0,badge:e.jsxs("span",{className:x("inline-flex items-center gap-1.5",h?"text-red-600 dark:text-red-300":"text-muted-foreground"),children:[e.jsx("span",{className:x("inline-block h-1.5 w-1.5 rounded-full",h?"bg-red-500":"bg-muted-foreground/70")}),t(h?"profiler.status.recording":"profiler.status.idle")]}),actions:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(B,{variant:"secondary",className:"rounded-full px-3 py-1 text-[11px]",children:t("profiler.sessionsCount",{count:g.length})}),e.jsx(T,{size:"sm",variant:h?"destructive":"default",onClick:()=>h?X.mutate():A.mutate(),disabled:A.isPending||X.isPending,children:t(h?"profiler.actions.stop":"profiler.actions.start")}),e.jsxs(T,{size:"sm",variant:"outline",onClick:me,disabled:!c,children:[e.jsx(ue,{className:"mr-1.5 h-3.5 w-3.5"}),t("profiler.actions.export")]}),e.jsxs(T,{size:"sm",variant:"outline",onClick:()=>ce.mutate(),disabled:g.length===0,className:"border-red-200 bg-red-50 text-red-700 hover:bg-red-100 hover:text-red-800 dark:border-red-400/20 dark:bg-red-500/14 dark:text-red-300 dark:hover:bg-red-500/20 dark:hover:text-red-200",children:[e.jsx(ne,{className:"mr-1.5 h-3.5 w-3.5"}),t("profiler.actions.clear")]})]})}),e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col gap-3 bg-background lg:flex-row lg:gap-0 lg:overflow-hidden",children:[e.jsxs("div",{className:"flex w-full flex-shrink-0 flex-col overflow-hidden rounded-[1.2rem] border border-white/70 bg-card/96 shadow-[0_20px_48px_-42px_rgba(15,23,42,0.26)] lg:w-[300px]",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/45 px-4 py-3",children:[e.jsx("span",{className:"text-sm font-semibold text-foreground",children:t("profiler.sessionsTitle")}),e.jsx(B,{variant:"secondary",className:"rounded-full px-2 py-0.5",children:g.length})]}),e.jsxs("div",{className:"flex items-center gap-2 border-b border-border bg-secondary/50 px-3 py-2.5",children:[e.jsx(xe,{className:"h-3.5 w-3.5 text-muted-foreground/70"}),e.jsx("input",{className:"w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground/70",placeholder:t("profiler.searchPlaceholder"),value:u,onChange:m=>F(m.target.value)})]}),e.jsx("div",{className:"max-h-[240px] overflow-y-auto lg:min-h-0 lg:max-h-none lg:flex-1",children:H.isPending?e.jsx(oe,{compact:!0,className:"min-h-[160px]",label:t("common.loading")}):q.length===0?e.jsx(C,{compact:!0,className:"m-4 min-h-[160px]",title:t(E?"profiler.empty.searchTitle":h?"profiler.empty.waitingTitle":"profiler.empty.idleTitle"),description:t(E?"profiler.empty.searchDescription":h?"profiler.empty.waitingDescription":"profiler.empty.idleDescription"),action:E?void 0:h?e.jsx(T,{asChild:!0,variant:"ghost",size:"sm",children:e.jsx(ye,{to:"/logs",children:t("profiler.empty.actions.logs")})}):e.jsx(T,{size:"sm",onClick:()=>A.mutate(),disabled:A.isPending,children:t("profiler.actions.start")})}):q.map((m,N)=>e.jsx(Se,{session:m,selected:n===m.id,index:N,onClick:()=>r(m.id)},m.id))})]}),e.jsx("div",{className:"flex min-w-0 flex-1 flex-col overflow-hidden rounded-[1.2rem] border border-white/70 bg-card/96 shadow-[0_20px_48px_-42px_rgba(15,23,42,0.26)] lg:ml-3",children:n?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 border-b border-border bg-card px-5 py-3.5",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 flex-shrink-0 rounded-full bg-indigo-500"}),e.jsx("span",{className:"truncate text-sm font-semibold text-foreground",children:(c==null?void 0:c.sessionId)??(Q==null?void 0:Q.sessionId)??n}),ee&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-muted-foreground/70",children:"·"}),e.jsx(B,{variant:"secondary",className:"rounded-full px-2 py-0.5 text-[10px]",children:ee})]}),e.jsx("span",{className:"text-muted-foreground/70",children:"·"}),e.jsx("span",{className:"truncate text-sm text-muted-foreground",children:c?t("profiler.sessionSummary",{turns:c.turnCount,duration:D(R(c)),tokens:V((c.totalInputTokens??0)+(c.totalOutputTokens??0))}):t("profiler.loadingSession")})]}),e.jsx(T,{variant:"ghost",size:"sm",onClick:()=>n&&Y.mutate(n),disabled:!n||Y.isPending,className:"text-muted-foreground hover:text-red-700",children:e.jsx(ne,{className:"h-3.5 w-3.5"})})]}),e.jsx("div",{className:"border-b border-border bg-secondary/30 px-5 py-2.5",children:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(ae,{active:l==="timeline",icon:pe,label:t("profiler.tabs.timeline"),onClick:()=>a("timeline")}),e.jsx(ae,{active:l==="breakdown",icon:fe,label:t("profiler.tabs.breakdown"),onClick:()=>a("breakdown")})]})}),e.jsx("div",{"data-testid":"profiler-session-content",className:"min-h-0 flex-1 overflow-auto bg-secondary/20",children:$.isPending?e.jsx(oe,{compact:!0,className:"min-h-[240px]",label:t("profiler.loadingSession")}):$.isError?e.jsx(C,{compact:!0,className:"m-5 min-h-[220px]",tone:"danger",title:t("profiler.errors.loadFailed")}):c?l==="timeline"?e.jsx(qe,{detail:c,selectedTurn:p,detailTab:i,onSelectTurn:f,onDetailTabChange:o}):e.jsx(Ie,{detail:c,expandedTurn:w,onToggleTurn:m=>d(N=>N===m?null:m)}):e.jsx(C,{compact:!0,className:"m-5 min-h-[220px]",title:t("profiler.errors.notFound")})}),Z&&e.jsxs("span",{className:"sr-only",children:["Selected turn ",Z.turnIndex+1]})]}):e.jsx("div",{className:"flex flex-1 items-center justify-center",children:e.jsx(C,{title:t("profiler.empty.selectTitle"),description:t("profiler.empty.selectDescription"),icon:e.jsx(le,{className:"h-5 w-5"})})})})]})]})}export{Je as default};
|