@chenpu17/cc-gw 0.8.15 → 0.8.16
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-BFdKK7FR.js +1 -0
- package/src/web/dist/assets/ApiKeys-C7GJd1XE.js +1 -0
- package/src/web/dist/assets/{ConfirmDialog-BHfhtrze.js → ConfirmDialog-D7vLTReM.js} +1 -1
- package/src/web/dist/assets/Dashboard-BZ61IQTq.js +1 -0
- package/src/web/dist/assets/{DialogShell-BpzUpswv.js → DialogShell-BWia_d99.js} +1 -1
- package/src/web/dist/assets/Events-CM2Ddnk5.js +1 -0
- package/src/web/dist/assets/Help-DndY95PX.js +4 -0
- package/src/web/dist/assets/{Login-CJwzn0Sh.js → Login-CCMGFORE.js} +1 -1
- package/src/web/dist/assets/Logs-W9L1HmeW.js +1 -0
- package/src/web/dist/assets/ModelManagement-Dx1W3OOm.js +1 -0
- package/src/web/dist/assets/{PageSection-Mw-tAM8I.js → PageSection-DVs3faWw.js} +1 -1
- package/src/web/dist/assets/{PageState-Bb3fEov-.js → PageState-Dvjip2P-.js} +1 -1
- package/src/web/dist/assets/PageToolbar-BxRZF-QJ.js +1 -0
- package/src/web/dist/assets/Profiler-DAhd7InO.js +1 -0
- package/src/web/dist/assets/RoutingManagement-DTi8Xa_u.js +1 -0
- package/src/web/dist/assets/Settings-CjF3nCh7.js +1 -0
- package/src/web/dist/assets/{Skeleton-DEv_MFPR.js → Skeleton-DHQ8ApGX.js} +1 -1
- package/src/web/dist/assets/app-DkubSF6m.js +61 -0
- package/src/web/dist/assets/{card-BE_b5SvI.js → card-Bx5Pg_wP.js} +1 -1
- package/src/web/dist/assets/{charts-core-DzWzxST6.js → charts-core-CK8TVJro.js} +1 -1
- package/src/web/dist/assets/{charts-engine-Ds7lwC51.js → charts-engine-CWjgwbj5.js} +1 -1
- package/src/web/dist/assets/{charts-react-D0nWbUCA.js → charts-react-CmmN-08P.js} +1 -1
- package/src/web/dist/assets/{gateway-Zpcl3bpd.js → gateway-DOu5TM82.js} +1 -1
- package/src/web/dist/assets/global-CMwh_4v7.css +1 -0
- package/src/web/dist/assets/{global-xoXYOIOz.js → global-D8DuA4wF.js} +1 -1
- package/src/web/dist/assets/{i18n-Bl2BcCDG.js → i18n-C8tBby0x.js} +1 -1
- package/src/web/dist/assets/{input-Brr3avKW.js → input-b5NRkUKN.js} +1 -1
- package/src/web/dist/assets/{label-Bc4vkpLF.js → label-DUoPO5Jo.js} +1 -1
- package/src/web/dist/assets/{landing-D9E0GJD9.js → landing-BDpFbgJX.js} +1 -1
- package/src/web/dist/assets/package-C-Cj5JIX.js +1 -0
- package/src/web/dist/assets/{popover-D8l2FwYm.js → popover-BAGiqp11.js} +1 -1
- package/src/web/dist/assets/{query-BbGWgOFk.js → query-QCek5MsK.js} +1 -1
- package/src/web/dist/assets/{queryKeys-DifG1fTh.js → queryKeys-BpeJfcg0.js} +1 -1
- package/src/web/dist/assets/{radix-mHySgtou.js → radix-CtQBp6Ie.js} +1 -1
- package/src/web/dist/assets/{router-CL3rf_uf.js → router-D2Fb4U0L.js} +1 -1
- package/src/web/dist/assets/{select-zM5TPRdZ.js → select-B5oPLG9G.js} +1 -1
- package/src/web/dist/assets/{switch-fb9u33D-.js → switch-BDc99Vsq.js} +1 -1
- package/src/web/dist/assets/{table-BpLpq7tJ.js → table-BG-JeOj-.js} +1 -1
- package/src/web/dist/assets/{useApiQuery-DCgUtGKI.js → useApiQuery-4gJC8RZB.js} +1 -1
- package/src/web/dist/assets/{useAppMutation-BjZN2gaQ.js → useAppMutation-CYWYOsqL.js} +1 -1
- package/src/web/dist/assets/{useModelManagementState-1NXqPQ5M.js → useModelManagementState-Vvv4fzeh.js} +1 -1
- package/src/web/dist/assets/{vendor-z22RpOY0.js → vendor-DdPBfMMb.js} +67 -82
- package/src/web/dist/index.html +8 -8
- package/src/web/dist/landing.html +5 -5
- package/src/web/dist/assets/About-BGBg2q_J.js +0 -1
- package/src/web/dist/assets/ApiKeys-DUuKvZ5b.js +0 -1
- package/src/web/dist/assets/Dashboard-DZdfzGEK.js +0 -1
- package/src/web/dist/assets/Events-9Yq8nG75.js +0 -1
- package/src/web/dist/assets/Help-qSGvYIjs.js +0 -5
- package/src/web/dist/assets/Logs--D9Xm5KV.js +0 -1
- package/src/web/dist/assets/ModelManagement-zi8mFqEf.js +0 -1
- package/src/web/dist/assets/PageHeader-DLI9m-gU.js +0 -1
- package/src/web/dist/assets/Profiler-D6Akb9_x.js +0 -1
- package/src/web/dist/assets/RoutingManagement-CeIC-QD2.js +0 -1
- package/src/web/dist/assets/Settings-G5Pswxtq.js +0 -1
- package/src/web/dist/assets/app-CfipX5HX.js +0 -61
- package/src/web/dist/assets/global-D8jT4xUX.css +0 -1
- package/src/web/dist/assets/package-GpB9DOR2.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as m}from"./vendor-z22RpOY0.js";import{u as Nt,a as Ut}from"./query-BbGWgOFk.js";import{g as K,b as H,u as Vt,t as G,c as ie}from"./app-CfipX5HX.js";import{g as I}from"./gateway-Zpcl3bpd.js";import{q as U}from"./queryKeys-DifG1fTh.js";import{u as Ie}from"./useAppMutation-BjZN2gaQ.js";import{u as Qt}from"./useApiQuery-DCgUtGKI.js";import{u as zt}from"./i18n-Bl2BcCDG.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-DkubSF6m.js";import{g as I}from"./gateway-DOu5TM82.js";import{q as U}from"./queryKeys-BpeJfcg0.js";import{u as Ie}from"./useAppMutation-CYWYOsqL.js";import{u as Qt}from"./useApiQuery-4gJC8RZB.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};
|