@undefineds.co/xpod 0.4.10 → 0.4.11
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/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js +0 -3
- package/dist/api/auth/index.d.ts +1 -0
- package/dist/api/auth/index.js +1 -1
- package/dist/identity/drizzle/AccountRoleRepository.d.ts +30 -2
- package/dist/identity/drizzle/AccountRoleRepository.js +163 -15
- package/dist/identity/drizzle/PodLookupRepository.d.ts +58 -4
- package/dist/identity/drizzle/PodLookupRepository.js +248 -105
- package/dist/identity/drizzle/db.d.ts +19 -0
- package/dist/identity/drizzle/db.js +39 -4
- package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +0 -1
- package/node_modules/@undefineds.co/shared-ui/dist/index.js +0 -1
- package/package.json +2 -2
- package/static/app/assets/main.css +1 -1
- package/static/app/assets/main.js +12 -13
- package/static/auth-callback/assets/{AiConfigContext-C81deMM9.js → AiConfigContext-DqWRSm7n.js} +1 -1
- package/static/auth-callback/assets/{AiConfigPage-evWI8T56.js → AiConfigPage-C5YYyvzl.js} +1 -1
- package/static/auth-callback/assets/{DocumentProcessingPanel-B9GrDEMe.js → DocumentProcessingPanel-DZCiacBz.js} +1 -1
- package/static/auth-callback/assets/{IndexLifecyclePanel-qCo8ABQZ.js → IndexLifecyclePanel-CCLeOljB.js} +1 -1
- package/static/auth-callback/assets/{IndexSubjectPanel-C4YG0whI.js → IndexSubjectPanel-BbUqop4b.js} +1 -1
- package/static/auth-callback/assets/{ModelAssignmentsPanel-DG7Lxh3t.js → ModelAssignmentsPanel-jUUTDKuh.js} +1 -1
- package/static/auth-callback/assets/{ModelsPage-CgEuqE6p.js → ModelsPage-B08zdtff.js} +4 -4
- package/static/auth-callback/assets/{NetworkPage-Cbdn_P1e.js → NetworkPage-Vp2PrMxs.js} +1 -1
- package/static/auth-callback/assets/{PaneListHeader-jy70Q00L.js → PaneListHeader-DY7baSFl.js} +1 -1
- package/static/auth-callback/assets/{SearchIndexingPanel-ByU3u7kp.js → SearchIndexingPanel-D4YRg1-8.js} +1 -1
- package/static/auth-callback/assets/{StatusSubjectPanel-hfjoB5aS.js → StatusSubjectPanel-ArIS-TxT.js} +1 -1
- package/static/auth-callback/assets/{StatusWorkspace-BZd617sV.js → StatusWorkspace-Cp5LQ9Yx.js} +1 -1
- package/static/auth-callback/assets/SystemSettingsPage-BDvT1NUz.js +1 -0
- package/static/auth-callback/assets/SystemSettingsSubjectPanel-CDqRuC4t.js +33 -0
- package/static/auth-callback/assets/{activity-BcsZZxxw.js → activity-D1Dsfa_0.js} +1 -1
- package/static/auth-callback/assets/admin-C6qCRFiY.js +1 -0
- package/static/auth-callback/assets/{auth-callback-atKg_oig.js → auth-callback-Cmf4hXVZ.js} +80 -84
- package/static/auth-callback/assets/auth-callback-DWMMiFjh.css +1 -0
- package/static/auth-callback/assets/{badge-BWbRHThQ.js → badge-CZsHq3Ih.js} +1 -1
- package/static/auth-callback/assets/{download-BmvG1Vya.js → download-DU9ntlHw.js} +1 -1
- package/static/auth-callback/assets/{external-link-DZ34d3g3.js → external-link-BfzaaZDx.js} +1 -1
- package/static/auth-callback/assets/{index-BpV1hsqs.js → index-DSNnLUbU.js} +4 -4
- package/static/auth-callback/assets/{index-D9oE6FXK.js → index-FHhHoKgp.js} +1 -1
- package/static/auth-callback/assets/{index-browser-B9Z7GU-T.js → index-browser-BNFqqC74.js} +1 -1
- package/static/auth-callback/assets/{key-round-tjP76Se-.js → key-round-BwP3DBWo.js} +1 -1
- package/static/auth-callback/assets/{rotate-ccw-C_L5ZLx1.js → rotate-ccw-VMwnmyab.js} +1 -1
- package/static/auth-callback/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/auth-callback/assets/{skeleton-C7tGDQIs.js → skeleton-CoD55rBT.js} +1 -1
- package/static/auth-callback/assets/{waypoints-VMNQlWdU.js → waypoints-DRo_1Ca7.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-SAp6BtYK.js → workspace-layout--mcXl3My.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/{AiConfigContext-De-OtAWo.js → AiConfigContext-BpPDKSzI.js} +1 -1
- package/static/dashboard/assets/{AiConfigPage-macP4Mop.js → AiConfigPage-wsqEZDIX.js} +1 -1
- package/static/dashboard/assets/{DocumentProcessingPanel-C5ObvCCl.js → DocumentProcessingPanel-CDSy3juc.js} +1 -1
- package/static/dashboard/assets/{IndexLifecyclePanel-xVNa2l40.js → IndexLifecyclePanel-CVd6vQCX.js} +1 -1
- package/static/dashboard/assets/{IndexSubjectPanel-DQFPP6-p.js → IndexSubjectPanel-B2cXwl8X.js} +1 -1
- package/static/dashboard/assets/{ModelAssignmentsPanel-DMOATFpQ.js → ModelAssignmentsPanel-BeBZhnQd.js} +1 -1
- package/static/dashboard/assets/{ModelsPage-91UbnETA.js → ModelsPage-B6McSCJw.js} +1 -1
- package/static/dashboard/assets/{NetworkPage-CHQ3YxIB.js → NetworkPage-DV2V0qWO.js} +1 -1
- package/static/dashboard/assets/{PaneListHeader-DsXemAdR.js → PaneListHeader-D0c1yCFH.js} +1 -1
- package/static/dashboard/assets/{SearchIndexingPanel-Dh70PNFZ.js → SearchIndexingPanel-CGs0OZ12.js} +1 -1
- package/static/dashboard/assets/{StatusSubjectPanel-D3PGEYT4.js → StatusSubjectPanel-oPSECj7i.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-BcpePYUW.js → StatusWorkspace-PdovQPKa.js} +1 -1
- package/static/dashboard/assets/SystemSettingsPage-CtNDklkx.js +1 -0
- package/static/dashboard/assets/SystemSettingsSubjectPanel-WaE8mTQi.js +33 -0
- package/static/dashboard/assets/{activity-j5zrznu-.js → activity-B9ylSoyr.js} +1 -1
- package/static/dashboard/assets/admin-C6qCRFiY.js +1 -0
- package/static/dashboard/assets/{badge-CzeBdG7h.js → badge-BNbFbpIb.js} +1 -1
- package/static/dashboard/assets/{dashboard-D-xANHk1.js → dashboard-CD-FFVRD.js} +105 -109
- package/static/dashboard/assets/dashboard-DWMMiFjh.css +1 -0
- package/static/dashboard/assets/{download-IcNdEZWi.js → download-nOP38LtW.js} +1 -1
- package/static/dashboard/assets/{external-link-DxBxK8Vu.js → external-link-Bh2ewN9E.js} +1 -1
- package/static/dashboard/assets/{index-FWZ-s52O.js → index-PgS-Bt7X.js} +1 -1
- package/static/dashboard/assets/{index-ZiQZ96oC.js → index-QN2QgEwr.js} +4 -4
- package/static/dashboard/assets/{key-round-D1K7warM.js → key-round-bGmguBLv.js} +1 -1
- package/static/dashboard/assets/{rotate-ccw-CcN1N6p9.js → rotate-ccw-D2x__ODW.js} +1 -1
- package/static/dashboard/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/dashboard/assets/{skeleton-CKnmJMUH.js → skeleton-VOqft8WS.js} +1 -1
- package/static/dashboard/assets/{waypoints-DuZPO_wu.js → waypoints-fgRqm4oH.js} +1 -1
- package/static/dashboard/assets/{workspace-layout-BUj3wZ_m.js → workspace-layout-DV4dgeHX.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AiConfigContext-C0cQMPfG.js → AiConfigContext-zKQYdfai.js} +1 -1
- package/static/settings/assets/{AiConfigPage-CPhB4iFb.js → AiConfigPage-Bs1EE3Ei.js} +1 -1
- package/static/settings/assets/{DocumentProcessingPanel-sYI7OpuH.js → DocumentProcessingPanel-CSFfdOXS.js} +1 -1
- package/static/settings/assets/{IndexLifecyclePanel-yj8iyiT8.js → IndexLifecyclePanel-BR9Su49B.js} +1 -1
- package/static/settings/assets/{IndexSubjectPanel-73sM16Ma.js → IndexSubjectPanel-BgbI9c-a.js} +1 -1
- package/static/settings/assets/{ModelAssignmentsPanel-BFIgUX5v.js → ModelAssignmentsPanel-C0BE7nbk.js} +1 -1
- package/static/settings/assets/{ModelsPage-BdppXl7E.js → ModelsPage-CU-YQ8_7.js} +4 -4
- package/static/settings/assets/{NetworkPage-i6j-M2RY.js → NetworkPage-C8OA9Mtp.js} +1 -1
- package/static/settings/assets/{PaneListHeader-DpqC0jd5.js → PaneListHeader-COvlPJWj.js} +1 -1
- package/static/settings/assets/{SearchIndexingPanel-BlPnrkT3.js → SearchIndexingPanel-Bdd46mIV.js} +1 -1
- package/static/settings/assets/{StatusSubjectPanel-Dv4q3PGh.js → StatusSubjectPanel-BuLml7qn.js} +1 -1
- package/static/settings/assets/{StatusWorkspace-CKD_Rzdr.js → StatusWorkspace-CoMFRXoV.js} +1 -1
- package/static/settings/assets/SystemSettingsPage-DlzmaWV-.js +1 -0
- package/static/settings/assets/SystemSettingsSubjectPanel-DExjDo_v.js +33 -0
- package/static/settings/assets/{activity-DaFkk8f3.js → activity-TLerXgMs.js} +1 -1
- package/static/settings/assets/admin-C6qCRFiY.js +1 -0
- package/static/settings/assets/{badge-d5SHdc-x.js → badge-Bcs8iWrH.js} +1 -1
- package/static/settings/assets/{download-CpkwomDr.js → download-Ct3QmHPt.js} +1 -1
- package/static/settings/assets/{external-link-_4YT42Mf.js → external-link-C8KiHbss.js} +1 -1
- package/static/settings/assets/{index-BFi9yn7_.js → index-1Q2cRjZd.js} +1 -1
- package/static/settings/assets/{index-BGgEhIUy.js → index-DBO_Vq0P.js} +4 -4
- package/static/settings/assets/{index-browser-B06xjBdZ.js → index-browser-CazX1pc2.js} +1 -1
- package/static/settings/assets/{key-round-Dlqmp1Kq.js → key-round-B19YD1GA.js} +1 -1
- package/static/settings/assets/{rotate-ccw-TAY65xWT.js → rotate-ccw-AQm2kMgU.js} +1 -1
- package/static/settings/assets/{settings-ExBXGgbj.js → settings-C-VBtt9r.js} +105 -109
- package/static/settings/assets/settings-DWMMiFjh.css +1 -0
- package/static/settings/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/settings/assets/{skeleton-DKIWjNr9.js → skeleton-DyZ1OBYf.js} +1 -1
- package/static/settings/assets/{waypoints-9erLIxyR.js → waypoints-CC3wq-SU.js} +1 -1
- package/static/settings/assets/{workspace-layout-CYXfYIa3.js → workspace-layout-BxXNKgf9.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.d.ts +0 -54
- package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.js +0 -21
- package/static/auth-callback/assets/SystemSettingsPage-BirzWAQM.js +0 -1
- package/static/auth-callback/assets/SystemSettingsSubjectPanel-CmsVWNCx.js +0 -31
- package/static/auth-callback/assets/admin-BU4m6Ko2.js +0 -1
- package/static/auth-callback/assets/auth-callback-C_7MUXJb.css +0 -1
- package/static/dashboard/assets/SystemSettingsPage-BiN5GcKx.js +0 -1
- package/static/dashboard/assets/SystemSettingsSubjectPanel-B9QrSiFp.js +0 -31
- package/static/dashboard/assets/admin-BU4m6Ko2.js +0 -1
- package/static/dashboard/assets/dashboard-C_7MUXJb.css +0 -1
- package/static/settings/assets/SystemSettingsPage-CiOm2NzV.js +0 -1
- package/static/settings/assets/SystemSettingsSubjectPanel-Cd-GECon.js +0 -31
- package/static/settings/assets/admin-BU4m6Ko2.js +0 -1
- package/static/settings/assets/settings-C_7MUXJb.css +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{j as a,r as p,P as wt,o as or,q as Kt,x as ga,z as ls,E as ie,X as ds,f as me,i as us,F as fs,H as Aa,I as sr,J as ir,K as ya,M as xa,Q as ve,T as pt,U as Fr,V as cr,W as ke,Y as hn,Z as T,_ as Ut,$ as ut,a0 as Hn,a1 as cn,a2 as Ct,a3 as $e,a4 as ps,a5 as hs,a6 as Re,a7 as tt,a8 as ba,a9 as ms,aa as lr,ab as Xe,ac as ot,ad as mn,ae as gn,af as wa,ag as An,B as V,ah as Le,ai as je,aj as gs,ak as Ur,al as _e,am as Br,t as Ue,an as As,ao as ys,ap as xs,aq as bs,ar as Y,as as ce,at as Be,au as ws,av as Cs,aw as vs,u as Es}from"./settings-ExBXGgbj.js";import{A as Ca,a as Is,b as js,n as va,d as ks,e as Ps}from"./ai-connections-CHNTKemd.js";import{W as Ds,T as Fs}from"./workspace-layout-CYXfYIa3.js";import{a as yn,P as Us,c as Ve,h as Bs,g as Ss,R as Ms,d as Ns,F as Rs,D as Ea,e as Ia,u as an,C as Os,i as Ks,b as ja,f as Ts,A as Ls}from"./index-BFi9yn7_.js";import{B as on}from"./badge-d5SHdc-x.js";import{r as Qs,a as qs,b as Hs}from"./index-browser-B06xjBdZ.js";var Vs=Object.defineProperty,Oe=(e,t)=>Vs(e,"name",{value:t,configurable:!0}),dr="Dialog",[ka,Zu]=ga(dr),[zs,Je]=ka(dr),Js=Oe(e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:o,onOpenChange:s,modal:i=!0}=e,c=p.useRef(null),d=p.useRef(null),[u,f]=Ia({prop:r,defaultProp:o??!1,onChange:s,caller:dr}),[h,A]=p.useState(0),[g,I]=p.useState(0);return a.jsx(zs,{scope:t,triggerRef:c,contentRef:d,contentId:an(),titleId:an(),descriptionId:an(),titlePresent:h>0,descriptionPresent:g>0,setTitleCount:A,setDescriptionCount:I,open:u,onOpenChange:f,onOpenToggle:p.useCallback(()=>f(m=>!m),[f]),modal:i,children:n})},"Dialog"),Gs="DialogTrigger",Xs=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(Gs,r),i=Kt(n,s.triggerRef);return a.jsx(wt.button,{type:"button","aria-haspopup":"dialog","aria-expanded":s.open,"aria-controls":s.open?s.contentId:void 0,"data-state":xn(s.open),...o,ref:i,onClick:Ve(t.onClick,s.onOpenToggle)})},"DialogTrigger")),Pa="DialogPortal",[Ys,Da]=ka(Pa,{forceMount:void 0}),Ws=Oe(e=>{const{__scopeDialog:t,forceMount:n,children:r,container:o}=e,s=Je(Pa,t);return a.jsx(Ys,{scope:t,forceMount:n,children:p.Children.map(r,i=>a.jsx(yn,{present:n||s.open,children:a.jsx(Us,{asChild:!0,container:o,children:i})}))})},"DialogPortal"),Vn="DialogOverlay",Fa=p.forwardRef(Oe(function(t,n){const r=Da(Vn,t.__scopeDialog),{forceMount:o=r.forceMount,...s}=t,i=Je(Vn,t.__scopeDialog);return i.modal?a.jsx(yn,{present:o||i.open,children:a.jsx(_s,{...s,ref:n})}):null},"DialogOverlay")),Zs=ls("DialogOverlay.RemoveScroll"),_s=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(Vn,r),i=Ss(),c=Kt(n,i);return a.jsx(Ms,{as:Zs,allowPinchZoom:!0,shards:[s.contentRef],children:a.jsx(wt.div,{"data-state":xn(s.open),...o,ref:c,style:{pointerEvents:"auto",...o.style}})})},"DialogOverlayImpl")),St="DialogContent",Ua=p.forwardRef(Oe(function(t,n){const r=Da(St,t.__scopeDialog),{forceMount:o=r.forceMount,...s}=t,i=Je(St,t.__scopeDialog);return a.jsx(yn,{present:o||i.open,children:i.modal?a.jsx($s,{...s,ref:n}):a.jsx(ei,{...s,ref:n})})},"DialogContent")),$s=p.forwardRef(Oe(function(t,n){const r=Je(St,t.__scopeDialog),o=p.useRef(null),s=Kt(n,r.contentRef,o);return p.useEffect(()=>{const i=o.current;if(i)return Bs(i)},[]),a.jsx(Ba,{...t,ref:s,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:Ve(t.onCloseAutoFocus,i=>{i.preventDefault(),r.triggerRef.current?.focus()}),onPointerDownOutside:Ve(t.onPointerDownOutside,i=>{const c=i.detail.originalEvent,d=c.button===0&&c.ctrlKey===!0;(c.button===2||d)&&i.preventDefault()}),onFocusOutside:Ve(t.onFocusOutside,i=>i.preventDefault())})},"DialogContentModal")),ei=p.forwardRef(Oe(function(t,n){const r=Je(St,t.__scopeDialog),o=p.useRef(!1),s=p.useRef(!1);return a.jsx(Ba,{...t,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:i=>{t.onCloseAutoFocus?.(i),i.defaultPrevented||(o.current||r.triggerRef.current?.focus(),i.preventDefault()),o.current=!1,s.current=!1},onInteractOutside:i=>{t.onInteractOutside?.(i),i.defaultPrevented||(o.current=!0,i.detail.originalEvent.type==="pointerdown"&&(s.current=!0));const c=i.target;r.triggerRef.current?.contains(c)&&i.preventDefault(),i.detail.originalEvent.type==="focusin"&&s.current&&i.preventDefault()}})},"DialogContentNonModal")),Ba=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,trapFocus:o,onOpenAutoFocus:s,onCloseAutoFocus:i,...c}=t,d=Je(St,r);return Ns(),a.jsx(a.Fragment,{children:a.jsx(Rs,{asChild:!0,loop:!0,trapped:o,onMountAutoFocus:s,onUnmountAutoFocus:i,children:a.jsx(Ea,{role:"dialog",id:d.contentId,"aria-describedby":d.descriptionPresent?d.descriptionId:void 0,"aria-labelledby":d.titlePresent?d.titleId:void 0,"data-state":xn(d.open),...c,ref:n,deferPointerDownOutside:!0,onDismiss:()=>d.onOpenChange(!1)})})})},"DialogContentImpl")),ti="DialogTitle",Sa=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(ti,r),{setTitleCount:i}=s;return or(()=>(i(c=>c+1),()=>i(c=>c-1)),[i]),a.jsx(wt.h2,{id:s.titleId,...o,ref:n})},"DialogTitle")),ni="DialogDescription",Ma=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(ni,r),{setDescriptionCount:i}=s;return or(()=>(i(c=>c+1),()=>i(c=>c-1)),[i]),a.jsx(wt.p,{id:s.descriptionId,...o,ref:n})},"DialogDescription")),ri="DialogClose",ai=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(ri,r);return a.jsx(wt.button,{type:"button",...o,ref:n,onClick:Ve(t.onClick,()=>s.onOpenChange(!1))})},"DialogClose"));function xn(e){return e?"open":"closed"}Oe(xn,"getState");const oi=[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]],ln=ie("box",oi);const si=[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]],Na=ie("brain",si);const ii=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],st=ie("check",ii);const ci=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],zn=ie("copy",ci);const li=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],bn=ie("external-link",li);const di=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],ui=ie("eye-off",di);const fi=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],pi=ie("eye",fi);const hi=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]],Ra=ie("globe",hi);const mi=[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]],gi=ie("grip-vertical",mi);const Ai=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],Oa=ie("image",Ai);const yi=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Ka=ie("info",yi);const xi=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],Jn=ie("key-round",xi);const bi=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],wi=ie("log-out",bi);const Ci=[["rect",{x:"14",y:"4",width:"4",height:"16",rx:"1",key:"zuxfzm"}],["rect",{x:"6",y:"4",width:"4",height:"16",rx:"1",key:"1okwgv"}]],vi=ie("pause",Ci);const Ei=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],Ta=ie("pencil",Ei);const Ii=[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]],ji=ie("play",Ii);const ki=[["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m18 3-4 4h6l-4 4",key:"16psg9"}]],Pi=ie("plug-zap",ki);const Di=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],vt=ie("plus",Di);const Fi=[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]],Sr=ie("refresh-ccw",Fi);const Ui=[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]],Gn=ie("rotate-cw",Ui);const Bi=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],La=ie("search",Bi);const Si=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Mi=ie("settings-2",Si);const Ni=[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]],Ri=ie("square-terminal",Ni);const Oi=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],ur=ie("trash-2",Oi);const Ki=[["path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",key:"18etb6"}],["path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",key:"xoc0q4"}]],Ti=ie("wallet",Ki),Tt=Js,Li=Xs,Qi=Ws,Qa=p.forwardRef(({className:e,...t},n)=>a.jsx(Fa,{ref:n,className:me("fixed inset-0 z-50 bg-black/40","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t}));Qa.displayName=Fa.displayName;const Et=p.forwardRef(({className:e,children:t,variant:n="center",...r},o)=>a.jsxs(Qi,{children:[a.jsx(Qa,{}),a.jsxs(Ua,{ref:o,className:me(n==="sheet-left"?"fixed inset-y-0 left-0 z-50 flex h-dvh w-[min(88vw,320px)] flex-col border-r bg-background p-0 shadow-[16px_0_30px_rgba(15,23,42,0.08)] duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-left-full data-[state=open]:slide-in-from-left-full rounded-none":n==="sheet-right"?"fixed inset-y-0 right-0 z-50 flex h-dvh w-full max-w-4xl flex-col border-l bg-background p-0 shadow-[-16px_0_30px_rgba(15,23,42,0.08)] duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-right-full rounded-none":"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg",e),...r,children:[t,a.jsxs(ai,{className:me("absolute right-4 top-4 rounded-xl opacity-70 transition-all hover:opacity-100 hover:bg-muted/50 p-1 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",us),children:[a.jsx(ds,{className:"h-4 w-4"}),a.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));Et.displayName=Ua.displayName;const Lt=({className:e,...t})=>a.jsx("div",{className:me("flex flex-col space-y-1.5 text-center sm:text-left",e),...t});Lt.displayName="DialogHeader";const Mt=({className:e,...t})=>a.jsx("div",{className:me("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});Mt.displayName="DialogFooter";const It=p.forwardRef(({className:e,...t},n)=>a.jsx(Sa,{ref:n,className:me("text-lg font-semibold leading-none tracking-tight",e),...t}));It.displayName=Sa.displayName;const qi=p.forwardRef(({className:e,...t},n)=>a.jsx(Ma,{ref:n,className:me("text-sm text-muted-foreground",e),...t}));qi.displayName=Ma.displayName;var Hi=Object.defineProperty,be=(e,t)=>Hi(e,"name",{value:t,configurable:!0}),[fr,_u]=ga("Tooltip",[ja]),pr=ja(),Vi="TooltipProvider",zi=700,Xn="tooltip.open",[Ji,hr]=fr(Vi),Gi=be(e=>{const{__scopeTooltip:t,delayDuration:n=zi,skipDelayDuration:r=300,disableHoverableContent:o=!1,children:s}=e,i=p.useRef(!0),c=p.useRef(!1),d=p.useRef(0);return p.useEffect(()=>{const u=d.current;return()=>window.clearTimeout(u)},[]),a.jsx(Ji,{scope:t,isOpenDelayedRef:i,delayDuration:n,onOpen:p.useCallback(()=>{r<=0||(window.clearTimeout(d.current),i.current=!1)},[r]),onClose:p.useCallback(()=>{r<=0||(window.clearTimeout(d.current),d.current=window.setTimeout(()=>i.current=!0,r))},[r]),isPointerInTransitRef:c,onPointerInTransitChange:p.useCallback(u=>{c.current=u},[]),disableHoverableContent:o,children:s})},"TooltipProvider"),Yn="Tooltip",[Xi,wn]=fr(Yn),Yi=be(e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:o,onOpenChange:s,disableHoverableContent:i,delayDuration:c}=e,d=hr(Yn,e.__scopeTooltip),u=pr(t),[f,h]=p.useState(null),[A,g]=p.useState(void 0),I=an(),m=p.useRef(0),E=i??d.disableHoverableContent,P=c??d.delayDuration,x=p.useRef(!1),[F,v]=Ia({prop:r,defaultProp:o??!1,onChange:be(N=>{N?(d.onOpen(),document.dispatchEvent(new CustomEvent(Xn))):d.onClose(),s?.(N)},"onChange"),caller:Yn}),M=p.useMemo(()=>F?x.current?"delayed-open":"instant-open":"closed",[F]),j=p.useCallback(()=>{window.clearTimeout(m.current),m.current=0,x.current=!1,v(!0)},[v]),y=p.useCallback(()=>{window.clearTimeout(m.current),m.current=0,v(!1)},[v]),w=p.useCallback(()=>{window.clearTimeout(m.current),m.current=window.setTimeout(()=>{x.current=!0,v(!0),m.current=0},P)},[P,v]);p.useEffect(()=>()=>{m.current&&(window.clearTimeout(m.current),m.current=0)},[]);const S=A??I;return a.jsx(Ts,{...u,children:a.jsx(Xi,{scope:t,contentId:S,setContentId:g,open:F,stateAttribute:M,trigger:f,onTriggerChange:h,onTriggerEnter:p.useCallback(()=>{d.isOpenDelayedRef.current?w():j()},[d.isOpenDelayedRef,w,j]),onTriggerLeave:p.useCallback(()=>{E?y():(window.clearTimeout(m.current),m.current=0)},[y,E]),onOpen:j,onClose:y,disableHoverableContent:E,children:n})})},"Tooltip"),Mr="TooltipTrigger",Wi=p.forwardRef(be(function(t,n){const{__scopeTooltip:r,...o}=t,s=wn(Mr,r),i=hr(Mr,r),c=pr(r),d=p.useRef(null),u=Kt(n,d,s.onTriggerChange),f=p.useRef(!1),h=p.useRef(!1),A=p.useCallback(()=>f.current=!1,[]);return p.useEffect(()=>()=>document.removeEventListener("pointerup",A),[A]),a.jsx(Ls,{asChild:!0,...c,children:a.jsx(wt.button,{"aria-describedby":s.open?s.contentId:void 0,"data-state":s.stateAttribute,...o,ref:u,onPointerMove:Ve(t.onPointerMove,g=>{g.pointerType!=="touch"&&!h.current&&!i.isPointerInTransitRef.current&&(s.onTriggerEnter(),h.current=!0)}),onPointerLeave:Ve(t.onPointerLeave,()=>{s.onTriggerLeave(),h.current=!1}),onPointerDown:Ve(t.onPointerDown,()=>{s.open&&s.onClose(),f.current=!0,document.addEventListener("pointerup",A,{once:!0})}),onFocus:Ve(t.onFocus,()=>{f.current||s.onOpen()}),onBlur:Ve(t.onBlur,s.onClose),onClick:Ve(t.onClick,s.onClose)})})},"TooltipTrigger")),Zi="TooltipPortal",[$u,_i]=fr(Zi,{forceMount:void 0}),Nt="TooltipContent",$i=p.forwardRef(be(function(t,n){const r=_i(Nt,t.__scopeTooltip),{forceMount:o=r.forceMount,side:s="top",...i}=t,c=wn(Nt,t.__scopeTooltip);return a.jsx(yn,{present:o||c.open,children:c.disableHoverableContent?a.jsx(qa,{side:s,...i,ref:n}):a.jsx(ec,{side:s,...i,ref:n})})},"TooltipContent")),ec=p.forwardRef(be(function(t,n){const r=wn(Nt,t.__scopeTooltip),o=hr(Nt,t.__scopeTooltip),s=p.useRef(null),i=Kt(n,s),[c,d]=p.useState(null),{trigger:u,onClose:f}=r,h=s.current,{onPointerInTransitChange:A}=o,g=p.useCallback(()=>{d(null),A(!1)},[A]),I=p.useCallback((m,E)=>{const P=m.currentTarget,x={x:m.clientX,y:m.clientY},F=Ha(x,P.getBoundingClientRect()),v=Va(x,F),M=za(E.getBoundingClientRect()),j=Ga([...v,...M]);d(j),A(!0)},[A]);return p.useEffect(()=>()=>g(),[g]),p.useEffect(()=>{if(u&&h){const m=be(P=>I(P,h),"handleTriggerLeave"),E=be(P=>I(P,u),"handleContentLeave");return u.addEventListener("pointerleave",m),h.addEventListener("pointerleave",E),()=>{u.removeEventListener("pointerleave",m),h.removeEventListener("pointerleave",E)}}},[u,h,I,g]),p.useEffect(()=>{if(c){const m=be(E=>{const P=E.target,x={x:E.clientX,y:E.clientY},F=u?.contains(P)||h?.contains(P),v=!Ja(x,c);F?g():v&&(g(),f())},"handleTrackPointerGrace");return document.addEventListener("pointermove",m),()=>document.removeEventListener("pointermove",m)}},[u,h,c,f,g]),a.jsx(qa,{...t,ref:i})},"TooltipContentHoverable")),tc=fs("TooltipContent"),qa=p.forwardRef(be(function(t,n){const{__scopeTooltip:r,children:o,"aria-label":s,id:i,onEscapeKeyDown:c,onPointerDownOutside:d,...u}=t,f=wn(Nt,r),h=pr(r),{onClose:A}=f;p.useEffect(()=>(document.addEventListener(Xn,A),()=>document.removeEventListener(Xn,A)),[A]),p.useEffect(()=>{if(f.trigger){const I=be(m=>{m.target instanceof Node&&m.target.contains(f.trigger)&&A()},"handleScroll");return window.addEventListener("scroll",I,{capture:!0}),()=>window.removeEventListener("scroll",I,{capture:!0})}},[f.trigger,A]);const{setContentId:g}=f;return or(()=>(g(i),()=>{g(void 0)}),[i,g]),a.jsx(Ea,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:c,onPointerDownOutside:d,onFocusOutside:I=>I.preventDefault(),onDismiss:A,children:a.jsxs(Os,{"data-state":f.stateAttribute,role:s?void 0:"tooltip",id:s?void 0:f.contentId,...h,...u,ref:n,style:{...u.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[a.jsx(tc,{children:o}),s?a.jsx(Ks,{id:f.contentId,role:"tooltip",children:s}):null]})})},"TooltipContentImpl"));function Ha(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),o=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(n,r,o,s)){case s:return"left";case o:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}be(Ha,"getExitSideFromRect");function Va(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}be(Va,"getPaddedExitPoints");function za(e){const{top:t,right:n,bottom:r,left:o}=e;return[{x:o,y:t},{x:n,y:t},{x:n,y:r},{x:o,y:r}]}be(za,"getPointsFromRect");function Ja(e,t){const{x:n,y:r}=e;let o=!1;for(let s=0,i=t.length-1;s<t.length;i=s++){const c=t[s],d=t[i],u=c.x,f=c.y,h=d.x,A=d.y;f>r!=A>r&&n<(h-u)*(r-f)/(A-f)+u&&(o=!o)}return o}be(Ja,"isPointInPolygon");function Ga(e){const t=e.slice();return t.sort((n,r)=>n.x<r.x?-1:n.x>r.x?1:n.y<r.y?-1:n.y>r.y?1:0),Xa(t)}be(Ga,"getHull");function Xa(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r<e.length;r++){const o=e[r];for(;t.length>=2;){const s=t[t.length-1],i=t[t.length-2];if((s.x-i.x)*(o.y-i.y)>=(s.y-i.y)*(o.x-i.x))t.pop();else break}t.push(o)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const o=e[r];for(;n.length>=2;){const s=n[n.length-1],i=n[n.length-2];if((s.x-i.x)*(o.y-i.y)>=(s.y-i.y)*(o.x-i.x))n.pop();else break}n.push(o)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}be(Xa,"getHullPresorted");var nc=Gi,rc=Yi,ac=Wi,Ya=$i;const Wa=nc,Cn=rc,vn=ac,Qt=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>a.jsx(Ya,{ref:r,sideOffset:t,className:me("z-50 overflow-hidden rounded-md border border-border/50 bg-popover","px-2 py-1 text-xs text-popover-foreground shadow-md","animate-in fade-in-0 zoom-in-95","data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95","data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n}));Qt.displayName=Ya.displayName;function oc(e){const t=Aa(e).type;return Array.isArray(t)&&t.includes(sr.AccessControlResource)}async function En(e,t){if(!Gt(e))return{resourceAcl:null,fallbackAcl:null};try{const n=await Za(e,t);return n===null?{resourceAcl:null,fallbackAcl:await _a(e,t)}:{resourceAcl:n,fallbackAcl:null}}catch(n){if(n instanceof Wn)return{resourceAcl:null,fallbackAcl:null};throw n}}async function Za(e,t){if(!Gt(e))return null;try{const n=await ya(e.internal_resourceInfo.aclUrl,t);if(oc(n))throw new Wn(e,n);return xa({...n,internal_accessTo:ve(e)})}catch(n){if(n instanceof Wn)throw n;return null}}async function _a(e,t){const n=new URL(ve(e)),r=n.pathname;if(r==="/")return null;const o=sc(r),s=new URL(o,n.origin).href,i=await pt(s,t);if(!Gt(i))return null;const c=await Za(i,t);return c===null?_a(i,t):c}function sc(e){const t=e.substring(e.length-1)==="/"?e.substring(0,e.length-1):e;return`${e.substring(0,t.lastIndexOf("/"))}/`}function at(e){return cr(e).filter(ic)}function ic(e){return ke(e,hn.type).includes(T.Authorization)}function mr(e,t){return e.filter(n=>cc(n,t))}function cc(e,t){return ke(e,T.accessTo).includes(t)}function In(e,t){return e.filter(n=>lc(n,t))}function lc(e,t){return ke(e,T.default).includes(t)||ke(e,T.defaultForNew).includes(t)}function qt(e){const t=ke(e,T.mode);return t.includes(ze.write)?{read:t.includes(ze.read),append:!0,write:!0,control:t.includes(ze.control)}:{read:t.includes(ze.read),append:t.includes(ze.append),write:!1,control:t.includes(ze.control)}}function Ht(e){return e.reduce((t,n)=>t.write||n.write?{read:t.read||n.read,append:!0,write:!0,control:t.control||n.control}:{read:t.read||n.read,append:t.append||n.append,write:!1,control:t.control||n.control},{read:!1,append:!1,write:!1,control:!1})}function dc(e){return at(e).filter(uc).reduce(ps,e)}function uc(e){return hs(e.predicates,Re.namedNode(e.url),Re.defaultGraph()).some(t=>!fc(t))?!1:tt(e,T.accessTo)===null&&tt(e,T.default)===null&&tt(e,T.defaultForNew)===null||tt(e,T.mode)===null||tt(e,T.agent)===null&&tt(e,T.agentGroup)===null&&tt(e,T.agentClass)===null}function fc(e){const{predicate:t}=e,{object:n}=e;return!!(t.equals(Re.namedNode(hn.type))&&n.equals(Re.namedNode(T.Authorization))||t.equals(Re.namedNode(T.accessTo))||t.equals(Re.namedNode(T.default))||t.equals(Re.namedNode(T.defaultForNew))||t.equals(Re.namedNode(T.mode))&&Object.values(ze).some(r=>n.equals(Re.namedNode(r)))||t.equals(Re.namedNode(T.agent))||t.equals(Re.namedNode(T.agentGroup))||t.equals(Re.namedNode(T.agentClass))||t.equals(Re.namedNode(T.origin)))}const ze={read:"http://www.w3.org/ns/auth/acl#Read",append:"http://www.w3.org/ns/auth/acl#Append",write:"http://www.w3.org/ns/auth/acl#Write",control:"http://www.w3.org/ns/auth/acl#Control"};function pc(e,t,n){return e.filter(r=>ke(r,n).includes(t))}function hc(e,t){const n={};return e.forEach(r=>{const o=ke(r,t),s=qt(r);o.forEach(i=>{n[i]=typeof n[i]>"u"?s:Ht([n[i],s])})}),n}function $a(e){let t=Ct();return t=ut(t,hn.type,T.Authorization),e.read&&(t=$e(t,T.mode,ze.read)),e.append&&!e.write&&(t=$e(t,T.mode,ze.append)),e.write&&(t=$e(t,T.mode,ze.write)),e.control&&(t=$e(t,T.mode,ze.control)),t}function mc(e){let t=Ct();t=ut(t,hn.type,T.Authorization);function n(r,o,s){return ke(r,s).reduce((i,c)=>$e(i,s,c),o)}return t=n(e,t,T.accessTo),t=n(e,t,T.default),t=n(e,t,T.defaultForNew),t=n(e,t,T.agent),t=n(e,t,T.agentGroup),t=n(e,t,T.agentClass),t=n(e,t,T.origin),t=n(e,t,T.mode),t}function Vt(e,t){return Object.assign(ir(e),{internal_acl:t})}const gc=[T.agent,T.agentClass,T.agentGroup,T.origin];function Ac(e,t,n,r,o){if(!ke(e,n).includes(t)){const c=$a({read:!1,append:!1,write:!1,control:!1});return[e,c]}const s=Hn(e,n,t);let i=mc(e);return i=Hn(i,T.accessTo,r),i=ut(i,n,t),gc.filter(c=>c!==n).forEach(c=>{i=cn(i,c)}),[s,i]}function eo(e,t,n,r,o){let s=e;cr(e).forEach(d=>{const[u,f]=Ac(d,o,n,e.internal_accessTo);s=Ut(s,u),s=Ut(s,f)});let i=$a(t);i=ut(i,T.accessTo,e.internal_accessTo),i=ut(i,n,o);const c=Ut(s,i);return dc(c)}function to(e,t){return Vt(e,{resourceAcl:t,fallbackAcl:null})}function yc(e){return e.internal_acl.resourceAcl}class Wn extends Error{constructor(t,n){super(`[${Fr(t)}] is governed by Access Control Policies in [${Fr(n)}] rather than by Web Access Control.`)}}function zt(e){return e.internal_acl.resourceAcl!==null&&ve(e)===e.internal_acl.resourceAcl.internal_accessTo&&e.internal_resourceInfo.aclUrl===ve(e.internal_acl.resourceAcl)}function gr(e){return zt(e)?e.internal_acl.resourceAcl:null}function Jt(e){return e.internal_acl.fallbackAcl!==null}function xc(e){return Jt(e)?e.internal_acl.fallbackAcl:null}function bc(e){return xa({...ms(),internal_accessTo:ve(e),internal_resourceInfo:{sourceIri:e.internal_resourceInfo.aclUrl,isRawData:!1,linkedResources:{}}})}function wc(e){const t=bc(e),n=at(e.internal_acl.fallbackAcl);return In(n,e.internal_acl.fallbackAcl.internal_accessTo).map(i=>(i=cn(i,T.default),i=cn(i,T.defaultForNew),i=ut(i,T.accessTo,ve(e)),i=ut(i,T.default,ve(e)),i)).reduce(Ut,t)}async function Cc(e,t,n){if(!Gt(e))throw new Error(`Could not determine the location of the ACL for the Resource at [${ve(e)}]; possibly the current user does not have Control access to that Resource. Try calling \`hasAccessibleAcl()\` before calling \`saveAclFor()\`.`);return{...await ba(e.internal_resourceInfo.aclUrl,t,n),internal_accessTo:ve(e)}}function Gt(e){return typeof e.internal_resourceInfo.aclUrl=="string"}function no(e,t){return zt(e)?Ec(e.internal_acl.resourceAcl,t):Jt(e)?kc(e.internal_acl.fallbackAcl,t):null}function vc(e){if(zt(e)){const t=gr(e);return Ic(t)}if(Jt(e)){const t=xc(e);return Pc(t)}return null}function Ec(e,t){const n=at(e),r=mr(n,e.internal_accessTo),s=ro(r,t).map(qt);return Ht(s)}function Ic(e){const t=at(e),n=mr(t,e.internal_accessTo),r=ao(n);return oo(r)}function jc(e,t,n){return eo(e,n,T.agent,"resource",t)}function kc(e,t){const n=at(e),r=In(n,e.internal_accessTo),s=ro(r,t).map(qt);return Ht(s)}function Pc(e){const t=at(e),n=In(t,e.internal_accessTo),r=ao(n);return oo(r)}function ro(e,t){return pc(e,t,T.agent)}function ao(e){return e.filter(Dc)}function Dc(e){return tt(e,T.agent)!==null}function oo(e){return hc(e,T.agent)}function so(e){return zt(e)?Fc(e.internal_acl.resourceAcl):Jt(e)?Uc(e.internal_acl.fallbackAcl):null}function Fc(e){const t=at(e),n=mr(t,e.internal_accessTo),o=io(n,lr.Agent).map(qt);return Ht(o)}function Uc(e){const t=at(e),n=In(t,e.internal_accessTo),o=io(n,lr.Agent).map(qt);return Ht(o)}function Bc(e,t){return eo(e,t,T.agentClass,"resource",lr.Agent)}function io(e,t){return e.filter(n=>Sc(n,t))}function Sc(e,t){return ke(e,T.agentClass).includes(t)}async function co(e,t){if(typeof e.internal_resourceInfo.aclUrl!="string")return null;try{return await pt(e.internal_resourceInfo.aclUrl,t)}catch{return null}}const Ke="http://www.w3.org/ns/solid/acp#",he={AccessControlResource:Ke.concat("AccessControlResource"),PublicAgent:Ke.concat("PublicAgent"),access:Ke.concat("access"),accessControl:Ke.concat("accessControl"),agent:Ke.concat("agent"),allOf:Ke.concat("allOf"),allow:Ke.concat("allow"),anyOf:Ke.concat("anyOf"),apply:Ke.concat("apply"),deny:Ke.concat("deny"),memberAccessControl:Ke.concat("memberAccessControl"),noneOf:Ke.concat("noneOf")},Un="http://www.w3.org/ns/auth/acl#",gt={Append:Un.concat("Append"),Read:Un.concat("Read"),Write:Un.concat("Write")};async function lo(e,t){const n=Me(e),r=await ba(ve(n),n,t);return Nc(e,r)}function Mc(e){return typeof e.internal_acp=="object"&&e.internal_acp!==null&&typeof e.internal_acp.acr=="object"&&e.internal_acp.acr!==null}function Me(e){if(!Mc(e))throw new Error(`An Access Control Resource for [${ve(e)}] is not available. This could be because the current user is not allowed to see it, or because their Pod Server does not support Access Control Resources.`);return e.internal_acp.acr}function Nc(e,t){return Object.assign(ir(e),{internal_acp:{...e.internal_acp,acr:t}})}function uo(e){const t=Me(e),n=ve(t);return Xe(t,n)}function fo(e){const t=uo(e);return t===null?[]:ke(t,he.accessControl)}function po(e,t,n){const r=Me(e);return Array.from(new Set(t.map(o=>{const s=Xe(r,o);return s!==null?ke(s,n):[]}).reduce((o,s)=>o.concat(s),[])))}function Rc(e){return po(e,fo(e),he.apply)}function Oc(e){return po(e,fo(e),he.access)}function ho(e,t){const n=ke(e,t);return{read:n.includes(gt.Read),append:n.includes(gt.Append),write:n.includes(gt.Write),controlRead:!1,controlWrite:!1}}function Kc(e){return ho(e,he.allow)}function Tc(e){return ho(e,he.deny)}function Nr(e,t,n){const r=ot(t,he.allOf).map(u=>Xe(Me(e),u)).filter(u=>u!==null),o=r.every(u=>ot(u,he.agent).includes(n)),s=ot(t,he.anyOf).map(u=>Xe(Me(e),u)).filter(u=>u!==null),i=s.some(u=>ot(u,he.agent).includes(n)),c=ot(t,he.noneOf).map(u=>Xe(Me(e),u)).filter(u=>u!==null),d=c.some(u=>ot(u,he.agent).includes(n));return r.length+s.length>0&&(r.length===0||o)&&(s.length===0||i)&&(c.length===0||!d)}function Rr(e,t,n){const r=Kc(e),o=Tc(e);return n==="control"?{read:t.read,append:t.append,write:t.write,controlRead:(t.controlRead||r.read)&&!o.read,controlWrite:(t.controlWrite||r.write)&&!o.write}:{read:(t.read||r.read)&&!o.read,append:(t.append||r.append)&&!o.append,write:(t.write||r.write)&&!o.write,controlRead:t.controlRead,controlWrite:t.controlWrite}}async function jn(e,t){let n={read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1};return Rc(e).map(s=>Xe(Me(e),s)).filter(s=>s!==null).forEach(s=>{Nr(e,s,t)&&(n=Rr(s,n,"resource"))}),Oc(e).map(s=>Xe(Me(e),s)).filter(s=>s!==null).forEach(s=>{Nr(e,s,t)&&(n=Rr(s,n,"control"))}),n}function mo(e,t){var n,r,o,s;if(e.controlRead!==e.controlWrite)throw new Error("For Pods using Web Access Control, controlRead and controlWrite must be equal.");return{read:(n=e.read)!==null&&n!==void 0?n:t.read,append:(r=e.append)!==null&&r!==void 0?r:t.append,write:(o=e.write)!==null&&o!==void 0?o:t.write,control:(s=e.controlRead)!==null&&s!==void 0?s:t.control}}function Ar(e){return{read:e.read,write:e.write,append:e.append,controlRead:e.control,controlWrite:e.control}}async function Lc(e,t,n,r){const o=await En(e,r),s=n(Vt(e,o),t);return s===null?null:Ar(s)}async function Qc(e,t,n){const r=await En(e,n),o=t(Vt(e,r));return o===null?null:Ar(o)}async function qc(e,t,n){const r=await En(e,n),o=t(Vt(e,r));if(o===null)return null;const s={};for(const[i,c]of Object.entries(o))s[i]=Ar(c);return s}function go(e,t,n){return Lc(e,t,no,n)}function Ao(e,t){return Qc(e,so,t)}function Hc(e,t){return qc(e,vc,t)}async function yo(e,t){if(!Gt(e))return null;const n=await En(e,t),r=Vt(e,n);let o;if(zt(r))o=yc(r);else if(Jt(r))o=wc(r);else return null;return to(r,o)}async function xo(e,t,n){let r=null;try{return r=await Cc(e,t,n),to(e,r)}catch{return null}}async function Vc(e,t,n,r,o){const s=await yo(e,o);if(s===null)return null;const i=gr(s),c=n(s),d=mo(t,c),u=r(i,d);return xo(s,u,o)}async function zc(e,t,n,r,o,s){const i=await yo(e,s);if(i===null)return null;const c=r(i,t),d=gr(i),u=mo(n,c),f=o(d,t,u);return xo(i,f,s)}async function Jc(e,t,n,r){return zc(e,t,n,no,jc,r)}async function Gc(e,t,n){return Vc(e,t,so,Bc,n)}async function Xc(e,t){const n=await co(e,t);if(n===null)return null;const r=Aa(n).type;return Array.isArray(r)&&r.includes(he.AccessControlResource)?ve(n):null}async function Xt(e,t){const n=await Xc(e,t);if(n===null)return null;let r;try{r=await ya(n,t)}catch{return null}return{...e,internal_acp:{acr:{...r,accessTo:ve(e)}}}}async function bo(e,t,n){const r=await pt(e,n),o=await Xt(r,n);return o===null?go(r,t,n):jn(o,t)}function Yc(e){return Array.from(new Set(cr(Me(e)).map(t=>ot(t,he.agent)).reduce((t,n)=>t.concat(n),[])))}async function Wc(e){return(await Promise.all(Yc(e).map(async t=>({[t]:await jn(e,t)})))).reduce((t,n)=>({...t,...n}),{})}async function Zc(e,t){const n=await pt(e,t),r=await Xt(n,t);return r===null?Hc(n,t):Wc(r)}async function _c(e){return jn(e,he.PublicAgent)}async function wo(e,t){const n=await pt(e,t),r=await Xt(n,t);return r===null?Ao(n,t):_c(r)}function Yt(e,t){return Object.assign(ir(e),{internal_acp:{...e.internal_acp,acr:Ut(e.internal_acp.acr,t)}})}const Bt="defaultAccessControl",dn="defaultAcrAccessControl";function yr(e,t){const n=Me(e);return ve(n).concat("#").concat(t)}function xr(e,t,n){return yr(e,t).concat("AgentMatcher").concat(n.charAt(0).toUpperCase()+n.slice(1)).concat("Policy")}function Co(e,t){const n=Me(e),r=yr(e,t),o=Xe(n,r);return o===null||typeof o>"u"?Ct({url:r}):o}function Or(e){return e.includes("Member")?he.memberAccessControl:he.accessControl}function vo(e,t){const n=yr(e,t),r=Me(e);let o=uo(e);return(o===null||typeof o>"u")&&(o=Ct({url:ve(r)})),ke(o,Or(t)).includes(n)?e:(o=mn(o).addUrl(Or(t),n).build(),Yt(e,o))}function $c(e,t){const n=vo(e,dn),r=Co(n,dn);return Yt(n,mn(r).addUrl(he.access,t).build())}function el(e,t){const n=vo(e,Bt),r=Co(n,Bt);return Yt(n,mn(r).addUrl(he.apply,t).build())}function tl(e,t,n){const r=xr(e,t,n);return r.includes("Acr")?$c(e,r):el(e,r)}function Eo(e,t,n){return xr(e,t,n).concat("Matcher")}function nl(e,t,n){let r=cn(e,n);return(t.read||t.controlRead)&&(r=$e(r,n,gt.Read)),t.append&&(r=$e(r,n,gt.Append)),(t.write||t.controlWrite)&&(r=$e(r,n,gt.Write)),r}const Kr=he.anyOf;function rl(e,t,n){const r=xr(e,t,n),o=Eo(e,t,n);let s=Xe(Me(e),r);return s||(e=tl(e,t,n),s=Ct({url:r}),s=nl(s,{[n]:!0},he.allow)),ke(s,Kr).includes(o)?e:(s=mn(s).addUrl(Kr,o).build(),Yt(e,s))}function al(e,t){return $e(e,sr.agent,t)}function ol(e,t){return Hn(e,sr.agent,t)}function kt(e,t,n,r,o){var s;const i=Eo(e,n,r),c=rl(e,n,r),d=(s=Xe(Me(c),i))!==null&&s!==void 0?s:Ct({url:i});return Yt(c,o==="add"?al(d,t):ol(d,t))}async function Io(e,t,n){const r=await jn(e,t);return typeof n.read=="boolean"&&r.read!==n.read&&(e=kt(e,t,Bt,"read",n.read?"add":"remove")),typeof n.append=="boolean"&&r.append!==n.append&&(e=kt(e,t,Bt,"append",n.append?"add":"remove")),typeof n.write=="boolean"&&r.write!==n.write&&(e=kt(e,t,Bt,"write",n.write?"add":"remove")),typeof n.controlRead=="boolean"&&r.controlRead!==n.controlRead&&(e=kt(e,t,dn,"controlRead",n.controlRead?"add":"remove")),typeof n.controlWrite=="boolean"&&r.controlWrite!==n.controlWrite&&(e=kt(e,t,dn,"controlWrite",n.controlWrite?"add":"remove")),e}async function sl(e,t,n,r){const o=await pt(e,r),s=await Xt(o,r);if(s===null)return await Jc(o,t,n,r),go(o,t,r);try{return await lo(await Io(s,t,n),r),await bo(e,t,r)}catch{return null}}async function il(e,t){return Io(e,he.PublicAgent,t)}async function cl(e,t,n){const r=await pt(e,n),o=await Xt(r,n);if(o===null)return await Gc(r,t,n),Ao(r,n);try{return await lo(await il(o,t),n),await wo(e,n)}catch{return null}}const ll=Object.freeze(Object.defineProperty({__proto__:null,getAclServerResourceInfo:co,getAgentAccess:bo,getAgentAccessAll:Zc,getPublicAccess:wo,setAgentAccess:sl,setPublicAccess:cl},Symbol.toStringTag,{value:"Module"}));function dl(e){if(!jo(e))throw new Error("Applet layout descriptor must be an object");if(typeof e.type!="string")throw new Error("Applet layout descriptor type must be a string");switch(e.type){case"single-pane":case"two-pane":return Tr(e.context),e;case"three-pane":return Tr(e.context),e;default:throw new Error(`Unsupported applet layout type: ${e.type}`)}}function jo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Tr(e){if(e!==void 0){if(!jo(e))throw new Error("Applet layout descriptor context must be an object");if("collapsible"in e&&typeof e.collapsible!="boolean")throw new Error("Applet layout descriptor context.collapsible must be a boolean");if("initiallyCollapsed"in e&&typeof e.initiallyCollapsed!="boolean")throw new Error("Applet layout descriptor context.initiallyCollapsed must be a boolean")}}function ul(e){const t=e.access??ll;return{inspectAgentAccess:n=>fl(n,e.fetch,t),ensureAgentAccess:async n=>{try{for(const r of n.resources){await pl(r.url,r.mediaType,e.fetch);const o=await t.setAgentAccess(r.url,n.service.webId,ml(r.access),{fetch:e.fetch});if(!o||!ko(o,r.access))return Ze("permissionDenied",n,"Pod did not grant the requested service access.")}return Ze("granted",n)}catch(r){return Ze("permissionDenied",n,Zn(r))}},revokeAgentAccess:async n=>{try{for(const r of n.resources)if(!await t.setAgentAccess(r.url,n.service.webId,{read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1},{fetch:e.fetch}))return Ze("permissionDenied",n,"Pod did not revoke the service access.");return Ze("missing",n)}catch(r){return Ze("permissionDenied",n,Zn(r))}}}}async function fl(e,t,n){try{for(const r of e.resources){const o=await n.getAgentAccess(r.url,e.service.webId,{fetch:t});if(!o||!ko(o,r.access))return Ze("missing",e)}return Ze("granted",e)}catch(r){return Ze("permissionDenied",e,Zn(r))}}async function pl(e,t,n){const r=await n(e,{method:"HEAD"});if(r.ok)return;if(r.status!==404)throw new Error(`Unable to inspect Pod resource (${r.status}).`);await hl(e,n);const o=await n(e,{method:"PUT",headers:{"content-type":t},body:`# Created by the Xpod applet permission broker.
|
|
2
|
-
`});if(!o.ok)throw new Error(`Unable to create Pod resource (${o.status}).`)}async function hl(e,t){const n=new URL(e),r=[];let o=new URL("./",n);for(;o.pathname!=="/";){const s=await t(o.href,{method:"HEAD"});if(s.ok)break;if(s.status!==404)throw new Error(`Unable to inspect Pod container (${s.status}).`);r.push(o.href),o=new URL("../",o)}for(const s of r.reverse()){const i=await t(s,{method:"PUT",headers:{"content-type":"text/turtle",link:'<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"'},body:""});if(!i.ok&&i.status!==409)throw new Error(`Unable to create Pod container (${i.status}).`)}}function ml(e){return{read:e.read===!0,append:e.append===!0,write:e.write===!0,controlRead:!1,controlWrite:!1}}function ko(e,t){return(!t.read||e.read===!0)&&(!t.append||e.append===!0)&&(!t.write||e.write===!0)}function Ze(e,t,n){return{status:e,resources:t.resources,...n?{message:n}:{}}}function Zn(e){return e instanceof Error?e.message:"Unable to update Pod service access."}const gl=dl;function Al(e,t){return yl(e,t)}function yl(e,t){const n=xl(e),r=e.createController(t);return n.type==="single-pane"?{layout:"single-pane",controller:r,element:p.createElement(n.render,{controller:r,host:t})}:n.type==="two-pane"?{layout:"two-pane",controller:r,slots:{listHeader:p.createElement(n.slots.listHeader,{controller:r,host:t}),list:p.createElement(n.slots.list,{controller:r,host:t}),mainHeader:p.createElement(n.slots.mainHeader,{controller:r,host:t}),main:p.createElement(n.slots.main,{controller:r,host:t})}}:{layout:"three-pane",controller:r,contextConfig:n.contextConfig,slots:{listHeader:p.createElement(n.slots.listHeader,{controller:r,host:t}),list:p.createElement(n.slots.list,{controller:r,host:t}),mainHeader:p.createElement(n.slots.mainHeader,{controller:r,host:t}),main:p.createElement(n.slots.main,{controller:r,host:t}),context:p.createElement(n.slots.context,{controller:r,host:t})}}}function xl(e){if("layout"in e){const t=Cl(e.layout),n=gl(t.descriptor),r=n.type;if(e.manifest.layout!==r)throw new Error(`Applet manifest layout ${e.manifest.layout} does not match descriptor layout ${r}`);if(r==="single-pane"){if(!("render"in t))throw new Error("Applet descriptor single-pane render must be a function");return it(t.render,"Applet descriptor single-pane render"),{type:"single-pane",render:t.render}}if(!("slots"in t))throw new Error(`Applet descriptor declares ${r} but no slots were provided`);return r==="two-pane"?(_n(t.slots,"Applet descriptor two-pane"),{type:"two-pane",slots:t.slots}):(bl(t.slots,"Applet descriptor three-pane"),{type:"three-pane",contextConfig:n.context,slots:t.slots})}if(e.manifest.layout==="single-pane"){if(!("render"in e))throw new Error("Applet manifest declares single-pane but no single-pane renderer was provided");return it(e.render,"Applet single-pane render"),{type:"single-pane",render:e.render}}if(e.manifest.layout==="two-pane"&&"slots"in e)return _n(e.slots,"Applet two-pane"),{type:"two-pane",slots:e.slots};throw new Error(`Applet manifest declares ${e.manifest.layout} but no supported applet layout was provided`)}function _n(e,t){wl(e,t),it(e.listHeader,`${t} slot listHeader`),it(e.list,`${t} slot list`),it(e.mainHeader,`${t} slot mainHeader`),it(e.main,`${t} slot main`)}function bl(e,t){_n(e,t),it(e.context,`${t} slot context`)}function wl(e,t){if(typeof e!="object"||e===null)throw new Error(`${t} slots must be an object`)}function it(e,t){if(typeof e!="function")throw new Error(`${t} must be a function`)}function Cl(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("Applet descriptor layout must be an object");if(!("descriptor"in e)||e.descriptor===void 0)throw new Error("Applet descriptor required");return e}const vl="data:image/png;base64,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",El="data:image/png;base64,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",Il="data:image/png;base64,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",jl="data:image/png;base64,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",kl="data:image/png;base64,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",Pl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAABRxJREFUeAHtnaFTG0EUxh9MLQy1YK4KJMyAT1EoKAYDM23BgKIGFDOFwaFSBQamzIDBdFDgGoMCgQTVGNAM/AF0v8tee9lsQjbZt7m929/MJtcjaciXl7dvv+PuEQUCgYAxfdQBr6+vkbgriTEkRxF4EqOK0dfXd0uGtC20EBeCrovxRYyIik1VjJ9iHAvRq+08oS2hhcgQeJtk9N7f39P19TU9Pj7Sy8sLFYHh4WEaGBigqakpGh0dTXYjystC7J23nt9SaBnFv6iWJuj8/JxOT0/p7u6OigxEX1tbo7m5uWRXRYyvraK7qdBS5N9ijCNy19fX40gO/AeCHx0dxfdUSycTQuwn3WNbCQ2RSxB3eXm5MCnCFKSTw8NDGhsbwz8rQuiPusf163YKkb+LuxIiOYjcGmizsrKSpNOS0O6b7nENES1LN0RzNDMzE094gbdB+ri8vMQmUscHNYXoIvqTGBEmviBy+0Cr/f19bGJua4hqXUT/oRDNHYF8fXV1hc0nEdHv0z+ri2iZNiJMgEFkc5Cvb25usDkktfyHmjrGcYPFSKAzUmuMUnq/KnSEm1BldE4qE0Tp/arQQ8qDA4Y0C9J+CjghCO2IILQjgtCOeEeWgGWYsg3Z2dvbq7Nrl5aWaHp6mmyDUleu+LrCmtBY609OTpIL8MbTIsOM39zcJNug+oIVYQPvUkfKU4gZGRmh3d1d4gCvY6vU9U5o2LZpVldXE+PdKohkW9EMvBJajTDkZY55Qf3W2MAboWHWqCkDx+04wGE726tjL4SGyFtbW3X7cPgItqRt8GFyHBu1VnUgn0mL0CrPz88NbxyRzJGXOVJGgjWh8Uu6MKO4UgbMIHWitYlXk+Hg4GCcMjiwWcrp8EpozlLu5OSEOPFGaJRxKOdsw5mX03ghNGcpx50yErwQGktsjpSBdGFz9deKzAuNSOYwqxDFcABdkWmhOVMGZymnI9NC+1rK6cis0FyrP9UzcUUmhYaRz5EyEMWqZ+KKzAnti5FvSuaE9sXINyVTQvtk5JuSGaF9M/JNyYzQvhn5pmRCaB+NfFN6LrSvRr4pPRXaZyPflJ4K7bORb0rPhPbdyDelJ0Lnwcg3pSdC58HIN8W50Hkx8k1xKnSejHxTnApdlFJOhzOh82bkm+JE6Dwa+aawC51XI98UdqHzauSbwip0no18U9iEzruRb4q1v49WcWnk48JRHK+FD/Ph4YFswCK0KyM/mWi5zm/Ea9lKUdZTh0sjf2Njw9lJpN1iVWiXRj4+TI5TkrmwKrQrI59zouXCmtAujXyubw0nVoR2aeRzTbTcWKk6ZmdnWU5/wyUc0qs/fKDwTTjOZ9Rh8/1YEdpmGdQK1LRZ952bEa5A44ggtCOC0I4IQjtCFTq+5jGHQVMUmmmnFdrHOjUrpLSr69WiCl3BDWrVQGektKum99cJLdtbVNFnRDYHCBiABZXs0dLQfUg3GR7jZnFxkQJmwFSTHKs/0116Hpc2xuXnhxYWFgrf3KZdEM0XFxfYxDw3oTa/aYho2W0hbklULpdjjznQGsWH/6HrMNRWwxv0GcFFpAKNJCLL3GzW8EYyL8Yt/oOzs7P4qxGoBwUDtEkmQKpppsW4KdnBwYG1I8O+AmGVv1mpiDHfrE8WaLfN3ra4+0yyQUDSZg8HTIvSDwArPixGNG32doTA5beeb9I4MqJa1yH0Noyo2FSpVsKVW0Vxmm5aoaJnC+6L1AoVo9JuV85AIBDokr8WvnnavEglMwAAAABJRU5ErkJggg==",Dl="data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cpath%20d%3D%22M16.361%2010.26a.894.894%200%200%200-.558.47l-.072.148.001.207c0%20.193.004.217.059.353.076.193.152.312.291.448.24.238.51.3.872.205a.86.86%200%200%200%20.517-.436.752.752%200%200%200%20.08-.498c-.064-.453-.33-.782-.724-.897a1.06%201.06%200%200%200-.466%200zm-9.203.005c-.305.096-.533.32-.65.639a1.187%201.187%200%200%200-.06.52c.057.309.31.59.598.667.362.095.632.033.872-.205.14-.136.215-.255.291-.448.055-.136.059-.16.059-.353l.001-.207-.072-.148a.894.894%200%200%200-.565-.472%201.02%201.02%200%200%200-.474.007Zm4.184%202c-.131.071-.223.25-.195.383.031.143.157.288.353.407.105.063.112.072.117.136.004.038-.01.146-.029.243-.02.094-.036.194-.036.222.002.074.07.195.143.253.064.052.076.054.255.059.164.005.198.001.264-.03.169-.082.212-.234.15-.525-.052-.243-.042-.28.087-.355.137-.08.281-.219.324-.314a.365.365%200%200%200-.175-.48.394.394%200%200%200-.181-.033c-.126%200-.207.03-.355.124l-.085.053-.053-.032c-.219-.13-.259-.145-.391-.143a.396.396%200%200%200-.193.032zm.39-2.195c-.373.036-.475.05-.654.086-.291.06-.68.195-.951.328-.94.46-1.589%201.226-1.787%202.114-.04.176-.045.234-.045.53%200%20.294.005.357.043.524.264%201.16%201.332%202.017%202.714%202.173.3.033%201.596.033%201.896%200%201.11-.125%202.064-.727%202.493-1.571.114-.226.169-.372.22-.602.039-.167.044-.23.044-.523%200-.297-.005-.355-.045-.531-.288-1.29-1.539-2.304-3.072-2.497a6.873%206.873%200%200%200-.855-.031zm.645.937a3.283%203.283%200%200%201%201.44.514c.223.148.537.458.671.662.166.251.26.508.303.82.02.143.01.251-.043.482-.08.345-.332.705-.672.957a3.115%203.115%200%200%201-.689.348c-.382.122-.632.144-1.525.138-.582-.006-.686-.01-.853-.042-.57-.107-1.022-.334-1.35-.68-.264-.28-.385-.535-.45-.946-.03-.192.025-.509.137-.776.136-.326.488-.73.836-.963.403-.269.934-.46%201.422-.512.187-.02.586-.02.773-.002zm-5.503-11a1.653%201.653%200%200%200-.683.298C5.617.74%205.173%201.666%204.985%202.819c-.07.436-.119%201.04-.119%201.503%200%20.544.064%201.24.155%201.721.02.107.031.202.023.208a8.12%208.12%200%200%201-.187.152%205.324%205.324%200%200%200-.949%201.02%205.49%205.49%200%200%200-.94%202.339%206.625%206.625%200%200%200-.023%201.357c.091.78.325%201.438.727%202.04l.13.195-.037.064c-.269.452-.498%201.105-.605%201.732-.084.496-.095.629-.095%201.294%200%20.67.009.803.088%201.266.095.555.288%201.143.503%201.534.071.128.243.393.264.407.007.003-.014.067-.046.141a7.405%207.405%200%200%200-.548%201.873c-.062.417-.071.552-.071.991%200%20.56.031.832.148%201.279L3.42%2024h1.478l-.05-.091c-.297-.552-.325-1.575-.068-2.597.117-.472.25-.819.498-1.296l.148-.29v-.177c0-.165-.003-.184-.057-.293a.915.915%200%200%200-.194-.25%201.74%201.74%200%200%201-.385-.543c-.424-.92-.506-2.286-.208-3.451.124-.486.329-.918.544-1.154a.787.787%200%200%200%20.223-.531c0-.195-.07-.355-.224-.522a3.136%203.136%200%200%201-.817-1.729c-.14-.96.114-2.005.69-2.834.563-.814%201.353-1.336%202.237-1.475.199-.033.57-.028.776.01.226.04.367.028.512-.041.179-.085.268-.19.374-.431.093-.215.165-.333.36-.576.234-.29.46-.489.822-.729.413-.27.884-.467%201.352-.561.17-.035.25-.04.569-.04.319%200%20.398.005.569.04a4.07%204.07%200%200%201%201.914.997c.117.109.398.457.488.602.034.057.095.177.132.267.105.241.195.346.374.43.14.068.286.082.503.045.343-.058.607-.053.943.016%201.144.23%202.14%201.173%202.581%202.437.385%201.108.276%202.267-.296%203.153-.097.15-.193.27-.333.419-.301.322-.301.722-.001%201.053.493.539.801%201.866.708%203.036-.062.772-.26%201.463-.533%201.854a2.096%202.096%200%200%201-.224.258.916.916%200%200%200-.194.25c-.054.109-.057.128-.057.293v.178l.148.29c.248.476.38.823.498%201.295.253%201.008.231%202.01-.059%202.581a.845.845%200%200%200-.044.098c0%20.006.329.009.732.009h.73l.02-.074.036-.134c.019-.076.057-.3.088-.516.029-.217.029-1.016%200-1.258-.11-.875-.295-1.57-.597-2.226-.032-.074-.053-.138-.046-.141.008-.005.057-.074.108-.152.376-.569.607-1.284.724-2.228.031-.26.031-1.378%200-1.628-.083-.645-.182-1.082-.348-1.525a6.083%206.083%200%200%200-.329-.7l-.038-.064.131-.194c.402-.604.636-1.262.727-2.04a6.625%206.625%200%200%200-.024-1.358%205.512%205.512%200%200%200-.939-2.339%205.325%205.325%200%200%200-.95-1.02%208.097%208.097%200%200%201-.186-.152.692.692%200%200%201%20.023-.208c.208-1.087.201-2.443-.017-3.503-.19-.924-.535-1.658-.98-2.082-.354-.338-.716-.482-1.15-.455-.996.059-1.8%201.205-2.116%203.01a6.805%206.805%200%200%200-.097.726c0%20.036-.007.066-.015.066a.96.96%200%200%201-.149-.078A4.857%204.857%200%200%200%2012%203.03c-.832%200-1.687.243-2.456.698a.958.958%200%200%201-.148.078c-.008%200-.015-.03-.015-.066a6.71%206.71%200%200%200-.097-.725C8.997%201.392%208.337.319%207.46.048a2.096%202.096%200%200%200-.585-.041Zm.293%201.402c.248.197.523.759.682%201.388.03.113.06.244.069.292.007.047.026.152.041.233.067.365.098.76.102%201.24l.002.475-.12.175-.118.178h-.278c-.324%200-.646.041-.954.124l-.238.06c-.033.007-.038-.003-.057-.144a8.438%208.438%200%200%201%20.016-2.323c.124-.788.413-1.501.696-1.711.067-.05.079-.049.157.013zm9.825-.012c.17.126.358.46.498.888.28.854.36%202.028.212%203.145-.019.14-.024.151-.057.144l-.238-.06a3.693%203.693%200%200%200-.954-.124h-.278l-.119-.178-.119-.175.002-.474c.004-.669.066-1.19.214-1.772.157-.623.434-1.185.68-1.382.078-.062.09-.063.159-.012z%22/%3E%3C/svg%3E",Fl={openai:vl,anthropic:El,kimi:Il,bailian:kl,zhipu:Pl,ollama:Dl,deepseek:jl},Ul={kimi:"#000000",ollama:"#FFFFFF"};function un(e){return Fl[e]}function fn(e){return Ul[e]}const Ie=[{id:"openai",name:"OpenAI",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"OpenAI 模型与编码能力",homeUrl:"https://openai.com",apiKeyUrl:"https://platform.openai.com/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.openai.com/v1"},{id:"anthropic",name:"Anthropic",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"Claude 模型与编码能力",homeUrl:"https://www.anthropic.com",apiKeyUrl:"https://console.anthropic.com/settings/keys",apiKeyPlaceholder:"sk-ant-...",defaultBaseUrl:"https://api.anthropic.com"},{id:"kimi",name:"Kimi",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"Moonshot AI 模型服务",homeUrl:"https://www.moonshot.cn",apiKeyUrl:"https://platform.moonshot.cn/console/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.moonshot.cn/v1"},{id:"bailian",name:"百炼",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"阿里云百炼模型服务",homeUrl:"https://www.aliyun.com/product/bailian",apiKeyUrl:"https://bailian.console.aliyun.com/#/api-key",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1"},{id:"deepseek",name:"DeepSeek",browserMode:"connectUnsupported",browserLabel:"不支持登录",description:"DeepSeek 模型服务",homeUrl:"https://www.deepseek.com",apiKeyUrl:"https://platform.deepseek.com/api_keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.deepseek.com/v1"},{id:"zhipu",name:"智谱 AI",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"智谱 AI / GLM 模型服务",homeUrl:"https://open.bigmodel.cn",apiKeyUrl:"https://open.bigmodel.cn/usercenter/apikeys",apiKeyPlaceholder:"id.secret-...",defaultBaseUrl:"https://open.bigmodel.cn/api/paas/v4"},{id:"ollama",name:"Ollama",browserMode:"connectUnsupported",browserLabel:"本地服务",description:"本地 Ollama 模型服务",homeUrl:"https://ollama.com",defaultBaseUrl:"http://localhost:11434/v1"},{id:"custom",name:"Custom",browserMode:"browserAssistedApiKey",browserLabel:"配置",description:"OpenAI / Anthropic 兼容的自定义模型服务",homeUrl:"https://undefineds.co",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://example.com/v1"}],br=[{id:"keys",label:"API Keys",title:"API KEYS"}];if(Ie.map(e=>e.id).join(",")!==Ca.join(","))throw new Error("AI Connection provider UI is out of sync with the client catalog");class Lr extends Error{}function Bl(e){const t=e.solid.session.getSnapshot(),n=e.solid.pod,r=n?.status==="ready"?n:void 0,o=t.status==="authenticated"&&r!==void 0;let s=0,i,c;const d=new Set,u=()=>{const y=e.solid.session.getSnapshot();return o&&y.status==="authenticated"&&y.webId===t.webId},f=()=>{s+=1,c=void 0,i=void 0;for(const y of d)y.cancel()},h=()=>{const y=s;let w=!u(),S=!1,N=()=>{};const H={assertCurrent(){if(w||y!==s||!u())throw new Lr},dispose(){S||(S=!0,d.delete(H),N())},cancel(){w=!0,H.dispose()}};d.add(H);let q=!0;return N=e.solid.session.subscribe(B=>{(!q||B.status!=="authenticated"||B.webId!==t.webId)&&f()}),q=!1,S&&N(),H},A=o?Ml(Sl(Is({webId:t.webId,podBaseUrl:r.current.podUrl,authenticatedFetch:e.solid.session.fetch}),e.capabilities.aiClientCredentials),e.capabilities.aiConnectionsPodStore,h):null;let g="keys",I="openai",m,E="",P={},x={},F;const v=new Set,M=()=>v.forEach(y=>y()),j={client:A,openExternal:e.navigation.openExternal,clientConfigurationBridge:e.capabilities.aiClientConfiguration,get selectedSection(){return g},get selectedProvider(){return I},get selectedCredentialId(){return m},get searchQuery(){return E},get providerStates(){return P},get providerSummaries(){return x},get providerLoadError(){return F},selectSection(y){g!==y&&(g=y,M())},selectProvider(y,w){const S=y==="custom"?w:void 0;g==="provider"&&I===y&&m===S||(g="provider",I=y,m=S,M())},selectFirstUnconfiguredProvider(){const y=Ie.findIndex(N=>N.id===I),S=(y<0?Ie:[...Ie.slice(y+1),...Ie.slice(0,y+1)]).find(N=>P[N.id]==="unconfigured"&&N.id!==I)??Ie.find(N=>P[N.id]==="unconfigured")??Ie[0];S&&j.selectProvider(S.id)},setSearchQuery(y){E!==y&&(E=y,M())},setProviderState(y,w){if(P[y]===w)return;s+=1,P={...P,[y]:w};const S=x[y]?void 0:ql(y,w);S&&(x={...x,[y]:S}),M()},cancelProviderLoads:f,async loadProviders(){if(!A)return;if(i)return i;const y={};c=y;const w=++s,S=Promise.resolve().then(async()=>{if(c===y){F=void 0,M();try{const N=await A.listProviders();if(w!==s||!u())return;x=Object.fromEntries(N.map(H=>[H.id,H])),P=Object.fromEntries(Ie.map(H=>[H.id,Ol(x[H.id])])),M()}catch(N){if(N instanceof Lr||w!==s||!u())return;F=Hl(N),M()}finally{c===y&&(c=void 0,i=void 0)}}});return i=S,S},subscribe(y){return v.add(y),()=>v.delete(y)}};return j}function Sl(e,t){return{...e,async createGatewayKey(n){if(!t)throw new Error("当前账号登录状态不支持创建客户端凭据。");const r=await t.create({name:n.name,webId:e.webId});try{return await e.createGatewayKey({...n,apiKey:r.apiKey,credentialResource:r.resource})}catch(o){try{await t.revoke({clientId:Vl(r.apiKey),resource:r.resource,webId:e.webId})}catch{throw new Error("API Key 未能保存到 Pod,且账号凭据撤销失败。该凭据尚未应用到客户端。")}throw o}},async deleteGatewayKey(n){const r=(await e.listGatewayKeys()).find(o=>o.id===n);if(r?.kind==="client-credentials"){if(!t||!r.clientCredentialId)throw new Error("当前账号登录状态无法撤销此客户端凭据,Key 记录已保留。");const s=(await t.list()).find(i=>i.clientId===r.clientCredentialId);if(!s)throw new Error("账号服务中已找不到该客户端凭据,请刷新后重试。");await t.revoke({clientId:s.clientId,resource:s.resource,webId:e.webId})}await e.deleteGatewayKey(n)}}}function Ml(e,t,n){const r=async()=>{const c=n();try{c.assertCurrent();const d=t?await t.listProviders():await e.listProviders();if(c.assertCurrent(),!t)return d;const u=e.listAuthorizationMethods?await e.listAuthorizationMethods():[];return c.assertCurrent(),Ll(d,u)}finally{c.dispose()}};if(!t)return{...e,listProviders:r};const o=new Map,s=t.readCredentialSecret&&t.updateOAuthCredential?(c,d)=>{const u=JSON.stringify([c,d]),f=o.get(u);if(f)return f;const h=(async()=>{const g=(await t.listProviders()).find(F=>F.id===c)?.credentials.find(F=>F.id===d);if(!g)throw new Error("oauth_credential_not_found");const I=await t.readCredentialSecret(c,d),m=typeof I.refreshToken=="string"?I.refreshToken:void 0;if(!m)throw new Error("oauth_refresh_token_required");const E=await e.refreshOAuthCredential(c,d,m,g.version,g.offeringId,I.authorizationMethodId==="browser-oauth"?"authorizationCodeOAuth":void 0);if(E.status!=="completed"||!E.oauthCredential)throw new Error("oauth_refresh_failed");await t.updateOAuthCredential(c,d,g.version,E.oauthCredential);const{oauthCredential:P,...x}=E;return x})().finally(()=>{o.delete(u)});return o.set(u,h),h}:e.refreshOAuthCredential,i=async(c,d,u=!1)=>{let f=!1,h=await t.readCredentialSecret(c,d.id);const A=typeof h.expiresAt=="string"?h.expiresAt:d.expiresAt;if((d.authMode==="oauth"||d.authMode==="deviceCode")&&(u||A&&Date.parse(A)<=Date.now()+6e4)){if(!t.updateOAuthCredential)throw new Error("oauth_refresh_unavailable");await s(c,d.id,"",d.version);const I=(await t.listProviders()).find(m=>m.id===c)?.credentials.find(m=>m.id===d.id);if(!I)throw new Error("oauth_credential_not_found");f=!0,d=I,h=await t.readCredentialSecret(c,d.id)}return{credential:d,secret:h,didRefresh:f}};return{...e,listProviders:r,listModels:t.listModels?async()=>t.listModels():e.listModels,createApiKeyCredential:t.createApiKeyCredential?async(c,d)=>t.createApiKeyCredential(c,d):e.createApiKeyCredential,createLocalCredential:t.createLocalCredential?async(c,d)=>d.authorizationMethodId==="local-session-import"||!d.authorizationMethodId&&d.offeringId==="official-subscription"?e.createLocalCredential(c,d):t.createLocalCredential(c,d):e.createLocalCredential,updateProviderCredential:t.updateProviderCredential?async(c,d,u)=>t.updateProviderCredential(c,d,u):e.updateProviderCredential,deleteProviderCredential:t.deleteProviderCredential?async(c,d)=>t.deleteProviderCredential(c,d):e.deleteProviderCredential,pollDevice:t.saveOAuthCredential?async(c,d)=>{const u=await e.pollDevice(c,d);if(u.status!=="completed"||!u.oauthCredential)return u;const f=await t.saveOAuthCredential(c,u.oauthCredential),{oauthCredential:h,...A}=u;return{...A,credentialId:f?.id??u.credentialId}}:e.pollDevice,refreshOAuthCredential:s,quota:t.readCredentialSecret?async(c,d=!1,u)=>{const h=(await t.listProviders()).find(E=>E.id===c)?.credentials??[],A=u?.credentialId??u?.credentialIri,g=A?h.find(E=>E.id===A):h.find(E=>E.enabled&&(!u?.offeringId||E.offeringId===u.offeringId));if(!g)throw new Error("quota_credential_not_found");const{secret:I}=await i(c,g),m=Sn(I,g.authMode);if(!m)throw new Error("credential_secret_unavailable");return e.quotaFromSecret(c,{credentialId:g.id,credentialIri:g.id,authMode:g.authMode==="deviceCode"||g.authMode==="oauth"?"deviceCodeOAuth":"apiKey",offeringId:g.offeringId,baseUrl:g.baseUrl,proxyUrl:g.proxyUrl,compatibility:g.compatibility,secret:m})}:e.quota,disconnect:async(c,d)=>!d||!t.deleteProviderCredential?e.disconnect(c,d):await t.deleteProviderCredential(c,d),testProviderCredential:t.readCredentialSecret?async(c,d)=>{let f=(await t.listProviders()).find(E=>E.id===c)?.credentials.find(E=>E.id===d.credentialId);if(!f)throw new Error("test_credential_not_found");const h=await i(c,f);f=h.credential;const{secret:A}=h,g=Sn(A,f.authMode);if(!g)throw new Error("test_secret_missing");let I;try{I=await e.discoverModels(c,{credentialId:f.id,offeringId:f.offeringId,authMode:f.authMode==="deviceCode"||f.authMode==="oauth"?"deviceCodeOAuth":f.authMode==="local"?"local":"apiKey",secret:g,baseUrl:f.baseUrl,proxyUrl:f.proxyUrl,compatibility:f.compatibility})}catch(E){throw await t.markCredentialHealth?.(c,f.id,"invalid",f.version).catch(()=>{}),E}const m=await t.markCredentialHealth?.(c,f.id,"healthy",f.version);return{ok:!0,credentialId:f.id,...m?{credential:m}:{},modelCount:I.models.length,observedAt:I.observedAt}}:e.testProviderCredential,discoverModels:t.readCredentialSecret?async(c,d)=>{const h=(await t.listProviders()).find(x=>x.id===c)?.credentials.filter(x=>x.enabled&&(!d?.offeringId||x.offeringId===d.offeringId)&&(!d?.credentialId||x.id===d.credentialId))??[];if(h.length===0)throw new Error("models_credential_not_found");const A=x=>JSON.stringify([c,x.offeringId,(x.baseUrl??"").trim().replace(/\/+$/u,""),d?.compatibility??x.compatibility??"auto",c==="custom"?x.id:void 0]),g=new Map;for(const x of[...h].sort((F,v)=>F.priority-v.priority)){const F=A(x),v=g.get(F)??[];v.push(x),g.set(F,v)}const I=await Promise.allSettled([...g.values()].map(async x=>{let F;for(const v of x)try{let M=await i(c,v);const j=()=>{const w=Sn(M.secret,v.authMode);if(!w)throw new Error("models_secret_missing");return e.discoverModels(c,{credentialId:v.id,offeringId:v.offeringId,authMode:v.authMode==="deviceCode"||v.authMode==="oauth"?"deviceCodeOAuth":v.authMode==="local"?"local":"apiKey",secret:w,baseUrl:v.baseUrl,proxyUrl:v.proxyUrl,compatibility:d?.compatibility??v.compatibility})};let y;try{y=await j()}catch(w){if(M.didRefresh||!(w instanceof js)||w.code!=="provider_models_fetch_failed"||w.providerStatus!==401||v.authMode!=="oauth"&&v.authMode!=="deviceCode")throw w;M=await i(c,M.credential,!0),y=await j()}return{...y,credential:v.id,credentialVersion:M.credential.version,models:y.models.map(w=>({...w,offeringId:v.offeringId,...c==="custom"?{credentialId:v.id}:{}}))}}catch(M){F=M}throw F})),m=I.flatMap(x=>x.status==="fulfilled"?[x.value]:[]);if(m.length===0)throw I[0].reason;for(const x of m)await t.markCredentialHealth?.(c,x.credential,"healthy",x.credentialVersion);const E=x=>`${x.offeringId}\0${x.credentialId??""}\0${("resourceId"in x?x.resourceId:void 0)??x.id}`;if(t.saveDiscoveredModels)try{const x=new Set([...g.values()].flatMap((v,M)=>I[M]?.status==="rejected"?[v[0].offeringId]:[])),F=new Map;for(const v of m){const M=h.find(w=>w.id===v.credential);if(c!=="custom"&&x.has(M.offeringId))continue;const j=c==="custom"?M.id:M.offeringId,y=F.get(j)??{credential:M.id,models:[]};y.models.push(...v.models),F.set(j,y)}for(const v of F.values())await t.saveDiscoveredModels(c,v.credential,[...new Map(v.models.map(M=>[E(M),M])).values()])}catch{throw new Error("models_persistence_failed")}const P=[...new Map(m.flatMap(x=>x.models).map(x=>[E(x),x])).values()];return{...m[0],models:P,complete:m.length===g.size}}:e.discoverModels,saveModelSelection:t.saveModelSelection?async(c,d,u)=>t.saveModelSelection(c,d,u):e.saveModelSelection}}function wr(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedSection??"provider",()=>e.selectedSection??"provider")}function Cr(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedProvider,()=>e.selectedProvider)}function Po(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedCredentialId,()=>e.selectedCredentialId)}function Do(e){return p.useSyncExternalStore(e.subscribe,()=>e.searchQuery,()=>e.searchQuery)}function Nl(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerStates,()=>e.providerStates)}function Rl(e){return p.useSyncExternalStore(e.subscribe,()=>qr(e.providerSummaries),()=>qr(e.providerSummaries))}function vr(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerSummaries,()=>e.providerSummaries)}function Fo(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerLoadError,()=>e.providerLoadError)}function Ol(e){if(!e||e.status==="unconfigured"||e.status==="unavailable")return"unconfigured";if(e.status==="configured")return"configured";if(e.status==="attention")return"attention";const t=Uo(e);return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}const Qr=new WeakMap;function qr(e){const t=Qr.get(e);if(t)return t;const n=Object.fromEntries(Object.values(e).filter(Bo).map(r=>[r.id,Kl(r)]));return Qr.set(e,n),n}function Kl(e){const t=Uo(e),n=e.status==="available"?"connected":e.status==="attention"?"reauthRequired":"disconnected",r=t?.authMode;return{provider:e.id,status:n,authMode:r==="oauth"||r==="deviceCode"?"deviceCodeOAuth":r?"browserAssistedApiKey":void 0,accountLabel:t?.label,expiresAt:t?.expiresAt,reauthRequired:n==="reauthRequired"?!0:void 0,credentialIri:t?.id,version:t?.version,connect:{modes:Tl(e),configured:e.status!=="unavailable"}}}function Tl(e){const t=[...e.offerings.flatMap(n=>n.authModes??[]),...e.credentials.map(n=>n.authMode)].map(n=>n==="oauth"||n==="deviceCode"?"deviceCodeOAuth":n==="apiKey"||n==="local"?"browserAssistedApiKey":void 0).filter(Bo);return t.length>0?[...new Set(t)]:["browserAssistedApiKey"]}function Uo(e){return e.credentials.find(t=>t.enabled)??e.credentials[0]}function Ll(e,t){if(t.length===0)return e;const n=new Map(t.map(r=>[`${r.provider}:${r.offeringId}`,r]));return e.map(r=>({...r,offerings:r.offerings.map(o=>{const s=n.get(`${r.id}:${o.id}`);if(!s)return o;const i=s.authorizationMethods;return{...o,...s.endpoints?{endpoints:s.endpoints}:{},...i.length?{authorizationMethods:i,authModes:Ql(o.authModes,i.map(c=>c.authMode))}:{}}})}))}function Ql(e,t){return Array.from(new Set([...e??[],...t]))}function ql(e,t){if(t==="configured")return{id:e,name:Bn(e),offerings:[],credentials:[Hr(e,"apiKey")],selectedModels:[],status:"available"};if(t==="connected")return{id:e,name:Bn(e),offerings:[],credentials:[Hr(e,"deviceCode")],selectedModels:[],status:"available"};if(t!=="attention"&&t!=="loading")return{id:e,name:Bn(e),offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function Hr(e,t){return{id:`${e}:current`,offeringId:t==="deviceCode"||t==="oauth"?"official-subscription":"api-platform",authMode:t,enabled:!0,priority:0,health:"healthy",version:0}}function Bn(e){return Ie.find(t=>t.id===e)?.name??e}function Sn(e,t){if(t==="deviceCode"||t==="oauth"){const r=typeof e.accessToken=="string"&&e.accessToken.trim()?e.accessToken:void 0;return r?{type:"oauth",accessToken:r}:void 0}if(t==="local")return{type:"local"};const n=typeof e.apiKey=="string"&&e.apiKey.trim()?e.apiKey:void 0;return n?{type:"apiKey",apiKey:n}:void 0}function Bo(e){return e!==void 0}function Hl(e){return va(e)}function Vl(e){const t=atob(e.replace(/^sk-/u,"")),n=t.indexOf(":");if(n<=0)throw new Error("客户端凭据格式无效。");return t.slice(0,n)}function zl({controller:e}){const t=p.useContext(Ds),n=wr(e),r=Cr(e),o=Po(e),s=Do(e).trim().toLocaleLowerCase(),i=Nl(e),c=vr(e),d=Fo(e),u=Ie.reduce((m,E)=>{if(E.id!=="custom")return[...m,{...E}];const P=c.custom?.credentials??[];return[...m,...P.map(x=>({...E,name:x.label||E.name,credentialId:x.id}))]},[]),f=s?u.filter(m=>Mn(m,c).toLocaleLowerCase().includes(s)):u,h=[...br.map(m=>({kind:"section",id:m.id,label:m.label})),...f.map(m=>({kind:"provider",provider:m}))],A=p.useRef([]),g=h.findIndex(m=>m.kind==="section"?n===m.id:n==="provider"&&m.provider.id===r&&m.provider.credentialId===o),I=m=>{m.kind==="section"?e.selectSection(m.id):e.selectProvider(m.provider.id,m.provider.credentialId),t?.mode==="stack"&&t.openMain()};return a.jsxs("div",{role:"listbox","aria-label":"AI 服务","aria-orientation":"vertical",className:"py-2",children:[a.jsx("section",{className:"mb-3","aria-label":"API Keys",children:h.filter(m=>m.kind==="section").map(m=>{const E=h.indexOf(m);return a.jsxs(Vr,{index:E,selected:n===m.id,tabbable:g===E||g<0&&E===0,label:m.label,optionRefs:A,onActivate:()=>I(m),onMove:P=>zr(h,P,e,A),children:[a.jsx(Jl,{section:m.id}),a.jsx("span",{className:me("min-w-0 flex-1 truncate text-sm font-medium",n===m.id?"text-foreground":"text-foreground/80"),children:m.label})]},m.id)})}),a.jsxs("section",{children:[a.jsx("h2",{className:"px-5 py-1 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Provider"}),f.map(m=>{const E=h.findIndex(F=>F.kind==="provider"&&F.provider.id===m.id&&F.provider.credentialId===m.credentialId),P=n==="provider"&&r===m.id&&m.credentialId===o,x=i[m.id]??"loading";return a.jsxs(Vr,{index:E,selected:P,tabbable:P||g<0&&E===0,label:Mn(m,c),describedBy:`ai-connections-provider-${m.id}-${m.credentialId??"default"}-status`,optionRefs:A,onActivate:()=>I({kind:"provider",provider:m}),onMove:F=>zr(h,F,e,A),children:[a.jsxs(gn,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20",style:fn(m.id)?{backgroundColor:fn(m.id)}:void 0,children:[a.jsx(wa,{src:un(m.id),className:"object-cover"}),a.jsx(An,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:Xl(m.id)})]}),a.jsx("span",{className:me("min-w-0 flex-1 truncate text-sm font-medium",P?"text-foreground":"text-foreground/80"),children:Mn(m,c)}),a.jsx(Gl,{state:x,statusId:`ai-connections-provider-${m.id}-${m.credentialId??"default"}-status`})]},`${m.id}:${m.credentialId??"default"}`)}),f.length===0?a.jsx("p",{className:"p-8 text-center text-xs text-muted-foreground",children:"无结果"}):null]}),d?a.jsxs("p",{className:"px-4 py-2 text-xs text-destructive",children:["Provider 状态读取失败:",d]}):null]})}function Vr({index:e,selected:t,tabbable:n,label:r,describedBy:o,statusId:s,optionRefs:i,onActivate:c,onMove:d,children:u}){const f=h=>{if(h.key==="ArrowDown")d(e+1);else if(h.key==="ArrowUp")d(e-1);else if(h.key==="Home")d(0);else if(h.key==="End")d(Number.POSITIVE_INFINITY);else if(h.key==="Enter"||h.key===" "){h.preventDefault(),c();return}else return;h.preventDefault()};return a.jsx("button",{ref:h=>{i.current[e]=h},type:"button",role:"option","aria-selected":t,"aria-label":r,"aria-describedby":o??s,tabIndex:n?0:-1,onClick:c,onKeyDown:f,className:me("group flex w-full items-center gap-3 border-l-[3px] border-transparent px-4 py-3 text-left transition-colors",t?"border-l-primary bg-accent/80":"hover:bg-muted/40"),children:u})}function zr(e,t,n,r){const o=Math.min(Math.max(t,0),e.length-1),s=e[o];s&&(s.kind==="section"?n.selectSection(s.id):n.selectProvider(s.provider.id,s.provider.credentialId),r.current[o]?.focus())}function Jl({section:e}){return a.jsx(gn,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20 bg-muted",children:a.jsx(An,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:"XP"})})}function Gl({state:e,statusId:t}){const n=e==="configured"||e==="connected";return a.jsxs("span",{id:t,role:"status","aria-live":"polite",className:"flex shrink-0 items-center gap-1.5",children:[n?a.jsx("span",{className:"h-2 w-2 rounded-full bg-primary","aria-hidden":"true"}):null,a.jsx("span",{className:"text-[11px] font-normal text-muted-foreground",children:Yl(e)})]})}function Xl(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS";case"zhipu":return"智";case"ollama":return"O";case"custom":return"C"}}function Mn(e,t){return e.name||t[e.id]?.name||e.id}function Yl(e){switch(e){case"unconfigured":return"未设置";case"configured":return"已配置";case"connected":return"已连接";case"attention":return"需处理";default:return"读取中"}}function At(e){if(e.authorizationMethods?.length)return e.authorizationMethods;const t=e.lifecycle==="unavailable"?"unavailable":"active";return[...new Set(e.authModes??[])].map(n=>{if(n==="apiKey")return{id:"api-key",authMode:"apiKey",connectMode:"browserAssistedApiKey",label:"API Key",lifecycle:t};if(n==="local"){const r=e.kind==="local";return{id:r?"local-service":"local-session-import",authMode:"local",label:r?"本地服务":"已有登录态",lifecycle:t}}return{id:"device-code",authMode:n,connectMode:"deviceCodeOAuth",label:"",lifecycle:t}})}function kn(e){if(e.connectMode)return e.connectMode;if(e.authMode==="oauth"||e.authMode==="deviceCode")return"deviceCodeOAuth";if(e.authMode==="apiKey")return"browserAssistedApiKey"}function ct(e){return e==="deviceCodeOAuth"||e==="authorizationCodeOAuth"}function $n(e){return ct(kn(e))}function So(e){return e.authMode==="apiKey"||kn(e)==="browserAssistedApiKey"}function er(e){return e.authMode==="local"}function Wl(e,t){const n=e.authModes??[];return n.some(r=>r==="oauth"||r==="deviceCode")?"deviceCodeOAuth":n.some(r=>r==="apiKey"||r==="local")||t.browserMode==="connectUnsupported"?"browserAssistedApiKey":t.browserMode}function sn(e){return e?.status==="pending"||e?.status==="authorization_pending"||e?.status==="slow_down"}const Mo={"oauth-subscription":"Subscription","api-platform":"API Platform","token-plan":"Token Plan",local:"Local"};function Ce(e){const t=e.label?.trim();if(t)return t;const n=e.kind?Mo[e.kind]:void 0;return n||(e.authModes?.some(r=>r==="apiKey")?"API Key":e.authModes?.some(r=>r==="oauth"||r==="deviceCode")?"Account":e.id)}function Zl(e){return Mo[e]??e}function _l(e,t){const n=(t?.length?t:At(e)).map(r=>r.authMode==="apiKey"?"API Key":r.authMode==="local"?r.label:"账号授权");return[...new Set(n)].join(" / ")}function $l(e){return e.length===0?10:Math.max(...e.map(t=>t.priority))+10}function yt(e){return e.label?.trim()?e.label:e.maskedHint?`API Key · ${e.maskedHint}`:e.authMode==="oauth"||e.authMode==="deviceCode"?"已授权账号":"API Key"}function Jr(e){const t=e.indexOf("@");if(t>0){const n=e.slice(0,t);return`${n.length>6?`${n.slice(0,3)}***${n.slice(-2)}`:n.length>1?`${n[0]}***${n[n.length-1]}`:`${n[0]}***`}${e.slice(t)}`}return e}function ed(e){return e==="healthy"?"有效":e==="unknown"?"未验证":e==="expired"?"已过期":"错误"}function td(e){return e==="healthy"?{row:"border-emerald-500/40 bg-emerald-500/5",dot:"bg-emerald-500"}:e==="unknown"?{row:"border-border/50 bg-background",dot:"bg-muted-foreground/50"}:{row:"border-destructive/40 bg-destructive/5",dot:"bg-destructive"}}function nd({providerName:e,offeringName:t,quota:n,busy:r,disabled:o=!1,credentialLabel:s,multiple:i=!1,compact:c=!1,paused:d=!1,error:u,onRefresh:f}){if(c){const h=!r&&!u&&n?.status==="available";return a.jsx("div",{className:`min-w-0 text-xs text-muted-foreground ${d?"opacity-60":""}`,children:a.jsxs("div",{className:"flex items-start gap-1",children:[a.jsxs("div",{className:"min-w-0 flex-1 truncate py-1 [&>span+span]:ml-3",children:[d?a.jsx("span",{children:"已停用 · 不参与全部刷新"}):null,r?a.jsx("span",{role:"status",children:"正在查询额度…"}):u?a.jsx("span",{role:"alert",title:u,className:"text-destructive",children:u}):n?n.status==="unsupported"?a.jsx("span",{children:"官方额度接口不支持"}):n.status==="error"?a.jsx("span",{role:"alert",className:"text-destructive",children:"额度查询失败"}):a.jsx(Gr,{quota:n}):a.jsx("span",{children:s?"尚未检查":`连接${t}后可查询`}),h&&n.stale?a.jsx("span",{children:"数据可能已过期"}):null]}),a.jsx(rd,{quota:n,label:s??t}),a.jsx(V,{className:"h-6 w-6 shrink-0 p-0",variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}${s?` ${s}`:""}额度`,disabled:r||o,onClick:f,children:r?a.jsx(Le,{"aria-hidden":"true",className:"h-3 w-3 animate-spin"}):a.jsx(Sr,{"aria-hidden":"true",className:"h-3 w-3"})})]})})}return a.jsxs("div",{className:`${i?"space-y-1.5":"space-y-3"} border-t border-border/40 pt-3 ${d?"opacity-60":""}`,children:[a.jsxs("div",{className:"flex items-center justify-between gap-2",children:[a.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[i?null:a.jsx(Ti,{className:"h-4 w-4 shrink-0 text-primary"}),a.jsxs("div",{className:"min-w-0",children:[a.jsx("div",{className:"break-all text-sm font-medium text-foreground/90",children:i?`凭证:${s}`:"剩余额度"}),i&&!r&&!u&&n?.status==="available"?a.jsx("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground",children:a.jsx(Gr,{quota:n})}):null]})]}),a.jsxs(V,{className:"shrink-0",variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}${i?` ${s}`:""}额度`,disabled:r||o,onClick:f,children:[r?a.jsx(Le,{"aria-hidden":"true",className:"mr-2 h-3.5 w-3.5 animate-spin"}):a.jsx(Sr,{"aria-hidden":"true",className:"mr-2 h-3.5 w-3.5"}),r?"查询中":"刷新"]})]}),s&&!i?a.jsxs("p",{className:"text-xs text-muted-foreground",children:["凭证:",s]}):null,d?a.jsx("p",{className:"text-xs text-muted-foreground",children:"已停用 · 不参与全部刷新"}):null,r?a.jsx("p",{role:"status",className:"text-xs text-muted-foreground",children:"正在查询额度…"}):u?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:u}):n?n.status==="unsupported"?a.jsxs(a.Fragment,{children:[a.jsx("p",{className:"text-sm",children:"官方额度接口不支持"}),a.jsxs("p",{className:"text-xs text-muted-foreground",children:["来源:",n.source]})]}):n.status==="error"?a.jsx("p",{className:"text-sm text-destructive",children:"额度查询失败"}):i?a.jsxs("details",{className:"text-xs text-muted-foreground",children:[a.jsx("summary",{className:"cursor-pointer","aria-label":`${s}额度详情`,children:"详情"}),a.jsx("div",{className:"pt-3",children:a.jsx(tr,{quota:n,hideBalance:!0})})]}):a.jsx(tr,{quota:n}):a.jsx("p",{className:"text-xs text-muted-foreground",children:s?"尚未检查":`连接${t}后可查询`})]})}function rd({quota:e,label:t}){const[n,r]=p.useState({left:16,top:16,maxHeight:400}),[o,s]=p.useState(!1),i=p.useRef(null),c=p.useRef(null),d=p.useRef(!1);return p.useEffect(()=>{if(!o)return;const u=h=>{!(h.target instanceof Node)||i.current?.contains(h.target)||c.current?.contains(h.target)||(d.current=!0,s(!1))},f=h=>{h.type==="scroll"&&h.target instanceof Node&&c.current?.contains(h.target)||(d.current=!0,s(!1))};return document.addEventListener("pointerdown",u,!0),document.addEventListener("scroll",f,!0),window.addEventListener("resize",f),()=>{document.removeEventListener("pointerdown",u,!0),document.removeEventListener("scroll",f,!0),window.removeEventListener("resize",f)}},[o]),a.jsxs(Tt,{modal:!1,open:o,onOpenChange:u=>{d.current=!1,s(u)},children:[a.jsx(Li,{asChild:!0,children:a.jsx(V,{ref:i,className:"h-6 w-6 shrink-0 p-0",variant:"ghost",size:"sm","aria-label":`${t}额度详情`,disabled:!e||e.status==="error",onClick:u=>{const f=u.currentTarget.getBoundingClientRect(),h=Math.min(320,window.innerWidth-32),A=Math.max(16,Math.min(f.right-h,window.innerWidth-h-16)),g=Math.max(16,Math.min(f.bottom+8,window.innerHeight-320));r({left:A,top:g,maxHeight:window.innerHeight-g-16})},children:a.jsx(Ka,{"aria-hidden":"true",className:"h-3 w-3"})})}),a.jsxs(Et,{ref:c,className:"w-[calc(100vw-2rem)] max-w-xs overflow-y-auto p-4",onEscapeKeyDown:()=>i.current?.focus(),onCloseAutoFocus:u=>{d.current&&u.preventDefault()},style:{...n,transform:"none",animation:"none"},"aria-describedby":void 0,children:[a.jsx(It,{className:"pr-8 text-sm",children:"额度详情"}),e?.status==="available"?a.jsx(tr,{quota:e}):e?a.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:["来源:",e.source]}):null]})]})}function Gr({quota:e}){return a.jsxs(a.Fragment,{children:[typeof e.balance=="number"?a.jsxs("span",{children:["余额:",e.balance]}):null,e.windows.map((t,n)=>a.jsxs("span",{children:[nr(t.name)," · ",No(t)]},n)),typeof e.balance!="number"&&e.windows.length===0?a.jsx("span",{children:"服务商未返回额度数据"}):null]})}function tr({quota:e,hideBalance:t=!1}){return a.jsxs("div",{className:"space-y-3 text-sm",children:[!t&&typeof e.balance=="number"?a.jsxs("div",{children:["余额:",e.balance]}):null,e.windows.map((n,r)=>a.jsxs("div",{className:"space-y-1.5",children:[a.jsxs("div",{className:"flex items-center justify-between gap-3",children:[a.jsx("span",{className:"font-medium text-foreground",children:nr(n.name)}),a.jsx("span",{className:"text-muted-foreground",children:No(n)})]}),Dt(n)!==void 0?a.jsx("div",{"aria-label":`${nr(n.name)}剩余 ${String(Dt(n))}%`,className:"h-1.5 overflow-hidden rounded-full bg-muted",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Dt(n),children:a.jsx("div",{className:"h-full rounded-full bg-primary",style:{width:`${String(Dt(n))}%`}})}):null,n.resetsAt?a.jsxs("p",{className:"text-xs text-muted-foreground",children:["重置:",Xr(n.resetsAt)]}):null]},`${String(n.name)}-${r}`)),a.jsxs("p",{className:"text-xs text-muted-foreground",children:["更新:",Xr(e.observedAt)]}),a.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:["来源:",e.source,e.stale?" · 数据可能已过期":""]})]})}function nr(e){switch(e){case"five-hour":return"5 小时限制";case"weekly":return"周限制";case"monthly":return"月限制";case"weekly-opus":return"Opus 周限制";case"weekly-sonnet":return"Sonnet 周限制";case"available_balance":return"可用余额";case"voucher_balance":return"赠送余额";case"cash_balance":return"现金余额";default:return typeof e=="string"&&e?e:"额度"}}function Dt(e){if(!(typeof e.remaining!="number"||typeof e.limit!="number"||e.limit<=0))return Math.max(0,Math.min(100,Math.round(e.remaining/e.limit*1e4)/100))}function No(e){const t=Dt(e);if(t!==void 0)return`剩余 ${String(t)}%`;if(typeof e.remaining=="number"){const n=typeof e.currency=="string"?` ${e.currency}`:"";return`剩余 ${String(e.remaining)}${n}`}return"官方数据可用"}function Xr(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function ad({methods:e,offering:t,hasCredentials:n,busy:r,disabled:o,onBeginOffering:s,onCreateLocalCredential:i}){return e.length===0?null:a.jsx("div",{className:"space-y-2",children:a.jsx("div",{className:"flex flex-wrap gap-2",children:e.map(c=>{const d=kn(c);return ct(d)?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:r||o||!s,onClick:()=>s?.(t,d,c),children:[r?a.jsx(Le,{className:"h-3.5 w-3.5 animate-spin"}):a.jsx(bn,{className:"h-3.5 w-3.5"}),c.label||(n?"添加账号":"登录")]},c.id):er(c)?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",title:"导入当前设备已有登录态,不会发起新的浏览器授权。",disabled:r||o||!i,onClick:()=>{i?.(t,c)},children:[r?a.jsx(Le,{className:"h-3.5 w-3.5 animate-spin"}):a.jsx(vt,{className:"h-3.5 w-3.5"}),c.label||"已有登录态"]},c.id):null})})})}function od(e){const t=e.modelDiscovery?.endpointProtocol;return e.endpoints?.find(n=>n.protocol===t)?.baseUrl??e.endpoints?.[0]?.baseUrl}function sd(e){try{const t=new URL(e);return`${t.host}${t.pathname.replace(/\/$/u,"")}`}catch{return e}}function id(e){return e==="responses"?"Responses API":e==="chatCompletions"?"Chat API":e==="anthropic"?"Anthropic API":e}function cd({definition:e,offering:t,createOfferings:n,status:r,credentials:o,attempt:s,apiKey:i,baseUrl:c,busy:d,disabled:u,error:f,onApiKeyChange:h,onBaseUrlChange:A,onBeginApiKey:g,onBeginBrowser:I,onSaveApiKey:m,onDisconnect:E,onCreateApiKeyCredential:P,onUpdateCredential:x,initialEditing:F,initialCreate:v=!1,onSavingChange:M,onCloseEdit:j}){const y=s?.mode==="browserAssistedApiKey"&&s.status==="pending",w=r==="configured",S=r==="connected",N=!!P,[H,q]=p.useState(t.id),B=n.find(_=>_.id===H)??t,[$,W]=p.useState(!1),[Z,le]=p.useState(F?"edit":v&&P?"create":void 0),[de,ae]=p.useState(F),[re,R]=p.useState(F?.label??""),[ee,G]=p.useState(""),[fe,oe]=p.useState(F?.baseUrl??""),[K,L]=p.useState(F?.proxyUrl??""),[se,ge]=p.useState(),[Qe,Pe]=p.useState(!1),[X,we]=p.useState(!1),Ae=p.useRef(!1),pe=p.useRef(!1);p.useEffect(()=>{v&&!P&&!pe.current&&(pe.current=!0,g())},[v,P,g]);const ue=()=>{q(t.id),le("create"),ae(void 0),R(""),G(""),oe(""),L(""),ge(void 0),Pe(!1)},te=()=>{j(),le(void 0),ae(void 0),R(""),G(""),oe(""),L(""),ge(void 0),Pe(!1)},z=async()=>{if(d||u||Ae.current)return;let _;try{_=ks(K)}catch{ge("Proxy URL 格式无效(支持 http、https)");return}if(ge(void 0),Z==="create"){const Ge=ee.trim();if(!Ge||!P)return;Ae.current=!0,we(!0),M?.(!0);try{await P(B,{apiKey:Ge,label:re.trim()||void 0,baseUrl:fe.trim()||void 0,proxyUrl:_,priority:$l(o.filter(qe=>qe.offeringId===B.id))}),te()}catch(qe){ge(qe instanceof Error?qe.message:"保存失败,请重试")}finally{Ae.current=!1,we(!1),M?.(!1)}return}if(Z==="edit"&&de&&x){const Ge=K.trim()!==(de.proxyUrl??"").trim();Ae.current=!0,we(!0),M?.(!0);try{await x(de,{label:re.trim()||void 0,baseUrl:fe.trim()||void 0,...Ge?{proxyUrl:_}:{}}),te()}catch(qe){ge(qe instanceof Error?qe.message:"保存失败,请重试")}finally{Ae.current=!1,we(!1),M?.(!1)}}};return a.jsxs("div",{className:me("space-y-3",Z&&"w-full"),children:[s?.userCode?a.jsxs("div",{className:"border-l-2 border-primary bg-muted/30 px-3 py-2 text-sm",children:["验证码:",a.jsx("strong",{className:"font-mono",children:s.userCode})]}):null,!v&&!F?a.jsxs("div",{className:"flex flex-wrap gap-2",children:[P&&n.length>0?a.jsxs(V,{variant:"outline",size:"sm",disabled:d||u||X,onClick:ue,children:[a.jsx(vt,{className:"mr-2 h-4 w-4"}),"添加 API Key"]}):null,N?null:S?a.jsxs(a.Fragment,{children:[a.jsxs(V,{variant:"outline",size:"sm",disabled:d||u||X,onClick:I,children:[d?a.jsx(Le,{className:"mr-2 h-4 w-4 animate-spin"}):a.jsx(Gn,{className:"mr-2 h-4 w-4"}),"重新连接"]}),a.jsxs(V,{variant:"ghost",size:"sm",disabled:d||u||X,onClick:E,children:[a.jsx(wi,{className:"mr-2 h-4 w-4"}),"断开连接"]})]}):w?a.jsxs(a.Fragment,{children:[a.jsxs(V,{variant:"outline",size:"sm","aria-label":"更新 API Key",disabled:d||u||X,onClick:g,children:[a.jsx(Jn,{className:"mr-2 h-4 w-4"}),"更新 API Key"]}),a.jsx(V,{variant:"ghost",size:"sm",disabled:d||u||X,onClick:E,children:"移除配置"})]}):a.jsxs(a.Fragment,{children:[a.jsxs(V,{variant:"outline",size:"sm",disabled:d||u||X||e.browserMode==="connectUnsupported",onClick:I,children:[d?a.jsx(Le,{className:"mr-2 h-4 w-4 animate-spin"}):a.jsx(bn,{className:"mr-2 h-4 w-4"}),e.browserLabel]}),a.jsxs(V,{variant:"outline",size:"sm","aria-label":`${e.name} API Key`,disabled:d||u||X,onClick:g,children:[a.jsx(Jn,{className:"mr-2 h-4 w-4"}),"配置 API Key"]})]})]}):null,Z?a.jsxs("div",{className:"space-y-2 rounded-lg border border-border/50 bg-muted/10 p-3",children:[Z==="create"&&n.length>1?a.jsxs("label",{className:"block space-y-1 text-xs text-muted-foreground",children:[a.jsx("span",{children:"套餐 / 区域"}),a.jsx("select",{"aria-label":`${e.name} 套餐 / 区域`,value:H,disabled:d||u||X,onChange:_=>{q(_.target.value),ge(void 0)},className:"h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground",children:n.map(_=>a.jsx("option",{value:_.id,children:Ce(_)},_.id))})]}):null,Z==="edit"?a.jsx(je,{disabled:d||u||X,autoComplete:"off","aria-label":`${e.name} API Key 标签`,placeholder:"名称,例如 Work key",value:re,onChange:_=>R(_.target.value)}):null,Z==="create"?a.jsx(je,{disabled:d||u||X,type:$?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:ee,onChange:_=>G(_.target.value),className:"font-mono"}):null,Z==="edit"||Qe?a.jsxs(a.Fragment,{children:[a.jsx(je,{disabled:d||u||X,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:od(Z==="edit"?t:B)||e.defaultBaseUrl||"默认服务地址",value:fe,onChange:_=>oe(_.target.value),className:"font-mono text-xs"}),a.jsx(je,{disabled:d||u||X,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Proxy URL 输入`,placeholder:"http://127.0.0.1:7890",value:K,onChange:_=>L(_.target.value),className:"font-mono text-xs"})]}):null,se?a.jsx("p",{className:"text-xs text-destructive",children:se}):null,a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(V,{size:"sm","aria-label":Z==="create"?`保存 ${e.name} API Key`:"保存凭证",disabled:d||u||X||Z==="create"&&!ee.trim(),onClick:z,children:Z==="create"?"保存 API Key":"保存凭证"}),a.jsx(V,{variant:"ghost",size:"sm",disabled:X,onClick:te,children:"取消"}),Z==="create"?a.jsx(V,{variant:"ghost",size:"sm",disabled:X,onClick:()=>Pe(_=>!_),children:Qe?"收起高级设置":"高级设置"}):null]})]}):null,y&&!Z?a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm font-medium",children:"API Key"}),e.apiKeyUrl?a.jsx("a",{href:e.apiKeyUrl,target:"_blank",rel:"noreferrer",className:"text-xs text-primary hover:underline",children:"获取 API Key"}):null]}),a.jsxs("div",{className:"group relative",children:[a.jsx(je,{disabled:d||u||X,type:$?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:i,onChange:_=>h(_.target.value),className:"border-border/60 bg-muted/20 pr-10 font-mono transition-colors focus:border-primary/50 focus:bg-background"}),a.jsx("div",{className:"absolute bottom-1 right-1 top-1 flex items-center",children:a.jsx(V,{variant:"ghost",size:"icon",className:"h-full w-8 rounded hover:bg-muted",onClick:()=>W(_=>!_),"aria-label":$?"隐藏 API Key":"显示 API Key",children:$?a.jsx(ui,{className:"h-4 w-4 text-muted-foreground"}):a.jsx(pi,{className:"h-4 w-4 text-muted-foreground"})})})]}),A?a.jsxs("div",{className:"space-y-1.5",children:[a.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:"Base URL(选填)"}),a.jsx(je,{disabled:d||u||X,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:e.defaultBaseUrl||"默认服务地址",value:c,onChange:_=>A(_.target.value),className:"border-border/60 bg-muted/20 font-mono text-xs transition-colors focus:border-primary/50 focus:bg-background"}),a.jsxs("p",{className:"break-all font-mono text-[11px] text-muted-foreground opacity-80",children:[a.jsx("span",{className:"mr-1 select-none opacity-50",children:"预览:"}),(c.trim()||e.defaultBaseUrl||"").replace(/\/+$/,""),"/chat/completions"]})]}):null,a.jsx(V,{size:"sm","aria-label":`保存 ${e.name} API Key`,disabled:!i.trim()||d||u,onClick:m,children:"保存 API Key"})]}):null,f?a.jsx("p",{className:"text-sm text-destructive",children:f}):null]})}function ld({controller:e,definition:t,offerings:n,apiOfferings:r,credentials:o,status:s,attempt:i,attemptOfferingId:c,apiKey:d,baseUrl:u="",busy:f,disabled:h=!1,error:A,onApiKeyChange:g,onBaseUrlChange:I,onBeginApiKey:m,onBeginBrowser:E,onSaveApiKey:P,onDisconnect:x,onUpdateCredential:F,onCreateApiKeyCredential:v,onBeginOffering:M,onCancelConnect:j,onDismissError:y}){const{editing:w,authorizationOfferingId:S,error:N,saving:H}=e,q=w||S?n.filter(B=>B.id===(w?.offeringId??S)):r;return a.jsx(Tt,{open:e.open,onOpenChange:B=>{B||H||(i&&sn(i)&&ct(i.mode)&&j?.({mode:i.mode,attemptId:i.attemptId,state:i.state,signature:i.signature,...i.offeringId?{offeringId:i.offeringId}:{}}),e.close())},children:a.jsxs(Et,{className:"max-h-[85vh] overflow-y-auto sm:max-w-lg","aria-describedby":void 0,children:[a.jsx(Lt,{children:a.jsx(It,{children:e.title})}),a.jsx("div",{className:"space-y-5","aria-label":"添加连接",children:q.map(B=>{const $=sn(i)&&ct(i?.mode)&&(c??i?.offeringId)!==B.id,W=h||H||$,Z=At(B),le=Z.filter(oe=>oe.lifecycle==="active"),de=le.some(So),ae=c===B.id?i:void 0,re=A?.offeringId===B.id?A.authorization:void 0,R=Z.find(oe=>oe.id===(re?.authorizationMethodId??ae?.authorizationMethodId))??le.find($n),ee=re?.mode??ae?.mode??(R?kn(R):Wl(B,t)),G=A?.offeringId===B.id?A.message:void 0;if(B.lifecycle==="unavailable"&&le.length===0)return a.jsxs("fieldset",{"data-create-offering":B.id,className:"space-y-2 border-t border-border/50 pt-3 first:border-t-0 first:pt-0",children:[a.jsx("legend",{className:"px-1 text-sm font-medium",children:Ce(B)}),a.jsx("p",{className:"text-xs text-muted-foreground",children:B.kind==="oauth-subscription"?"暂不可用:账号订阅需在 Xpod 桌面版中导入本机客户端(如 Codex CLI)的登录态,浏览器中无法完成。":"暂不可用:该接入方式尚未提供可用的连接流程。"})]},B.id);const fe=re?.mode;return G&&ct(fe)?a.jsxs("fieldset",{"data-create-offering":B.id,disabled:W,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ce(B)}接入操作`,children:[a.jsx("legend",{className:"px-1 text-sm font-medium",children:Ce(B)}),ae?.status==="unsupported"?a.jsx("p",{className:"text-sm",children:"当前部署未启用账号授权"}):a.jsx(gs,{title:"登录未完成",description:G,primaryLabel:"重试登录",onPrimary:()=>M?.(B,fe,R),secondaryLabel:"关闭",onSecondary:()=>{y?.(),e.close()}})]},B.id):sn(ae)&&ct(ee)?a.jsxs("fieldset",{"data-create-offering":B.id,disabled:W,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ce(B)}接入操作`,children:[a.jsx("legend",{className:"px-1 text-sm font-medium",children:Ce(B)}),a.jsx(Ur,{title:"正在连接",detail:ee==="authorizationCodeOAuth"?"等待网页授权,请在打开的页面完成登录。":ae?.userCode?`验证码:${ae.userCode}`:"请在打开的页面完成授权。",providerLabel:R?.label??Ce(B),providerHost:t.name}),a.jsx(V,{variant:"ghost",size:"sm",disabled:h,onClick:()=>{ae&&j?.({mode:ae.mode,attemptId:ae.attemptId,state:ae.state,signature:ae.signature,...ae.offeringId?{offeringId:ae.offeringId}:{}}),e.close()},children:"取消连接"})]},B.id):a.jsxs("fieldset",{"data-create-offering":B.id,disabled:W,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ce(B)}接入操作`,children:[a.jsx("legend",{className:"px-1 text-sm font-medium",children:Ce(B)}),de?a.jsx(cd,{definition:t,offering:B,status:s,createOfferings:[B],initialCreate:!w,credentials:o,initialEditing:w?.offeringId===B.id?w:void 0,onCloseEdit:e.close,onSavingChange:e.setSaving,attempt:ae??(i?.mode==="browserAssistedApiKey"?i:void 0),apiKey:d,baseUrl:u,busy:f,disabled:W,onApiKeyChange:g,onBaseUrlChange:I,onBeginApiKey:m,onBeginBrowser:E,onSaveApiKey:P,onDisconnect:x,onUpdateCredential:F,onCreateApiKeyCredential:v},`${B.id}:${w?.id??""}`):null,S&&!G?a.jsx(Ur,{title:"正在连接",detail:"正在启动授权,请稍候。",providerLabel:Ce(B),providerHost:t.name}):null,G?a.jsx("p",{className:"w-full text-sm text-destructive",children:G}):null]},B.id)})}),N?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:N}):null]})})}function dd({credential:e,label:t,busy:n,disabled:r,dragHandle:o,kindLabel:s,quota:i,onToggle:c,onTest:d,onEdit:u,onDelete:f,deleteAriaLabel:h}){const A=r||n,g=td(e.health),I=`${e.enabled?"已启用":"已停用"} · ${ed(e.health)}`;return a.jsxs("div",{"data-credential-state":e.enabled?"enabled":"disabled",className:me("flex flex-wrap items-center gap-x-3 gap-y-2 rounded-lg border px-3 py-2.5 transition-colors",e.enabled?g.row:"border-border/50 bg-muted/40 opacity-70"),children:[o,a.jsxs(Cn,{children:[a.jsx(vn,{asChild:!0,children:a.jsx("span",{"aria-label":I,className:me("h-2 w-2 shrink-0 rounded-full",e.enabled?g.dot:"bg-muted-foreground/40")})}),a.jsx(Qt,{className:"text-xs",children:I})]}),a.jsxs("div",{className:"min-w-0 flex-1 basis-24",children:[a.jsx("p",{className:"truncate text-sm font-medium text-foreground",children:t}),s?a.jsx("p",{className:"text-xs text-muted-foreground",children:s}):null,e.maskedHint&&!t.includes(e.maskedHint)?a.jsx("p",{className:"mt-1 truncate font-mono text-xs text-muted-foreground",children:e.maskedHint}):null]}),a.jsx("div",{className:"order-last w-full min-w-0 sm:order-none sm:w-auto sm:max-w-[45%]",role:"group","aria-label":`${yt(e)}额度`,children:i}),a.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[d?a.jsx(Zt,{label:`测试连接 ${t}`,disabled:A,onClick:()=>d(e),children:a.jsx(Pi,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,u?a.jsx(Zt,{label:`编辑 ${t}`,disabled:A,onClick:u,children:a.jsx(Ta,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,c?a.jsx(Zt,{label:`${e.enabled?"停用":"启用"} ${t}`,disabled:A,onClick:()=>c(e,{enabled:!e.enabled}),children:e.enabled?a.jsx(vi,{"aria-hidden":"true",className:"h-3.5 w-3.5"}):a.jsx(ji,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,f?a.jsx(Zt,{label:h??`删除 ${t}`,disabled:A,onClick:f,children:a.jsx(ur,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null]})]})}function Zt({label:e,disabled:t,onClick:n,children:r}){return a.jsxs(Cn,{children:[a.jsx(vn,{asChild:!0,children:a.jsx(V,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":e,disabled:t,onClick:n,children:r})}),a.jsx(Qt,{className:"text-xs",children:e})]})}function ud({offering:e,methods:t}){const n=e.endpoints??[],r=Ce(e),o=e.kind?Zl(e.kind):void 0,s=o&&o!==r?[o]:[];return a.jsxs("section",{className:"space-y-2","aria-labelledby":`offering-${e.id}`,children:[a.jsxs("div",{className:"flex items-start justify-between gap-3",children:[a.jsxs("div",{children:[a.jsx("h4",{id:`offering-${e.id}`,className:"text-sm font-medium text-foreground",children:r}),s.length?a.jsx("div",{className:"mt-1 flex items-center gap-2 text-xs text-muted-foreground",children:s.map(i=>a.jsx("span",{children:i},i))}):null]}),a.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-x-3 gap-y-1 text-xs",children:[a.jsx("span",{className:"text-muted-foreground",children:_l(e,t)}),e.consoleUrl?a.jsx(_t,{href:e.consoleUrl,label:"控制台"}):null,e.subscriptionUrl?a.jsx(_t,{href:e.subscriptionUrl,label:"订阅与账单"}):null,e.quota?.url?a.jsx(_t,{href:e.quota.url,label:"额度与用量"}):null,e.usagePolicyUrl?a.jsx(_t,{href:e.usagePolicyUrl,label:"使用政策"}):null]})]}),e.lifecycle==="unavailable"&&!At(e).some(i=>i.lifecycle==="active")?a.jsx("p",{className:"text-xs text-muted-foreground",children:e.kind==="oauth-subscription"?"暂不可用:账号订阅需在 Xpod 桌面版中导入本机客户端(如 Codex CLI)的登录态,浏览器中无法完成。":"暂不可用:该接入方式尚未提供可用的连接流程。"}):null,n.length?a.jsx("dl",{className:"space-y-1 text-[11px] text-muted-foreground",children:n.map(i=>a.jsxs("div",{className:"flex min-w-0 items-baseline gap-2",children:[a.jsx("dt",{className:"shrink-0 text-foreground/70",children:id(i.protocol)}),a.jsx("dd",{className:"min-w-0 truncate font-mono",title:i.baseUrl,children:sd(i.baseUrl)})]},`${i.protocol}:${i.baseUrl}`))}):null]})}function _t({href:e,label:t}){return a.jsx("a",{href:e,target:"_blank",rel:"noreferrer",className:"text-primary hover:underline",children:t})}function fd({credentials:e,disabled:t,onMove:n,children:r}){const o=p.useRef(null),s=p.useRef(null),i=p.useRef(void 0),c=p.useRef(void 0),d=p.useRef(null),u=p.useRef(void 0),f=p.useRef(t),[h,A]=p.useState(""),g=t||!n||e.length<2,I=e.map(j=>j.id).join("\0"),m=()=>Array.from(o.current?.querySelectorAll("[data-sortable-credential]")??[]),E=()=>{i.current!==void 0&&cancelAnimationFrame(i.current),c.current!==void 0&&clearTimeout(c.current),i.current=void 0,c.current=void 0;for(const j of m()){for(const y of["transform","transition","zIndex","position","boxShadow","willChange","backgroundColor"])j.style[y]="";delete j.dataset.dragging}},P=()=>{const j=d.current;if(!j)return;d.current=null,E();const y=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1,w=m();for(const S of w){const N=j.get(S.dataset.sortableCredential);if(!N||y)continue;const H=S.getBoundingClientRect();S.style.transition="none",S.style.transform=`translateY(${N.top-H.top}px)`}o.current?.getBoundingClientRect(),i.current=requestAnimationFrame(()=>{i.current=void 0;for(const S of w)S.style.transition=y?"none":"transform 160ms ease-out, box-shadow 160ms ease-out",S.style.transform="translateY(0px)";c.current=setTimeout(E,y?0:180)})},x=j=>{const y=s.current;if(y){if(i.current!==void 0&&cancelAnimationFrame(i.current),d.current=new Map(y.rows.map(w=>[w.dataset.sortableCredential,w.getBoundingClientRect()])),u.current=I,j&&y.from!==y.to&&!g){const w=y.rects[y.from],S=y.rects[y.to],N=Math.max(0,y.rects[1].top-y.rects[0].bottom),H=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;y.rows.forEach((q,B)=>{const $=B===y.from?y.from<y.to?S.bottom-w.bottom:S.top-w.top:y.from<B&&B<=y.to?-(w.height+N):y.to<=B&&B<y.from?w.height+N:0;q.style.transition=H?"none":"transform 160ms ease-out",q.style.transform=`translateY(${$}px)`;const W=y.rects[B];d.current.set(q.dataset.sortableCredential,{...W,top:W.top+$,bottom:W.bottom+$})})}s.current=null,y.handle.hasPointerCapture?.(y.pointerId)&&y.handle.releasePointerCapture?.(y.pointerId),j&&!g&&e[y.from]?.id===y.id&&F(y.from,y.to),i.current=requestAnimationFrame(()=>{i.current=void 0,(!j||!f.current)&&P()}),c.current=setTimeout(P,1e4)}},F=(j,y)=>{g||j===y||y<0||y>=e.length||(n?.(j,y),A(`已请求将${yt(e[j])}移至第 ${y+1} 位`))},v=p.useRef({finish:x,settle:P,clearMotion:E});p.useLayoutEffect(()=>{v.current={finish:x,settle:P,clearMotion:E},f.current=t}),p.useLayoutEffect(()=>{s.current&&v.current.finish(!1),d.current&&(u.current!==I||!t)&&v.current.settle()},[I,g,t]),p.useEffect(()=>()=>{const j=s.current;s.current=null,d.current=null,j?.handle.hasPointerCapture?.(j.pointerId)&&j.handle.releasePointerCapture?.(j.pointerId),v.current.clearMotion()},[]);const M=()=>{i.current=void 0;const j=s.current;if(!j)return;const y=j.rects[j.from],w=j.rects.length>1?Math.max(0,j.rects[1].top-j.rects[0].bottom):0;j.rows.forEach((S,N)=>{const H=N===j.from?j.y-j.startY:j.from<N&&N<=j.to?-(y.height+w):j.to<=N&&N<j.from?y.height+w:0;S.style.transform=`translateY(${H}px)`})};return a.jsxs("div",{ref:o,className:"space-y-2",children:[a.jsx("span",{className:"sr-only",role:"status",children:h}),e.map((j,y)=>a.jsx("div",{"data-sortable-credential":j.id,className:"rounded-lg",children:r(j,n?a.jsx("button",{type:"button",disabled:g,"aria-label":`拖动排序 ${yt(j)}`,title:e.length<2?"至少添加两条连接后可拖动排序":"拖动调整优先级,或使用方向键、Home / End 排序",className:"flex h-8 w-6 shrink-0 touch-none select-none items-center justify-center rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary disabled:opacity-40 enabled:cursor-grab active:cursor-grabbing",onKeyDown:w=>{if(w.key==="Escape"){x(!1);return}const S=w.key==="ArrowUp"?y-1:w.key==="ArrowDown"?y+1:w.key==="Home"?0:w.key==="End"?e.length-1:void 0;S!==void 0&&(w.preventDefault(),F(y,S))},onPointerDown:w=>{if(g||w.button!==0||s.current)return;w.preventDefault(),d.current=null,E(),w.currentTarget.focus(),w.currentTarget.setPointerCapture?.(w.pointerId);const S=m(),N=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;s.current={id:j.id,from:y,to:y,pointerId:w.pointerId,startY:w.clientY,y:w.clientY,handle:w.currentTarget,rows:S,rects:S.map(H=>H.getBoundingClientRect())};for(const[H,q]of S.entries())q.style.willChange="transform",q.style.transition=N||H===y?"none":"transform 160ms ease-out",H===y&&(q.dataset.dragging="true",q.style.position="relative",q.style.zIndex="10",q.style.boxShadow="0 8px 24px rgb(0 0 0 / 0.18)",q.style.backgroundColor="hsl(var(--card))")},onPointerMove:w=>{const S=s.current;if(!S||S.pointerId!==w.pointerId||g)return;S.y=w.clientY;let N=1/0;S.rects.forEach((H,q)=>{const B=Math.abs(w.clientY-(H.top+H.bottom)/2);B<N&&(N=B,S.to=q)}),i.current===void 0&&(i.current=requestAnimationFrame(M))},onPointerUp:w=>{s.current?.pointerId===w.pointerId&&x(!0)},onPointerCancel:w=>{s.current?.pointerId===w.pointerId&&x(!1)},onLostPointerCapture:w=>{s.current?.pointerId===w.pointerId&&x(!1)},children:a.jsx(gi,{"aria-hidden":"true",className:"h-4 w-4"})}):null)},j.id))]})}function pd({attempt:e,onDismissError:t,onBeginOffering:n,onBeginBrowser:r,onCreateLocalCredential:o}){const[s,i]=p.useState(!1),[c,d]=p.useState(),[u,f]=p.useState(),[h,A]=p.useState(),[g,I]=p.useState(!1),m=s||!!c||!!u,E=p.useCallback(()=>{i(!1),f(void 0),d(void 0),A(void 0)},[]),P=p.useRef(e);p.useEffect(()=>{const w=P.current;P.current=e,m&&e!==w&&e?.status==="completed"&&E()},[e,m,E]);const x=p.useCallback(()=>{A(void 0),t?.()},[t]),F=p.useCallback(()=>{x(),i(!0)},[x]),v=p.useCallback(()=>{x(),r()},[x,r]),M=p.useCallback((w,S,N)=>{x(),f(w.id),n?.(w,S,N)},[x,n]),j=p.useCallback(async(w,S)=>{if(o){x(),I(!0);try{await o(w,S)}catch(N){A(N instanceof Error?N.message:"连接失败,请重试")}finally{I(!1)}}},[x,o]),y=p.useCallback(w=>{d(w)},[]);return{open:m,title:c?"编辑连接":u?"连接账号":"新建连接",...c?{editing:c}:{},...u?{authorizationOfferingId:u}:{},...h?{error:h}:{},saving:g,beginApiKey:F,beginEdit:y,beginAuthorization:M,beginBrowser:v,beginLocal:j,setSaving:I,close:E}}function hd({definition:e,product:t,status:n,accountLabel:r,attempt:o,attemptOfferingId:s,apiKey:i,baseUrl:c="",busy:d,disabled:u=!1,error:f,suppressError:h=!1,quotas:A={},onApiKeyChange:g,onBaseUrlChange:I,onBeginApiKey:m,onBeginOffering:E,onCancelConnect:P,onBeginBrowser:x,onSaveApiKey:F,onDisconnect:v,onCreateApiKeyCredential:M,onCreateLocalCredential:j,onUpdateCredential:y,onDeleteCredential:w,onTestCredential:S,onReorderCredentials:N,onRefreshQuota:H,onDismissError:q}){const B=[{id:"api-platform",label:"API Key",kind:"api-platform",authModes:["apiKey"]}],$=t?.credentials??[],W=t?.offerings.length?t.offerings:B,Z=W.filter(R=>At(R).some(ee=>ee.lifecycle==="active"&&So(ee))),le=sn(o)&&ct(o?.mode),de=[...$].sort((R,ee)=>R.priority-ee.priority),ae=$.some(R=>A[R.id]?.busy),re=pd({attempt:o,onDismissError:q,onBeginOffering:E,onBeginBrowser:x,onCreateLocalCredential:j});return a.jsx(Wa,{children:a.jsxs("section",{className:"space-y-3","aria-label":"当前连接",children:[a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[a.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[a.jsx(Mi,{className:"h-4 w-4 text-primary"}),"当前连接"]}),a.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-2",children:[$.length>1?a.jsx(V,{variant:"ghost",size:"sm","aria-label":`刷新全部 ${e.name}额度`,disabled:u||ae||!$.some(R=>R.enabled)||!H,onClick:()=>W.forEach(R=>H?.(R)),children:ae?"查询中":"刷新全部额度"}):null,W.map(R=>{const ee=At(R).filter(G=>G.lifecycle==="active"&&($n(G)||er(G)));return ee.length?a.jsx("div",{role:"group","aria-label":`${Ce(R)}快捷接入`,children:a.jsx(ad,{methods:ee,offering:R,hasCredentials:$.some(G=>G.offeringId===R.id),busy:d||re.saving,disabled:u||le,onBeginOffering:E?re.beginAuthorization:void 0,onCreateLocalCredential:j?re.beginLocal:void 0})},R.id):null}),Z.length>0&&!W.some(R=>At(R).some(ee=>ee.lifecycle==="active"&&($n(ee)||er(ee))))&&e.browserMode==="browserAssistedApiKey"?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs","aria-label":`${e.name} 登录`,disabled:d||re.saving||u||le,onClick:re.beginBrowser,children:[a.jsx(bn,{className:"h-3.5 w-3.5"}),e.browserLabel]}):null,Z.length>0?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs","aria-label":"新建 API Key 连接",disabled:d||re.saving||u||le||!t&&n==="pending"&&!o,onClick:re.beginApiKey,children:[a.jsx(vt,{className:"h-3.5 w-3.5"}),"API Key"]}):null]})]}),a.jsxs("div",{"aria-label":"凭据列表",className:"space-y-2",children:[a.jsx(fd,{credentials:de,disabled:d||u,onMove:N?(R,ee)=>{const G=W.find(fe=>fe.id===de[R]?.offeringId);G&&N(G,de,R,ee)}:void 0,children:(R,ee)=>{const G=W.find(L=>L.id===R.offeringId);if(!G)return null;const fe=R.authMode==="apiKey"?yt(R):R.label?Jr(R.label):yt(R),oe=A[R.id],K=oe?.credentialId===R.id?oe:void 0;return a.jsx(dd,{credential:R,label:fe,dragHandle:ee,kindLabel:R.authMode==="apiKey"?"API Key":Ce(G),busy:d,disabled:u,onToggle:y,onTest:S,onEdit:R.authMode==="apiKey"?()=>re.beginEdit(R):void 0,onDelete:()=>R.authMode==="apiKey"?w?.(R):v(R),deleteAriaLabel:R.authMode==="apiKey"?`删除 ${fe}`:`${fe} 移除`,quota:a.jsx(nd,{compact:!0,providerName:e.name,offeringName:Ce(G),credentialLabel:yt(R),multiple:$.length>1,quota:K?.quota,busy:K?.busy??!1,error:K?.error,paused:!R.enabled,disabled:u||!H,onRefresh:()=>H?.(G,R)})})}}),$.length?null:a.jsx("p",{className:"py-2 text-xs text-muted-foreground",children:r?Jr(r):"尚未添加连接"}),$.length===0&&(n==="configured"||n==="connected")?a.jsx(V,{variant:"ghost",size:"sm",disabled:d||u,onClick:()=>v(),children:n==="configured"?"移除配置":"断开连接"}):null]}),a.jsx(ld,{controller:re,definition:e,offerings:W,apiOfferings:Z,credentials:$,status:n,attempt:o,attemptOfferingId:s,apiKey:i,baseUrl:c,busy:d,disabled:u,error:f,onApiKeyChange:g,onBaseUrlChange:I,onBeginApiKey:m,onBeginBrowser:x,onSaveApiKey:F,onDisconnect:v,onUpdateCredential:y,onCreateApiKeyCredential:M,onBeginOffering:E,onCancelConnect:P,onDismissError:q}),a.jsxs("details",{className:"text-xs text-muted-foreground",children:[a.jsx("summary",{className:"w-fit cursor-pointer",children:"接入信息"}),a.jsx("div",{className:"mt-2 space-y-3",children:W.map(R=>a.jsx(ud,{offering:R},R.id))})]}),re.error&&!re.open&&re.error!==f?.message?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:re.error}):null,f&&(f.offeringId?!re.open:!h)?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:f.message}):null]})})}function md({definition:e,product:t,status:n,accountLabel:r,attempt:o,attemptOfferingId:s,apiKey:i,baseUrl:c="",busy:d,disabled:u=!1,error:f,quotas:h,models:A,verifyPending:g=!1,onApiKeyChange:I,onBaseUrlChange:m,onBeginApiKey:E,onBeginOffering:P,onCancelConnect:x,onBeginBrowser:F,onSaveApiKey:v,onDisconnect:M,onCreateApiKeyCredential:j,onCreateLocalCredential:y,onUpdateCredential:w,onDeleteCredential:S,onTestCredential:N,onReorderCredentials:H,onRefreshQuota:q,onVerify:B,onAddModel:$,onEditModel:W,onDeleteModel:Z,selectedModelIds:le,modelSelectionStatus:de,onModelSelectionChange:ae,onDismissError:re}){const R=n==="configured",ee=n==="connected",G=A.length===0&&f?.message&&!f.offeringId?f.message:void 0,[fe,oe]=p.useState(""),[K,L]=p.useState(),[se,ge]=p.useState(le??[]),Qe=le??se,Pe=p.useMemo(()=>yd(A),[A]),X=Q=>Q.selectionIds.some(ye=>Qe.includes(ye)),we=p.useMemo(()=>{const Q=fe.trim().toLocaleLowerCase();return Q?Pe.filter(ye=>ye.searchText.includes(Q)):Pe},[Pe,fe]),Ae=we.filter(Q=>Q.availability!=="unavailable"),pe=Ae.filter(X).length,ue=Ae.length>0&&pe===Ae.length,te=pe>0&&!ue,z=Pe.filter(X).length,_=Pe.filter(Q=>Q.availability==="unavailable").length,Ge=async Q=>{try{await navigator.clipboard.writeText(Q),L(Q),setTimeout(()=>L(ye=>ye===Q?void 0:ye),1500)}catch{L(void 0)}},qe=Q=>{const ye=new Set(Qe),Ne=X(Q);for(const et of Ne?Q.selectionIds:Q.availableSelectionIds)Ne?ye.delete(et):ye.add(et);const He=[...ye];le===void 0&&ge(He),ae?.(e.id,He)},Dn=()=>{const Q=new Set(Qe);for(const Ne of Ae)for(const He of ue?Ne.selectionIds:Ne.availableSelectionIds)ue?Q.delete(He):Q.add(He);const ye=[...Q];le===void 0&&ge(ye),ae?.(e.id,ye)};return a.jsx(Wa,{children:a.jsxs("div",{className:"space-y-8",children:[a.jsxs("header",{className:"flex items-start justify-between gap-4",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsxs(gn,{className:"h-9 w-9 shrink-0 rounded-lg border border-border/50 bg-muted/50 shadow-sm",style:fn(e.id)?{backgroundColor:fn(e.id)}:void 0,children:[a.jsx(wa,{src:un(e.id),className:"object-cover"}),a.jsx(An,{className:"rounded-lg bg-transparent text-sm font-bold uppercase text-muted-foreground",children:Ad(e.id)})]}),a.jsxs("div",{className:"flex flex-col justify-center gap-0.5",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("h2",{className:"text-base font-semibold leading-none tracking-tight text-foreground",children:e.name}),a.jsxs(Cn,{children:[a.jsx(vn,{asChild:!0,children:a.jsx("button",{type:"button","aria-label":"提供商说明",className:"cursor-help rounded-sm text-muted-foreground/50 focus:outline-none focus-visible:text-foreground",children:a.jsx(Ka,{"aria-hidden":"true",className:"h-3.5 w-3.5"})})}),a.jsxs(Qt,{className:"max-w-xs space-y-2 text-xs",children:[a.jsx("p",{children:e.description}),a.jsx("p",{children:"Provider 凭证保存在当前 Pod,由 Pod 权限保护。"})]})]})]}),a.jsxs("a",{href:e.homeUrl,target:"_blank",rel:"noreferrer",className:"flex items-center gap-0.5 text-[10px] leading-none text-muted-foreground transition-colors hover:text-primary",children:["访问官网 ",a.jsx(bn,{"aria-hidden":"true",className:"h-2.5 w-2.5"})]})]})]}),a.jsx(on,{variant:ee||R?"default":"secondary",children:xd(n)})]}),a.jsx(hd,{definition:e,product:t,status:n,accountLabel:r,attempt:o,attemptOfferingId:s,apiKey:i,baseUrl:c,busy:d,disabled:u,error:f,suppressError:!!G,quotas:h,onApiKeyChange:I,onBaseUrlChange:m,onBeginApiKey:E,onBeginOffering:P,onCancelConnect:x,onBeginBrowser:F,onSaveApiKey:v,onDisconnect:M,onCreateApiKeyCredential:t?.offerings.length?j:void 0,onCreateLocalCredential:t?.offerings.length?y:void 0,onUpdateCredential:w,onDeleteCredential:S,onTestCredential:N,onReorderCredentials:H,onRefreshQuota:q,onDismissError:re}),a.jsxs("section",{className:"space-y-4",children:[a.jsxs("div",{"data-testid":"provider-models-header",className:"flex flex-col gap-3 border-b border-border/40 pb-4 sm:flex-row sm:items-center sm:justify-between",children:[a.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1",children:[a.jsx(ln,{className:"h-4 w-4 shrink-0 text-primary"}),a.jsx("h3",{className:"shrink-0 text-sm font-medium text-foreground/90",children:"可用模型"}),a.jsxs("span",{className:"text-xs text-muted-foreground",children:["共 ",Pe.length," · 已加入 ",z," · 已失效 ",_]}),a.jsxs("span",{role:"status","aria-live":"polite","aria-atomic":"true",className:me("inline-flex items-center gap-1 text-xs",de==="error"?"text-destructive":"text-muted-foreground"),children:[de==="saving"?a.jsx(Le,{"aria-hidden":"true",className:"h-3 w-3 animate-spin motion-reduce:animate-none"}):de==="saved"?a.jsx(st,{"aria-hidden":"true",className:"h-3 w-3"}):null,de==="saving"?"保存中…":de==="saved"?"已保存":de==="error"?"保存失败,请重试":"选择后自动保存"]})]}),a.jsxs("div",{"data-testid":"provider-models-actions",className:"flex w-full flex-wrap items-center gap-2 sm:w-auto sm:flex-nowrap sm:justify-end",children:[(R||ee)&&(B||$)?a.jsxs(a.Fragment,{children:[$?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||d,onClick:$,children:[a.jsx(vt,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"添加模型"]}):null,B&&A.length>0?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||d||g,onClick:B,children:[g?a.jsx(Le,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):a.jsx(Gn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),g?"同步中...":"刷新模型"]}):B?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||d||g,onClick:B,children:[g?a.jsx(Le,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):a.jsx(Gn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),g?"同步中...":"同步模型"]}):null]}):null,a.jsxs("div",{className:"relative w-full sm:w-auto",children:[a.jsx(La,{className:"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),a.jsx(je,{value:fe,onChange:Q=>oe(Q.target.value),placeholder:"搜索模型...",className:"h-8 w-full bg-background pl-8 text-xs sm:w-[232px]",autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0})]})]})]}),A.length===0?a.jsx("div",{className:"rounded-lg border border-dashed border-border/50 bg-muted/5 py-12 text-center text-sm text-muted-foreground",children:G?a.jsx("p",{className:"text-destructive",children:G}):"暂无可用模型"}):we.length===0?a.jsx("div",{className:"rounded-lg border border-dashed border-border/50 bg-muted/5 py-12 text-center text-sm text-muted-foreground",children:"未找到匹配的模型"}):a.jsxs("div",{className:"grid gap-2",children:[a.jsx("div",{className:"flex items-center justify-between px-1 py-1",children:a.jsxs("button",{type:"button",role:"checkbox","aria-label":"全选当前结果","aria-checked":te?"mixed":ue,disabled:u||d||Ae.length===0,onClick:Dn,className:"flex items-center gap-2 text-xs text-muted-foreground disabled:opacity-50",children:[a.jsx("span",{className:me("flex h-4 w-4 items-center justify-center rounded border",ue||te?"border-primary bg-primary text-primary-foreground":"border-border"),children:te?a.jsx("span",{"aria-hidden":"true",children:"−"}):a.jsx(st,{"aria-hidden":"true",className:me("h-3 w-3",!ue&&"invisible")})}),"全选当前结果"]})}),we.map(Q=>{const ye=Ro(Q),Ne=X(Q),He=Q.availability==="unavailable",et=Q.displayName??Q.id,jt=[...(Q.inputModalities??[]).filter(Ye=>Ye!=="text"),...Q.capabilities??[]];return a.jsxs("div",{className:me("group flex items-center gap-3 rounded-lg border bg-card p-3 transition-all duration-200 hover:border-border/60 hover:bg-accent/30",Ne?"border-primary/40 bg-primary/[0.03]":"border-border/40",He&&"opacity-75"),children:[a.jsx("button",{type:"button",role:"checkbox","aria-checked":Ne,"aria-label":`${Ne?"取消选择":"选择"} ${et}`,className:me("flex h-5 w-5 shrink-0 items-center justify-center rounded border transition-colors focus:outline-none focus-visible:border-ring",Ne?"border-primary bg-primary text-primary-foreground":"border-border text-transparent hover:border-primary/60"),disabled:u||d||He&&!Ne,onClick:()=>qe(Q),children:a.jsx(st,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}),a.jsx("div",{className:"shrink-0 rounded bg-muted/50 p-2 text-muted-foreground transition-colors group-hover:text-primary",children:a.jsx(ln,{className:"h-4 w-4"})}),a.jsxs("div",{className:"min-w-0 flex-1",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"truncate text-sm font-medium text-foreground/90",children:et}),a.jsx("div",{className:"flex items-center gap-1",children:jt.map(Ye=>a.jsx(gd,{type:Ye},Ye))}),Q.custom?a.jsx(on,{variant:"outline",className:"shrink-0 text-[10px] font-normal",children:"手工"}):null,He?a.jsx(on,{variant:"destructive",className:"shrink-0 text-[10px] font-normal",children:"已失效"}):null]}),Q.displayName?a.jsxs("div",{className:"mt-0.5 flex items-center gap-1.5",children:[a.jsx("code",{className:"max-w-[300px] truncate font-mono text-[10px] text-muted-foreground opacity-70",children:Q.id}),a.jsx("button",{type:"button",onClick:()=>{Ge(Q.id)},className:"rounded p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground group-hover:opacity-100 group-focus-within:opacity-100 focus:opacity-100","aria-label":`复制 ${Q.displayName} ID`,title:"复制 ID",children:K===Q.id?a.jsx(st,{"aria-hidden":"true",className:"h-3 w-3 text-primary"}):a.jsx(zn,{"aria-hidden":"true",className:"h-3 w-3"})})]}):null]}),Q.custom&&(W||Z)?a.jsxs("div",{className:"flex shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 focus-within:opacity-100",children:[W?a.jsx(V,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":`编辑 ${Q.displayName??Q.id}`,onClick:()=>W(Q),children:a.jsx(Ta,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null,Z?a.jsx(V,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":`删除 ${Q.displayName??Q.id}`,onClick:()=>Z(Q),children:a.jsx(ur,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null]}):null]},ye)})]})]})]})})}function gd({type:e}){const t={image:{icon:Oa,label:"视觉识别",className:"text-green-500"},web:{icon:Ra,label:"联网搜索",className:"text-blue-500"},tool_call:{icon:ln,label:"函数调用",className:"text-orange-500"},reasoning:{icon:Na,label:"推理",className:"text-purple-500"}}[e];if(!t)return null;const n=t.icon;return a.jsxs(Cn,{children:[a.jsx(vn,{asChild:!0,children:a.jsx("button",{type:"button","aria-label":t.label,className:"flex cursor-help items-center justify-center rounded-sm opacity-80 transition-opacity hover:opacity-100 focus:outline-none focus-visible:opacity-100",children:a.jsx(n,{"aria-hidden":"true",className:me("h-3.5 w-3.5",t.className)})})}),a.jsx(Qt,{children:t.label})]})}function Ad(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS";case"zhipu":return"智";case"ollama":return"O";case"custom":return"C"}}function Ro(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function yd(e){const t=new Map;for(const n of e){const r=`${n.provider}\0${n.id}`,o=Ro(n),s=t.get(r),i=[n.id,n.displayName].filter(Boolean).join(`
|
|
1
|
+
import{j as a,r as p,P as wt,J as or,L as Kt,U as ga,X as ls,Z as ie,_ as ds,f as me,i as us,$ as fs,a0 as Aa,a1 as sr,a2 as ir,a3 as ya,a4 as xa,a5 as ve,a6 as pt,a7 as Fr,a8 as cr,a9 as ke,aa as hn,ab as T,ac as Ut,ad as ut,ae as qn,af as cn,ag as Ct,ah as $e,ai as ps,aj as hs,ak as Re,al as tt,am as ba,an as ms,ao as lr,ap as Xe,aq as ot,ar as mn,as as gn,at as wa,au as An,B as V,av as Le,aw as je,ax as gs,ay as Ur,az as _e,aA as Br,H as Ue,aB as As,aC as ys,n as xs,s as bs,aD as Y,aE as ce,aF as Be,aG as ws,aH as Cs,aI as vs,u as Es}from"./settings-C-VBtt9r.js";import{A as Ca,a as Is,b as js,n as va,d as ks,e as Ps}from"./ai-connections-CHNTKemd.js";import{W as Ds,T as Fs}from"./workspace-layout-BxXNKgf9.js";import{a as yn,P as Us,c as Ve,h as Bs,g as Ss,R as Ms,d as Ns,F as Rs,D as Ea,e as Ia,u as an,C as Os,i as Ks,b as ja,f as Ts,A as Ls}from"./index-1Q2cRjZd.js";import{B as on}from"./badge-Bcs8iWrH.js";import{r as Qs,a as Hs,b as qs}from"./index-browser-CazX1pc2.js";var Vs=Object.defineProperty,Oe=(e,t)=>Vs(e,"name",{value:t,configurable:!0}),dr="Dialog",[ka,Zu]=ga(dr),[zs,Je]=ka(dr),Js=Oe(e=>{const{__scopeDialog:t,children:n,open:r,defaultOpen:o,onOpenChange:s,modal:i=!0}=e,c=p.useRef(null),d=p.useRef(null),[u,f]=Ia({prop:r,defaultProp:o??!1,onChange:s,caller:dr}),[h,A]=p.useState(0),[g,I]=p.useState(0);return a.jsx(zs,{scope:t,triggerRef:c,contentRef:d,contentId:an(),titleId:an(),descriptionId:an(),titlePresent:h>0,descriptionPresent:g>0,setTitleCount:A,setDescriptionCount:I,open:u,onOpenChange:f,onOpenToggle:p.useCallback(()=>f(m=>!m),[f]),modal:i,children:n})},"Dialog"),Gs="DialogTrigger",Xs=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(Gs,r),i=Kt(n,s.triggerRef);return a.jsx(wt.button,{type:"button","aria-haspopup":"dialog","aria-expanded":s.open,"aria-controls":s.open?s.contentId:void 0,"data-state":xn(s.open),...o,ref:i,onClick:Ve(t.onClick,s.onOpenToggle)})},"DialogTrigger")),Pa="DialogPortal",[Ys,Da]=ka(Pa,{forceMount:void 0}),Ws=Oe(e=>{const{__scopeDialog:t,forceMount:n,children:r,container:o}=e,s=Je(Pa,t);return a.jsx(Ys,{scope:t,forceMount:n,children:p.Children.map(r,i=>a.jsx(yn,{present:n||s.open,children:a.jsx(Us,{asChild:!0,container:o,children:i})}))})},"DialogPortal"),Vn="DialogOverlay",Fa=p.forwardRef(Oe(function(t,n){const r=Da(Vn,t.__scopeDialog),{forceMount:o=r.forceMount,...s}=t,i=Je(Vn,t.__scopeDialog);return i.modal?a.jsx(yn,{present:o||i.open,children:a.jsx(_s,{...s,ref:n})}):null},"DialogOverlay")),Zs=ls("DialogOverlay.RemoveScroll"),_s=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(Vn,r),i=Ss(),c=Kt(n,i);return a.jsx(Ms,{as:Zs,allowPinchZoom:!0,shards:[s.contentRef],children:a.jsx(wt.div,{"data-state":xn(s.open),...o,ref:c,style:{pointerEvents:"auto",...o.style}})})},"DialogOverlayImpl")),St="DialogContent",Ua=p.forwardRef(Oe(function(t,n){const r=Da(St,t.__scopeDialog),{forceMount:o=r.forceMount,...s}=t,i=Je(St,t.__scopeDialog);return a.jsx(yn,{present:o||i.open,children:i.modal?a.jsx($s,{...s,ref:n}):a.jsx(ei,{...s,ref:n})})},"DialogContent")),$s=p.forwardRef(Oe(function(t,n){const r=Je(St,t.__scopeDialog),o=p.useRef(null),s=Kt(n,r.contentRef,o);return p.useEffect(()=>{const i=o.current;if(i)return Bs(i)},[]),a.jsx(Ba,{...t,ref:s,trapFocus:r.open,disableOutsidePointerEvents:r.open,onCloseAutoFocus:Ve(t.onCloseAutoFocus,i=>{i.preventDefault(),r.triggerRef.current?.focus()}),onPointerDownOutside:Ve(t.onPointerDownOutside,i=>{const c=i.detail.originalEvent,d=c.button===0&&c.ctrlKey===!0;(c.button===2||d)&&i.preventDefault()}),onFocusOutside:Ve(t.onFocusOutside,i=>i.preventDefault())})},"DialogContentModal")),ei=p.forwardRef(Oe(function(t,n){const r=Je(St,t.__scopeDialog),o=p.useRef(!1),s=p.useRef(!1);return a.jsx(Ba,{...t,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:i=>{t.onCloseAutoFocus?.(i),i.defaultPrevented||(o.current||r.triggerRef.current?.focus(),i.preventDefault()),o.current=!1,s.current=!1},onInteractOutside:i=>{t.onInteractOutside?.(i),i.defaultPrevented||(o.current=!0,i.detail.originalEvent.type==="pointerdown"&&(s.current=!0));const c=i.target;r.triggerRef.current?.contains(c)&&i.preventDefault(),i.detail.originalEvent.type==="focusin"&&s.current&&i.preventDefault()}})},"DialogContentNonModal")),Ba=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,trapFocus:o,onOpenAutoFocus:s,onCloseAutoFocus:i,...c}=t,d=Je(St,r);return Ns(),a.jsx(a.Fragment,{children:a.jsx(Rs,{asChild:!0,loop:!0,trapped:o,onMountAutoFocus:s,onUnmountAutoFocus:i,children:a.jsx(Ea,{role:"dialog",id:d.contentId,"aria-describedby":d.descriptionPresent?d.descriptionId:void 0,"aria-labelledby":d.titlePresent?d.titleId:void 0,"data-state":xn(d.open),...c,ref:n,deferPointerDownOutside:!0,onDismiss:()=>d.onOpenChange(!1)})})})},"DialogContentImpl")),ti="DialogTitle",Sa=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(ti,r),{setTitleCount:i}=s;return or(()=>(i(c=>c+1),()=>i(c=>c-1)),[i]),a.jsx(wt.h2,{id:s.titleId,...o,ref:n})},"DialogTitle")),ni="DialogDescription",Ma=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(ni,r),{setDescriptionCount:i}=s;return or(()=>(i(c=>c+1),()=>i(c=>c-1)),[i]),a.jsx(wt.p,{id:s.descriptionId,...o,ref:n})},"DialogDescription")),ri="DialogClose",ai=p.forwardRef(Oe(function(t,n){const{__scopeDialog:r,...o}=t,s=Je(ri,r);return a.jsx(wt.button,{type:"button",...o,ref:n,onClick:Ve(t.onClick,()=>s.onOpenChange(!1))})},"DialogClose"));function xn(e){return e?"open":"closed"}Oe(xn,"getState");const oi=[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]],ln=ie("box",oi);const si=[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]],Na=ie("brain",si);const ii=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],st=ie("check",ii);const ci=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],zn=ie("copy",ci);const li=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],bn=ie("external-link",li);const di=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],ui=ie("eye-off",di);const fi=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],pi=ie("eye",fi);const hi=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]],Ra=ie("globe",hi);const mi=[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]],gi=ie("grip-vertical",mi);const Ai=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],Oa=ie("image",Ai);const yi=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Ka=ie("info",yi);const xi=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],Jn=ie("key-round",xi);const bi=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],wi=ie("log-out",bi);const Ci=[["rect",{x:"14",y:"4",width:"4",height:"16",rx:"1",key:"zuxfzm"}],["rect",{x:"6",y:"4",width:"4",height:"16",rx:"1",key:"1okwgv"}]],vi=ie("pause",Ci);const Ei=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],Ta=ie("pencil",Ei);const Ii=[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]],ji=ie("play",Ii);const ki=[["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m18 3-4 4h6l-4 4",key:"16psg9"}]],Pi=ie("plug-zap",ki);const Di=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],vt=ie("plus",Di);const Fi=[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]],Sr=ie("refresh-ccw",Fi);const Ui=[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]],Gn=ie("rotate-cw",Ui);const Bi=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],La=ie("search",Bi);const Si=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Mi=ie("settings-2",Si);const Ni=[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]],Ri=ie("square-terminal",Ni);const Oi=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],ur=ie("trash-2",Oi);const Ki=[["path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",key:"18etb6"}],["path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",key:"xoc0q4"}]],Ti=ie("wallet",Ki),Tt=Js,Li=Xs,Qi=Ws,Qa=p.forwardRef(({className:e,...t},n)=>a.jsx(Fa,{ref:n,className:me("fixed inset-0 z-50 bg-black/40","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t}));Qa.displayName=Fa.displayName;const Et=p.forwardRef(({className:e,children:t,variant:n="center",...r},o)=>a.jsxs(Qi,{children:[a.jsx(Qa,{}),a.jsxs(Ua,{ref:o,className:me(n==="sheet-left"?"fixed inset-y-0 left-0 z-50 flex h-dvh w-[min(88vw,320px)] flex-col border-r bg-background p-0 shadow-[16px_0_30px_rgba(15,23,42,0.08)] duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-left-full data-[state=open]:slide-in-from-left-full rounded-none":n==="sheet-right"?"fixed inset-y-0 right-0 z-50 flex h-dvh w-full max-w-4xl flex-col border-l bg-background p-0 shadow-[-16px_0_30px_rgba(15,23,42,0.08)] duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-right-full rounded-none":"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg",e),...r,children:[t,a.jsxs(ai,{className:me("absolute right-4 top-4 rounded-xl opacity-70 transition-all hover:opacity-100 hover:bg-muted/50 p-1 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",us),children:[a.jsx(ds,{className:"h-4 w-4"}),a.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));Et.displayName=Ua.displayName;const Lt=({className:e,...t})=>a.jsx("div",{className:me("flex flex-col space-y-1.5 text-center sm:text-left",e),...t});Lt.displayName="DialogHeader";const Mt=({className:e,...t})=>a.jsx("div",{className:me("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});Mt.displayName="DialogFooter";const It=p.forwardRef(({className:e,...t},n)=>a.jsx(Sa,{ref:n,className:me("text-lg font-semibold leading-none tracking-tight",e),...t}));It.displayName=Sa.displayName;const Hi=p.forwardRef(({className:e,...t},n)=>a.jsx(Ma,{ref:n,className:me("text-sm text-muted-foreground",e),...t}));Hi.displayName=Ma.displayName;var qi=Object.defineProperty,be=(e,t)=>qi(e,"name",{value:t,configurable:!0}),[fr,_u]=ga("Tooltip",[ja]),pr=ja(),Vi="TooltipProvider",zi=700,Xn="tooltip.open",[Ji,hr]=fr(Vi),Gi=be(e=>{const{__scopeTooltip:t,delayDuration:n=zi,skipDelayDuration:r=300,disableHoverableContent:o=!1,children:s}=e,i=p.useRef(!0),c=p.useRef(!1),d=p.useRef(0);return p.useEffect(()=>{const u=d.current;return()=>window.clearTimeout(u)},[]),a.jsx(Ji,{scope:t,isOpenDelayedRef:i,delayDuration:n,onOpen:p.useCallback(()=>{r<=0||(window.clearTimeout(d.current),i.current=!1)},[r]),onClose:p.useCallback(()=>{r<=0||(window.clearTimeout(d.current),d.current=window.setTimeout(()=>i.current=!0,r))},[r]),isPointerInTransitRef:c,onPointerInTransitChange:p.useCallback(u=>{c.current=u},[]),disableHoverableContent:o,children:s})},"TooltipProvider"),Yn="Tooltip",[Xi,wn]=fr(Yn),Yi=be(e=>{const{__scopeTooltip:t,children:n,open:r,defaultOpen:o,onOpenChange:s,disableHoverableContent:i,delayDuration:c}=e,d=hr(Yn,e.__scopeTooltip),u=pr(t),[f,h]=p.useState(null),[A,g]=p.useState(void 0),I=an(),m=p.useRef(0),E=i??d.disableHoverableContent,P=c??d.delayDuration,x=p.useRef(!1),[F,v]=Ia({prop:r,defaultProp:o??!1,onChange:be(N=>{N?(d.onOpen(),document.dispatchEvent(new CustomEvent(Xn))):d.onClose(),s?.(N)},"onChange"),caller:Yn}),M=p.useMemo(()=>F?x.current?"delayed-open":"instant-open":"closed",[F]),j=p.useCallback(()=>{window.clearTimeout(m.current),m.current=0,x.current=!1,v(!0)},[v]),y=p.useCallback(()=>{window.clearTimeout(m.current),m.current=0,v(!1)},[v]),w=p.useCallback(()=>{window.clearTimeout(m.current),m.current=window.setTimeout(()=>{x.current=!0,v(!0),m.current=0},P)},[P,v]);p.useEffect(()=>()=>{m.current&&(window.clearTimeout(m.current),m.current=0)},[]);const S=A??I;return a.jsx(Ts,{...u,children:a.jsx(Xi,{scope:t,contentId:S,setContentId:g,open:F,stateAttribute:M,trigger:f,onTriggerChange:h,onTriggerEnter:p.useCallback(()=>{d.isOpenDelayedRef.current?w():j()},[d.isOpenDelayedRef,w,j]),onTriggerLeave:p.useCallback(()=>{E?y():(window.clearTimeout(m.current),m.current=0)},[y,E]),onOpen:j,onClose:y,disableHoverableContent:E,children:n})})},"Tooltip"),Mr="TooltipTrigger",Wi=p.forwardRef(be(function(t,n){const{__scopeTooltip:r,...o}=t,s=wn(Mr,r),i=hr(Mr,r),c=pr(r),d=p.useRef(null),u=Kt(n,d,s.onTriggerChange),f=p.useRef(!1),h=p.useRef(!1),A=p.useCallback(()=>f.current=!1,[]);return p.useEffect(()=>()=>document.removeEventListener("pointerup",A),[A]),a.jsx(Ls,{asChild:!0,...c,children:a.jsx(wt.button,{"aria-describedby":s.open?s.contentId:void 0,"data-state":s.stateAttribute,...o,ref:u,onPointerMove:Ve(t.onPointerMove,g=>{g.pointerType!=="touch"&&!h.current&&!i.isPointerInTransitRef.current&&(s.onTriggerEnter(),h.current=!0)}),onPointerLeave:Ve(t.onPointerLeave,()=>{s.onTriggerLeave(),h.current=!1}),onPointerDown:Ve(t.onPointerDown,()=>{s.open&&s.onClose(),f.current=!0,document.addEventListener("pointerup",A,{once:!0})}),onFocus:Ve(t.onFocus,()=>{f.current||s.onOpen()}),onBlur:Ve(t.onBlur,s.onClose),onClick:Ve(t.onClick,s.onClose)})})},"TooltipTrigger")),Zi="TooltipPortal",[$u,_i]=fr(Zi,{forceMount:void 0}),Nt="TooltipContent",$i=p.forwardRef(be(function(t,n){const r=_i(Nt,t.__scopeTooltip),{forceMount:o=r.forceMount,side:s="top",...i}=t,c=wn(Nt,t.__scopeTooltip);return a.jsx(yn,{present:o||c.open,children:c.disableHoverableContent?a.jsx(Ha,{side:s,...i,ref:n}):a.jsx(ec,{side:s,...i,ref:n})})},"TooltipContent")),ec=p.forwardRef(be(function(t,n){const r=wn(Nt,t.__scopeTooltip),o=hr(Nt,t.__scopeTooltip),s=p.useRef(null),i=Kt(n,s),[c,d]=p.useState(null),{trigger:u,onClose:f}=r,h=s.current,{onPointerInTransitChange:A}=o,g=p.useCallback(()=>{d(null),A(!1)},[A]),I=p.useCallback((m,E)=>{const P=m.currentTarget,x={x:m.clientX,y:m.clientY},F=qa(x,P.getBoundingClientRect()),v=Va(x,F),M=za(E.getBoundingClientRect()),j=Ga([...v,...M]);d(j),A(!0)},[A]);return p.useEffect(()=>()=>g(),[g]),p.useEffect(()=>{if(u&&h){const m=be(P=>I(P,h),"handleTriggerLeave"),E=be(P=>I(P,u),"handleContentLeave");return u.addEventListener("pointerleave",m),h.addEventListener("pointerleave",E),()=>{u.removeEventListener("pointerleave",m),h.removeEventListener("pointerleave",E)}}},[u,h,I,g]),p.useEffect(()=>{if(c){const m=be(E=>{const P=E.target,x={x:E.clientX,y:E.clientY},F=u?.contains(P)||h?.contains(P),v=!Ja(x,c);F?g():v&&(g(),f())},"handleTrackPointerGrace");return document.addEventListener("pointermove",m),()=>document.removeEventListener("pointermove",m)}},[u,h,c,f,g]),a.jsx(Ha,{...t,ref:i})},"TooltipContentHoverable")),tc=fs("TooltipContent"),Ha=p.forwardRef(be(function(t,n){const{__scopeTooltip:r,children:o,"aria-label":s,id:i,onEscapeKeyDown:c,onPointerDownOutside:d,...u}=t,f=wn(Nt,r),h=pr(r),{onClose:A}=f;p.useEffect(()=>(document.addEventListener(Xn,A),()=>document.removeEventListener(Xn,A)),[A]),p.useEffect(()=>{if(f.trigger){const I=be(m=>{m.target instanceof Node&&m.target.contains(f.trigger)&&A()},"handleScroll");return window.addEventListener("scroll",I,{capture:!0}),()=>window.removeEventListener("scroll",I,{capture:!0})}},[f.trigger,A]);const{setContentId:g}=f;return or(()=>(g(i),()=>{g(void 0)}),[i,g]),a.jsx(Ea,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:c,onPointerDownOutside:d,onFocusOutside:I=>I.preventDefault(),onDismiss:A,children:a.jsxs(Os,{"data-state":f.stateAttribute,role:s?void 0:"tooltip",id:s?void 0:f.contentId,...h,...u,ref:n,style:{...u.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[a.jsx(tc,{children:o}),s?a.jsx(Ks,{id:f.contentId,role:"tooltip",children:s}):null]})})},"TooltipContentImpl"));function qa(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),o=Math.abs(t.right-e.x),s=Math.abs(t.left-e.x);switch(Math.min(n,r,o,s)){case s:return"left";case o:return"right";case n:return"top";case r:return"bottom";default:throw new Error("unreachable")}}be(qa,"getExitSideFromRect");function Va(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":r.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":r.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":r.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return r}be(Va,"getPaddedExitPoints");function za(e){const{top:t,right:n,bottom:r,left:o}=e;return[{x:o,y:t},{x:n,y:t},{x:n,y:r},{x:o,y:r}]}be(za,"getPointsFromRect");function Ja(e,t){const{x:n,y:r}=e;let o=!1;for(let s=0,i=t.length-1;s<t.length;i=s++){const c=t[s],d=t[i],u=c.x,f=c.y,h=d.x,A=d.y;f>r!=A>r&&n<(h-u)*(r-f)/(A-f)+u&&(o=!o)}return o}be(Ja,"isPointInPolygon");function Ga(e){const t=e.slice();return t.sort((n,r)=>n.x<r.x?-1:n.x>r.x?1:n.y<r.y?-1:n.y>r.y?1:0),Xa(t)}be(Ga,"getHull");function Xa(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r<e.length;r++){const o=e[r];for(;t.length>=2;){const s=t[t.length-1],i=t[t.length-2];if((s.x-i.x)*(o.y-i.y)>=(s.y-i.y)*(o.x-i.x))t.pop();else break}t.push(o)}t.pop();const n=[];for(let r=e.length-1;r>=0;r--){const o=e[r];for(;n.length>=2;){const s=n[n.length-1],i=n[n.length-2];if((s.x-i.x)*(o.y-i.y)>=(s.y-i.y)*(o.x-i.x))n.pop();else break}n.push(o)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}be(Xa,"getHullPresorted");var nc=Gi,rc=Yi,ac=Wi,Ya=$i;const Wa=nc,Cn=rc,vn=ac,Qt=p.forwardRef(({className:e,sideOffset:t=4,...n},r)=>a.jsx(Ya,{ref:r,sideOffset:t,className:me("z-50 overflow-hidden rounded-md border border-border/50 bg-popover","px-2 py-1 text-xs text-popover-foreground shadow-md","animate-in fade-in-0 zoom-in-95","data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95","data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n}));Qt.displayName=Ya.displayName;function oc(e){const t=Aa(e).type;return Array.isArray(t)&&t.includes(sr.AccessControlResource)}async function En(e,t){if(!Gt(e))return{resourceAcl:null,fallbackAcl:null};try{const n=await Za(e,t);return n===null?{resourceAcl:null,fallbackAcl:await _a(e,t)}:{resourceAcl:n,fallbackAcl:null}}catch(n){if(n instanceof Wn)return{resourceAcl:null,fallbackAcl:null};throw n}}async function Za(e,t){if(!Gt(e))return null;try{const n=await ya(e.internal_resourceInfo.aclUrl,t);if(oc(n))throw new Wn(e,n);return xa({...n,internal_accessTo:ve(e)})}catch(n){if(n instanceof Wn)throw n;return null}}async function _a(e,t){const n=new URL(ve(e)),r=n.pathname;if(r==="/")return null;const o=sc(r),s=new URL(o,n.origin).href,i=await pt(s,t);if(!Gt(i))return null;const c=await Za(i,t);return c===null?_a(i,t):c}function sc(e){const t=e.substring(e.length-1)==="/"?e.substring(0,e.length-1):e;return`${e.substring(0,t.lastIndexOf("/"))}/`}function at(e){return cr(e).filter(ic)}function ic(e){return ke(e,hn.type).includes(T.Authorization)}function mr(e,t){return e.filter(n=>cc(n,t))}function cc(e,t){return ke(e,T.accessTo).includes(t)}function In(e,t){return e.filter(n=>lc(n,t))}function lc(e,t){return ke(e,T.default).includes(t)||ke(e,T.defaultForNew).includes(t)}function Ht(e){const t=ke(e,T.mode);return t.includes(ze.write)?{read:t.includes(ze.read),append:!0,write:!0,control:t.includes(ze.control)}:{read:t.includes(ze.read),append:t.includes(ze.append),write:!1,control:t.includes(ze.control)}}function qt(e){return e.reduce((t,n)=>t.write||n.write?{read:t.read||n.read,append:!0,write:!0,control:t.control||n.control}:{read:t.read||n.read,append:t.append||n.append,write:!1,control:t.control||n.control},{read:!1,append:!1,write:!1,control:!1})}function dc(e){return at(e).filter(uc).reduce(ps,e)}function uc(e){return hs(e.predicates,Re.namedNode(e.url),Re.defaultGraph()).some(t=>!fc(t))?!1:tt(e,T.accessTo)===null&&tt(e,T.default)===null&&tt(e,T.defaultForNew)===null||tt(e,T.mode)===null||tt(e,T.agent)===null&&tt(e,T.agentGroup)===null&&tt(e,T.agentClass)===null}function fc(e){const{predicate:t}=e,{object:n}=e;return!!(t.equals(Re.namedNode(hn.type))&&n.equals(Re.namedNode(T.Authorization))||t.equals(Re.namedNode(T.accessTo))||t.equals(Re.namedNode(T.default))||t.equals(Re.namedNode(T.defaultForNew))||t.equals(Re.namedNode(T.mode))&&Object.values(ze).some(r=>n.equals(Re.namedNode(r)))||t.equals(Re.namedNode(T.agent))||t.equals(Re.namedNode(T.agentGroup))||t.equals(Re.namedNode(T.agentClass))||t.equals(Re.namedNode(T.origin)))}const ze={read:"http://www.w3.org/ns/auth/acl#Read",append:"http://www.w3.org/ns/auth/acl#Append",write:"http://www.w3.org/ns/auth/acl#Write",control:"http://www.w3.org/ns/auth/acl#Control"};function pc(e,t,n){return e.filter(r=>ke(r,n).includes(t))}function hc(e,t){const n={};return e.forEach(r=>{const o=ke(r,t),s=Ht(r);o.forEach(i=>{n[i]=typeof n[i]>"u"?s:qt([n[i],s])})}),n}function $a(e){let t=Ct();return t=ut(t,hn.type,T.Authorization),e.read&&(t=$e(t,T.mode,ze.read)),e.append&&!e.write&&(t=$e(t,T.mode,ze.append)),e.write&&(t=$e(t,T.mode,ze.write)),e.control&&(t=$e(t,T.mode,ze.control)),t}function mc(e){let t=Ct();t=ut(t,hn.type,T.Authorization);function n(r,o,s){return ke(r,s).reduce((i,c)=>$e(i,s,c),o)}return t=n(e,t,T.accessTo),t=n(e,t,T.default),t=n(e,t,T.defaultForNew),t=n(e,t,T.agent),t=n(e,t,T.agentGroup),t=n(e,t,T.agentClass),t=n(e,t,T.origin),t=n(e,t,T.mode),t}function Vt(e,t){return Object.assign(ir(e),{internal_acl:t})}const gc=[T.agent,T.agentClass,T.agentGroup,T.origin];function Ac(e,t,n,r,o){if(!ke(e,n).includes(t)){const c=$a({read:!1,append:!1,write:!1,control:!1});return[e,c]}const s=qn(e,n,t);let i=mc(e);return i=qn(i,T.accessTo,r),i=ut(i,n,t),gc.filter(c=>c!==n).forEach(c=>{i=cn(i,c)}),[s,i]}function eo(e,t,n,r,o){let s=e;cr(e).forEach(d=>{const[u,f]=Ac(d,o,n,e.internal_accessTo);s=Ut(s,u),s=Ut(s,f)});let i=$a(t);i=ut(i,T.accessTo,e.internal_accessTo),i=ut(i,n,o);const c=Ut(s,i);return dc(c)}function to(e,t){return Vt(e,{resourceAcl:t,fallbackAcl:null})}function yc(e){return e.internal_acl.resourceAcl}class Wn extends Error{constructor(t,n){super(`[${Fr(t)}] is governed by Access Control Policies in [${Fr(n)}] rather than by Web Access Control.`)}}function zt(e){return e.internal_acl.resourceAcl!==null&&ve(e)===e.internal_acl.resourceAcl.internal_accessTo&&e.internal_resourceInfo.aclUrl===ve(e.internal_acl.resourceAcl)}function gr(e){return zt(e)?e.internal_acl.resourceAcl:null}function Jt(e){return e.internal_acl.fallbackAcl!==null}function xc(e){return Jt(e)?e.internal_acl.fallbackAcl:null}function bc(e){return xa({...ms(),internal_accessTo:ve(e),internal_resourceInfo:{sourceIri:e.internal_resourceInfo.aclUrl,isRawData:!1,linkedResources:{}}})}function wc(e){const t=bc(e),n=at(e.internal_acl.fallbackAcl);return In(n,e.internal_acl.fallbackAcl.internal_accessTo).map(i=>(i=cn(i,T.default),i=cn(i,T.defaultForNew),i=ut(i,T.accessTo,ve(e)),i=ut(i,T.default,ve(e)),i)).reduce(Ut,t)}async function Cc(e,t,n){if(!Gt(e))throw new Error(`Could not determine the location of the ACL for the Resource at [${ve(e)}]; possibly the current user does not have Control access to that Resource. Try calling \`hasAccessibleAcl()\` before calling \`saveAclFor()\`.`);return{...await ba(e.internal_resourceInfo.aclUrl,t,n),internal_accessTo:ve(e)}}function Gt(e){return typeof e.internal_resourceInfo.aclUrl=="string"}function no(e,t){return zt(e)?Ec(e.internal_acl.resourceAcl,t):Jt(e)?kc(e.internal_acl.fallbackAcl,t):null}function vc(e){if(zt(e)){const t=gr(e);return Ic(t)}if(Jt(e)){const t=xc(e);return Pc(t)}return null}function Ec(e,t){const n=at(e),r=mr(n,e.internal_accessTo),s=ro(r,t).map(Ht);return qt(s)}function Ic(e){const t=at(e),n=mr(t,e.internal_accessTo),r=ao(n);return oo(r)}function jc(e,t,n){return eo(e,n,T.agent,"resource",t)}function kc(e,t){const n=at(e),r=In(n,e.internal_accessTo),s=ro(r,t).map(Ht);return qt(s)}function Pc(e){const t=at(e),n=In(t,e.internal_accessTo),r=ao(n);return oo(r)}function ro(e,t){return pc(e,t,T.agent)}function ao(e){return e.filter(Dc)}function Dc(e){return tt(e,T.agent)!==null}function oo(e){return hc(e,T.agent)}function so(e){return zt(e)?Fc(e.internal_acl.resourceAcl):Jt(e)?Uc(e.internal_acl.fallbackAcl):null}function Fc(e){const t=at(e),n=mr(t,e.internal_accessTo),o=io(n,lr.Agent).map(Ht);return qt(o)}function Uc(e){const t=at(e),n=In(t,e.internal_accessTo),o=io(n,lr.Agent).map(Ht);return qt(o)}function Bc(e,t){return eo(e,t,T.agentClass,"resource",lr.Agent)}function io(e,t){return e.filter(n=>Sc(n,t))}function Sc(e,t){return ke(e,T.agentClass).includes(t)}async function co(e,t){if(typeof e.internal_resourceInfo.aclUrl!="string")return null;try{return await pt(e.internal_resourceInfo.aclUrl,t)}catch{return null}}const Ke="http://www.w3.org/ns/solid/acp#",he={AccessControlResource:Ke.concat("AccessControlResource"),PublicAgent:Ke.concat("PublicAgent"),access:Ke.concat("access"),accessControl:Ke.concat("accessControl"),agent:Ke.concat("agent"),allOf:Ke.concat("allOf"),allow:Ke.concat("allow"),anyOf:Ke.concat("anyOf"),apply:Ke.concat("apply"),deny:Ke.concat("deny"),memberAccessControl:Ke.concat("memberAccessControl"),noneOf:Ke.concat("noneOf")},Un="http://www.w3.org/ns/auth/acl#",gt={Append:Un.concat("Append"),Read:Un.concat("Read"),Write:Un.concat("Write")};async function lo(e,t){const n=Me(e),r=await ba(ve(n),n,t);return Nc(e,r)}function Mc(e){return typeof e.internal_acp=="object"&&e.internal_acp!==null&&typeof e.internal_acp.acr=="object"&&e.internal_acp.acr!==null}function Me(e){if(!Mc(e))throw new Error(`An Access Control Resource for [${ve(e)}] is not available. This could be because the current user is not allowed to see it, or because their Pod Server does not support Access Control Resources.`);return e.internal_acp.acr}function Nc(e,t){return Object.assign(ir(e),{internal_acp:{...e.internal_acp,acr:t}})}function uo(e){const t=Me(e),n=ve(t);return Xe(t,n)}function fo(e){const t=uo(e);return t===null?[]:ke(t,he.accessControl)}function po(e,t,n){const r=Me(e);return Array.from(new Set(t.map(o=>{const s=Xe(r,o);return s!==null?ke(s,n):[]}).reduce((o,s)=>o.concat(s),[])))}function Rc(e){return po(e,fo(e),he.apply)}function Oc(e){return po(e,fo(e),he.access)}function ho(e,t){const n=ke(e,t);return{read:n.includes(gt.Read),append:n.includes(gt.Append),write:n.includes(gt.Write),controlRead:!1,controlWrite:!1}}function Kc(e){return ho(e,he.allow)}function Tc(e){return ho(e,he.deny)}function Nr(e,t,n){const r=ot(t,he.allOf).map(u=>Xe(Me(e),u)).filter(u=>u!==null),o=r.every(u=>ot(u,he.agent).includes(n)),s=ot(t,he.anyOf).map(u=>Xe(Me(e),u)).filter(u=>u!==null),i=s.some(u=>ot(u,he.agent).includes(n)),c=ot(t,he.noneOf).map(u=>Xe(Me(e),u)).filter(u=>u!==null),d=c.some(u=>ot(u,he.agent).includes(n));return r.length+s.length>0&&(r.length===0||o)&&(s.length===0||i)&&(c.length===0||!d)}function Rr(e,t,n){const r=Kc(e),o=Tc(e);return n==="control"?{read:t.read,append:t.append,write:t.write,controlRead:(t.controlRead||r.read)&&!o.read,controlWrite:(t.controlWrite||r.write)&&!o.write}:{read:(t.read||r.read)&&!o.read,append:(t.append||r.append)&&!o.append,write:(t.write||r.write)&&!o.write,controlRead:t.controlRead,controlWrite:t.controlWrite}}async function jn(e,t){let n={read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1};return Rc(e).map(s=>Xe(Me(e),s)).filter(s=>s!==null).forEach(s=>{Nr(e,s,t)&&(n=Rr(s,n,"resource"))}),Oc(e).map(s=>Xe(Me(e),s)).filter(s=>s!==null).forEach(s=>{Nr(e,s,t)&&(n=Rr(s,n,"control"))}),n}function mo(e,t){var n,r,o,s;if(e.controlRead!==e.controlWrite)throw new Error("For Pods using Web Access Control, controlRead and controlWrite must be equal.");return{read:(n=e.read)!==null&&n!==void 0?n:t.read,append:(r=e.append)!==null&&r!==void 0?r:t.append,write:(o=e.write)!==null&&o!==void 0?o:t.write,control:(s=e.controlRead)!==null&&s!==void 0?s:t.control}}function Ar(e){return{read:e.read,write:e.write,append:e.append,controlRead:e.control,controlWrite:e.control}}async function Lc(e,t,n,r){const o=await En(e,r),s=n(Vt(e,o),t);return s===null?null:Ar(s)}async function Qc(e,t,n){const r=await En(e,n),o=t(Vt(e,r));return o===null?null:Ar(o)}async function Hc(e,t,n){const r=await En(e,n),o=t(Vt(e,r));if(o===null)return null;const s={};for(const[i,c]of Object.entries(o))s[i]=Ar(c);return s}function go(e,t,n){return Lc(e,t,no,n)}function Ao(e,t){return Qc(e,so,t)}function qc(e,t){return Hc(e,vc,t)}async function yo(e,t){if(!Gt(e))return null;const n=await En(e,t),r=Vt(e,n);let o;if(zt(r))o=yc(r);else if(Jt(r))o=wc(r);else return null;return to(r,o)}async function xo(e,t,n){let r=null;try{return r=await Cc(e,t,n),to(e,r)}catch{return null}}async function Vc(e,t,n,r,o){const s=await yo(e,o);if(s===null)return null;const i=gr(s),c=n(s),d=mo(t,c),u=r(i,d);return xo(s,u,o)}async function zc(e,t,n,r,o,s){const i=await yo(e,s);if(i===null)return null;const c=r(i,t),d=gr(i),u=mo(n,c),f=o(d,t,u);return xo(i,f,s)}async function Jc(e,t,n,r){return zc(e,t,n,no,jc,r)}async function Gc(e,t,n){return Vc(e,t,so,Bc,n)}async function Xc(e,t){const n=await co(e,t);if(n===null)return null;const r=Aa(n).type;return Array.isArray(r)&&r.includes(he.AccessControlResource)?ve(n):null}async function Xt(e,t){const n=await Xc(e,t);if(n===null)return null;let r;try{r=await ya(n,t)}catch{return null}return{...e,internal_acp:{acr:{...r,accessTo:ve(e)}}}}async function bo(e,t,n){const r=await pt(e,n),o=await Xt(r,n);return o===null?go(r,t,n):jn(o,t)}function Yc(e){return Array.from(new Set(cr(Me(e)).map(t=>ot(t,he.agent)).reduce((t,n)=>t.concat(n),[])))}async function Wc(e){return(await Promise.all(Yc(e).map(async t=>({[t]:await jn(e,t)})))).reduce((t,n)=>({...t,...n}),{})}async function Zc(e,t){const n=await pt(e,t),r=await Xt(n,t);return r===null?qc(n,t):Wc(r)}async function _c(e){return jn(e,he.PublicAgent)}async function wo(e,t){const n=await pt(e,t),r=await Xt(n,t);return r===null?Ao(n,t):_c(r)}function Yt(e,t){return Object.assign(ir(e),{internal_acp:{...e.internal_acp,acr:Ut(e.internal_acp.acr,t)}})}const Bt="defaultAccessControl",dn="defaultAcrAccessControl";function yr(e,t){const n=Me(e);return ve(n).concat("#").concat(t)}function xr(e,t,n){return yr(e,t).concat("AgentMatcher").concat(n.charAt(0).toUpperCase()+n.slice(1)).concat("Policy")}function Co(e,t){const n=Me(e),r=yr(e,t),o=Xe(n,r);return o===null||typeof o>"u"?Ct({url:r}):o}function Or(e){return e.includes("Member")?he.memberAccessControl:he.accessControl}function vo(e,t){const n=yr(e,t),r=Me(e);let o=uo(e);return(o===null||typeof o>"u")&&(o=Ct({url:ve(r)})),ke(o,Or(t)).includes(n)?e:(o=mn(o).addUrl(Or(t),n).build(),Yt(e,o))}function $c(e,t){const n=vo(e,dn),r=Co(n,dn);return Yt(n,mn(r).addUrl(he.access,t).build())}function el(e,t){const n=vo(e,Bt),r=Co(n,Bt);return Yt(n,mn(r).addUrl(he.apply,t).build())}function tl(e,t,n){const r=xr(e,t,n);return r.includes("Acr")?$c(e,r):el(e,r)}function Eo(e,t,n){return xr(e,t,n).concat("Matcher")}function nl(e,t,n){let r=cn(e,n);return(t.read||t.controlRead)&&(r=$e(r,n,gt.Read)),t.append&&(r=$e(r,n,gt.Append)),(t.write||t.controlWrite)&&(r=$e(r,n,gt.Write)),r}const Kr=he.anyOf;function rl(e,t,n){const r=xr(e,t,n),o=Eo(e,t,n);let s=Xe(Me(e),r);return s||(e=tl(e,t,n),s=Ct({url:r}),s=nl(s,{[n]:!0},he.allow)),ke(s,Kr).includes(o)?e:(s=mn(s).addUrl(Kr,o).build(),Yt(e,s))}function al(e,t){return $e(e,sr.agent,t)}function ol(e,t){return qn(e,sr.agent,t)}function kt(e,t,n,r,o){var s;const i=Eo(e,n,r),c=rl(e,n,r),d=(s=Xe(Me(c),i))!==null&&s!==void 0?s:Ct({url:i});return Yt(c,o==="add"?al(d,t):ol(d,t))}async function Io(e,t,n){const r=await jn(e,t);return typeof n.read=="boolean"&&r.read!==n.read&&(e=kt(e,t,Bt,"read",n.read?"add":"remove")),typeof n.append=="boolean"&&r.append!==n.append&&(e=kt(e,t,Bt,"append",n.append?"add":"remove")),typeof n.write=="boolean"&&r.write!==n.write&&(e=kt(e,t,Bt,"write",n.write?"add":"remove")),typeof n.controlRead=="boolean"&&r.controlRead!==n.controlRead&&(e=kt(e,t,dn,"controlRead",n.controlRead?"add":"remove")),typeof n.controlWrite=="boolean"&&r.controlWrite!==n.controlWrite&&(e=kt(e,t,dn,"controlWrite",n.controlWrite?"add":"remove")),e}async function sl(e,t,n,r){const o=await pt(e,r),s=await Xt(o,r);if(s===null)return await Jc(o,t,n,r),go(o,t,r);try{return await lo(await Io(s,t,n),r),await bo(e,t,r)}catch{return null}}async function il(e,t){return Io(e,he.PublicAgent,t)}async function cl(e,t,n){const r=await pt(e,n),o=await Xt(r,n);if(o===null)return await Gc(r,t,n),Ao(r,n);try{return await lo(await il(o,t),n),await wo(e,n)}catch{return null}}const ll=Object.freeze(Object.defineProperty({__proto__:null,getAclServerResourceInfo:co,getAgentAccess:bo,getAgentAccessAll:Zc,getPublicAccess:wo,setAgentAccess:sl,setPublicAccess:cl},Symbol.toStringTag,{value:"Module"}));function dl(e){if(!jo(e))throw new Error("Applet layout descriptor must be an object");if(typeof e.type!="string")throw new Error("Applet layout descriptor type must be a string");switch(e.type){case"single-pane":case"two-pane":return Tr(e.context),e;case"three-pane":return Tr(e.context),e;default:throw new Error(`Unsupported applet layout type: ${e.type}`)}}function jo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Tr(e){if(e!==void 0){if(!jo(e))throw new Error("Applet layout descriptor context must be an object");if("collapsible"in e&&typeof e.collapsible!="boolean")throw new Error("Applet layout descriptor context.collapsible must be a boolean");if("initiallyCollapsed"in e&&typeof e.initiallyCollapsed!="boolean")throw new Error("Applet layout descriptor context.initiallyCollapsed must be a boolean")}}function ul(e){const t=e.access??ll;return{inspectAgentAccess:n=>fl(n,e.fetch,t),ensureAgentAccess:async n=>{try{for(const r of n.resources){await pl(r.url,r.mediaType,e.fetch);const o=await t.setAgentAccess(r.url,n.service.webId,ml(r.access),{fetch:e.fetch});if(!o||!ko(o,r.access))return Ze("permissionDenied",n,"Pod did not grant the requested service access.")}return Ze("granted",n)}catch(r){return Ze("permissionDenied",n,Zn(r))}},revokeAgentAccess:async n=>{try{for(const r of n.resources)if(!await t.setAgentAccess(r.url,n.service.webId,{read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1},{fetch:e.fetch}))return Ze("permissionDenied",n,"Pod did not revoke the service access.");return Ze("missing",n)}catch(r){return Ze("permissionDenied",n,Zn(r))}}}}async function fl(e,t,n){try{for(const r of e.resources){const o=await n.getAgentAccess(r.url,e.service.webId,{fetch:t});if(!o||!ko(o,r.access))return Ze("missing",e)}return Ze("granted",e)}catch(r){return Ze("permissionDenied",e,Zn(r))}}async function pl(e,t,n){const r=await n(e,{method:"HEAD"});if(r.ok)return;if(r.status!==404)throw new Error(`Unable to inspect Pod resource (${r.status}).`);await hl(e,n);const o=await n(e,{method:"PUT",headers:{"content-type":t},body:`# Created by the Xpod applet permission broker.
|
|
2
|
+
`});if(!o.ok)throw new Error(`Unable to create Pod resource (${o.status}).`)}async function hl(e,t){const n=new URL(e),r=[];let o=new URL("./",n);for(;o.pathname!=="/";){const s=await t(o.href,{method:"HEAD"});if(s.ok)break;if(s.status!==404)throw new Error(`Unable to inspect Pod container (${s.status}).`);r.push(o.href),o=new URL("../",o)}for(const s of r.reverse()){const i=await t(s,{method:"PUT",headers:{"content-type":"text/turtle",link:'<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"'},body:""});if(!i.ok&&i.status!==409)throw new Error(`Unable to create Pod container (${i.status}).`)}}function ml(e){return{read:e.read===!0,append:e.append===!0,write:e.write===!0,controlRead:!1,controlWrite:!1}}function ko(e,t){return(!t.read||e.read===!0)&&(!t.append||e.append===!0)&&(!t.write||e.write===!0)}function Ze(e,t,n){return{status:e,resources:t.resources,...n?{message:n}:{}}}function Zn(e){return e instanceof Error?e.message:"Unable to update Pod service access."}const gl=dl;function Al(e,t){return yl(e,t)}function yl(e,t){const n=xl(e),r=e.createController(t);return n.type==="single-pane"?{layout:"single-pane",controller:r,element:p.createElement(n.render,{controller:r,host:t})}:n.type==="two-pane"?{layout:"two-pane",controller:r,slots:{listHeader:p.createElement(n.slots.listHeader,{controller:r,host:t}),list:p.createElement(n.slots.list,{controller:r,host:t}),mainHeader:p.createElement(n.slots.mainHeader,{controller:r,host:t}),main:p.createElement(n.slots.main,{controller:r,host:t})}}:{layout:"three-pane",controller:r,contextConfig:n.contextConfig,slots:{listHeader:p.createElement(n.slots.listHeader,{controller:r,host:t}),list:p.createElement(n.slots.list,{controller:r,host:t}),mainHeader:p.createElement(n.slots.mainHeader,{controller:r,host:t}),main:p.createElement(n.slots.main,{controller:r,host:t}),context:p.createElement(n.slots.context,{controller:r,host:t})}}}function xl(e){if("layout"in e){const t=Cl(e.layout),n=gl(t.descriptor),r=n.type;if(e.manifest.layout!==r)throw new Error(`Applet manifest layout ${e.manifest.layout} does not match descriptor layout ${r}`);if(r==="single-pane"){if(!("render"in t))throw new Error("Applet descriptor single-pane render must be a function");return it(t.render,"Applet descriptor single-pane render"),{type:"single-pane",render:t.render}}if(!("slots"in t))throw new Error(`Applet descriptor declares ${r} but no slots were provided`);return r==="two-pane"?(_n(t.slots,"Applet descriptor two-pane"),{type:"two-pane",slots:t.slots}):(bl(t.slots,"Applet descriptor three-pane"),{type:"three-pane",contextConfig:n.context,slots:t.slots})}if(e.manifest.layout==="single-pane"){if(!("render"in e))throw new Error("Applet manifest declares single-pane but no single-pane renderer was provided");return it(e.render,"Applet single-pane render"),{type:"single-pane",render:e.render}}if(e.manifest.layout==="two-pane"&&"slots"in e)return _n(e.slots,"Applet two-pane"),{type:"two-pane",slots:e.slots};throw new Error(`Applet manifest declares ${e.manifest.layout} but no supported applet layout was provided`)}function _n(e,t){wl(e,t),it(e.listHeader,`${t} slot listHeader`),it(e.list,`${t} slot list`),it(e.mainHeader,`${t} slot mainHeader`),it(e.main,`${t} slot main`)}function bl(e,t){_n(e,t),it(e.context,`${t} slot context`)}function wl(e,t){if(typeof e!="object"||e===null)throw new Error(`${t} slots must be an object`)}function it(e,t){if(typeof e!="function")throw new Error(`${t} must be a function`)}function Cl(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("Applet descriptor layout must be an object");if(!("descriptor"in e)||e.descriptor===void 0)throw new Error("Applet descriptor required");return e}const vl="data:image/png;base64,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",El="data:image/png;base64,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",Il="data:image/png;base64,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",jl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAB7CAAAewgFu0HU+AAAcFUlEQVR4nO2deZxcVZn3v6e2TmdPOp193/eErCSBJIAsggFHRZ3RQXFB0VFfxwwzvr6O+jroqOiMozICI4hRlB1BBAGRPYlsWSELgSQknaXTSTqddDq13DN/PH3pztK3q6rvvbX08/18+hPodNU96Tq/c57tPMcs+7xjURTljEQKPQBFKWZUIIrigQpEUTxQgSiKByoQRfFABaIoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8iMWihR6CooRLOpP9z8Zy+WFF6WyoiaUoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8UIEoigcqEEXxQAWiKB6oQBTFAxWIonigAlEUD1QgiuKBCkRRPFCBKIoHKhBF8UAFoigeqEAUxQMViKJ4oAJRFA9UIIrigQpEUTxQgSiKByoQRfFABaIoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8UIEoigcqEEXxQAWiKB6oQBTFAxWIonigAlEUD1QgiuJBrNADUArH4Gq44gLD8Sb49UM2p+uROwsqkE7M/73GMHyQ/LfjGH71oC3sgIoQNbEKTCwKXbtAr+7Qtxf06QndKiEa8CfzniUwbCAkU/K1YKaMQTkZ3UFCJBaFAf1gwkgYMdgwbABU9YEeXSEWA2MAC+kMHG6AN3bCrfdbjjf5O44uFXD+fEMq3fK9If1hzDB45XV/n1XqqEACpiIBo4fCvGmGKWNhxCCZoMbI31vb8qdr4BigqrdMWDD87Lf+mj69e8DIIeA4J39/+gTDK6+rmdUaFUgAJOIwcjAsmGmYNVlMmVhU/i6TkR3CtjMPExFoOAar1/s/YSePkfEkWwkkk4FzZ8MvH/D9cSVNpxeIMVARh3islZnTTDoDJ5Jio7c3oQH694XFc+DsGYbRQ2US2maTKZnKfkyJOKxeJ+bVntrc/03tMXeqOe17GQeq+8BlS+Dhp/1/ZqnSKQRijDigQwdCv97iBwwfZOjZTRziRFzEEY2cLJBMBlJpmdzHjsORY1B7EPbVWfbXwd46iBjZLWZNNsyaBH16yWvd1+VKIg5PrISf3GGzEmU+TB0r/7ZTSabg75cZNmy17KgJ5tmlRtkKpEc3mQjjRhgmj4H+VWJ7u6ZOa7wmojl9sQUM1ooJZCLiZIOswvmIwiUSgde2wU9/G5w4AHr1aHuciTj8/88brr/FsmV7cGMoFcpKIJVdYO5UmDfVMGmM7BbuBHcccGzHJnBrjIFuzcLw6z2TSfjFffY059lPZk3y/nvHgd494ZufM6x4yPLYC2febcIkGoW/u9QwbBA885LluVfCe3ZZCGRgP7jkHMP86ZIdNkY+6Gyc4Xyx1t+JE43C62/C1h3+veeZmDbetPs7SaWhsgI++0HD4tlw7+OWDVuhKRns2Nri2g8ZLloo/z1rkiHjWFauCefZJS2QIQPgivMM584WX8J1iIM0T4IiGiEUk6Zvr9PDu2ci07zjThkLE0cbdu+DJ1fLjnK0Mfhxgix0ly2GC85u2aXjMVg827ByTTgfckkKpFslvP9Cw4ULxfnO5BglKlbCqIWqSLTkW9rDNpukxkio+mNXGC5bAisetDz1YqDDBODSxXDNleakz9ZxJOoYFiUlEGPgrInw2Q8ZBvYrH2GAfPBjhwf/nHRaEpG5YC3vZN379YYv/b1h3Aj45QP2pGy8X3RJwEeXiRhPWzQMNPpcWeBFyQgkGoFPfcBwySKJ9pSLMFzSGZg4Wlbqt/cG95xjTeSukFak0rJQLVsKXSoMP/mNf6ZOr+4wewq8711SRJlKn9lcPtzg2yPbpSQEMrAfLP+4YfxImUhBrFrFQGUFfPoDhm/eGFwka98BSzRiOhRgcE2vCxdIWPrPq7x/3hjo2Q1GDJaar25dJdzuRha7dzUMHSClNX2b80htLYARI3mosCh6gUwZC9d9wtDbI3ZfLjgOzJwIn3q/4ZZ7gsmFrN/q33u5icX1WyVxeirdKmHBDFg40zBmuOSmzpSHcnGc9he/jAP7D3Zs3LlQ1AIZOgC+do2hW2X57hqnkkxJKfrgasMvf2/Zvtvf9/c7jNy3F1y8UHImLok4nD8f/uYCw6Bq+V7GafFlOiL8I0cJNctftOdBRg2Bb/2DobKi84jDJZmCWZPhe182zJjg//sfOy5+nB+kM3De/Jb/HzoA/u0LhmubAynueZNMRnaIjojDGNk99h7o+LizpSgFMrAffP1aQ3UfWXk6I8mUrMT/eq3hM1eaNkpe8mPjG/4dyHIciWwNqpYqhu9/xTBxtCxqfi9ssShsetPf92z3meE+rn369IRvfM7Qt2f5+xztkXFkpb9sCYwaavjR7dYX+3v9Vsu8af4pLuPAP3/SMLBK8ixBfW7GwIsbw80CF9UOEovCVz9tGFwdTtKsFHCaCyAnj4HvftkwbVzH33Pt5o6/R2syGTGJKxLB7fjuDrp+SzDv3xZFJZBPvs8wcVTn8zmyIZkSU+brnzVcuKCtKuPsOHQE9p0h6tQRUulgzeF4TM7HhE3RCOTd58Il56hZ5UUqLRPlc39r+NtL81dIwzHY9nbHRBY2R47CC2vCf25RCKRbJVx1ucm6Rqgz44ZLP/xu+MyVhngeXqTjwO2/tyUjEGPgrd1Qdzj8ZxeFQL7zfwxdu2RXZaq0+CWXLYHlV+c3y/fUysnFRIiFf/kSi8L/3GsLci6l4AI5f74cWVW/I3dSaclUf/sLhq6Vub/+joct9Q3FbWol4vD4ynCTg60pqED694Wr32tUHHni1kTNmADXXW3o0S231x9ugB//2hIpUoEYIyblb/5QOOO7oAK58mJDrx6FHEF54Gbe/+VTufskL22EPz5bnKZWNAK/fdiGWr17KgUTyIAquHiRRq38IpmSJhVf/6z4c7lwyz2W1euKRyTGyFj+9ALc9afCnhAtiECMgS98xGgy0GdSaakG/uJHTc6lJP+xwvLShuIQSSwKT66Gm+8qfFyzIAIZOkAcc41a+U8yBQtnyqm/XCZ743H491+0iKQQjnssKnmeB/8CN/7OFkUdXkEEsnRu7g6lkj3JFCyZA//4sdxmeTIlInnoKbH/vc5u+E0iDg2NIoxf3GeLxvQ2yz7vhLqPVSTg7h+ZDp8LULwxRlbjlWvgh7fnPuHOnw9X/42he2Ww9VWxqPy5ZhPcdLdl975gnpUvoe8gS+fKnyqOYHFDwGfPgC9flbvj/uRquO6Hlvqj/o8tEpEdIx6TDPl/rrB842fFJw4oQLn70rkdOw+t5EYqDYvOgoqE4fqbcrPr99TCH562XHW56bDJE422nEFJpmDjdnhyleXZlwvXkC4bQhXIsIEwfFDnPQRVKJIpmDMF/u1Lhu/fajlUn/1rRw9tvxPjmYi36pTv9jHeUyum1KubLK9ty/09C0GoApk3Tfrn5hK9cn/Jp0ZVWl88o7RPMgVTxsAP/tHwvVttVmfTKxIwdVzuZUDxGGzdKeff99dZdu6Bmlo5Kltqn1doAjEGxgzLLqrSevWBlvYwjiPfN0a269bnqq2Vn7FWw8dtkUxBdV9phPFfv7btXrc2akh+kaya/fCdmy0Hc9ipipVQd5ChA7K4WSkuh3m27JC7OHbtlV90Y5N8wJGICKhbpVz4Ut3XUN1Xrjar6gPdK1s+VLeBtdJCKi3XH/zrtYaHn4E7H7UcacMRHzW0uVVpjqv+4QZpDFEOhOuDDPLuiJ6IS5Lod4/YHBok23de27snjBsuF2ROGAmjh0nDMmNKu7G132QysgMvWyq3Td33hOWJlScvJsbAhQvMO7+7XOjavEid8HXUhSE0gQzqJx9KWwKJRsVO/Z9785vByRTsr5Ov51+V96jqLTfKzplimDxWrkYACRJ09khaxpGvAVXwuQ8bLpgPf3xWrhVoSkqlw9jh+dXK9e5OXge5ipHQ/hlL53n7H0G0/687LMc0X1hj6VoJ08bBObMMU8eKeErBBGsdHnXxczd0e+2OHwkTRhnee4G01pkwqgO+XJGWz+dDaAJZMKP98G6Qq07jcbkYc/U6S1VvWLZULtwZ0v/k7uXFRDwGB+vhrV2wa5+Iom8vCZWPGirC8aMiofW/f+Rgcc47sngcbSyfHTo0gQzu7/1Ls5acs735UndYWvff85jULF28yDBisPxdsQglEZf2PDfcdno2OxaFMcPh8maRJ+L+HRvw499fe6i4k3+5EIpAIhHadfasFSc7TI42wsPPwOMrLUvmwOXnSdt9x+fr1fLh7b3wo1+dudQjnYHNb8EN2y1TxkrzhhGDi+dszb664lloOkootVg9u7VvBlgLVb3CGM3pJFNy7vmffiiVpEeOyqrsV//afNj0Fu1mvK2FDVtl3M+/enr+qFDUHiyfUGEoU6BbFg0FHAs9uwc/Fi+aTkiYefkPLA8/01IRWwjmTJbKg2xoOgHf+4Xl7scKLxJjwm0uHTShfPyxLJ7i7jAVCThRYPu19hDcdJflr+ulqcTIIWLWhJmh79kDvvopw9rNcPyEJN7WbbG8vLHtJNyvH5Ir0T787sIVhLod2MuFcASSQ7nC9PHw4obgxpILr74Om9+ycl/e4uYuGyFNvExGnjdrcsv3Llpo2FEjuaK2+uve9ajkIS5bUhifxAB79of/3KAIxcTK9nx0JiOZ3WKisUmaGnz3lhbfJCzc+95dUSZTEuJdfrWhqveZX2OtHDz66/rCnC93rJwMLBcK3jiuNRlHylGKDWth1Tr4yvctr78ZzsRzo37f/rll+Q2WJ1eLf5FKy2WX73uX90LykzukYjdMfyQek123nAhFILmc/+jWhby6BIbBgcPwrRstjzwXfJQrHoOnX4KXX5NG0z+/y7Kn2flNZ+BdZ3u/vr4B/vtOG6rTbgzc81j5RLAgJIHkEhPvWgk9ugY3lo7S2AT//TvLrx6UiRCkSI61NlVa5WaMgUNZNFN7Y6eYh2FF4qyVKuxyIhSBNOVQ1tmjq5gQxc69j8NP77Ck08F0/0hn5Pz+6KFyvdl7lko1AohP9/SL2b3PH5+Rm22DzukYAzv3lF+1dChry/EcBFLZRSZCsa9E1kpjg+NNlq983BCJ+BsGdhzo3hV+sFxCtl1Oucx0687sZmLGgZvvtnznS4aKhH/jOxVjpF6s3AhlB2k4lr0dnHHgvRcUVyTLi5Vr5fSc4/i/Sru+WywmEazWq3M6B7N1Rw088KQNNLhggO27g7nbvZCEFsXKdnXNZMSsCHK185tXXpeiQoP/ImnrCPH4Ebm9z32PS0VzUKZWOgO7yyj/4RKaQHbuyc1Wnzc1uLEEwap1cMu9NpRuhOkMfOCi3HbZjAM/+21wy/uJpJpYHWLVWpv16mUtLJpVOmaWyxMrCaVLuuOIT5JtrZbL628Fd41ZxpEK5HIjNIE8/2r2P5tKw6TRhS9ezJVkCq6/2bLpreBFkkrDx64w9O+b/WsOHCKQTomJOPx1feGPCARBaAKpqc0tBNi9K5w/L7jxBMkNt1l27Qs2QWetdIn5f58xDKrO7jVdElARkHB/fmeZeefNhFpqUrM/+0ljDEyfYIrifEOu7D8I//Er+05j5qBIpWHEYLhhueGCs713rf5V8OkrsxdTtkSj0iCuXLtlhnraYfd+GNAvu53EceQymIiBTAkuTlt3wA9us1z3iWA72afSclT5ix8xXLQQnnnJsnOvZOG7VMguM3WcYcYE6NPTnzPsrYlGYOXaEvyAsiQ0gVgrkazZk9v/WZdYFGZPEfu2FHnuFbkW7ZJzgu2ekmnuPDlxFEwaLTd3JVPy+3N3FffqaL+pPwqr1vr/vsVCqCbWlu02p7osa+H9F5agjdWKW++3bNwWvNPudiZxRVARl9U9mZKvIAQajcCL68szvOsSqkBe2ghHjmX/86m0rIrTxgc3pqBJpuBHt8vCENYZd8dpaQwXJNEoPPpc+ZpXELJA0hmxzXNJpqXS8MGLc7/euJioOwzX31ReZRjxmHyWxV4z11FCPzC1MoeEocuEUeJgljJrN0sSsZSF3ppUGr5/axkpvg1CF0g+Dl1FHJZ/vLR9kYwjE6quvvRFEo1I/dmBw4UeSfCELpBkCp56MbdJkkrDxNEnNzAoVX7yG1uSuR2XSESOL9x8ty3LzPmpFORM+h+eyi2aBbzTzqZLCVX5nom1m3nnmuVSJBaF239vOXCo0CMJh4J8THvrct+ebXOc/9LFgQwpNBwH7nrUciJZeiKJRCQS+afnCz2S8CjIR3TkKLzyWu62eDpTHrtI/VH4xo2WaAil8X6STMFt95e/Y96agq1hN99t37lzMFscRw5SXf8lU9C+uX6w+S3pB1wqDnsiDisetGVZ0u5FQafZI8/lPkFSaTlxePGi4mjU3BFWPGip2V/YJtnZ4JazP/xMoUcSPgX9aB56yuZVH+RYuOZKw7jh/o8pTA43SFueME4h5osxcp3Bzfd0LtPKpaAC2VML9/85953AWqnyXX61oUtFMGMLi1deh/ueKF5TKx4Tc3h/XaFHUhgKvrn/6fn8VtBUWu78/udPmoL0oPWTex6z7KgpvqhWIi7iLZZm4oUgOmHeN75ZyAE0Nkl0atZkk3NxnXuqLhE3rNkUzPhAdrhp4+CScwxjhsn/H6z371xFMgUb3oALFxpi0eJovhaNyBn2n97RORKCbVFwgQC8tg0WnWXo1T33yWEtTBkrd2Zs3h7I8KjuAz/+qmHyGJg50XDePMP0iVJAWVPrz3VjR45KUePCmbkvFH4Ti0oo+ls3WhpyqL4uR4pCICAfyPzp+YWlMo5M3PoGafTsN2OGwQVnG5KplhLygf3kqoY5U+TE4A4f2m7u2CO74ZSx4V7W0xpjZPe4/ibL9t2FGUMxUTQCeXsv9OtjmDAqv3MMkQjMm2rYV4fvH2yXCrh08ckru3veom8vEfasyYY9tR27Xcm9c3DaODk7XoidJBqRqxNWrQv/2cVIUbmFt94nNT75OO1O87HTL37E8K4F/uZIvCZ9Ki0+1PgR8LVrDB96d8ciUukMfO2/JCEXdvg3EYc/Pgt/XhXuc4uZotlBQCbHhjfgvPn5dTOxVoSxYIaYPa9t82dcGQeGDpQrotsyozKOCGPGBMPUcYa39+bfpM1a2PiGmHBdK8Nx2hNxePZl2T2UFopKIACHjsg2P3Nifs6qtWCR1/fqYVi/xR9TxVoxpbyEa608a2AVLJlrMMiJu3z8ifoG2PSmRM4swYokEZfDXP+5wgbaXKIUKTqBgOwiwwcZRg3Jb3K7DZ8njYYJo1puiu0IdYfh0nOzO/rrOGIezZxomDTasO1tmfA5P7PebX8UXGQrGhWf7fqbbId/R+VIUQoEYN1mmDjaUN0n/9Uz48CQ/jB3mqFmf8fu706nYfc+OG9edpPV3U0G94dzZxsOH8kv0vXaNnnNzIkGJ6Bd5Lu3WPZ10kx5exStQJIpOVx08SJZtTsikt494JxZhmjEsGV7/ibX7v0wZphh2MAcrnNorkCeP90wsMqwbkvueZMNb0j4d+o4/yNb0QjMn2ZIpiVp29nzHqdStAIB+cD2H5TJ3ZHV03FkIkwbD9PHG3btI+8TcQcOw7mzcgsiuOIeO1zaqb65SzLxubBhK8SikiPB+OeTWCudGedOlQTo5DGGirj4grlcnVeuFLVAQG5Hqj0kH2Akkv/EcP2Sgf1gyRzDkWOwa2/uDdXSjmT9u3bJfQwZR7Lyi2cbGhpzS2paKzuq65P4aW45zeZgIi6lO/OnGxbPNgyuNhw97m9ZTalR9AIBeHMXNByFedMkMtSRDyvTvJvMn26YOVF2goZjUqqSDfOnNUeo8syzOM3h4PnTDb17GDZvz60l6MZtMmFnTTZEO7BgnAnXb3Ks3BU5fiScP98wcaQIct+BYFuoFiMlIRCQK43rG2DmpI7tJNAyEar7iOgWzzFMGCVVwceaziyWXt1h2VK5kyPRAZ/Ifb5jpd/XtHGGNZuzFyjIzrNrn+yqFYlgylLc3xFIoGPRWYazJkkx5f46uVGqM2CWfT6o2EgwnD0drvukIWL8W82i0ZZS80P1sL1GHPKD9ZaKhDjl40dAVe/mFdbHCRmPSR3aigctT67OzQmfOAq+8BEZXxCNqU/FPVawpxbufNTyl7+Wv+lVcgIByW9c9wlD317+VNK2prVYWuM4wZkX7jNffg3uf8Kyfmv2E69PT/iHvzPMner/1QZtEY+JX/jlf7c0NAb/vEJSMiZWaw4ckq7i40cYBlThq8PqmhanfgW5jLgm19ABsHiOYdo4CW0fb4Kj7ZheTSfkmoXGJpg8OpxmFm4i9JHnyj/SVaQHPdunpha+eaPlMx80LJ59ss1cilgrZlIkAtObw9GNx8XfqKmV8+tHGy3HGsVPSjVfaWCtmD4nTohfMma4HEc2zSZoUGXzyXRp/76zpWQFAuLY/niF5Y2dcNXlsur6bXKFjeNAsrkdUkVCcjct1z9I6Mzalpoz97vu/SDRiFxUlM64py1bRad8mNDxmIzt2ZdzCyyUKiUtEJAP/sG/wPbdlk9/wDBicLArZ1hYK1fPtV6lvULLESPnVtZulvtIjhyDcSNgyWw5YzO4GrpWnv4M9+skmp9zqi9mrXQ4eepFuPMR2yl2kJJ00tuiR1e46gq50NLPKFexE43Kv/cPT8uZmlMnbjwGA6qkLmzkYBhUbajqLTcJ9+gmt9/GWi2V6TScSMHRRgmt19XDzhq53nrnXmjsBDuHS1kJBGSVnTUJPrpMGixknPK8vxvEX4lFpfzl53daXtyQWxQrEYfKCojHT94tMo6YaydOQFMnyXe0RcmbWKdirYRLN26zXHE+vGexoVcPEUk5mQTxmES+Vq4VcRw6kvt7uPcXKm1TdjvIqfSvgisvMpw7S2zwUheKmzPZXwe3PWB5YU35J+sKSdkLxGXYQLj8PMM5s6BbZemZXrGomFT1R+HR5+CBP9tOEUUqNJ1GICD+ycB+UoB36WJx6v0MgQaBG1atOwxPvwSPv2DZvb/Qo+o8dCqBtKZ/X5g/XU77jR56cr7gjKHPEDBGolGt7w3Z9CasWmd55uX8z7Ao+dNpBeISjcCIwTBvmmSvRw+VUm835+C2E/J7h4lEWgThPivjSMnIzhpp9rB2k2Xdls4Tri5GOr1AWhOJQL8+MHUsjB0u1ysM6Ccn7s7UILv1TtNGrg1jzpzgS6Wl1urQEakertlv2bJdzq0frC9ek6+zoQLxIBqB7t2kZGNwNVT3leLIvr3kqyIu5pDrQLuFgo7TEgRIpaUk48hRyVfUHrQcOCyHj2pq5bCWhlqLl7LLg/hJxpFMcn2DNHJrvU9EI5BIiEgScRFJvHmXSaZEHMmUtBtKpXVHKFVUIHmSccREOt5U6JEoQVJUvXkVpdhQgSiKByoQRfFABaIoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8UIEoigcqEEXxQAWiKB6oQBTFAxWIonigAlEUD1QgiuKBCkRRPFCBKIoHKhBF8UAFoigeqEAUxQMViKJ4oAJRFA9UIIrigQpEUTxQgSiKB7FYtP0fUpRyIpfrJGJ694SitI2aWIrigQpEUTxQgSiKByoQRfFABaIoHqhAFMUDFYiieKACURQPVCCK4oEKRFE8+F/HlmZaTNWRSgAAAABJRU5ErkJggg==",kl="data:image/png;base64,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",Pl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAABRxJREFUeAHtnaFTG0EUxh9MLQy1YK4KJMyAT1EoKAYDM23BgKIGFDOFwaFSBQamzIDBdFDgGoMCgQTVGNAM/AF0v8tee9lsQjbZt7m929/MJtcjaciXl7dvv+PuEQUCgYAxfdQBr6+vkbgriTEkRxF4EqOK0dfXd0uGtC20EBeCrovxRYyIik1VjJ9iHAvRq+08oS2hhcgQeJtk9N7f39P19TU9Pj7Sy8sLFYHh4WEaGBigqakpGh0dTXYjystC7J23nt9SaBnFv6iWJuj8/JxOT0/p7u6OigxEX1tbo7m5uWRXRYyvraK7qdBS5N9ijCNy19fX40gO/AeCHx0dxfdUSycTQuwn3WNbCQ2RSxB3eXm5MCnCFKSTw8NDGhsbwz8rQuiPusf163YKkb+LuxIiOYjcGmizsrKSpNOS0O6b7nENES1LN0RzNDMzE094gbdB+ri8vMQmUscHNYXoIvqTGBEmviBy+0Cr/f19bGJua4hqXUT/oRDNHYF8fXV1hc0nEdHv0z+ri2iZNiJMgEFkc5Cvb25usDkktfyHmjrGcYPFSKAzUmuMUnq/KnSEm1BldE4qE0Tp/arQQ8qDA4Y0C9J+CjghCO2IILQjgtCOeEeWgGWYsg3Z2dvbq7Nrl5aWaHp6mmyDUleu+LrCmtBY609OTpIL8MbTIsOM39zcJNug+oIVYQPvUkfKU4gZGRmh3d1d4gCvY6vU9U5o2LZpVldXE+PdKohkW9EMvBJajTDkZY55Qf3W2MAboWHWqCkDx+04wGE726tjL4SGyFtbW3X7cPgItqRt8GFyHBu1VnUgn0mL0CrPz88NbxyRzJGXOVJGgjWh8Uu6MKO4UgbMIHWitYlXk+Hg4GCcMjiwWcrp8EpozlLu5OSEOPFGaJRxKOdsw5mX03ghNGcpx50yErwQGktsjpSBdGFz9deKzAuNSOYwqxDFcABdkWmhOVMGZymnI9NC+1rK6cis0FyrP9UzcUUmhYaRz5EyEMWqZ+KKzAnti5FvSuaE9sXINyVTQvtk5JuSGaF9M/JNyYzQvhn5pmRCaB+NfFN6LrSvRr4pPRXaZyPflJ4K7bORb0rPhPbdyDelJ0Lnwcg3pSdC58HIN8W50Hkx8k1xKnSejHxTnApdlFJOhzOh82bkm+JE6Dwa+aawC51XI98UdqHzauSbwip0no18U9iEzruRb4q1v49WcWnk48JRHK+FD/Ph4YFswCK0KyM/mWi5zm/Ea9lKUdZTh0sjf2Njw9lJpN1iVWiXRj4+TI5TkrmwKrQrI59zouXCmtAujXyubw0nVoR2aeRzTbTcWKk6ZmdnWU5/wyUc0qs/fKDwTTjOZ9Rh8/1YEdpmGdQK1LRZ952bEa5A44ggtCOC0I4IQjtCFTq+5jGHQVMUmmmnFdrHOjUrpLSr69WiCl3BDWrVQGektKum99cJLdtbVNFnRDYHCBiABZXs0dLQfUg3GR7jZnFxkQJmwFSTHKs/0116Hpc2xuXnhxYWFgrf3KZdEM0XFxfYxDw3oTa/aYho2W0hbklULpdjjznQGsWH/6HrMNRWwxv0GcFFpAKNJCLL3GzW8EYyL8Yt/oOzs7P4qxGoBwUDtEkmQKpppsW4KdnBwYG1I8O+AmGVv1mpiDHfrE8WaLfN3ra4+0yyQUDSZg8HTIvSDwArPixGNG32doTA5beeb9I4MqJa1yH0Noyo2FSpVsKVW0Vxmm5aoaJnC+6L1AoVo9JuV85AIBDokr8WvnnavEglMwAAAABJRU5ErkJggg==",Dl="data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cpath%20d%3D%22M16.361%2010.26a.894.894%200%200%200-.558.47l-.072.148.001.207c0%20.193.004.217.059.353.076.193.152.312.291.448.24.238.51.3.872.205a.86.86%200%200%200%20.517-.436.752.752%200%200%200%20.08-.498c-.064-.453-.33-.782-.724-.897a1.06%201.06%200%200%200-.466%200zm-9.203.005c-.305.096-.533.32-.65.639a1.187%201.187%200%200%200-.06.52c.057.309.31.59.598.667.362.095.632.033.872-.205.14-.136.215-.255.291-.448.055-.136.059-.16.059-.353l.001-.207-.072-.148a.894.894%200%200%200-.565-.472%201.02%201.02%200%200%200-.474.007Zm4.184%202c-.131.071-.223.25-.195.383.031.143.157.288.353.407.105.063.112.072.117.136.004.038-.01.146-.029.243-.02.094-.036.194-.036.222.002.074.07.195.143.253.064.052.076.054.255.059.164.005.198.001.264-.03.169-.082.212-.234.15-.525-.052-.243-.042-.28.087-.355.137-.08.281-.219.324-.314a.365.365%200%200%200-.175-.48.394.394%200%200%200-.181-.033c-.126%200-.207.03-.355.124l-.085.053-.053-.032c-.219-.13-.259-.145-.391-.143a.396.396%200%200%200-.193.032zm.39-2.195c-.373.036-.475.05-.654.086-.291.06-.68.195-.951.328-.94.46-1.589%201.226-1.787%202.114-.04.176-.045.234-.045.53%200%20.294.005.357.043.524.264%201.16%201.332%202.017%202.714%202.173.3.033%201.596.033%201.896%200%201.11-.125%202.064-.727%202.493-1.571.114-.226.169-.372.22-.602.039-.167.044-.23.044-.523%200-.297-.005-.355-.045-.531-.288-1.29-1.539-2.304-3.072-2.497a6.873%206.873%200%200%200-.855-.031zm.645.937a3.283%203.283%200%200%201%201.44.514c.223.148.537.458.671.662.166.251.26.508.303.82.02.143.01.251-.043.482-.08.345-.332.705-.672.957a3.115%203.115%200%200%201-.689.348c-.382.122-.632.144-1.525.138-.582-.006-.686-.01-.853-.042-.57-.107-1.022-.334-1.35-.68-.264-.28-.385-.535-.45-.946-.03-.192.025-.509.137-.776.136-.326.488-.73.836-.963.403-.269.934-.46%201.422-.512.187-.02.586-.02.773-.002zm-5.503-11a1.653%201.653%200%200%200-.683.298C5.617.74%205.173%201.666%204.985%202.819c-.07.436-.119%201.04-.119%201.503%200%20.544.064%201.24.155%201.721.02.107.031.202.023.208a8.12%208.12%200%200%201-.187.152%205.324%205.324%200%200%200-.949%201.02%205.49%205.49%200%200%200-.94%202.339%206.625%206.625%200%200%200-.023%201.357c.091.78.325%201.438.727%202.04l.13.195-.037.064c-.269.452-.498%201.105-.605%201.732-.084.496-.095.629-.095%201.294%200%20.67.009.803.088%201.266.095.555.288%201.143.503%201.534.071.128.243.393.264.407.007.003-.014.067-.046.141a7.405%207.405%200%200%200-.548%201.873c-.062.417-.071.552-.071.991%200%20.56.031.832.148%201.279L3.42%2024h1.478l-.05-.091c-.297-.552-.325-1.575-.068-2.597.117-.472.25-.819.498-1.296l.148-.29v-.177c0-.165-.003-.184-.057-.293a.915.915%200%200%200-.194-.25%201.74%201.74%200%200%201-.385-.543c-.424-.92-.506-2.286-.208-3.451.124-.486.329-.918.544-1.154a.787.787%200%200%200%20.223-.531c0-.195-.07-.355-.224-.522a3.136%203.136%200%200%201-.817-1.729c-.14-.96.114-2.005.69-2.834.563-.814%201.353-1.336%202.237-1.475.199-.033.57-.028.776.01.226.04.367.028.512-.041.179-.085.268-.19.374-.431.093-.215.165-.333.36-.576.234-.29.46-.489.822-.729.413-.27.884-.467%201.352-.561.17-.035.25-.04.569-.04.319%200%20.398.005.569.04a4.07%204.07%200%200%201%201.914.997c.117.109.398.457.488.602.034.057.095.177.132.267.105.241.195.346.374.43.14.068.286.082.503.045.343-.058.607-.053.943.016%201.144.23%202.14%201.173%202.581%202.437.385%201.108.276%202.267-.296%203.153-.097.15-.193.27-.333.419-.301.322-.301.722-.001%201.053.493.539.801%201.866.708%203.036-.062.772-.26%201.463-.533%201.854a2.096%202.096%200%200%201-.224.258.916.916%200%200%200-.194.25c-.054.109-.057.128-.057.293v.178l.148.29c.248.476.38.823.498%201.295.253%201.008.231%202.01-.059%202.581a.845.845%200%200%200-.044.098c0%20.006.329.009.732.009h.73l.02-.074.036-.134c.019-.076.057-.3.088-.516.029-.217.029-1.016%200-1.258-.11-.875-.295-1.57-.597-2.226-.032-.074-.053-.138-.046-.141.008-.005.057-.074.108-.152.376-.569.607-1.284.724-2.228.031-.26.031-1.378%200-1.628-.083-.645-.182-1.082-.348-1.525a6.083%206.083%200%200%200-.329-.7l-.038-.064.131-.194c.402-.604.636-1.262.727-2.04a6.625%206.625%200%200%200-.024-1.358%205.512%205.512%200%200%200-.939-2.339%205.325%205.325%200%200%200-.95-1.02%208.097%208.097%200%200%201-.186-.152.692.692%200%200%201%20.023-.208c.208-1.087.201-2.443-.017-3.503-.19-.924-.535-1.658-.98-2.082-.354-.338-.716-.482-1.15-.455-.996.059-1.8%201.205-2.116%203.01a6.805%206.805%200%200%200-.097.726c0%20.036-.007.066-.015.066a.96.96%200%200%201-.149-.078A4.857%204.857%200%200%200%2012%203.03c-.832%200-1.687.243-2.456.698a.958.958%200%200%201-.148.078c-.008%200-.015-.03-.015-.066a6.71%206.71%200%200%200-.097-.725C8.997%201.392%208.337.319%207.46.048a2.096%202.096%200%200%200-.585-.041Zm.293%201.402c.248.197.523.759.682%201.388.03.113.06.244.069.292.007.047.026.152.041.233.067.365.098.76.102%201.24l.002.475-.12.175-.118.178h-.278c-.324%200-.646.041-.954.124l-.238.06c-.033.007-.038-.003-.057-.144a8.438%208.438%200%200%201%20.016-2.323c.124-.788.413-1.501.696-1.711.067-.05.079-.049.157.013zm9.825-.012c.17.126.358.46.498.888.28.854.36%202.028.212%203.145-.019.14-.024.151-.057.144l-.238-.06a3.693%203.693%200%200%200-.954-.124h-.278l-.119-.178-.119-.175.002-.474c.004-.669.066-1.19.214-1.772.157-.623.434-1.185.68-1.382.078-.062.09-.063.159-.012z%22/%3E%3C/svg%3E",Fl={openai:vl,anthropic:El,kimi:Il,bailian:kl,zhipu:Pl,ollama:Dl,deepseek:jl},Ul={kimi:"#000000",ollama:"#FFFFFF"};function un(e){return Fl[e]}function fn(e){return Ul[e]}const Ie=[{id:"openai",name:"OpenAI",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"OpenAI 模型与编码能力",homeUrl:"https://openai.com",apiKeyUrl:"https://platform.openai.com/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.openai.com/v1"},{id:"anthropic",name:"Anthropic",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"Claude 模型与编码能力",homeUrl:"https://www.anthropic.com",apiKeyUrl:"https://console.anthropic.com/settings/keys",apiKeyPlaceholder:"sk-ant-...",defaultBaseUrl:"https://api.anthropic.com"},{id:"kimi",name:"Kimi",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"Moonshot AI 模型服务",homeUrl:"https://www.moonshot.cn",apiKeyUrl:"https://platform.moonshot.cn/console/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.moonshot.cn/v1"},{id:"bailian",name:"百炼",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"阿里云百炼模型服务",homeUrl:"https://www.aliyun.com/product/bailian",apiKeyUrl:"https://bailian.console.aliyun.com/#/api-key",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1"},{id:"deepseek",name:"DeepSeek",browserMode:"connectUnsupported",browserLabel:"不支持登录",description:"DeepSeek 模型服务",homeUrl:"https://www.deepseek.com",apiKeyUrl:"https://platform.deepseek.com/api_keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.deepseek.com/v1"},{id:"zhipu",name:"智谱 AI",browserMode:"browserAssistedApiKey",browserLabel:"登录",description:"智谱 AI / GLM 模型服务",homeUrl:"https://open.bigmodel.cn",apiKeyUrl:"https://open.bigmodel.cn/usercenter/apikeys",apiKeyPlaceholder:"id.secret-...",defaultBaseUrl:"https://open.bigmodel.cn/api/paas/v4"},{id:"ollama",name:"Ollama",browserMode:"connectUnsupported",browserLabel:"本地服务",description:"本地 Ollama 模型服务",homeUrl:"https://ollama.com",defaultBaseUrl:"http://localhost:11434/v1"},{id:"custom",name:"Custom",browserMode:"browserAssistedApiKey",browserLabel:"配置",description:"OpenAI / Anthropic 兼容的自定义模型服务",homeUrl:"https://undefineds.co",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://example.com/v1"}],br=[{id:"keys",label:"API Keys",title:"API KEYS"}];if(Ie.map(e=>e.id).join(",")!==Ca.join(","))throw new Error("AI Connection provider UI is out of sync with the client catalog");class Lr extends Error{}function Bl(e){const t=e.solid.session.getSnapshot(),n=e.solid.pod,r=n?.status==="ready"?n:void 0,o=t.status==="authenticated"&&r!==void 0;let s=0,i,c;const d=new Set,u=()=>{const y=e.solid.session.getSnapshot();return o&&y.status==="authenticated"&&y.webId===t.webId},f=()=>{s+=1,c=void 0,i=void 0;for(const y of d)y.cancel()},h=()=>{const y=s;let w=!u(),S=!1,N=()=>{};const q={assertCurrent(){if(w||y!==s||!u())throw new Lr},dispose(){S||(S=!0,d.delete(q),N())},cancel(){w=!0,q.dispose()}};d.add(q);let H=!0;return N=e.solid.session.subscribe(B=>{(!H||B.status!=="authenticated"||B.webId!==t.webId)&&f()}),H=!1,S&&N(),q},A=o?Ml(Sl(Is({webId:t.webId,podBaseUrl:r.current.podUrl,authenticatedFetch:e.solid.session.fetch}),e.capabilities.aiClientCredentials),e.capabilities.aiConnectionsPodStore,h):null;let g="keys",I="openai",m,E="",P={},x={},F;const v=new Set,M=()=>v.forEach(y=>y()),j={client:A,openExternal:e.navigation.openExternal,clientConfigurationBridge:e.capabilities.aiClientConfiguration,get selectedSection(){return g},get selectedProvider(){return I},get selectedCredentialId(){return m},get searchQuery(){return E},get providerStates(){return P},get providerSummaries(){return x},get providerLoadError(){return F},selectSection(y){g!==y&&(g=y,M())},selectProvider(y,w){const S=y==="custom"?w:void 0;g==="provider"&&I===y&&m===S||(g="provider",I=y,m=S,M())},selectFirstUnconfiguredProvider(){const y=Ie.findIndex(N=>N.id===I),S=(y<0?Ie:[...Ie.slice(y+1),...Ie.slice(0,y+1)]).find(N=>P[N.id]==="unconfigured"&&N.id!==I)??Ie.find(N=>P[N.id]==="unconfigured")??Ie[0];S&&j.selectProvider(S.id)},setSearchQuery(y){E!==y&&(E=y,M())},setProviderState(y,w){if(P[y]===w)return;s+=1,P={...P,[y]:w};const S=x[y]?void 0:Hl(y,w);S&&(x={...x,[y]:S}),M()},cancelProviderLoads:f,async loadProviders(){if(!A)return;if(i)return i;const y={};c=y;const w=++s,S=Promise.resolve().then(async()=>{if(c===y){F=void 0,M();try{const N=await A.listProviders();if(w!==s||!u())return;x=Object.fromEntries(N.map(q=>[q.id,q])),P=Object.fromEntries(Ie.map(q=>[q.id,Ol(x[q.id])])),M()}catch(N){if(N instanceof Lr||w!==s||!u())return;F=ql(N),M()}finally{c===y&&(c=void 0,i=void 0)}}});return i=S,S},subscribe(y){return v.add(y),()=>v.delete(y)}};return j}function Sl(e,t){return{...e,async createGatewayKey(n){if(!t)throw new Error("当前账号登录状态不支持创建客户端凭据。");const r=await t.create({name:n.name,webId:e.webId});try{return await e.createGatewayKey({...n,apiKey:r.apiKey,credentialResource:r.resource})}catch(o){try{await t.revoke({clientId:Vl(r.apiKey),resource:r.resource,webId:e.webId})}catch{throw new Error("API Key 未能保存到 Pod,且账号凭据撤销失败。该凭据尚未应用到客户端。")}throw o}},async deleteGatewayKey(n){const r=(await e.listGatewayKeys()).find(o=>o.id===n);if(r?.kind==="client-credentials"){if(!t||!r.clientCredentialId)throw new Error("当前账号登录状态无法撤销此客户端凭据,Key 记录已保留。");const s=(await t.list()).find(i=>i.clientId===r.clientCredentialId);if(!s)throw new Error("账号服务中已找不到该客户端凭据,请刷新后重试。");await t.revoke({clientId:s.clientId,resource:s.resource,webId:e.webId})}await e.deleteGatewayKey(n)}}}function Ml(e,t,n){const r=async()=>{const c=n();try{c.assertCurrent();const d=t?await t.listProviders():await e.listProviders();if(c.assertCurrent(),!t)return d;const u=e.listAuthorizationMethods?await e.listAuthorizationMethods():[];return c.assertCurrent(),Ll(d,u)}finally{c.dispose()}};if(!t)return{...e,listProviders:r};const o=new Map,s=t.readCredentialSecret&&t.updateOAuthCredential?(c,d)=>{const u=JSON.stringify([c,d]),f=o.get(u);if(f)return f;const h=(async()=>{const g=(await t.listProviders()).find(F=>F.id===c)?.credentials.find(F=>F.id===d);if(!g)throw new Error("oauth_credential_not_found");const I=await t.readCredentialSecret(c,d),m=typeof I.refreshToken=="string"?I.refreshToken:void 0;if(!m)throw new Error("oauth_refresh_token_required");const E=await e.refreshOAuthCredential(c,d,m,g.version,g.offeringId,I.authorizationMethodId==="browser-oauth"?"authorizationCodeOAuth":void 0);if(E.status!=="completed"||!E.oauthCredential)throw new Error("oauth_refresh_failed");await t.updateOAuthCredential(c,d,g.version,E.oauthCredential);const{oauthCredential:P,...x}=E;return x})().finally(()=>{o.delete(u)});return o.set(u,h),h}:e.refreshOAuthCredential,i=async(c,d,u=!1)=>{let f=!1,h=await t.readCredentialSecret(c,d.id);const A=typeof h.expiresAt=="string"?h.expiresAt:d.expiresAt;if((d.authMode==="oauth"||d.authMode==="deviceCode")&&(u||A&&Date.parse(A)<=Date.now()+6e4)){if(!t.updateOAuthCredential)throw new Error("oauth_refresh_unavailable");await s(c,d.id,"",d.version);const I=(await t.listProviders()).find(m=>m.id===c)?.credentials.find(m=>m.id===d.id);if(!I)throw new Error("oauth_credential_not_found");f=!0,d=I,h=await t.readCredentialSecret(c,d.id)}return{credential:d,secret:h,didRefresh:f}};return{...e,listProviders:r,listModels:t.listModels?async()=>t.listModels():e.listModels,createApiKeyCredential:t.createApiKeyCredential?async(c,d)=>t.createApiKeyCredential(c,d):e.createApiKeyCredential,createLocalCredential:t.createLocalCredential?async(c,d)=>d.authorizationMethodId==="local-session-import"||!d.authorizationMethodId&&d.offeringId==="official-subscription"?e.createLocalCredential(c,d):t.createLocalCredential(c,d):e.createLocalCredential,updateProviderCredential:t.updateProviderCredential?async(c,d,u)=>t.updateProviderCredential(c,d,u):e.updateProviderCredential,deleteProviderCredential:t.deleteProviderCredential?async(c,d)=>t.deleteProviderCredential(c,d):e.deleteProviderCredential,pollDevice:t.saveOAuthCredential?async(c,d)=>{const u=await e.pollDevice(c,d);if(u.status!=="completed"||!u.oauthCredential)return u;const f=await t.saveOAuthCredential(c,u.oauthCredential),{oauthCredential:h,...A}=u;return{...A,credentialId:f?.id??u.credentialId}}:e.pollDevice,refreshOAuthCredential:s,quota:t.readCredentialSecret?async(c,d=!1,u)=>{const h=(await t.listProviders()).find(E=>E.id===c)?.credentials??[],A=u?.credentialId??u?.credentialIri,g=A?h.find(E=>E.id===A):h.find(E=>E.enabled&&(!u?.offeringId||E.offeringId===u.offeringId));if(!g)throw new Error("quota_credential_not_found");const{secret:I}=await i(c,g),m=Sn(I,g.authMode);if(!m)throw new Error("credential_secret_unavailable");return e.quotaFromSecret(c,{credentialId:g.id,credentialIri:g.id,authMode:g.authMode==="deviceCode"||g.authMode==="oauth"?"deviceCodeOAuth":"apiKey",offeringId:g.offeringId,baseUrl:g.baseUrl,proxyUrl:g.proxyUrl,compatibility:g.compatibility,secret:m})}:e.quota,disconnect:async(c,d)=>!d||!t.deleteProviderCredential?e.disconnect(c,d):await t.deleteProviderCredential(c,d),testProviderCredential:t.readCredentialSecret?async(c,d)=>{let f=(await t.listProviders()).find(E=>E.id===c)?.credentials.find(E=>E.id===d.credentialId);if(!f)throw new Error("test_credential_not_found");const h=await i(c,f);f=h.credential;const{secret:A}=h,g=Sn(A,f.authMode);if(!g)throw new Error("test_secret_missing");let I;try{I=await e.discoverModels(c,{credentialId:f.id,offeringId:f.offeringId,authMode:f.authMode==="deviceCode"||f.authMode==="oauth"?"deviceCodeOAuth":f.authMode==="local"?"local":"apiKey",secret:g,baseUrl:f.baseUrl,proxyUrl:f.proxyUrl,compatibility:f.compatibility})}catch(E){throw await t.markCredentialHealth?.(c,f.id,"invalid",f.version).catch(()=>{}),E}const m=await t.markCredentialHealth?.(c,f.id,"healthy",f.version);return{ok:!0,credentialId:f.id,...m?{credential:m}:{},modelCount:I.models.length,observedAt:I.observedAt}}:e.testProviderCredential,discoverModels:t.readCredentialSecret?async(c,d)=>{const h=(await t.listProviders()).find(x=>x.id===c)?.credentials.filter(x=>x.enabled&&(!d?.offeringId||x.offeringId===d.offeringId)&&(!d?.credentialId||x.id===d.credentialId))??[];if(h.length===0)throw new Error("models_credential_not_found");const A=x=>JSON.stringify([c,x.offeringId,(x.baseUrl??"").trim().replace(/\/+$/u,""),d?.compatibility??x.compatibility??"auto",c==="custom"?x.id:void 0]),g=new Map;for(const x of[...h].sort((F,v)=>F.priority-v.priority)){const F=A(x),v=g.get(F)??[];v.push(x),g.set(F,v)}const I=await Promise.allSettled([...g.values()].map(async x=>{let F;for(const v of x)try{let M=await i(c,v);const j=()=>{const w=Sn(M.secret,v.authMode);if(!w)throw new Error("models_secret_missing");return e.discoverModels(c,{credentialId:v.id,offeringId:v.offeringId,authMode:v.authMode==="deviceCode"||v.authMode==="oauth"?"deviceCodeOAuth":v.authMode==="local"?"local":"apiKey",secret:w,baseUrl:v.baseUrl,proxyUrl:v.proxyUrl,compatibility:d?.compatibility??v.compatibility})};let y;try{y=await j()}catch(w){if(M.didRefresh||!(w instanceof js)||w.code!=="provider_models_fetch_failed"||w.providerStatus!==401||v.authMode!=="oauth"&&v.authMode!=="deviceCode")throw w;M=await i(c,M.credential,!0),y=await j()}return{...y,credential:v.id,credentialVersion:M.credential.version,models:y.models.map(w=>({...w,offeringId:v.offeringId,...c==="custom"?{credentialId:v.id}:{}}))}}catch(M){F=M}throw F})),m=I.flatMap(x=>x.status==="fulfilled"?[x.value]:[]);if(m.length===0)throw I[0].reason;for(const x of m)await t.markCredentialHealth?.(c,x.credential,"healthy",x.credentialVersion);const E=x=>`${x.offeringId}\0${x.credentialId??""}\0${("resourceId"in x?x.resourceId:void 0)??x.id}`;if(t.saveDiscoveredModels)try{const x=new Set([...g.values()].flatMap((v,M)=>I[M]?.status==="rejected"?[v[0].offeringId]:[])),F=new Map;for(const v of m){const M=h.find(w=>w.id===v.credential);if(c!=="custom"&&x.has(M.offeringId))continue;const j=c==="custom"?M.id:M.offeringId,y=F.get(j)??{credential:M.id,models:[]};y.models.push(...v.models),F.set(j,y)}for(const v of F.values())await t.saveDiscoveredModels(c,v.credential,[...new Map(v.models.map(M=>[E(M),M])).values()])}catch{throw new Error("models_persistence_failed")}const P=[...new Map(m.flatMap(x=>x.models).map(x=>[E(x),x])).values()];return{...m[0],models:P,complete:m.length===g.size}}:e.discoverModels,saveModelSelection:t.saveModelSelection?async(c,d,u)=>t.saveModelSelection(c,d,u):e.saveModelSelection}}function wr(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedSection??"provider",()=>e.selectedSection??"provider")}function Cr(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedProvider,()=>e.selectedProvider)}function Po(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedCredentialId,()=>e.selectedCredentialId)}function Do(e){return p.useSyncExternalStore(e.subscribe,()=>e.searchQuery,()=>e.searchQuery)}function Nl(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerStates,()=>e.providerStates)}function Rl(e){return p.useSyncExternalStore(e.subscribe,()=>Hr(e.providerSummaries),()=>Hr(e.providerSummaries))}function vr(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerSummaries,()=>e.providerSummaries)}function Fo(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerLoadError,()=>e.providerLoadError)}function Ol(e){if(!e||e.status==="unconfigured"||e.status==="unavailable")return"unconfigured";if(e.status==="configured")return"configured";if(e.status==="attention")return"attention";const t=Uo(e);return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}const Qr=new WeakMap;function Hr(e){const t=Qr.get(e);if(t)return t;const n=Object.fromEntries(Object.values(e).filter(Bo).map(r=>[r.id,Kl(r)]));return Qr.set(e,n),n}function Kl(e){const t=Uo(e),n=e.status==="available"?"connected":e.status==="attention"?"reauthRequired":"disconnected",r=t?.authMode;return{provider:e.id,status:n,authMode:r==="oauth"||r==="deviceCode"?"deviceCodeOAuth":r?"browserAssistedApiKey":void 0,accountLabel:t?.label,expiresAt:t?.expiresAt,reauthRequired:n==="reauthRequired"?!0:void 0,credentialIri:t?.id,version:t?.version,connect:{modes:Tl(e),configured:e.status!=="unavailable"}}}function Tl(e){const t=[...e.offerings.flatMap(n=>n.authModes??[]),...e.credentials.map(n=>n.authMode)].map(n=>n==="oauth"||n==="deviceCode"?"deviceCodeOAuth":n==="apiKey"||n==="local"?"browserAssistedApiKey":void 0).filter(Bo);return t.length>0?[...new Set(t)]:["browserAssistedApiKey"]}function Uo(e){return e.credentials.find(t=>t.enabled)??e.credentials[0]}function Ll(e,t){if(t.length===0)return e;const n=new Map(t.map(r=>[`${r.provider}:${r.offeringId}`,r]));return e.map(r=>({...r,offerings:r.offerings.map(o=>{const s=n.get(`${r.id}:${o.id}`);if(!s)return o;const i=s.authorizationMethods;return{...o,...s.endpoints?{endpoints:s.endpoints}:{},...i.length?{authorizationMethods:i,authModes:Ql(o.authModes,i.map(c=>c.authMode))}:{}}})}))}function Ql(e,t){return Array.from(new Set([...e??[],...t]))}function Hl(e,t){if(t==="configured")return{id:e,name:Bn(e),offerings:[],credentials:[qr(e,"apiKey")],selectedModels:[],status:"available"};if(t==="connected")return{id:e,name:Bn(e),offerings:[],credentials:[qr(e,"deviceCode")],selectedModels:[],status:"available"};if(t!=="attention"&&t!=="loading")return{id:e,name:Bn(e),offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function qr(e,t){return{id:`${e}:current`,offeringId:t==="deviceCode"||t==="oauth"?"official-subscription":"api-platform",authMode:t,enabled:!0,priority:0,health:"healthy",version:0}}function Bn(e){return Ie.find(t=>t.id===e)?.name??e}function Sn(e,t){if(t==="deviceCode"||t==="oauth"){const r=typeof e.accessToken=="string"&&e.accessToken.trim()?e.accessToken:void 0;return r?{type:"oauth",accessToken:r}:void 0}if(t==="local")return{type:"local"};const n=typeof e.apiKey=="string"&&e.apiKey.trim()?e.apiKey:void 0;return n?{type:"apiKey",apiKey:n}:void 0}function Bo(e){return e!==void 0}function ql(e){return va(e)}function Vl(e){const t=atob(e.replace(/^sk-/u,"")),n=t.indexOf(":");if(n<=0)throw new Error("客户端凭据格式无效。");return t.slice(0,n)}function zl({controller:e}){const t=p.useContext(Ds),n=wr(e),r=Cr(e),o=Po(e),s=Do(e).trim().toLocaleLowerCase(),i=Nl(e),c=vr(e),d=Fo(e),u=Ie.reduce((m,E)=>{if(E.id!=="custom")return[...m,{...E}];const P=c.custom?.credentials??[];return[...m,...P.map(x=>({...E,name:x.label||E.name,credentialId:x.id}))]},[]),f=s?u.filter(m=>Mn(m,c).toLocaleLowerCase().includes(s)):u,h=[...br.map(m=>({kind:"section",id:m.id,label:m.label})),...f.map(m=>({kind:"provider",provider:m}))],A=p.useRef([]),g=h.findIndex(m=>m.kind==="section"?n===m.id:n==="provider"&&m.provider.id===r&&m.provider.credentialId===o),I=m=>{m.kind==="section"?e.selectSection(m.id):e.selectProvider(m.provider.id,m.provider.credentialId),t?.mode==="stack"&&t.openMain()};return a.jsxs("div",{role:"listbox","aria-label":"AI 服务","aria-orientation":"vertical",className:"py-2",children:[a.jsx("section",{className:"mb-3","aria-label":"API Keys",children:h.filter(m=>m.kind==="section").map(m=>{const E=h.indexOf(m);return a.jsxs(Vr,{index:E,selected:n===m.id,tabbable:g===E||g<0&&E===0,label:m.label,optionRefs:A,onActivate:()=>I(m),onMove:P=>zr(h,P,e,A),children:[a.jsx(Jl,{section:m.id}),a.jsx("span",{className:me("min-w-0 flex-1 truncate text-sm font-medium",n===m.id?"text-foreground":"text-foreground/80"),children:m.label})]},m.id)})}),a.jsxs("section",{children:[a.jsx("h2",{className:"px-5 py-1 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Provider"}),f.map(m=>{const E=h.findIndex(F=>F.kind==="provider"&&F.provider.id===m.id&&F.provider.credentialId===m.credentialId),P=n==="provider"&&r===m.id&&m.credentialId===o,x=i[m.id]??"loading";return a.jsxs(Vr,{index:E,selected:P,tabbable:P||g<0&&E===0,label:Mn(m,c),describedBy:`ai-connections-provider-${m.id}-${m.credentialId??"default"}-status`,optionRefs:A,onActivate:()=>I({kind:"provider",provider:m}),onMove:F=>zr(h,F,e,A),children:[a.jsxs(gn,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20",style:fn(m.id)?{backgroundColor:fn(m.id)}:void 0,children:[a.jsx(wa,{src:un(m.id),className:"object-cover"}),a.jsx(An,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:Xl(m.id)})]}),a.jsx("span",{className:me("min-w-0 flex-1 truncate text-sm font-medium",P?"text-foreground":"text-foreground/80"),children:Mn(m,c)}),a.jsx(Gl,{state:x,statusId:`ai-connections-provider-${m.id}-${m.credentialId??"default"}-status`})]},`${m.id}:${m.credentialId??"default"}`)}),f.length===0?a.jsx("p",{className:"p-8 text-center text-xs text-muted-foreground",children:"无结果"}):null]}),d?a.jsxs("p",{className:"px-4 py-2 text-xs text-destructive",children:["Provider 状态读取失败:",d]}):null]})}function Vr({index:e,selected:t,tabbable:n,label:r,describedBy:o,statusId:s,optionRefs:i,onActivate:c,onMove:d,children:u}){const f=h=>{if(h.key==="ArrowDown")d(e+1);else if(h.key==="ArrowUp")d(e-1);else if(h.key==="Home")d(0);else if(h.key==="End")d(Number.POSITIVE_INFINITY);else if(h.key==="Enter"||h.key===" "){h.preventDefault(),c();return}else return;h.preventDefault()};return a.jsx("button",{ref:h=>{i.current[e]=h},type:"button",role:"option","aria-selected":t,"aria-label":r,"aria-describedby":o??s,tabIndex:n?0:-1,onClick:c,onKeyDown:f,className:me("group flex w-full items-center gap-3 border-l-[3px] border-transparent px-4 py-3 text-left transition-colors",t?"border-l-primary bg-accent/80":"hover:bg-muted/40"),children:u})}function zr(e,t,n,r){const o=Math.min(Math.max(t,0),e.length-1),s=e[o];s&&(s.kind==="section"?n.selectSection(s.id):n.selectProvider(s.provider.id,s.provider.credentialId),r.current[o]?.focus())}function Jl({section:e}){return a.jsx(gn,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20 bg-muted",children:a.jsx(An,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:"XP"})})}function Gl({state:e,statusId:t}){const n=e==="configured"||e==="connected";return a.jsxs("span",{id:t,role:"status","aria-live":"polite",className:"flex shrink-0 items-center gap-1.5",children:[n?a.jsx("span",{className:"h-2 w-2 rounded-full bg-primary","aria-hidden":"true"}):null,a.jsx("span",{className:"text-[11px] font-normal text-muted-foreground",children:Yl(e)})]})}function Xl(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS";case"zhipu":return"智";case"ollama":return"O";case"custom":return"C"}}function Mn(e,t){return e.name||t[e.id]?.name||e.id}function Yl(e){switch(e){case"unconfigured":return"未设置";case"configured":return"已配置";case"connected":return"已连接";case"attention":return"需处理";default:return"读取中"}}function At(e){if(e.authorizationMethods?.length)return e.authorizationMethods;const t=e.lifecycle==="unavailable"?"unavailable":"active";return[...new Set(e.authModes??[])].map(n=>{if(n==="apiKey")return{id:"api-key",authMode:"apiKey",connectMode:"browserAssistedApiKey",label:"API Key",lifecycle:t};if(n==="local"){const r=e.kind==="local";return{id:r?"local-service":"local-session-import",authMode:"local",label:r?"本地服务":"已有登录态",lifecycle:t}}return{id:"device-code",authMode:n,connectMode:"deviceCodeOAuth",label:"",lifecycle:t}})}function kn(e){if(e.connectMode)return e.connectMode;if(e.authMode==="oauth"||e.authMode==="deviceCode")return"deviceCodeOAuth";if(e.authMode==="apiKey")return"browserAssistedApiKey"}function ct(e){return e==="deviceCodeOAuth"||e==="authorizationCodeOAuth"}function $n(e){return ct(kn(e))}function So(e){return e.authMode==="apiKey"||kn(e)==="browserAssistedApiKey"}function er(e){return e.authMode==="local"}function Wl(e,t){const n=e.authModes??[];return n.some(r=>r==="oauth"||r==="deviceCode")?"deviceCodeOAuth":n.some(r=>r==="apiKey"||r==="local")||t.browserMode==="connectUnsupported"?"browserAssistedApiKey":t.browserMode}function sn(e){return e?.status==="pending"||e?.status==="authorization_pending"||e?.status==="slow_down"}const Mo={"oauth-subscription":"Subscription","api-platform":"API Platform","token-plan":"Token Plan",local:"Local"};function Ce(e){const t=e.label?.trim();if(t)return t;const n=e.kind?Mo[e.kind]:void 0;return n||(e.authModes?.some(r=>r==="apiKey")?"API Key":e.authModes?.some(r=>r==="oauth"||r==="deviceCode")?"Account":e.id)}function Zl(e){return Mo[e]??e}function _l(e,t){const n=(t?.length?t:At(e)).map(r=>r.authMode==="apiKey"?"API Key":r.authMode==="local"?r.label:"账号授权");return[...new Set(n)].join(" / ")}function $l(e){return e.length===0?10:Math.max(...e.map(t=>t.priority))+10}function yt(e){return e.label?.trim()?e.label:e.maskedHint?`API Key · ${e.maskedHint}`:e.authMode==="oauth"||e.authMode==="deviceCode"?"已授权账号":"API Key"}function Jr(e){const t=e.indexOf("@");if(t>0){const n=e.slice(0,t);return`${n.length>6?`${n.slice(0,3)}***${n.slice(-2)}`:n.length>1?`${n[0]}***${n[n.length-1]}`:`${n[0]}***`}${e.slice(t)}`}return e}function ed(e){return e==="healthy"?"有效":e==="unknown"?"未验证":e==="expired"?"已过期":"错误"}function td(e){return e==="healthy"?{row:"border-emerald-500/40 bg-emerald-500/5",dot:"bg-emerald-500"}:e==="unknown"?{row:"border-border/50 bg-background",dot:"bg-muted-foreground/50"}:{row:"border-destructive/40 bg-destructive/5",dot:"bg-destructive"}}function nd({providerName:e,offeringName:t,quota:n,busy:r,disabled:o=!1,credentialLabel:s,multiple:i=!1,compact:c=!1,paused:d=!1,error:u,onRefresh:f}){if(c){const h=!r&&!u&&n?.status==="available";return a.jsx("div",{className:`min-w-0 text-xs text-muted-foreground ${d?"opacity-60":""}`,children:a.jsxs("div",{className:"flex items-start gap-1",children:[a.jsxs("div",{className:"min-w-0 flex-1 truncate py-1 [&>span+span]:ml-3",children:[d?a.jsx("span",{children:"已停用 · 不参与全部刷新"}):null,r?a.jsx("span",{role:"status",children:"正在查询额度…"}):u?a.jsx("span",{role:"alert",title:u,className:"text-destructive",children:u}):n?n.status==="unsupported"?a.jsx("span",{children:"官方额度接口不支持"}):n.status==="error"?a.jsx("span",{role:"alert",className:"text-destructive",children:"额度查询失败"}):a.jsx(Gr,{quota:n}):a.jsx("span",{children:s?"尚未检查":`连接${t}后可查询`}),h&&n.stale?a.jsx("span",{children:"数据可能已过期"}):null]}),a.jsx(rd,{quota:n,label:s??t}),a.jsx(V,{className:"h-6 w-6 shrink-0 p-0",variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}${s?` ${s}`:""}额度`,disabled:r||o,onClick:f,children:r?a.jsx(Le,{"aria-hidden":"true",className:"h-3 w-3 animate-spin"}):a.jsx(Sr,{"aria-hidden":"true",className:"h-3 w-3"})})]})})}return a.jsxs("div",{className:`${i?"space-y-1.5":"space-y-3"} border-t border-border/40 pt-3 ${d?"opacity-60":""}`,children:[a.jsxs("div",{className:"flex items-center justify-between gap-2",children:[a.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[i?null:a.jsx(Ti,{className:"h-4 w-4 shrink-0 text-primary"}),a.jsxs("div",{className:"min-w-0",children:[a.jsx("div",{className:"break-all text-sm font-medium text-foreground/90",children:i?`凭证:${s}`:"剩余额度"}),i&&!r&&!u&&n?.status==="available"?a.jsx("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground",children:a.jsx(Gr,{quota:n})}):null]})]}),a.jsxs(V,{className:"shrink-0",variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}${i?` ${s}`:""}额度`,disabled:r||o,onClick:f,children:[r?a.jsx(Le,{"aria-hidden":"true",className:"mr-2 h-3.5 w-3.5 animate-spin"}):a.jsx(Sr,{"aria-hidden":"true",className:"mr-2 h-3.5 w-3.5"}),r?"查询中":"刷新"]})]}),s&&!i?a.jsxs("p",{className:"text-xs text-muted-foreground",children:["凭证:",s]}):null,d?a.jsx("p",{className:"text-xs text-muted-foreground",children:"已停用 · 不参与全部刷新"}):null,r?a.jsx("p",{role:"status",className:"text-xs text-muted-foreground",children:"正在查询额度…"}):u?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:u}):n?n.status==="unsupported"?a.jsxs(a.Fragment,{children:[a.jsx("p",{className:"text-sm",children:"官方额度接口不支持"}),a.jsxs("p",{className:"text-xs text-muted-foreground",children:["来源:",n.source]})]}):n.status==="error"?a.jsx("p",{className:"text-sm text-destructive",children:"额度查询失败"}):i?a.jsxs("details",{className:"text-xs text-muted-foreground",children:[a.jsx("summary",{className:"cursor-pointer","aria-label":`${s}额度详情`,children:"详情"}),a.jsx("div",{className:"pt-3",children:a.jsx(tr,{quota:n,hideBalance:!0})})]}):a.jsx(tr,{quota:n}):a.jsx("p",{className:"text-xs text-muted-foreground",children:s?"尚未检查":`连接${t}后可查询`})]})}function rd({quota:e,label:t}){const[n,r]=p.useState({left:16,top:16,maxHeight:400}),[o,s]=p.useState(!1),i=p.useRef(null),c=p.useRef(null),d=p.useRef(!1);return p.useEffect(()=>{if(!o)return;const u=h=>{!(h.target instanceof Node)||i.current?.contains(h.target)||c.current?.contains(h.target)||(d.current=!0,s(!1))},f=h=>{h.type==="scroll"&&h.target instanceof Node&&c.current?.contains(h.target)||(d.current=!0,s(!1))};return document.addEventListener("pointerdown",u,!0),document.addEventListener("scroll",f,!0),window.addEventListener("resize",f),()=>{document.removeEventListener("pointerdown",u,!0),document.removeEventListener("scroll",f,!0),window.removeEventListener("resize",f)}},[o]),a.jsxs(Tt,{modal:!1,open:o,onOpenChange:u=>{d.current=!1,s(u)},children:[a.jsx(Li,{asChild:!0,children:a.jsx(V,{ref:i,className:"h-6 w-6 shrink-0 p-0",variant:"ghost",size:"sm","aria-label":`${t}额度详情`,disabled:!e||e.status==="error",onClick:u=>{const f=u.currentTarget.getBoundingClientRect(),h=Math.min(320,window.innerWidth-32),A=Math.max(16,Math.min(f.right-h,window.innerWidth-h-16)),g=Math.max(16,Math.min(f.bottom+8,window.innerHeight-320));r({left:A,top:g,maxHeight:window.innerHeight-g-16})},children:a.jsx(Ka,{"aria-hidden":"true",className:"h-3 w-3"})})}),a.jsxs(Et,{ref:c,className:"w-[calc(100vw-2rem)] max-w-xs overflow-y-auto p-4",onEscapeKeyDown:()=>i.current?.focus(),onCloseAutoFocus:u=>{d.current&&u.preventDefault()},style:{...n,transform:"none",animation:"none"},"aria-describedby":void 0,children:[a.jsx(It,{className:"pr-8 text-sm",children:"额度详情"}),e?.status==="available"?a.jsx(tr,{quota:e}):e?a.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:["来源:",e.source]}):null]})]})}function Gr({quota:e}){return a.jsxs(a.Fragment,{children:[typeof e.balance=="number"?a.jsxs("span",{children:["余额:",e.balance]}):null,e.windows.map((t,n)=>a.jsxs("span",{children:[nr(t.name)," · ",No(t)]},n)),typeof e.balance!="number"&&e.windows.length===0?a.jsx("span",{children:"服务商未返回额度数据"}):null]})}function tr({quota:e,hideBalance:t=!1}){return a.jsxs("div",{className:"space-y-3 text-sm",children:[!t&&typeof e.balance=="number"?a.jsxs("div",{children:["余额:",e.balance]}):null,e.windows.map((n,r)=>a.jsxs("div",{className:"space-y-1.5",children:[a.jsxs("div",{className:"flex items-center justify-between gap-3",children:[a.jsx("span",{className:"font-medium text-foreground",children:nr(n.name)}),a.jsx("span",{className:"text-muted-foreground",children:No(n)})]}),Dt(n)!==void 0?a.jsx("div",{"aria-label":`${nr(n.name)}剩余 ${String(Dt(n))}%`,className:"h-1.5 overflow-hidden rounded-full bg-muted",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Dt(n),children:a.jsx("div",{className:"h-full rounded-full bg-primary",style:{width:`${String(Dt(n))}%`}})}):null,n.resetsAt?a.jsxs("p",{className:"text-xs text-muted-foreground",children:["重置:",Xr(n.resetsAt)]}):null]},`${String(n.name)}-${r}`)),a.jsxs("p",{className:"text-xs text-muted-foreground",children:["更新:",Xr(e.observedAt)]}),a.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:["来源:",e.source,e.stale?" · 数据可能已过期":""]})]})}function nr(e){switch(e){case"five-hour":return"5 小时限制";case"weekly":return"周限制";case"monthly":return"月限制";case"weekly-opus":return"Opus 周限制";case"weekly-sonnet":return"Sonnet 周限制";case"available_balance":return"可用余额";case"voucher_balance":return"赠送余额";case"cash_balance":return"现金余额";default:return typeof e=="string"&&e?e:"额度"}}function Dt(e){if(!(typeof e.remaining!="number"||typeof e.limit!="number"||e.limit<=0))return Math.max(0,Math.min(100,Math.round(e.remaining/e.limit*1e4)/100))}function No(e){const t=Dt(e);if(t!==void 0)return`剩余 ${String(t)}%`;if(typeof e.remaining=="number"){const n=typeof e.currency=="string"?` ${e.currency}`:"";return`剩余 ${String(e.remaining)}${n}`}return"官方数据可用"}function Xr(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function ad({methods:e,offering:t,hasCredentials:n,busy:r,disabled:o,onBeginOffering:s,onCreateLocalCredential:i}){return e.length===0?null:a.jsx("div",{className:"space-y-2",children:a.jsx("div",{className:"flex flex-wrap gap-2",children:e.map(c=>{const d=kn(c);return ct(d)?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:r||o||!s,onClick:()=>s?.(t,d,c),children:[r?a.jsx(Le,{className:"h-3.5 w-3.5 animate-spin"}):a.jsx(bn,{className:"h-3.5 w-3.5"}),c.label||(n?"添加账号":"登录")]},c.id):er(c)?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",title:"导入当前设备已有登录态,不会发起新的浏览器授权。",disabled:r||o||!i,onClick:()=>{i?.(t,c)},children:[r?a.jsx(Le,{className:"h-3.5 w-3.5 animate-spin"}):a.jsx(vt,{className:"h-3.5 w-3.5"}),c.label||"已有登录态"]},c.id):null})})})}function od(e){const t=e.modelDiscovery?.endpointProtocol;return e.endpoints?.find(n=>n.protocol===t)?.baseUrl??e.endpoints?.[0]?.baseUrl}function sd(e){try{const t=new URL(e);return`${t.host}${t.pathname.replace(/\/$/u,"")}`}catch{return e}}function id(e){return e==="responses"?"Responses API":e==="chatCompletions"?"Chat API":e==="anthropic"?"Anthropic API":e}function cd({definition:e,offering:t,createOfferings:n,status:r,credentials:o,attempt:s,apiKey:i,baseUrl:c,busy:d,disabled:u,error:f,onApiKeyChange:h,onBaseUrlChange:A,onBeginApiKey:g,onBeginBrowser:I,onSaveApiKey:m,onDisconnect:E,onCreateApiKeyCredential:P,onUpdateCredential:x,initialEditing:F,initialCreate:v=!1,onSavingChange:M,onCloseEdit:j}){const y=s?.mode==="browserAssistedApiKey"&&s.status==="pending",w=r==="configured",S=r==="connected",N=!!P,[q,H]=p.useState(t.id),B=n.find(_=>_.id===q)??t,[$,W]=p.useState(!1),[Z,le]=p.useState(F?"edit":v&&P?"create":void 0),[de,ae]=p.useState(F),[re,R]=p.useState(F?.label??""),[ee,G]=p.useState(""),[fe,oe]=p.useState(F?.baseUrl??""),[K,L]=p.useState(F?.proxyUrl??""),[se,ge]=p.useState(),[Qe,Pe]=p.useState(!1),[X,we]=p.useState(!1),Ae=p.useRef(!1),pe=p.useRef(!1);p.useEffect(()=>{v&&!P&&!pe.current&&(pe.current=!0,g())},[v,P,g]);const ue=()=>{H(t.id),le("create"),ae(void 0),R(""),G(""),oe(""),L(""),ge(void 0),Pe(!1)},te=()=>{j(),le(void 0),ae(void 0),R(""),G(""),oe(""),L(""),ge(void 0),Pe(!1)},z=async()=>{if(d||u||Ae.current)return;let _;try{_=ks(K)}catch{ge("Proxy URL 格式无效(支持 http、https)");return}if(ge(void 0),Z==="create"){const Ge=ee.trim();if(!Ge||!P)return;Ae.current=!0,we(!0),M?.(!0);try{await P(B,{apiKey:Ge,label:re.trim()||void 0,baseUrl:fe.trim()||void 0,proxyUrl:_,priority:$l(o.filter(He=>He.offeringId===B.id))}),te()}catch(He){ge(He instanceof Error?He.message:"保存失败,请重试")}finally{Ae.current=!1,we(!1),M?.(!1)}return}if(Z==="edit"&&de&&x){const Ge=K.trim()!==(de.proxyUrl??"").trim();Ae.current=!0,we(!0),M?.(!0);try{await x(de,{label:re.trim()||void 0,baseUrl:fe.trim()||void 0,...Ge?{proxyUrl:_}:{}}),te()}catch(He){ge(He instanceof Error?He.message:"保存失败,请重试")}finally{Ae.current=!1,we(!1),M?.(!1)}}};return a.jsxs("div",{className:me("space-y-3",Z&&"w-full"),children:[s?.userCode?a.jsxs("div",{className:"border-l-2 border-primary bg-muted/30 px-3 py-2 text-sm",children:["验证码:",a.jsx("strong",{className:"font-mono",children:s.userCode})]}):null,!v&&!F?a.jsxs("div",{className:"flex flex-wrap gap-2",children:[P&&n.length>0?a.jsxs(V,{variant:"outline",size:"sm",disabled:d||u||X,onClick:ue,children:[a.jsx(vt,{className:"mr-2 h-4 w-4"}),"添加 API Key"]}):null,N?null:S?a.jsxs(a.Fragment,{children:[a.jsxs(V,{variant:"outline",size:"sm",disabled:d||u||X,onClick:I,children:[d?a.jsx(Le,{className:"mr-2 h-4 w-4 animate-spin"}):a.jsx(Gn,{className:"mr-2 h-4 w-4"}),"重新连接"]}),a.jsxs(V,{variant:"ghost",size:"sm",disabled:d||u||X,onClick:E,children:[a.jsx(wi,{className:"mr-2 h-4 w-4"}),"断开连接"]})]}):w?a.jsxs(a.Fragment,{children:[a.jsxs(V,{variant:"outline",size:"sm","aria-label":"更新 API Key",disabled:d||u||X,onClick:g,children:[a.jsx(Jn,{className:"mr-2 h-4 w-4"}),"更新 API Key"]}),a.jsx(V,{variant:"ghost",size:"sm",disabled:d||u||X,onClick:E,children:"移除配置"})]}):a.jsxs(a.Fragment,{children:[a.jsxs(V,{variant:"outline",size:"sm",disabled:d||u||X||e.browserMode==="connectUnsupported",onClick:I,children:[d?a.jsx(Le,{className:"mr-2 h-4 w-4 animate-spin"}):a.jsx(bn,{className:"mr-2 h-4 w-4"}),e.browserLabel]}),a.jsxs(V,{variant:"outline",size:"sm","aria-label":`${e.name} API Key`,disabled:d||u||X,onClick:g,children:[a.jsx(Jn,{className:"mr-2 h-4 w-4"}),"配置 API Key"]})]})]}):null,Z?a.jsxs("div",{className:"space-y-2 rounded-lg border border-border/50 bg-muted/10 p-3",children:[Z==="create"&&n.length>1?a.jsxs("label",{className:"block space-y-1 text-xs text-muted-foreground",children:[a.jsx("span",{children:"套餐 / 区域"}),a.jsx("select",{"aria-label":`${e.name} 套餐 / 区域`,value:q,disabled:d||u||X,onChange:_=>{H(_.target.value),ge(void 0)},className:"h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground",children:n.map(_=>a.jsx("option",{value:_.id,children:Ce(_)},_.id))})]}):null,Z==="edit"?a.jsx(je,{disabled:d||u||X,autoComplete:"off","aria-label":`${e.name} API Key 标签`,placeholder:"名称,例如 Work key",value:re,onChange:_=>R(_.target.value)}):null,Z==="create"?a.jsx(je,{disabled:d||u||X,type:$?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:ee,onChange:_=>G(_.target.value),className:"font-mono"}):null,Z==="edit"||Qe?a.jsxs(a.Fragment,{children:[a.jsx(je,{disabled:d||u||X,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:od(Z==="edit"?t:B)||e.defaultBaseUrl||"默认服务地址",value:fe,onChange:_=>oe(_.target.value),className:"font-mono text-xs"}),a.jsx(je,{disabled:d||u||X,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Proxy URL 输入`,placeholder:"http://127.0.0.1:7890",value:K,onChange:_=>L(_.target.value),className:"font-mono text-xs"})]}):null,se?a.jsx("p",{className:"text-xs text-destructive",children:se}):null,a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(V,{size:"sm","aria-label":Z==="create"?`保存 ${e.name} API Key`:"保存凭证",disabled:d||u||X||Z==="create"&&!ee.trim(),onClick:z,children:Z==="create"?"保存 API Key":"保存凭证"}),a.jsx(V,{variant:"ghost",size:"sm",disabled:X,onClick:te,children:"取消"}),Z==="create"?a.jsx(V,{variant:"ghost",size:"sm",disabled:X,onClick:()=>Pe(_=>!_),children:Qe?"收起高级设置":"高级设置"}):null]})]}):null,y&&!Z?a.jsxs("div",{className:"space-y-2",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"text-sm font-medium",children:"API Key"}),e.apiKeyUrl?a.jsx("a",{href:e.apiKeyUrl,target:"_blank",rel:"noreferrer",className:"text-xs text-primary hover:underline",children:"获取 API Key"}):null]}),a.jsxs("div",{className:"group relative",children:[a.jsx(je,{disabled:d||u||X,type:$?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:i,onChange:_=>h(_.target.value),className:"border-border/60 bg-muted/20 pr-10 font-mono transition-colors focus:border-primary/50 focus:bg-background"}),a.jsx("div",{className:"absolute bottom-1 right-1 top-1 flex items-center",children:a.jsx(V,{variant:"ghost",size:"icon",className:"h-full w-8 rounded hover:bg-muted",onClick:()=>W(_=>!_),"aria-label":$?"隐藏 API Key":"显示 API Key",children:$?a.jsx(ui,{className:"h-4 w-4 text-muted-foreground"}):a.jsx(pi,{className:"h-4 w-4 text-muted-foreground"})})})]}),A?a.jsxs("div",{className:"space-y-1.5",children:[a.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:"Base URL(选填)"}),a.jsx(je,{disabled:d||u||X,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:e.defaultBaseUrl||"默认服务地址",value:c,onChange:_=>A(_.target.value),className:"border-border/60 bg-muted/20 font-mono text-xs transition-colors focus:border-primary/50 focus:bg-background"}),a.jsxs("p",{className:"break-all font-mono text-[11px] text-muted-foreground opacity-80",children:[a.jsx("span",{className:"mr-1 select-none opacity-50",children:"预览:"}),(c.trim()||e.defaultBaseUrl||"").replace(/\/+$/,""),"/chat/completions"]})]}):null,a.jsx(V,{size:"sm","aria-label":`保存 ${e.name} API Key`,disabled:!i.trim()||d||u,onClick:m,children:"保存 API Key"})]}):null,f?a.jsx("p",{className:"text-sm text-destructive",children:f}):null]})}function ld({controller:e,definition:t,offerings:n,apiOfferings:r,credentials:o,status:s,attempt:i,attemptOfferingId:c,apiKey:d,baseUrl:u="",busy:f,disabled:h=!1,error:A,onApiKeyChange:g,onBaseUrlChange:I,onBeginApiKey:m,onBeginBrowser:E,onSaveApiKey:P,onDisconnect:x,onUpdateCredential:F,onCreateApiKeyCredential:v,onBeginOffering:M,onCancelConnect:j,onDismissError:y}){const{editing:w,authorizationOfferingId:S,error:N,saving:q}=e,H=w||S?n.filter(B=>B.id===(w?.offeringId??S)):r;return a.jsx(Tt,{open:e.open,onOpenChange:B=>{B||q||(i&&sn(i)&&ct(i.mode)&&j?.({mode:i.mode,attemptId:i.attemptId,state:i.state,signature:i.signature,...i.offeringId?{offeringId:i.offeringId}:{}}),e.close())},children:a.jsxs(Et,{className:"max-h-[85vh] overflow-y-auto sm:max-w-lg","aria-describedby":void 0,children:[a.jsx(Lt,{children:a.jsx(It,{children:e.title})}),a.jsx("div",{className:"space-y-5","aria-label":"添加连接",children:H.map(B=>{const $=sn(i)&&ct(i?.mode)&&(c??i?.offeringId)!==B.id,W=h||q||$,Z=At(B),le=Z.filter(oe=>oe.lifecycle==="active"),de=le.some(So),ae=c===B.id?i:void 0,re=A?.offeringId===B.id?A.authorization:void 0,R=Z.find(oe=>oe.id===(re?.authorizationMethodId??ae?.authorizationMethodId))??le.find($n),ee=re?.mode??ae?.mode??(R?kn(R):Wl(B,t)),G=A?.offeringId===B.id?A.message:void 0;if(B.lifecycle==="unavailable"&&le.length===0)return a.jsxs("fieldset",{"data-create-offering":B.id,className:"space-y-2 border-t border-border/50 pt-3 first:border-t-0 first:pt-0",children:[a.jsx("legend",{className:"px-1 text-sm font-medium",children:Ce(B)}),a.jsx("p",{className:"text-xs text-muted-foreground",children:B.kind==="oauth-subscription"?"暂不可用:账号订阅需在 Xpod 桌面版中导入本机客户端(如 Codex CLI)的登录态,浏览器中无法完成。":"暂不可用:该接入方式尚未提供可用的连接流程。"})]},B.id);const fe=re?.mode;return G&&ct(fe)?a.jsxs("fieldset",{"data-create-offering":B.id,disabled:W,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ce(B)}接入操作`,children:[a.jsx("legend",{className:"px-1 text-sm font-medium",children:Ce(B)}),ae?.status==="unsupported"?a.jsx("p",{className:"text-sm",children:"当前部署未启用账号授权"}):a.jsx(gs,{title:"登录未完成",description:G,primaryLabel:"重试登录",onPrimary:()=>M?.(B,fe,R),secondaryLabel:"关闭",onSecondary:()=>{y?.(),e.close()}})]},B.id):sn(ae)&&ct(ee)?a.jsxs("fieldset",{"data-create-offering":B.id,disabled:W,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ce(B)}接入操作`,children:[a.jsx("legend",{className:"px-1 text-sm font-medium",children:Ce(B)}),a.jsx(Ur,{title:"正在连接",detail:ee==="authorizationCodeOAuth"?"等待网页授权,请在打开的页面完成登录。":ae?.userCode?`验证码:${ae.userCode}`:"请在打开的页面完成授权。",providerLabel:R?.label??Ce(B),providerHost:t.name}),a.jsx(V,{variant:"ghost",size:"sm",disabled:h,onClick:()=>{ae&&j?.({mode:ae.mode,attemptId:ae.attemptId,state:ae.state,signature:ae.signature,...ae.offeringId?{offeringId:ae.offeringId}:{}}),e.close()},children:"取消连接"})]},B.id):a.jsxs("fieldset",{"data-create-offering":B.id,disabled:W,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ce(B)}接入操作`,children:[a.jsx("legend",{className:"px-1 text-sm font-medium",children:Ce(B)}),de?a.jsx(cd,{definition:t,offering:B,status:s,createOfferings:[B],initialCreate:!w,credentials:o,initialEditing:w?.offeringId===B.id?w:void 0,onCloseEdit:e.close,onSavingChange:e.setSaving,attempt:ae??(i?.mode==="browserAssistedApiKey"?i:void 0),apiKey:d,baseUrl:u,busy:f,disabled:W,onApiKeyChange:g,onBaseUrlChange:I,onBeginApiKey:m,onBeginBrowser:E,onSaveApiKey:P,onDisconnect:x,onUpdateCredential:F,onCreateApiKeyCredential:v},`${B.id}:${w?.id??""}`):null,S&&!G?a.jsx(Ur,{title:"正在连接",detail:"正在启动授权,请稍候。",providerLabel:Ce(B),providerHost:t.name}):null,G?a.jsx("p",{className:"w-full text-sm text-destructive",children:G}):null]},B.id)})}),N?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:N}):null]})})}function dd({credential:e,label:t,busy:n,disabled:r,dragHandle:o,kindLabel:s,quota:i,onToggle:c,onTest:d,onEdit:u,onDelete:f,deleteAriaLabel:h}){const A=r||n,g=td(e.health),I=`${e.enabled?"已启用":"已停用"} · ${ed(e.health)}`;return a.jsxs("div",{"data-credential-state":e.enabled?"enabled":"disabled",className:me("flex flex-wrap items-center gap-x-3 gap-y-2 rounded-lg border px-3 py-2.5 transition-colors",e.enabled?g.row:"border-border/50 bg-muted/40 opacity-70"),children:[o,a.jsxs(Cn,{children:[a.jsx(vn,{asChild:!0,children:a.jsx("span",{"aria-label":I,className:me("h-2 w-2 shrink-0 rounded-full",e.enabled?g.dot:"bg-muted-foreground/40")})}),a.jsx(Qt,{className:"text-xs",children:I})]}),a.jsxs("div",{className:"min-w-0 flex-1 basis-24",children:[a.jsx("p",{className:"truncate text-sm font-medium text-foreground",children:t}),s?a.jsx("p",{className:"text-xs text-muted-foreground",children:s}):null,e.maskedHint&&!t.includes(e.maskedHint)?a.jsx("p",{className:"mt-1 truncate font-mono text-xs text-muted-foreground",children:e.maskedHint}):null]}),a.jsx("div",{className:"order-last w-full min-w-0 sm:order-none sm:w-auto sm:max-w-[45%]",role:"group","aria-label":`${yt(e)}额度`,children:i}),a.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[d?a.jsx(Zt,{label:`测试连接 ${t}`,disabled:A,onClick:()=>d(e),children:a.jsx(Pi,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,u?a.jsx(Zt,{label:`编辑 ${t}`,disabled:A,onClick:u,children:a.jsx(Ta,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,c?a.jsx(Zt,{label:`${e.enabled?"停用":"启用"} ${t}`,disabled:A,onClick:()=>c(e,{enabled:!e.enabled}),children:e.enabled?a.jsx(vi,{"aria-hidden":"true",className:"h-3.5 w-3.5"}):a.jsx(ji,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,f?a.jsx(Zt,{label:h??`删除 ${t}`,disabled:A,onClick:f,children:a.jsx(ur,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null]})]})}function Zt({label:e,disabled:t,onClick:n,children:r}){return a.jsxs(Cn,{children:[a.jsx(vn,{asChild:!0,children:a.jsx(V,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":e,disabled:t,onClick:n,children:r})}),a.jsx(Qt,{className:"text-xs",children:e})]})}function ud({offering:e,methods:t}){const n=e.endpoints??[],r=Ce(e),o=e.kind?Zl(e.kind):void 0,s=o&&o!==r?[o]:[];return a.jsxs("section",{className:"space-y-2","aria-labelledby":`offering-${e.id}`,children:[a.jsxs("div",{className:"flex items-start justify-between gap-3",children:[a.jsxs("div",{children:[a.jsx("h4",{id:`offering-${e.id}`,className:"text-sm font-medium text-foreground",children:r}),s.length?a.jsx("div",{className:"mt-1 flex items-center gap-2 text-xs text-muted-foreground",children:s.map(i=>a.jsx("span",{children:i},i))}):null]}),a.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-x-3 gap-y-1 text-xs",children:[a.jsx("span",{className:"text-muted-foreground",children:_l(e,t)}),e.consoleUrl?a.jsx(_t,{href:e.consoleUrl,label:"控制台"}):null,e.subscriptionUrl?a.jsx(_t,{href:e.subscriptionUrl,label:"订阅与账单"}):null,e.quota?.url?a.jsx(_t,{href:e.quota.url,label:"额度与用量"}):null,e.usagePolicyUrl?a.jsx(_t,{href:e.usagePolicyUrl,label:"使用政策"}):null]})]}),e.lifecycle==="unavailable"&&!At(e).some(i=>i.lifecycle==="active")?a.jsx("p",{className:"text-xs text-muted-foreground",children:e.kind==="oauth-subscription"?"暂不可用:账号订阅需在 Xpod 桌面版中导入本机客户端(如 Codex CLI)的登录态,浏览器中无法完成。":"暂不可用:该接入方式尚未提供可用的连接流程。"}):null,n.length?a.jsx("dl",{className:"space-y-1 text-[11px] text-muted-foreground",children:n.map(i=>a.jsxs("div",{className:"flex min-w-0 items-baseline gap-2",children:[a.jsx("dt",{className:"shrink-0 text-foreground/70",children:id(i.protocol)}),a.jsx("dd",{className:"min-w-0 truncate font-mono",title:i.baseUrl,children:sd(i.baseUrl)})]},`${i.protocol}:${i.baseUrl}`))}):null]})}function _t({href:e,label:t}){return a.jsx("a",{href:e,target:"_blank",rel:"noreferrer",className:"text-primary hover:underline",children:t})}function fd({credentials:e,disabled:t,onMove:n,children:r}){const o=p.useRef(null),s=p.useRef(null),i=p.useRef(void 0),c=p.useRef(void 0),d=p.useRef(null),u=p.useRef(void 0),f=p.useRef(t),[h,A]=p.useState(""),g=t||!n||e.length<2,I=e.map(j=>j.id).join("\0"),m=()=>Array.from(o.current?.querySelectorAll("[data-sortable-credential]")??[]),E=()=>{i.current!==void 0&&cancelAnimationFrame(i.current),c.current!==void 0&&clearTimeout(c.current),i.current=void 0,c.current=void 0;for(const j of m()){for(const y of["transform","transition","zIndex","position","boxShadow","willChange","backgroundColor"])j.style[y]="";delete j.dataset.dragging}},P=()=>{const j=d.current;if(!j)return;d.current=null,E();const y=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1,w=m();for(const S of w){const N=j.get(S.dataset.sortableCredential);if(!N||y)continue;const q=S.getBoundingClientRect();S.style.transition="none",S.style.transform=`translateY(${N.top-q.top}px)`}o.current?.getBoundingClientRect(),i.current=requestAnimationFrame(()=>{i.current=void 0;for(const S of w)S.style.transition=y?"none":"transform 160ms ease-out, box-shadow 160ms ease-out",S.style.transform="translateY(0px)";c.current=setTimeout(E,y?0:180)})},x=j=>{const y=s.current;if(y){if(i.current!==void 0&&cancelAnimationFrame(i.current),d.current=new Map(y.rows.map(w=>[w.dataset.sortableCredential,w.getBoundingClientRect()])),u.current=I,j&&y.from!==y.to&&!g){const w=y.rects[y.from],S=y.rects[y.to],N=Math.max(0,y.rects[1].top-y.rects[0].bottom),q=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;y.rows.forEach((H,B)=>{const $=B===y.from?y.from<y.to?S.bottom-w.bottom:S.top-w.top:y.from<B&&B<=y.to?-(w.height+N):y.to<=B&&B<y.from?w.height+N:0;H.style.transition=q?"none":"transform 160ms ease-out",H.style.transform=`translateY(${$}px)`;const W=y.rects[B];d.current.set(H.dataset.sortableCredential,{...W,top:W.top+$,bottom:W.bottom+$})})}s.current=null,y.handle.hasPointerCapture?.(y.pointerId)&&y.handle.releasePointerCapture?.(y.pointerId),j&&!g&&e[y.from]?.id===y.id&&F(y.from,y.to),i.current=requestAnimationFrame(()=>{i.current=void 0,(!j||!f.current)&&P()}),c.current=setTimeout(P,1e4)}},F=(j,y)=>{g||j===y||y<0||y>=e.length||(n?.(j,y),A(`已请求将${yt(e[j])}移至第 ${y+1} 位`))},v=p.useRef({finish:x,settle:P,clearMotion:E});p.useLayoutEffect(()=>{v.current={finish:x,settle:P,clearMotion:E},f.current=t}),p.useLayoutEffect(()=>{s.current&&v.current.finish(!1),d.current&&(u.current!==I||!t)&&v.current.settle()},[I,g,t]),p.useEffect(()=>()=>{const j=s.current;s.current=null,d.current=null,j?.handle.hasPointerCapture?.(j.pointerId)&&j.handle.releasePointerCapture?.(j.pointerId),v.current.clearMotion()},[]);const M=()=>{i.current=void 0;const j=s.current;if(!j)return;const y=j.rects[j.from],w=j.rects.length>1?Math.max(0,j.rects[1].top-j.rects[0].bottom):0;j.rows.forEach((S,N)=>{const q=N===j.from?j.y-j.startY:j.from<N&&N<=j.to?-(y.height+w):j.to<=N&&N<j.from?y.height+w:0;S.style.transform=`translateY(${q}px)`})};return a.jsxs("div",{ref:o,className:"space-y-2",children:[a.jsx("span",{className:"sr-only",role:"status",children:h}),e.map((j,y)=>a.jsx("div",{"data-sortable-credential":j.id,className:"rounded-lg",children:r(j,n?a.jsx("button",{type:"button",disabled:g,"aria-label":`拖动排序 ${yt(j)}`,title:e.length<2?"至少添加两条连接后可拖动排序":"拖动调整优先级,或使用方向键、Home / End 排序",className:"flex h-8 w-6 shrink-0 touch-none select-none items-center justify-center rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary disabled:opacity-40 enabled:cursor-grab active:cursor-grabbing",onKeyDown:w=>{if(w.key==="Escape"){x(!1);return}const S=w.key==="ArrowUp"?y-1:w.key==="ArrowDown"?y+1:w.key==="Home"?0:w.key==="End"?e.length-1:void 0;S!==void 0&&(w.preventDefault(),F(y,S))},onPointerDown:w=>{if(g||w.button!==0||s.current)return;w.preventDefault(),d.current=null,E(),w.currentTarget.focus(),w.currentTarget.setPointerCapture?.(w.pointerId);const S=m(),N=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;s.current={id:j.id,from:y,to:y,pointerId:w.pointerId,startY:w.clientY,y:w.clientY,handle:w.currentTarget,rows:S,rects:S.map(q=>q.getBoundingClientRect())};for(const[q,H]of S.entries())H.style.willChange="transform",H.style.transition=N||q===y?"none":"transform 160ms ease-out",q===y&&(H.dataset.dragging="true",H.style.position="relative",H.style.zIndex="10",H.style.boxShadow="0 8px 24px rgb(0 0 0 / 0.18)",H.style.backgroundColor="hsl(var(--card))")},onPointerMove:w=>{const S=s.current;if(!S||S.pointerId!==w.pointerId||g)return;S.y=w.clientY;let N=1/0;S.rects.forEach((q,H)=>{const B=Math.abs(w.clientY-(q.top+q.bottom)/2);B<N&&(N=B,S.to=H)}),i.current===void 0&&(i.current=requestAnimationFrame(M))},onPointerUp:w=>{s.current?.pointerId===w.pointerId&&x(!0)},onPointerCancel:w=>{s.current?.pointerId===w.pointerId&&x(!1)},onLostPointerCapture:w=>{s.current?.pointerId===w.pointerId&&x(!1)},children:a.jsx(gi,{"aria-hidden":"true",className:"h-4 w-4"})}):null)},j.id))]})}function pd({attempt:e,onDismissError:t,onBeginOffering:n,onBeginBrowser:r,onCreateLocalCredential:o}){const[s,i]=p.useState(!1),[c,d]=p.useState(),[u,f]=p.useState(),[h,A]=p.useState(),[g,I]=p.useState(!1),m=s||!!c||!!u,E=p.useCallback(()=>{i(!1),f(void 0),d(void 0),A(void 0)},[]),P=p.useRef(e);p.useEffect(()=>{const w=P.current;P.current=e,m&&e!==w&&e?.status==="completed"&&E()},[e,m,E]);const x=p.useCallback(()=>{A(void 0),t?.()},[t]),F=p.useCallback(()=>{x(),i(!0)},[x]),v=p.useCallback(()=>{x(),r()},[x,r]),M=p.useCallback((w,S,N)=>{x(),f(w.id),n?.(w,S,N)},[x,n]),j=p.useCallback(async(w,S)=>{if(o){x(),I(!0);try{await o(w,S)}catch(N){A(N instanceof Error?N.message:"连接失败,请重试")}finally{I(!1)}}},[x,o]),y=p.useCallback(w=>{d(w)},[]);return{open:m,title:c?"编辑连接":u?"连接账号":"新建连接",...c?{editing:c}:{},...u?{authorizationOfferingId:u}:{},...h?{error:h}:{},saving:g,beginApiKey:F,beginEdit:y,beginAuthorization:M,beginBrowser:v,beginLocal:j,setSaving:I,close:E}}function hd({definition:e,product:t,status:n,accountLabel:r,attempt:o,attemptOfferingId:s,apiKey:i,baseUrl:c="",busy:d,disabled:u=!1,error:f,suppressError:h=!1,quotas:A={},onApiKeyChange:g,onBaseUrlChange:I,onBeginApiKey:m,onBeginOffering:E,onCancelConnect:P,onBeginBrowser:x,onSaveApiKey:F,onDisconnect:v,onCreateApiKeyCredential:M,onCreateLocalCredential:j,onUpdateCredential:y,onDeleteCredential:w,onTestCredential:S,onReorderCredentials:N,onRefreshQuota:q,onDismissError:H}){const B=[{id:"api-platform",label:"API Key",kind:"api-platform",authModes:["apiKey"]}],$=t?.credentials??[],W=t?.offerings.length?t.offerings:B,Z=W.filter(R=>At(R).some(ee=>ee.lifecycle==="active"&&So(ee))),le=sn(o)&&ct(o?.mode),de=[...$].sort((R,ee)=>R.priority-ee.priority),ae=$.some(R=>A[R.id]?.busy),re=pd({attempt:o,onDismissError:H,onBeginOffering:E,onBeginBrowser:x,onCreateLocalCredential:j});return a.jsx(Wa,{children:a.jsxs("section",{className:"space-y-3","aria-label":"当前连接",children:[a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[a.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[a.jsx(Mi,{className:"h-4 w-4 text-primary"}),"当前连接"]}),a.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-2",children:[$.length>1?a.jsx(V,{variant:"ghost",size:"sm","aria-label":`刷新全部 ${e.name}额度`,disabled:u||ae||!$.some(R=>R.enabled)||!q,onClick:()=>W.forEach(R=>q?.(R)),children:ae?"查询中":"刷新全部额度"}):null,W.map(R=>{const ee=At(R).filter(G=>G.lifecycle==="active"&&($n(G)||er(G)));return ee.length?a.jsx("div",{role:"group","aria-label":`${Ce(R)}快捷接入`,children:a.jsx(ad,{methods:ee,offering:R,hasCredentials:$.some(G=>G.offeringId===R.id),busy:d||re.saving,disabled:u||le,onBeginOffering:E?re.beginAuthorization:void 0,onCreateLocalCredential:j?re.beginLocal:void 0})},R.id):null}),Z.length>0&&!W.some(R=>At(R).some(ee=>ee.lifecycle==="active"&&($n(ee)||er(ee))))&&e.browserMode==="browserAssistedApiKey"?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs","aria-label":`${e.name} 登录`,disabled:d||re.saving||u||le,onClick:re.beginBrowser,children:[a.jsx(bn,{className:"h-3.5 w-3.5"}),e.browserLabel]}):null,Z.length>0?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs","aria-label":"新建 API Key 连接",disabled:d||re.saving||u||le||!t&&n==="pending"&&!o,onClick:re.beginApiKey,children:[a.jsx(vt,{className:"h-3.5 w-3.5"}),"API Key"]}):null]})]}),a.jsxs("div",{"aria-label":"凭据列表",className:"space-y-2",children:[a.jsx(fd,{credentials:de,disabled:d||u,onMove:N?(R,ee)=>{const G=W.find(fe=>fe.id===de[R]?.offeringId);G&&N(G,de,R,ee)}:void 0,children:(R,ee)=>{const G=W.find(L=>L.id===R.offeringId);if(!G)return null;const fe=R.authMode==="apiKey"?yt(R):R.label?Jr(R.label):yt(R),oe=A[R.id],K=oe?.credentialId===R.id?oe:void 0;return a.jsx(dd,{credential:R,label:fe,dragHandle:ee,kindLabel:R.authMode==="apiKey"?"API Key":Ce(G),busy:d,disabled:u,onToggle:y,onTest:S,onEdit:R.authMode==="apiKey"?()=>re.beginEdit(R):void 0,onDelete:()=>R.authMode==="apiKey"?w?.(R):v(R),deleteAriaLabel:R.authMode==="apiKey"?`删除 ${fe}`:`${fe} 移除`,quota:a.jsx(nd,{compact:!0,providerName:e.name,offeringName:Ce(G),credentialLabel:yt(R),multiple:$.length>1,quota:K?.quota,busy:K?.busy??!1,error:K?.error,paused:!R.enabled,disabled:u||!q,onRefresh:()=>q?.(G,R)})})}}),$.length?null:a.jsx("p",{className:"py-2 text-xs text-muted-foreground",children:r?Jr(r):"尚未添加连接"}),$.length===0&&(n==="configured"||n==="connected")?a.jsx(V,{variant:"ghost",size:"sm",disabled:d||u,onClick:()=>v(),children:n==="configured"?"移除配置":"断开连接"}):null]}),a.jsx(ld,{controller:re,definition:e,offerings:W,apiOfferings:Z,credentials:$,status:n,attempt:o,attemptOfferingId:s,apiKey:i,baseUrl:c,busy:d,disabled:u,error:f,onApiKeyChange:g,onBaseUrlChange:I,onBeginApiKey:m,onBeginBrowser:x,onSaveApiKey:F,onDisconnect:v,onUpdateCredential:y,onCreateApiKeyCredential:M,onBeginOffering:E,onCancelConnect:P,onDismissError:H}),a.jsxs("details",{className:"text-xs text-muted-foreground",children:[a.jsx("summary",{className:"w-fit cursor-pointer",children:"接入信息"}),a.jsx("div",{className:"mt-2 space-y-3",children:W.map(R=>a.jsx(ud,{offering:R},R.id))})]}),re.error&&!re.open&&re.error!==f?.message?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:re.error}):null,f&&(f.offeringId?!re.open:!h)?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:f.message}):null]})})}function md({definition:e,product:t,status:n,accountLabel:r,attempt:o,attemptOfferingId:s,apiKey:i,baseUrl:c="",busy:d,disabled:u=!1,error:f,quotas:h,models:A,verifyPending:g=!1,onApiKeyChange:I,onBaseUrlChange:m,onBeginApiKey:E,onBeginOffering:P,onCancelConnect:x,onBeginBrowser:F,onSaveApiKey:v,onDisconnect:M,onCreateApiKeyCredential:j,onCreateLocalCredential:y,onUpdateCredential:w,onDeleteCredential:S,onTestCredential:N,onReorderCredentials:q,onRefreshQuota:H,onVerify:B,onAddModel:$,onEditModel:W,onDeleteModel:Z,selectedModelIds:le,modelSelectionStatus:de,onModelSelectionChange:ae,onDismissError:re}){const R=n==="configured",ee=n==="connected",G=A.length===0&&f?.message&&!f.offeringId?f.message:void 0,[fe,oe]=p.useState(""),[K,L]=p.useState(),[se,ge]=p.useState(le??[]),Qe=le??se,Pe=p.useMemo(()=>yd(A),[A]),X=Q=>Q.selectionIds.some(ye=>Qe.includes(ye)),we=p.useMemo(()=>{const Q=fe.trim().toLocaleLowerCase();return Q?Pe.filter(ye=>ye.searchText.includes(Q)):Pe},[Pe,fe]),Ae=we.filter(Q=>Q.availability!=="unavailable"),pe=Ae.filter(X).length,ue=Ae.length>0&&pe===Ae.length,te=pe>0&&!ue,z=Pe.filter(X).length,_=Pe.filter(Q=>Q.availability==="unavailable").length,Ge=async Q=>{try{await navigator.clipboard.writeText(Q),L(Q),setTimeout(()=>L(ye=>ye===Q?void 0:ye),1500)}catch{L(void 0)}},He=Q=>{const ye=new Set(Qe),Ne=X(Q);for(const et of Ne?Q.selectionIds:Q.availableSelectionIds)Ne?ye.delete(et):ye.add(et);const qe=[...ye];le===void 0&&ge(qe),ae?.(e.id,qe)},Dn=()=>{const Q=new Set(Qe);for(const Ne of Ae)for(const qe of ue?Ne.selectionIds:Ne.availableSelectionIds)ue?Q.delete(qe):Q.add(qe);const ye=[...Q];le===void 0&&ge(ye),ae?.(e.id,ye)};return a.jsx(Wa,{children:a.jsxs("div",{className:"space-y-8",children:[a.jsxs("header",{className:"flex items-start justify-between gap-4",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsxs(gn,{className:"h-9 w-9 shrink-0 rounded-lg border border-border/50 bg-muted/50 shadow-sm",style:fn(e.id)?{backgroundColor:fn(e.id)}:void 0,children:[a.jsx(wa,{src:un(e.id),className:"object-cover"}),a.jsx(An,{className:"rounded-lg bg-transparent text-sm font-bold uppercase text-muted-foreground",children:Ad(e.id)})]}),a.jsxs("div",{className:"flex flex-col justify-center gap-0.5",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("h2",{className:"text-base font-semibold leading-none tracking-tight text-foreground",children:e.name}),a.jsxs(Cn,{children:[a.jsx(vn,{asChild:!0,children:a.jsx("button",{type:"button","aria-label":"提供商说明",className:"cursor-help rounded-sm text-muted-foreground/50 focus:outline-none focus-visible:text-foreground",children:a.jsx(Ka,{"aria-hidden":"true",className:"h-3.5 w-3.5"})})}),a.jsxs(Qt,{className:"max-w-xs space-y-2 text-xs",children:[a.jsx("p",{children:e.description}),a.jsx("p",{children:"Provider 凭证保存在当前 Pod,由 Pod 权限保护。"})]})]})]}),a.jsxs("a",{href:e.homeUrl,target:"_blank",rel:"noreferrer",className:"flex items-center gap-0.5 text-[10px] leading-none text-muted-foreground transition-colors hover:text-primary",children:["访问官网 ",a.jsx(bn,{"aria-hidden":"true",className:"h-2.5 w-2.5"})]})]})]}),a.jsx(on,{variant:ee||R?"default":"secondary",children:xd(n)})]}),a.jsx(hd,{definition:e,product:t,status:n,accountLabel:r,attempt:o,attemptOfferingId:s,apiKey:i,baseUrl:c,busy:d,disabled:u,error:f,suppressError:!!G,quotas:h,onApiKeyChange:I,onBaseUrlChange:m,onBeginApiKey:E,onBeginOffering:P,onCancelConnect:x,onBeginBrowser:F,onSaveApiKey:v,onDisconnect:M,onCreateApiKeyCredential:t?.offerings.length?j:void 0,onCreateLocalCredential:t?.offerings.length?y:void 0,onUpdateCredential:w,onDeleteCredential:S,onTestCredential:N,onReorderCredentials:q,onRefreshQuota:H,onDismissError:re}),a.jsxs("section",{className:"space-y-4",children:[a.jsxs("div",{"data-testid":"provider-models-header",className:"flex flex-col gap-3 border-b border-border/40 pb-4 sm:flex-row sm:items-center sm:justify-between",children:[a.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1",children:[a.jsx(ln,{className:"h-4 w-4 shrink-0 text-primary"}),a.jsx("h3",{className:"shrink-0 text-sm font-medium text-foreground/90",children:"可用模型"}),a.jsxs("span",{className:"text-xs text-muted-foreground",children:["共 ",Pe.length," · 已加入 ",z," · 已失效 ",_]}),a.jsxs("span",{role:"status","aria-live":"polite","aria-atomic":"true",className:me("inline-flex items-center gap-1 text-xs",de==="error"?"text-destructive":"text-muted-foreground"),children:[de==="saving"?a.jsx(Le,{"aria-hidden":"true",className:"h-3 w-3 animate-spin motion-reduce:animate-none"}):de==="saved"?a.jsx(st,{"aria-hidden":"true",className:"h-3 w-3"}):null,de==="saving"?"保存中…":de==="saved"?"已保存":de==="error"?"保存失败,请重试":"选择后自动保存"]})]}),a.jsxs("div",{"data-testid":"provider-models-actions",className:"flex w-full flex-wrap items-center gap-2 sm:w-auto sm:flex-nowrap sm:justify-end",children:[(R||ee)&&(B||$)?a.jsxs(a.Fragment,{children:[$?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||d,onClick:$,children:[a.jsx(vt,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"添加模型"]}):null,B&&A.length>0?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||d||g,onClick:B,children:[g?a.jsx(Le,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):a.jsx(Gn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),g?"同步中...":"刷新模型"]}):B?a.jsxs(V,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||d||g,onClick:B,children:[g?a.jsx(Le,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):a.jsx(Gn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),g?"同步中...":"同步模型"]}):null]}):null,a.jsxs("div",{className:"relative w-full sm:w-auto",children:[a.jsx(La,{className:"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),a.jsx(je,{value:fe,onChange:Q=>oe(Q.target.value),placeholder:"搜索模型...",className:"h-8 w-full bg-background pl-8 text-xs sm:w-[232px]",autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0})]})]})]}),A.length===0?a.jsx("div",{className:"rounded-lg border border-dashed border-border/50 bg-muted/5 py-12 text-center text-sm text-muted-foreground",children:G?a.jsx("p",{className:"text-destructive",children:G}):"暂无可用模型"}):we.length===0?a.jsx("div",{className:"rounded-lg border border-dashed border-border/50 bg-muted/5 py-12 text-center text-sm text-muted-foreground",children:"未找到匹配的模型"}):a.jsxs("div",{className:"grid gap-2",children:[a.jsx("div",{className:"flex items-center justify-between px-1 py-1",children:a.jsxs("button",{type:"button",role:"checkbox","aria-label":"全选当前结果","aria-checked":te?"mixed":ue,disabled:u||d||Ae.length===0,onClick:Dn,className:"flex items-center gap-2 text-xs text-muted-foreground disabled:opacity-50",children:[a.jsx("span",{className:me("flex h-4 w-4 items-center justify-center rounded border",ue||te?"border-primary bg-primary text-primary-foreground":"border-border"),children:te?a.jsx("span",{"aria-hidden":"true",children:"−"}):a.jsx(st,{"aria-hidden":"true",className:me("h-3 w-3",!ue&&"invisible")})}),"全选当前结果"]})}),we.map(Q=>{const ye=Ro(Q),Ne=X(Q),qe=Q.availability==="unavailable",et=Q.displayName??Q.id,jt=[...(Q.inputModalities??[]).filter(Ye=>Ye!=="text"),...Q.capabilities??[]];return a.jsxs("div",{className:me("group flex items-center gap-3 rounded-lg border bg-card p-3 transition-all duration-200 hover:border-border/60 hover:bg-accent/30",Ne?"border-primary/40 bg-primary/[0.03]":"border-border/40",qe&&"opacity-75"),children:[a.jsx("button",{type:"button",role:"checkbox","aria-checked":Ne,"aria-label":`${Ne?"取消选择":"选择"} ${et}`,className:me("flex h-5 w-5 shrink-0 items-center justify-center rounded border transition-colors focus:outline-none focus-visible:border-ring",Ne?"border-primary bg-primary text-primary-foreground":"border-border text-transparent hover:border-primary/60"),disabled:u||d||qe&&!Ne,onClick:()=>He(Q),children:a.jsx(st,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}),a.jsx("div",{className:"shrink-0 rounded bg-muted/50 p-2 text-muted-foreground transition-colors group-hover:text-primary",children:a.jsx(ln,{className:"h-4 w-4"})}),a.jsxs("div",{className:"min-w-0 flex-1",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"truncate text-sm font-medium text-foreground/90",children:et}),a.jsx("div",{className:"flex items-center gap-1",children:jt.map(Ye=>a.jsx(gd,{type:Ye},Ye))}),Q.custom?a.jsx(on,{variant:"outline",className:"shrink-0 text-[10px] font-normal",children:"手工"}):null,qe?a.jsx(on,{variant:"destructive",className:"shrink-0 text-[10px] font-normal",children:"已失效"}):null]}),Q.displayName?a.jsxs("div",{className:"mt-0.5 flex items-center gap-1.5",children:[a.jsx("code",{className:"max-w-[300px] truncate font-mono text-[10px] text-muted-foreground opacity-70",children:Q.id}),a.jsx("button",{type:"button",onClick:()=>{Ge(Q.id)},className:"rounded p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground group-hover:opacity-100 group-focus-within:opacity-100 focus:opacity-100","aria-label":`复制 ${Q.displayName} ID`,title:"复制 ID",children:K===Q.id?a.jsx(st,{"aria-hidden":"true",className:"h-3 w-3 text-primary"}):a.jsx(zn,{"aria-hidden":"true",className:"h-3 w-3"})})]}):null]}),Q.custom&&(W||Z)?a.jsxs("div",{className:"flex shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 focus-within:opacity-100",children:[W?a.jsx(V,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":`编辑 ${Q.displayName??Q.id}`,onClick:()=>W(Q),children:a.jsx(Ta,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null,Z?a.jsx(V,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":`删除 ${Q.displayName??Q.id}`,onClick:()=>Z(Q),children:a.jsx(ur,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null]}):null]},ye)})]})]})]})})}function gd({type:e}){const t={image:{icon:Oa,label:"视觉识别",className:"text-green-500"},web:{icon:Ra,label:"联网搜索",className:"text-blue-500"},tool_call:{icon:ln,label:"函数调用",className:"text-orange-500"},reasoning:{icon:Na,label:"推理",className:"text-purple-500"}}[e];if(!t)return null;const n=t.icon;return a.jsxs(Cn,{children:[a.jsx(vn,{asChild:!0,children:a.jsx("button",{type:"button","aria-label":t.label,className:"flex cursor-help items-center justify-center rounded-sm opacity-80 transition-opacity hover:opacity-100 focus:outline-none focus-visible:opacity-100",children:a.jsx(n,{"aria-hidden":"true",className:me("h-3.5 w-3.5",t.className)})})}),a.jsx(Qt,{children:t.label})]})}function Ad(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS";case"zhipu":return"智";case"ollama":return"O";case"custom":return"C"}}function Ro(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function yd(e){const t=new Map;for(const n of e){const r=`${n.provider}\0${n.id}`,o=Ro(n),s=t.get(r),i=[n.id,n.displayName].filter(Boolean).join(`
|
|
3
3
|
`).toLocaleLowerCase();if(!s){t.set(r,{...n,selectionIds:[o],availableSelectionIds:n.availability==="unavailable"?[]:[o],searchText:i});continue}s.selectionIds.includes(o)||s.selectionIds.push(o),n.availability!=="unavailable"&&!s.availableSelectionIds.includes(o)&&s.availableSelectionIds.push(o),n.availability!=="unavailable"&&(s.availability=n.availability),s.capabilities=[...new Set([...s.capabilities??[],...n.capabilities??[]])],s.inputModalities=[...new Set([...s.inputModalities??[],...n.inputModalities??[]])],s.searchText+=`
|
|
4
4
|
${i}`}return[...t.values()]}function xd(e){switch(e){case"pending":return"连接中";case"configured":return"已配置";case"connected":return"已连接";case"disconnected":return"未设置";case"reauthRequired":return"需要重新登录";case"failed":return"连接失败";default:return"未检查"}}const bd=[{id:"image",label:"视觉识别",icon:Oa}],wd=[{id:"tool_call",label:"函数调用",icon:ln},{id:"reasoning",label:"推理",icon:Na},{id:"web",label:"联网搜索",icon:Ra}];function Cd({open:e,providerName:t,initialValue:n,error:r,saving:o=!1,onOpenChange:s,onSave:i}){const c=!!n,[d,u]=p.useState(""),[f,h]=p.useState(""),[A,g]=p.useState([]),[I,m]=p.useState([]);p.useEffect(()=>{e&&(u(n?.id??""),h(n?.name??""),g(n?.inputModalities??[]),m(n?.capabilities??[]))},[n,e]);const E=d.trim(),P=!!E&&!o,x=(v,M,j)=>{M(v.includes(j)?v.filter(y=>y!==j):[...v,j])},F=(v,M,j)=>{const y=M.includes(v.id),w=v.icon;return a.jsxs("button",{type:"button","aria-pressed":y,disabled:o,onClick:()=>x(M,j,v.id),className:me("flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors",y?"border-primary/50 bg-primary/10 text-primary":"border-border/60 text-muted-foreground hover:border-border hover:text-foreground"),children:[a.jsx(w,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),v.label]},v.id)};return a.jsx(Tt,{open:e,onOpenChange:s,children:a.jsxs(Et,{className:"max-w-md",children:[a.jsx(Lt,{children:a.jsxs(It,{children:[c?"编辑模型":"添加模型"," · ",t]})}),a.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-model-id",children:"模型 ID"}),a.jsx(je,{id:"ai-model-id",value:d,disabled:c||o,placeholder:"例如 gpt-4o-mini",onChange:v=>u(v.target.value)})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-model-name",children:"显示名称"}),a.jsx(je,{id:"ai-model-name",value:f,disabled:o,placeholder:"留空则使用模型 ID",onChange:v=>h(v.target.value)})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{children:"输入模态"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:bd.map(v=>F(v,A,g))})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{children:"能力标记"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:wd.map(v=>F(v,I,m))})]}),r?a.jsx("p",{className:"text-xs text-destructive",role:"alert",children:r}):null]}),a.jsxs(Mt,{children:[a.jsx(V,{variant:"outline",disabled:o,onClick:()=>s(!1),children:"取消"}),a.jsx(V,{disabled:!P,onClick:()=>i({id:E,name:f.trim(),inputModalities:A,capabilities:I}),children:o?"保存中...":"保存"})]})]})})}const vd="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20800%22%3E%3Crect%20width%3D%22800%22%20height%3D%22800%22%20rx%3D%22120%22%20fill%3D%22%2309090b%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%20d%3D%22%20M165.29%20165.29%20H517.36%20V400%20H400%20V517.36%20H282.65%20V634.72%20H165.29%20Z%20M282.65%20282.65%20V400%20H400%20V282.65%20Z%20%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M517.36%20400%20H634.72%20V634.72%20H517.36%20Z%22%2F%3E%3C%2Fsvg%3E",Ed="data:image/svg+xml,%3Csvg%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%220%200%2040%2040%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20clip-path%3D%22url(%23clip0_5110_14771)%22%3E%3Crect%20width%3D%2240%22%20height%3D%2240%22%20rx%3D%2220%22%20fill%3D%22url(%23paint0_linear_5110_14771)%22%2F%3E%3Cg%20filter%3D%22url(%23filter0_f_5110_14771)%22%3E%3Ccircle%20cx%3D%2212.6071%22%20cy%3D%2234.9794%22%20r%3D%2214.081%22%20fill%3D%22%2332E6B9%22%20fill-opacity%3D%220.4%22%2F%3E%3C%2Fg%3E%3Cg%20filter%3D%22url(%23filter1_f_5110_14771)%22%3E%3Ccircle%20cx%3D%2233.3404%22%20cy%3D%2243.6185%22%20r%3D%2212.8704%22%20fill%3D%22%2332E6B9%22%2F%3E%3C%2Fg%3E%3Cpath%20d%3D%22M27.6897%203.3426C28.057%203.01322%2028.0795%202.99983%2028.3485%202.98366C28.7851%202.95177%2029.1858%203.16107%2029.8664%203.78072C31.4566%205.22574%2033.6703%208.19724%2035.047%2010.7343L35.5796%2011.7191L36.3309%2012.0927C37.0562%2012.4593%2038.2459%2013.2111%2038.7428%2013.614C38.9673%2013.7997%2038.9992%2013.8032%2039.2326%2013.7124C40.2872%2013.3017%2041.7982%2013.846%2043.1307%2015.1244C44.3302%2016.274%2045.479%2018.2384%2045.9191%2019.8778C45.9833%2020.1417%2046.0683%2020.709%2046.0994%2021.1314C46.1997%2022.6144%2045.7243%2023.7986%2044.8085%2024.3349C44.6213%2024.443%2044.6085%2024.4725%2044.6137%2024.939C44.6559%2027.1604%2044.0571%2029.3777%2042.8543%2031.54C41.4965%2033.9678%2039.0794%2036.4798%2035.8073%2038.846C34.0502%2040.1247%2029.8918%2042.5469%2028.0122%2043.3973C23.5096%2045.4244%2019.8999%2046.2022%2016.7645%2045.8181C14.8943%2045.5915%2012.7771%2044.8611%2011.5246%2044.0137C11.1951%2043.786%2011.1428%2043.7719%2010.8909%2043.8439C9.55017%2044.2289%207.79442%2043.4374%206.30272%2041.7817C5.70771%2041.1197%204.74709%2039.4939%204.43575%2038.6241C3.71569%2036.5887%203.85859%2034.752%204.81783%2033.6551C5.0657%2033.3725%205.07387%2033.3607%205.01972%2032.8856C4.93033%2032.1079%204.88982%2030.9566%204.93066%2030.2138L4.96343%2029.5205L3.92091%2027.6777C2.3078%2024.8074%201.28326%2022.3968%200.887982%2020.5554C0.679402%2019.546%200.692781%2019.0981%200.949061%2018.7667C1.10529%2018.5666%201.61622%2018.3594%202.23252%2018.2455C3.78518%2017.9729%207.17203%2018.2198%2010.9394%2018.885L11.3303%2018.9525L12.1903%2018.1921C13.6179%2016.9275%2014.5665%2016.2176%2016.315%2015.1274C18.1373%2013.9872%2020.1943%2013.0498%2022.5103%2012.3071L23.2533%2012.0687L23.6615%2010.9964C25.1239%207.13587%2026.6218%204.28969%2027.6897%203.3426ZM15.4393%2023.1261C13.7864%2024.0804%2012.9602%2024.5582%2012.3529%2025.093C9.89364%2027.2585%208.9738%2030.6888%2010.0208%2033.7938C10.2794%2034.5606%2010.7568%2035.387%2011.7111%2037.0398C12.6653%2038.6926%2013.1424%2039.5194%2013.6771%2040.1267C15.8426%2042.5859%2019.2732%2043.5045%2022.3783%2042.4574C23.145%2042.1989%2023.972%2041.7223%2025.6248%2040.768L35.1333%2035.2783C36.7862%2034.324%2037.6124%2033.8462%2038.2196%2033.3114C40.6789%2031.1459%2041.5988%2027.7156%2040.5518%2024.6105C40.2932%2023.8438%2039.8157%2023.0174%2038.8615%2021.3646C37.9072%2019.7117%2037.4302%2018.885%2036.8955%2018.2777C34.7299%2015.8185%2031.2993%2014.8999%2028.1943%2015.947C27.4275%2016.2055%2026.6006%2016.6821%2024.9478%2017.6364L15.4393%2023.1261Z%22%20fill%3D%22url(%23paint1_linear_5110_14771)%22%2F%3E%3Crect%20x%3D%2215.8816%22%20y%3D%2230.0273%22%20width%3D%224.00904%22%20height%3D%228.32646%22%20rx%3D%222.00452%22%20transform%3D%22rotate(-30%2015.8816%2030.0273)%22%20fill%3D%22white%22%2F%3E%3Crect%20x%3D%2226.6978%22%20y%3D%2223.7812%22%20width%3D%224.00904%22%20height%3D%228.32646%22%20rx%3D%222.00452%22%20transform%3D%22rotate(-30%2026.6978%2023.7812)%22%20fill%3D%22white%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3Cfilter%20id%3D%22filter0_f_5110_14771%22%20x%3D%22-14.9163%22%20y%3D%227.45599%22%20width%3D%2255.0468%22%20height%3D%2255.047%22%20filterUnits%3D%22userSpaceOnUse%22%20color-interpolation-filters%3D%22sRGB%22%3E%3CfeFlood%20flood-opacity%3D%220%22%20result%3D%22BackgroundImageFix%22%2F%3E%3CfeBlend%20mode%3D%22normal%22%20in%3D%22SourceGraphic%22%20in2%3D%22BackgroundImageFix%22%20result%3D%22shape%22%2F%3E%3CfeGaussianBlur%20stdDeviation%3D%226.72123%22%20result%3D%22effect1_foregroundBlur_5110_14771%22%2F%3E%3C%2Ffilter%3E%3Cfilter%20id%3D%22filter1_f_5110_14771%22%20x%3D%229.46959%22%20y%3D%2219.7477%22%20width%3D%2247.7417%22%20height%3D%2247.741%22%20filterUnits%3D%22userSpaceOnUse%22%20color-interpolation-filters%3D%22sRGB%22%3E%3CfeFlood%20flood-opacity%3D%220%22%20result%3D%22BackgroundImageFix%22%2F%3E%3CfeBlend%20mode%3D%22normal%22%20in%3D%22SourceGraphic%22%20in2%3D%22BackgroundImageFix%22%20result%3D%22shape%22%2F%3E%3CfeGaussianBlur%20stdDeviation%3D%225.50019%22%20result%3D%22effect1_foregroundBlur_5110_14771%22%2F%3E%3C%2Ffilter%3E%3ClinearGradient%20id%3D%22paint0_linear_5110_14771%22%20x1%3D%2220%22%20y1%3D%220%22%20x2%3D%2220%22%20y2%3D%2240%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%236C4DFF%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23583ED3%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22paint1_linear_5110_14771%22%20x1%3D%2214.639%22%20y1%3D%2210.7917%22%20x2%3D%2232.1712%22%20y2%3D%2241.1585%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22white%22%20stop-opacity%3D%220.8%22%2F%3E%3Cstop%20offset%3D%220.437689%22%20stop-color%3D%22white%22%2F%3E%3C%2FlinearGradient%3E%3CclipPath%20id%3D%22clip0_5110_14771%22%3E%3Crect%20width%3D%2240%22%20height%3D%2240%22%20rx%3D%2220%22%20fill%3D%22white%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E",Id={codex:un("openai"),"claude-code":un("anthropic"),pi:vd,codebuddy:Ed};function jd(e){return Id[e]}const Oo=["codex","claude-code","pi","codebuddy"],We={codex:"Codex","claude-code":"Claude Code",pi:"Pi",codebuddy:"CodeBuddy"};function kd({client:e,className:t="h-4 w-4"}){const n=jd(e);return n?a.jsx("img",{src:n,alt:"","aria-hidden":"true",className:`${t} shrink-0 rounded-[3px] object-cover`}):a.jsx(Ri,{className:t,"aria-hidden":"true"})}function Pd(e,t,n){const r=n??"<粘贴 Xpod API Key>",o=t.trim().replace(/\/+$/,""),s=o.endsWith("/v1")?o:`${o}/v1`,i=o.replace(/\/v1$/,"");switch(e){case"codex":return["# ~/.codex/config.toml","# 将 model_provider 放在第一个配置节之前;已有同名顶层字段时替换",'model_provider = "xpod"',"","[model_providers.xpod]",'name = "Xpod AI Connection"',`base_url = ${JSON.stringify(s)}`,'wire_api = "responses"',"requires_openai_auth = false",`experimental_bearer_token = ${JSON.stringify(r)}`,"# 保留现有订阅登录,Xpod 单独使用此 provider 的 Key"].join(`
|
|
5
5
|
`);case"claude-code":return["# ~/.claude/settings.json(合并 env 到现有 JSON)",JSON.stringify({env:{ANTHROPIC_BASE_URL:i,ANTHROPIC_AUTH_TOKEN:r}},null,2)].join(`
|
|
6
6
|
`);case"pi":return["# ~/.pi/agent/settings.json(合并到现有 JSON,并将 <model-id> 替换为实际模型)",JSON.stringify({defaultProvider:"xpod",defaultModel:"<model-id>"},null,2),"","# ~/.pi/agent/models.json(合并 providers.xpod 到现有 JSON)",JSON.stringify({providers:{xpod:{baseUrl:s,apiKey:r,authHeader:!0,api:"openai-responses",models:[{id:"<model-id>",name:"<model-id>"}]}}},null,2)].join(`
|
|
7
7
|
`);case"codebuddy":return["# ~/.codebuddy/settings.json(合并 env 到现有 JSON)",JSON.stringify({env:{CODEBUDDY_BASE_URL:s,CODEBUDDY_API_KEY:r}},null,2)].join(`
|
|
8
|
-
`)}}function Dd({record:e,busy:t,onDestroy:n}){const r=e.name||"未命名 API Key",o=Fd(e),s=e.kind!=="client-credentials"||!!e.clientCredentialId;return a.jsxs("li",{"data-key-id":e.id,"data-key-binding":e.appliedTo?"bound":"unbound",className:"flex flex-wrap items-center gap-x-4 gap-y-2 border-b border-border/60 px-4 py-3 first:rounded-t-xl last:rounded-b-xl last:border-b-0",children:[a.jsxs("dl",{className:"flex min-w-0 flex-1 basis-64 flex-wrap items-center gap-x-6 gap-y-2",children:[a.jsx(Nn,{label:"用途",className:"min-w-0 flex-1 basis-28",children:a.jsx("span",{className:"block truncate text-sm font-medium text-foreground/90",title:r,children:r})}),a.jsx(Nn,{label:"绑定",className:"min-w-0 flex-1 basis-28",children:a.jsxs("span",{className:"flex min-w-0 items-center gap-1.5 text-xs text-muted-foreground",children:[o.clientId?a.jsx(kd,{client:o.clientId,className:"h-3.5 w-3.5"}):null,a.jsx("span",{className:"truncate",title:o.label,children:o.label})]})}),a.jsx(Nn,{label:"最后使用",className:"shrink-0",children:a.jsx("span",{className:"block text-xs text-muted-foreground",children:e.lastUsedAt?Ud(e.lastUsedAt):"暂无调用记录"})})]}),s?a.jsxs(V,{variant:"ghost",size:"sm",className:"h-8 shrink-0 gap-1.5 text-xs text-muted-foreground hover:text-destructive","aria-label":`销毁 ${r}`,title:`销毁 ${r}`,disabled:t,onClick:n,children:[a.jsx(ur,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"销毁"]}):a.jsx("span",{className:"shrink-0 text-[11px] text-muted-foreground",children:"缺少 CSS 凭据标识,无法在此销毁"})]})}function Fd(e){const t=e.appliedTo?.trim();if(!t)return{label:"未绑定"};const n=Oo.find(s=>s===t),r=n?We[n]:t,o=e.appliedOn?.trim();return{clientId:n,label:o?`${r} · ${o}`:r}}function Nn({label:e,className:t,children:n}){return a.jsxs("div",{className:t,children:[a.jsx("dt",{className:"text-[11px] leading-tight text-muted-foreground/80",children:e}),a.jsx("dd",{className:"mt-0.5",children:n})]})}function Ud(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}const Rn="我的 API Key",Bd="API Key 已创建,请复制或应用到客户端。",Sd="这个 API Key 只在创建时可见:请销毁它,然后重新创建并立即复制或应用。",Md="这个 API Key 只在创建时可见:请销毁它,然后重新创建并直接应用到客户端。",Nd=["flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm transition-[border-color]","disabled:cursor-not-allowed disabled:opacity-50",As].join(" ");function Rd({client:e,clientConfigurationBridge:t,gatewayModels:n}){const[r,o]=p.useState([]),[s,i]=p.useState(!0),[c,d]=p.useState(!1),[u,f]=p.useState(Rn),[h,A]=p.useState(""),[g,I]=p.useState(!1),[m,E]=p.useState(),[P,x]=p.useState(),[F,v]=p.useState(),[M,j]=p.useState(!1),[y,w]=p.useState(),[S,N]=p.useState(),[H,q]=p.useState(),B=p.useRef(new Map),$=p.useRef(!1),W=p.useRef(void 0),Z=p.useRef(void 0),le=p.useCallback(K=>{W.current&&Br(W.current),W.current=Ue(K)},[]),de=p.useCallback(K=>{le({variant:"destructive",description:Pt(K),duration:8e3})},[le]);p.useEffect(()=>{let K=!0;return i(!0),q(void 0),B.current.clear(),e.listGatewayKeys().then(L=>{K&&o(L.filter(se=>!se.revokedAt))}).catch(L=>{K&&de(L)}).finally(()=>{K&&i(!1)}),()=>{K=!1,clearTimeout(Z.current),W.current&&Br(W.current)}},[e,de]);const ae=()=>{q(void 0),f(Rn),A(""),w(void 0),d(!0)},re=()=>{E(void 0),x(void 0),v(void 0),w(void 0),q(void 0),f(Rn),A("")},R=async()=>{const K=u.trim();if(!K){q("请填写 API Key 名称。");return}if(!h){q("请选择 API Key 的用途。");return}I(!0),q(void 0);try{const L=await e.createGatewayKey({name:K,appliedTo:h});B.current.set(L.record.id,L.plaintext),o(se=>[L.record,...se.filter(ge=>ge.id!==L.record.id)]),E(L.record),x(h),v(void 0),w(void 0),le({variant:"success",description:Bd})}catch(L){q(Pt(L))}finally{I(!1)}},ee=(K,L)=>{const se=B.current.get(K.id);if(!se)throw new Error(L);return se},G=async(K,L)=>{q(void 0);try{const se=ee(K,Sd);if(!navigator.clipboard?.writeText)throw new Error("当前浏览器无法访问剪贴板,请允许剪贴板访问后重试。");await navigator.clipboard.writeText(L==="key"?se:Pd(L,e.apiBase,se)),w(L),clearTimeout(Z.current),Z.current=setTimeout(()=>w(void 0),2e3)}catch(se){q(Pt(se))}},fe=async()=>{if(!m||!P||!t)return;q(void 0);let K;try{K=ee(m,Md)}catch(L){q(Pt(L));return}j(!0);try{const L=await t.plan({client:P,endpoint:e.apiBase,...P==="codex"&&n!==void 0?{activeModels:n.map(({id:se,provider:ge,displayName:Qe,availability:Pe,contextWindow:X,inputModalities:we,capabilities:Ae})=>({id:se,provider:ge,displayName:Qe,availability:Pe,contextWindow:X,inputModalities:we,capabilities:Ae}))}:{}});await t.apply({client:L.client,planId:L.planId,apiKey:K,...L.confirmation?.required?{confirmation:{token:L.confirmation.token,targetHash:L.confirmation.targetHash}}:{}}),v(L.client),o(se=>se.map(ge=>ge.id===m.id?{...ge,appliedTo:L.client}:ge)),le({variant:"success",description:L.client==="codex"&&n===void 0?"Codex 连接配置已应用,模型目录尚未加载,请稍后刷新配置。":`${We[L.client]} 配置已应用。`})}catch(L){q(Pt(L))}finally{j(!1)}},oe=async K=>{if(!$.current){$.current=!0,N(K.id),q(void 0);try{await e.deleteGatewayKey(K.id),B.current.delete(K.id),o(L=>L.filter(se=>se.id!==K.id)),m?.id===K.id&&(E(void 0),x(void 0),v(void 0),w(void 0))}catch(L){de(L)}finally{$.current=!1,N(void 0)}}};return a.jsxs("section",{className:"space-y-8 [container-type:inline-size]","aria-label":"API Keys",children:[a.jsxs("header",{className:"flex items-start justify-between gap-4",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(gn,{className:"h-9 w-9 shrink-0 rounded-lg border border-border/50 bg-muted/50 shadow-sm",children:a.jsx(An,{className:"rounded-lg bg-transparent text-sm font-bold uppercase text-muted-foreground",children:"XP"})}),a.jsxs("div",{className:"flex flex-col justify-center gap-1",children:[a.jsx("h2",{className:"text-base font-semibold leading-none tracking-tight text-foreground",children:"Xpod"}),a.jsx("p",{className:"max-w-3xl text-xs leading-snug text-muted-foreground",children:"API Key 用于让客户端把 Xpod 当作 Provider 接入;Xpod 不保存 Key 明文。"})]})]}),a.jsx(on,{variant:r.length>0?"default":"secondary",children:r.length>0?`已签发 ${r.length} 个`:"未配置"})]}),a.jsxs("section",{className:"space-y-3","aria-label":"已签发 API Key",children:[a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[a.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[a.jsx(Jn,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"已签发 API Key"]}),a.jsxs(V,{size:"sm","aria-label":"新建 API Key",disabled:g||s,onClick:ae,children:[a.jsx(vt,{"aria-hidden":"true",className:"mr-2 h-4 w-4"}),"新建 API Key"]})]}),s?a.jsxs("div",{className:"flex items-center gap-2 py-6 text-sm text-muted-foreground",children:[a.jsx(Le,{"aria-hidden":"true",className:"h-4 w-4 animate-spin"}),"正在读取 API Key"]}):r.length===0?a.jsx("p",{className:"py-8 text-center text-sm text-muted-foreground",children:"尚未签发 API Key。"}):a.jsx("ul",{"aria-label":"API Key 列表",className:"rounded-xl border border-border/70",children:r.map(K=>a.jsx(Dd,{record:K,busy:!!S,onDestroy:()=>{oe(K)}},K.id))})]}),a.jsx(Tt,{open:c,onOpenChange:K=>{!K&&(g||M)||d(K)},children:a.jsxs(Et,{className:"sm:max-w-md","aria-describedby":void 0,children:[a.jsx(Lt,{children:a.jsx(It,{children:m?"API Key 已签发":"新建 API Key"})}),m&&P?a.jsxs("div",{className:"space-y-5",children:[a.jsxs("div",{className:"space-y-1.5",children:[a.jsxs("p",{className:"text-sm",children:["已签发「",m.name||"未命名 API Key","」,用途:",We[P],"。"]}),a.jsx("p",{className:"text-xs text-muted-foreground",children:"Xpod 不保存 Key 明文,请立即复制或直接应用到客户端;离开本次会话后无法再次获取。"})]}),m.maskedHint?a.jsx("code",{className:"block truncate rounded-md border border-border/60 bg-muted/30 px-3 py-2 font-mono text-xs text-muted-foreground",children:m.maskedHint}):null,t?null:a.jsx("p",{className:"text-xs text-muted-foreground",children:"当前 Web 环境无法自动写入客户端配置,请复制后手动粘贴;自动应用需要本机连接。"}),H?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:H}):null,a.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[a.jsxs(V,{type:"button",variant:"outline",size:"sm","aria-label":"复制 API Key",disabled:M,onClick:()=>{G(m,"key")},children:[y==="key"?a.jsx(st,{"aria-hidden":"true",className:"mr-1.5 h-3.5 w-3.5 text-emerald-600"}):a.jsx(zn,{"aria-hidden":"true",className:"mr-1.5 h-3.5 w-3.5"}),y==="key"?"已复制":"复制 API Key"]}),a.jsxs(V,{type:"button",variant:"outline",size:"sm",disabled:M,"aria-label":`复制 ${We[P]} 配置`,onClick:()=>{G(m,P)},children:[y===P?a.jsx(st,{"aria-hidden":"true",className:"mr-1.5 h-3.5 w-3.5 text-emerald-600"}):a.jsx(zn,{"aria-hidden":"true",className:"mr-1.5 h-3.5 w-3.5"}),y===P?"已复制":`复制 ${We[P]} 配置`]}),t?F?a.jsxs("span",{role:"status",className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[a.jsx(st,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"已应用到 ",We[F]]}):a.jsxs(V,{type:"button",size:"sm",disabled:M,"aria-label":`应用到 ${We[P]}`,onClick:()=>{fe()},children:[M?a.jsx(Le,{"aria-hidden":"true",className:"mr-2 h-4 w-4 animate-spin"}):null,M?"正在应用…":`应用到 ${We[P]}`]}):null]}),a.jsxs(Mt,{children:[a.jsx(V,{type:"button",variant:"ghost",disabled:M,onClick:re,children:"再建一个"}),a.jsx(V,{type:"button",variant:"outline",onClick:()=>d(!1),children:"完成"})]})]}):a.jsxs("form",{className:"space-y-5",onSubmit:K=>{K.preventDefault(),g||R()},children:[a.jsxs("label",{className:"block space-y-2",children:[a.jsx("span",{className:"text-sm font-medium",children:"名称"}),a.jsx(je,{autoFocus:!0,"aria-label":"API Key 名称",value:u,disabled:g,onChange:K=>f(K.target.value)})]}),a.jsxs("label",{className:"block space-y-2",children:[a.jsx("span",{className:"text-sm font-medium",children:"用途"}),a.jsxs("select",{"aria-label":"API Key 用途",className:Nd,value:h,disabled:g,onChange:K=>A(K.target.value),children:[a.jsx("option",{value:"",disabled:!0,children:"选择客户端应用"}),Oo.map(K=>a.jsx("option",{value:K,children:We[K]},K))]})]}),a.jsx("p",{className:"text-xs text-muted-foreground",children:"用途在创建时确定,Key 会绑定到该客户端应用。"}),H?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:H}):null,a.jsxs(Mt,{children:[a.jsx(V,{type:"button",variant:"outline",disabled:g,onClick:()=>d(!1),children:"取消"}),a.jsxs(V,{type:"submit","aria-label":"创建 API Key",disabled:g||!u.trim()||!h,children:[g?a.jsx(Le,{"aria-hidden":"true",className:"mr-2 h-4 w-4 animate-spin"}):null,g?"正在创建…":"创建 API Key"]})]})]})]})})]})}function Pt(e){const t=e instanceof Error?e.message.trim():"";return/failed to fetch|networkerror|load failed/i.test(t)?"无法连接配置服务,请检查连接后重试。":/EACCES|permission denied/i.test(t)?"没有权限写入配置文件,请检查文件权限后重试。":t==="Client configuration could not be verified locally."?"配置文件写入后的本地检查未通过,请检查文件内容和权限后重试。":!t||/^(?:AI Connection |AI client configuration )?request failed(?:\. Please try again\.)?$/i.test(t)?"API Key 操作失败,请重试。":t}const Od={};function Kd({client:e,renderToaster:t=!0,openExternal:n=Vd,clientConfigurationBridge:r,selectedSection:o="provider",selectedProvider:s,selectedCredentialId:i,providerSummaries:c=Od,providerProducts:d={},providerLoadError:u,providerLoading:f=!1,onProviderStateChange:h,onModelSelectionChange:A}){const[g,I]=p.useState({}),[m,E]=p.useState([]),[P,x]=p.useState(),[F,v]=p.useState(0),[M,j]=p.useState({}),[y,w]=p.useState({}),[S,N]=p.useState({}),[H,q]=p.useState({}),[B,$]=p.useState({}),[W,Z]=p.useState({}),[le,de]=p.useState({}),[ae,re]=p.useState({}),[R,ee]=p.useState({}),[G,fe]=p.useState({}),[oe,K]=p.useState(),[L,se]=p.useState(),[ge,Qe]=p.useState(!1),[Pe,X]=p.useState({}),we=p.useRef(0),Ae=p.useRef({}),pe={...d,...Pe},ue=p.useCallback((l,b)=>{I(k=>({...k,[l]:b})),h?.(l,Qd(b))},[h]);p.useEffect(()=>{I(Object.fromEntries(Object.values(c).filter(ea).map(l=>[l.provider,l.status==="connected"&&l.authMode==="browserAssistedApiKey"?"configured":l.status]))),Z(Object.fromEntries(Object.values(c).filter(ea).map(l=>[l.provider,l.baseUrl??""])))},[c]),p.useEffect(()=>{j(l=>{const b={...l};let k=!1;for(const[U,C]of Object.entries(d)){if(!C)continue;const O=C.selectedModels.map(nt),J=l[U];(!J||J.join("\0")!==O.join("\0"))&&(b[U]=O,k=!0)}return k?b:l})},[d]),p.useEffect(()=>{let l=!0;return e.listModels().then(b=>{l&&E(b)}).catch(()=>{}),()=>{l=!1,we.current+=1}},[e]),p.useEffect(()=>{let l=!0;return x(void 0),e.listGatewayModels?.().then(b=>{l&&x(b)}).catch(()=>{}),()=>{l=!1}},[e,F]);const te=(l,b)=>{de(k=>({...k,[l]:b}))},z=(l,b,k,U)=>{re(C=>({...C,[l]:b?{message:b,offeringId:k,authorization:U}:void 0}))},_=p.useCallback(async l=>{const b=l.verificationUriComplete??l.authorizationUrl??l.verificationUri;b&&await n(b)},[n]),Ge=async l=>{te(l,!0),z(l),q(b=>({...b,[l]:void 0}));try{const b=await e.beginConnect(l,"browserAssistedApiKey");N(U=>({...U,[l]:b}));const k=rr(b.status);if(ue(l,k?"pending":b.status==="completed"?"configured":"failed"),!k&&b.status!=="completed"){z(l,b.message??Yr(b.status));return}await _(b)}catch(b){ue(l,"failed"),z(l,xe(b))}finally{te(l,!1)}},qe=async l=>{if(l.browserMode!=="connectUnsupported"){if(l.browserMode==="browserAssistedApiKey"){await Ge(l.id);return}await Q(l.id,l.browserMode)}},Dn=async(l,b,k,U)=>{if(k==="browserAssistedApiKey"){await Ge(l);return}await Q(l,k,b.id,U?.id)},Q=async(l,b,k,U)=>{if(b==="connectUnsupported")return;te(l,!0),z(l),q(O=>({...O,[l]:k}));const C=we.current+1;we.current=C;try{const O=await e.beginConnect(l,b,{offeringId:k,authorizationMethodId:U});if(N(J=>({...J,[l]:O})),!rr(O.status)){const J=O.status==="completed";J?await ye(l):ue(l,"failed"),J||z(l,O.status==="unsupported"?"当前部署未启用账号授权":O.message??Yr(O.status),k,{mode:b,authorizationMethodId:U}),te(l,!1);return}ue(l,"pending"),await _(O),Ld(e,l,O,C,we,{onAttempt:J=>N(ne=>({...ne,[l]:J})),onConnected:()=>ye(l),onFailed:J=>{ue(l,"failed"),z(l,J,k,{mode:b,authorizationMethodId:U})},onFinished:()=>te(l,!1)})}catch(O){ue(l,"failed"),z(l,xe(O),k,{mode:b,authorizationMethodId:U}),te(l,!1)}},ye=async l=>{ue(l,"connected");try{const b=(await e.listProviders()).find(k=>k.id===l);b&&X(k=>({...k,[l]:b}))}catch(b){z(l,`账号已连接,连接信息刷新失败:${xe(b)}`)}},Ne=async(l,b)=>{we.current+=1,te(l,!1),N(k=>({...k,[l]:void 0})),q(k=>({...k,[l]:void 0})),ue(l,"failed");try{await e.cancelConnect?.(l,b),z(l,"连接已取消")}catch(k){z(l,xe(k))}},He=async l=>{const b=B[l.id]?.trim(),k=W[l.id]??c[l.id]?.baseUrl??"",U=S[l.id];if(!(!b||!U)){te(l.id,!0),z(l.id);try{const C=await e.completeApiKey(l.id,U,b,void 0,k.trim());N(O=>({...O,[l.id]:C})),$(O=>({...O,[l.id]:""})),ue(l.id,"configured"),Ue({description:"API Key 已保存"})}catch(C){z(l.id,xe(C)),ue(l.id,"failed")}finally{te(l.id,!1)}}},et=async(l,b)=>{const k=b?pe[l]?.credentials.find(U=>U.id===b)?.offeringId:void 0;te(l,!0),z(l);try{await e.disconnect(l,b),N(U=>({...U,[l]:void 0})),q(U=>({...U,[l]:void 0})),ee(U=>({...U,[l]:k?{...U[l],[k]:void 0}:void 0})),b?(X(U=>({...U,[l]:Zr(pe[l],l,b)})),Ue({description:"已从当前 Pod 移除账号"})):(ue(l,"disconnected"),Ue({description:"已断开连接"}))}catch(U){z(l,xe(U),k)}finally{te(l,!1)}},jt=(l,b)=>{X(k=>({...k,[l]:Wr(pe[l],l,b)})),ue(l,b.authMode==="apiKey"||b.authMode==="local"?"configured":"connected")},Ye=async(l,b,k=!1,U="")=>{fe(C=>({...C,[l]:!0})),z(l);try{const C=b?await e.discoverModels(l,b):await e.discoverModels(l);v(ne=>ne+1);const O=pe[l]?.selectedModels??[],J={...Jd(l,b),...C.complete===!1?{markMissing:!1}:{}};try{const De=(await e.listModels()).filter(Fe=>Fe.provider===l);E(Fe=>{const Wt=On(Fe,l,De,J),cs=On(Wt,l,C.models,J);return $r(cs,l,O,C.models,J)})}catch{E(ne=>$r(On(ne,l,C.models,J),l,O,C.models,J))}try{const De=(await e.listProviders()).find(Fe=>Fe.id===l);De&&X(Fe=>({...Fe,[l]:De}))}catch{}return C.complete===!1?z(l,"部分连接同步失败,已保留原有模型目录,可稍后重试。",b?.offeringId):k&&Ue({variant:C.models.length>0?"success":"default",description:C.models.length>0?`连接成功,已同步 ${C.models.length} 个模型`:"连接成功,但服务商未返回任何模型。请确认该服务支持 /models 接口,或使用「添加模型」手工录入。"}),!0}catch(C){const O=xe(C);return z(l,`${U}${O}`,b?.offeringId),!1}finally{fe(C=>({...C,[l]:!1}))}},Yo=async(l,b,k)=>{te(l,!0),z(l);try{const U=await e.createApiKeyCredential(l,{offeringId:b.id,apiKey:k.apiKey,label:k.label,baseUrl:k.baseUrl,proxyUrl:k.proxyUrl,priority:k.priority});jt(l,U),Ue({description:"API Key 已添加"}),await Ye(l,{offeringId:U.offeringId,credentialId:U.id})}catch(U){const C=xe(U);throw z(l,C,b.id),new Error(C)}finally{te(l,!1)}},Wo=async(l,b,k)=>{te(l,!0),z(l);try{const U=b.kind==="local",C=await e.createLocalCredential(l,{offeringId:b.id,authorizationMethodId:k?.id,label:b.label??Ce(b),...U?{baseUrl:b.endpoints?.[0]?.baseUrl}:{},priority:10});jt(l,C),Ue({description:`${Ce(b)} 已连接`}),b.modelDiscovery?.strategy!=="unsupported"&&await Ye(l,{offeringId:C.offeringId,credentialId:C.id},!1,U?"本地服务已连接,模型获取失败:":"订阅已读取,模型获取失败:")}catch(U){const C=xe(U);throw z(l,C,b.id),new Error(C)}finally{te(l,!1)}},Zo=async(l,b,k)=>{te(l,!0),z(l);try{const U=await e.updateProviderCredential(l,b.id,{expectedVersion:b.version,...k});jt(l,U),Ue({description:"凭证已更新"}),U.enabled&&await Ye(l,{offeringId:U.offeringId,credentialId:U.id})}catch(U){const C=xe(U);throw z(l,C,b.offeringId),new Error(C)}finally{te(l,!1)}},_o=async(l,b)=>{if(b.id===`${l}:current`&&b.version===0){if(pe[l]?.credentials.some(k=>k.id!==b.id)){z(l,"请重新加载连接后再移除旧连接。",b.offeringId);return}await et(l);return}te(l,!0),z(l);try{await e.deleteProviderCredential(l,b.id);const k=Zr(pe[l],l,b.id);X(U=>({...U,[l]:k})),ue(l,Ko(k)),Ue({description:"凭证已删除"})}catch(k){z(l,xe(k),b.offeringId)}finally{te(l,!1)}},$o=async(l,b)=>{te(l,!0),z(l);try{const k=await e.testProviderCredential(l,{credentialId:b.id}),U=qd(k);X(C=>({...C,[l]:U?Wr(pe[l],l,U):_r(pe[l],l,b.id,"healthy")})),Ue({variant:"success",description:"测试通过"})}catch(k){const U=(await e.listProviders().catch(()=>[])).find(C=>C.id===l);X(C=>({...C,[l]:U??_r(pe[l],l,b.id,"invalid")})),z(l,xe(k),b.offeringId)}finally{te(l,!1)}},es=async(l,b,k,U,C)=>{if(C<0||C>=k.length)return;const O=[...k],[J]=O.splice(U,1);if(J){O.splice(C,0,J),te(l,!0),z(l);try{const ne=[];for(const[De,Fe]of O.entries()){const Wt=(De+1)*10;if(Fe.priority===Wt){ne.push(Fe);continue}ne.push(await e.updateProviderCredential(l,Fe.id,{expectedVersion:Fe.version,priority:Wt}))}X(De=>({...De,[l]:Hd(pe[l],l,b,ne)})),Ue({description:"顺序已保存"})}catch(ne){z(l,xe(ne),b.id)}finally{te(l,!1)}}},Fn=p.useRef(new Set),ts=async(l,b,k)=>{const U=k?[k]:(pe[l]?.credentials??[]).filter(C=>C.enabled&&C.offeringId===b.id);await Promise.all(U.map(async C=>{const O=`${l}\0${C.id}`;if(Fn.current.has(O))return;Fn.current.add(O);const J=ne=>{ee(De=>({...De,[l]:{...De[l],[C.id]:ne}}))};J({busy:!0,credentialId:C.id});try{const ne=await e.quota(l,!0,{offeringId:b.id,credentialId:C.id,credentialIri:C.id});J({quota:ne,busy:!1,credentialId:C.id})}catch(ne){J({busy:!1,error:xe(ne),credentialId:C.id})}finally{Fn.current.delete(O)}}))},ns=async l=>{await Ye(l,l==="custom"&&i?{credentialId:i}:void 0,!0)},Pr=p.useCallback(async()=>{v(l=>l+1);try{E(await e.listModels())}catch{}},[e]),Dr=(l,b)=>{se(void 0),K({provider:l,model:b})},rs=async l=>{if(!oe)return;const b=!!oe.model;Qe(!0),se(void 0);try{await e.saveProviderModel(oe.provider,{id:l.id,displayName:l.name||void 0,inputModalities:l.inputModalities.length>0?l.inputModalities:void 0,capabilities:l.capabilities.length>0?l.capabilities:void 0}),K(void 0),Ue({description:b?"模型已更新":"模型已添加"}),await Pr()}catch(k){se(xe(k))}finally{Qe(!1)}},as=async(l,b)=>{z(l);try{await e.deleteProviderModel(l,b.id),E(k=>k.filter(U=>!(U.provider===l&&U.id===b.id))),Ue({description:"模型已移除"}),Pr()}catch(k){z(l,xe(k))}},os=p.useCallback((l,b)=>{const k=[...new Set(b)],U=M[l]??pe[l]?.selectedModels.map(nt)??[],C=(Ae.current[l]??0)+1;Ae.current[l]=C,j(O=>({...O,[l]:k})),w(O=>({...O,[l]:"saving"})),(async()=>{try{const O=[...m.filter(ne=>ne.provider===l),...pe[l]?.selectedModels??[]],J=k.map(ne=>{const De=O.find(Fe=>nt(Fe)===ne);return De?Xd(De):{id:ne}});l==="custom"?await e.saveModelSelection?.(l,J,i):await e.saveModelSelection?.(l,J),Ae.current[l]===C&&(v(ne=>ne+1),w(ne=>({...ne,[l]:"saved"})),A?.(l,k))}catch(O){if(Ae.current[l]!==C)return;w(J=>({...J,[l]:"error"})),j(J=>({...J,[l]:U})),A?.(l,U),Ue({variant:"destructive",description:xe(O)})}})()},[e,pe,Ae,m,A,i,M]),ss=a.jsxs("section",{children:[u?a.jsxs("p",{className:"mb-4 rounded-md border border-destructive/30 px-3 py-2 text-sm text-destructive",children:["Provider 状态读取失败:",u]}):null,Ie.filter(l=>l.id===(s??"openai")).map(l=>{const b=pe[l.id],k=Gd(m.filter(C=>C.provider===l.id&&(l.id!=="custom"||!i||C.credentialId===i)),b?.selectedModels??[]),U=M[l.id]??b?.selectedModels.map(nt)??[];return a.jsx(md,{definition:l,product:b,status:Td(g[l.id],b),accountLabel:c[l.id]?.accountLabel,attempt:S[l.id],attemptOfferingId:H[l.id],apiKey:B[l.id]??"",baseUrl:W[l.id]??c[l.id]?.baseUrl??"",busy:!!(le[l.id]||G[l.id]),disabled:f,error:ae[l.id],quotas:R[l.id],models:k,selectedModelIds:U,modelSelectionStatus:y[l.id],onApiKeyChange:C=>$(O=>({...O,[l.id]:C})),onBaseUrlChange:C=>Z(O=>({...O,[l.id]:C})),onBeginApiKey:()=>{Ge(l.id)},onBeginOffering:(C,O,J)=>{Dn(l.id,C,O,J)},onCancelConnect:C=>{Ne(l.id,C)},onBeginBrowser:()=>{qe(l)},onSaveApiKey:()=>{He(l)},onDisconnect:C=>{et(l.id,C?.id)},onCreateApiKeyCredential:(C,O)=>Yo(l.id,C,O),onCreateLocalCredential:(C,O)=>Wo(l.id,C,O),onUpdateCredential:(C,O)=>Zo(l.id,C,O),onDeleteCredential:C=>{_o(l.id,C)},onTestCredential:C=>{$o(l.id,C)},onReorderCredentials:(C,O,J,ne)=>{es(l.id,C,O,J,ne)},onRefreshQuota:(C,O)=>{ts(l.id,C,O)},verifyPending:!!G[l.id],onVerify:()=>{ns(l.id)},onAddModel:()=>Dr(l.id),onEditModel:C=>Dr(l.id,C),onDeleteModel:C=>{as(l.id,C)},onModelSelectionChange:os,onDismissError:()=>z(l.id)},l.id)})]}),is=a.jsx(Rd,{client:e,clientConfigurationBridge:r,gatewayModels:P});return a.jsxs("div",{"data-testid":"ai-connections-panel",className:"mx-auto w-full max-w-5xl space-y-10 px-4 py-6 sm:px-8 sm:py-8",children:[t?a.jsx(ys,{}):null,o==="keys"?is:null,o==="provider"?ss:null,o==="provider"&&oe?a.jsx(Cd,{open:!0,providerName:Ie.find(l=>l.id===oe.provider)?.name??oe.provider,initialValue:oe.model?{id:oe.model.id,name:oe.model.displayName??"",inputModalities:oe.model.inputModalities??[],capabilities:oe.model.capabilities??[]}:void 0,error:L,saving:ge,onOpenChange:l=>{l||K(void 0)},onSave:l=>{rs(l)}}):null]})}function Ko(e){if(!e||e.status==="unconfigured"||e.status==="unavailable")return"disconnected";if(e.status==="configured")return"configured";if(e.status==="attention")return"reauthRequired";const t=e.credentials.find(n=>n.enabled)??e.credentials[0];return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}function Td(e,t){return e==="pending"||e==="failed"?e:t?Ko(t):e??"unknown"}async function Ld(e,t,n,r,o,s){let i=n;try{for(;o.current===r&&rr(i.status);){if(await zd(Math.max(1,i.intervalSeconds??2)*1e3),o.current!==r)return;i={...i,...await e.pollDevice(t,i)},s.onAttempt(i)}i.status==="completed"?await s.onConnected():o.current===r&&s.onFailed(i.message||`连接${i.status==="expired"?"已过期":"失败"}`)}catch(c){o.current===r&&s.onFailed(xe(c))}finally{o.current===r&&s.onFinished()}}function rr(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"}function Yr(e){return e==="expired"?"连接已过期,请重新开始":e==="cancelled"?"连接已取消":e==="unsupported"?"当前 Provider 不支持此连接方式":"连接失败"}function Qd(e){return e==="configured"?"configured":e==="connected"?"connected":e==="failed"||e==="reauthRequired"?"attention":e==="pending"?"loading":"unconfigured"}function Wr(e,t,n){const r=e??Pn(t),o=To([...r.credentials.filter(s=>s.id!==n.id),n]);return{...r,credentials:o,status:Er(o)}}function Zr(e,t,n){const r=e??Pn(t),o=r.credentials.filter(s=>s.id!==n);return{...r,credentials:o,status:Er(o)}}function _r(e,t,n,r){const o=e??Pn(t),s=o.credentials.map(i=>i.id===n?{...i,health:r}:i);return{...o,credentials:s,status:s.some(i=>i.enabled&&i.health==="invalid")?"attention":Er(s)}}function qd(e){const t=e.credential;if(!t||typeof t!="object")return;const n=t;return typeof n.id=="string"&&typeof n.offeringId=="string"&&(n.authMode==="oauth"||n.authMode==="deviceCode"||n.authMode==="apiKey"||n.authMode==="local")&&typeof n.version=="number"?n:void 0}function Er(e){if(e.length===0)return"unconfigured";const t=e.filter(n=>n.enabled);return t.length===0?"configured":t.some(n=>n.health==="expired"||n.health==="invalid")?"attention":"available"}function Hd(e,t,n,r){const o=e??Pn(t),s=new Set(r.map(i=>i.id));return{...o,offerings:o.offerings.some(i=>i.id===n.id)?o.offerings:[...o.offerings,n],credentials:To([...o.credentials.filter(i=>!s.has(i.id)),...r])}}function Pn(e){return{id:e,name:Ie.find(t=>t.id===e)?.name??e,offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function To(e){return[...e].sort((t,n)=>t.priority-n.priority)}function Vd(e){window.open(e,"_blank","noopener,noreferrer")}function zd(e){return new Promise(t=>window.setTimeout(t,e))}function xe(e){const t=va(e);return t==="AI Connection request failed. Please try again."?"请求未完成。请确认 Xpod 正在运行且登录仍有效,然后重试。":t}function Jd(e,t){return e==="custom"?t?.credentialId?{markMissing:!0,credentialId:t.credentialId}:{markMissing:!t}:t?.offeringId?{markMissing:!0,offeringId:t.offeringId}:{markMissing:!t}}function On(e,t,n,r={markMissing:!1}){const o=new Set(n.map(i=>i.id)),s=e.map(i=>r.markMissing&&i.provider===t&&!i.custom&&!o.has(i.id)&&(r.offeringId===void 0||i.offeringId===r.offeringId)&&(r.credentialId===void 0||i.credentialId===r.credentialId)?xt({...i,availability:"unavailable"}):i);for(const i of n){const c=i,d="provider"in i,u=c.offeringId??(d?void 0:r.offeringId),f=c.credentialId??(d?void 0:r.credentialId),h=s.findIndex(A=>A.provider!==t?!1:c.resourceId&&A.resourceId?c.resourceId===A.resourceId:f!==void 0?A.id===c.id&&A.credentialId===f:u!==void 0?A.id===c.id&&A.offeringId===u:A.id===c.id&&A.offeringId===void 0);h===-1?s.push(xt({...c,id:c.id,provider:t,availability:c.availability??"available",...u?{offeringId:u}:{},...f?{credentialId:f}:{}})):s[h]=xt({...s[h],...c,provider:t,displayName:c.displayName??s[h].displayName,availability:c.availability??"available",...u?{offeringId:u}:{},...f?{credentialId:f}:{}})}return s}function $r(e,t,n,r,o){if(!o.markMissing||n.length===0)return e;const s=new Set(r.map(c=>c.id)),i=[...e];for(const c of n.filter(d=>d.provider===t)){if(c.custom||o.offeringId!==void 0&&c.offeringId!==o.offeringId||o.credentialId!==void 0&&c.credentialId!==o.credentialId||s.has(c.id))continue;const d=nt(c),u=i.findIndex(h=>h.provider===t&&nt(h)===d),f=xt({...c,availability:"unavailable"});u===-1?i.push(f):i[u]=xt({...i[u],...f,displayName:i[u].displayName??f.displayName})}return i}function Gd(e,t){const n=[...e];for(const r of t){const o=n.findIndex(s=>nt(s)===nt(r));if(o===-1){n.push(r);continue}n[o]=xt({...n[o],...r,displayName:n[o].displayName??r.displayName,availability:n[o].availability==="unavailable"?"unavailable":r.availability})}return n}function xt(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function nt(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function Xd(e){return{id:e.id,...e.offeringId?{offeringId:e.offeringId}:{},...e.resourceId?{resourceId:e.resourceId}:{}}}function ea(e){return e!==void 0}function Lo({controller:e,renderToaster:t=!0}){const n=wr(e),r=Cr(e),o=Po(e),s=Rl(e),i=vr(e),c=Fo(e),d=Ie.find(I=>I.id===r),u=r==="custom"?i.custom?.credentials.find(I=>I.id===o):void 0,f=br.find(I=>I.id===n)?.title,h=u?.label??i[r]?.name??d?.name??r,A=f??`${h} 详情`,g=r==="custom"&&o&&i.custom?{...i,custom:{...i.custom,name:h,offerings:Yd(i.custom,u),credentials:i.custom.credentials.filter(I=>I.id===o),selectedModels:i.custom.selectedModels.filter(I=>I.credentialId===o)}}:i;return p.useEffect(()=>(e.client&&e.loadProviders(),()=>e.cancelProviderLoads()),[e]),e.client?a.jsx("section",{role:"region","aria-label":A,children:a.jsx(Kd,{client:e.client,renderToaster:t,clientConfigurationBridge:e.clientConfigurationBridge,selectedSection:n,selectedProvider:r,selectedCredentialId:o,openExternal:e.openExternal,providerSummaries:s,providerProducts:g,providerLoadError:c,providerLoading:!i[r]&&!c,onProviderStateChange:e.setProviderState})}):a.jsxs("section",{role:"alert","aria-label":"AI Connections unavailable",children:[a.jsx("h2",{children:"AI Connections 尚未就绪"}),a.jsx("p",{children:"宿主需要先提供已登录的 WebID 和可用的 Pod。"})]})}function Yd(e,t){if(!t)return e.offerings;const n=t.compatibility??(t.offeringId==="anthropic-compatible"?"anthropic":"openai"),r=e.offerings.find(o=>o.id===t.offeringId)??e.offerings[0];return r?[{...r,id:t.offeringId,label:n==="auto"?"自动探测":n==="anthropic"?"Anthropic 兼容":"OpenAI 兼容",endpoints:t.baseUrl?[{protocol:n==="anthropic"?"anthropic":"chatCompletions",baseUrl:t.baseUrl}]:r.endpoints,modelDiscovery:n==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:n==="auto"?{strategy:"auto",path:"/models",endpointProtocol:"auto"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}}]:[]}function Wd({open:e,saving:t=!1,error:n,onOpenChange:r,onSave:o}){const[s,i]=p.useState(""),[c,d]=p.useState("auto"),[u,f]=p.useState(""),[h,A]=p.useState(""),[g,I]=p.useState(""),[m,E]=p.useState();p.useEffect(()=>{e&&(i(""),d("auto"),f(""),A(""),I(""),E(void 0))},[e]);const P=()=>{E(void 0);let x;try{x=Zd(u)}catch{E("Base URL 必须是有效的 http(s) 地址。");return}const F=s.trim(),v=h.trim();if(!F){E("请输入 Provider 名称。");return}if(!v){E("请输入 API Key。");return}o({offeringId:_d(c),apiKey:v,label:F,baseUrl:x,priority:10,compatibility:c,...g.trim()?{proxyUrl:g.trim()}:{}})};return a.jsx(Tt,{open:e,onOpenChange:r,children:a.jsxs(Et,{className:"max-w-md",style:{maxHeight:"calc(100vh - 2rem)",overflowY:"auto"},"aria-describedby":"ai-custom-provider-description",children:[a.jsx(Lt,{children:a.jsx(It,{children:"添加自定义 Provider"})}),a.jsx("p",{id:"ai-custom-provider-description",className:"text-sm text-muted-foreground",children:"用 OpenAI/Anthropic 兼容协议接入第三方模型服务。Xpod 会把真实 API Key 存进当前 Pod。"}),a.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-name",children:"Provider 名称"}),a.jsx(je,{id:"ai-custom-provider-name",value:s,disabled:t,placeholder:"例如 OpenRouter",onChange:x=>i(x.target.value)})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-compatibility",children:"兼容协议"}),a.jsxs("select",{id:"ai-custom-provider-compatibility",value:c,disabled:t,"aria-label":"兼容协议",className:"h-9 rounded-md border border-input bg-background px-3 text-sm",onChange:x=>d(x.target.value),children:[a.jsx("option",{value:"auto",children:"自动探测"}),a.jsx("option",{value:"openai",children:"OpenAI 兼容优先"}),a.jsx("option",{value:"anthropic",children:"Anthropic 兼容优先"})]})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-base-url",children:"Base URL"}),a.jsx(je,{id:"ai-custom-provider-base-url",value:u,disabled:t,placeholder:"https://openrouter.ai/api 或 https://openrouter.ai/api/v1",onChange:x=>f(x.target.value)}),a.jsx("p",{className:"text-xs text-muted-foreground",children:"裸域名会自动补齐为 /v1。"})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-api-key",children:"API Key"}),a.jsx(je,{id:"ai-custom-provider-api-key",type:"password",value:h,disabled:t,autoComplete:"new-password","data-lpignore":"true",onChange:x=>A(x.target.value)})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-proxy-url",children:"Proxy URL(可选)"}),a.jsx(je,{id:"ai-custom-provider-proxy-url",value:g,disabled:t,placeholder:"http://127.0.0.1:7890",onChange:x=>I(x.target.value)})]}),m||n?a.jsx("p",{className:"text-sm text-destructive",children:m??n}):null]}),a.jsxs(Mt,{children:[a.jsx(V,{type:"button",variant:"outline",disabled:t,onClick:()=>r(!1),children:"取消"}),a.jsx(V,{type:"button",disabled:t,onClick:P,children:"保存自定义 Provider"})]})]})})}function Zd(e){const t=e.trim(),n=new URL(t);if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error("invalid_custom_base_url");n.hash="";const r=n.pathname.replace(/\/+$/u,"");return!r||r===""?n.pathname="/v1":n.pathname=r,n.href.replace(/\/$/u,"")}function _d(e){return e==="anthropic"?"anthropic-compatible":"openai-compatible"}function $d({controller:e}){const t=Do(e),[n,r]=p.useState(!1),[o,s]=p.useState(!1),[i,c]=p.useState(),d=async u=>{if(!e.client){c("请先登录后再添加自定义 Provider。");return}s(!0),c(void 0);let f;try{const h=await e.client.createApiKeyCredential("custom",u);f=h.id,await e.client.discoverModels("custom",{offeringId:h.offeringId,credentialId:h.id,compatibility:u.compatibility}),e.selectProvider("custom",h.id),await e.loadProviders(),r(!1)}catch(h){f&&await e.client.deleteProviderCredential("custom",f).catch(()=>{}),c(h instanceof Error?h.message:"AI Connection request failed. Please try again.")}finally{s(!1)}};return a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"flex h-full min-w-0 items-center gap-2 px-3",children:[a.jsxs("div",{className:"relative min-w-0 flex-1",children:[a.jsx(La,{"aria-hidden":"true",className:"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),a.jsx(je,{type:"search","aria-label":"搜索 Provider",placeholder:"搜索 Provider",value:t,onChange:u=>e.setSearchQuery(u.target.value),className:"h-8 border-transparent bg-muted/50 pl-8 text-xs focus-visible:bg-background"})]}),a.jsx(V,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 shrink-0","aria-label":"添加 AI Connection",title:"添加 AI Connection",onClick:()=>r(!0),children:a.jsx(vt,{className:"h-4 w-4","aria-hidden":"true"})})]}),a.jsx(Wd,{open:n,saving:o,error:i,onOpenChange:r,onSave:u=>{d(u)}})]})}function eu({controller:e}){const t=wr(e),n=Cr(e),r=vr(e),o=Ie.find(i=>i.id===n),s=br.find(i=>i.id===t)?.title??r[n]?.name??o?.name??n;return a.jsx("div",{className:"flex h-full min-w-0 items-center px-4",children:a.jsx("h1",{className:"truncate text-sm font-medium text-foreground",children:s})})}const tu=["navigation.openExternal","aiClientConfiguration"];function nu(e){const t=Kn(e,"Extension manifest");ta(t.extensionId,"extensionId"),ht(t.name,"name"),ht(t.version,"version"),ht(t.sdkVersion,"sdkVersion");const n=Kn(t.contributes,"contributes");if(!Array.isArray(n.applets)||n.applets.length===0)throw new Error("Extension manifest must contribute at least one Applet");const r=new Set;for(const o of n.applets){const s=Kn(o,"Applet manifest"),i=ta(s.appId,"appId");if(r.has(i))throw new Error(`Extension manifest has duplicate appId: ${i}`);if(r.add(i),ht(s.name,"Applet name"),ht(s.entry,"Applet entry"),!Array.isArray(s.commands))throw new Error("Applet commands must be an array");if(s.layout!=="single-pane"&&s.layout!=="two-pane")throw new Error("Applet layout must be single-pane or two-pane")}if(!Array.isArray(t.dataModels))throw new Error("Extension dataModels must be an array");if(!Array.isArray(t.hostCapabilities))throw new Error("Extension hostCapabilities must be an array");for(const o of t.hostCapabilities)if(!tu.includes(o))throw new Error(`Extension manifest requested unknown Host capability: ${String(o)}`);return e}function Kn(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function ht(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string`);return e}function ta(e,t){const n=ht(e,t);let r;try{r=new URL(n)}catch{throw new Error(`${t} must be a valid HTTPS URL`)}if(r.protocol!=="https:")throw new Error(`${t} must be a valid HTTPS URL`);return n}const Qo=nu({extensionId:"https://undefineds.co/extensions/ai-connections",name:"AI Connection",version:"0.1.0",sdkVersion:"1",contributes:{applets:[{appId:"https://undefineds.co/applets/ai-connections",name:"AI Connection",entry:".",commands:[],layout:"two-pane"}]},dataModels:[],hostCapabilities:["navigation.openExternal","aiClientConfiguration"]}),Ir=Qo.contributes.applets[0],ar={manifest:Ir,createController:Bl,activate(e){e.loadProviders()},slots:{listHeader:$d,list:zl,mainHeader:eu,main:Lo}},na={manifest:Qo,applets:{[Ir.appId]:ar}};function ru(e={}){return e.renderToaster!==!1?na:{...na,applets:{[Ir.appId]:{...ar,slots:{...ar.slots,main:({controller:t})=>p.createElement(Lo,{controller:t,renderToaster:!1})}}}}}function au({collection:e,assertCurrent:t,accountIndex:n,fetch:r=window.fetch.bind(window)}){const o=async(...d)=>{t();const u=await r(...d);try{t()}catch(f){throw u.body?.cancel().catch(()=>{}),f}return u},s=new Set,i=async d=>{t();const u=await xs(d,o,n);if(t(),!u||!new URL(u).pathname.startsWith("/.account/"))throw new Error("客户端凭据地址不属于可信账号服务。");return u},c=(d,u,f)=>(t(),o(d,{method:u,credentials:"include",redirect:"error",headers:bs({Accept:"application/json",...f?{"Content-Type":"application/json"}:{}},n),...f?{body:JSON.stringify(f)}:{}}));return{async create({name:d,webId:u}){if(!d.trim()||!u)throw new Error("创建客户端凭据需要名称和当前 WebID。");const f=await c(await i(e),"POST",{name:d.trim(),webId:u});if(!f.ok)throw new Error(`创建客户端凭据失败(HTTP ${f.status})。`);const h=await f.json();if(t(),typeof h.id!="string"||!h.id||h.id.includes(":")||typeof h.secret!="string"||!h.secret||typeof h.resource!="string"||!h.resource)throw new Error("账号服务未返回有效的客户端凭据。");const A=await i(h.resource),g=new TextEncoder().encode(`${h.id}:${h.secret}`),I=btoa(Array.from(g,m=>String.fromCharCode(m)).join(""));return t(),{apiKey:`sk-${I}`,resource:A}},async list(){const d=await c(await i(e),"GET");if(!d.ok)throw new Error(`读取客户端凭据失败(HTTP ${d.status})。`);const u=await d.json();t();const f=Object.entries(u.clientCredentials??{}),h=await Promise.all(f.map(async([A,g])=>({clientId:A,label:A,resource:await i(String(g))})));return t(),h},async revoke({clientId:d,resource:u,webId:f}){const h=await i(u),A=JSON.stringify([h,d,f]),g=await c(h,"GET");if(g.status===404||g.status===410){if(s.has(A))return;throw new Error("无法确认客户端凭据已撤销,请检查当前 Account 登录;Key 记录已保留。")}if(!g.ok)throw new Error(`读取客户端凭据失败(HTTP ${g.status})。`);const I=await g.json();if(t(),I.id!==d||I.webId!==f)throw new Error("客户端凭据与当前 Key 或 WebID 不匹配,未执行删除。");const m=await c(h,"DELETE");if(!m.ok)throw new Error(`撤销客户端凭据失败(HTTP ${m.status})。`);s.add(A)}}}var ou=Qs(),su=qs();const iu=[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"]}],$t=[{id:"openai-compatible",label:"OpenAI Compatible",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],consoleUrl:"https://undefineds.co",subscriptionUrl:"https://undefineds.co",endpoints:[{protocol:"chatCompletions",baseUrl:"https://example.invalid/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"unsupported",url:"https://undefineds.co"}},{id:"anthropic-compatible",label:"Anthropic Compatible",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],consoleUrl:"https://undefineds.co",subscriptionUrl:"https://undefineds.co",endpoints:[{protocol:"anthropic",baseUrl:"https://example.invalid/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"unsupported",url:"https://undefineds.co"}}],Tn="https://www.kimi.com/code",cu="https://www.kimi.com/user/agreement",lu="https://api.kimi.com/coding/v1",du="https://api.kimi.com/coding/",uu="https://platform.moonshot.cn/console/api-keys",ra="https://platform.moonshot.cn/console/account",fu="https://platform.moonshot.cn/docs/intro",pu="https://api.moonshot.ai/v1",en="https://bailian.console.aliyun.com/",tn="https://help.aliyun.com/zh/model-studio/",aa="https://open.bigmodel.cn/usercenter/apikeys",oa="https://open.bigmodel.cn/",hu="https://open.bigmodel.cn/api/paas/v4",mu="https://open.bigmodel.cn/api/coding/paas/v4",gu={openai:[{id:"official-subscription",label:"OpenAI Subscription",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth","local"],productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:[],consoleUrl:"https://chatgpt.com/codex",subscriptionUrl:"https://chatgpt.com/codex",endpoints:[{protocol:"responses",baseUrl:"https://chatgpt.com/backend-api/codex"}],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"responses"},quota:{strategy:"subscription",url:"https://chatgpt.com/codex"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"},{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.openai.com/api-keys",subscriptionUrl:"https://platform.openai.com/settings/organization/billing/overview",endpoints:[{protocol:"responses",baseUrl:"https://api.openai.com/v1"},{protocol:"chatCompletions",baseUrl:"https://api.openai.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"responses"},quota:{strategy:"providerApi",url:"https://platform.openai.com/usage"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"}],anthropic:[{id:"official-subscription",label:"Claude Code Subscription",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth"],productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:[],consoleUrl:"https://claude.ai/",subscriptionUrl:"https://claude.ai/settings/billing",endpoints:[],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"subscription",url:"https://claude.ai/settings/usage"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"},{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:["sk-ant-"],consoleUrl:"https://console.anthropic.com/settings/keys",subscriptionUrl:"https://console.anthropic.com/settings/plans",endpoints:[{protocol:"anthropic",baseUrl:"https://api.anthropic.com/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"console",url:"https://console.anthropic.com/settings/limits"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"}],kimi:[sa({id:"subscription-key",label:"Token Plan",kind:"token-plan",authModes:["apiKey"],productLabel:"Kimi Coding",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-kimi-"],baseUrl:lu,anthropicBaseUrl:du,quotaStrategy:"subscription",quotaUrl:Tn,consoleUrl:Tn,subscriptionUrl:Tn,usagePolicyUrl:cu,supportsDeveloperMessages:!1}),sa({id:"api-platform",label:"API Platform",kind:"api-platform",authModes:["apiKey"],productLabel:"Moonshot AI",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-"],baseUrl:pu,quotaStrategy:"console",quotaUrl:ra,consoleUrl:uu,subscriptionUrl:ra,usagePolicyUrl:fu})],bailian:[nn({id:"pay-as-you-go",label:"Pay as You Go",kind:"api-platform",runtimeProviderIds:["bailian"],credentialPrefixHints:["sk-"],region:"cn",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"console",consoleUrl:en,usagePolicyUrl:tn}),nn({id:"token-plan",label:"Token Plan Personal",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:en,usagePolicyUrl:tn}),nn({id:"token-plan-team",label:"Token Plan Team",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:en,usagePolicyUrl:tn}),nn({id:"coding-plan",label:"Coding Plan Pro",kind:"token-plan",runtimeProviderIds:["bailian-coding-plan"],credentialPrefixHints:["sk-sp-"],region:"cn",baseUrl:"https://coding.dashscope.aliyuncs.com/v1",anthropicBaseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:en,usagePolicyUrl:tn})],deepseek:[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"DeepSeek",runtimeProviderIds:["deepseek"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.deepseek.com/api_keys",subscriptionUrl:"https://platform.deepseek.com/usage",endpoints:[{protocol:"chatCompletions",baseUrl:"https://api.deepseek.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://platform.deepseek.com/usage"},usagePolicyUrl:"https://cdn.deepseek.com/policies/en-US/deepseek-open-platform-terms-of-use.html",region:"global"}],ollama:[{id:"local",label:"Local Ollama",kind:"local",lifecycle:"active",authModes:["local"],productLabel:"Ollama",runtimeProviderIds:["ollama"],credentialPrefixHints:[],consoleUrl:"https://ollama.com",subscriptionUrl:"https://ollama.com",endpoints:[{protocol:"chatCompletions",baseUrl:"http://localhost:11434/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"unsupported",url:"https://ollama.com"},usagePolicyUrl:"https://ollama.com",region:"local"}],zhipu:[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:aa,subscriptionUrl:"https://open.bigmodel.cn/finance-center/expense-manage",endpoints:[{protocol:"chatCompletions",baseUrl:hu,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://open.bigmodel.cn/finance-center/expense-manage"},usagePolicyUrl:oa,region:"cn"},{id:"coding-plan",label:"GLM Coding Plan",kind:"token-plan",lifecycle:"active",authModes:["apiKey"],productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:aa,subscriptionUrl:"https://bigmodel.cn/glm-coding",endpoints:[{protocol:"chatCompletions",baseUrl:mu,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"subscription",url:"https://bigmodel.cn/glm-coding"},usagePolicyUrl:oa,region:"cn"}]};function sa(e){return{id:e.id,label:e.label,kind:e.kind,lifecycle:"active",authModes:e.authModes,productLabel:e.productLabel,runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.subscriptionUrl,endpoints:qo(e.baseUrl,e.anthropicBaseUrl,"cn",e.supportsDeveloperMessages),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.quotaUrl},usagePolicyUrl:e.usagePolicyUrl,region:"cn"}}function nn(e){return{id:e.id,label:e.label,lifecycle:"active",productLabel:"Alibaba Bailian",kind:e.kind,authModes:["apiKey"],runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.consoleUrl,endpoints:qo(e.baseUrl,e.anthropicBaseUrl,e.region),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.consoleUrl},usagePolicyUrl:e.usagePolicyUrl,region:e.region}}function qo(e,t,n,r){return[{protocol:"chatCompletions",baseUrl:e,region:n,...r===void 0?{}:{supportsDeveloperMessages:r}},...t?[{protocol:"anthropic",baseUrl:t,region:n}]:[]]}function Ho(e,t=!1){return(gu[e]??iu).map(n=>e==="openai"&&n.id==="official-subscription"&&t?{...n,lifecycle:"active",authModes:Array.from(new Set([...n.authModes??[],"local"])),authorizationMethods:[{id:"device-code",authMode:"deviceCode",connectMode:"deviceCodeOAuth",label:"设备码登录",lifecycle:"active"},{id:"local-session-import",authMode:"local",label:"已有登录态",lifecycle:"active"}]}:{...n})}function Au(e,t){return e==="anthropic"||t==="anthropic-compatible"?"anthropic":"openai"}function pn(e){switch(e){case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"kimi":return"Kimi";case"bailian":return"百炼";case"deepseek":return"DeepSeek";case"zhipu":return"智谱 AI";case"ollama":return"Ollama";case"custom":return"Custom"}}function mt(e,t){return e==="openai"&&(t==="local"||t==="oauth"||t==="deviceCode")?"official-subscription":e==="kimi"&&(t==="oauth"||t==="deviceCode")?"subscription-key":e==="bailian"?"pay-as-you-go":e==="ollama"?"local":e==="custom"?"openai-compatible":"api-platform"}function ia(e,t){const n=Ho(e).find(o=>o.id===(t??mt(e,"apiKey")));if(!n)return;const r=n.modelDiscovery?.endpointProtocol;return n.endpoints?.find(o=>o.protocol===r)?.baseUrl??n.endpoints?.[0]?.baseUrl}const Rt=Array.from(new Set([...Ca,"zhipu","ollama","custom"])),ca=new WeakMap;function yu(e){wu(),ws({createQueryEngine:async()=>new Hs.QueryEngine});const t=new URL("settings/-/sparql",e.podUrl).toString();return Y.setSparqlEndpoint(t),ce.setSparqlEndpoint(t),Be.setSparqlEndpoint(t),{async listModels(){return await e.database.init?.(Be),(await e.database.select().from(Be).execute()).map(ku).filter(bt)},async listProviders(){await e.database.init?.(Y,ce,Be);const n=await e.database.select().from(Y).execute(),r=await e.database.select().from(ce).execute(),o=await e.database.select().from(Be).execute();return Cu(e,n,r,o)},async createApiKeyCredential(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const s=Y.buildId({id:`${o}-${crypto.randomUUID()}`}),i=1,c=r.offeringId??mt(o,"apiKey"),d=r.baseUrl??ia(o,c),u=qn(r.proxyUrl),f={id:s,provider:o==="custom"?Du(s):Qn(o,c),service:"ai",authMode:"apiKey",status:"active",accountLabel:r.label,label:r.label,baseUrl:d,proxyUrl:u,keyVersion:String(i),reauthRequired:!1,encryptedSecret:rn(e,o,s,{type:"apiKey",apiKey:r.apiKey}),encryptionAlgorithm:"PLAINTEXT",metadata:{offeringId:c,priority:r.priority??100,enabled:!0,health:"unknown",baseUrl:d,...r.compatibility?{compatibility:r.compatibility}:{}}};return await e.database.insert(Y).values(f).execute(),Ee(e,o,f)},async createLocalCredential(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const s=Y.buildId({id:`${o}-local-${crypto.randomUUID()}`}),i=r.offeringId??mt(o,"local"),c=r.baseUrl??ia(o,i),d={id:s,provider:Qn(o,i),service:"ai",authMode:"local",status:"active",accountLabel:r.label??"Local",label:r.label??"Local",baseUrl:c,keyVersion:"1",reauthRequired:!1,encryptedSecret:rn(e,o,s,{type:"local"}),encryptionAlgorithm:"PLAINTEXT",metadata:{offeringId:i,priority:r.priority??100,enabled:!0,health:"unknown",baseUrl:c}};return await e.database.insert(Y).values(d).execute(),Ee(e,o,d)},async saveOAuthCredential(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");const i=(ca.get(e.database)??Promise.resolve()).then(async()=>{await e.database.init?.(Y,ce);const c=Ot(o,r.offeringId??mt(o,"deviceCode"))??mt(o,"deviceCode"),u=(await e.database.select().from(Y).execute()).find(x=>{const F=Ee(e,o,x);if(!F||F.authMode!=="deviceCode"&&F.authMode!=="oauth"||Ot(o,F.offeringId)!==c||x.status!=="active"&&x.status!=="disabled")return!1;const v=Ft(e,o,F.id,x.encryptedSecret);return Eu(r,Se(x.metadata),v)}),f=u&&Ee(e,o,u),h=Se(u?.metadata),A=f&&Ft(e,o,f.id,u?.encryptedSecret),g=f?.id??Y.buildId({id:`${o}-oauth-${crypto.randomUUID()}`}),I=r.accountLabel??"OAuth",m=r.accountId??D(h?.accountId)??D(A?.accountId),E=r.accountSubject??D(h?.authoritativeSubject)??D(A?.accountSubject)??D(A?.authoritativeSubject),P={...u,id:g,provider:Qn(o,c),service:"ai",authMode:"deviceCodeOAuth",status:f?.enabled===!1?"disabled":"active",accountLabel:u?.accountLabel??I,label:u?.label??I,expiresAt:r.expiresAt,scopes:r.scope?r.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String((f?.version??0)+1),reauthRequired:!1,encryptedSecret:rn(e,o,g,{type:"deviceCodeOAuth",accessToken:r.accessToken,refreshToken:r.refreshToken,expiresAt:r.expiresAt,scope:r.scope,idToken:r.idToken,accountId:m,accountSubject:E,accountLabel:r.accountLabel,offeringId:c,authorizationMethodId:r.authorizationMethodId}),encryptionAlgorithm:"PLAINTEXT",metadata:{...h,offeringId:c,priority:f?.priority??100,enabled:f?.enabled??!0,health:"healthy",authoritativeSubject:E,accountId:m,authorizationMethodId:r.authorizationMethodId}};if(u){const x={...P};if(delete x.id,!await e.database.updateById(Y,g,x))throw new Error("credential_version_conflict")}else await e.database.insert(Y).values(P).execute();return Ee(e,o,P)});return ca.set(e.database,i.then(()=>{},()=>{})),i},async updateOAuthCredential(n,r,o,s){const i=Te(n);if(!i)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const c=await e.database.findById(Y,r),d=c&&Ee(e,i,c);if(!c||!d||d.authMode!=="deviceCode")throw new Error("oauth_credential_not_found");if(d.version!==o)throw new Error("credential_version_conflict");const u=Ft(e,i,r,c.encryptedSecret),f=s.accountId??D(Se(c.metadata)?.accountId)??D(u?.accountId),h=s.accountSubject??D(Se(c.metadata)?.authoritativeSubject)??D(u?.accountSubject)??D(u?.authoritativeSubject),A={expiresAt:s.expiresAt,scopes:s.scope?s.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String(o+1),reauthRequired:!1,status:"active",encryptedSecret:rn(e,i,r,{type:"deviceCodeOAuth",accessToken:s.accessToken,refreshToken:s.refreshToken,expiresAt:s.expiresAt,scope:s.scope,idToken:s.idToken,accountId:f,accountSubject:h,accountLabel:s.accountLabel??D(c.accountLabel),offeringId:s.offeringId??d.offeringId,authorizationMethodId:s.authorizationMethodId??D(Se(c.metadata)?.authorizationMethodId)}),accountLabel:s.accountLabel??D(c.accountLabel),label:s.accountLabel??D(c.label),metadata:{...Se(c.metadata),offeringId:s.offeringId??d.offeringId,enabled:!0,health:"healthy",authoritativeSubject:h,accountId:f,authorizationMethodId:s.authorizationMethodId??D(Se(c.metadata)?.authorizationMethodId)}},g=await e.database.updateById(Y,r,A);if(!g)throw new Error("credential_version_conflict");return Ee(e,i,g)},async updateProviderCredential(n,r,o){const s=Te(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const i=await e.database.findById(Y,r),c=i&&Ee(e,s,i);if(!i||!c)throw new Error("credential_not_found");if(c.version!==o.expectedVersion)throw new Error("credential_version_conflict");const d={...Se(i.metadata),...o.priority===void 0?{}:{priority:o.priority},...o.enabled===void 0?{}:{enabled:o.enabled},...o.baseUrl===void 0?{}:{baseUrl:o.baseUrl},...o.proxyUrl===void 0?{}:{proxyUrl:qn(o.proxyUrl)}},u={...o.label===void 0?{}:{accountLabel:o.label,label:o.label},...o.baseUrl===void 0?{}:{baseUrl:o.baseUrl},...o.proxyUrl===void 0?{}:{proxyUrl:qn(o.proxyUrl)},...o.enabled===void 0?{}:{status:o.enabled?"active":"disabled"},keyVersion:String(c.version+1),metadata:d},f=await e.database.updateById(Y,r,u);if(!f)throw new Error("credential_update_failed");const h=Ee(e,s,f);if(!h)throw new Error("credential_update_failed");return h},async markCredentialHealth(n,r,o,s){const i=Te(n);if(!i)throw new Error("unsupported_provider");await e.database.init?.(Y);const c=await e.database.findById(Y,r),d=c&&Ee(e,i,c);if(!c||!d)throw new Error("credential_not_found");if(d.version!==s)throw new Error("credential_version_conflict");const u=await e.database.updateById(Y,r,{keyVersion:String(d.version+1),metadata:{...Se(c.metadata),health:o}});if(!u)throw new Error("credential_update_failed");const f=Ee(e,i,u);if(!f)throw new Error("credential_update_failed");return f},async deleteProviderCredential(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const s=await e.database.findById(Y,r),i=s&&Ee(e,o,s);if(i)return await e.database.deleteById(Y,r),i},async readCredentialSecret(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");const s=await e.database.findById(Y,r);if(!s||!Ee(e,o,s))throw new Error("credential_not_found");const i=Ft(e,o,r,s.encryptedSecret);if(!i)throw new Error("credential_secret_unavailable");return i},async saveDiscoveredModels(n,r,o){const s=Te(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(Y,ce,Be);const i=await la(e,r),c=ua(s,i);await fa(e.database,c,pn(s));const d=await e.database.select().from(Be).execute(),u=new Set(d.map(A=>D(A.id)).filter(bt)),f=o.map(Pu).filter(bt),h=new Set(f.map(A=>A.id));for(const A of d.filter(g=>lt(D(g.isProvidedBy),c))){const g=dt(D(A.id),c);g&&!h.has(g)&&D(A.status)!=="unavailable"&&await e.database.updateById(Be,String(A.id),{status:"unavailable"})}for(const A of f)await Uu(e.database,c,A,u)},async saveModelSelection(n,r,o){const s=Te(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(ce,Be);const i=s==="custom"&&o?await la(e,o):null;if(s==="custom"&&o&&!i)throw new Error("credential_not_found");const c=i?ua(s,i):ce.buildId({id:s});await fa(e.database,c,pn(s));const u=(await e.database.select().from(ce).execute()).find(m=>lt(D(m.id),c)),f=D(u?.id)??c,h=Jo(u?.hasModel),A=await e.database.select().from(Be).execute(),g=[...new Set(r.map(m=>Bu(s,m,A,i?c:void 0)))];if(!await e.database.updateById(ce,f,{hasModel:g}))throw new Error("provider_model_selection_update_failed");e.authenticatedFetch&&await bu(e,f,h,g)}}}const xu="https://undefineds.co/ns#hasModel";async function bu(e,t,n,r){const o=Ln(ce,e.podUrl,t),s=n.map(f=>Ln(Be,e.podUrl,f)),i=r.map(f=>Ln(Be,e.podUrl,f)),c=f=>f.map(h=>`<${o}> <${xu}> <${h}> .`).join(`
|
|
8
|
+
`)}}function Dd({record:e,busy:t,onDestroy:n}){const r=e.name||"未命名 API Key",o=Fd(e),s=e.kind!=="client-credentials"||!!e.clientCredentialId;return a.jsxs("li",{"data-key-id":e.id,"data-key-binding":e.appliedTo?"bound":"unbound",className:"flex flex-wrap items-center gap-x-4 gap-y-2 border-b border-border/60 px-4 py-3 first:rounded-t-xl last:rounded-b-xl last:border-b-0",children:[a.jsxs("dl",{className:"flex min-w-0 flex-1 basis-64 flex-wrap items-center gap-x-6 gap-y-2",children:[a.jsx(Nn,{label:"用途",className:"min-w-0 flex-1 basis-28",children:a.jsx("span",{className:"block truncate text-sm font-medium text-foreground/90",title:r,children:r})}),a.jsx(Nn,{label:"绑定",className:"min-w-0 flex-1 basis-28",children:a.jsxs("span",{className:"flex min-w-0 items-center gap-1.5 text-xs text-muted-foreground",children:[o.clientId?a.jsx(kd,{client:o.clientId,className:"h-3.5 w-3.5"}):null,a.jsx("span",{className:"truncate",title:o.label,children:o.label})]})}),a.jsx(Nn,{label:"最后使用",className:"shrink-0",children:a.jsx("span",{className:"block text-xs text-muted-foreground",children:e.lastUsedAt?Ud(e.lastUsedAt):"暂无调用记录"})})]}),s?a.jsxs(V,{variant:"ghost",size:"sm",className:"h-8 shrink-0 gap-1.5 text-xs text-muted-foreground hover:text-destructive","aria-label":`销毁 ${r}`,title:`销毁 ${r}`,disabled:t,onClick:n,children:[a.jsx(ur,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"销毁"]}):a.jsx("span",{className:"shrink-0 text-[11px] text-muted-foreground",children:"缺少 CSS 凭据标识,无法在此销毁"})]})}function Fd(e){const t=e.appliedTo?.trim();if(!t)return{label:"未绑定"};const n=Oo.find(s=>s===t),r=n?We[n]:t,o=e.appliedOn?.trim();return{clientId:n,label:o?`${r} · ${o}`:r}}function Nn({label:e,className:t,children:n}){return a.jsxs("div",{className:t,children:[a.jsx("dt",{className:"text-[11px] leading-tight text-muted-foreground/80",children:e}),a.jsx("dd",{className:"mt-0.5",children:n})]})}function Ud(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}const Rn="我的 API Key",Bd="API Key 已创建,请复制或应用到客户端。",Sd="这个 API Key 只在创建时可见:请销毁它,然后重新创建并立即复制或应用。",Md="这个 API Key 只在创建时可见:请销毁它,然后重新创建并直接应用到客户端。",Nd=["flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm transition-[border-color]","disabled:cursor-not-allowed disabled:opacity-50",As].join(" ");function Rd({client:e,clientConfigurationBridge:t,gatewayModels:n}){const[r,o]=p.useState([]),[s,i]=p.useState(!0),[c,d]=p.useState(!1),[u,f]=p.useState(Rn),[h,A]=p.useState(""),[g,I]=p.useState(!1),[m,E]=p.useState(),[P,x]=p.useState(),[F,v]=p.useState(),[M,j]=p.useState(!1),[y,w]=p.useState(),[S,N]=p.useState(),[q,H]=p.useState(),B=p.useRef(new Map),$=p.useRef(!1),W=p.useRef(void 0),Z=p.useRef(void 0),le=p.useCallback(K=>{W.current&&Br(W.current),W.current=Ue(K)},[]),de=p.useCallback(K=>{le({variant:"destructive",description:Pt(K),duration:8e3})},[le]);p.useEffect(()=>{let K=!0;return i(!0),H(void 0),B.current.clear(),e.listGatewayKeys().then(L=>{K&&o(L.filter(se=>!se.revokedAt))}).catch(L=>{K&&de(L)}).finally(()=>{K&&i(!1)}),()=>{K=!1,clearTimeout(Z.current),W.current&&Br(W.current)}},[e,de]);const ae=()=>{H(void 0),f(Rn),A(""),w(void 0),d(!0)},re=()=>{E(void 0),x(void 0),v(void 0),w(void 0),H(void 0),f(Rn),A("")},R=async()=>{const K=u.trim();if(!K){H("请填写 API Key 名称。");return}if(!h){H("请选择 API Key 的用途。");return}I(!0),H(void 0);try{const L=await e.createGatewayKey({name:K,appliedTo:h});B.current.set(L.record.id,L.plaintext),o(se=>[L.record,...se.filter(ge=>ge.id!==L.record.id)]),E(L.record),x(h),v(void 0),w(void 0),le({variant:"success",description:Bd})}catch(L){H(Pt(L))}finally{I(!1)}},ee=(K,L)=>{const se=B.current.get(K.id);if(!se)throw new Error(L);return se},G=async(K,L)=>{H(void 0);try{const se=ee(K,Sd);if(!navigator.clipboard?.writeText)throw new Error("当前浏览器无法访问剪贴板,请允许剪贴板访问后重试。");await navigator.clipboard.writeText(L==="key"?se:Pd(L,e.apiBase,se)),w(L),clearTimeout(Z.current),Z.current=setTimeout(()=>w(void 0),2e3)}catch(se){H(Pt(se))}},fe=async()=>{if(!m||!P||!t)return;H(void 0);let K;try{K=ee(m,Md)}catch(L){H(Pt(L));return}j(!0);try{const L=await t.plan({client:P,endpoint:e.apiBase,...P==="codex"&&n!==void 0?{activeModels:n.map(({id:se,provider:ge,displayName:Qe,availability:Pe,contextWindow:X,inputModalities:we,capabilities:Ae})=>({id:se,provider:ge,displayName:Qe,availability:Pe,contextWindow:X,inputModalities:we,capabilities:Ae}))}:{}});await t.apply({client:L.client,planId:L.planId,apiKey:K,...L.confirmation?.required?{confirmation:{token:L.confirmation.token,targetHash:L.confirmation.targetHash}}:{}}),v(L.client),o(se=>se.map(ge=>ge.id===m.id?{...ge,appliedTo:L.client}:ge)),le({variant:"success",description:L.client==="codex"&&n===void 0?"Codex 连接配置已应用,模型目录尚未加载,请稍后刷新配置。":`${We[L.client]} 配置已应用。`})}catch(L){H(Pt(L))}finally{j(!1)}},oe=async K=>{if(!$.current){$.current=!0,N(K.id),H(void 0);try{await e.deleteGatewayKey(K.id),B.current.delete(K.id),o(L=>L.filter(se=>se.id!==K.id)),m?.id===K.id&&(E(void 0),x(void 0),v(void 0),w(void 0))}catch(L){de(L)}finally{$.current=!1,N(void 0)}}};return a.jsxs("section",{className:"space-y-8 [container-type:inline-size]","aria-label":"API Keys",children:[a.jsxs("header",{className:"flex items-start justify-between gap-4",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(gn,{className:"h-9 w-9 shrink-0 rounded-lg border border-border/50 bg-muted/50 shadow-sm",children:a.jsx(An,{className:"rounded-lg bg-transparent text-sm font-bold uppercase text-muted-foreground",children:"XP"})}),a.jsxs("div",{className:"flex flex-col justify-center gap-1",children:[a.jsx("h2",{className:"text-base font-semibold leading-none tracking-tight text-foreground",children:"Xpod"}),a.jsx("p",{className:"max-w-3xl text-xs leading-snug text-muted-foreground",children:"API Key 用于让客户端把 Xpod 当作 Provider 接入;Xpod 不保存 Key 明文。"})]})]}),a.jsx(on,{variant:r.length>0?"default":"secondary",children:r.length>0?`已签发 ${r.length} 个`:"未配置"})]}),a.jsxs("section",{className:"space-y-3","aria-label":"已签发 API Key",children:[a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[a.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[a.jsx(Jn,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"已签发 API Key"]}),a.jsxs(V,{size:"sm","aria-label":"新建 API Key",disabled:g||s,onClick:ae,children:[a.jsx(vt,{"aria-hidden":"true",className:"mr-2 h-4 w-4"}),"新建 API Key"]})]}),s?a.jsxs("div",{className:"flex items-center gap-2 py-6 text-sm text-muted-foreground",children:[a.jsx(Le,{"aria-hidden":"true",className:"h-4 w-4 animate-spin"}),"正在读取 API Key"]}):r.length===0?a.jsx("p",{className:"py-8 text-center text-sm text-muted-foreground",children:"尚未签发 API Key。"}):a.jsx("ul",{"aria-label":"API Key 列表",className:"rounded-xl border border-border/70",children:r.map(K=>a.jsx(Dd,{record:K,busy:!!S,onDestroy:()=>{oe(K)}},K.id))})]}),a.jsx(Tt,{open:c,onOpenChange:K=>{!K&&(g||M)||d(K)},children:a.jsxs(Et,{className:"sm:max-w-md","aria-describedby":void 0,children:[a.jsx(Lt,{children:a.jsx(It,{children:m?"API Key 已签发":"新建 API Key"})}),m&&P?a.jsxs("div",{className:"space-y-5",children:[a.jsxs("div",{className:"space-y-1.5",children:[a.jsxs("p",{className:"text-sm",children:["已签发「",m.name||"未命名 API Key","」,用途:",We[P],"。"]}),a.jsx("p",{className:"text-xs text-muted-foreground",children:"Xpod 不保存 Key 明文,请立即复制或直接应用到客户端;离开本次会话后无法再次获取。"})]}),m.maskedHint?a.jsx("code",{className:"block truncate rounded-md border border-border/60 bg-muted/30 px-3 py-2 font-mono text-xs text-muted-foreground",children:m.maskedHint}):null,t?null:a.jsx("p",{className:"text-xs text-muted-foreground",children:"当前 Web 环境无法自动写入客户端配置,请复制后手动粘贴;自动应用需要本机连接。"}),q?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:q}):null,a.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[a.jsxs(V,{type:"button",variant:"outline",size:"sm","aria-label":"复制 API Key",disabled:M,onClick:()=>{G(m,"key")},children:[y==="key"?a.jsx(st,{"aria-hidden":"true",className:"mr-1.5 h-3.5 w-3.5 text-emerald-600"}):a.jsx(zn,{"aria-hidden":"true",className:"mr-1.5 h-3.5 w-3.5"}),y==="key"?"已复制":"复制 API Key"]}),a.jsxs(V,{type:"button",variant:"outline",size:"sm",disabled:M,"aria-label":`复制 ${We[P]} 配置`,onClick:()=>{G(m,P)},children:[y===P?a.jsx(st,{"aria-hidden":"true",className:"mr-1.5 h-3.5 w-3.5 text-emerald-600"}):a.jsx(zn,{"aria-hidden":"true",className:"mr-1.5 h-3.5 w-3.5"}),y===P?"已复制":`复制 ${We[P]} 配置`]}),t?F?a.jsxs("span",{role:"status",className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[a.jsx(st,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"已应用到 ",We[F]]}):a.jsxs(V,{type:"button",size:"sm",disabled:M,"aria-label":`应用到 ${We[P]}`,onClick:()=>{fe()},children:[M?a.jsx(Le,{"aria-hidden":"true",className:"mr-2 h-4 w-4 animate-spin"}):null,M?"正在应用…":`应用到 ${We[P]}`]}):null]}),a.jsxs(Mt,{children:[a.jsx(V,{type:"button",variant:"ghost",disabled:M,onClick:re,children:"再建一个"}),a.jsx(V,{type:"button",variant:"outline",onClick:()=>d(!1),children:"完成"})]})]}):a.jsxs("form",{className:"space-y-5",onSubmit:K=>{K.preventDefault(),g||R()},children:[a.jsxs("label",{className:"block space-y-2",children:[a.jsx("span",{className:"text-sm font-medium",children:"名称"}),a.jsx(je,{autoFocus:!0,"aria-label":"API Key 名称",value:u,disabled:g,onChange:K=>f(K.target.value)})]}),a.jsxs("label",{className:"block space-y-2",children:[a.jsx("span",{className:"text-sm font-medium",children:"用途"}),a.jsxs("select",{"aria-label":"API Key 用途",className:Nd,value:h,disabled:g,onChange:K=>A(K.target.value),children:[a.jsx("option",{value:"",disabled:!0,children:"选择客户端应用"}),Oo.map(K=>a.jsx("option",{value:K,children:We[K]},K))]})]}),a.jsx("p",{className:"text-xs text-muted-foreground",children:"用途在创建时确定,Key 会绑定到该客户端应用。"}),q?a.jsx("p",{role:"alert",className:"text-sm text-destructive",children:q}):null,a.jsxs(Mt,{children:[a.jsx(V,{type:"button",variant:"outline",disabled:g,onClick:()=>d(!1),children:"取消"}),a.jsxs(V,{type:"submit","aria-label":"创建 API Key",disabled:g||!u.trim()||!h,children:[g?a.jsx(Le,{"aria-hidden":"true",className:"mr-2 h-4 w-4 animate-spin"}):null,g?"正在创建…":"创建 API Key"]})]})]})]})})]})}function Pt(e){const t=e instanceof Error?e.message.trim():"";return/failed to fetch|networkerror|load failed/i.test(t)?"无法连接配置服务,请检查连接后重试。":/EACCES|permission denied/i.test(t)?"没有权限写入配置文件,请检查文件权限后重试。":t==="Client configuration could not be verified locally."?"配置文件写入后的本地检查未通过,请检查文件内容和权限后重试。":!t||/^(?:AI Connection |AI client configuration )?request failed(?:\. Please try again\.)?$/i.test(t)?"API Key 操作失败,请重试。":t}const Od={};function Kd({client:e,renderToaster:t=!0,openExternal:n=Vd,clientConfigurationBridge:r,selectedSection:o="provider",selectedProvider:s,selectedCredentialId:i,providerSummaries:c=Od,providerProducts:d={},providerLoadError:u,providerLoading:f=!1,onProviderStateChange:h,onModelSelectionChange:A}){const[g,I]=p.useState({}),[m,E]=p.useState([]),[P,x]=p.useState(),[F,v]=p.useState(0),[M,j]=p.useState({}),[y,w]=p.useState({}),[S,N]=p.useState({}),[q,H]=p.useState({}),[B,$]=p.useState({}),[W,Z]=p.useState({}),[le,de]=p.useState({}),[ae,re]=p.useState({}),[R,ee]=p.useState({}),[G,fe]=p.useState({}),[oe,K]=p.useState(),[L,se]=p.useState(),[ge,Qe]=p.useState(!1),[Pe,X]=p.useState({}),we=p.useRef(0),Ae=p.useRef({}),pe={...d,...Pe},ue=p.useCallback((l,b)=>{I(k=>({...k,[l]:b})),h?.(l,Qd(b))},[h]);p.useEffect(()=>{I(Object.fromEntries(Object.values(c).filter(ea).map(l=>[l.provider,l.status==="connected"&&l.authMode==="browserAssistedApiKey"?"configured":l.status]))),Z(Object.fromEntries(Object.values(c).filter(ea).map(l=>[l.provider,l.baseUrl??""])))},[c]),p.useEffect(()=>{j(l=>{const b={...l};let k=!1;for(const[U,C]of Object.entries(d)){if(!C)continue;const O=C.selectedModels.map(nt),J=l[U];(!J||J.join("\0")!==O.join("\0"))&&(b[U]=O,k=!0)}return k?b:l})},[d]),p.useEffect(()=>{let l=!0;return e.listModels().then(b=>{l&&E(b)}).catch(()=>{}),()=>{l=!1,we.current+=1}},[e]),p.useEffect(()=>{let l=!0;return x(void 0),e.listGatewayModels?.().then(b=>{l&&x(b)}).catch(()=>{}),()=>{l=!1}},[e,F]);const te=(l,b)=>{de(k=>({...k,[l]:b}))},z=(l,b,k,U)=>{re(C=>({...C,[l]:b?{message:b,offeringId:k,authorization:U}:void 0}))},_=p.useCallback(async l=>{const b=l.verificationUriComplete??l.authorizationUrl??l.verificationUri;b&&await n(b)},[n]),Ge=async l=>{te(l,!0),z(l),H(b=>({...b,[l]:void 0}));try{const b=await e.beginConnect(l,"browserAssistedApiKey");N(U=>({...U,[l]:b}));const k=rr(b.status);if(ue(l,k?"pending":b.status==="completed"?"configured":"failed"),!k&&b.status!=="completed"){z(l,b.message??Yr(b.status));return}await _(b)}catch(b){ue(l,"failed"),z(l,xe(b))}finally{te(l,!1)}},He=async l=>{if(l.browserMode!=="connectUnsupported"){if(l.browserMode==="browserAssistedApiKey"){await Ge(l.id);return}await Q(l.id,l.browserMode)}},Dn=async(l,b,k,U)=>{if(k==="browserAssistedApiKey"){await Ge(l);return}await Q(l,k,b.id,U?.id)},Q=async(l,b,k,U)=>{if(b==="connectUnsupported")return;te(l,!0),z(l),H(O=>({...O,[l]:k}));const C=we.current+1;we.current=C;try{const O=await e.beginConnect(l,b,{offeringId:k,authorizationMethodId:U});if(N(J=>({...J,[l]:O})),!rr(O.status)){const J=O.status==="completed";J?await ye(l):ue(l,"failed"),J||z(l,O.status==="unsupported"?"当前部署未启用账号授权":O.message??Yr(O.status),k,{mode:b,authorizationMethodId:U}),te(l,!1);return}ue(l,"pending"),await _(O),Ld(e,l,O,C,we,{onAttempt:J=>N(ne=>({...ne,[l]:J})),onConnected:()=>ye(l),onFailed:J=>{ue(l,"failed"),z(l,J,k,{mode:b,authorizationMethodId:U})},onFinished:()=>te(l,!1)})}catch(O){ue(l,"failed"),z(l,xe(O),k,{mode:b,authorizationMethodId:U}),te(l,!1)}},ye=async l=>{ue(l,"connected");try{const b=(await e.listProviders()).find(k=>k.id===l);b&&X(k=>({...k,[l]:b}))}catch(b){z(l,`账号已连接,连接信息刷新失败:${xe(b)}`)}},Ne=async(l,b)=>{we.current+=1,te(l,!1),N(k=>({...k,[l]:void 0})),H(k=>({...k,[l]:void 0})),ue(l,"failed");try{await e.cancelConnect?.(l,b),z(l,"连接已取消")}catch(k){z(l,xe(k))}},qe=async l=>{const b=B[l.id]?.trim(),k=W[l.id]??c[l.id]?.baseUrl??"",U=S[l.id];if(!(!b||!U)){te(l.id,!0),z(l.id);try{const C=await e.completeApiKey(l.id,U,b,void 0,k.trim());N(O=>({...O,[l.id]:C})),$(O=>({...O,[l.id]:""})),ue(l.id,"configured"),Ue({description:"API Key 已保存"})}catch(C){z(l.id,xe(C)),ue(l.id,"failed")}finally{te(l.id,!1)}}},et=async(l,b)=>{const k=b?pe[l]?.credentials.find(U=>U.id===b)?.offeringId:void 0;te(l,!0),z(l);try{await e.disconnect(l,b),N(U=>({...U,[l]:void 0})),H(U=>({...U,[l]:void 0})),ee(U=>({...U,[l]:k?{...U[l],[k]:void 0}:void 0})),b?(X(U=>({...U,[l]:Zr(pe[l],l,b)})),Ue({description:"已从当前 Pod 移除账号"})):(ue(l,"disconnected"),Ue({description:"已断开连接"}))}catch(U){z(l,xe(U),k)}finally{te(l,!1)}},jt=(l,b)=>{X(k=>({...k,[l]:Wr(pe[l],l,b)})),ue(l,b.authMode==="apiKey"||b.authMode==="local"?"configured":"connected")},Ye=async(l,b,k=!1,U="")=>{fe(C=>({...C,[l]:!0})),z(l);try{const C=b?await e.discoverModels(l,b):await e.discoverModels(l);v(ne=>ne+1);const O=pe[l]?.selectedModels??[],J={...Jd(l,b),...C.complete===!1?{markMissing:!1}:{}};try{const De=(await e.listModels()).filter(Fe=>Fe.provider===l);E(Fe=>{const Wt=On(Fe,l,De,J),cs=On(Wt,l,C.models,J);return $r(cs,l,O,C.models,J)})}catch{E(ne=>$r(On(ne,l,C.models,J),l,O,C.models,J))}try{const De=(await e.listProviders()).find(Fe=>Fe.id===l);De&&X(Fe=>({...Fe,[l]:De}))}catch{}return C.complete===!1?z(l,"部分连接同步失败,已保留原有模型目录,可稍后重试。",b?.offeringId):k&&Ue({variant:C.models.length>0?"success":"default",description:C.models.length>0?`连接成功,已同步 ${C.models.length} 个模型`:"连接成功,但服务商未返回任何模型。请确认该服务支持 /models 接口,或使用「添加模型」手工录入。"}),!0}catch(C){const O=xe(C);return z(l,`${U}${O}`,b?.offeringId),!1}finally{fe(C=>({...C,[l]:!1}))}},Yo=async(l,b,k)=>{te(l,!0),z(l);try{const U=await e.createApiKeyCredential(l,{offeringId:b.id,apiKey:k.apiKey,label:k.label,baseUrl:k.baseUrl,proxyUrl:k.proxyUrl,priority:k.priority});jt(l,U),Ue({description:"API Key 已添加"}),await Ye(l,{offeringId:U.offeringId,credentialId:U.id})}catch(U){const C=xe(U);throw z(l,C,b.id),new Error(C)}finally{te(l,!1)}},Wo=async(l,b,k)=>{te(l,!0),z(l);try{const U=b.kind==="local",C=await e.createLocalCredential(l,{offeringId:b.id,authorizationMethodId:k?.id,label:b.label??Ce(b),...U?{baseUrl:b.endpoints?.[0]?.baseUrl}:{},priority:10});jt(l,C),Ue({description:`${Ce(b)} 已连接`}),b.modelDiscovery?.strategy!=="unsupported"&&await Ye(l,{offeringId:C.offeringId,credentialId:C.id},!1,U?"本地服务已连接,模型获取失败:":"订阅已读取,模型获取失败:")}catch(U){const C=xe(U);throw z(l,C,b.id),new Error(C)}finally{te(l,!1)}},Zo=async(l,b,k)=>{te(l,!0),z(l);try{const U=await e.updateProviderCredential(l,b.id,{expectedVersion:b.version,...k});jt(l,U),Ue({description:"凭证已更新"}),U.enabled&&await Ye(l,{offeringId:U.offeringId,credentialId:U.id})}catch(U){const C=xe(U);throw z(l,C,b.offeringId),new Error(C)}finally{te(l,!1)}},_o=async(l,b)=>{if(b.id===`${l}:current`&&b.version===0){if(pe[l]?.credentials.some(k=>k.id!==b.id)){z(l,"请重新加载连接后再移除旧连接。",b.offeringId);return}await et(l);return}te(l,!0),z(l);try{await e.deleteProviderCredential(l,b.id);const k=Zr(pe[l],l,b.id);X(U=>({...U,[l]:k})),ue(l,Ko(k)),Ue({description:"凭证已删除"})}catch(k){z(l,xe(k),b.offeringId)}finally{te(l,!1)}},$o=async(l,b)=>{te(l,!0),z(l);try{const k=await e.testProviderCredential(l,{credentialId:b.id}),U=Hd(k);X(C=>({...C,[l]:U?Wr(pe[l],l,U):_r(pe[l],l,b.id,"healthy")})),Ue({variant:"success",description:"测试通过"})}catch(k){const U=(await e.listProviders().catch(()=>[])).find(C=>C.id===l);X(C=>({...C,[l]:U??_r(pe[l],l,b.id,"invalid")})),z(l,xe(k),b.offeringId)}finally{te(l,!1)}},es=async(l,b,k,U,C)=>{if(C<0||C>=k.length)return;const O=[...k],[J]=O.splice(U,1);if(J){O.splice(C,0,J),te(l,!0),z(l);try{const ne=[];for(const[De,Fe]of O.entries()){const Wt=(De+1)*10;if(Fe.priority===Wt){ne.push(Fe);continue}ne.push(await e.updateProviderCredential(l,Fe.id,{expectedVersion:Fe.version,priority:Wt}))}X(De=>({...De,[l]:qd(pe[l],l,b,ne)})),Ue({description:"顺序已保存"})}catch(ne){z(l,xe(ne),b.id)}finally{te(l,!1)}}},Fn=p.useRef(new Set),ts=async(l,b,k)=>{const U=k?[k]:(pe[l]?.credentials??[]).filter(C=>C.enabled&&C.offeringId===b.id);await Promise.all(U.map(async C=>{const O=`${l}\0${C.id}`;if(Fn.current.has(O))return;Fn.current.add(O);const J=ne=>{ee(De=>({...De,[l]:{...De[l],[C.id]:ne}}))};J({busy:!0,credentialId:C.id});try{const ne=await e.quota(l,!0,{offeringId:b.id,credentialId:C.id,credentialIri:C.id});J({quota:ne,busy:!1,credentialId:C.id})}catch(ne){J({busy:!1,error:xe(ne),credentialId:C.id})}finally{Fn.current.delete(O)}}))},ns=async l=>{await Ye(l,l==="custom"&&i?{credentialId:i}:void 0,!0)},Pr=p.useCallback(async()=>{v(l=>l+1);try{E(await e.listModels())}catch{}},[e]),Dr=(l,b)=>{se(void 0),K({provider:l,model:b})},rs=async l=>{if(!oe)return;const b=!!oe.model;Qe(!0),se(void 0);try{await e.saveProviderModel(oe.provider,{id:l.id,displayName:l.name||void 0,inputModalities:l.inputModalities.length>0?l.inputModalities:void 0,capabilities:l.capabilities.length>0?l.capabilities:void 0}),K(void 0),Ue({description:b?"模型已更新":"模型已添加"}),await Pr()}catch(k){se(xe(k))}finally{Qe(!1)}},as=async(l,b)=>{z(l);try{await e.deleteProviderModel(l,b.id),E(k=>k.filter(U=>!(U.provider===l&&U.id===b.id))),Ue({description:"模型已移除"}),Pr()}catch(k){z(l,xe(k))}},os=p.useCallback((l,b)=>{const k=[...new Set(b)],U=M[l]??pe[l]?.selectedModels.map(nt)??[],C=(Ae.current[l]??0)+1;Ae.current[l]=C,j(O=>({...O,[l]:k})),w(O=>({...O,[l]:"saving"})),(async()=>{try{const O=[...m.filter(ne=>ne.provider===l),...pe[l]?.selectedModels??[]],J=k.map(ne=>{const De=O.find(Fe=>nt(Fe)===ne);return De?Xd(De):{id:ne}});l==="custom"?await e.saveModelSelection?.(l,J,i):await e.saveModelSelection?.(l,J),Ae.current[l]===C&&(v(ne=>ne+1),w(ne=>({...ne,[l]:"saved"})),A?.(l,k))}catch(O){if(Ae.current[l]!==C)return;w(J=>({...J,[l]:"error"})),j(J=>({...J,[l]:U})),A?.(l,U),Ue({variant:"destructive",description:xe(O)})}})()},[e,pe,Ae,m,A,i,M]),ss=a.jsxs("section",{children:[u?a.jsxs("p",{className:"mb-4 rounded-md border border-destructive/30 px-3 py-2 text-sm text-destructive",children:["Provider 状态读取失败:",u]}):null,Ie.filter(l=>l.id===(s??"openai")).map(l=>{const b=pe[l.id],k=Gd(m.filter(C=>C.provider===l.id&&(l.id!=="custom"||!i||C.credentialId===i)),b?.selectedModels??[]),U=M[l.id]??b?.selectedModels.map(nt)??[];return a.jsx(md,{definition:l,product:b,status:Td(g[l.id],b),accountLabel:c[l.id]?.accountLabel,attempt:S[l.id],attemptOfferingId:q[l.id],apiKey:B[l.id]??"",baseUrl:W[l.id]??c[l.id]?.baseUrl??"",busy:!!(le[l.id]||G[l.id]),disabled:f,error:ae[l.id],quotas:R[l.id],models:k,selectedModelIds:U,modelSelectionStatus:y[l.id],onApiKeyChange:C=>$(O=>({...O,[l.id]:C})),onBaseUrlChange:C=>Z(O=>({...O,[l.id]:C})),onBeginApiKey:()=>{Ge(l.id)},onBeginOffering:(C,O,J)=>{Dn(l.id,C,O,J)},onCancelConnect:C=>{Ne(l.id,C)},onBeginBrowser:()=>{He(l)},onSaveApiKey:()=>{qe(l)},onDisconnect:C=>{et(l.id,C?.id)},onCreateApiKeyCredential:(C,O)=>Yo(l.id,C,O),onCreateLocalCredential:(C,O)=>Wo(l.id,C,O),onUpdateCredential:(C,O)=>Zo(l.id,C,O),onDeleteCredential:C=>{_o(l.id,C)},onTestCredential:C=>{$o(l.id,C)},onReorderCredentials:(C,O,J,ne)=>{es(l.id,C,O,J,ne)},onRefreshQuota:(C,O)=>{ts(l.id,C,O)},verifyPending:!!G[l.id],onVerify:()=>{ns(l.id)},onAddModel:()=>Dr(l.id),onEditModel:C=>Dr(l.id,C),onDeleteModel:C=>{as(l.id,C)},onModelSelectionChange:os,onDismissError:()=>z(l.id)},l.id)})]}),is=a.jsx(Rd,{client:e,clientConfigurationBridge:r,gatewayModels:P});return a.jsxs("div",{"data-testid":"ai-connections-panel",className:"mx-auto w-full max-w-5xl space-y-10 px-4 py-6 sm:px-8 sm:py-8",children:[t?a.jsx(ys,{}):null,o==="keys"?is:null,o==="provider"?ss:null,o==="provider"&&oe?a.jsx(Cd,{open:!0,providerName:Ie.find(l=>l.id===oe.provider)?.name??oe.provider,initialValue:oe.model?{id:oe.model.id,name:oe.model.displayName??"",inputModalities:oe.model.inputModalities??[],capabilities:oe.model.capabilities??[]}:void 0,error:L,saving:ge,onOpenChange:l=>{l||K(void 0)},onSave:l=>{rs(l)}}):null]})}function Ko(e){if(!e||e.status==="unconfigured"||e.status==="unavailable")return"disconnected";if(e.status==="configured")return"configured";if(e.status==="attention")return"reauthRequired";const t=e.credentials.find(n=>n.enabled)??e.credentials[0];return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}function Td(e,t){return e==="pending"||e==="failed"?e:t?Ko(t):e??"unknown"}async function Ld(e,t,n,r,o,s){let i=n;try{for(;o.current===r&&rr(i.status);){if(await zd(Math.max(1,i.intervalSeconds??2)*1e3),o.current!==r)return;i={...i,...await e.pollDevice(t,i)},s.onAttempt(i)}i.status==="completed"?await s.onConnected():o.current===r&&s.onFailed(i.message||`连接${i.status==="expired"?"已过期":"失败"}`)}catch(c){o.current===r&&s.onFailed(xe(c))}finally{o.current===r&&s.onFinished()}}function rr(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"}function Yr(e){return e==="expired"?"连接已过期,请重新开始":e==="cancelled"?"连接已取消":e==="unsupported"?"当前 Provider 不支持此连接方式":"连接失败"}function Qd(e){return e==="configured"?"configured":e==="connected"?"connected":e==="failed"||e==="reauthRequired"?"attention":e==="pending"?"loading":"unconfigured"}function Wr(e,t,n){const r=e??Pn(t),o=To([...r.credentials.filter(s=>s.id!==n.id),n]);return{...r,credentials:o,status:Er(o)}}function Zr(e,t,n){const r=e??Pn(t),o=r.credentials.filter(s=>s.id!==n);return{...r,credentials:o,status:Er(o)}}function _r(e,t,n,r){const o=e??Pn(t),s=o.credentials.map(i=>i.id===n?{...i,health:r}:i);return{...o,credentials:s,status:s.some(i=>i.enabled&&i.health==="invalid")?"attention":Er(s)}}function Hd(e){const t=e.credential;if(!t||typeof t!="object")return;const n=t;return typeof n.id=="string"&&typeof n.offeringId=="string"&&(n.authMode==="oauth"||n.authMode==="deviceCode"||n.authMode==="apiKey"||n.authMode==="local")&&typeof n.version=="number"?n:void 0}function Er(e){if(e.length===0)return"unconfigured";const t=e.filter(n=>n.enabled);return t.length===0?"configured":t.some(n=>n.health==="expired"||n.health==="invalid")?"attention":"available"}function qd(e,t,n,r){const o=e??Pn(t),s=new Set(r.map(i=>i.id));return{...o,offerings:o.offerings.some(i=>i.id===n.id)?o.offerings:[...o.offerings,n],credentials:To([...o.credentials.filter(i=>!s.has(i.id)),...r])}}function Pn(e){return{id:e,name:Ie.find(t=>t.id===e)?.name??e,offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function To(e){return[...e].sort((t,n)=>t.priority-n.priority)}function Vd(e){window.open(e,"_blank","noopener,noreferrer")}function zd(e){return new Promise(t=>window.setTimeout(t,e))}function xe(e){const t=va(e);return t==="AI Connection request failed. Please try again."?"请求未完成。请确认 Xpod 正在运行且登录仍有效,然后重试。":t}function Jd(e,t){return e==="custom"?t?.credentialId?{markMissing:!0,credentialId:t.credentialId}:{markMissing:!t}:t?.offeringId?{markMissing:!0,offeringId:t.offeringId}:{markMissing:!t}}function On(e,t,n,r={markMissing:!1}){const o=new Set(n.map(i=>i.id)),s=e.map(i=>r.markMissing&&i.provider===t&&!i.custom&&!o.has(i.id)&&(r.offeringId===void 0||i.offeringId===r.offeringId)&&(r.credentialId===void 0||i.credentialId===r.credentialId)?xt({...i,availability:"unavailable"}):i);for(const i of n){const c=i,d="provider"in i,u=c.offeringId??(d?void 0:r.offeringId),f=c.credentialId??(d?void 0:r.credentialId),h=s.findIndex(A=>A.provider!==t?!1:c.resourceId&&A.resourceId?c.resourceId===A.resourceId:f!==void 0?A.id===c.id&&A.credentialId===f:u!==void 0?A.id===c.id&&A.offeringId===u:A.id===c.id&&A.offeringId===void 0);h===-1?s.push(xt({...c,id:c.id,provider:t,availability:c.availability??"available",...u?{offeringId:u}:{},...f?{credentialId:f}:{}})):s[h]=xt({...s[h],...c,provider:t,displayName:c.displayName??s[h].displayName,availability:c.availability??"available",...u?{offeringId:u}:{},...f?{credentialId:f}:{}})}return s}function $r(e,t,n,r,o){if(!o.markMissing||n.length===0)return e;const s=new Set(r.map(c=>c.id)),i=[...e];for(const c of n.filter(d=>d.provider===t)){if(c.custom||o.offeringId!==void 0&&c.offeringId!==o.offeringId||o.credentialId!==void 0&&c.credentialId!==o.credentialId||s.has(c.id))continue;const d=nt(c),u=i.findIndex(h=>h.provider===t&&nt(h)===d),f=xt({...c,availability:"unavailable"});u===-1?i.push(f):i[u]=xt({...i[u],...f,displayName:i[u].displayName??f.displayName})}return i}function Gd(e,t){const n=[...e];for(const r of t){const o=n.findIndex(s=>nt(s)===nt(r));if(o===-1){n.push(r);continue}n[o]=xt({...n[o],...r,displayName:n[o].displayName??r.displayName,availability:n[o].availability==="unavailable"?"unavailable":r.availability})}return n}function xt(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function nt(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function Xd(e){return{id:e.id,...e.offeringId?{offeringId:e.offeringId}:{},...e.resourceId?{resourceId:e.resourceId}:{}}}function ea(e){return e!==void 0}function Lo({controller:e,renderToaster:t=!0}){const n=wr(e),r=Cr(e),o=Po(e),s=Rl(e),i=vr(e),c=Fo(e),d=Ie.find(I=>I.id===r),u=r==="custom"?i.custom?.credentials.find(I=>I.id===o):void 0,f=br.find(I=>I.id===n)?.title,h=u?.label??i[r]?.name??d?.name??r,A=f??`${h} 详情`,g=r==="custom"&&o&&i.custom?{...i,custom:{...i.custom,name:h,offerings:Yd(i.custom,u),credentials:i.custom.credentials.filter(I=>I.id===o),selectedModels:i.custom.selectedModels.filter(I=>I.credentialId===o)}}:i;return p.useEffect(()=>(e.client&&e.loadProviders(),()=>e.cancelProviderLoads()),[e]),e.client?a.jsx("section",{role:"region","aria-label":A,children:a.jsx(Kd,{client:e.client,renderToaster:t,clientConfigurationBridge:e.clientConfigurationBridge,selectedSection:n,selectedProvider:r,selectedCredentialId:o,openExternal:e.openExternal,providerSummaries:s,providerProducts:g,providerLoadError:c,providerLoading:!i[r]&&!c,onProviderStateChange:e.setProviderState})}):a.jsxs("section",{role:"alert","aria-label":"AI Connections unavailable",children:[a.jsx("h2",{children:"AI Connections 尚未就绪"}),a.jsx("p",{children:"宿主需要先提供已登录的 WebID 和可用的 Pod。"})]})}function Yd(e,t){if(!t)return e.offerings;const n=t.compatibility??(t.offeringId==="anthropic-compatible"?"anthropic":"openai"),r=e.offerings.find(o=>o.id===t.offeringId)??e.offerings[0];return r?[{...r,id:t.offeringId,label:n==="auto"?"自动探测":n==="anthropic"?"Anthropic 兼容":"OpenAI 兼容",endpoints:t.baseUrl?[{protocol:n==="anthropic"?"anthropic":"chatCompletions",baseUrl:t.baseUrl}]:r.endpoints,modelDiscovery:n==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:n==="auto"?{strategy:"auto",path:"/models",endpointProtocol:"auto"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}}]:[]}function Wd({open:e,saving:t=!1,error:n,onOpenChange:r,onSave:o}){const[s,i]=p.useState(""),[c,d]=p.useState("auto"),[u,f]=p.useState(""),[h,A]=p.useState(""),[g,I]=p.useState(""),[m,E]=p.useState();p.useEffect(()=>{e&&(i(""),d("auto"),f(""),A(""),I(""),E(void 0))},[e]);const P=()=>{E(void 0);let x;try{x=Zd(u)}catch{E("Base URL 必须是有效的 http(s) 地址。");return}const F=s.trim(),v=h.trim();if(!F){E("请输入 Provider 名称。");return}if(!v){E("请输入 API Key。");return}o({offeringId:_d(c),apiKey:v,label:F,baseUrl:x,priority:10,compatibility:c,...g.trim()?{proxyUrl:g.trim()}:{}})};return a.jsx(Tt,{open:e,onOpenChange:r,children:a.jsxs(Et,{className:"max-w-md",style:{maxHeight:"calc(100vh - 2rem)",overflowY:"auto"},"aria-describedby":"ai-custom-provider-description",children:[a.jsx(Lt,{children:a.jsx(It,{children:"添加自定义 Provider"})}),a.jsx("p",{id:"ai-custom-provider-description",className:"text-sm text-muted-foreground",children:"用 OpenAI/Anthropic 兼容协议接入第三方模型服务。Xpod 会把真实 API Key 存进当前 Pod。"}),a.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-name",children:"Provider 名称"}),a.jsx(je,{id:"ai-custom-provider-name",value:s,disabled:t,placeholder:"例如 OpenRouter",onChange:x=>i(x.target.value)})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-compatibility",children:"兼容协议"}),a.jsxs("select",{id:"ai-custom-provider-compatibility",value:c,disabled:t,"aria-label":"兼容协议",className:"h-9 rounded-md border border-input bg-background px-3 text-sm",onChange:x=>d(x.target.value),children:[a.jsx("option",{value:"auto",children:"自动探测"}),a.jsx("option",{value:"openai",children:"OpenAI 兼容优先"}),a.jsx("option",{value:"anthropic",children:"Anthropic 兼容优先"})]})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-base-url",children:"Base URL"}),a.jsx(je,{id:"ai-custom-provider-base-url",value:u,disabled:t,placeholder:"https://openrouter.ai/api 或 https://openrouter.ai/api/v1",onChange:x=>f(x.target.value)}),a.jsx("p",{className:"text-xs text-muted-foreground",children:"裸域名会自动补齐为 /v1。"})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-api-key",children:"API Key"}),a.jsx(je,{id:"ai-custom-provider-api-key",type:"password",value:h,disabled:t,autoComplete:"new-password","data-lpignore":"true",onChange:x=>A(x.target.value)})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(_e,{htmlFor:"ai-custom-provider-proxy-url",children:"Proxy URL(可选)"}),a.jsx(je,{id:"ai-custom-provider-proxy-url",value:g,disabled:t,placeholder:"http://127.0.0.1:7890",onChange:x=>I(x.target.value)})]}),m||n?a.jsx("p",{className:"text-sm text-destructive",children:m??n}):null]}),a.jsxs(Mt,{children:[a.jsx(V,{type:"button",variant:"outline",disabled:t,onClick:()=>r(!1),children:"取消"}),a.jsx(V,{type:"button",disabled:t,onClick:P,children:"保存自定义 Provider"})]})]})})}function Zd(e){const t=e.trim(),n=new URL(t);if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error("invalid_custom_base_url");n.hash="";const r=n.pathname.replace(/\/+$/u,"");return!r||r===""?n.pathname="/v1":n.pathname=r,n.href.replace(/\/$/u,"")}function _d(e){return e==="anthropic"?"anthropic-compatible":"openai-compatible"}function $d({controller:e}){const t=Do(e),[n,r]=p.useState(!1),[o,s]=p.useState(!1),[i,c]=p.useState(),d=async u=>{if(!e.client){c("请先登录后再添加自定义 Provider。");return}s(!0),c(void 0);let f;try{const h=await e.client.createApiKeyCredential("custom",u);f=h.id,await e.client.discoverModels("custom",{offeringId:h.offeringId,credentialId:h.id,compatibility:u.compatibility}),e.selectProvider("custom",h.id),await e.loadProviders(),r(!1)}catch(h){f&&await e.client.deleteProviderCredential("custom",f).catch(()=>{}),c(h instanceof Error?h.message:"AI Connection request failed. Please try again.")}finally{s(!1)}};return a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"flex h-full min-w-0 items-center gap-2 px-3",children:[a.jsxs("div",{className:"relative min-w-0 flex-1",children:[a.jsx(La,{"aria-hidden":"true",className:"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),a.jsx(je,{type:"search","aria-label":"搜索 Provider",placeholder:"搜索 Provider",value:t,onChange:u=>e.setSearchQuery(u.target.value),className:"h-8 border-transparent bg-muted/50 pl-8 text-xs focus-visible:bg-background"})]}),a.jsx(V,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 shrink-0","aria-label":"添加 AI Connection",title:"添加 AI Connection",onClick:()=>r(!0),children:a.jsx(vt,{className:"h-4 w-4","aria-hidden":"true"})})]}),a.jsx(Wd,{open:n,saving:o,error:i,onOpenChange:r,onSave:u=>{d(u)}})]})}function eu({controller:e}){const t=wr(e),n=Cr(e),r=vr(e),o=Ie.find(i=>i.id===n),s=br.find(i=>i.id===t)?.title??r[n]?.name??o?.name??n;return a.jsx("div",{className:"flex h-full min-w-0 items-center px-4",children:a.jsx("h1",{className:"truncate text-sm font-medium text-foreground",children:s})})}const tu=["navigation.openExternal","aiClientConfiguration"];function nu(e){const t=Kn(e,"Extension manifest");ta(t.extensionId,"extensionId"),ht(t.name,"name"),ht(t.version,"version"),ht(t.sdkVersion,"sdkVersion");const n=Kn(t.contributes,"contributes");if(!Array.isArray(n.applets)||n.applets.length===0)throw new Error("Extension manifest must contribute at least one Applet");const r=new Set;for(const o of n.applets){const s=Kn(o,"Applet manifest"),i=ta(s.appId,"appId");if(r.has(i))throw new Error(`Extension manifest has duplicate appId: ${i}`);if(r.add(i),ht(s.name,"Applet name"),ht(s.entry,"Applet entry"),!Array.isArray(s.commands))throw new Error("Applet commands must be an array");if(s.layout!=="single-pane"&&s.layout!=="two-pane")throw new Error("Applet layout must be single-pane or two-pane")}if(!Array.isArray(t.dataModels))throw new Error("Extension dataModels must be an array");if(!Array.isArray(t.hostCapabilities))throw new Error("Extension hostCapabilities must be an array");for(const o of t.hostCapabilities)if(!tu.includes(o))throw new Error(`Extension manifest requested unknown Host capability: ${String(o)}`);return e}function Kn(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function ht(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string`);return e}function ta(e,t){const n=ht(e,t);let r;try{r=new URL(n)}catch{throw new Error(`${t} must be a valid HTTPS URL`)}if(r.protocol!=="https:")throw new Error(`${t} must be a valid HTTPS URL`);return n}const Qo=nu({extensionId:"https://undefineds.co/extensions/ai-connections",name:"AI Connection",version:"0.1.0",sdkVersion:"1",contributes:{applets:[{appId:"https://undefineds.co/applets/ai-connections",name:"AI Connection",entry:".",commands:[],layout:"two-pane"}]},dataModels:[],hostCapabilities:["navigation.openExternal","aiClientConfiguration"]}),Ir=Qo.contributes.applets[0],ar={manifest:Ir,createController:Bl,activate(e){e.loadProviders()},slots:{listHeader:$d,list:zl,mainHeader:eu,main:Lo}},na={manifest:Qo,applets:{[Ir.appId]:ar}};function ru(e={}){return e.renderToaster!==!1?na:{...na,applets:{[Ir.appId]:{...ar,slots:{...ar.slots,main:({controller:t})=>p.createElement(Lo,{controller:t,renderToaster:!1})}}}}}function au({collection:e,assertCurrent:t,accountIndex:n,fetch:r=window.fetch.bind(window)}){const o=async(...d)=>{t();const u=await r(...d);try{t()}catch(f){throw u.body?.cancel().catch(()=>{}),f}return u},s=new Set,i=async d=>{t();const u=await xs(d,o,n);if(t(),!u||!new URL(u).pathname.startsWith("/.account/"))throw new Error("客户端凭据地址不属于可信账号服务。");return u},c=(d,u,f)=>(t(),o(d,{method:u,credentials:"include",redirect:"error",headers:bs({Accept:"application/json",...f?{"Content-Type":"application/json"}:{}},n),...f?{body:JSON.stringify(f)}:{}}));return{async create({name:d,webId:u}){if(!d.trim()||!u)throw new Error("创建客户端凭据需要名称和当前 WebID。");const f=await c(await i(e),"POST",{name:d.trim(),webId:u});if(!f.ok)throw new Error(`创建客户端凭据失败(HTTP ${f.status})。`);const h=await f.json();if(t(),typeof h.id!="string"||!h.id||h.id.includes(":")||typeof h.secret!="string"||!h.secret||typeof h.resource!="string"||!h.resource)throw new Error("账号服务未返回有效的客户端凭据。");const A=await i(h.resource),g=new TextEncoder().encode(`${h.id}:${h.secret}`),I=btoa(Array.from(g,m=>String.fromCharCode(m)).join(""));return t(),{apiKey:`sk-${I}`,resource:A}},async list(){const d=await c(await i(e),"GET");if(!d.ok)throw new Error(`读取客户端凭据失败(HTTP ${d.status})。`);const u=await d.json();t();const f=Object.entries(u.clientCredentials??{}),h=await Promise.all(f.map(async([A,g])=>({clientId:A,label:A,resource:await i(String(g))})));return t(),h},async revoke({clientId:d,resource:u,webId:f}){const h=await i(u),A=JSON.stringify([h,d,f]),g=await c(h,"GET");if(g.status===404||g.status===410){if(s.has(A))return;throw new Error("无法确认客户端凭据已撤销,请检查当前 Account 登录;Key 记录已保留。")}if(!g.ok)throw new Error(`读取客户端凭据失败(HTTP ${g.status})。`);const I=await g.json();if(t(),I.id!==d||I.webId!==f)throw new Error("客户端凭据与当前 Key 或 WebID 不匹配,未执行删除。");const m=await c(h,"DELETE");if(!m.ok)throw new Error(`撤销客户端凭据失败(HTTP ${m.status})。`);s.add(A)}}}var ou=Qs(),su=Hs();const iu=[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"]}],$t=[{id:"openai-compatible",label:"OpenAI Compatible",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],consoleUrl:"https://undefineds.co",subscriptionUrl:"https://undefineds.co",endpoints:[{protocol:"chatCompletions",baseUrl:"https://example.invalid/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"unsupported",url:"https://undefineds.co"}},{id:"anthropic-compatible",label:"Anthropic Compatible",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],consoleUrl:"https://undefineds.co",subscriptionUrl:"https://undefineds.co",endpoints:[{protocol:"anthropic",baseUrl:"https://example.invalid/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"unsupported",url:"https://undefineds.co"}}],Tn="https://www.kimi.com/code",cu="https://www.kimi.com/user/agreement",lu="https://api.kimi.com/coding/v1",du="https://api.kimi.com/coding/",uu="https://platform.moonshot.cn/console/api-keys",ra="https://platform.moonshot.cn/console/account",fu="https://platform.moonshot.cn/docs/intro",pu="https://api.moonshot.ai/v1",en="https://bailian.console.aliyun.com/",tn="https://help.aliyun.com/zh/model-studio/",aa="https://open.bigmodel.cn/usercenter/apikeys",oa="https://open.bigmodel.cn/",hu="https://open.bigmodel.cn/api/paas/v4",mu="https://open.bigmodel.cn/api/coding/paas/v4",gu={openai:[{id:"official-subscription",label:"OpenAI Subscription",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth","local"],productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:[],consoleUrl:"https://chatgpt.com/codex",subscriptionUrl:"https://chatgpt.com/codex",endpoints:[{protocol:"responses",baseUrl:"https://chatgpt.com/backend-api/codex"}],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"responses"},quota:{strategy:"subscription",url:"https://chatgpt.com/codex"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"},{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.openai.com/api-keys",subscriptionUrl:"https://platform.openai.com/settings/organization/billing/overview",endpoints:[{protocol:"responses",baseUrl:"https://api.openai.com/v1"},{protocol:"chatCompletions",baseUrl:"https://api.openai.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"responses"},quota:{strategy:"providerApi",url:"https://platform.openai.com/usage"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"}],anthropic:[{id:"official-subscription",label:"Claude Code Subscription",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth"],productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:[],consoleUrl:"https://claude.ai/",subscriptionUrl:"https://claude.ai/settings/billing",endpoints:[],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"subscription",url:"https://claude.ai/settings/usage"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"},{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:["sk-ant-"],consoleUrl:"https://console.anthropic.com/settings/keys",subscriptionUrl:"https://console.anthropic.com/settings/plans",endpoints:[{protocol:"anthropic",baseUrl:"https://api.anthropic.com/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"console",url:"https://console.anthropic.com/settings/limits"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"}],kimi:[sa({id:"subscription-key",label:"Token Plan",kind:"token-plan",authModes:["apiKey"],productLabel:"Kimi Coding",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-kimi-"],baseUrl:lu,anthropicBaseUrl:du,quotaStrategy:"subscription",quotaUrl:Tn,consoleUrl:Tn,subscriptionUrl:Tn,usagePolicyUrl:cu,supportsDeveloperMessages:!1}),sa({id:"api-platform",label:"API Platform",kind:"api-platform",authModes:["apiKey"],productLabel:"Moonshot AI",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-"],baseUrl:pu,quotaStrategy:"console",quotaUrl:ra,consoleUrl:uu,subscriptionUrl:ra,usagePolicyUrl:fu})],bailian:[nn({id:"pay-as-you-go",label:"Pay as You Go",kind:"api-platform",runtimeProviderIds:["bailian"],credentialPrefixHints:["sk-"],region:"cn",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"console",consoleUrl:en,usagePolicyUrl:tn}),nn({id:"token-plan",label:"Token Plan Personal",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:en,usagePolicyUrl:tn}),nn({id:"token-plan-team",label:"Token Plan Team",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:en,usagePolicyUrl:tn}),nn({id:"coding-plan",label:"Coding Plan Pro",kind:"token-plan",runtimeProviderIds:["bailian-coding-plan"],credentialPrefixHints:["sk-sp-"],region:"cn",baseUrl:"https://coding.dashscope.aliyuncs.com/v1",anthropicBaseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:en,usagePolicyUrl:tn})],deepseek:[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"DeepSeek",runtimeProviderIds:["deepseek"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.deepseek.com/api_keys",subscriptionUrl:"https://platform.deepseek.com/usage",endpoints:[{protocol:"chatCompletions",baseUrl:"https://api.deepseek.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://platform.deepseek.com/usage"},usagePolicyUrl:"https://cdn.deepseek.com/policies/en-US/deepseek-open-platform-terms-of-use.html",region:"global"}],ollama:[{id:"local",label:"Local Ollama",kind:"local",lifecycle:"active",authModes:["local"],productLabel:"Ollama",runtimeProviderIds:["ollama"],credentialPrefixHints:[],consoleUrl:"https://ollama.com",subscriptionUrl:"https://ollama.com",endpoints:[{protocol:"chatCompletions",baseUrl:"http://localhost:11434/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"unsupported",url:"https://ollama.com"},usagePolicyUrl:"https://ollama.com",region:"local"}],zhipu:[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:aa,subscriptionUrl:"https://open.bigmodel.cn/finance-center/expense-manage",endpoints:[{protocol:"chatCompletions",baseUrl:hu,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://open.bigmodel.cn/finance-center/expense-manage"},usagePolicyUrl:oa,region:"cn"},{id:"coding-plan",label:"GLM Coding Plan",kind:"token-plan",lifecycle:"active",authModes:["apiKey"],productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:aa,subscriptionUrl:"https://bigmodel.cn/glm-coding",endpoints:[{protocol:"chatCompletions",baseUrl:mu,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"subscription",url:"https://bigmodel.cn/glm-coding"},usagePolicyUrl:oa,region:"cn"}]};function sa(e){return{id:e.id,label:e.label,kind:e.kind,lifecycle:"active",authModes:e.authModes,productLabel:e.productLabel,runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.subscriptionUrl,endpoints:Ho(e.baseUrl,e.anthropicBaseUrl,"cn",e.supportsDeveloperMessages),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.quotaUrl},usagePolicyUrl:e.usagePolicyUrl,region:"cn"}}function nn(e){return{id:e.id,label:e.label,lifecycle:"active",productLabel:"Alibaba Bailian",kind:e.kind,authModes:["apiKey"],runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.consoleUrl,endpoints:Ho(e.baseUrl,e.anthropicBaseUrl,e.region),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.consoleUrl},usagePolicyUrl:e.usagePolicyUrl,region:e.region}}function Ho(e,t,n,r){return[{protocol:"chatCompletions",baseUrl:e,region:n,...r===void 0?{}:{supportsDeveloperMessages:r}},...t?[{protocol:"anthropic",baseUrl:t,region:n}]:[]]}function qo(e,t=!1){return(gu[e]??iu).map(n=>e==="openai"&&n.id==="official-subscription"&&t?{...n,lifecycle:"active",authModes:Array.from(new Set([...n.authModes??[],"local"])),authorizationMethods:[{id:"device-code",authMode:"deviceCode",connectMode:"deviceCodeOAuth",label:"设备码登录",lifecycle:"active"},{id:"local-session-import",authMode:"local",label:"已有登录态",lifecycle:"active"}]}:{...n})}function Au(e,t){return e==="anthropic"||t==="anthropic-compatible"?"anthropic":"openai"}function pn(e){switch(e){case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"kimi":return"Kimi";case"bailian":return"百炼";case"deepseek":return"DeepSeek";case"zhipu":return"智谱 AI";case"ollama":return"Ollama";case"custom":return"Custom"}}function mt(e,t){return e==="openai"&&(t==="local"||t==="oauth"||t==="deviceCode")?"official-subscription":e==="kimi"&&(t==="oauth"||t==="deviceCode")?"subscription-key":e==="bailian"?"pay-as-you-go":e==="ollama"?"local":e==="custom"?"openai-compatible":"api-platform"}function ia(e,t){const n=qo(e).find(o=>o.id===(t??mt(e,"apiKey")));if(!n)return;const r=n.modelDiscovery?.endpointProtocol;return n.endpoints?.find(o=>o.protocol===r)?.baseUrl??n.endpoints?.[0]?.baseUrl}const Rt=Array.from(new Set([...Ca,"zhipu","ollama","custom"])),ca=new WeakMap;function yu(e){wu(),ws({createQueryEngine:async()=>new qs.QueryEngine});const t=new URL("settings/-/sparql",e.podUrl).toString();return Y.setSparqlEndpoint(t),ce.setSparqlEndpoint(t),Be.setSparqlEndpoint(t),{async listModels(){return await e.database.init?.(Be),(await e.database.select().from(Be).execute()).map(ku).filter(bt)},async listProviders(){await e.database.init?.(Y,ce,Be);const n=await e.database.select().from(Y).execute(),r=await e.database.select().from(ce).execute(),o=await e.database.select().from(Be).execute();return Cu(e,n,r,o)},async createApiKeyCredential(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const s=Y.buildId({id:`${o}-${crypto.randomUUID()}`}),i=1,c=r.offeringId??mt(o,"apiKey"),d=r.baseUrl??ia(o,c),u=Hn(r.proxyUrl),f={id:s,provider:o==="custom"?Du(s):Qn(o,c),service:"ai",authMode:"apiKey",status:"active",accountLabel:r.label,label:r.label,baseUrl:d,proxyUrl:u,keyVersion:String(i),reauthRequired:!1,encryptedSecret:rn(e,o,s,{type:"apiKey",apiKey:r.apiKey}),encryptionAlgorithm:"PLAINTEXT",metadata:{offeringId:c,priority:r.priority??100,enabled:!0,health:"unknown",baseUrl:d,...r.compatibility?{compatibility:r.compatibility}:{}}};return await e.database.insert(Y).values(f).execute(),Ee(e,o,f)},async createLocalCredential(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const s=Y.buildId({id:`${o}-local-${crypto.randomUUID()}`}),i=r.offeringId??mt(o,"local"),c=r.baseUrl??ia(o,i),d={id:s,provider:Qn(o,i),service:"ai",authMode:"local",status:"active",accountLabel:r.label??"Local",label:r.label??"Local",baseUrl:c,keyVersion:"1",reauthRequired:!1,encryptedSecret:rn(e,o,s,{type:"local"}),encryptionAlgorithm:"PLAINTEXT",metadata:{offeringId:i,priority:r.priority??100,enabled:!0,health:"unknown",baseUrl:c}};return await e.database.insert(Y).values(d).execute(),Ee(e,o,d)},async saveOAuthCredential(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");const i=(ca.get(e.database)??Promise.resolve()).then(async()=>{await e.database.init?.(Y,ce);const c=Ot(o,r.offeringId??mt(o,"deviceCode"))??mt(o,"deviceCode"),u=(await e.database.select().from(Y).execute()).find(x=>{const F=Ee(e,o,x);if(!F||F.authMode!=="deviceCode"&&F.authMode!=="oauth"||Ot(o,F.offeringId)!==c||x.status!=="active"&&x.status!=="disabled")return!1;const v=Ft(e,o,F.id,x.encryptedSecret);return Eu(r,Se(x.metadata),v)}),f=u&&Ee(e,o,u),h=Se(u?.metadata),A=f&&Ft(e,o,f.id,u?.encryptedSecret),g=f?.id??Y.buildId({id:`${o}-oauth-${crypto.randomUUID()}`}),I=r.accountLabel??"OAuth",m=r.accountId??D(h?.accountId)??D(A?.accountId),E=r.accountSubject??D(h?.authoritativeSubject)??D(A?.accountSubject)??D(A?.authoritativeSubject),P={...u,id:g,provider:Qn(o,c),service:"ai",authMode:"deviceCodeOAuth",status:f?.enabled===!1?"disabled":"active",accountLabel:u?.accountLabel??I,label:u?.label??I,expiresAt:r.expiresAt,scopes:r.scope?r.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String((f?.version??0)+1),reauthRequired:!1,encryptedSecret:rn(e,o,g,{type:"deviceCodeOAuth",accessToken:r.accessToken,refreshToken:r.refreshToken,expiresAt:r.expiresAt,scope:r.scope,idToken:r.idToken,accountId:m,accountSubject:E,accountLabel:r.accountLabel,offeringId:c,authorizationMethodId:r.authorizationMethodId}),encryptionAlgorithm:"PLAINTEXT",metadata:{...h,offeringId:c,priority:f?.priority??100,enabled:f?.enabled??!0,health:"healthy",authoritativeSubject:E,accountId:m,authorizationMethodId:r.authorizationMethodId}};if(u){const x={...P};if(delete x.id,!await e.database.updateById(Y,g,x))throw new Error("credential_version_conflict")}else await e.database.insert(Y).values(P).execute();return Ee(e,o,P)});return ca.set(e.database,i.then(()=>{},()=>{})),i},async updateOAuthCredential(n,r,o,s){const i=Te(n);if(!i)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const c=await e.database.findById(Y,r),d=c&&Ee(e,i,c);if(!c||!d||d.authMode!=="deviceCode")throw new Error("oauth_credential_not_found");if(d.version!==o)throw new Error("credential_version_conflict");const u=Ft(e,i,r,c.encryptedSecret),f=s.accountId??D(Se(c.metadata)?.accountId)??D(u?.accountId),h=s.accountSubject??D(Se(c.metadata)?.authoritativeSubject)??D(u?.accountSubject)??D(u?.authoritativeSubject),A={expiresAt:s.expiresAt,scopes:s.scope?s.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String(o+1),reauthRequired:!1,status:"active",encryptedSecret:rn(e,i,r,{type:"deviceCodeOAuth",accessToken:s.accessToken,refreshToken:s.refreshToken,expiresAt:s.expiresAt,scope:s.scope,idToken:s.idToken,accountId:f,accountSubject:h,accountLabel:s.accountLabel??D(c.accountLabel),offeringId:s.offeringId??d.offeringId,authorizationMethodId:s.authorizationMethodId??D(Se(c.metadata)?.authorizationMethodId)}),accountLabel:s.accountLabel??D(c.accountLabel),label:s.accountLabel??D(c.label),metadata:{...Se(c.metadata),offeringId:s.offeringId??d.offeringId,enabled:!0,health:"healthy",authoritativeSubject:h,accountId:f,authorizationMethodId:s.authorizationMethodId??D(Se(c.metadata)?.authorizationMethodId)}},g=await e.database.updateById(Y,r,A);if(!g)throw new Error("credential_version_conflict");return Ee(e,i,g)},async updateProviderCredential(n,r,o){const s=Te(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const i=await e.database.findById(Y,r),c=i&&Ee(e,s,i);if(!i||!c)throw new Error("credential_not_found");if(c.version!==o.expectedVersion)throw new Error("credential_version_conflict");const d={...Se(i.metadata),...o.priority===void 0?{}:{priority:o.priority},...o.enabled===void 0?{}:{enabled:o.enabled},...o.baseUrl===void 0?{}:{baseUrl:o.baseUrl},...o.proxyUrl===void 0?{}:{proxyUrl:Hn(o.proxyUrl)}},u={...o.label===void 0?{}:{accountLabel:o.label,label:o.label},...o.baseUrl===void 0?{}:{baseUrl:o.baseUrl},...o.proxyUrl===void 0?{}:{proxyUrl:Hn(o.proxyUrl)},...o.enabled===void 0?{}:{status:o.enabled?"active":"disabled"},keyVersion:String(c.version+1),metadata:d},f=await e.database.updateById(Y,r,u);if(!f)throw new Error("credential_update_failed");const h=Ee(e,s,f);if(!h)throw new Error("credential_update_failed");return h},async markCredentialHealth(n,r,o,s){const i=Te(n);if(!i)throw new Error("unsupported_provider");await e.database.init?.(Y);const c=await e.database.findById(Y,r),d=c&&Ee(e,i,c);if(!c||!d)throw new Error("credential_not_found");if(d.version!==s)throw new Error("credential_version_conflict");const u=await e.database.updateById(Y,r,{keyVersion:String(d.version+1),metadata:{...Se(c.metadata),health:o}});if(!u)throw new Error("credential_update_failed");const f=Ee(e,i,u);if(!f)throw new Error("credential_update_failed");return f},async deleteProviderCredential(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");await e.database.init?.(Y,ce);const s=await e.database.findById(Y,r),i=s&&Ee(e,o,s);if(i)return await e.database.deleteById(Y,r),i},async readCredentialSecret(n,r){const o=Te(n);if(!o)throw new Error("unsupported_provider");const s=await e.database.findById(Y,r);if(!s||!Ee(e,o,s))throw new Error("credential_not_found");const i=Ft(e,o,r,s.encryptedSecret);if(!i)throw new Error("credential_secret_unavailable");return i},async saveDiscoveredModels(n,r,o){const s=Te(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(Y,ce,Be);const i=await la(e,r),c=ua(s,i);await fa(e.database,c,pn(s));const d=await e.database.select().from(Be).execute(),u=new Set(d.map(A=>D(A.id)).filter(bt)),f=o.map(Pu).filter(bt),h=new Set(f.map(A=>A.id));for(const A of d.filter(g=>lt(D(g.isProvidedBy),c))){const g=dt(D(A.id),c);g&&!h.has(g)&&D(A.status)!=="unavailable"&&await e.database.updateById(Be,String(A.id),{status:"unavailable"})}for(const A of f)await Uu(e.database,c,A,u)},async saveModelSelection(n,r,o){const s=Te(n);if(!s)throw new Error("unsupported_provider");await e.database.init?.(ce,Be);const i=s==="custom"&&o?await la(e,o):null;if(s==="custom"&&o&&!i)throw new Error("credential_not_found");const c=i?ua(s,i):ce.buildId({id:s});await fa(e.database,c,pn(s));const u=(await e.database.select().from(ce).execute()).find(m=>lt(D(m.id),c)),f=D(u?.id)??c,h=Jo(u?.hasModel),A=await e.database.select().from(Be).execute(),g=[...new Set(r.map(m=>Bu(s,m,A,i?c:void 0)))];if(!await e.database.updateById(ce,f,{hasModel:g}))throw new Error("provider_model_selection_update_failed");e.authenticatedFetch&&await bu(e,f,h,g)}}}const xu="https://undefineds.co/ns#hasModel";async function bu(e,t,n,r){const o=Ln(ce,e.podUrl,t),s=n.map(f=>Ln(Be,e.podUrl,f)),i=r.map(f=>Ln(Be,e.podUrl,f)),c=f=>f.map(h=>`<${o}> <${xu}> <${h}> .`).join(`
|
|
9
9
|
`),d=[s.length>0?`DELETE DATA { ${c(s)} }`:void 0,i.length>0?`INSERT DATA { ${c(i)} }`:void 0].filter(f=>!!f);if(d.length===0)return;const u=await e.authenticatedFetch(o.split("#",1)[0],{method:"PATCH",headers:{"content-type":"application/sparql-update"},body:d.join(`;
|
|
10
|
-
`)});if(!u.ok)throw new Error(`provider_model_selection_persist_failed:${u.status}`)}function Ln(e,t,n){return/^https?:\/\//u.test(n)?n:e.buildIri(t,{id:n})}async function la(e,t){const n=await e.database.findById(Y,t);return n||((await e.database.select().from(Y).execute()).find(o=>{const s=D(o.id);return s===t||(s?Y.buildIri(e.podUrl,{id:s})===t:!1)})??null)}function wu(){da(ou.ActionObserverHttp.prototype),da(su.ActionObserverHttp.prototype)}function da(e){const t=e;if(t.__xpodObservedActorsPatch)return;const n=t.onRun;t.onRun=function(r,o,s){return Array.isArray(this.observedActors)||(this.observedActors=[]),n.call(this,r,o,s)},t.__xpodObservedActorsPatch=!0}function Cu(e,t,n,r){const o=t.filter(s=>D(s.service)==="ai").filter(s=>D(s.status)!=="revoked");return Rt.map(s=>{const i=o.map(f=>Ee(e,s,f)).filter(bt).sort((f,h)=>f.priority-h.priority||f.id.localeCompare(h.id)),c=n.find(f=>ft(D(f.id))===s),u=Jo(c?.hasModel).map(f=>ju(s,f,r));return{id:s,name:s==="custom"?i.find(f=>f.label)?.label??pn(s):pn(s),offerings:s==="custom"?Su(o.filter(f=>Ee(e,s,f))):Ho(s,e.openAiSubscriptionImportAvailable===!0),credentials:i,selectedModels:u,status:Mu(i)}})}function rn(e,t,n,r){return JSON.stringify({algorithm:"PLAINTEXT",encoding:"base64",ciphertext:vu(r),webId:e.webId,credentialIri:Y.buildIri(e.podUrl,{id:n}),provider:t})}function vu(e){const t=new TextEncoder().encode(JSON.stringify(e));let n="";for(const r of t)n+=String.fromCharCode(r);return btoa(n)}function Eu(e,t,n){let r=!1;for(const[o,s]of[[e.accountId,[t?.accountId,n?.accountId]],[e.accountSubject,[t?.authoritativeSubject,n?.accountSubject,n?.authoritativeSubject]]]){const i=[...new Set(s.map(D).filter(bt).filter(c=>c.trim()))];if(i.length>1)return!1;if(!(!o?.trim()||!i.length)){if(i[0]!==o)return!1;r=!0}}return r}function Ee(e,t,n){const r=D(n.id);if(!r)return;const o=jr(D(n.provider))??Ou(r);if(o!==t)return;const s=Se(n.metadata),i=Tu(n.authMode);if(i)return{id:r,provider:o,offeringId:D(s?.offeringId)??kr(D(n.provider))??mt(o,i),authMode:i,label:D(n.accountLabel)??D(n.label),enabled:ha(s?.enabled)??D(n.status)==="active",priority:pa(s?.priority)??100,health:Lu(s?.health)??(ha(n.reauthRequired)?"expired":"healthy"),maskedHint:Nu(e,o,r,n.encryptedSecret),baseUrl:D(n.baseUrl),proxyUrl:Ku(D(n.proxyUrl)??D(s?.proxyUrl)),compatibility:Iu(s?.compatibility),expiresAt:Qu(n.expiresAt),version:pa(n.keyVersion)??0}}function Iu(e){return e==="auto"||e==="openai"||e==="anthropic"?e:void 0}function ju(e,t,n){const r=n.find(c=>rt(D(c.id))===rt(t)),o=D(r?.isProvidedBy),s=r?dt(t,o??e)??t:dt(t,e)??t,i=r??n.find(c=>{const d=D(c.id),u=D(c.isProvidedBy);return d===t||dt(d,e)===s||jr(u)===e&&dt(d,u??e)===s});return{id:s,provider:e,offeringId:kr(D(i?.isProvidedBy)),credentialId:Vo(o),resourceId:D(i?.id)??t,displayName:D(i?.displayName),availability:D(i?.status)==="unavailable"||!i?"unavailable":"available"}}function ku(e){const t=D(e.isProvidedBy),n=jr(t),r=n&&dt(D(e.id),t??n);if(!(!n||!r))return{id:r,provider:n,offeringId:kr(t),credentialId:Vo(t),resourceId:D(e.id),displayName:D(e.displayName),availability:D(e.status)==="unavailable"?"unavailable":"available"}}function Pu(e){const t=Se(e),n=D(t?.id);if(n)return{id:n,displayName:D(t?.displayName)}}function ua(e,t){const n=D(t?.provider),r=rt(n),o=ft(n);if(r&&o&&o!==e&&r.includes("#"))return ce.buildId({id:r});const s=D(Se(t?.metadata)?.offeringId),i=Ot(e,s??Fu(e,o));return i?ce.buildId({id:`${e}-${i}.ttl#this`}):ce.buildId({id:e})}function Qn(e,t){const n=Ot(e,t)??t;return ce.buildId({id:`${e}-${n}.ttl#this`})}function Du(e){return ce.buildId({id:`custom-instance-${encodeURIComponent(e)}.ttl#this`})}function Vo(e){const t=ft(e),n=t?.startsWith("custom-instance-")?t.slice(16):void 0;if(n)try{return decodeURIComponent(n)}catch{return}}function Ot(e,t){if(!t)return;const n=t.trim().toLowerCase();if(e==="bailian"){if(n==="token-plan")return"token-plan-personal";if(n==="coding-plan")return"coding-plan-pro";if(n==="payg")return"pay-as-you-go"}return n}function Fu(e,t){if(!(!t||t===e)&&e==="bailian"){if(t==="bailian-token-plan")return"token-plan-personal";if(t==="bailian-coding-plan")return"coding-plan-pro"}}function lt(e,t){const n=rt(e),r=rt(t);return n!==void 0&&n===r}async function fa(e,t,n){(await e.select().from(ce).execute()).some(o=>lt(D(o.id),t))||await e.insert(ce).values({id:t,displayName:n}).execute()}async function Uu(e,t,n,r){const o=zo(t,n.id),s={displayName:n.displayName??n.id,isProvidedBy:t,status:"active"};if(r.has(o)){await e.updateById(Be,o,s);return}await e.insert(Be).values({id:o,...s}).execute(),r.add(o)}function zo(e,t){const n=rt(e)??`${e}.ttl`;return`${n.split("#",1)[0]??n}#${encodeURIComponent(t)}`}function Bu(e,t,n,r){const o=D(t.resourceId),s=Ot(e,D(t.offeringId)),i=r??(s?ce.buildId({id:`${e}-${s}.ttl#this`}):ce.buildId({id:e})),c=D(t.id),d=c?n.filter(f=>{const h=D(f.isProvidedBy),A=ft(h);return(r?lt(h,r):A===e||A?.startsWith(`${e}-`)===!0)&&dt(D(f.id),h??i)===c}):[],u=r?d[0]:s?d.find(f=>lt(D(f.isProvidedBy),i)):d.length===1?d[0]:void 0;if(o){const f=n.find(m=>D(m.id)===o);if(!f&&u)return String(u.id);const h=D(f?.isProvidedBy),A=ft(h),g=r?lt(h,r):A===e||A?.startsWith(`${e}-`)===!0,I=!!r||!s||lt(h,i);if(!f||!g||!I)throw new Error("invalid_model_selection_resource");return o}if(!c)throw new Error("invalid_model_selection_resource");return D(u?.id)??zo(i,c)}function dt(e,t){if(!e)return;const r=rt(t)?.split("#",1)[0]??t,o=r.endsWith(".ttl")?`${r}#`:`${r}.ttl#`,s=e.lastIndexOf(o);if(!(s<0))try{return decodeURIComponent(e.slice(s+o.length))}catch{return e.slice(s+o.length)}}function Jo(e){if(Array.isArray(e))return e.map(D).filter(bt);const t=D(e);return t?[t]:[]}function Su(e){const t=new Map;for(const n of e){const r=Se(n.metadata),o=D(r?.offeringId)??"openai-compatible",s=Au(r?.compatibility,o),i=D(n.baseUrl)??D(r?.baseUrl),c=$t.find(d=>d.id===o)??$t.find(d=>d.id===`${s}-compatible`)??$t[0];t.set(o,{...c,id:o,endpoints:i?[{protocol:s==="anthropic"?"anthropic":"chatCompletions",baseUrl:i}]:c.endpoints,modelDiscovery:s==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}})}return t.size>0?[...t.values()]:$t}function Mu(e){return e.some(t=>t.health==="expired"||t.health==="invalid")?"attention":e.some(t=>t.enabled)?"available":e.length>0?"configured":"unconfigured"}function Nu(e,t,n,r){const o=Ft(e,t,n,r),s=D(o?.apiKey);if(s)return s.length<=8?`${s.slice(0,2)}…`:`${s.slice(0,3)}...${s.slice(-4)}`}function Ft(e,t,n,r){if(!(typeof r!="string"||!r.trim()))try{const o=JSON.parse(r);if(o.algorithm!=="PLAINTEXT"||o.webId!==e.webId||o.provider!==t)return;const s=Y.buildIri(e.podUrl,{id:n});if(o.credentialIri!==s)return;const i=o.encoding==="base64"?Ru(String(o.ciphertext)):JSON.parse(String(o.ciphertext));return Se(i)}catch{return}}function Ru(e){const t=atob(e),n=Uint8Array.from(t,r=>r.charCodeAt(0));return JSON.parse(new TextDecoder().decode(n))}function jr(e){const t=ft(e),n=Te(t);return n||Rt.find(r=>t?.startsWith(`${r}-`))}function kr(e){const t=ft(e);if(t&&!t.startsWith("custom-instance-")){if(t==="bailian-token-plan-personal")return"token-plan";if(t==="bailian-token-plan-team")return"token-plan-team";if(t==="bailian-coding-plan-pro")return"coding-plan";if(t==="bailian-pay-as-you-go")return"pay-as-you-go";for(const n of Rt)if(t.startsWith(`${n}-`))return t.slice(n.length+1)}}function Ou(e){const t=/\/([^/#]+)\.ttl#/u.exec(e);return Te(t?.[1])}function Te(e){if(typeof e!="string"||!e.trim())return;const t=e.trim().toLowerCase();if(t==="zhipu"||t.startsWith("zhipu-"))return"zhipu";if(Rt.includes(t))return t;for(const n of Rt)if(t.startsWith(`${n}-`)||n==="bailian"&&(t==="bailian-token-plan"||t==="bailian-coding-plan"))return n}function qn(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{throw new Error("invalid_proxy_url")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash||!t.hostname)throw new Error("invalid_proxy_url");return t.toString().replace(/\/$/u,"")}function Ku(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{return}if(!(!["http:","https:"].includes(t.protocol)||!t.hostname))return t.username="",t.password="",t.search="",t.hash="",t.toString().replace(/\/$/u,"")}function rt(e){if(!e)return;const t=e.split("#",1)[0]??e,n=t.split("/").filter(Boolean).at(-1)??t;if(!n)return;const r=n.endsWith(".ttl")?n:`${n}.ttl`,o=e.indexOf("#");return o<0?r:`${r}${e.slice(o)}`}function ft(e){const t=rt(e);if(t)return(t.split("#",1)[0]??t).replace(/\.ttl$/u,"")}function Tu(e){if(e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local")return e;if(e==="deviceCodeOAuth")return"deviceCode"}function Lu(e){if(e==="healthy"||e==="expired"||e==="invalid"||e==="unknown")return e;if(e==="reauthRequired")return"expired";if(e==="disabled")return"unknown"}function Se(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function D(e){return typeof e=="string"&&e.trim()?e:void 0}function pa(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()){const t=Number(e);return Number.isFinite(t)?t:void 0}}function ha(e){if(typeof e=="boolean")return e;if(e==="true")return!0;if(e==="false")return!1}function Qu(e){return e instanceof Date?e.toISOString():D(e)}function bt(e){return e!==void 0}const Go=ru({renderToaster:!1}),ma=Go.manifest.contributes.applets[0]?.appId,Xo=ma?Go.applets[ma]:void 0;if(!Xo)throw new Error("AI Connection extension did not contribute an applet");const qu=Xo;function Hu(e,t){const n=vs({runtime:e}),r=e.currentPod?.podUrl??e.selectedStorage?.storageUrl??e.podUrl,o=e.currentPod?{status:"ready",current:e.currentPod}:e.podError?{status:"error",error:e.podError.error}:e.state.status==="authenticated"?{status:"opening"}:e.state.status==="error"?{status:"error",error:e.state.error}:{status:"unavailable"},s=window.fetch.bind(window);return{solid:{session:{getSnapshot:()=>e.session.getSnapshot(),subscribe:i=>e.session.subscribe(i),fetch:e.fetch},pod:o,permissions:{...ul({fetch:e.fetch})},requireLogin:async()=>{await n.startLogin()}},navigation:{openExternal:async i=>{window.open(i,"_blank","noopener,noreferrer")}},capabilities:{aiClientCredentials:t?.controls?.account?.clientCredentials&&t.bindAccountCapability?au({collection:t.controls.account.clientCredentials,assertCurrent:t.bindAccountCapability(),accountIndex:t.idpIndex,fetch:s}):void 0,aiConnectionsPodStore:e.currentPod?yu({database:e.currentPod.database,authenticatedFetch:e.fetch,podUrl:e.currentPod.podUrl,webId:e.currentPod.webId}):void 0,aiClientConfiguration:r&&(globalThis.xpodDesktop!==void 0||e.aiClientConfiguration?.available===!0&&e.aiClientConfiguration.authority==="local-filesystem")?Ps({podUrl:r,controlPlaneOrigin:window.location.origin,authenticatedFetch:e.fetch,invocationFetch:s}):void 0}}}function Vu(e){const t=p.useContext(Cs),n=p.useMemo(()=>Hu(e,t),[e,t]);return p.useMemo(()=>{const r=Al(qu,n);if(r.layout!=="two-pane")throw new Error("AI Connection applet must use a two-pane layout");return r},[n])}function ef(){const e=Es(),t=Vu(e);return a.jsx(Fs,{listHeader:t.slots.listHeader,list:t.slots.list,mainHeader:t.slots.mainHeader,main:t.slots.main,mode:"auto"})}export{ef as default};
|
|
10
|
+
`)});if(!u.ok)throw new Error(`provider_model_selection_persist_failed:${u.status}`)}function Ln(e,t,n){return/^https?:\/\//u.test(n)?n:e.buildIri(t,{id:n})}async function la(e,t){const n=await e.database.findById(Y,t);return n||((await e.database.select().from(Y).execute()).find(o=>{const s=D(o.id);return s===t||(s?Y.buildIri(e.podUrl,{id:s})===t:!1)})??null)}function wu(){da(ou.ActionObserverHttp.prototype),da(su.ActionObserverHttp.prototype)}function da(e){const t=e;if(t.__xpodObservedActorsPatch)return;const n=t.onRun;t.onRun=function(r,o,s){return Array.isArray(this.observedActors)||(this.observedActors=[]),n.call(this,r,o,s)},t.__xpodObservedActorsPatch=!0}function Cu(e,t,n,r){const o=t.filter(s=>D(s.service)==="ai").filter(s=>D(s.status)!=="revoked");return Rt.map(s=>{const i=o.map(f=>Ee(e,s,f)).filter(bt).sort((f,h)=>f.priority-h.priority||f.id.localeCompare(h.id)),c=n.find(f=>ft(D(f.id))===s),u=Jo(c?.hasModel).map(f=>ju(s,f,r));return{id:s,name:s==="custom"?i.find(f=>f.label)?.label??pn(s):pn(s),offerings:s==="custom"?Su(o.filter(f=>Ee(e,s,f))):qo(s,e.openAiSubscriptionImportAvailable===!0),credentials:i,selectedModels:u,status:Mu(i)}})}function rn(e,t,n,r){return JSON.stringify({algorithm:"PLAINTEXT",encoding:"base64",ciphertext:vu(r),webId:e.webId,credentialIri:Y.buildIri(e.podUrl,{id:n}),provider:t})}function vu(e){const t=new TextEncoder().encode(JSON.stringify(e));let n="";for(const r of t)n+=String.fromCharCode(r);return btoa(n)}function Eu(e,t,n){let r=!1;for(const[o,s]of[[e.accountId,[t?.accountId,n?.accountId]],[e.accountSubject,[t?.authoritativeSubject,n?.accountSubject,n?.authoritativeSubject]]]){const i=[...new Set(s.map(D).filter(bt).filter(c=>c.trim()))];if(i.length>1)return!1;if(!(!o?.trim()||!i.length)){if(i[0]!==o)return!1;r=!0}}return r}function Ee(e,t,n){const r=D(n.id);if(!r)return;const o=jr(D(n.provider))??Ou(r);if(o!==t)return;const s=Se(n.metadata),i=Tu(n.authMode);if(i)return{id:r,provider:o,offeringId:D(s?.offeringId)??kr(D(n.provider))??mt(o,i),authMode:i,label:D(n.accountLabel)??D(n.label),enabled:ha(s?.enabled)??D(n.status)==="active",priority:pa(s?.priority)??100,health:Lu(s?.health)??(ha(n.reauthRequired)?"expired":"healthy"),maskedHint:Nu(e,o,r,n.encryptedSecret),baseUrl:D(n.baseUrl),proxyUrl:Ku(D(n.proxyUrl)??D(s?.proxyUrl)),compatibility:Iu(s?.compatibility),expiresAt:Qu(n.expiresAt),version:pa(n.keyVersion)??0}}function Iu(e){return e==="auto"||e==="openai"||e==="anthropic"?e:void 0}function ju(e,t,n){const r=n.find(c=>rt(D(c.id))===rt(t)),o=D(r?.isProvidedBy),s=r?dt(t,o??e)??t:dt(t,e)??t,i=r??n.find(c=>{const d=D(c.id),u=D(c.isProvidedBy);return d===t||dt(d,e)===s||jr(u)===e&&dt(d,u??e)===s});return{id:s,provider:e,offeringId:kr(D(i?.isProvidedBy)),credentialId:Vo(o),resourceId:D(i?.id)??t,displayName:D(i?.displayName),availability:D(i?.status)==="unavailable"||!i?"unavailable":"available"}}function ku(e){const t=D(e.isProvidedBy),n=jr(t),r=n&&dt(D(e.id),t??n);if(!(!n||!r))return{id:r,provider:n,offeringId:kr(t),credentialId:Vo(t),resourceId:D(e.id),displayName:D(e.displayName),availability:D(e.status)==="unavailable"?"unavailable":"available"}}function Pu(e){const t=Se(e),n=D(t?.id);if(n)return{id:n,displayName:D(t?.displayName)}}function ua(e,t){const n=D(t?.provider),r=rt(n),o=ft(n);if(r&&o&&o!==e&&r.includes("#"))return ce.buildId({id:r});const s=D(Se(t?.metadata)?.offeringId),i=Ot(e,s??Fu(e,o));return i?ce.buildId({id:`${e}-${i}.ttl#this`}):ce.buildId({id:e})}function Qn(e,t){const n=Ot(e,t)??t;return ce.buildId({id:`${e}-${n}.ttl#this`})}function Du(e){return ce.buildId({id:`custom-instance-${encodeURIComponent(e)}.ttl#this`})}function Vo(e){const t=ft(e),n=t?.startsWith("custom-instance-")?t.slice(16):void 0;if(n)try{return decodeURIComponent(n)}catch{return}}function Ot(e,t){if(!t)return;const n=t.trim().toLowerCase();if(e==="bailian"){if(n==="token-plan")return"token-plan-personal";if(n==="coding-plan")return"coding-plan-pro";if(n==="payg")return"pay-as-you-go"}return n}function Fu(e,t){if(!(!t||t===e)&&e==="bailian"){if(t==="bailian-token-plan")return"token-plan-personal";if(t==="bailian-coding-plan")return"coding-plan-pro"}}function lt(e,t){const n=rt(e),r=rt(t);return n!==void 0&&n===r}async function fa(e,t,n){(await e.select().from(ce).execute()).some(o=>lt(D(o.id),t))||await e.insert(ce).values({id:t,displayName:n}).execute()}async function Uu(e,t,n,r){const o=zo(t,n.id),s={displayName:n.displayName??n.id,isProvidedBy:t,status:"active"};if(r.has(o)){await e.updateById(Be,o,s);return}await e.insert(Be).values({id:o,...s}).execute(),r.add(o)}function zo(e,t){const n=rt(e)??`${e}.ttl`;return`${n.split("#",1)[0]??n}#${encodeURIComponent(t)}`}function Bu(e,t,n,r){const o=D(t.resourceId),s=Ot(e,D(t.offeringId)),i=r??(s?ce.buildId({id:`${e}-${s}.ttl#this`}):ce.buildId({id:e})),c=D(t.id),d=c?n.filter(f=>{const h=D(f.isProvidedBy),A=ft(h);return(r?lt(h,r):A===e||A?.startsWith(`${e}-`)===!0)&&dt(D(f.id),h??i)===c}):[],u=r?d[0]:s?d.find(f=>lt(D(f.isProvidedBy),i)):d.length===1?d[0]:void 0;if(o){const f=n.find(m=>D(m.id)===o);if(!f&&u)return String(u.id);const h=D(f?.isProvidedBy),A=ft(h),g=r?lt(h,r):A===e||A?.startsWith(`${e}-`)===!0,I=!!r||!s||lt(h,i);if(!f||!g||!I)throw new Error("invalid_model_selection_resource");return o}if(!c)throw new Error("invalid_model_selection_resource");return D(u?.id)??zo(i,c)}function dt(e,t){if(!e)return;const r=rt(t)?.split("#",1)[0]??t,o=r.endsWith(".ttl")?`${r}#`:`${r}.ttl#`,s=e.lastIndexOf(o);if(!(s<0))try{return decodeURIComponent(e.slice(s+o.length))}catch{return e.slice(s+o.length)}}function Jo(e){if(Array.isArray(e))return e.map(D).filter(bt);const t=D(e);return t?[t]:[]}function Su(e){const t=new Map;for(const n of e){const r=Se(n.metadata),o=D(r?.offeringId)??"openai-compatible",s=Au(r?.compatibility,o),i=D(n.baseUrl)??D(r?.baseUrl),c=$t.find(d=>d.id===o)??$t.find(d=>d.id===`${s}-compatible`)??$t[0];t.set(o,{...c,id:o,endpoints:i?[{protocol:s==="anthropic"?"anthropic":"chatCompletions",baseUrl:i}]:c.endpoints,modelDiscovery:s==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}})}return t.size>0?[...t.values()]:$t}function Mu(e){return e.some(t=>t.health==="expired"||t.health==="invalid")?"attention":e.some(t=>t.enabled)?"available":e.length>0?"configured":"unconfigured"}function Nu(e,t,n,r){const o=Ft(e,t,n,r),s=D(o?.apiKey);if(s)return s.length<=8?`${s.slice(0,2)}…`:`${s.slice(0,3)}...${s.slice(-4)}`}function Ft(e,t,n,r){if(!(typeof r!="string"||!r.trim()))try{const o=JSON.parse(r);if(o.algorithm!=="PLAINTEXT"||o.webId!==e.webId||o.provider!==t)return;const s=Y.buildIri(e.podUrl,{id:n});if(o.credentialIri!==s)return;const i=o.encoding==="base64"?Ru(String(o.ciphertext)):JSON.parse(String(o.ciphertext));return Se(i)}catch{return}}function Ru(e){const t=atob(e),n=Uint8Array.from(t,r=>r.charCodeAt(0));return JSON.parse(new TextDecoder().decode(n))}function jr(e){const t=ft(e),n=Te(t);return n||Rt.find(r=>t?.startsWith(`${r}-`))}function kr(e){const t=ft(e);if(t&&!t.startsWith("custom-instance-")){if(t==="bailian-token-plan-personal")return"token-plan";if(t==="bailian-token-plan-team")return"token-plan-team";if(t==="bailian-coding-plan-pro")return"coding-plan";if(t==="bailian-pay-as-you-go")return"pay-as-you-go";for(const n of Rt)if(t.startsWith(`${n}-`))return t.slice(n.length+1)}}function Ou(e){const t=/\/([^/#]+)\.ttl#/u.exec(e);return Te(t?.[1])}function Te(e){if(typeof e!="string"||!e.trim())return;const t=e.trim().toLowerCase();if(t==="zhipu"||t.startsWith("zhipu-"))return"zhipu";if(Rt.includes(t))return t;for(const n of Rt)if(t.startsWith(`${n}-`)||n==="bailian"&&(t==="bailian-token-plan"||t==="bailian-coding-plan"))return n}function Hn(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{throw new Error("invalid_proxy_url")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash||!t.hostname)throw new Error("invalid_proxy_url");return t.toString().replace(/\/$/u,"")}function Ku(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{return}if(!(!["http:","https:"].includes(t.protocol)||!t.hostname))return t.username="",t.password="",t.search="",t.hash="",t.toString().replace(/\/$/u,"")}function rt(e){if(!e)return;const t=e.split("#",1)[0]??e,n=t.split("/").filter(Boolean).at(-1)??t;if(!n)return;const r=n.endsWith(".ttl")?n:`${n}.ttl`,o=e.indexOf("#");return o<0?r:`${r}${e.slice(o)}`}function ft(e){const t=rt(e);if(t)return(t.split("#",1)[0]??t).replace(/\.ttl$/u,"")}function Tu(e){if(e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local")return e;if(e==="deviceCodeOAuth")return"deviceCode"}function Lu(e){if(e==="healthy"||e==="expired"||e==="invalid"||e==="unknown")return e;if(e==="reauthRequired")return"expired";if(e==="disabled")return"unknown"}function Se(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function D(e){return typeof e=="string"&&e.trim()?e:void 0}function pa(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()){const t=Number(e);return Number.isFinite(t)?t:void 0}}function ha(e){if(typeof e=="boolean")return e;if(e==="true")return!0;if(e==="false")return!1}function Qu(e){return e instanceof Date?e.toISOString():D(e)}function bt(e){return e!==void 0}const Go=ru({renderToaster:!1}),ma=Go.manifest.contributes.applets[0]?.appId,Xo=ma?Go.applets[ma]:void 0;if(!Xo)throw new Error("AI Connection extension did not contribute an applet");const Hu=Xo;function qu(e,t){const n=vs({runtime:e}),r=e.currentPod?.podUrl??e.selectedStorage?.storageUrl??e.podUrl,o=e.currentPod?{status:"ready",current:e.currentPod}:e.podError?{status:"error",error:e.podError.error}:e.state.status==="authenticated"?{status:"opening"}:e.state.status==="error"?{status:"error",error:e.state.error}:{status:"unavailable"},s=window.fetch.bind(window);return{solid:{session:{getSnapshot:()=>e.session.getSnapshot(),subscribe:i=>e.session.subscribe(i),fetch:e.fetch},pod:o,permissions:{...ul({fetch:e.fetch})},requireLogin:async()=>{await n.startLogin()}},navigation:{openExternal:async i=>{window.open(i,"_blank","noopener,noreferrer")}},capabilities:{aiClientCredentials:t?.controls?.account?.clientCredentials&&t.bindAccountCapability?au({collection:t.controls.account.clientCredentials,assertCurrent:t.bindAccountCapability(),accountIndex:t.idpIndex,fetch:s}):void 0,aiConnectionsPodStore:e.currentPod?yu({database:e.currentPod.database,authenticatedFetch:e.fetch,podUrl:e.currentPod.podUrl,webId:e.currentPod.webId}):void 0,aiClientConfiguration:r&&(globalThis.xpodDesktop!==void 0||e.aiClientConfiguration?.available===!0&&e.aiClientConfiguration.authority==="local-filesystem")?Ps({podUrl:r,controlPlaneOrigin:window.location.origin,authenticatedFetch:e.fetch,invocationFetch:s}):void 0}}}function Vu(e){const t=p.useContext(Cs),n=p.useMemo(()=>qu(e,t),[e,t]);return p.useMemo(()=>{const r=Al(Hu,n);if(r.layout!=="two-pane")throw new Error("AI Connection applet must use a two-pane layout");return r},[n])}function ef(){const e=Es(),t=Vu(e);return a.jsx(Fs,{listHeader:t.slots.listHeader,list:t.slots.list,mainHeader:t.slots.mainHeader,main:t.slots.main,mode:"auto"})}export{ef as default};
|