@chenpu17/cc-gw 0.8.27 → 0.8.29
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-BBvn_5kW.js → About-Cm8SdgXs.js} +1 -1
- package/src/web/dist/assets/{ApiKeys-Cw6zi6be.js → ApiKeys-Buc2uXF3.js} +1 -1
- package/src/web/dist/assets/{ConfirmDialog-BSdd3c1E.js → ConfirmDialog-BYuZwgWC.js} +1 -1
- package/src/web/dist/assets/{Dashboard-h3B4lRaw.js → Dashboard-DShNHNh0.js} +1 -1
- package/src/web/dist/assets/{Events-BYLA8FN_.js → Events-TZCjFq06.js} +1 -1
- package/src/web/dist/assets/{Help-Cb01ywEp.js → Help-Bwzt4gRi.js} +1 -1
- package/src/web/dist/assets/{Login-DUy-wEG6.js → Login-DTIGK-8_.js} +1 -1
- package/src/web/dist/assets/Logs-CTGZCZ3d.js +1 -0
- package/src/web/dist/assets/{ModelManagement-6CMW1ewn.js → ModelManagement-Bu4yl0en.js} +1 -1
- package/src/web/dist/assets/{Profiler-CMc4ZMci.js → Profiler-B-Lg2yQp.js} +1 -1
- package/src/web/dist/assets/{RoutingManagement-Bc0uHeDU.js → RoutingManagement-RFMTV2o6.js} +1 -1
- package/src/web/dist/assets/{Settings-96F2x2kn.js → Settings-iT-oQVjg.js} +1 -1
- package/src/web/dist/assets/app-CUHICvDo.js +61 -0
- package/src/web/dist/assets/clipboard-BnAnBk_-.js +1 -0
- package/src/web/dist/assets/{gateway-CXVAjkAI.js → gateway-DhxavTUf.js} +1 -1
- package/src/web/dist/assets/{landing-CDMLsRM_.js → landing-aXQw-el0.js} +1 -1
- package/src/web/dist/assets/package-BcqrltRw.js +1 -0
- package/src/web/dist/assets/{useApiQuery-D7IzQ3YN.js → useApiQuery-DhdisbOK.js} +1 -1
- package/src/web/dist/assets/{useAppMutation-DAZ4AZkE.js → useAppMutation-CJrALOdE.js} +1 -1
- package/src/web/dist/assets/{useModelManagementState-D8L-X4Nc.js → useModelManagementState-DFFjS9uq.js} +1 -1
- package/src/web/dist/index.html +1 -1
- package/src/web/dist/landing.html +3 -3
- package/src/web/dist/assets/Logs-C0TjIRU-.js +0 -1
- package/src/web/dist/assets/app-BSb5gJZ1.js +0 -61
- package/src/web/dist/assets/clipboard-C4bYXSTr.js +0 -1
- package/src/web/dist/assets/package-CkNdy40Y.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as m}from"./vendor-DdPBfMMb.js";import{u as Nt,a as Ut}from"./query-QCek5MsK.js";import{g as K,b as H,u as Vt,t as G,c as ie}from"./app-BSb5gJZ1.js";import{g as I}from"./gateway-CXVAjkAI.js";import{q as U}from"./queryKeys-DLyolp-A.js";import{u as Ie}from"./useAppMutation-DAZ4AZkE.js";import{u as Qt}from"./useApiQuery-D7IzQ3YN.js";import{u as zt}from"./i18n-C8tBby0x.js";const _={savePreset(n,i){return K(H.post(`/api/routing-presets/${n}`,{name:i}))},applyPreset(n,i){return K(H.post(`/api/routing-presets/${n}/apply`,{name:i}))},deletePreset(n,i){return K(H.delete(`/api/routing-presets/${n}/${encodeURIComponent(i)}`))},testProvider(n,i){return K(H.post(`/api/providers/${n}/test`,i??{}))}},tn=["claude-sonnet-4-5-20250929","claude-sonnet-4-5-20250929-thinking","claude-sonnet-4-20250514","claude-opus-4-1-20250805","claude-opus-4-1-20250805-thinking","claude-haiku-4-5-20251001","claude-haiku-4-5-20251001-thinking","claude-3-5-haiku-20241022"],nn=["gpt-4o-mini","gpt-4o","o4-mini","o4-large","gpt-5-codex"];function O(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).slice(2,10)}function J(n,i){var p;return(p=n==null?void 0:n.customEndpoints)!=null&&p.length?n.customEndpoints:i}function le(n){return n?Object.entries(n).map(([i,p])=>({id:O(),source:i,target:p})):[]}function ue(n,i){var v,f,g;if(!n)return{};const p={},d=n.endpointRouting??{};p.anthropic=le(((v=d.anthropic)==null?void 0:v.modelRoutes)??n.modelRoutes??{}),p.openai=le(((f=d.openai)==null?void 0:f.modelRoutes)??{});for(const y of J(n,i))(g=y.routing)!=null&&g.modelRoutes?p[y.id]=le(y.routing.modelRoutes):p[y.id]=[];return p}function Fe(n,i,p){var f,g,y;const d=J(n,i).find(F=>F.id===p);if(d)return((f=d.routing)==null?void 0:f.modelRoutes)??{};const v=n.endpointRouting??{};return p==="anthropic"?((g=v.anthropic)==null?void 0:g.modelRoutes)??n.modelRoutes??{}:p==="openai"?((y=v.openai)==null?void 0:y.modelRoutes)??{}:{}}function At(n){const i={};for(const p of n){const d=p.source.trim(),v=p.target.trim();d&&v&&(i[d]=v)}return i}function Le(n,i){return JSON.stringify(At(n))!==JSON.stringify(i)}function on(n,i){if(n==="anthropic")return!0;const p=i.find(d=>d.id===n);return p?p.paths&&p.paths.length>0?p.paths.some(d=>d.protocol==="anthropic"):p.protocol==="anthropic":!1}function sn(n,i,p){var v,f,g;if(!i)return;if(n==="anthropic"||n==="openai")return(f=(v=i.endpointRouting)==null?void 0:v[n])==null?void 0:f.validation;const d=J(i,p).find(y=>y.id===n);return(g=d==null?void 0:d.routing)==null?void 0:g.validation}function an(n,i,p){var v,f,g;if(!i)return;if(n==="anthropic"||n==="openai")return(f=(v=i.endpointRouting)==null?void 0:v[n])==null?void 0:f.compatibility;const d=J(i,p).find(y=>y.id===n);return(g=d==null?void 0:d.routing)==null?void 0:g.compatibility}function Kt(n,i){const p=[{key:"providers",label:n("modelManagement.tabs.providers"),description:n("modelManagement.tabs.providersDesc"),isSystem:!0,canDelete:!1},{key:"anthropic",label:n("modelManagement.tabs.anthropic"),description:n("modelManagement.tabs.anthropicDesc"),isSystem:!0,canDelete:!1,protocols:["anthropic"]},{key:"openai",label:n("modelManagement.tabs.openai"),description:n("modelManagement.tabs.openaiDesc"),isSystem:!0,canDelete:!1,protocols:["openai-auto","openai-chat","openai-responses"]}],d=i.map(v=>{let f=n("modelManagement.tabs.customEndpoint"),g=[];if(v.paths&&v.paths.length>0)f=`${n("modelManagement.tabs.customEndpoint")}: ${v.paths.map(y=>`${y.path} (${y.protocol})`).join(", ")}`,g=[...new Set(v.paths.map(y=>y.protocol))];else if(v.path){const y=v.protocol||"anthropic";f=`${n("modelManagement.tabs.customEndpoint")}: ${v.path} (${y})`,g=[y]}return{key:v.id,label:v.label||v.id,description:f,isSystem:!1,canDelete:v.deletable!==!1,protocols:g}});return[...p,...d]}function Ht(n){return n.label&&n.label.trim().length>0?`${n.label} (${n.id})`:n.id}function je(n,i){var d,v,f;const p={anthropic:((d=n.routingPresets)==null?void 0:d.anthropic)??[],openai:((v=n.routingPresets)==null?void 0:v.openai)??[]};for(const g of i){const y=(f=n.customEndpoints)==null?void 0:f.find(F=>F.id===g.id);p[g.id]=(y==null?void 0:y.routingPresets)??g.routingPresets??[]}return p}function rn(){var Te;const{t:n}=zt(),{pushToast:i}=Vt(),p=Nt(),d=Qt(U.config.full(),I.configRequest()),f=((Te=Ut({queryKey:U.customEndpoints.all(),queryFn:ie.list,refetchInterval:1e4}).data)==null?void 0:Te.endpoints)??[],g=m.useMemo(()=>Kt(n,f),[f,n]),[y,F]=m.useState("providers"),[l,k]=m.useState(null),[Be,W]=m.useState(!1),[X,Y]=m.useState("create"),[V,Z]=m.useState(void 0),[qe,ee]=m.useState(void 0),[Ne,de]=m.useState(null),[Ue,te]=m.useState(!1),[L,D]=m.useState({}),[Ve,T]=m.useState({}),[Qe,ce]=m.useState(null),[me,ne]=m.useState({}),[pe,fe]=m.useState({}),[ze,Q]=m.useState({}),[Ae,ge]=m.useState(null),[Ke,he]=m.useState(null),[He,ve]=m.useState(null),[Ge,ye]=m.useState(!1),[oe,Ee]=m.useState(null),[se,ae]=m.useState(!0),[be,Re]=m.useState({}),[_e,Se]=m.useState(null),[Je,Me]=m.useState(!1),[We,we]=m.useState(!1),[Xe,Ye]=m.useState({}),[Ze,et]=m.useState(null),[c,Ce]=m.useState(null),[tt,Pe]=m.useState(!1),[re,nt]=m.useState(""),[z,ot]=m.useState("all"),st=m.useMemo(()=>g.filter(e=>e.isSystem),[g]),at=m.useMemo(()=>g.filter(e=>!e.isSystem),[g]),rt=m.useMemo(()=>g.find(e=>e.key===y)??g[0]??null,[y,g]),x=(l==null?void 0:l.providers)??[],it=x.length,lt=m.useMemo(()=>x.filter(e=>{var a;if(!(z==="all"||(e.type??"custom")===z))return!1;const t=re.trim().toLowerCase();return t?[e.id,e.label??"",e.baseUrl,e.defaultModel??"",...((a=e.models)==null?void 0:a.map(r=>r.id))??[]].join(" ").toLowerCase().includes(t):!0}),[re,z,x]),N=m.useMemo(()=>[{key:"anthropic-beta",value:"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14",label:n("providers.testDialog.options.beta.label"),description:n("providers.testDialog.options.beta.description")}],[n]);m.useEffect(()=>{if(!d.data)return;const e=d.data;k(e),D(s=>{const t=ue(e,f);if(!s||Object.keys(s).length===0)return t;const o={...t};for(const[a,r]of Object.entries(s)){if(!(a in t))continue;const u=Fe(e,f,a);Le(r,u)&&(o[a]=r)}return o}),T({}),ne(je(e,f))},[d.data,f]),m.useEffect(()=>{!d.isError||!d.error||i({title:n("providers.toast.loadFailure",{message:d.error.message}),variant:"error"})},[d.error,d.isError,i,n]),m.useEffect(()=>{g.some(e=>e.key===y)||F("providers")},[y,g]);const ut=m.useMemo(()=>{const e=new Map;for(const s of x){if(!s.defaultModel||!s.models)continue;const t=s.models.find(o=>o.id===s.defaultModel);t&&e.set(s.id,Ht(t))}return e},[x]),dt=m.useMemo(()=>{const e=[],s=new Set;for(const t of x){const o=t.label&&t.label!==t.id?`${t.label} (${t.id})`:t.id,a=t.models??[];if(a.length>0)for(const u of a){const h=`${t.id}:${u.id}`;s.has(h)||(s.add(h),e.push({value:h,label:`${o} · ${u.label??u.id}`,providerId:t.id,providerLabel:o,modelId:u.id,modelLabel:u.label??u.id,kind:"model",isDefault:t.defaultModel===u.id}))}else if(t.defaultModel){const u=`${t.id}:${t.defaultModel}`;s.has(u)||(s.add(u),e.push({value:u,label:`${o} · ${t.defaultModel}`,providerId:t.id,providerLabel:o,modelId:t.defaultModel,modelLabel:t.defaultModel,kind:"model",isDefault:!0}))}const r=`${t.id}:*`;s.has(r)||(s.add(r),e.push({value:r,label:n("settings.routing.providerPassthroughOption",{provider:o}),providerId:t.id,providerLabel:o,modelId:"*",modelLabel:"*",kind:"passthrough"}))}for(const t of Object.values(L).flat()){const o=t.target.trim();o&&!s.has(o)&&(s.add(o),e.push({value:o,label:o,modelId:o,modelLabel:o,kind:"custom"}))}return e},[x,L,n]),ct=()=>{ee(void 0),te(!0)},mt=e=>{ee(e),te(!0)},pt=e=>l?Fe(l,f,e):{},ft=m.useMemo(()=>{const e={};for(const s of g){if(s.key==="providers")continue;const t=L[s.key]||[];e[s.key]=Le(t,pt(s.key))}return e},[l,f,L,g]),ke=(e,s)=>{ne(t=>({...t,[e]:s})),k(t=>{if(!t)return t;if(e==="anthropic"||e==="openai")return{...t,routingPresets:{...t.routingPresets,[e]:s}};const o=[...t.customEndpoints??[]],a=o.findIndex(r=>r.id===e);return a===-1?t:(o[a]={...o[a],routingPresets:s},{...t,customEndpoints:o})})},$=()=>l?!0:(i({title:n("settings.toast.missingConfig"),variant:"error"}),d.refetch(),!1),gt=(e,s)=>{fe(t=>({...t,[e]:s})),s.trim()&&Q(t=>({...t,[e]:null}))},ht=async e=>{if(!$())return;const s=(pe[e]??"").trim();if(!s){Q(t=>({...t,[e]:n("modelManagement.validation.presetName")}));return}if((me[e]??[]).some(t=>t.name.toLowerCase()===s.toLowerCase())){Q(t=>({...t,[e]:n("modelManagement.validation.presetDuplicate",{name:s})}));return}ge(e);try{const o=(await _.savePreset(e,s)).presets??[];ke(e,o),fe(a=>({...a,[e]:""})),Q(a=>({...a,[e]:null})),i({title:n("modelManagement.toast.presetSaved",{name:s}),variant:"success"})}catch(t){i({title:n("modelManagement.toast.presetSaveFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{ge(null),d.refetch()}},vt=async(e,s)=>{if($()){he({endpoint:e,name:s.name});try{const o=(await _.applyPreset(e,s.name)).config;if(o)k(o),D(ue(o,f)),ne(je(o,f));else{const a=s.modelRoutes??{};D(r=>({...r,[e]:Object.entries(a).map(([u,h])=>({id:O(),source:u,target:h}))})),k(r=>{var h,E,R,S;if(!r)return r;const u=(r.customEndpoints??[]).findIndex(b=>b.id===e);if(u!==-1){const b=[...r.customEndpoints??[]],M=b[u];return b[u]={...M,routing:{defaults:((h=M.routing)==null?void 0:h.defaults)??r.defaults,...M.routing??{},modelRoutes:a}},{...r,customEndpoints:b}}return e==="anthropic"||e==="openai"?{...r,endpointRouting:{...r.endpointRouting??{},[e]:{defaults:((R=(E=r.endpointRouting)==null?void 0:E[e])==null?void 0:R.defaults)??r.defaults,...((S=r.endpointRouting)==null?void 0:S[e])??{},modelRoutes:a}},modelRoutes:e==="anthropic"?a:r.modelRoutes??{}}:r})}e!=="anthropic"&&e!=="openai"&&await p.invalidateQueries({queryKey:U.customEndpoints.all()}),i({title:n("modelManagement.toast.presetApplySuccess",{name:s.name}),variant:"success"})}catch(t){i({title:n("modelManagement.toast.presetApplyFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{he(null),d.refetch()}}},yt=async(e,s)=>{if($()){ve({endpoint:e,name:s.name});try{const t=await _.deletePreset(e,s.name);ke(e,t.presets??[]),i({title:n("modelManagement.toast.presetDeleteSuccess",{name:s.name}),variant:"success"})}catch(t){i({title:n("modelManagement.toast.presetDeleteFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{ve(null),d.refetch()}}},Et=()=>{$()&&(Y("create"),Z(void 0),W(!0))},bt=e=>{$()&&(Y("edit"),Z(e),W(!0))},Rt=async e=>{if(!l)throw new Error(n("settings.toast.missingConfig"));const s=X==="create"?[...x,e]:x.map(o=>V&&o.id===V.id?{...e,id:V.id}:o),t={...l,providers:s};await I.saveConfig(t),k(t),D(ue(t,f)),d.refetch(),i({title:X==="create"?n("providers.toast.createSuccess",{name:e.label||e.id}):n("providers.toast.updateSuccess",{name:e.label||e.id}),variant:"success"})},St=async e=>{const s=f.find(t=>t.id===e);if(!(!s||s.deletable===!1))try{await ie.delete(e),await p.invalidateQueries({queryKey:U.customEndpoints.all()}),i({title:n("modelManagement.deleteEndpointSuccess"),variant:"success"}),y===e&&F("providers")}catch(t){const o=G(t);i({title:n("modelManagement.deleteEndpointError",{error:o.message}),variant:"error"})}},De=async(e,s)=>{de(e.id);try{const t=s&&(s.headers||s.query)?{headers:s.headers&&Object.keys(s.headers).length>0?s.headers:void 0,query:s.query&&s.query.trim().length>0?s.query.trim():void 0}:void 0,o=await _.testProvider(e.id,t);if(o.ok){i({title:n("providers.toast.testSuccess"),description:n("providers.toast.testSuccessDesc",{status:o.status,duration:o.durationMs?`${o.durationMs} ms`:"—"}),variant:"success"});return}i({title:n("providers.toast.testFailure",{message:`${o.status} ${o.statusText}`}),variant:"error"})}catch(t){const o=G(t);i({title:n("providers.toast.testFailure",{message:o.status?`${o.status} ${o.message}`:o.message}),variant:"error"})}finally{de(null)}},Mt=e=>{var u,h;if(!(!!((u=e.defaultModel)!=null&&u.trim())||!!((h=e.models)!=null&&h.some(E=>E.id.trim().length>0)))){Se(e);return}if(e.type!=="anthropic"){De(e);return}const t=e.extraHeaders??{},o=new Map(N.map(E=>[E.key.toLowerCase(),E])),a={};let r=!0;for(const E of N){const R=Object.entries(t).find(([M])=>M.toLowerCase()===E.key.toLowerCase());if(!R)continue;const[S,b]=R;String(b??"")!==E.value&&(r=!1,a[S]=String(b??""))}for(const[E,R]of Object.entries(t))o.has(E.toLowerCase())||(a[E]=String(R??""));Re(a),ae(r),Ee(e),ye(!0)},xe=()=>{ye(!1),Ee(null),ae(!0),Re({})},wt=async()=>{if(!oe)return;const e={};if(se)for(const o of N)e[o.key]=o.value;const s=new Map(N.map(o=>[o.key.toLowerCase(),o]));for(const[o,a]of Object.entries(be))s.get(o.toLowerCase())&&se||(e[o]=a);const t=oe;xe(),await De(t,{headers:Object.keys(e).length>0?e:void 0})},Oe=async e=>{var E,R,S,b,M,P,j,A;if(!$())return;const s=x.filter(w=>w.id!==e.id),t=w=>{const C={};if(!w)return C;for(const[B,q]of Object.entries(w)){if(!q)continue;const[$e]=q.split(":");$e&&$e===e.id||q===e.id||(C[B]=q)}return C},o=(l==null?void 0:l.endpointRouting)??{},a=t(((E=o.anthropic)==null?void 0:E.modelRoutes)??(l==null?void 0:l.modelRoutes)??{}),r=t(((R=o.openai)==null?void 0:R.modelRoutes)??{}),u=((l==null?void 0:l.customEndpoints)??f).map(w=>{const C=w.routing,B=C==null?void 0:C.modelRoutes;return B?{...w,routing:{...C,defaults:C.defaults??l.defaults,modelRoutes:t(B)}}:w}),h={...l,providers:s,modelRoutes:a,customEndpoints:u,endpointRouting:{anthropic:{defaults:((S=o.anthropic)==null?void 0:S.defaults)??l.defaults,modelRoutes:a,validation:(b=o.anthropic)==null?void 0:b.validation,compatibility:(M=o.anthropic)==null?void 0:M.compatibility},openai:{defaults:((P=o.openai)==null?void 0:P.defaults)??l.defaults,modelRoutes:r,validation:(j=o.openai)==null?void 0:j.validation,compatibility:(A=o.openai)==null?void 0:A.compatibility}}};try{await I.saveConfig(h),k(h),D({anthropic:Object.entries(a).map(([w,C])=>({id:O(),source:w,target:C})),openai:Object.entries(r).map(([w,C])=>({id:O(),source:w,target:C})),...Object.fromEntries(u.map(w=>{var C;return[w.id,Object.entries(((C=w.routing)==null?void 0:C.modelRoutes)??{}).map(([B,q])=>({id:O(),source:B,target:q}))]}))}),i({title:n("providers.toast.deleteSuccess",{name:e.label||e.id}),variant:"success"}),d.refetch()}catch(w){i({title:n("providers.toast.deleteFailure",{message:w instanceof Error?w.message:"unknown"}),variant:"error"})}},Ct=async()=>{if(c){Pe(!0);try{c.kind==="provider"?await Oe(c.provider):c.kind==="preset"?await yt(c.endpoint,c.preset):await St(c.endpoint.id),Ce(null)}finally{Pe(!1)}}},Pt=e=>{D(s=>({...s,[e]:[...s[e]||[],{id:O(),source:"",target:""}]})),T(s=>({...s,[e]:null}))},kt=async(e,s)=>{var t,o;if($()){Me(!0);try{if(e==="anthropic"||e==="openai"){const a=e,r=l.endpointRouting?{...l.endpointRouting}:{},u=r[a]??{defaults:l.defaults,modelRoutes:(a==="anthropic"?l.modelRoutes:{})??{}},h={defaults:u.defaults??l.defaults,modelRoutes:u.modelRoutes??{},compatibility:u.compatibility},E=s==="off"?void 0:{...u.validation??{},mode:s,allowExperimentalBlocks:((t=u.validation)==null?void 0:t.allowExperimentalBlocks)??!0},R={...l,endpointRouting:{...r,[a]:E?{...h,validation:E}:{...h}}};await I.saveConfig(R),k(R)}else{const a=[...l.customEndpoints??[]],r=a.findIndex(S=>S.id===e);if(r===-1)throw new Error(n("modelManagement.toast.endpointNotFound"));const u=a[r],h=u.routing??{defaults:l.defaults,modelRoutes:{}},E=s==="off"?void 0:{...h.validation??{},mode:s,allowExperimentalBlocks:((o=h.validation)==null?void 0:o.allowExperimentalBlocks)??!0};a[r]={...u,routing:E?{...h,validation:E}:{defaults:h.defaults,modelRoutes:h.modelRoutes,compatibility:h.compatibility}};const R={...l,customEndpoints:a};await I.saveConfig(R),k(R)}i({title:n("modelManagement.toast.validationModeSaved",{mode:n(`modelManagement.claudeValidation.options.${s}.label`)}),variant:"success"}),d.refetch()}catch(a){const r=G(a);i({title:n("modelManagement.toast.validationModeFailure",{message:r.message}),variant:"error"})}finally{Me(!1)}}},Dt=async(e,s)=>{if($()){we(!0);try{if(e==="anthropic"||e==="openai"){const t=e,o=l.endpointRouting?{...l.endpointRouting}:{},a=o[t]??{defaults:l.defaults,modelRoutes:(t==="anthropic"?l.modelRoutes:{})??{}},r={defaults:a.defaults??l.defaults,modelRoutes:a.modelRoutes??{},validation:a.validation},u={...l,endpointRouting:{...o,[t]:s?{...r,compatibility:{enabled:!0}}:{...r}}};await I.saveConfig(u),k(u)}else{const t=[...l.customEndpoints??[]],o=t.findIndex(h=>h.id===e);if(o===-1)throw new Error(n("modelManagement.toast.endpointNotFound"));const a=t[o],r=a.routing??{defaults:l.defaults,modelRoutes:{}};t[o]={...a,routing:s?{...r,compatibility:{enabled:!0}}:{defaults:r.defaults,modelRoutes:r.modelRoutes,validation:r.validation}};const u={...l,customEndpoints:t};await I.saveConfig(u),k(u)}i({title:n("modelManagement.toast.compatibilitySaved",{state:n(s?"common.enabled":"common.disabled")}),variant:"success"}),d.refetch()}catch(t){const o=G(t);i({title:n("modelManagement.toast.compatibilitySaveFailure",{message:o.message}),variant:"error"})}finally{we(!1)}}},xt=(e,s)=>{D(t=>{const o=t[e]||[];return o.some(a=>a.source.trim()===s.trim())?t:{...t,[e]:[...o,{id:O(),source:s,target:""}]}}),T(t=>({...t,[e]:null}))},Ot=(e,s,t,o)=>{D(a=>({...a,[e]:(a[e]||[]).map(r=>r.id===s?{...r,[t]:o}:r)})),T(a=>({...a,[e]:null}))},Tt=(e,s)=>{D(t=>({...t,[e]:(t[e]||[]).filter(o=>o.id!==s)})),T(t=>({...t,[e]:null}))},$t=e=>{var t;if(!l)return;const s=(l.customEndpoints??f).find(o=>o.id===e);if(s)D(o=>{var a;return{...o,[e]:Object.entries(((a=s.routing)==null?void 0:a.modelRoutes)??{}).map(([r,u])=>({id:O(),source:r,target:u}))}});else{const o=l.endpointRouting??{},a=e,r=a==="anthropic"?l.modelRoutes??{}:{},u=((t=o[a])==null?void 0:t.modelRoutes)??r;D(h=>({...h,[e]:Object.entries(u).map(([E,R])=>({id:O(),source:E,target:R}))}))}T(o=>({...o,[e]:null}))},It=Ie({mutationFn:async e=>(await I.saveConfig(e.nextConfig),e)}),Ft=Ie({mutationFn:async e=>(await ie.update(e.endpoint,{routing:e.routing}),e)}),Lt=async e=>{var o,a,r,u,h,E,R;if(!$())return;const s=L[e]||[],t={};for(const S of s){const b=S.source.trim(),M=S.target.trim();if(!(!b&&!M)){if(!b||!M){T(P=>({...P,[e]:n("settings.validation.routePair")}));return}if(t[b]){T(P=>({...P,[e]:n("settings.validation.routeDuplicate",{model:b})}));return}t[b]=M}}T(S=>({...S,[e]:null})),ce(e);try{const S=f.find(b=>b.id===e);if(S){const b={...S.routing??{},modelRoutes:t,defaults:((o=S.routing)==null?void 0:o.defaults)||l.defaults};await Ft.mutateAsync({endpoint:e,routing:b}),k(M=>{if(!M)return M;const P=[...M.customEndpoints??[]],j=P.findIndex(A=>A.id===e);return j===-1?M:(P[j]={...P[j],routing:b},{...M,customEndpoints:P})}),await p.invalidateQueries({queryKey:U.customEndpoints.all()})}else{const b={...l,endpointRouting:{...l.endpointRouting??{},[e]:{defaults:((r=(a=l.endpointRouting)==null?void 0:a[e])==null?void 0:r.defaults)??l.defaults,modelRoutes:t,validation:(h=(u=l.endpointRouting)==null?void 0:u[e])==null?void 0:h.validation,compatibility:(R=(E=l.endpointRouting)==null?void 0:E[e])==null?void 0:R.compatibility}},modelRoutes:e==="anthropic"?t:l.modelRoutes??{}};await It.mutateAsync({endpoint:e,nextConfig:b}),k(b)}D(b=>({...b,[e]:Object.entries(t).map(([M,P])=>({id:O(),source:M,target:P}))})),i({title:n("modelManagement.toast.routesSaved"),variant:"success"}),d.refetch()}catch(S){i({title:n("modelManagement.toast.routesSaveFailure",{message:S instanceof Error?S.message:"unknown"}),variant:"error"})}finally{ce(null)}},jt=(c==null?void 0:c.kind)==="provider"?n("providers.actions.delete"):(c==null?void 0:c.kind)==="preset"?n("modelManagement.presets.delete"):(c==null?void 0:c.kind)==="endpoint"?n("common.delete"):"",Bt=(c==null?void 0:c.kind)==="provider"?n("providers.confirm.delete",{name:c.provider.label||c.provider.id}):(c==null?void 0:c.kind)==="preset"?n("modelManagement.confirm.deletePreset",{name:c.preset.name}):(c==null?void 0:c.kind)==="endpoint"?n("modelManagement.deleteEndpointConfirm",{label:c.endpoint.label}):"",qt=(c==null?void 0:c.kind)==="provider"?c.provider.label||c.provider.id:(c==null?void 0:c.kind)==="preset"?c.preset.name:(c==null?void 0:c.kind)==="endpoint"?c.endpoint.label:"";return{activeTab:y,activeTabInfo:rt,anthropicTestHeaderOptions:N,applyingPreset:Ke,config:l,configQuery:d,confirmAction:c,confirmDialogDescription:Bt,confirmDialogName:qt,confirmDialogTitle:jt,confirmingAction:tt,customEndpoints:f,customTabs:at,defaultLabels:ut,deletingPreset:He,drawerMode:X,drawerOpen:Be,editingEndpoint:qe,editingProvider:V,endpointDrawerOpen:Ue,filteredProviders:lt,noModelDialogProvider:_e,handleAddRoute:Pt,handleAddSuggestion:xt,handleApplyPreset:vt,handleCompatibilityEnabledChange:Dt,handleConfirmDialog:Ct,handleDeleteProvider:Oe,handleOpenCreate:Et,handleOpenCreateEndpoint:ct,handleOpenEditEndpoint:mt,handleOpenEdit:bt,handlePresetNameChange:gt,handleProviderSubmit:Rt,handleRemoveRoute:Tt,handleResetRoutes:$t,handleRouteChange:Ot,handleSavePreset:ht,handleSaveRoutes:Lt,handleValidationModeChange:kt,initiateTestConnection:Mt,isDirtyByEndpoint:ft,presetDiffDialog:Ze,presetErrorByEndpoint:ze,presetNameByEndpoint:pe,presetsByEndpoint:me,presetsExpanded:Xe,providerCount:it,providerModelOptions:dt,providerSearch:re,providerTypeFilter:z,providers:x,pushToast:i,routeError:Ve,routesByEndpoint:L,savingClaudeValidation:Je,savingCompatibilityPolicy:We,savingPresetFor:Ae,savingRouteFor:Qe,setActiveTab:F,setConfirmAction:Ce,setDrawerMode:Y,setDrawerOpen:W,setEditingEndpoint:ee,setEditingProvider:Z,setEndpointDrawerOpen:te,setNoModelDialogProvider:Se,setPresetDiffDialog:et,setPresetsExpanded:Ye,setProviderSearch:nt,setProviderTypeFilter:ot,setTestDialogUsePreset:ae,systemTabs:st,tabs:g,testDialogOpen:Ge,testDialogPreservedExtras:be,testDialogProvider:oe,testDialogUsePreset:se,testingProviderId:Ne,closeTestDialog:xe,confirmTestDialog:wt}}export{tn as C,nn as O,an as a,sn as g,on as i,rn as u};
|
|
1
|
+
import{r as m}from"./vendor-DdPBfMMb.js";import{u as Nt,a as Ut}from"./query-QCek5MsK.js";import{g as K,b as H,u as Vt,t as G,c as ie}from"./app-CUHICvDo.js";import{g as I}from"./gateway-DhxavTUf.js";import{q as U}from"./queryKeys-DLyolp-A.js";import{u as Ie}from"./useAppMutation-CJrALOdE.js";import{u as Qt}from"./useApiQuery-DhdisbOK.js";import{u as zt}from"./i18n-C8tBby0x.js";const _={savePreset(n,i){return K(H.post(`/api/routing-presets/${n}`,{name:i}))},applyPreset(n,i){return K(H.post(`/api/routing-presets/${n}/apply`,{name:i}))},deletePreset(n,i){return K(H.delete(`/api/routing-presets/${n}/${encodeURIComponent(i)}`))},testProvider(n,i){return K(H.post(`/api/providers/${n}/test`,i??{}))}},tn=["claude-sonnet-4-5-20250929","claude-sonnet-4-5-20250929-thinking","claude-sonnet-4-20250514","claude-opus-4-1-20250805","claude-opus-4-1-20250805-thinking","claude-haiku-4-5-20251001","claude-haiku-4-5-20251001-thinking","claude-3-5-haiku-20241022"],nn=["gpt-4o-mini","gpt-4o","o4-mini","o4-large","gpt-5-codex"];function O(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():Math.random().toString(36).slice(2,10)}function J(n,i){var p;return(p=n==null?void 0:n.customEndpoints)!=null&&p.length?n.customEndpoints:i}function le(n){return n?Object.entries(n).map(([i,p])=>({id:O(),source:i,target:p})):[]}function ue(n,i){var v,f,g;if(!n)return{};const p={},d=n.endpointRouting??{};p.anthropic=le(((v=d.anthropic)==null?void 0:v.modelRoutes)??n.modelRoutes??{}),p.openai=le(((f=d.openai)==null?void 0:f.modelRoutes)??{});for(const y of J(n,i))(g=y.routing)!=null&&g.modelRoutes?p[y.id]=le(y.routing.modelRoutes):p[y.id]=[];return p}function Fe(n,i,p){var f,g,y;const d=J(n,i).find(F=>F.id===p);if(d)return((f=d.routing)==null?void 0:f.modelRoutes)??{};const v=n.endpointRouting??{};return p==="anthropic"?((g=v.anthropic)==null?void 0:g.modelRoutes)??n.modelRoutes??{}:p==="openai"?((y=v.openai)==null?void 0:y.modelRoutes)??{}:{}}function At(n){const i={};for(const p of n){const d=p.source.trim(),v=p.target.trim();d&&v&&(i[d]=v)}return i}function Le(n,i){return JSON.stringify(At(n))!==JSON.stringify(i)}function on(n,i){if(n==="anthropic")return!0;const p=i.find(d=>d.id===n);return p?p.paths&&p.paths.length>0?p.paths.some(d=>d.protocol==="anthropic"):p.protocol==="anthropic":!1}function sn(n,i,p){var v,f,g;if(!i)return;if(n==="anthropic"||n==="openai")return(f=(v=i.endpointRouting)==null?void 0:v[n])==null?void 0:f.validation;const d=J(i,p).find(y=>y.id===n);return(g=d==null?void 0:d.routing)==null?void 0:g.validation}function an(n,i,p){var v,f,g;if(!i)return;if(n==="anthropic"||n==="openai")return(f=(v=i.endpointRouting)==null?void 0:v[n])==null?void 0:f.compatibility;const d=J(i,p).find(y=>y.id===n);return(g=d==null?void 0:d.routing)==null?void 0:g.compatibility}function Kt(n,i){const p=[{key:"providers",label:n("modelManagement.tabs.providers"),description:n("modelManagement.tabs.providersDesc"),isSystem:!0,canDelete:!1},{key:"anthropic",label:n("modelManagement.tabs.anthropic"),description:n("modelManagement.tabs.anthropicDesc"),isSystem:!0,canDelete:!1,protocols:["anthropic"]},{key:"openai",label:n("modelManagement.tabs.openai"),description:n("modelManagement.tabs.openaiDesc"),isSystem:!0,canDelete:!1,protocols:["openai-auto","openai-chat","openai-responses"]}],d=i.map(v=>{let f=n("modelManagement.tabs.customEndpoint"),g=[];if(v.paths&&v.paths.length>0)f=`${n("modelManagement.tabs.customEndpoint")}: ${v.paths.map(y=>`${y.path} (${y.protocol})`).join(", ")}`,g=[...new Set(v.paths.map(y=>y.protocol))];else if(v.path){const y=v.protocol||"anthropic";f=`${n("modelManagement.tabs.customEndpoint")}: ${v.path} (${y})`,g=[y]}return{key:v.id,label:v.label||v.id,description:f,isSystem:!1,canDelete:v.deletable!==!1,protocols:g}});return[...p,...d]}function Ht(n){return n.label&&n.label.trim().length>0?`${n.label} (${n.id})`:n.id}function je(n,i){var d,v,f;const p={anthropic:((d=n.routingPresets)==null?void 0:d.anthropic)??[],openai:((v=n.routingPresets)==null?void 0:v.openai)??[]};for(const g of i){const y=(f=n.customEndpoints)==null?void 0:f.find(F=>F.id===g.id);p[g.id]=(y==null?void 0:y.routingPresets)??g.routingPresets??[]}return p}function rn(){var Te;const{t:n}=zt(),{pushToast:i}=Vt(),p=Nt(),d=Qt(U.config.full(),I.configRequest()),f=((Te=Ut({queryKey:U.customEndpoints.all(),queryFn:ie.list,refetchInterval:1e4}).data)==null?void 0:Te.endpoints)??[],g=m.useMemo(()=>Kt(n,f),[f,n]),[y,F]=m.useState("providers"),[l,k]=m.useState(null),[Be,W]=m.useState(!1),[X,Y]=m.useState("create"),[V,Z]=m.useState(void 0),[qe,ee]=m.useState(void 0),[Ne,de]=m.useState(null),[Ue,te]=m.useState(!1),[L,D]=m.useState({}),[Ve,T]=m.useState({}),[Qe,ce]=m.useState(null),[me,ne]=m.useState({}),[pe,fe]=m.useState({}),[ze,Q]=m.useState({}),[Ae,ge]=m.useState(null),[Ke,he]=m.useState(null),[He,ve]=m.useState(null),[Ge,ye]=m.useState(!1),[oe,Ee]=m.useState(null),[se,ae]=m.useState(!0),[be,Re]=m.useState({}),[_e,Se]=m.useState(null),[Je,Me]=m.useState(!1),[We,we]=m.useState(!1),[Xe,Ye]=m.useState({}),[Ze,et]=m.useState(null),[c,Ce]=m.useState(null),[tt,Pe]=m.useState(!1),[re,nt]=m.useState(""),[z,ot]=m.useState("all"),st=m.useMemo(()=>g.filter(e=>e.isSystem),[g]),at=m.useMemo(()=>g.filter(e=>!e.isSystem),[g]),rt=m.useMemo(()=>g.find(e=>e.key===y)??g[0]??null,[y,g]),x=(l==null?void 0:l.providers)??[],it=x.length,lt=m.useMemo(()=>x.filter(e=>{var a;if(!(z==="all"||(e.type??"custom")===z))return!1;const t=re.trim().toLowerCase();return t?[e.id,e.label??"",e.baseUrl,e.defaultModel??"",...((a=e.models)==null?void 0:a.map(r=>r.id))??[]].join(" ").toLowerCase().includes(t):!0}),[re,z,x]),N=m.useMemo(()=>[{key:"anthropic-beta",value:"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14",label:n("providers.testDialog.options.beta.label"),description:n("providers.testDialog.options.beta.description")}],[n]);m.useEffect(()=>{if(!d.data)return;const e=d.data;k(e),D(s=>{const t=ue(e,f);if(!s||Object.keys(s).length===0)return t;const o={...t};for(const[a,r]of Object.entries(s)){if(!(a in t))continue;const u=Fe(e,f,a);Le(r,u)&&(o[a]=r)}return o}),T({}),ne(je(e,f))},[d.data,f]),m.useEffect(()=>{!d.isError||!d.error||i({title:n("providers.toast.loadFailure",{message:d.error.message}),variant:"error"})},[d.error,d.isError,i,n]),m.useEffect(()=>{g.some(e=>e.key===y)||F("providers")},[y,g]);const ut=m.useMemo(()=>{const e=new Map;for(const s of x){if(!s.defaultModel||!s.models)continue;const t=s.models.find(o=>o.id===s.defaultModel);t&&e.set(s.id,Ht(t))}return e},[x]),dt=m.useMemo(()=>{const e=[],s=new Set;for(const t of x){const o=t.label&&t.label!==t.id?`${t.label} (${t.id})`:t.id,a=t.models??[];if(a.length>0)for(const u of a){const h=`${t.id}:${u.id}`;s.has(h)||(s.add(h),e.push({value:h,label:`${o} · ${u.label??u.id}`,providerId:t.id,providerLabel:o,modelId:u.id,modelLabel:u.label??u.id,kind:"model",isDefault:t.defaultModel===u.id}))}else if(t.defaultModel){const u=`${t.id}:${t.defaultModel}`;s.has(u)||(s.add(u),e.push({value:u,label:`${o} · ${t.defaultModel}`,providerId:t.id,providerLabel:o,modelId:t.defaultModel,modelLabel:t.defaultModel,kind:"model",isDefault:!0}))}const r=`${t.id}:*`;s.has(r)||(s.add(r),e.push({value:r,label:n("settings.routing.providerPassthroughOption",{provider:o}),providerId:t.id,providerLabel:o,modelId:"*",modelLabel:"*",kind:"passthrough"}))}for(const t of Object.values(L).flat()){const o=t.target.trim();o&&!s.has(o)&&(s.add(o),e.push({value:o,label:o,modelId:o,modelLabel:o,kind:"custom"}))}return e},[x,L,n]),ct=()=>{ee(void 0),te(!0)},mt=e=>{ee(e),te(!0)},pt=e=>l?Fe(l,f,e):{},ft=m.useMemo(()=>{const e={};for(const s of g){if(s.key==="providers")continue;const t=L[s.key]||[];e[s.key]=Le(t,pt(s.key))}return e},[l,f,L,g]),ke=(e,s)=>{ne(t=>({...t,[e]:s})),k(t=>{if(!t)return t;if(e==="anthropic"||e==="openai")return{...t,routingPresets:{...t.routingPresets,[e]:s}};const o=[...t.customEndpoints??[]],a=o.findIndex(r=>r.id===e);return a===-1?t:(o[a]={...o[a],routingPresets:s},{...t,customEndpoints:o})})},$=()=>l?!0:(i({title:n("settings.toast.missingConfig"),variant:"error"}),d.refetch(),!1),gt=(e,s)=>{fe(t=>({...t,[e]:s})),s.trim()&&Q(t=>({...t,[e]:null}))},ht=async e=>{if(!$())return;const s=(pe[e]??"").trim();if(!s){Q(t=>({...t,[e]:n("modelManagement.validation.presetName")}));return}if((me[e]??[]).some(t=>t.name.toLowerCase()===s.toLowerCase())){Q(t=>({...t,[e]:n("modelManagement.validation.presetDuplicate",{name:s})}));return}ge(e);try{const o=(await _.savePreset(e,s)).presets??[];ke(e,o),fe(a=>({...a,[e]:""})),Q(a=>({...a,[e]:null})),i({title:n("modelManagement.toast.presetSaved",{name:s}),variant:"success"})}catch(t){i({title:n("modelManagement.toast.presetSaveFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{ge(null),d.refetch()}},vt=async(e,s)=>{if($()){he({endpoint:e,name:s.name});try{const o=(await _.applyPreset(e,s.name)).config;if(o)k(o),D(ue(o,f)),ne(je(o,f));else{const a=s.modelRoutes??{};D(r=>({...r,[e]:Object.entries(a).map(([u,h])=>({id:O(),source:u,target:h}))})),k(r=>{var h,E,R,S;if(!r)return r;const u=(r.customEndpoints??[]).findIndex(b=>b.id===e);if(u!==-1){const b=[...r.customEndpoints??[]],M=b[u];return b[u]={...M,routing:{defaults:((h=M.routing)==null?void 0:h.defaults)??r.defaults,...M.routing??{},modelRoutes:a}},{...r,customEndpoints:b}}return e==="anthropic"||e==="openai"?{...r,endpointRouting:{...r.endpointRouting??{},[e]:{defaults:((R=(E=r.endpointRouting)==null?void 0:E[e])==null?void 0:R.defaults)??r.defaults,...((S=r.endpointRouting)==null?void 0:S[e])??{},modelRoutes:a}},modelRoutes:e==="anthropic"?a:r.modelRoutes??{}}:r})}e!=="anthropic"&&e!=="openai"&&await p.invalidateQueries({queryKey:U.customEndpoints.all()}),i({title:n("modelManagement.toast.presetApplySuccess",{name:s.name}),variant:"success"})}catch(t){i({title:n("modelManagement.toast.presetApplyFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{he(null),d.refetch()}}},yt=async(e,s)=>{if($()){ve({endpoint:e,name:s.name});try{const t=await _.deletePreset(e,s.name);ke(e,t.presets??[]),i({title:n("modelManagement.toast.presetDeleteSuccess",{name:s.name}),variant:"success"})}catch(t){i({title:n("modelManagement.toast.presetDeleteFailure",{message:t instanceof Error?t.message:"unknown"}),variant:"error"})}finally{ve(null),d.refetch()}}},Et=()=>{$()&&(Y("create"),Z(void 0),W(!0))},bt=e=>{$()&&(Y("edit"),Z(e),W(!0))},Rt=async e=>{if(!l)throw new Error(n("settings.toast.missingConfig"));const s=X==="create"?[...x,e]:x.map(o=>V&&o.id===V.id?{...e,id:V.id}:o),t={...l,providers:s};await I.saveConfig(t),k(t),D(ue(t,f)),d.refetch(),i({title:X==="create"?n("providers.toast.createSuccess",{name:e.label||e.id}):n("providers.toast.updateSuccess",{name:e.label||e.id}),variant:"success"})},St=async e=>{const s=f.find(t=>t.id===e);if(!(!s||s.deletable===!1))try{await ie.delete(e),await p.invalidateQueries({queryKey:U.customEndpoints.all()}),i({title:n("modelManagement.deleteEndpointSuccess"),variant:"success"}),y===e&&F("providers")}catch(t){const o=G(t);i({title:n("modelManagement.deleteEndpointError",{error:o.message}),variant:"error"})}},De=async(e,s)=>{de(e.id);try{const t=s&&(s.headers||s.query)?{headers:s.headers&&Object.keys(s.headers).length>0?s.headers:void 0,query:s.query&&s.query.trim().length>0?s.query.trim():void 0}:void 0,o=await _.testProvider(e.id,t);if(o.ok){i({title:n("providers.toast.testSuccess"),description:n("providers.toast.testSuccessDesc",{status:o.status,duration:o.durationMs?`${o.durationMs} ms`:"—"}),variant:"success"});return}i({title:n("providers.toast.testFailure",{message:`${o.status} ${o.statusText}`}),variant:"error"})}catch(t){const o=G(t);i({title:n("providers.toast.testFailure",{message:o.status?`${o.status} ${o.message}`:o.message}),variant:"error"})}finally{de(null)}},Mt=e=>{var u,h;if(!(!!((u=e.defaultModel)!=null&&u.trim())||!!((h=e.models)!=null&&h.some(E=>E.id.trim().length>0)))){Se(e);return}if(e.type!=="anthropic"){De(e);return}const t=e.extraHeaders??{},o=new Map(N.map(E=>[E.key.toLowerCase(),E])),a={};let r=!0;for(const E of N){const R=Object.entries(t).find(([M])=>M.toLowerCase()===E.key.toLowerCase());if(!R)continue;const[S,b]=R;String(b??"")!==E.value&&(r=!1,a[S]=String(b??""))}for(const[E,R]of Object.entries(t))o.has(E.toLowerCase())||(a[E]=String(R??""));Re(a),ae(r),Ee(e),ye(!0)},xe=()=>{ye(!1),Ee(null),ae(!0),Re({})},wt=async()=>{if(!oe)return;const e={};if(se)for(const o of N)e[o.key]=o.value;const s=new Map(N.map(o=>[o.key.toLowerCase(),o]));for(const[o,a]of Object.entries(be))s.get(o.toLowerCase())&&se||(e[o]=a);const t=oe;xe(),await De(t,{headers:Object.keys(e).length>0?e:void 0})},Oe=async e=>{var E,R,S,b,M,P,j,A;if(!$())return;const s=x.filter(w=>w.id!==e.id),t=w=>{const C={};if(!w)return C;for(const[B,q]of Object.entries(w)){if(!q)continue;const[$e]=q.split(":");$e&&$e===e.id||q===e.id||(C[B]=q)}return C},o=(l==null?void 0:l.endpointRouting)??{},a=t(((E=o.anthropic)==null?void 0:E.modelRoutes)??(l==null?void 0:l.modelRoutes)??{}),r=t(((R=o.openai)==null?void 0:R.modelRoutes)??{}),u=((l==null?void 0:l.customEndpoints)??f).map(w=>{const C=w.routing,B=C==null?void 0:C.modelRoutes;return B?{...w,routing:{...C,defaults:C.defaults??l.defaults,modelRoutes:t(B)}}:w}),h={...l,providers:s,modelRoutes:a,customEndpoints:u,endpointRouting:{anthropic:{defaults:((S=o.anthropic)==null?void 0:S.defaults)??l.defaults,modelRoutes:a,validation:(b=o.anthropic)==null?void 0:b.validation,compatibility:(M=o.anthropic)==null?void 0:M.compatibility},openai:{defaults:((P=o.openai)==null?void 0:P.defaults)??l.defaults,modelRoutes:r,validation:(j=o.openai)==null?void 0:j.validation,compatibility:(A=o.openai)==null?void 0:A.compatibility}}};try{await I.saveConfig(h),k(h),D({anthropic:Object.entries(a).map(([w,C])=>({id:O(),source:w,target:C})),openai:Object.entries(r).map(([w,C])=>({id:O(),source:w,target:C})),...Object.fromEntries(u.map(w=>{var C;return[w.id,Object.entries(((C=w.routing)==null?void 0:C.modelRoutes)??{}).map(([B,q])=>({id:O(),source:B,target:q}))]}))}),i({title:n("providers.toast.deleteSuccess",{name:e.label||e.id}),variant:"success"}),d.refetch()}catch(w){i({title:n("providers.toast.deleteFailure",{message:w instanceof Error?w.message:"unknown"}),variant:"error"})}},Ct=async()=>{if(c){Pe(!0);try{c.kind==="provider"?await Oe(c.provider):c.kind==="preset"?await yt(c.endpoint,c.preset):await St(c.endpoint.id),Ce(null)}finally{Pe(!1)}}},Pt=e=>{D(s=>({...s,[e]:[...s[e]||[],{id:O(),source:"",target:""}]})),T(s=>({...s,[e]:null}))},kt=async(e,s)=>{var t,o;if($()){Me(!0);try{if(e==="anthropic"||e==="openai"){const a=e,r=l.endpointRouting?{...l.endpointRouting}:{},u=r[a]??{defaults:l.defaults,modelRoutes:(a==="anthropic"?l.modelRoutes:{})??{}},h={defaults:u.defaults??l.defaults,modelRoutes:u.modelRoutes??{},compatibility:u.compatibility},E=s==="off"?void 0:{...u.validation??{},mode:s,allowExperimentalBlocks:((t=u.validation)==null?void 0:t.allowExperimentalBlocks)??!0},R={...l,endpointRouting:{...r,[a]:E?{...h,validation:E}:{...h}}};await I.saveConfig(R),k(R)}else{const a=[...l.customEndpoints??[]],r=a.findIndex(S=>S.id===e);if(r===-1)throw new Error(n("modelManagement.toast.endpointNotFound"));const u=a[r],h=u.routing??{defaults:l.defaults,modelRoutes:{}},E=s==="off"?void 0:{...h.validation??{},mode:s,allowExperimentalBlocks:((o=h.validation)==null?void 0:o.allowExperimentalBlocks)??!0};a[r]={...u,routing:E?{...h,validation:E}:{defaults:h.defaults,modelRoutes:h.modelRoutes,compatibility:h.compatibility}};const R={...l,customEndpoints:a};await I.saveConfig(R),k(R)}i({title:n("modelManagement.toast.validationModeSaved",{mode:n(`modelManagement.claudeValidation.options.${s}.label`)}),variant:"success"}),d.refetch()}catch(a){const r=G(a);i({title:n("modelManagement.toast.validationModeFailure",{message:r.message}),variant:"error"})}finally{Me(!1)}}},Dt=async(e,s)=>{if($()){we(!0);try{if(e==="anthropic"||e==="openai"){const t=e,o=l.endpointRouting?{...l.endpointRouting}:{},a=o[t]??{defaults:l.defaults,modelRoutes:(t==="anthropic"?l.modelRoutes:{})??{}},r={defaults:a.defaults??l.defaults,modelRoutes:a.modelRoutes??{},validation:a.validation},u={...l,endpointRouting:{...o,[t]:s?{...r,compatibility:{enabled:!0}}:{...r}}};await I.saveConfig(u),k(u)}else{const t=[...l.customEndpoints??[]],o=t.findIndex(h=>h.id===e);if(o===-1)throw new Error(n("modelManagement.toast.endpointNotFound"));const a=t[o],r=a.routing??{defaults:l.defaults,modelRoutes:{}};t[o]={...a,routing:s?{...r,compatibility:{enabled:!0}}:{defaults:r.defaults,modelRoutes:r.modelRoutes,validation:r.validation}};const u={...l,customEndpoints:t};await I.saveConfig(u),k(u)}i({title:n("modelManagement.toast.compatibilitySaved",{state:n(s?"common.enabled":"common.disabled")}),variant:"success"}),d.refetch()}catch(t){const o=G(t);i({title:n("modelManagement.toast.compatibilitySaveFailure",{message:o.message}),variant:"error"})}finally{we(!1)}}},xt=(e,s)=>{D(t=>{const o=t[e]||[];return o.some(a=>a.source.trim()===s.trim())?t:{...t,[e]:[...o,{id:O(),source:s,target:""}]}}),T(t=>({...t,[e]:null}))},Ot=(e,s,t,o)=>{D(a=>({...a,[e]:(a[e]||[]).map(r=>r.id===s?{...r,[t]:o}:r)})),T(a=>({...a,[e]:null}))},Tt=(e,s)=>{D(t=>({...t,[e]:(t[e]||[]).filter(o=>o.id!==s)})),T(t=>({...t,[e]:null}))},$t=e=>{var t;if(!l)return;const s=(l.customEndpoints??f).find(o=>o.id===e);if(s)D(o=>{var a;return{...o,[e]:Object.entries(((a=s.routing)==null?void 0:a.modelRoutes)??{}).map(([r,u])=>({id:O(),source:r,target:u}))}});else{const o=l.endpointRouting??{},a=e,r=a==="anthropic"?l.modelRoutes??{}:{},u=((t=o[a])==null?void 0:t.modelRoutes)??r;D(h=>({...h,[e]:Object.entries(u).map(([E,R])=>({id:O(),source:E,target:R}))}))}T(o=>({...o,[e]:null}))},It=Ie({mutationFn:async e=>(await I.saveConfig(e.nextConfig),e)}),Ft=Ie({mutationFn:async e=>(await ie.update(e.endpoint,{routing:e.routing}),e)}),Lt=async e=>{var o,a,r,u,h,E,R;if(!$())return;const s=L[e]||[],t={};for(const S of s){const b=S.source.trim(),M=S.target.trim();if(!(!b&&!M)){if(!b||!M){T(P=>({...P,[e]:n("settings.validation.routePair")}));return}if(t[b]){T(P=>({...P,[e]:n("settings.validation.routeDuplicate",{model:b})}));return}t[b]=M}}T(S=>({...S,[e]:null})),ce(e);try{const S=f.find(b=>b.id===e);if(S){const b={...S.routing??{},modelRoutes:t,defaults:((o=S.routing)==null?void 0:o.defaults)||l.defaults};await Ft.mutateAsync({endpoint:e,routing:b}),k(M=>{if(!M)return M;const P=[...M.customEndpoints??[]],j=P.findIndex(A=>A.id===e);return j===-1?M:(P[j]={...P[j],routing:b},{...M,customEndpoints:P})}),await p.invalidateQueries({queryKey:U.customEndpoints.all()})}else{const b={...l,endpointRouting:{...l.endpointRouting??{},[e]:{defaults:((r=(a=l.endpointRouting)==null?void 0:a[e])==null?void 0:r.defaults)??l.defaults,modelRoutes:t,validation:(h=(u=l.endpointRouting)==null?void 0:u[e])==null?void 0:h.validation,compatibility:(R=(E=l.endpointRouting)==null?void 0:E[e])==null?void 0:R.compatibility}},modelRoutes:e==="anthropic"?t:l.modelRoutes??{}};await It.mutateAsync({endpoint:e,nextConfig:b}),k(b)}D(b=>({...b,[e]:Object.entries(t).map(([M,P])=>({id:O(),source:M,target:P}))})),i({title:n("modelManagement.toast.routesSaved"),variant:"success"}),d.refetch()}catch(S){i({title:n("modelManagement.toast.routesSaveFailure",{message:S instanceof Error?S.message:"unknown"}),variant:"error"})}finally{ce(null)}},jt=(c==null?void 0:c.kind)==="provider"?n("providers.actions.delete"):(c==null?void 0:c.kind)==="preset"?n("modelManagement.presets.delete"):(c==null?void 0:c.kind)==="endpoint"?n("common.delete"):"",Bt=(c==null?void 0:c.kind)==="provider"?n("providers.confirm.delete",{name:c.provider.label||c.provider.id}):(c==null?void 0:c.kind)==="preset"?n("modelManagement.confirm.deletePreset",{name:c.preset.name}):(c==null?void 0:c.kind)==="endpoint"?n("modelManagement.deleteEndpointConfirm",{label:c.endpoint.label}):"",qt=(c==null?void 0:c.kind)==="provider"?c.provider.label||c.provider.id:(c==null?void 0:c.kind)==="preset"?c.preset.name:(c==null?void 0:c.kind)==="endpoint"?c.endpoint.label:"";return{activeTab:y,activeTabInfo:rt,anthropicTestHeaderOptions:N,applyingPreset:Ke,config:l,configQuery:d,confirmAction:c,confirmDialogDescription:Bt,confirmDialogName:qt,confirmDialogTitle:jt,confirmingAction:tt,customEndpoints:f,customTabs:at,defaultLabels:ut,deletingPreset:He,drawerMode:X,drawerOpen:Be,editingEndpoint:qe,editingProvider:V,endpointDrawerOpen:Ue,filteredProviders:lt,noModelDialogProvider:_e,handleAddRoute:Pt,handleAddSuggestion:xt,handleApplyPreset:vt,handleCompatibilityEnabledChange:Dt,handleConfirmDialog:Ct,handleDeleteProvider:Oe,handleOpenCreate:Et,handleOpenCreateEndpoint:ct,handleOpenEditEndpoint:mt,handleOpenEdit:bt,handlePresetNameChange:gt,handleProviderSubmit:Rt,handleRemoveRoute:Tt,handleResetRoutes:$t,handleRouteChange:Ot,handleSavePreset:ht,handleSaveRoutes:Lt,handleValidationModeChange:kt,initiateTestConnection:Mt,isDirtyByEndpoint:ft,presetDiffDialog:Ze,presetErrorByEndpoint:ze,presetNameByEndpoint:pe,presetsByEndpoint:me,presetsExpanded:Xe,providerCount:it,providerModelOptions:dt,providerSearch:re,providerTypeFilter:z,providers:x,pushToast:i,routeError:Ve,routesByEndpoint:L,savingClaudeValidation:Je,savingCompatibilityPolicy:We,savingPresetFor:Ae,savingRouteFor:Qe,setActiveTab:F,setConfirmAction:Ce,setDrawerMode:Y,setDrawerOpen:W,setEditingEndpoint:ee,setEditingProvider:Z,setEndpointDrawerOpen:te,setNoModelDialogProvider:Se,setPresetDiffDialog:et,setPresetsExpanded:Ye,setProviderSearch:nt,setProviderTypeFilter:ot,setTestDialogUsePreset:ae,systemTabs:st,tabs:g,testDialogOpen:Ge,testDialogPreservedExtras:be,testDialogProvider:oe,testDialogUsePreset:se,testingProviderId:Ne,closeTestDialog:xe,confirmTestDialog:wt}}export{tn as C,nn as O,an as a,sn as g,on as i,rn as u};
|
package/src/web/dist/index.html
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="apple-touch-icon" href="/cc-gw-mark.svg" />
|
|
9
9
|
<link rel="manifest" href="/site.webmanifest" />
|
|
10
10
|
<title>cc-gw 控制台</title>
|
|
11
|
-
<script type="module" crossorigin src="/assets/app-
|
|
11
|
+
<script type="module" crossorigin src="/assets/app-CUHICvDo.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/vendor-DdPBfMMb.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/global-DA-0y145.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/query-QCek5MsK.js">
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
}
|
|
43
43
|
</script>
|
|
44
44
|
<title>cc-gw | 你的 API Key 不该躺在 30 个 .env 里 · local-first AI gateway</title>
|
|
45
|
-
<script type="module" crossorigin src="/assets/landing-
|
|
45
|
+
<script type="module" crossorigin src="/assets/landing-aXQw-el0.js"></script>
|
|
46
46
|
<link rel="modulepreload" crossorigin href="/assets/vendor-DdPBfMMb.js">
|
|
47
47
|
<link rel="modulepreload" crossorigin href="/assets/global-DA-0y145.js">
|
|
48
|
-
<link rel="modulepreload" crossorigin href="/assets/clipboard-
|
|
49
|
-
<link rel="modulepreload" crossorigin href="/assets/package-
|
|
48
|
+
<link rel="modulepreload" crossorigin href="/assets/clipboard-BnAnBk_-.js">
|
|
49
|
+
<link rel="modulepreload" crossorigin href="/assets/package-BcqrltRw.js">
|
|
50
50
|
<link rel="stylesheet" crossorigin href="/assets/global-DvELjyJN.css">
|
|
51
51
|
</head>
|
|
52
52
|
<body class="bg-slate-50 text-slate-900">
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as u,j as e,o as Xe,ay as Ze,al as Ye,a7 as et,az as tt,ax as st,U as lt,P as at}from"./vendor-DdPBfMMb.js";import{P as rt}from"./PageToolbar-DATSQ0uI.js";import{c as S}from"./global-DA-0y145.js";import{B as L,b as ot,u as fe,s as R,t as nt,a as M}from"./app-BSb5gJZ1.js";import{B as O,q as U}from"./queryKeys-DLyolp-A.js";import{C as _e,a as Le}from"./card-DPI7HeM2.js";import{I as xe}from"./input-CRm3Lt3O.js";import{L as $}from"./label-D0KXM_V7.js";import{S as te,a as se,b as le,c as ae,d as K}from"./select-C4IDwhTu.js";import{u as P}from"./i18n-C8tBby0x.js";import{D as it,A as dt,a as ct,b as ut,c as mt,d as pt}from"./DialogShell-C0YGDw-Y.js";import{P as xt,a as re}from"./PageState-B8pYAtQ5.js";import{c as gt}from"./clipboard-C4bYXSTr.js";import{u as W}from"./useApiQuery-D7IzQ3YN.js";import{a as ft,g as Re,b as ht,f as Q,c as De,d as yt,e as I,h as bt}from"./utils-DNPbJsD2.js";import{P as jt,a as vt,b as wt}from"./popover-DVsRdElU.js";import{L as Nt}from"./router-D2Fb4U0L.js";import{T as kt}from"./Skeleton-9Z0ltPLO.js";import{u as St}from"./query-QCek5MsK.js";import{g as Ce}from"./gateway-CXVAjkAI.js";import"./radix-C0Bt6n-I.js";function Ct({apiKeys:l,selected:t,onChange:n,disabled:r,className:d}){const{t:s}=P(),[o,y]=u.useState(!1),[p,b]=u.useState(null),v=u.useRef(null),g=u.useRef(null),m=u.useRef(null),c=()=>{const x=g.current;if(!x)return;const N=x.getBoundingClientRect(),h=Math.max(N.width,256),E=window.innerWidth-12;b({left:Math.min(N.left,E-h),top:N.bottom+8,width:h})};u.useEffect(()=>{if(!o)return;const x=N=>{var E,k;const h=N.target;!((E=v.current)!=null&&E.contains(h))&&!((k=m.current)!=null&&k.contains(h))&&y(!1)};return window.addEventListener("mousedown",x),()=>window.removeEventListener("mousedown",x)},[o]),u.useEffect(()=>{if(o)return c(),window.addEventListener("resize",c),window.addEventListener("scroll",c,!0),()=>{window.removeEventListener("resize",c),window.removeEventListener("scroll",c,!0)}},[o]);const a=u.useMemo(()=>{if(t.length===0)return[];const x=new Map;for(const N of l)x.set(N.id,N);return t.map(N=>{const h=x.get(N);return h?h.isWildcard?s("apiKeys.wildcard"):h.name:null}).filter(N=>!!N)},[l,t,s]),j=t.length===0?s("logs.filters.apiKeyAll"):s("logs.filters.apiKeySelected",{count:t.length}),f=x=>{t.includes(x)?n(t.filter(N=>N!==x)):n([...t,x])};return e.jsxs("div",{className:S("relative space-y-2",d),ref:v,children:[e.jsx($,{children:s("logs.filters.apiKey")}),e.jsxs("button",{ref:g,type:"button",onClick:()=>{c(),y(x=>!x)},disabled:r||l.length===0,title:s("logs.filters.apiKeyHint"),className:S("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:[j,a.length>0&&e.jsx("span",{className:"ml-1 text-xs text-muted-foreground",children:a.join(", ")})]}),e.jsx("svg",{className:S("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&&p&&Xe.createPortal(e.jsxs("div",{ref:m,className:"fixed z-50 rounded-lg border bg-popover p-2 shadow-[var(--surface-shadow-lg)]",style:p,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:j}),e.jsx("button",{type:"button",onClick:()=>n([]),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(x=>{const N=x.isWildcard?s("apiKeys.wildcard"):x.name,h=t.includes(x.id);return e.jsxs("label",{className:S("flex cursor-pointer items-center gap-3 rounded-xl px-3 py-2 text-sm transition hover:bg-primary/5",h&&"bg-primary/10 text-primary"),children:[e.jsx("input",{type:"checkbox",className:"h-4 w-4 rounded border-border",checked:h,onChange:()=>f(x.id)}),e.jsx("span",{className:"truncate",children:N})]},x.id)}),l.length===0&&e.jsx("p",{className:"px-2 py-2 text-xs text-muted-foreground",children:s("logs.filters.apiKeyAll")})]})]}),document.body)]})}function Et(l){const{t}=P(),{total:n,activeFilters:r,filtersExpanded:d,setFiltersExpanded:s,handleResetFilters:o,activeQuickView:y,applyQuickView:p,providerFilter:b,setProviderFilter:v,endpointFilter:g,setEndpointFilter:m,selectedApiKeys:c,setSelectedApiKeys:a,modelFilter:j,setModelFilter:f,statusFilter:x,setStatusFilter:N,fromDate:h,setFromDate:E,toDate:k,setToDate:T,providerOptions:_,apiKeys:A,apiKeysLoading:ne,customEndpoints:J}=l;return e.jsx(_e,{"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(Le,{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(O,{variant:"secondary",className:"rounded-full px-2.5 py-0.5 text-[11px] font-semibold",children:t("logs.summary.total",{value:n.toLocaleString()})}),r.length>0&&e.jsx(O,{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(L,{variant:"ghost",size:"sm",onClick:o,className:"h-8 rounded-full px-3 text-xs",children:t("common.actions.reset")}),e.jsx(L,{variant:"ghost",size:"sm",onClick:()=>s(w=>!w),className:"h-8 rounded-full px-3 text-xs",children:d?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(w=>e.jsxs(O,{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:w.onRemove,onKeyDown:X=>{(X.key==="Enter"||X.key===" ")&&(X.preventDefault(),w.onRemove())},children:[w.label,e.jsx(et,{className:"h-3 w-3","aria-hidden":"true"})]},w.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:c.length.toString()}),e.jsx(ge,{label:t("logs.filters.provider"),value:b==="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(w=>e.jsx(L,{variant:"ghost",size:"sm",className:S("h-7 rounded-full px-3 text-[11px] font-semibold transition-colors",y===w?"bg-card text-foreground shadow-[0_12px_28px_-24px_rgba(15,23,42,0.32)]":"text-muted-foreground"),onClick:()=>p(w),children:t(`logs.quickViews.${w}`)},w))})]}),d&&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($,{children:t("logs.filters.provider")}),e.jsxs(te,{value:b,onValueChange:v,children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(K,{value:"all",children:t("logs.filters.providerAll")}),_.map(w=>e.jsx(K,{value:w.id,children:w.label??w.id},w.id))]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx($,{children:t("logs.filters.endpoint")}),e.jsxs(te,{value:g,onValueChange:m,children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(K,{value:"all",children:t("logs.filters.endpointAll")}),e.jsx(K,{value:"anthropic",children:t("logs.filters.endpointAnthropic")}),e.jsx(K,{value:"openai",children:t("logs.filters.endpointOpenAI")}),J==null?void 0:J.map(w=>e.jsx(K,{value:w.id,children:w.label||w.id},w.id))]})]})]}),e.jsx(Ct,{className:"md:col-span-2",apiKeys:A,selected:c,disabled:ne,onChange:a}),e.jsxs("div",{className:"space-y-2",children:[e.jsx($,{children:t("logs.filters.modelId")}),e.jsx(xe,{value:j,onChange:w=>f(w.target.value),placeholder:t("logs.filters.modelPlaceholder")})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx($,{children:t("logs.filters.status")}),e.jsxs(te,{value:x,onValueChange:w=>N(w),children:[e.jsx(se,{children:e.jsx(le,{})}),e.jsxs(ae,{children:[e.jsx(K,{value:"all",children:t("logs.filters.statusAll")}),e.jsx(K,{value:"success",children:t("logs.filters.statusSuccess")}),e.jsx(K,{value:"error",children:t("logs.filters.statusError")})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx($,{children:t("logs.filters.startDate")}),e.jsx(xe,{type:"date",value:h,onChange:w=>E(w.target.value)})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx($,{children:t("logs.filters.endDate")}),e.jsx(xe,{type:"date",value:k,onChange:w=>T(w.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 n=await ot.post("/api/logs/export",l,{responseType:"blob",timeout:t});return new Blob([n.data],{type:"application/zip"})}};function _t({apiKeyMap:l,logId:t,open:n,providerLabelMap:r}){var c;const{t:d}=P(),{pushToast:s}=fe(),o=W(U.logs.detail(t),he.detailRequest(t),{enabled:n&&t!==null,staleTime:3e4,gcTime:15e3,placeholderData:void 0});u.useEffect(()=>{!o.isError||!o.error||s({title:d("logs.detail.loadError"),description:o.error.message,variant:"error"})},[o.error,o.isError,s,d]);const y=u.useCallback(async(a,j,f)=>{if(!j){s({title:d("logs.detail.copy.empty",{label:a}),variant:"info"});return}try{await gt(j),s({title:d(f),variant:"success"})}catch(x){s({title:d("logs.detail.copy.failure"),description:x instanceof Error?x.message:d("logs.detail.copy.failureFallback"),variant:"error"})}},[s,d]),p=o.data,b=p?r.get(p.provider)??p.provider:"",v=p&&p.api_key_id!=null?l.get(p.api_key_id):void 0,g=p?ft(p,d):null,m=p?Re(p,d):null;return{apiKeyMeta:v,errorSourceMeta:g,errorMessage:o.isError?((c=o.error)==null?void 0:c.message)??null:null,handleCopy:y,isError:o.isError,isPending:o.isPending,providerLabel:b,refetch:o.refetch,record:p,statusMeta:m}}function Lt({open:l,logId:t,onClose:n,providerLabelMap:r,apiKeyMap:d}){var x,N;const{t:s}=P(),{apiKeyMeta:o,errorSourceMeta:y,errorMessage:p,handleCopy:b,isError:v,isPending:g,providerLabel:m,refetch:c,record:a,statusMeta:j}=_t({apiKeyMap:d,logId:t,open:l,providerLabelMap:r}),f=u.useMemo(()=>{var E,k,T,_;return a?[{key:"client-request",title:s("logs.detail.payload.clientRequest"),value:((E=a.payload)==null?void 0:E.client_request)??null,emptyLabel:s("logs.detail.payload.emptyRequest"),copyToast:"logs.detail.copy.requestSuccess"},...(k=a.payload)!=null&&k.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"}]:[],...(T=a.payload)!=null&&T.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:((_=a.payload)==null?void 0:_.client_response)??null,emptyLabel:s("logs.detail.payload.emptyResponse"),copyToast:"logs.detail.copy.responseSuccess"}].map(A=>({...A,display:ht(A.value,A.emptyLabel)})):[]},[a,s]);return e.jsx(it,{open:l,onOpenChange:h=>{h||n()},children:e.jsxs(dt,{className:"w-[min(96vw,1200px)] max-w-[1200px]",children:[e.jsxs(ct,{className:"pr-14",children:[e.jsx(ut,{children:s("logs.detail.title")}),e.jsx(mt,{children:a?s("logs.detail.id",{id:a.id}):s("logs.detail.loadError")})]}),e.jsx(pt,{className:"max-h-[78vh]",children:g?e.jsx(xt,{compact:!0,className:"min-h-[240px]",label:s("common.loading")}):v?e.jsx(re,{compact:!0,className:"min-h-[240px]",tone:"danger",title:s("logs.detail.loadError"),description:p??s("common.unknownError"),action:e.jsx(L,{variant:"outline",onClick:()=>void c(),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(O,{variant:j==null?void 0:j.variant,children:(j==null?void 0:j.label)??"-"}),e.jsx(O,{variant:"outline",children:a.stream?s("logs.stream.streaming"):s("logs.stream.single")})]})]}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-5",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:(j==null?void 0:j.label)??"-"}),e.jsx(z,{label:s("logs.detail.info.errorSource"),value:(y==null?void 0:y.label)??"-"})]}),e.jsxs("dl",{className:"grid gap-x-4 gap-y-3 md:grid-cols-2 xl:grid-cols-4",children:[e.jsx(F,{label:s("logs.detail.info.time"),value:De(a.timestamp)}),e.jsx(F,{label:s("logs.detail.info.sessionId"),value:a.session_id??"-"}),e.jsx(F,{label:s("logs.detail.info.endpoint"),value:a.endpoint||"-"}),e.jsx(F,{label:s("logs.detail.info.provider"),value:m}),e.jsx(F,{label:s("logs.detail.info.requestedModel"),value:a.client_model??s("logs.detail.info.noRequestedModel")}),e.jsx(F,{label:s("logs.detail.info.model"),value:a.model}),e.jsx(F,{label:s("logs.detail.info.stream"),value:yt(a.stream)}),e.jsx(F,{label:s("logs.detail.info.status"),value:(j==null?void 0:j.label)??"-"}),e.jsx(F,{label:s("logs.detail.info.errorSource"),value:(y==null?void 0:y.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:I(a.input_tokens)}),e.jsx(z,{label:s("logs.detail.info.cacheReadTokens"),value:I(a.cache_read_tokens)}),e.jsx(z,{label:s("logs.detail.info.cacheCreationTokens"),value:I(a.cache_creation_tokens)}),e.jsx(z,{label:s("logs.detail.info.outputTokens"),value:I(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(F,{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(F,{label:s("logs.detail.apiKey.identifier"),value:a.api_key_id??s("common.noData")}),e.jsx(F,{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(F,{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:(x=a.payload)!=null&&x.upstream_request||(N=a.payload)!=null&&N.upstream_response?s("logs.detail.payload.helperWithUpstream"):s("logs.detail.payload.helperClientOnly")})]}),e.jsx("div",{className:"grid gap-4 xl:grid-cols-2",children:f.map(h=>e.jsx(Rt,{title:h.title,display:h.display,onCopy:()=>b(h.title,h.value,h.copyToast),t:s},h.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 F({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 Rt({display:l,onCopy:t,title:n,t:r}){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:n}),e.jsx(L,{variant:"outline",size:"sm",onClick:t,children:r("common.actions.copy")})]}),l.isTruncated?e.jsx("p",{className:"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-900 dark:border-amber-900/50 dark:bg-amber-950/30 dark:text-amber-200",children:r("logs.detail.payload.truncated",{shown:l.displayedLength.toLocaleString(),total:l.originalLength.toLocaleString()})}):null,e.jsx("pre",{className:"max-h-72 overflow-auto whitespace-pre rounded-lg border bg-secondary p-3 text-xs",children:l.text})]})}const G=[20,50,100],H=["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 H;try{const l=window.localStorage.getItem(R.logs.visibleColumns);if(!l)return H;const t=JSON.parse(l);if(!Array.isArray(t))return H;const n=t.filter(r=>oe.includes(r));return n.length>0?n:H}catch{return H}}function Ft(){return typeof window>"u"?"comfortable":window.localStorage.getItem(R.logs.density)==="compact"?"compact":"comfortable"}function Tt(){if(typeof window>"u")return G[0];const l=window.localStorage.getItem(R.logs.pageSize),t=Number(l);return G.includes(t)?t:G[0]}function Mt(){if(typeof window>"u")return[];try{const l=window.localStorage.getItem(R.logs.selectedApiKeys);if(!l)return[];const t=JSON.parse(l);return Array.isArray(t)?t.map(n=>Number(n)).filter(n=>Number.isInteger(n)&&n>0):[]}catch{return[]}}function Ee(l,t=!1){if(!l)return;const n=t?`${l}T23:59:59.999`:`${l}T00:00:00.000`,r=Date.parse(n);return Number.isFinite(r)?r:void 0}function Kt(l,t,n){return l===n&&t===n}function Pt({columnOptions:l,exporting:t,onExport:n,onRefresh:r,onResetColumns:d,onSetDensity:s,onToggleColumn:o,refreshing:y,rowDensity:p,total:b,visibleColumns:v,visibleColumnSet:g}){const{t:m}=P(),c=JSON.stringify(v)===JSON.stringify(H);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:S("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",p==="comfortable"?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:m("logs.table.density.comfortable")}),e.jsx("button",{type:"button",onClick:()=>s("compact"),className:S("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",p==="compact"?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:m("logs.table.density.compact")})]}),e.jsxs(jt,{children:[e.jsx(vt,{asChild:!0,children:e.jsx(L,{variant:"outline",size:"sm",className:"w-full sm:w-auto",children:m("logs.actions.columns")})}),e.jsxs(wt,{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:m("logs.actions.columns")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:m("logs.actions.visibleCount",{count:v.length})})]}),e.jsx(L,{variant:"ghost",size:"sm",onClick:d,disabled:c,children:m("common.actions.reset")})]}),e.jsx("div",{className:"grid gap-1.5",children:l.map(a=>{const j=g.has(a.id);return e.jsxs("label",{className:S("flex cursor-pointer items-center gap-3 rounded-xl px-3 py-2 text-sm transition hover:bg-accent",j&&"bg-primary/10 text-primary"),children:[e.jsx("input",{type:"checkbox",checked:j,onChange:()=>o(a.id),className:"h-4 w-4 rounded border-border"}),e.jsx("span",{children:a.label})]},a.id)})})]})]}),e.jsxs(L,{onClick:n,disabled:t,className:"w-full sm:w-auto",children:[e.jsx(tt,{className:"mr-2 h-4 w-4"}),m(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:m("logs.summary.total",{value:b.toLocaleString()})}),e.jsxs(L,{variant:"outline",size:"sm",onClick:r,disabled:y,className:"shrink-0",children:[e.jsx(st,{className:S("mr-2 h-4 w-4",y&&"animate-spin")}),m(y?"common.actions.refreshing":"logs.actions.manualRefresh")]})]})]})}function At({record:l,providerLabelMap:t,apiKeyMap:n,onSelect:r,isEven:d,density:s,visibleColumnSet:o}){const{t:y}=P(),p=t.get(l.provider)??l.provider,b=l.endpoint||"-",v=Re(l,y),g=l.client_model??y("logs.table.requestedModelFallback"),m=l.api_key_id!=null?n.get(l.api_key_id):void 0,c=l.api_key_id==null?y("logs.table.apiKeyUnknown"):m!=null&&m.isWildcard?y("apiKeys.wildcard"):m!=null&&m.name?m.name:l.api_key_name?l.api_key_name:y("logs.table.apiKeyUnknown"),a=s==="compact"?"px-3 py-1.5":"px-3 py-2",j=d?"bg-muted/30":"bg-background",f=bt(l.session_id),x=f==null?void 0:f.rowStyle,N=f==null?void 0:f.stickyStyle,h=f?{...f.stickyStyle,...f.accentStyle}:void 0;return e.jsxs("tr",{"data-session-id":f==null?void 0:f.sessionId,"data-session-color":f==null?void 0:f.colorKey,className:S("transition-colors",f?"":d?"bg-muted/30":"",f?"":"hover:bg-muted/50"),style:x,onMouseEnter:E=>{f&&Object.assign(E.currentTarget.style,f.hoverStyle)},onMouseLeave:E=>{f&&Object.assign(E.currentTarget.style,f.rowStyle)},children:[e.jsx("td",{className:S("sticky left-0 z-10 text-xs",a,f?"":j),style:h,children:De(l.timestamp)}),o.has("endpoint")&&e.jsx("td",{className:S(a,"text-xs"),children:b}),o.has("provider")&&e.jsx("td",{className:S(a,"text-xs"),children:e.jsx("div",{className:"max-w-[100px] truncate",title:p,children:p})}),o.has("requestedModel")&&e.jsx("td",{className:S(a,"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:S(a,"text-xs"),children:e.jsx("div",{className:"max-w-[120px] truncate",title:l.model,children:l.model})}),o.has("apiKey")&&e.jsx("td",{className:S(a,"text-xs text-muted-foreground"),children:e.jsx("div",{className:"max-w-[90px] truncate",title:c,children:c})}),o.has("inputTokens")&&e.jsx("td",{className:S(a,"text-right text-xs tabular-nums"),children:I(l.input_tokens)}),o.has("cacheReadTokens")&&e.jsx("td",{className:S(a,"text-right text-xs tabular-nums"),children:I(l.cache_read_tokens)}),o.has("cacheCreationTokens")&&e.jsx("td",{className:S(a,"text-right text-xs tabular-nums"),children:I(l.cache_creation_tokens)}),o.has("outputTokens")&&e.jsx("td",{className:S(a,"text-right text-xs tabular-nums"),children:I(l.output_tokens)}),o.has("latency")&&e.jsx("td",{className:S(a,"text-right text-xs tabular-nums"),children:Q(l.latency_ms,"ms")}),o.has("ttft")&&e.jsx("td",{className:S(a,"text-right text-xs tabular-nums"),children:Q(l.ttft_ms,"ms")}),o.has("tpot")&&e.jsx("td",{className:S(a,"text-right text-xs tabular-nums"),children:Q(l.tpot_ms,"ms/tk")}),o.has("status")&&e.jsx("td",{className:S(a,"text-center"),children:e.jsx(O,{variant:v.variant,className:"text-xs",children:v.label})}),o.has("error")&&e.jsx("td",{className:S(a,"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:S("sticky right-0 z-10 text-center",a,f?"":j),style:N,children:e.jsx(L,{variant:"outline",size:"sm",onClick:()=>r(l.id),children:y("logs.actions.detail")})})]})}function zt(l){const{t}=P(),{tableScrollRef:n,visibleColumnSet:r,visibleColumnCount:d,logsError:s,logsPending:o,items:y,activeFiltersCount:p,handleResetFilters:b,handleRetry:v,providerLabelMap:g,apiKeyMap:m,handleOpenDetail:c,rowDensity:a,showScrollHint:j,pageSize:f,setPageSize:x,page:N,totalPages:h,setPage:E}=l;return e.jsx(_e,{className:"overflow-hidden bg-card shadow-[var(--surface-shadow)]",children:e.jsxs(Le,{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:d-2})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(O,{variant:"secondary",children:"Wide Table"}),e.jsx(O,{variant:"outline",className:"bg-background",children:t(a==="compact"?"logs.table.density.compact":"logs.table.density.comfortable")}),j?e.jsx(O,{variant:"warning",children:"Scroll for more"}):null]})]}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{ref:n,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((k,T)=>e.jsx(kt,{columns:d},T)):s&&y.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:d,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(L,{variant:"outline",size:"sm",onClick:v,children:t("common.actions.refresh")}),p>0?e.jsx(L,{variant:"ghost",size:"sm",onClick:b,children:t("common.actions.reset")}):null]})})})}):y.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:d,className:"px-3 py-8 text-center text-sm text-muted-foreground",children:e.jsx(re,{compact:!0,tone:"primary",icon:e.jsx(at,{className:"h-5 w-5","aria-hidden":"true"}),title:p>0?t("logs.empty.filteredTitle"):t("logs.empty.title"),description:p>0?t("logs.empty.filteredSubtitle"):t("logs.empty.subtitle"),action:e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[p>0?e.jsx(L,{variant:"outline",size:"sm",onClick:b,children:t("logs.empty.actions.reset")}):null,e.jsx(L,{asChild:!0,variant:"ghost",size:"sm",children:e.jsx(Nt,{to:"/api-keys",children:t("logs.empty.actions.apiKeys")})})]})})})}):y.map((k,T)=>e.jsx(At,{record:k,providerLabelMap:g,apiKeyMap:m,onSelect:c,isEven:T%2===0,density:a,visibleColumnSet:r},k.id))})]})}),j&&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:f.toString(),onValueChange:k=>x(Number(k)),children:[e.jsx(se,{className:"h-8 w-[80px] bg-background",children:e.jsx(le,{})}),e.jsx(ae,{children:G.map(k=>e.jsx(K,{value:k.toString(),children:k},k))})]})]}),e.jsxs("div",{className:"flex items-center gap-2 rounded-full bg-secondary px-2 py-2",children:[e.jsx(L,{variant:"outline",size:"sm",onClick:()=>E(k=>Math.max(k-1,1)),disabled:N<=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:h===0?0:N,total:h})}),e.jsx(L,{variant:"outline",size:"sm",onClick:()=>E(k=>h===0?k:Math.min(k+1,h)),disabled:h===0||N>=h,children:t("logs.table.pagination.next")})]})]})]})})}function Ot({exportTimeoutMs:l,queryParams:t,total:n}){const{t:r}=P(),{pushToast:d}=fe(),[s,o]=u.useState(!1),y=u.useCallback(async()=>{if(!s){o(!0);try{const p=n>0?Math.min(n,5e3):1e3,b={...t,limit:p,offset:0},v=await he.exportArchive(b,l),g=new Date().toISOString().replace(/[:.]/g,"-"),m=URL.createObjectURL(v),c=document.createElement("a");c.href=m,c.download=`cc-gw-logs-${g}.zip`,document.body.appendChild(c),c.click(),c.remove(),URL.revokeObjectURL(m),d({title:r("logs.toast.exportSuccess.title"),description:r("logs.toast.exportSuccess.desc"),variant:"success"})}catch(p){const b=nt(p);d({title:r("logs.toast.exportError.title"),description:r("logs.toast.exportError.desc",{message:b.message}),variant:"error"})}finally{o(!1)}}},[l,s,d,t,r,n]);return{exporting:s,handleExport:y}}function qt(){const l=u.useRef(null),[t,n]=u.useState(!1),r=u.useCallback(()=>{const d=l.current;if(!d)return;const s=d.scrollWidth-d.scrollLeft-d.clientWidth>1;n(s)},[]);return u.useEffect(()=>{const d=l.current;if(!d)return;r(),d.addEventListener("scroll",r,{passive:!0});const s=new ResizeObserver(r);return s.observe(d),()=>{d.removeEventListener("scroll",r),s.disconnect()}},[r]),{scrollRef:l,showScrollHint:t,updateScrollHint:r}}function Qt(){const[l,t]=M(R.logs.density,Ft,{serialize:v=>v,deserialize:v=>v==="compact"?"compact":"comfortable"}),[n,r]=M(R.logs.visibleColumns,Dt),{scrollRef:d,showScrollHint:s}=qt(),o=u.useMemo(()=>new Set(n),[n]),y=n.length+2,p=u.useCallback(v=>{r(g=>{if(g.includes(v))return g.length===1?g:g.filter(c=>c!==v);const m=[...g,v];return m.sort((c,a)=>oe.indexOf(c)-oe.indexOf(a)),m})},[]);return{resetVisibleColumns:u.useCallback(()=>{r(H)},[]),rowDensity:l,setRowDensity:t,showScrollHint:s,tableScrollRef:d,toggleColumn:p,visibleColumnCount:y,visibleColumns:n,visibleColumnSet:o}}function It(){var ve,we,Ne,ke,Se;const{t:l}=P(),{pushToast:t}=fe(),n=St(),[r,d]=M(R.logs.providerFilter,"all"),[s,o]=M(R.logs.endpointFilter,"all"),[y,p]=M(R.logs.modelFilter,""),[b,v]=M(R.logs.statusFilter,"all"),[g,m]=M(R.logs.fromDate,""),[c,a]=M(R.logs.toDate,""),[j,f]=u.useState(1),[x,N]=M(R.logs.pageSize,Tt,{serialize:i=>String(i),deserialize:i=>{const C=Number(i);return G.includes(C)?C:G[0]}}),[h,E]=u.useState(null),[k,T]=u.useState(!1),[_,A]=M(R.logs.selectedApiKeys,Mt),[ne,J]=M(R.logs.filtersExpanded,!1),{resetVisibleColumns:w,rowDensity:X,setRowDensity:Fe,showScrollHint:Te,tableScrollRef:Me,toggleColumn:Ke,visibleColumnCount:Pe,visibleColumns:Ae,visibleColumnSet:ze}=Qt(),Oe=u.useDeferredValue(y),D=y===""?"":Oe;u.useEffect(()=>{f(1)},[r,s,D,b,g,c,x,_]);const ie=u.useMemo(()=>{const i={limit:x,offset:(j-1)*x};r!=="all"&&(i.provider=r),s!=="all"&&(i.endpoint=s),D.trim().length>0&&(i.model=D.trim()),b!=="all"&&(i.status=b);const C=Ee(g),V=Ee(c,!0);return C!==void 0&&(i.from=C),V!==void 0&&(i.to=V),_.length>0&&(i.apiKeys=_.join(",")),i},[D,s,g,j,x,r,_,b,c]),q=W(U.logs.list(ie),he.listRequest(ie),{gcTime:6e4}),B=W(U.providers.all(),Ce.providersRequest()),ye=W(U.apiKeys.all(),{url:"/api/keys",method:"GET"}),de=W(U.customEndpoints.all(),{url:"/api/custom-endpoints",method:"GET"}),be=W(U.config.exportTimeout(),Ce.configRequest());u.useEffect(()=>{!q.isError||!q.error||t({title:l("logs.toast.listError.title"),description:l("logs.toast.listError.desc",{message:q.error.message}),variant:"error"})},[q.error,q.isError,t,l]),u.useEffect(()=>{!B.isError||!B.error||t({title:l("logs.toast.providerError.title"),description:l("logs.toast.providerError.desc",{message:B.error.message}),variant:"error"})},[B.error,B.isError,t,l]);const ee=((ve=q.data)==null?void 0:ve.total)??0,Z=ee>0?Math.ceil(ee/x):0,qe=((we=q.data)==null?void 0:we.items)??[],Qe=u.useMemo(()=>{var C;const i=(C=be.data)==null?void 0:C.logExportTimeoutSeconds;return typeof i=="number"&&Number.isFinite(i)?Math.min(Math.max(Math.round(i),5),600)*1e3:6e4},[(Ne=be.data)==null?void 0:Ne.logExportTimeoutSeconds]);u.useEffect(()=>{Z>0&&j>Z&&f(Z)},[j,Z]);const ce=B.data??[],ue=u.useMemo(()=>{const i=new Map;for(const C of ce)C.id&&i.set(C.id,C.label??C.id);return i},[ce]),je=u.useMemo(()=>{var C;const i=new Map;i.set("anthropic",l("logs.filters.endpointAnthropic")),i.set("openai",l("logs.filters.endpointOpenAI"));for(const V of((C=de.data)==null?void 0:C.endpoints)??[])i.set(V.id,V.label||V.id);return i},[(ke=de.data)==null?void 0:ke.endpoints,l]),Ie=u.useMemo(()=>{const i=[];if(r!=="all"){const C=ue.get(r)??r;i.push({key:"provider",label:`${l("logs.filters.provider")}: ${C}`,onRemove:()=>d("all")})}if(s!=="all"){const C=je.get(s)??s;i.push({key:"endpoint",label:`${l("logs.filters.endpoint")}: ${C}`,onRemove:()=>o("all")})}if(D.trim()&&i.push({key:"model",label:`${l("logs.filters.modelId")}: ${D.trim()}`,onRemove:()=>p("")}),b!=="all"){const C=l(b==="success"?"logs.filters.statusSuccess":"logs.filters.statusError");i.push({key:"status",label:`${l("logs.filters.status")}: ${C}`,onRemove:()=>v("all")})}return g&&i.push({key:"from",label:`${l("logs.filters.startDate")}: ${g}`,onRemove:()=>m("")}),c&&i.push({key:"to",label:`${l("logs.filters.endDate")}: ${c}`,onRemove:()=>a("")}),_.length>0&&i.push({key:"apiKeys",label:l("logs.filters.apiKeySelected",{count:_.length}),onRemove:()=>A([])}),i},[D,s,je,g,r,ue,_.length,b,l,c]),me=ye.data??[],Ve=u.useMemo(()=>{const i=new Map;for(const C of me)i.set(C.id,C);return i},[me]),Ue=u.useMemo(()=>oe.map(i=>({id:i,label:l(`logs.table.columns.${i}`)})),[l]),Y=u.useMemo(()=>new Date().toISOString().slice(0,10),[]),$e=u.useMemo(()=>r==="all"&&s==="all"&&D.trim()===""&&b==="all"&&g===""&&c===""&&_.length===0?"all":b==="error"&&s==="all"&&r==="all"&&D.trim()===""&&g===""&&c===""&&_.length===0?"errors":Kt(g,c,Y)&&s==="all"&&r==="all"&&D.trim()===""&&b==="all"&&_.length===0?"today":s==="anthropic"&&r==="all"&&D.trim()===""&&b==="all"&&g===""&&c===""&&_.length===0?"anthropic":s==="openai"&&r==="all"&&D.trim()===""&&b==="all"&&g===""&&c===""&&_.length===0?"openai":null,[D,s,g,r,_.length,b,c,Y]),pe=u.useCallback(()=>{d("all"),p(""),o("all"),v("all"),m(""),a(""),A([])},[]),He=u.useCallback(i=>{if(f(1),pe(),i!=="all"){if(i==="errors"){v("error");return}if(i==="today"){m(Y),a(Y);return}if(i==="anthropic"){o("anthropic");return}i==="openai"&&o("openai")}},[pe,Y]),{exporting:Be,handleExport:We}=Ot({exportTimeoutMs:Qe,queryParams:ie,total:ee}),Ge=u.useCallback(i=>{n.removeQueries({queryKey:["logs","detail"],type:"inactive"}),E(i),T(!0)},[n]),Je=u.useCallback(()=>{T(!1)},[]);return u.useEffect(()=>{k||h===null||(n.removeQueries({queryKey:U.logs.detail(h),exact:!0}),E(null))},[k,n,h]),{activeFilters:Ie,activeQuickView:$e,apiKeyMap:Ve,apiKeys:me,apiKeysQuery:ye,applyQuickView:He,columnOptions:Ue,customEndpoints:(Se=de.data)==null?void 0:Se.endpoints,endpointFilter:s,exporting:Be,filtersExpanded:ne,fromDate:g,handleCloseDetail:Je,handleExport:We,handleOpenDetail:Ge,handleResetFilters:pe,isDetailOpen:k,items:qe,logsQuery:q,modelFilter:y,page:j,pageSize:x,providerFilter:r,providerLabelMap:ue,providerOptions:ce,rowDensity:X,resetVisibleColumns:w,selectedApiKeys:_,selectedLogId:h,setEndpointFilter:o,setFiltersExpanded:J,setFromDate:m,setModelFilter:p,setPage:f,setPageSize:N,setProviderFilter:d,setRowDensity:Fe,setSelectedApiKeys:A,setStatusFilter:v,setToDate:a,showScrollHint:Te,statusFilter:b,tableScrollRef:Me,toDate:c,toggleColumn:Ke,total:ee,totalPages:Z,visibleColumnCount:Pe,visibleColumns:Ae,visibleColumnSet:ze}}function cs(){var n;const{t:l}=P(),t=It();return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(rt,{info:t.total>0?e.jsx("span",{className:"rounded-full bg-secondary px-2.5 py-1 text-xs text-muted-foreground",children:l("logs.summary.total",{value:t.total.toLocaleString()})}):null,actions:e.jsx(Pt,{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(Et,{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(zt,{tableScrollRef:t.tableScrollRef,visibleColumnSet:t.visibleColumnSet,visibleColumnCount:t.visibleColumnCount,logsError:t.logsQuery.isError?((n=t.logsQuery.error)==null?void 0:n.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(Lt,{open:t.isDetailOpen,logId:t.selectedLogId,onClose:t.handleCloseDetail,providerLabelMap:t.providerLabelMap,apiKeyMap:t.apiKeyMap})]})}export{cs as default};
|