@undefineds.co/xpod 0.4.29 → 0.4.30
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/ApiServer.js +4 -0
- package/dist/api/ai-gateway/AiGatewayService.d.ts +55 -0
- package/dist/api/ai-gateway/AiGatewayService.js +145 -6
- package/dist/api/ai-gateway/auth/AiConnectionsInvocationKeyIssuer.js +5 -3
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +16 -49
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +6 -71
- package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js +1 -0
- package/dist/api/ai-gateway/auth/InvocationTokenCodec.d.ts +4 -0
- package/dist/api/ai-gateway/auth/InvocationTokenCodec.js +8 -1
- package/dist/api/ai-gateway/connect/FileSessionImportAdapter.d.ts +3 -0
- package/dist/api/ai-gateway/connect/FileSessionImportAdapter.js +23 -3
- package/dist/api/ai-gateway/connect/SessionImportProfiles.d.ts +9 -1
- package/dist/api/ai-gateway/connect/SessionImportProfiles.js +4 -3
- package/dist/api/ai-gateway/connect/index.d.ts +40 -0
- package/dist/api/ai-gateway/connect/index.js +194 -4
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +1 -1
- package/dist/api/ai-gateway/pod/OwnerPodAccess.js +5 -0
- package/dist/api/ai-gateway/pod/PodBaseUrlResolver.d.ts +11 -2
- package/dist/api/ai-gateway/pod/PodBaseUrlResolver.js +72 -10
- package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +1 -1
- package/dist/api/ai-gateway/routing/ModelRouter.d.ts +7 -0
- package/dist/api/ai-gateway/routing/ModelRouter.js +13 -10
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +1 -5
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +8 -63
- package/dist/api/auth/AuthContext.d.ts +4 -0
- package/dist/api/auth/ClientCredentialsAuthenticator.js +11 -5
- package/dist/api/auth/SolidSessionFactory.d.ts +50 -4
- package/dist/api/auth/SolidSessionFactory.js +114 -4
- package/dist/api/chatkit/pod-store.d.ts +8 -1
- package/dist/api/chatkit/pod-store.js +54 -3
- package/dist/api/container/common.js +34 -60
- package/dist/api/container/index.js +0 -3
- package/dist/api/container/routes.js +1 -8
- package/dist/api/container/types.d.ts +2 -9
- package/dist/api/container/types.js +0 -5
- package/dist/api/handlers/AiGatewayManagementHandler.d.ts +4 -12
- package/dist/api/handlers/AiGatewayManagementHandler.js +18 -258
- package/dist/api/middleware/AuthMiddleware.js +29 -1
- package/dist/api/runs/PiAgentRuntimeDriver.js +6 -1
- package/dist/cli/index.js +2 -1
- package/dist/identity/oidc/PodOwnershipResolver.js +16 -6
- package/dist/runtime/ingress-port.d.ts +9 -2
- package/dist/runtime/ingress-port.js +7 -2
- package/dist/runtime/local-secret-file.d.ts +1 -1
- package/dist/runtime/runner/node/CommunitySolidServerCssRunner.d.ts +3 -1
- package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js +31 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +3 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +96 -67
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.d.ts +1 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +81 -23
- package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.d.ts +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/fingerprint.d.ts +1 -0
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/fingerprint.js +7 -0
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/normalize.d.ts +1 -2
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/normalize.js +0 -33
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/request.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/request.js +68 -22
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/types.d.ts +37 -10
- package/node_modules/@undefineds.co/ai-connections/dist/controller.js +5 -54
- package/node_modules/@undefineds.co/ai-connections/dist/error-wording.js +7 -2
- package/node_modules/@undefineds.co/ai-connections/dist/service-access-resources.cjs +405 -0
- package/node_modules/@undefineds.co/ai-connections/dist/service-access-resources.d.ts +14 -0
- package/node_modules/@undefineds.co/ai-connections/dist/service-access-resources.js +36 -0
- package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +5 -26
- package/node_modules/@undefineds.co/ai-connections/package.json +10 -2
- package/node_modules/@undefineds.co/extension-sdk/dist/solid-permissions.js +131 -13
- package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +7 -1
- package/node_modules/@undefineds.co/extension-sdk/package.json +1 -1
- package/node_modules/@undefineds.co/pod-collections/dist/index.cjs +38 -5
- package/node_modules/@undefineds.co/pod-collections/dist/mapping.d.ts +8 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mapping.js +34 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mutations.d.ts +2 -1
- package/node_modules/@undefineds.co/pod-collections/dist/mutations.js +6 -4
- package/node_modules/@undefineds.co/pod-collections/dist/sync.js +4 -3
- package/node_modules/@undefineds.co/pod-collections/package.json +1 -1
- package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/IdpChrome.d.ts +1 -1
- package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/IdpChrome.js +2 -2
- package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/IdpViews.js +2 -2
- package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/PodSignInFrame.d.ts +3 -3
- package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/PodSignInFrame.js +5 -5
- package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/parts.d.ts +5 -5
- package/node_modules/@undefineds.co/shared-ui/dist/pod-sign-in/parts.js +5 -5
- package/node_modules/@undefineds.co/shared-ui/dist/theme.css +32 -5
- package/node_modules/@undefineds.co/shared-ui/package.json +1 -1
- package/package.json +2 -2
- package/static/app/assets/main.css +1 -1
- package/static/app/assets/main.js +18 -18
- package/static/dashboard/assets/{AccountAuthBoundary-Dv52SZc6.js → AccountAuthBoundary-CuqXFEW4.js} +1 -1
- package/static/dashboard/assets/{DesktopOidcCallback-DaT_Rumf.js → DesktopOidcCallback-7i-yOvPW.js} +1 -1
- package/static/dashboard/assets/DevicePages-D1m_BNtX.js +2 -0
- package/static/dashboard/assets/ModelsPage-0qWGa5Y6.js +12 -0
- package/static/dashboard/assets/{PaneListHeader-DtvnRmFq.js → PaneListHeader-uWdPgJ0E.js} +1 -1
- package/static/dashboard/assets/{PodDeletionAuthorizationPanel-BJk_8rJq.js → PodDeletionAuthorizationPanel-C22bhZeD.js} +3 -3
- package/static/dashboard/assets/{PodPage-C4gzEspV.js → PodPage-Dyo3yCb-.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsPage-HaNrP1H1.js → SystemSettingsPage-CeX-oG_a.js} +1 -1
- package/static/dashboard/assets/{TasksPage-BdO5K2L7.js → TasksPage-B0EoyRYT.js} +1 -1
- package/static/dashboard/assets/{WebDesktopEntry-Cj9_ZfJU.js → WebDesktopEntry-DT44RrTa.js} +1 -1
- package/static/dashboard/assets/XpodAiConnectionsPodStore-EXCqZPmb.js +3 -0
- package/static/dashboard/assets/XpodShellApp-BEzi4f1j.css +1 -0
- package/static/dashboard/assets/XpodShellApp-DAFsxamX.js +4 -0
- package/static/dashboard/assets/{account-session-DlcKNG7k.js → account-session-rRAOF7nF.js} +1 -1
- package/static/dashboard/assets/{button-wslF55uZ.js → button-WVnQUNG-.js} +1 -1
- package/static/dashboard/assets/{collection-runtime-uxxgEu13.js → collection-runtime-BAJQ8Qub.js} +1 -1
- package/static/dashboard/assets/{createLucideIcon-BJQl82Qk.js → createLucideIcon-BWelSi3L.js} +1 -1
- package/static/dashboard/assets/dashboard-hSOBxPcP.css +1 -0
- package/static/dashboard/assets/{dashboard-Or0gnkou.js → dashboard-vmne1ZE0.js} +2 -2
- package/static/dashboard/assets/{index-BqFeOML9.js → index-HDQQ8asz.js} +1 -1
- package/static/dashboard/assets/{index-DgKn1twH.js → index-gtv-MAHl.js} +1 -1
- package/static/dashboard/assets/{label-CS6Sx6Zb.js → label-tKuCTJm2.js} +1 -1
- package/static/dashboard/assets/{list-UyhlCFKk.js → list-CKq3KHke.js} +1 -1
- package/static/dashboard/assets/{nav-item-style-CW1Nnorq.js → nav-item-style-B2gI7c52.js} +1 -1
- package/static/dashboard/assets/pod-collections-host-BqOAkacM.js +8 -0
- package/static/dashboard/assets/{safe-continuation-ClWAhcma.js → safe-continuation-BsKjDpAA.js} +1 -1
- package/static/dashboard/assets/{section-header-CEIEcco-.js → section-header-DM0JU-wk.js} +1 -1
- package/static/dashboard/assets/{setting-row-CaYv3dfF.js → setting-row-XiH7UjWy.js} +1 -1
- package/static/dashboard/assets/{xpod-remembered-login-BUF9fin1.js → xpod-remembered-login-nv1g1sfC.js} +4 -4
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AccountAuthBoundary-Chqd38oU.js → AccountAuthBoundary-DAUR0omy.js} +1 -1
- package/static/settings/assets/{DesktopOidcCallback-VUrOSM_q.js → DesktopOidcCallback-BNZAZMWY.js} +1 -1
- package/static/settings/assets/DevicePages-BO9SrXRp.js +2 -0
- package/static/settings/assets/ModelsPage-DREEXdf3.js +12 -0
- package/static/settings/assets/{PaneListHeader-B5RkRqr4.js → PaneListHeader-CeUH0JjQ.js} +1 -1
- package/static/settings/assets/{PodDeletionAuthorizationPanel-DPM-5Izt.js → PodDeletionAuthorizationPanel-Ch4--l4b.js} +3 -3
- package/static/settings/assets/{PodPage-CxND6wwc.js → PodPage-CqJBj3GJ.js} +1 -1
- package/static/settings/assets/{SystemSettingsPage-C8EdMkW7.js → SystemSettingsPage-2LSjpqUa.js} +1 -1
- package/static/settings/assets/{TasksPage-DuqptEm8.js → TasksPage-DA5IRxlP.js} +1 -1
- package/static/settings/assets/{WebDesktopEntry-BRcyktkv.js → WebDesktopEntry-BVelF1q0.js} +1 -1
- package/static/settings/assets/XpodAiConnectionsPodStore-O5-2qBsx.js +3 -0
- package/static/settings/assets/XpodShellApp-BEzi4f1j.css +1 -0
- package/static/settings/assets/XpodShellApp-D1b3kqD0.js +4 -0
- package/static/settings/assets/XpodThemeProvider-hSOBxPcP.css +1 -0
- package/static/settings/assets/{XpodThemeProvider-DK3pIdRG.js → XpodThemeProvider-rUdAw66p.js} +2 -2
- package/static/settings/assets/{account-session-DJOZ03xr.js → account-session-BD1q8D_o.js} +1 -1
- package/static/settings/assets/auth-callback-PWS7okI8.js +1 -0
- package/static/settings/assets/{button-D3yW-2o1.js → button-ZJYFB218.js} +1 -1
- package/static/settings/assets/{collection-runtime-DfGo25mh.js → collection-runtime-C2FHCCXJ.js} +1 -1
- package/static/settings/assets/{createLucideIcon-CacwLsmB.js → createLucideIcon-B2wXvYTD.js} +1 -1
- package/static/settings/assets/{index-r5KRYsKC.js → index-JFAkaKZH.js} +1 -1
- package/static/settings/assets/{label-MJjUmvzG.js → label-BLrTAmGy.js} +1 -1
- package/static/settings/assets/{list-Ce-5k1MX.js → list-Cm96vvJO.js} +1 -1
- package/static/settings/assets/{nav-item-style-ZUbL8KOZ.js → nav-item-style-C2upI7sr.js} +1 -1
- package/static/settings/assets/pod-collections-host-BqOAkacM.js +8 -0
- package/static/settings/assets/{safe-continuation-vlBZFSlU.js → safe-continuation-CYaRj3rj.js} +1 -1
- package/static/settings/assets/{section-header-DGJdEvQw.js → section-header-BviL5H8E.js} +1 -1
- package/static/settings/assets/{setting-row-C7tuFiho.js → setting-row-BYikj0YO.js} +1 -1
- package/static/settings/assets/{settings-CyQPih1O.js → settings-CpoDG_Qr.js} +1 -1
- package/static/settings/assets/{xpod-remembered-login-D-TzzT5K.js → xpod-remembered-login-BJ4QUSXy.js} +4 -4
- package/static/settings/auth-callback.html +3 -3
- package/static/settings/settings.html +3 -3
- package/dist/api/ai-gateway/auth/GatewayApiKey.d.ts +0 -28
- package/dist/api/ai-gateway/auth/GatewayApiKey.js +0 -162
- package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.d.ts +0 -26
- package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js +0 -97
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +0 -67
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +0 -340
- package/dist/runtime/gateway-locator-secret.d.ts +0 -5
- package/dist/runtime/gateway-locator-secret.js +0 -30
- package/static/dashboard/assets/DevicePages-HjclpIVm.js +0 -2
- package/static/dashboard/assets/ModelsPage-Be2TPd-x.js +0 -11
- package/static/dashboard/assets/XpodAiConnectionsPodStore-B7gmXBmC.js +0 -3
- package/static/dashboard/assets/XpodShellApp-Bwom2xL3.css +0 -1
- package/static/dashboard/assets/XpodShellApp-D_KY4nCW.js +0 -4
- package/static/dashboard/assets/dashboard-CbJ-JkrI.css +0 -1
- package/static/dashboard/assets/pod-collections-host-DjK2xf-b.js +0 -8
- package/static/settings/assets/DevicePages-C6qwvWwu.js +0 -2
- package/static/settings/assets/ModelsPage-Ry_dObRQ.js +0 -11
- package/static/settings/assets/XpodAiConnectionsPodStore-CyA_BJVC.js +0 -3
- package/static/settings/assets/XpodShellApp-Bwom2xL3.css +0 -1
- package/static/settings/assets/XpodShellApp-CsivHJl0.js +0 -4
- package/static/settings/assets/XpodThemeProvider-CbJ-JkrI.css +0 -1
- package/static/settings/assets/auth-callback-GIBYEz_7.js +0 -1
- package/static/settings/assets/pod-collections-host-DjK2xf-b.js +0 -8
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/collection-runtime-BAJQ8Qub.js","assets/xpod-remembered-login-nv1g1sfC.js","assets/createLucideIcon-BWelSi3L.js","assets/dashboard-vmne1ZE0.js","assets/dashboard-hSOBxPcP.css","assets/button-WVnQUNG-.js","assets/PodDeletionAuthorizationPanel-C22bhZeD.js","assets/account-session-rRAOF7nF.js","assets/XpodAiConnectionsPodStore-EXCqZPmb.js","assets/layout-DB3pMyTl.js","assets/XpodShellApp-DAFsxamX.js","assets/safe-continuation-BsKjDpAA.js","assets/nav-item-style-B2gI7c52.js","assets/XpodShellApp-BEzi4f1j.css","assets/list-CKq3KHke.js","assets/section-header-DM0JU-wk.js","assets/label-tKuCTJm2.js","assets/pod-collections-host-BqOAkacM.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{j as s,r as m,_ as sr}from"./dashboard-vmne1ZE0.js";import{I as rr,o as Oa,S as ar,g as zn,q as Ta,v as ys,w as bs,t as Se,x as La,y as Qa,z as qa,u as za,k as Va}from"./XpodShellApp-DAFsxamX.js";import{k as Ha,l as Ja,T as Xa}from"./nav-item-style-B2gI7c52.js";import{h as Ga,i as nn,d as Wa,p as Ya,j as Za,P as Ge,k as _a,A as $a,l as Wt,w as ei,n as ti,q as ni,g as si}from"./XpodAiConnectionsPodStore-EXCqZPmb.js";import{a$ as Vn,b0 as Hn,b1 as Jn,b2 as Xn,b3 as ir,b4 as Fe,b5 as $e,b6 as ws,b7 as sn,b8 as ke,b9 as rn,ba as V,bb as ut,bc as at,bd as Bn,be as Yt,bf as it,bg as Je,bh as ri,bi as ai,bj as Ue,bk as We,bl as Gn,bm as or,bn as Wn,bo as qe,bp as Ve,bq as an,br as Cs,bs as ii,ae as cr,F as on,aV as Yn,aW as Zn,aX as _n,bt as $n,bu as cn,bv as ln,bw as un,ad as Es,bx as It,aj as lr,ak as Te}from"./xpod-remembered-login-nv1g1sfC.js";import{c as ve,B as X,i as oi}from"./button-WVnQUNG-.js";import{p as fe,D as jt,j as ur,k as Ft,m as kt,I as Pe,l as dn,o as Zt}from"./PodDeletionAuthorizationPanel-C22bhZeD.js";import{L as dr}from"./list-CKq3KHke.js";import{S as fr,B as dt}from"./section-header-DM0JU-wk.js";import{L as He}from"./label-tKuCTJm2.js";import{A as ci}from"./account-session-rRAOF7nF.js";const li=[["path",{d:"M2 10v3",key:"1fnikh"}],["path",{d:"M6 6v11",key:"11sgs0"}],["path",{d:"M10 3v18",key:"yhl04a"}],["path",{d:"M14 8v7",key:"3a1oy3"}],["path",{d:"M18 5v13",key:"123xd1"}],["path",{d:"M22 10v3",key:"154ddg"}]],ui=fe("audio-lines",li);const di=[["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"}]],Dt=fe("box",di);const fi=[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]],pi=fe("boxes",fi);const hi=[["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"}]],pr=fe("brain",hi);const mi=[["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"}]],gi=fe("copy",mi);const Ai=[["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"}]],es=fe("external-link",Ai);const xi=[["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"}]],yi=fe("eye-off",xi);const bi=[["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"}]],wi=fe("eye",bi);const Ci=[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]],Ei=fe("file-text",Ci);const vi=[["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"}]],hr=fe("globe",vi);const Ii=[["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"}]],ji=fe("grip-vertical",Ii);const Fi=[["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"}]],mr=fe("image",Fi);const ki=[["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"}]],vs=fe("key-round",ki);const Di=[["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"}]],Bi=fe("log-out",Di);const Si=[["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"}]],gr=fe("pause",Si);const Ni=[["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"}]],Ar=fe("pencil",Ni);const Mi=[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]],xr=fe("play",Mi);const Ui=[["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=fe("plug-zap",Ui);const Ri=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],mt=fe("plus",Ri);const Ki=[["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"}]],Is=fe("refresh-ccw",Ki);const Oi=[["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"}]],Sn=fe("rotate-cw",Oi);const Ti=[["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"}]],yr=fe("settings-2",Ti);const Li=[["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"}]],Qi=fe("square-terminal",Li);const qi=[["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"}]],ts=fe("trash-2",qi);const zi=[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]],Vi=fe("video",zi);const Hi=[["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"}]],Ji=fe("wallet",Hi);const Xi=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],Gi=fe("zap",Xi);function yt({title:e,description:t,action:n,className:r,...a}){return s.jsxs("div",{...a,className:ve("flex flex-col items-start gap-2 py-6 text-sm text-muted-foreground",r),children:[e?s.jsx("h3",{className:"font-medium text-foreground",children:e}):null,t?s.jsx("div",{children:t}):null,n]})}const Wi={primary:"bg-primary",success:"bg-success",warning:"bg-warning",danger:"bg-destructive"};function Yi({value:e,max:t=100,label:n,tone:r="primary",className:a,...i}){const c=Number.isFinite(t)&&t>0?t:100;if(typeof e!="number"||!Number.isFinite(e))return s.jsx("div",{"aria-hidden":"true",className:ve("h-1.5 overflow-hidden rounded-full bg-muted",a),...i});const d=Math.max(0,Math.min(c,e)),f=d/c*100;return s.jsx("div",{role:"progressbar","aria-label":n,"aria-valuemin":0,"aria-valuemax":c,"aria-valuenow":d,className:ve("h-1.5 overflow-hidden rounded-full bg-muted",a),...i,children:s.jsx("div",{className:ve("h-full rounded-full",Wi[r]),style:{width:`${String(f)}%`}})})}function Zi(e){const t=Vn(e).type;return Array.isArray(t)&&t.includes(Hn.AccessControlResource)}async function fn(e,t){if(!Pt(e))return{resourceAcl:null,fallbackAcl:null};try{const n=await br(e,t);return n===null?{resourceAcl:null,fallbackAcl:await wr(e,t)}:{resourceAcl:n,fallbackAcl:null}}catch(n){if(n instanceof Nn)return{resourceAcl:null,fallbackAcl:null};throw n}}async function br(e,t){if(!Pt(e))return null;try{const n=await Xn(e.internal_resourceInfo.aclUrl,t);if(Zi(n))throw new Nn(e,n);return ir({...n,internal_accessTo:Fe(e)})}catch(n){if(n instanceof Nn)throw n;return null}}async function wr(e,t){const n=new URL(Fe(e)),r=n.pathname;if(r==="/")return null;const a=_i(r),i=new URL(a,n.origin).href,c=await $e(i,t);if(!Pt(c))return null;const d=await br(c,t);return d===null?wr(c,t):d}function _i(e){const t=e.substring(e.length-1)==="/"?e.substring(0,e.length-1):e;return`${e.substring(0,t.lastIndexOf("/"))}/`}function et(e){return sn(e).filter($i)}function $i(e){return ke(e,rn.type).includes(V.Authorization)}function ns(e,t){return e.filter(n=>eo(n,t))}function eo(e,t){return ke(e,V.accessTo).includes(t)}function pn(e,t){return e.filter(n=>to(n,t))}function to(e,t){return ke(e,V.default).includes(t)||ke(e,V.defaultForNew).includes(t)}function Bt(e){const t=ke(e,V.mode);return t.includes(Qe.write)?{read:t.includes(Qe.read),append:!0,write:!0,control:t.includes(Qe.control)}:{read:t.includes(Qe.read),append:t.includes(Qe.append),write:!1,control:t.includes(Qe.control)}}function St(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 no(e){return et(e).filter(so).reduce(ri,e)}function so(e){return ai(e.predicates,Ue.namedNode(e.url),Ue.defaultGraph()).some(t=>!ro(t))?!1:We(e,V.accessTo)===null&&We(e,V.default)===null&&We(e,V.defaultForNew)===null||We(e,V.mode)===null||We(e,V.agent)===null&&We(e,V.agentGroup)===null&&We(e,V.agentClass)===null}function ro(e){const{predicate:t}=e,{object:n}=e;return!!(t.equals(Ue.namedNode(rn.type))&&n.equals(Ue.namedNode(V.Authorization))||t.equals(Ue.namedNode(V.accessTo))||t.equals(Ue.namedNode(V.default))||t.equals(Ue.namedNode(V.defaultForNew))||t.equals(Ue.namedNode(V.mode))&&Object.values(Qe).some(r=>n.equals(Ue.namedNode(r)))||t.equals(Ue.namedNode(V.agent))||t.equals(Ue.namedNode(V.agentGroup))||t.equals(Ue.namedNode(V.agentClass))||t.equals(Ue.namedNode(V.origin)))}const Qe={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 ao(e,t,n){return e.filter(r=>ke(r,n).includes(t))}function io(e,t){const n={};return e.forEach(r=>{const a=ke(r,t),i=Bt(r);a.forEach(c=>{n[c]=typeof n[c]>"u"?i:St([n[c],i])})}),n}function Cr(e){let t=it();return t=at(t,rn.type,V.Authorization),e.read&&(t=Je(t,V.mode,Qe.read)),e.append&&!e.write&&(t=Je(t,V.mode,Qe.append)),e.write&&(t=Je(t,V.mode,Qe.write)),e.control&&(t=Je(t,V.mode,Qe.control)),t}function oo(e){let t=it();t=at(t,rn.type,V.Authorization);function n(r,a,i){return ke(r,i).reduce((c,d)=>Je(c,i,d),a)}return t=n(e,t,V.accessTo),t=n(e,t,V.default),t=n(e,t,V.defaultForNew),t=n(e,t,V.agent),t=n(e,t,V.agentGroup),t=n(e,t,V.agentClass),t=n(e,t,V.origin),t=n(e,t,V.mode),t}function Nt(e,t){return Object.assign(Jn(e),{internal_acl:t})}const co=[V.agent,V.agentClass,V.agentGroup,V.origin];function lo(e,t,n,r,a){if(!ke(e,n).includes(t)){const d=Cr({read:!1,append:!1,write:!1,control:!1});return[e,d]}const i=Bn(e,n,t);let c=oo(e);return c=Bn(c,V.accessTo,r),c=at(c,n,t),co.filter(d=>d!==n).forEach(d=>{c=Yt(c,d)}),[i,c]}function Er(e,t,n,r,a){let i=e;sn(e).forEach(f=>{const[u,h]=lo(f,a,n,e.internal_accessTo);i=ut(i,u),i=ut(i,h)});let c=Cr(t);c=at(c,V.accessTo,e.internal_accessTo),c=at(c,n,a);const d=ut(i,c);return no(d)}function vr(e,t){return Nt(e,{resourceAcl:t,fallbackAcl:null})}function uo(e){return e.internal_acl.resourceAcl}class Nn extends Error{constructor(t,n){super(`[${ws(t)}] is governed by Access Control Policies in [${ws(n)}] rather than by Web Access Control.`)}}function Mt(e){return e.internal_acl.resourceAcl!==null&&Fe(e)===e.internal_acl.resourceAcl.internal_accessTo&&e.internal_resourceInfo.aclUrl===Fe(e.internal_acl.resourceAcl)}function ss(e){return Mt(e)?e.internal_acl.resourceAcl:null}function Ut(e){return e.internal_acl.fallbackAcl!==null}function fo(e){return Ut(e)?e.internal_acl.fallbackAcl:null}function po(e){return ir({...or(),internal_accessTo:Fe(e),internal_resourceInfo:{sourceIri:e.internal_resourceInfo.aclUrl,isRawData:!1,linkedResources:{}}})}function ho(e){const t=po(e),n=et(e.internal_acl.fallbackAcl);return pn(n,e.internal_acl.fallbackAcl.internal_accessTo).map(c=>(c=Yt(c,V.default),c=Yt(c,V.defaultForNew),c=at(c,V.accessTo,Fe(e)),c=at(c,V.default,Fe(e)),c)).reduce(ut,t)}async function mo(e,t,n){if(!Pt(e))throw new Error(`Could not determine the location of the ACL for the Resource at [${Fe(e)}]; possibly the current user does not have Control access to that Resource. Try calling \`hasAccessibleAcl()\` before calling \`saveAclFor()\`.`);return{...await Gn(e.internal_resourceInfo.aclUrl,t,n),internal_accessTo:Fe(e)}}function Pt(e){return typeof e.internal_resourceInfo.aclUrl=="string"}function Ir(e,t){return Mt(e)?Ao(e.internal_acl.resourceAcl,t):Ut(e)?bo(e.internal_acl.fallbackAcl,t):null}function go(e){if(Mt(e)){const t=ss(e);return xo(t)}if(Ut(e)){const t=fo(e);return wo(t)}return null}function Ao(e,t){const n=et(e),r=ns(n,e.internal_accessTo),i=jr(r,t).map(Bt);return St(i)}function xo(e){const t=et(e),n=ns(t,e.internal_accessTo),r=Fr(n);return kr(r)}function yo(e,t,n){return Er(e,n,V.agent,"resource",t)}function bo(e,t){const n=et(e),r=pn(n,e.internal_accessTo),i=jr(r,t).map(Bt);return St(i)}function wo(e){const t=et(e),n=pn(t,e.internal_accessTo),r=Fr(n);return kr(r)}function jr(e,t){return ao(e,t,V.agent)}function Fr(e){return e.filter(Co)}function Co(e){return We(e,V.agent)!==null}function kr(e){return io(e,V.agent)}function Dr(e){return Mt(e)?Eo(e.internal_acl.resourceAcl):Ut(e)?vo(e.internal_acl.fallbackAcl):null}function Eo(e){const t=et(e),n=ns(t,e.internal_accessTo),a=Br(n,Wn.Agent).map(Bt);return St(a)}function vo(e){const t=et(e),n=pn(t,e.internal_accessTo),a=Br(n,Wn.Agent).map(Bt);return St(a)}function Io(e,t){return Er(e,t,V.agentClass,"resource",Wn.Agent)}function Br(e,t){return e.filter(n=>jo(n,t))}function jo(e,t){return ke(e,V.agentClass).includes(t)}async function Sr(e,t){if(typeof e.internal_resourceInfo.aclUrl!="string")return null;try{return await $e(e.internal_resourceInfo.aclUrl,t)}catch{return null}}const Oe="http://www.w3.org/ns/solid/acp#",be={AccessControlResource:Oe.concat("AccessControlResource"),PublicAgent:Oe.concat("PublicAgent"),access:Oe.concat("access"),accessControl:Oe.concat("accessControl"),agent:Oe.concat("agent"),allOf:Oe.concat("allOf"),allow:Oe.concat("allow"),anyOf:Oe.concat("anyOf"),apply:Oe.concat("apply"),deny:Oe.concat("deny"),memberAccessControl:Oe.concat("memberAccessControl"),noneOf:Oe.concat("noneOf")},bn="http://www.w3.org/ns/auth/acl#",ft={Append:bn.concat("Append"),Read:bn.concat("Read"),Write:bn.concat("Write")};async function Nr(e,t){const n=Ne(e),r=await Gn(Fe(n),n,t);return ko(e,r)}function Fo(e){return typeof e.internal_acp=="object"&&e.internal_acp!==null&&typeof e.internal_acp.acr=="object"&&e.internal_acp.acr!==null}function Ne(e){if(!Fo(e))throw new Error(`An Access Control Resource for [${Fe(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 ko(e,t){return Object.assign(Jn(e),{internal_acp:{...e.internal_acp,acr:t}})}function Mr(e){const t=Ne(e),n=Fe(t);return qe(t,n)}function Ur(e){const t=Mr(e);return t===null?[]:ke(t,be.accessControl)}function Pr(e,t,n){const r=Ne(e);return Array.from(new Set(t.map(a=>{const i=qe(r,a);return i!==null?ke(i,n):[]}).reduce((a,i)=>a.concat(i),[])))}function Do(e){return Pr(e,Ur(e),be.apply)}function Bo(e){return Pr(e,Ur(e),be.access)}function Rr(e,t){const n=ke(e,t);return{read:n.includes(ft.Read),append:n.includes(ft.Append),write:n.includes(ft.Write),controlRead:!1,controlWrite:!1}}function So(e){return Rr(e,be.allow)}function No(e){return Rr(e,be.deny)}function js(e,t,n){const r=Ve(t,be.allOf).map(u=>qe(Ne(e),u)).filter(u=>u!==null),a=r.every(u=>Ve(u,be.agent).includes(n)),i=Ve(t,be.anyOf).map(u=>qe(Ne(e),u)).filter(u=>u!==null),c=i.some(u=>Ve(u,be.agent).includes(n)),d=Ve(t,be.noneOf).map(u=>qe(Ne(e),u)).filter(u=>u!==null),f=d.some(u=>Ve(u,be.agent).includes(n));return r.length+i.length>0&&(r.length===0||a)&&(i.length===0||c)&&(d.length===0||!f)}function Fs(e,t,n){const r=So(e),a=No(e);return n==="control"?{read:t.read,append:t.append,write:t.write,controlRead:(t.controlRead||r.read)&&!a.read,controlWrite:(t.controlWrite||r.write)&&!a.write}:{read:(t.read||r.read)&&!a.read,append:(t.append||r.append)&&!a.append,write:(t.write||r.write)&&!a.write,controlRead:t.controlRead,controlWrite:t.controlWrite}}async function hn(e,t){let n={read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1};return Do(e).map(i=>qe(Ne(e),i)).filter(i=>i!==null).forEach(i=>{js(e,i,t)&&(n=Fs(i,n,"resource"))}),Bo(e).map(i=>qe(Ne(e),i)).filter(i=>i!==null).forEach(i=>{js(e,i,t)&&(n=Fs(i,n,"control"))}),n}function Kr(e,t){var n,r,a,i;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:(a=e.write)!==null&&a!==void 0?a:t.write,control:(i=e.controlRead)!==null&&i!==void 0?i:t.control}}function rs(e){return{read:e.read,write:e.write,append:e.append,controlRead:e.control,controlWrite:e.control}}async function Mo(e,t,n,r){const a=await fn(e,r),i=n(Nt(e,a),t);return i===null?null:rs(i)}async function Uo(e,t,n){const r=await fn(e,n),a=t(Nt(e,r));return a===null?null:rs(a)}async function Po(e,t,n){const r=await fn(e,n),a=t(Nt(e,r));if(a===null)return null;const i={};for(const[c,d]of Object.entries(a))i[c]=rs(d);return i}function Or(e,t,n){return Mo(e,t,Ir,n)}function Tr(e,t){return Uo(e,Dr,t)}function Ro(e,t){return Po(e,go,t)}async function Lr(e,t){if(!Pt(e))return null;const n=await fn(e,t),r=Nt(e,n);let a;if(Mt(r))a=uo(r);else if(Ut(r))a=ho(r);else return null;return vr(r,a)}async function Qr(e,t,n){let r=null;try{return r=await mo(e,t,n),vr(e,r)}catch{return null}}async function Ko(e,t,n,r,a){const i=await Lr(e,a);if(i===null)return null;const c=ss(i),d=n(i),f=Kr(t,d),u=r(c,f);return Qr(i,u,a)}async function Oo(e,t,n,r,a,i){const c=await Lr(e,i);if(c===null)return null;const d=r(c,t),f=ss(c),u=Kr(n,d),h=a(f,t,u);return Qr(c,h,i)}async function To(e,t,n,r){return Oo(e,t,n,Ir,yo,r)}async function Lo(e,t,n){return Ko(e,t,Dr,Io,n)}async function Qo(e,t){const n=await Sr(e,t);if(n===null)return null;const r=Vn(n).type;return Array.isArray(r)&&r.includes(be.AccessControlResource)?Fe(n):null}async function Rt(e,t){const n=await Qo(e,t);if(n===null)return null;let r;try{r=await Xn(n,t)}catch{return null}return{...e,internal_acp:{acr:{...r,accessTo:Fe(e)}}}}async function qr(e,t,n){const r=await $e(e,n),a=await Rt(r,n);return a===null?Or(r,t,n):hn(a,t)}function qo(e){return Array.from(new Set(sn(Ne(e)).map(t=>Ve(t,be.agent)).reduce((t,n)=>t.concat(n),[])))}async function zo(e){return(await Promise.all(qo(e).map(async t=>({[t]:await hn(e,t)})))).reduce((t,n)=>({...t,...n}),{})}async function Vo(e,t){const n=await $e(e,t),r=await Rt(n,t);return r===null?Ro(n,t):zo(r)}async function Ho(e){return hn(e,be.PublicAgent)}async function zr(e,t){const n=await $e(e,t),r=await Rt(n,t);return r===null?Tr(n,t):Ho(r)}function Kt(e,t){return Object.assign(Jn(e),{internal_acp:{...e.internal_acp,acr:ut(e.internal_acp.acr,t)}})}const bt="defaultAccessControl",_t="defaultAcrAccessControl";function as(e,t){const n=Ne(e);return Fe(n).concat("#").concat(t)}function is(e,t,n){return as(e,t).concat("AgentMatcher").concat(n.charAt(0).toUpperCase()+n.slice(1)).concat("Policy")}function Vr(e,t){const n=Ne(e),r=as(e,t),a=qe(n,r);return a===null||typeof a>"u"?it({url:r}):a}function ks(e){return e.includes("Member")?be.memberAccessControl:be.accessControl}function Hr(e,t){const n=as(e,t),r=Ne(e);let a=Mr(e);return(a===null||typeof a>"u")&&(a=it({url:Fe(r)})),ke(a,ks(t)).includes(n)?e:(a=an(a).addUrl(ks(t),n).build(),Kt(e,a))}function Jo(e,t){const n=Hr(e,_t),r=Vr(n,_t);return Kt(n,an(r).addUrl(be.access,t).build())}function Xo(e,t){const n=Hr(e,bt),r=Vr(n,bt);return Kt(n,an(r).addUrl(be.apply,t).build())}function Go(e,t,n){const r=is(e,t,n);return r.includes("Acr")?Jo(e,r):Xo(e,r)}function Jr(e,t,n){return is(e,t,n).concat("Matcher")}function Wo(e,t,n){let r=Yt(e,n);return(t.read||t.controlRead)&&(r=Je(r,n,ft.Read)),t.append&&(r=Je(r,n,ft.Append)),(t.write||t.controlWrite)&&(r=Je(r,n,ft.Write)),r}const Ds=be.anyOf;function Yo(e,t,n){const r=is(e,t,n),a=Jr(e,t,n);let i=qe(Ne(e),r);return i||(e=Go(e,t,n),i=it({url:r}),i=Wo(i,{[n]:!0},be.allow)),ke(i,Ds).includes(a)?e:(i=an(i).addUrl(Ds,a).build(),Kt(e,i))}function Zo(e,t){return Je(e,Hn.agent,t)}function _o(e,t){return Bn(e,Hn.agent,t)}function gt(e,t,n,r,a){var i;const c=Jr(e,n,r),d=Yo(e,n,r),f=(i=qe(Ne(d),c))!==null&&i!==void 0?i:it({url:c});return Kt(d,a==="add"?Zo(f,t):_o(f,t))}async function Xr(e,t,n){const r=await hn(e,t);return typeof n.read=="boolean"&&r.read!==n.read&&(e=gt(e,t,bt,"read",n.read?"add":"remove")),typeof n.append=="boolean"&&r.append!==n.append&&(e=gt(e,t,bt,"append",n.append?"add":"remove")),typeof n.write=="boolean"&&r.write!==n.write&&(e=gt(e,t,bt,"write",n.write?"add":"remove")),typeof n.controlRead=="boolean"&&r.controlRead!==n.controlRead&&(e=gt(e,t,_t,"controlRead",n.controlRead?"add":"remove")),typeof n.controlWrite=="boolean"&&r.controlWrite!==n.controlWrite&&(e=gt(e,t,_t,"controlWrite",n.controlWrite?"add":"remove")),e}async function $o(e,t,n,r){const a=await $e(e,r),i=await Rt(a,r);if(i===null)return await To(a,t,n,r),Or(a,t,r);try{return await Nr(await Xr(i,t,n),r),await qr(e,t,r)}catch{return null}}async function ec(e,t){return Xr(e,be.PublicAgent,t)}async function tc(e,t,n){const r=await $e(e,n),a=await Rt(r,n);if(a===null)return await Lo(r,t,n),Tr(r,n);try{return await Nr(await ec(a,t),n),await zr(e,n)}catch{return null}}const nc=Object.freeze(Object.defineProperty({__proto__:null,getAclServerResourceInfo:Sr,getAgentAccess:qr,getAgentAccessAll:Vo,getPublicAccess:zr,setAgentAccess:$o,setPublicAccess:tc},Symbol.toStringTag,{value:"Module"}));function sc(e){const t=e.access??nc,n=new Map,r=(a,i)=>JSON.stringify([a.appletId,a.service.webId,i]);return{inspectAgentAccess:a=>Bs(a,e.fetch,t),ensureAgentAccess:async a=>{try{for(const i of a.resources){await rc(i.url,i.mediaType,e.fetch),await ac(i.url,e.fetch);const c=zt(await t.getAgentAccess(i.url,a.service.webId,{fetch:e.fetch})),d=r(a,i.url),f=n.get(d);if(f&&!wn(c,f.after))throw new Error("Agent access changed outside this capability.");if(Mn(c,i.access)){f||n.set(d,{before:c,after:c,changed:!1});continue}const u=await t.setAgentAccess(i.url,a.service.webId,cc(i.access),{fetch:e.fetch});if(!u||!Mn(u,i.access))return Ye("permissionDenied",a,"Pod did not grant the requested service access.");n.set(d,{before:f?.before??c,after:zt({...c,...u}),changed:!0})}return Ye("granted",a)}catch(i){return Ye("permissionDenied",a,Un(i))}},revokeAgentAccess:async a=>{try{const i=[];for(const d of a.resources){const f=n.get(r(a,d.url));if(!f)throw new Error("No grant attribution exists in this capability; existing access was not revoked.");const u=zt(await t.getAgentAccess(d.url,a.service.webId,{fetch:e.fetch}));if(!wn(u,f.after))throw new Error("Agent access changed outside this capability; access was not revoked.");i.push({resource:d,grant:f})}for(const{resource:d,grant:f}of i){if(!f.changed)continue;const u={};for(const p of $t)f.before[p]!==f.after[p]&&(u[p]=f.before[p]);const h=await t.setAgentAccess(d.url,a.service.webId,u,{fetch:e.fetch});if(!h||!wn(zt({...f.after,...h}),f.before))return Ye("permissionDenied",a,"Pod did not restore this capability grant.");f.after=f.before,f.changed=!1}const c=await Bs(a,e.fetch,t);return c.status==="granted"?{...c,message:"Existing agent access was retained."}:c}catch(i){return Ye("permissionDenied",a,Un(i))}}}}const $t=["read","append","write","controlRead","controlWrite"];function zt(e){if(!e||$t.some(t=>typeof e[t]!="boolean"))throw new Error("Unable to inspect direct agent access.");return Object.fromEntries($t.map(t=>[t,e[t]]))}function wn(e,t){return $t.every(n=>e[n]===t[n])}async function Bs(e,t,n){try{for(const r of e.resources){const a=await n.getAgentAccess(r.url,e.service.webId,{fetch:t});if(!a||!Mn(a,r.access))return Ye("missing",e)}return Ye("granted",e)}catch(r){return Ye("permissionDenied",e,Un(r))}}async function rc(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 oc(e,n);const a=await n(e,{method:"PUT",headers:{"content-type":t,"if-none-match":"*"},body:t==="application/json"?`{}
|
|
3
|
+
`:`# Created by the Xpod applet permission broker.
|
|
4
|
+
`});if(!a.ok&&a.status!==412)throw new Error(`Unable to create Pod resource (${a.status}).`)}const wt="http://www.w3.org/ns/solid/acp#",Gr="http://www.w3.org/1999/02/22-rdf-syntax-ns#type";async function ac(e,t){const n=await $e(e,{fetch:t}),r=Vn(n).acl;if(!r||r.length!==1)throw new Error("Missing unambiguous access-control Link.");const a=new URL(r[0]),i=new URL(e);if(a.origin!==i.origin||a.username||a.password||a.search||a.hash)throw new Error("Access-control Link is outside the resource authority.");const c=await t(a.href,{method:"HEAD"}),d=ic(c.headers.get("link"));if(await c.arrayBuffer(),c.ok){d&&await Ss(a.href,e,t);return}if(c.status!==404)throw new Error(`Unable to inspect access-control resource (${c.status}).`);if(!d)return;const f=Cs(Cs(it({url:a.href}),Gr,`${wt}AccessControlResource`),`${wt}resource`,e),u=ut(or(),f);let h;const p=async(y,C)=>{if((y instanceof Request?y.url:String(y))!==a.href||C?.method!=="PUT")throw new Error("Unexpected access-control creation request.");const T=new Headers(C.headers);T.set("If-None-Match","*");const E=await t(y,{...C,headers:T});return h=E.status,E};try{await Gn(a.href,u,{fetch:p})}catch(y){if(h!==412)throw y;await Ss(a.href,e,t)}}function ic(e){return(e??"").split(/,(?=\s*<)/u).some(t=>{const n=/^\s*<([^<>]+)>\s*;(.*)$/u.exec(t);if(n?.[1]!==`${wt}AccessControlResource`)return!1;const r=/(?:^|;)\s*rel\s*=\s*(?:"([^"]*)"|([^;\s]+))(?:\s*;|\s*$)/u.exec(n[2]);return(r?.[1]??r?.[2]??"").split(/\s+/u).includes("type")})}async function Ss(e,t,n){const r=await Xn(e,{fetch:n}),a=sn(r).filter(c=>Ve(c,Gr).includes(`${wt}AccessControlResource`));if(a.length!==1)throw new Error("Invalid target access-control resource.");const i=Ve(a[0],`${wt}resource`);if(i.length!==1||i[0]!==t)throw new Error("Access-control resource targets another resource.")}async function oc(e,t){const n=new URL(e),r=[];let a=new URL("./",n);for(;a.pathname!=="/";){const i=await t(a.href,{method:"HEAD"});if(i.ok)break;if(i.status!==404)throw new Error(`Unable to inspect Pod container (${i.status}).`);r.push(a.href),a=new URL("../",a)}for(const i of r.reverse()){const c=await t(i,{method:"PUT",headers:{"content-type":"text/turtle",link:'<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"'},body:""});if(!c.ok&&c.status!==409)throw new Error(`Unable to create Pod container (${c.status}).`)}}function cc(e){return{...e.read?{read:!0}:{},...e.append?{append:!0}:{},...e.write?{write:!0}:{}}}function Mn(e,t){return(!t.read||e.read===!0)&&(!t.append||e.append===!0)&&(!t.write||e.write===!0)}function Ye(e,t,n){return{status:e,resources:t.resources,...n?{message:n}:{}}}function Un(e){return e instanceof Error?e.message:"Unable to update Pod service access."}const lc=Ha;function uc(e,t){return dc(e,t)}function dc(e,t){const n=fc(e),r=e.createController(t);return n.type==="single-pane"?{layout:"single-pane",controller:r,element:m.createElement(n.render,{controller:r,host:t})}:n.type==="two-pane"?{layout:"two-pane",controller:r,slots:{listHeader:m.createElement(n.slots.listHeader,{controller:r,host:t}),list:m.createElement(n.slots.list,{controller:r,host:t}),mainHeader:m.createElement(n.slots.mainHeader,{controller:r,host:t}),main:m.createElement(n.slots.main,{controller:r,host:t})}}:{layout:"three-pane",controller:r,contextConfig:n.contextConfig,slots:{listHeader:m.createElement(n.slots.listHeader,{controller:r,host:t}),list:m.createElement(n.slots.list,{controller:r,host:t}),mainHeader:m.createElement(n.slots.mainHeader,{controller:r,host:t}),main:m.createElement(n.slots.main,{controller:r,host:t}),context:m.createElement(n.slots.context,{controller:r,host:t})}}}function fc(e){if("layout"in e){const t=mc(e.layout),n=lc(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 tt(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"?(Pn(t.slots,"Applet descriptor two-pane"),{type:"two-pane",slots:t.slots}):(pc(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 tt(e.render,"Applet single-pane render"),{type:"single-pane",render:e.render}}if(e.manifest.layout==="two-pane"&&"slots"in e)return Pn(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 Pn(e,t){hc(e,t),tt(e.listHeader,`${t} slot listHeader`),tt(e.list,`${t} slot list`),tt(e.mainHeader,`${t} slot mainHeader`),tt(e.main,`${t} slot main`)}function pc(e,t){Pn(e,t),tt(e.context,`${t} slot context`)}function hc(e,t){if(typeof e!="object"||e===null)throw new Error(`${t} slots must be an object`)}function tt(e,t){if(typeof e!="function")throw new Error(`${t} must be a function`)}function mc(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 gc="data:image/png;base64,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",Ac="data:image/png;base64,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",xc="data:image/png;base64,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",yc="data:image/png;base64,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",bc="data:image/png;base64,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",wc="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==",Cc="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",Wr="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiByb2xlPSJpbWciIGFyaWEtbGFiZWw9Ilhwb2QgQiDCtyDnlZnnvJ3mipjop5IiPjxyZWN0IHg9IjEwIiB5PSIxMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiByeD0iMTgiIGZpbGw9IiM1NjNFODQiLz48ZyBmaWxsPSIjRjdGNEVEIj48cGF0aCBkPSJNMzEgMjRINTJWNDVINzNWNzNRNzMgNzYgNzAgNzZIMzFRMjggNzYgMjggNzNWMjdRMjggMjQgMzEgMjRaIi8+PHBhdGggZD0iTTU4IDI0TDc2IDM5SDU4WiIvPjwvZz48L3N2Zz4K",Ec={openai:gc,anthropic:Ac,kimi:xc,bailian:bc,zhipu:wc,ollama:Cc,deepseek:yc},vc={kimi:"#000000",ollama:"#FFFFFF"};function en(e){return Ec[e]}function Rn(e){return vc[e]}function Jt(e,t="__service_access__"){const n=e.config?.base?.replace(/^\/+|\/+$/gu,"");if(!n)throw new Error("AI Connection resource is missing a declared base");return`${n}/${e.buildId({id:t}).split("#")[0]}`.replace(/^\/+/u,"")}const Ns=Object.freeze({providerCredentials:Jt(on),providerDefinitions:Jt(cr),quotaSnapshots:Jt(ii)}),Yr=new Map(Ga.map(e=>[`providerDocument:${e}`,Jt(cr,e)]));[...Yr.keys()];function Ic(e,t){const n="text/turtle",r=Object.prototype.hasOwnProperty.call(Ns,e)?Ns[e]:Yr.get(e);if(!r)return;const a=t.endsWith("/")?t:`${t}/`;return{url:new URL(r,a).href,mediaType:n}}const Ms="co.undefineds.ai-connections";function jc(e,t){if(!tn(e))throw new Error("invalid_descriptor");if(e.appletId!==Ms)throw new Error("invalid_applet_id");const n=e.service;if(!tn(n)||typeof n.webId!="string"||typeof n.label!="string"||!Mc(n.webId))throw new Error("invalid_service");if(!Array.isArray(e.resources)||e.resources.length===0)throw new Error("invalid_empty_resources");const r=Sc(t),a=new Set,i=e.resources.map(c=>Fc(c,r,a));return{appletId:Ms,service:{webId:n.webId,label:n.label},resources:i}}function Fc(e,t,n){if(!tn(e)||typeof e.id!="string"||typeof e.url!="string"||!tn(e.access))throw new Error("invalid_resource");const r=Ic(e.id,t.href);if(!r||e.mediaType!==r.mediaType||n.has(e.id))throw new Error("invalid_resource");kc(e.url);let a;try{a=new URL(e.url)}catch{throw new Error("invalid_resource")}if(!Nc(a,t))throw new Error("invalid_resource");if(a.href!==r.url)throw new Error("invalid_resource");return n.add(e.id),{id:e.id,url:a.href,mediaType:r.mediaType,access:Bc(e.access)}}function kc(e){if(/%(?![0-9a-fA-F]{2})/.test(e)||/%(?:2f|5c)/i.test(e)||e.includes("\\"))throw new Error("invalid_resource");const t=Dc(e);if(Us(t))throw new Error("invalid_resource");try{const n=decodeURIComponent(t);if(n.includes("\\")||Us(n))throw new Error("invalid_resource")}catch{throw new Error("invalid_resource")}}function Dc(e){const t=e.split("#",1)[0]??e;return(t.split("?",1)[0]??t).replace(/^[a-z][a-z0-9+.-]*:\/\/[^/\\?#]*/i,"")}function Us(e){return e.split("/").some(t=>t==="."||t==="..")}function Bc(e){if(Object.keys(e).some(n=>n!=="read"&&n!=="append"&&n!=="write")||e.read!==!0||e.append!==!0||e.write!==!0)throw new Error("invalid_resource");return{read:!0,append:!0,write:!0}}function Sc(e){const t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Error("invalid_current_pod");return t.pathname.endsWith("/")||(t.pathname=`${t.pathname}/`),t}function Nc(e,t){return(e.protocol==="http:"||e.protocol==="https:")&&e.origin===t.origin&&e.pathname.startsWith(t.pathname)}function Mc(e){try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function tn(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Uc(e){return m.useSyncExternalStore(e.subscribe,()=>e.credentialRows,()=>e.credentialRows)}let Cn;function Pc(){return Cn??(Cn=sr(()=>import("./collection-runtime-BAJQ8Qub.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]))),Cn}function Zr(e){return on.buildId({id:String(e.id)})}function Rc(e){const t=typeof e.provider=="string"?e.provider:void 0,n=Ya(t);if(n){if(n.startsWith("custom-instance-"))return"custom";const r=nn.find(a=>n===a||n.startsWith(`${a}-`));if(r)return r}return Za(String(e.id))}function xt(e){return typeof e=="string"&&e.trim()?e:void 0}function Ps(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 En(e){return e instanceof Date?e.toISOString():xt(e)}function Kc(e){if(e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local")return e;if(e==="deviceCodeOAuth")return"deviceCode"}function Oc(e,t,n){const r=Kc(e.authMode)??n?.authMode??"apiKey",a=xt(e.status),i=e.reauthRequired===!0||String(e.reauthRequired)==="true";return{id:Zr(e),provider:t,offeringId:n?.offeringId??Wa(t,r),authMode:r,label:xt(e.accountLabel)??xt(e.label)??n?.label,enabled:a===void 0?n?.enabled??!0:a==="active",priority:n?.priority??100,health:i?"expired":n?.health??"unknown",lastFailureCode:xt(e.lastFailureCode),lastFailureAt:En(e.lastFailureAt),rateLimitResetAt:En(e.rateLimitResetAt),failCount:Ps(e.failCount),maskedHint:n?.maskedHint,baseUrl:n?.baseUrl,proxyUrl:n?.proxyUrl,compatibility:n?.compatibility,expiresAt:En(e.expiresAt)??n?.expiresAt,version:Ps(e.keyVersion)??n?.version??0}}function Tc(e,t,n=[]){const r=new Map(n.map(i=>[on.buildId({id:i.id}),i])),a=[];for(const i of t)Rc(i)===e&&a.push(Oc(i,e,r.get(Zr(i))));return a}function Lc(e,t){const n={};for(const r of nn){const a=new Map;for(const i of[...e[r]?.credentials??[],...t[r]?.credentials??[]]){const c=on.buildId({id:i.id}),d=a.get(c);(!d||i.version>=d.version)&&a.set(c,i)}n[r]=[...a.values()]}return n}function Qc(e,t,n){if(!n)return e;const r={};for(const a of nn){const i=e[a];i&&(r[a]={...i,credentials:Tc(a,n,t[a]??[])})}return{...e,...r}}const je=[{id:"openai",name:Ge.openai,description:"OpenAI 官方 GPT 与推理模型,支持 API Key 与订阅导入。",homeUrl:"https://openai.com",apiKeyUrl:"https://platform.openai.com/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.openai.com/v1"},{id:"anthropic",name:Ge.anthropic,description:"Anthropic 官方 Claude 模型,API Key 接入;Pro/Max 订阅通过 Claude Code 使用。",homeUrl:"https://www.anthropic.com",apiKeyUrl:"https://console.anthropic.com/settings/keys",apiKeyPlaceholder:"sk-ant-...",defaultBaseUrl:"https://api.anthropic.com"},{id:"kimi",name:Ge.kimi,description:"月之暗面 Kimi 模型,支持账号订阅、编码套餐与开放平台。",homeUrl:"https://www.moonshot.cn",apiKeyUrl:"https://platform.moonshot.cn/console/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.moonshot.cn/v1"},{id:"bailian",name:Ge.bailian,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:Ge.deepseek,description:"DeepSeek 官方模型,API Key 接入,接口兼容 OpenAI。",homeUrl:"https://www.deepseek.com",apiKeyUrl:"https://platform.deepseek.com/api_keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.deepseek.com/v1"},{id:"zhipu",name:Ge.zhipu,description:"智谱 GLM 系列模型,支持 API Key 与 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:Ge.ollama,description:"运行在本机的 Ollama 模型,无需 API Key,仅本机可达。",homeUrl:"https://ollama.com",defaultBaseUrl:"http://localhost:11434/v1"},{id:"custom",name:Ge.custom,description:"任意 OpenAI 或 Anthropic 兼容服务,自填地址与 API Key。",homeUrl:"https://undefineds.co",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://example.com/v1"}],os=[{id:"keys",label:"Xpod",title:"Xpod"}],qc=75;if(je.map(e=>e.id).join(",")!==nn.join(","))throw new Error("AI Connection provider UI is out of sync with the client catalog");class Rs extends Error{}function zc(e){const t=e.solid.session.getSnapshot(),n=e.solid.pod,r=n?.status==="ready"?n:void 0,a=t.status==="authenticated"&&r!==void 0;let i,c,d;const f={collection:()=>i,mutations:()=>d};let u=0,h,p;const y=new Set,C=()=>{const b=e.solid.session.getSnapshot();return a&&b.status==="authenticated"&&b.webId===t.webId},R=()=>{u+=1,p=void 0,h=void 0;for(const b of y)b.cancel()},T=()=>{const b=u;let l=!C(),v=!1,P=()=>{};const z={assertCurrent(){if(l||b!==u||!C())throw new Rs},dispose(){v||(v=!0,y.delete(z),P())},cancel(){l=!0,z.dispose()}};y.add(z);let oe=!0;return P=e.solid.session.subscribe(pe=>{(!oe||pe.status!=="authenticated"||pe.webId!==t.webId)&&R()}),oe=!1,v&&P(),z},E=a?Vc(_a({webId:t.webId,podBaseUrl:r.current.podUrl,authenticatedFetch:e.solid.session.fetch,clientCredentials:e.capabilities.aiClientCredentials}),e.capabilities.aiConnectionsPodStore,f,T):null;let M="keys",g="openai",B,S="",D={},w={},A;const j=new Set,K=()=>j.forEach(b=>b()),L=e.capabilities.solidNotifications,Q=e.capabilities.aiConnectionsPodStore,J=new Map;let U=0,_=me(),G=0,ae;function W(){ae===void 0&&(ae=setTimeout(()=>{ae=void 0,G+=1,K()},qc))}function de(){if(!Q)return[];const b=new Set,l=i?void 0:Q.credentialsTableDocument?.();if(l&&b.add(l),M==="provider"){const v=Q.providerTableDocument?.(g,B);v&&b.add(v)}return[...b]}function te(){for(const[b,l]of J)J.delete(b),l()}function ue(){if(!L||U===0)return;const b=new Set(de());for(const[l,v]of J)b.has(l)||(J.delete(l),v());for(const l of b)J.has(l)||J.set(l,L.watch(l,W))}function me(){const b=L?L.getState():"unavailable";if(!i||!e.capabilities.podCollections)return b;const l=e.capabilities.podCollections.syncState(i.collection);return l==="unavailable"||l==="degraded"||b==="unavailable"?"unavailable":l==="live"&&b==="live"?"live":"idle"}L?.subscribeState(()=>{const b=me();b!==_&&(_=b,K())}),e.capabilities.podCollections?.subscribeSyncState(()=>{const b=me();b!==_&&(_=b,K())});function ee(){const b=i?.collection,l=b?.isReady()?b.toArray:void 0;l!==c&&(c=l,K())}function ie(b,l){i=b,d=l;const v=b.collection;v.subscribeChanges(()=>ee()),v.on("status:change",()=>ee()),ee(),ue(),K()}a&&t.webId&&e.capabilities.podCollections&&Pc().then(async b=>{const l=await b.openCredentialCollection(e);!l||!Q||ie(l,b.collectionCredentialMutations(l,Q))}).catch(()=>{});const se={client:E,openExternal:e.navigation.openExternal,clientConfigurationBridge:e.capabilities.aiClientConfiguration,authorizeService:E&&r&&e.solid.permissions?async()=>{if(!C())throw new Error("登录状态已变化,请重新打开 AI 连接。");const b=jc(await E.getServiceAccess(),r.current.podUrl);if(!C())throw new Error("登录状态已变化,请重新打开 AI 连接。");if((await e.solid.permissions.ensureAgentAccess(b)).status!=="granted")throw new Error("未能授权 Xpod 访问,请确认你有这个 Pod 的管理权限。");if(!C())throw new Error("登录状态已变化,请重新打开 AI 连接。");await se.loadProviders()}:void 0,get credentialsCollection(){return i?.collection},get credentialRows(){return c},get selectedSection(){return M},get selectedProvider(){return g},get selectedCredentialId(){return B},get searchQuery(){return S},get providerStates(){return D},get providerSummaries(){return w},get providerLoadError(){return A},get liveUpdates(){return _},get liveRevision(){return G},watchPageTables(){U+=1,ue();let b=!1;return()=>{b||(b=!0,U-=1,!(U>0)&&(U=0,te()))}},selectSection(b){M!==b&&(M=b,ue(),K())},selectProvider(b,l){const v=b==="custom"?l:void 0;M==="provider"&&g===b&&B===v||(M="provider",g=b,B=v,ue(),K())},selectFirstUnconfiguredProvider(){const b=je.findIndex(P=>P.id===g),v=(b<0?je:[...je.slice(b+1),...je.slice(0,b+1)]).find(P=>D[P.id]==="unconfigured"&&P.id!==g)??je.find(P=>D[P.id]==="unconfigured")??je[0];v&&se.selectProvider(v.id)},setSearchQuery(b){S!==b&&(S=b,K())},setProviderState(b,l){if(D[b]===l)return;u+=1,D={...D,[b]:l};const v=w[b]?void 0:el(b,l);v&&(w={...w,[b]:v}),K()},cancelProviderLoads:R,async loadProviders(){if(!E)return;if(h)return h;const b={};p=b;const l=++u,v=Promise.resolve().then(async()=>{if(p===b){A=void 0,K();try{const P=await E.listProviders();if(l!==u||!C())return;w=Object.fromEntries(P.map(z=>[z.id,z])),D=Object.fromEntries(je.map(z=>[z.id,Wc(w[z.id])])),K()}catch(P){if(P instanceof Rs||l!==u||!C())return;A=tl(P),K()}finally{p===b&&(p=void 0,h=void 0)}}});return h=v,v},subscribe(b){return j.add(b),()=>j.delete(b)}};return se}function Vc(e,t,n,r){const a=async()=>{const h=r();try{h.assertCurrent();const p=t?await t.listProviders():await e.listProviders();if(h.assertCurrent(),!t)return p;const y=e.listAuthorizationMethods?await e.listAuthorizationMethods():[];return h.assertCurrent(),_c(p,y)}finally{h.dispose()}};if(!t)return{...e,listProviders:a};const i=new Map,c=t.readCredentialSecret&&t.updateOAuthCredential?(h,p)=>{const y=JSON.stringify([h,p]),C=i.get(y);if(C)return C;const R=(async()=>{const E=(await t.listProviders()).find(w=>w.id===h)?.credentials.find(w=>w.id===p);if(!E)throw new Error("oauth_credential_not_found");const M=await t.readCredentialSecret(h,p),g=typeof M.refreshToken=="string"?M.refreshToken:void 0;if(!g)throw new Error("oauth_refresh_token_required");const B=await e.refreshOAuthCredential(h,p,g,E.version,E.offeringId,M.authorizationMethodId==="browser-oauth"?"authorizationCodeOAuth":void 0);if(B.status!=="completed"||!B.oauthCredential)throw new Error("oauth_refresh_failed");await t.updateOAuthCredential(h,p,E.version,B.oauthCredential);const{oauthCredential:S,...D}=B;return D})().finally(()=>{i.delete(y)});return i.set(y,R),R}:e.refreshOAuthCredential,d=async(h,p,y=!1)=>{let C=!1,R=await t.readCredentialSecret(h,p.id);const T=typeof R.expiresAt=="string"?R.expiresAt:p.expiresAt;if((p.authMode==="oauth"||p.authMode==="deviceCode")&&(y||T&&Date.parse(T)<=Date.now()+6e4)){if(!t.updateOAuthCredential)throw new Error("oauth_refresh_unavailable");await c(h,p.id,"",p.version);const M=(await t.listProviders()).find(g=>g.id===h)?.credentials.find(g=>g.id===p.id);if(!M)throw new Error("oauth_credential_not_found");C=!0,p=M,R=await t.readCredentialSecret(h,p.id)}return{credential:p,secret:R,didRefresh:C}},f={...e,listProviders:a,listModels:t.listModels?async()=>t.listModels():e.listModels,createApiKeyCredential:t.createApiKeyCredential?async(h,p)=>t.createApiKeyCredential(h,p):e.createApiKeyCredential,createLocalCredential:t.createLocalCredential?async(h,p)=>p.authorizationMethodId==="local-session-import"||!p.authorizationMethodId&&p.offeringId==="official-subscription"?e.createLocalCredential(h,p):t.createLocalCredential(h,p):e.createLocalCredential,updateProviderCredential:t.updateProviderCredential?async(h,p,y)=>t.updateProviderCredential(h,p,y):e.updateProviderCredential,deleteProviderCredential:t.deleteProviderCredential?async(h,p)=>t.deleteProviderCredential(h,p):e.deleteProviderCredential,pollDevice:t.saveOAuthCredential?async(h,p)=>{const y=await e.pollDevice(h,p);if(y.status!=="completed"||!y.oauthCredential)return y;const C=await t.saveOAuthCredential(h,y.oauthCredential),{oauthCredential:R,...T}=y;return{...T,credentialId:C?.id??y.credentialId}}:e.pollDevice,refreshOAuthCredential:c,quota:t.readCredentialSecret?async(h,p=!1,y)=>{const R=(await t.listProviders()).find(B=>B.id===h)?.credentials??[],T=y?.credentialId??y?.credentialIri,E=T?R.find(B=>B.id===T):R.find(B=>B.enabled&&(!y?.offeringId||B.offeringId===y.offeringId));if(!E)throw new Error("quota_credential_not_found");const{secret:M}=await d(h,E),g=In(M,E.authMode);if(!g)throw new Error("credential_secret_unavailable");return e.quotaFromSecret(h,{credentialId:E.id,credentialIri:E.id,authMode:E.authMode==="deviceCode"||E.authMode==="oauth"?"deviceCodeOAuth":"apiKey",offeringId:E.offeringId,baseUrl:E.baseUrl,proxyUrl:E.proxyUrl,compatibility:E.compatibility,secret:g})}:e.quota,disconnect:async(h,p)=>!p||!t.deleteProviderCredential?e.disconnect(h,p):await t.deleteProviderCredential(h,p),testProviderCredential:t.readCredentialSecret?async(h,p)=>{let C=(await t.listProviders()).find(B=>B.id===h)?.credentials.find(B=>B.id===p.credentialId);if(!C)throw new Error("test_credential_not_found");const R=await d(h,C);C=R.credential;const{secret:T}=R,E=In(T,C.authMode);if(!E)throw new Error("test_secret_missing");let M;try{M=await e.discoverModels(h,{credentialId:C.id,offeringId:C.offeringId,authMode:C.authMode==="deviceCode"||C.authMode==="oauth"?"deviceCodeOAuth":C.authMode==="local"?"local":"apiKey",secret:E,baseUrl:C.baseUrl,proxyUrl:C.proxyUrl,compatibility:C.compatibility})}catch(B){throw await t.markCredentialHealth?.(h,C.id,"invalid",C.version).catch(()=>{}),B}const g=await t.markCredentialHealth?.(h,C.id,"healthy",C.version);return{ok:!0,credentialId:C.id,...g?{credential:g}:{},modelCount:M.models.length,observedAt:M.observedAt}}:e.testProviderCredential,discoverModels:t.readCredentialSecret?async(h,p)=>{const R=(await t.listProviders()).find(D=>D.id===h)?.credentials.filter(D=>D.enabled&&(!p?.offeringId||D.offeringId===p.offeringId)&&(!p?.credentialId||D.id===p.credentialId))??[];if(R.length===0)throw new Error("models_credential_not_found");const T=D=>JSON.stringify([h,D.offeringId,(D.baseUrl??"").trim().replace(/\/+$/u,""),p?.compatibility??D.compatibility??"auto",h==="custom"?D.id:void 0]),E=new Map;for(const D of[...R].sort((w,A)=>w.priority-A.priority)){const w=T(D),A=E.get(w)??[];A.push(D),E.set(w,A)}const M=await Promise.allSettled([...E.values()].map(async D=>{let w;for(const A of D)try{let j=await d(h,A);const K=()=>{const Q=In(j.secret,A.authMode);if(!Q)throw new Error("models_secret_missing");return e.discoverModels(h,{credentialId:A.id,offeringId:A.offeringId,authMode:A.authMode==="deviceCode"||A.authMode==="oauth"?"deviceCodeOAuth":A.authMode==="local"?"local":"apiKey",secret:Q,baseUrl:A.baseUrl,proxyUrl:A.proxyUrl,compatibility:p?.compatibility??A.compatibility})};let L;try{L=await K()}catch(Q){if(j.didRefresh||!(Q instanceof $a)||Q.code!=="provider_models_fetch_failed"||Q.providerStatus!==401||A.authMode!=="oauth"&&A.authMode!=="deviceCode")throw Q;j=await d(h,j.credential,!0),L=await K()}return{...L,credential:A.id,credentialVersion:j.credential.version,models:L.models.map(Q=>({...Q,offeringId:A.offeringId,...h==="custom"?{credentialId:A.id}:{}}))}}catch(j){w=j}throw w})),g=M.flatMap(D=>D.status==="fulfilled"?[D.value]:[]);if(g.length===0)throw M[0].reason;for(const D of g)await t.markCredentialHealth?.(h,D.credential,"healthy",D.credentialVersion);const B=D=>`${D.offeringId}\0${D.credentialId??""}\0${("resourceId"in D?D.resourceId:void 0)??D.id}`;if(t.saveDiscoveredModels)try{const D=new Set([...E.values()].flatMap((A,j)=>M[j]?.status==="rejected"?[A[0].offeringId]:[])),w=new Map;for(const A of g){const j=R.find(Q=>Q.id===A.credential);if(h!=="custom"&&D.has(j.offeringId))continue;const K=h==="custom"?j.id:j.offeringId,L=w.get(K)??{credential:j.id,models:[]};L.models.push(...A.models),w.set(K,L)}for(const A of w.values())await t.saveDiscoveredModels(h,A.credential,[...new Map(A.models.map(j=>[B(j),j])).values()])}catch{throw new Error("models_persistence_failed")}const S=[...new Map(g.flatMap(D=>D.models).map(D=>[B(D),D])).values()];return{...g[0],models:S,complete:g.length===E.size}}:e.discoverModels,saveModelSelection:t.saveModelSelection?async(h,p,y)=>t.saveModelSelection(h,p,y):e.saveModelSelection};return{...f,...{createApiKeyCredential:(h,p)=>n.mutations()?.createApiKeyCredential(h,p)??f.createApiKeyCredential(h,p),createLocalCredential:(h,p)=>p.authorizationMethodId==="local-session-import"||!p.authorizationMethodId&&p.offeringId==="official-subscription"?f.createLocalCredential(h,p):n.mutations()?.createLocalCredential(h,p)??f.createLocalCredential(h,p),updateProviderCredential:(h,p,y)=>n.mutations()?.updateProviderCredential(h,p,y)??f.updateProviderCredential(h,p,y),deleteProviderCredential:(h,p)=>n.mutations()?.deleteProviderCredential(h,p)??f.deleteProviderCredential(h,p)}}}function cs(e){return m.useSyncExternalStore(e.subscribe,()=>e.selectedSection??"provider",()=>e.selectedSection??"provider")}function ls(e){return m.useSyncExternalStore(e.subscribe,()=>e.selectedProvider,()=>e.selectedProvider)}function _r(e){return m.useSyncExternalStore(e.subscribe,()=>e.selectedCredentialId,()=>e.selectedCredentialId)}function $r(e){return m.useSyncExternalStore(e.subscribe,()=>e.searchQuery,()=>e.searchQuery)}function Hc(e){return m.useSyncExternalStore(e.subscribe,()=>e.providerStates,()=>e.providerStates)}function ea(e){return m.useSyncExternalStore(e.subscribe,()=>Os(e.providerSummaries),()=>Os(e.providerSummaries))}function Jc(e){const t=ea(e),n=Object.keys(t);return n.length>0?n:void 0}function us(e){return m.useSyncExternalStore(e.subscribe,()=>e.providerSummaries,()=>e.providerSummaries)}function ta(e){return m.useSyncExternalStore(e.subscribe,()=>e.providerLoadError,()=>e.providerLoadError)}function Xc(e){return m.useSyncExternalStore(e.subscribe,()=>e.liveUpdates,()=>e.liveUpdates)}function Gc(e){return m.useSyncExternalStore(e.subscribe,()=>e.liveRevision,()=>e.liveRevision)}function Wc(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=na(e);return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}const Ks=new WeakMap;function Os(e){const t=Ks.get(e);if(t)return t;const n=Object.fromEntries(Object.values(e).filter(sa).map(r=>[r.id,Yc(r)]));return Ks.set(e,n),n}function Yc(e){const t=na(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:Zc(e),configured:e.status!=="unavailable"}}}function Zc(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(sa);return t.length>0?[...new Set(t)]:["browserAssistedApiKey"]}function na(e){return e.credentials.find(t=>t.enabled)??e.credentials[0]}function _c(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(a=>{const i=n.get(`${r.id}:${a.id}`);if(!i)return a;const c=i.authorizationMethods;return{...a,...i.endpoints?{endpoints:i.endpoints}:{},authorizationMethods:c,authModes:$c(a.authModes,c.map(d=>d.authMode))}})}))}function $c(e,t){return Array.from(new Set([...e??[],...t]))}function el(e,t){if(t==="configured")return{id:e,name:vn(e),offerings:[],credentials:[Ts(e,"apiKey")],selectedModels:[],status:"available"};if(t==="connected")return{id:e,name:vn(e),offerings:[],credentials:[Ts(e,"deviceCode")],selectedModels:[],status:"available"};if(t!=="attention"&&t!=="loading")return{id:e,name:vn(e),offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function Ts(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 vn(e){return je.find(t=>t.id===e)?.name??e}function In(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 sa(e){return e!==void 0}function tl(e){return Wt(e)}function nl({controller:e}){const t=Jc(e),n=m.useContext(Ja),r=cs(e),a=ls(e),i=_r(e),c=$r(e).trim().toLocaleLowerCase(),d=Hc(e),f=us(e),u=ta(e),p=(t?je.filter(g=>t.includes(g.id)):je).reduce((g,B)=>{if(B.id!=="custom")return[...g,{...B}];const S=f.custom?.credentials??[];return[...g,...S.map(D=>({...B,name:D.label||B.name,credentialId:D.id}))]},[]),C=c?p.filter(g=>jn(g,f).toLocaleLowerCase().includes(c)):p,R=[...os.map(g=>({kind:"section",id:g.id,label:g.label})),...C.map(g=>({kind:"provider",provider:g}))],T=m.useRef([]),E=R.findIndex(g=>g.kind==="section"?r===g.id:r==="provider"&&g.provider.id===a&&g.provider.credentialId===i),M=g=>{g.kind==="section"?e.selectSection(g.id):e.selectProvider(g.provider.id,g.provider.credentialId),n?.mode==="stack"&&n.openMain()};return s.jsxs("div",{role:"listbox","aria-label":"AI 服务","aria-orientation":"vertical",className:"py-2",children:[s.jsx("section",{className:"mb-3","aria-label":"Xpod 密钥",children:R.filter(g=>g.kind==="section").map(g=>{const B=R.indexOf(g);return s.jsxs(Ls,{index:B,selected:r===g.id,tabbable:E===B||E<0&&B===0,label:g.label,optionRefs:T,onActivate:()=>M(g),onMove:S=>Qs(R,S,e,T),children:[s.jsx(sl,{section:g.id}),s.jsx("span",{className:ve("min-w-0 flex-1 truncate text-sm font-medium",r===g.id?"text-foreground":"text-foreground/80"),children:g.label})]},g.id)})}),s.jsxs("section",{"data-testid":"ai-provider-section",children:[s.jsx("div",{className:"flex items-center justify-between gap-2 px-5 py-1",children:s.jsx("h2",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:"服务商"})}),C.map(g=>{const B=R.findIndex(w=>w.kind==="provider"&&w.provider.id===g.id&&w.provider.credentialId===g.credentialId),S=r==="provider"&&a===g.id&&g.credentialId===i,D=d[g.id]??"loading";return s.jsxs(Ls,{index:B,selected:S,tabbable:S||E<0&&B===0,label:jn(g,f),describedBy:`ai-connections-provider-${g.id}-${g.credentialId??"default"}-status`,optionRefs:T,onActivate:()=>M({kind:"provider",provider:g}),onMove:w=>Qs(R,w,e,T),children:[s.jsxs(Yn,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20",style:Rn(g.id)?{backgroundColor:Rn(g.id)}:void 0,children:[s.jsx(Zn,{src:en(g.id),className:"object-cover"}),s.jsx(_n,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:al(g.id)})]}),s.jsx("span",{className:ve("min-w-0 flex-1 truncate text-sm font-medium",S?"text-foreground":"text-foreground/80"),children:jn(g,f)}),s.jsx(rl,{state:D,statusId:`ai-connections-provider-${g.id}-${g.credentialId??"default"}-status`})]},`${g.id}:${g.credentialId??"default"}`)}),C.length===0?s.jsx("p",{className:"p-8 text-center text-xs text-muted-foreground",children:"无结果"}):null]}),u?s.jsx("div",{className:"px-4 py-2",children:s.jsxs(rr,{tone:"destructive",role:"alert",className:"text-xs",children:["连接状态读取失败:",u]})}):null]})}function Ls({index:e,selected:t,tabbable:n,label:r,describedBy:a,statusId:i,optionRefs:c,onActivate:d,onMove:f,children:u}){const h=p=>{if(p.key==="ArrowDown")f(e+1);else if(p.key==="ArrowUp")f(e-1);else if(p.key==="Home")f(0);else if(p.key==="End")f(Number.POSITIVE_INFINITY);else if(p.key==="Enter"||p.key===" "){p.preventDefault(),d();return}else return;p.preventDefault()};return s.jsx("button",{ref:p=>{c.current[e]=p},type:"button",role:"option","aria-selected":t,"aria-label":r,"aria-describedby":a??i,tabIndex:n?0:-1,onClick:d,onKeyDown:h,className:ve("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 Qs(e,t,n,r){const a=Math.min(Math.max(t,0),e.length-1),i=e[a];i&&(i.kind==="section"?n.selectSection(i.id):n.selectProvider(i.provider.id,i.provider.credentialId),r.current[a]?.focus())}function sl({section:e}){return s.jsxs(Yn,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20",children:[s.jsx(Zn,{src:Wr,className:"object-cover"}),s.jsx(_n,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:"XP"})]})}function rl({state:e,statusId:t}){const n=e==="configured"||e==="connected";return s.jsxs("span",{id:t,role:"status","aria-live":"polite",className:"flex shrink-0 items-center gap-1.5",children:[n?s.jsx(Oa,{tone:"info"}):null,s.jsx("span",{className:"text-[11px] font-normal text-muted-foreground",children:il(e)})]})}function al(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 jn(e,t){return e.name||t[e.id]?.name||e.id}function il(e){switch(e){case"unconfigured":return"未设置";case"configured":return"已配置";case"connected":return"已连接";case"attention":return"需处理";default:return"读取中"}}function _e(e){return ei(ol(e))}function ol(e){if(Array.isArray(e.authorizationMethods))return e.authorizationMethods;const t=e.lifecycle==="unavailable"?"unavailable":"active";return[...new Set(e.authModes??[])].map(n=>n==="apiKey"?{id:"api-key",authMode:"apiKey",connectMode:"browserAssistedApiKey",lifecycle:t}:n==="local"?{id:e.kind==="local"?"local-service":"local-session-import",authMode:"local",lifecycle:t}:{id:"device-code",authMode:n,connectMode:"deviceCodeOAuth",lifecycle:t})}function Ot(e){if(e.connectMode)return e.connectMode;if(e.authMode==="oauth"||e.authMode==="deviceCode")return"deviceCodeOAuth";if(e.authMode==="apiKey")return"browserAssistedApiKey"}function nt(e){return e==="deviceCodeOAuth"||e==="authorizationCodeOAuth"}function ra(e){return nt(Ot(e))}function pt(e){return e.authMode==="apiKey"||Ot(e)==="browserAssistedApiKey"}const cl="api-key";function Ct(e){return e.connectMode==="browserAssistedApiKey"&&e.id!==cl}function qs(e){const t=Ot(e);return Ct(e)||t==="authorizationCodeOAuth"?0:t==="deviceCodeOAuth"?1:ds(e)?2:pt(e)?3:4}function ds(e){return e.authMode==="local"}function ll(e){return(e.authModes??[]).some(n=>n==="oauth"||n==="deviceCode")?"deviceCodeOAuth":"browserAssistedApiKey"}function Xt(e){return e?.status==="pending"||e?.status==="authorization_pending"||e?.status==="slow_down"}const aa={"oauth-subscription":"Subscription","api-platform":"API Platform","token-plan":"Token Plan",local:"Local"};function Ee(e){const t=e.label?.trim();if(t)return t;const n=e.kind?aa[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 ul(e){return aa[e]??e}function dl(e,t){const n=(t?.length?t:_e(e)).map(r=>r.authMode==="apiKey"?"API Key":r.authMode==="local"?r.label:"账号授权");return[...new Set(n)].join(" / ")}function ia(e){return e.kind==="oauth-subscription"?`暂不支持订阅接入。订阅通过 ${e.productLabel||"官方客户端"} 使用,API Key 接入与计费独立。`:"暂不可用:该接入方式尚未提供可用的连接流程。"}const fl="当前浏览器无法访问剪贴板,请允许剪贴板访问后重试。";function pl(e=1500){const[t,n]=m.useState(!1),r=m.useRef(void 0);m.useEffect(()=>()=>clearTimeout(r.current),[]);const a=m.useCallback(async i=>{if(!navigator.clipboard?.writeText)throw new Error(fl);await navigator.clipboard.writeText(i),n(!0),clearTimeout(r.current),r.current=setTimeout(()=>n(!1),e)},[e]);return{copied:t,copy:a}}function Et({value:e,label:t,text:n,title:r,variant:a="outline",size:i="sm",disabled:c=!1,className:d,iconClassName:f="h-3.5 w-3.5",copiedIconClassName:u,onError:h}){const{copied:p,copy:y}=pl(),C=n===void 0,R=p?$n:gi,T=()=>{(async()=>{try{await y(typeof e=="function"?e():e)}catch(E){h?.(E)}})()};return s.jsxs(X,{type:"button",variant:a,size:i,disabled:c,className:d,"aria-label":`复制 ${t}`,title:r??`复制 ${t}`,onClick:T,children:[s.jsx(R,{"aria-hidden":"true",className:ve(f,p&&u)}),s.jsx("span",{className:C?"sr-only":"ml-1.5",children:p?"已复制":n??"复制"})]})}function st({label:e,disabled:t,onClick:n,children:r}){return s.jsxs(cn,{children:[s.jsx(ln,{asChild:!0,children:s.jsx(X,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":e,disabled:t,onClick:n,children:r})}),s.jsx(un,{className:"text-xs",children:e})]})}const oa={image:{icon:mr,label:"视觉识别",className:"text-green-500"},pdf:{icon:Ei,label:"文档输入",className:"text-teal-500"},audio:{icon:ui,label:"音频输入",className:"text-cyan-500"},video:{icon:Vi,label:"视频输入",className:"text-indigo-500"},web:{icon:hr,label:"联网搜索",className:"text-blue-500"},tool_call:{icon:Dt,label:"函数调用",className:"text-orange-500"},reasoning:{icon:pr,label:"推理",className:"text-purple-500"},embedding:{icon:pi,label:"向量模型",className:"text-sky-500"},fast:{icon:Gi,label:"快速模型",className:"text-amber-500"}};function ca(e){return Object.prototype.hasOwnProperty.call(oa,e)}function hl({type:e}){if(!ca(e))return null;const t=oa[e],n=t.icon;return s.jsx(It,{children:s.jsxs(cn,{children:[s.jsx(ln,{asChild:!0,children:s.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:s.jsx(n,{"aria-hidden":"true",className:ve("h-3.5 w-3.5",t.className)})})}),s.jsx(un,{children:t.label})]})})}function la(e){return[...new Set([...(e.inputModalities??[]).filter(t=>t!=="text"),...e.capabilities??[]])].filter(ca)}function vt(e){const t=e.id.lastIndexOf("#");return t>=0?e.id.slice(t+1):e.id}function Kn(e){const t=vt(e);return t===e.id?e:{...e,id:t}}function ml({enabled:e,disabled:t=!1,label:n,onToggle:r}){return s.jsx(st,{label:`${e?"停用":"启用"} ${n}`,disabled:t,onClick:r,children:e?s.jsx(gr,{"aria-hidden":"true",className:"h-3.5 w-3.5"}):s.jsx(xr,{"aria-hidden":"true",className:"h-3.5 w-3.5"})})}function ua({value:e,onChange:t}){return s.jsx("div",{className:"relative w-full sm:w-auto",children:s.jsx(ar,{"aria-label":"搜索模型",value:e,onChange:n=>t(n.target.value),placeholder:"搜索模型",className:"sm:w-[232px]",autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0})})}function da({label:e,modelId:t,iconTokens:n=[],enabled:r,toggleDisabled:a=!1,onToggle:i,onEdit:c,onDelete:d,unavailable:f=!1,badges:u}){const h=!!(i||c||d);return s.jsx(gl,{label:e,modelId:t,iconTokens:n,selected:r,unavailable:f,badges:u,actions:h?s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[c?s.jsx(st,{label:`编辑 ${e}`,disabled:a,onClick:c,children:s.jsx(Ar,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null,i?s.jsx(ml,{enabled:r,disabled:a,label:e,onToggle:i}):null,d?s.jsx(st,{label:`删除 ${e}`,disabled:a,onClick:d,children:s.jsx(ts,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null]}):void 0})}function gl({label:e,modelId:t,iconTokens:n=[],badges:r,leading:a,actions:i,selected:c=!1,unavailable:d=!1}){return s.jsxs("div",{className:ve("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",c?"border-primary/40 bg-primary/[0.03]":"border-border/40",d&&"opacity-75"),children:[a,s.jsx("div",{className:"shrink-0 rounded bg-muted/50 p-2 text-muted-foreground transition-colors group-hover:text-primary",children:s.jsx(Dt,{"aria-hidden":"true",className:"h-4 w-4"})}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"truncate text-sm font-medium text-foreground/90",children:e}),s.jsx("div",{className:"flex items-center gap-1",children:n.map(f=>s.jsx(hl,{type:f},f))}),r]}),t&&t!==e?s.jsxs("div",{className:"mt-0.5 flex items-center gap-1.5",children:[s.jsx("code",{className:"max-w-[300px] truncate font-mono text-[10px] text-muted-foreground opacity-70",children:t}),s.jsx(Et,{value:t,label:`${e} ID`,title:"复制 ID",variant:"ghost",size:"icon",className:"h-4 w-4 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",iconClassName:"h-3 w-3",copiedIconClassName:"text-primary"})]}):null]}),i]})}const Al={chat:"对话",embedding:"向量",document_understanding:"文档理解",reranking:"重排",speech_synthesis:"语音合成",speech_recognition:"语音识别",image_generation:"图像生成",video_generation:"视频生成"};function Fn(e){return e.modelType&&e.modelType in Es?e.modelType:Object.keys(Es).find(t=>t!=="chat"&&e.capabilities?.includes(t))??"chat"}function xl({classes:e,selected:t,onChange:n}){return s.jsxs("div",{role:"tablist","aria-label":"模型类型",className:"flex flex-wrap gap-2",children:[e.map(r=>s.jsx("button",{type:"button",role:"tab","aria-selected":r===t,onClick:()=>n(r),className:ve("rounded-md px-3 py-2 text-sm",r===t?"bg-accent text-accent-foreground":"text-muted-foreground"),children:Al[r]},r)),s.jsx("span",{className:"px-3 py-2 text-xs text-muted-foreground",children:"决策 · 待接入"})]})}function yl({label:e,lines:t}){return s.jsx(It,{children:s.jsxs(cn,{children:[s.jsx(ln,{asChild:!0,children:s.jsx("button",{type:"button","aria-label":e,className:"cursor-help rounded-sm text-muted-foreground/50 focus:outline-none focus-visible:text-foreground",children:s.jsx(lr,{"aria-hidden":"true",className:"h-3.5 w-3.5"})})}),s.jsx(un,{className:"max-w-xs space-y-2 text-xs",children:t.map((n,r)=>s.jsx("p",{children:n},r))})]})})}function fa({name:e,mark:t,avatar:n,avatarBackground:r,infoLabel:a,infoLines:i,link:c,links:d=[],badge:f}){return s.jsxs("header",{className:"flex flex-wrap items-start justify-between gap-4",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[s.jsxs(Yn,{className:"h-9 w-9 shrink-0 rounded-lg border border-border/50 bg-muted/50 shadow-sm",style:r?{backgroundColor:r}:void 0,children:[s.jsx(Zn,{src:n,className:"object-cover"}),s.jsx(_n,{className:"rounded-lg bg-transparent text-sm font-bold uppercase text-muted-foreground",children:t})]}),s.jsxs("div",{className:"flex min-w-0 flex-col justify-center gap-0.5",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[s.jsx("h2",{className:"text-base font-semibold leading-none tracking-tight text-foreground",children:e}),s.jsx(yl,{label:a,lines:i})]}),s.jsx("div",{role:"group","aria-label":`${e}官方链接`,className:"flex flex-wrap items-center gap-x-3 gap-y-1",children:[c,...d].map(u=>s.jsxs("a",{href:u.href,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-0.5 text-[10px] leading-none text-muted-foreground transition-colors hover:text-primary",children:[u.label," ",s.jsx(es,{"aria-hidden":"true",className:"h-2.5 w-2.5"})]},u.href))})]})]}),f?s.jsx("div",{className:"shrink-0 whitespace-nowrap",children:f}):null]})}function bl(e){return e.length===0?10:Math.max(...e.map(t=>t.priority))+10}function ht(e){return e.label?.trim()?e.label:e.maskedHint?`API Key · ${e.maskedHint}`:e.authMode==="oauth"||e.authMode==="deviceCode"?"已授权账号":"API Key"}function zs(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 wl(e){return e==="healthy"?"有效":e==="unknown"?"未验证":e==="expired"?"已过期":"错误"}function Cl(e){return e==="healthy"?{row:"bg-emerald-500/5",dot:"bg-emerald-500"}:e==="unknown"?{row:"bg-background",dot:"bg-muted-foreground/50"}:{row:"bg-destructive/5",dot:"bg-destructive"}}function El(e,t=Date.now()){if(e.enabled){switch(e.lastFailureCode){case"authentication":return{message:"密钥无效或已被撤销,已跳过",action:"key"};case"login_expired":return{message:"登录已过期",action:"login"};case"quota_exhausted":return{message:"额度用完了",action:"charge"};case"authorization":return{message:"没有这个模型或地区的权限",action:"reason"};case"rate_limited":{const n=e.rateLimitResetAt?new Date(e.rateLimitResetAt):void 0;return n&&n.getTime()<=t?void 0:{message:n&&Number.isFinite(n.getTime())?`请求太频繁,${n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})} 后自动恢复;先换用下一条连接`:"请求太频繁,稍后自动恢复;先换用下一条连接"}}case"upstream_unavailable":return}if(e.health==="expired")return{message:"登录已过期",action:"login"};if(e.health==="invalid")return{message:"密钥无效或已被撤销,已跳过",action:e.authMode==="apiKey"?"key":"login"}}}function vl({providerName:e,offeringName:t,quota:n,busy:r,disabled:a=!1,credentialLabel:i,multiple:c=!1,compact:d=!1,paused:f=!1,error:u,onRefresh:h}){if(d){const p=!r&&!u&&n?.status==="available";return s.jsx("div",{className:`min-w-0 text-xs text-muted-foreground ${f?"opacity-60":""}`,children:s.jsxs("div",{className:"flex items-start gap-1",children:[s.jsxs("div",{className:"min-w-0 flex-1 truncate py-1 [&>span+span]:ml-3",children:[f?s.jsx("span",{children:"已停用 · 不参与全部刷新"}):null,r?s.jsx("span",{role:"status",children:"正在查询额度…"}):u?s.jsx("span",{role:"alert",title:u,className:"text-destructive",children:u}):n?n.status==="unsupported"?s.jsx("span",{children:"官方额度接口不支持"}):n.status==="error"?s.jsx("span",{role:"alert",className:"text-destructive",children:"额度查询失败"}):s.jsx(Vs,{quota:n}):s.jsx("span",{children:i?"尚未检查":`连接${t}后可查询`}),p&&n.stale?s.jsx("span",{children:"数据可能已过期"}):null]}),s.jsx(Il,{quota:n,label:i??t}),s.jsx(X,{className:"h-6 w-6 shrink-0 p-0",variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}${i?` ${i}`:""}额度`,disabled:r||a,onClick:h,children:r?s.jsx(Te,{"aria-hidden":"true",className:"h-3 w-3 animate-spin"}):s.jsx(Is,{"aria-hidden":"true",className:"h-3 w-3"})})]})})}return s.jsxs("div",{className:`${c?"space-y-1.5":"space-y-3"} border-t border-border/40 pt-3 ${f?"opacity-60":""}`,children:[s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[c?null:s.jsx(Ji,{className:"h-4 w-4 shrink-0 text-primary"}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("div",{className:"break-all text-sm font-medium text-foreground/90",children:c?`凭证:${i}`:"剩余额度"}),c&&!r&&!u&&n?.status==="available"?s.jsx("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground",children:s.jsx(Vs,{quota:n})}):null]})]}),s.jsxs(X,{className:"shrink-0",variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}${c?` ${i}`:""}额度`,disabled:r||a,onClick:h,children:[r?s.jsx(Te,{"aria-hidden":"true",className:"mr-2 h-3.5 w-3.5 animate-spin"}):s.jsx(Is,{"aria-hidden":"true",className:"mr-2 h-3.5 w-3.5"}),r?"查询中":"刷新"]})]}),i&&!c?s.jsxs("p",{className:"text-xs text-muted-foreground",children:["凭证:",i]}):null,f?s.jsx("p",{className:"text-xs text-muted-foreground",children:"已停用 · 不参与全部刷新"}):null,r?s.jsx("p",{role:"status",className:"text-xs text-muted-foreground",children:"正在查询额度…"}):u?s.jsx("p",{role:"alert",className:"text-sm text-destructive",children:u}):n?n.status==="unsupported"?s.jsxs(s.Fragment,{children:[s.jsx("p",{className:"text-sm",children:"官方额度接口不支持"}),s.jsxs("p",{className:"text-xs text-muted-foreground",children:["来源:",n.source]})]}):n.status==="error"?s.jsx("p",{className:"text-sm text-destructive",children:"额度查询失败"}):c?s.jsxs("details",{className:"text-xs text-muted-foreground",children:[s.jsx("summary",{className:"cursor-pointer","aria-label":`${i}额度详情`,children:"详情"}),s.jsx("div",{className:"pt-3",children:s.jsx(On,{quota:n,hideBalance:!0})})]}):s.jsx(On,{quota:n}):s.jsx("p",{className:"text-xs text-muted-foreground",children:i?"尚未检查":`连接${t}后可查询`})]})}function Il({quota:e,label:t}){const[n,r]=m.useState({left:16,top:16,maxHeight:400}),[a,i]=m.useState(!1),c=m.useRef(null),d=m.useRef(null),f=m.useRef(!1);return m.useEffect(()=>{if(!a)return;const u=p=>{!(p.target instanceof Node)||c.current?.contains(p.target)||d.current?.contains(p.target)||(f.current=!0,i(!1))},h=p=>{p.type==="scroll"&&p.target instanceof Node&&d.current?.contains(p.target)||(f.current=!0,i(!1))};return document.addEventListener("pointerdown",u,!0),document.addEventListener("scroll",h,!0),window.addEventListener("resize",h),()=>{document.removeEventListener("pointerdown",u,!0),document.removeEventListener("scroll",h,!0),window.removeEventListener("resize",h)}},[a]),s.jsxs(jt,{modal:!1,open:a,onOpenChange:u=>{f.current=!1,i(u)},children:[s.jsx(ur,{asChild:!0,children:s.jsx(X,{ref:c,className:"h-6 w-6 shrink-0 p-0",variant:"ghost",size:"sm","aria-label":`${t}额度详情`,disabled:!e||e.status==="error",onClick:u=>{const h=u.currentTarget.getBoundingClientRect(),p=Math.min(320,window.innerWidth-32),y=Math.max(16,Math.min(h.right-p,window.innerWidth-p-16)),C=Math.max(16,Math.min(h.bottom+8,window.innerHeight-320));r({left:y,top:C,maxHeight:window.innerHeight-C-16})},children:s.jsx(lr,{"aria-hidden":"true",className:"h-3 w-3"})})}),s.jsxs(Ft,{ref:d,className:"w-[calc(100vw-2rem)] max-w-xs overflow-y-auto p-4",onEscapeKeyDown:()=>c.current?.focus(),onCloseAutoFocus:u=>{f.current&&u.preventDefault()},style:{...n,transform:"none",animation:"none"},"aria-describedby":void 0,children:[s.jsx(kt,{className:"pr-8 text-sm",children:"额度详情"}),e?.status==="available"?s.jsx(On,{quota:e}):e?s.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:["来源:",e.source]}):null]})]})}function Vs({quota:e}){return s.jsxs(s.Fragment,{children:[typeof e.balance=="number"?s.jsxs("span",{children:["余额:",e.balance]}):null,e.windows.map((t,n)=>s.jsxs("span",{children:[Tn(t.name)," · ",pa(t)]},n)),typeof e.balance!="number"&&e.windows.length===0?s.jsx("span",{children:"服务商未返回额度数据"}):null]})}function On({quota:e,hideBalance:t=!1}){return s.jsxs("div",{className:"space-y-3 text-sm",children:[!t&&typeof e.balance=="number"?s.jsxs("div",{children:["余额:",e.balance]}):null,e.windows.map((n,r)=>s.jsxs("div",{className:"space-y-1.5",children:[s.jsxs("div",{className:"flex items-center justify-between gap-3",children:[s.jsx("span",{className:"font-medium text-foreground",children:Tn(n.name)}),s.jsx("span",{className:"text-muted-foreground",children:pa(n)})]}),Gt(n)!==void 0?s.jsx(Yi,{label:`${Tn(n.name)}剩余 ${String(Gt(n))}%`,value:Gt(n)}):null,n.resetsAt?s.jsxs("p",{className:"text-xs text-muted-foreground",children:["重置:",Hs(n.resetsAt)]}):null]},`${String(n.name)}-${r}`)),s.jsxs("p",{className:"text-xs text-muted-foreground",children:["更新:",Hs(e.observedAt)]}),s.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:["来源:",e.source,e.stale?" · 数据可能已过期":""]})]})}function Tn(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 Gt(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 pa(e){const t=Gt(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 Hs(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function jl(e){const t=e.modelDiscovery?.endpointProtocol;return e.endpoints?.find(n=>n.protocol===t)?.baseUrl??e.endpoints?.[0]?.baseUrl}function Fl(e){try{const t=new URL(e);return`${t.host}${t.pathname.replace(/\/$/u,"")}`}catch{return e}}function kl(e){return e==="responses"?"Responses API":e==="chatCompletions"?"Chat API":e==="anthropic"?"Anthropic API":e}function Dl(e){return e==="responses"?"OpenAI Responses 兼容":e==="chatCompletions"?"OpenAI Chat 兼容":e==="anthropic"?"Anthropic Messages 兼容":`${e} 兼容`}function ha({endpoints:e,copy:t=!1,display:n="compact"}){return n==="protocol"?s.jsx("ul",{className:"flex flex-wrap gap-2",children:e.map(r=>{const a=Dl(r.protocol);return s.jsx("li",{children:t?s.jsx(Et,{value:r.baseUrl,label:`${a} 地址`,text:a,variant:"outline",className:"h-7 gap-1.5 px-2 text-[11px] font-normal",iconClassName:"h-3 w-3"}):s.jsx("span",{className:"inline-flex h-7 items-center rounded-md border border-border px-2 text-[11px] text-muted-foreground",children:a})},r.protocol)})}):s.jsx("dl",{className:"space-y-1 text-[11px] text-muted-foreground",children:e.map(r=>{const a=kl(r.protocol);return s.jsxs("div",{className:"flex min-w-0 items-baseline gap-2",children:[s.jsx("dt",{className:"shrink-0 text-foreground/70",children:a}),s.jsx("dd",{className:"min-w-0 truncate font-mono",title:r.baseUrl,children:n==="full"?r.baseUrl:Fl(r.baseUrl)}),t?s.jsx("dd",{className:"shrink-0",children:s.jsx(Et,{value:r.baseUrl,label:`${a} 地址`,variant:"ghost",className:"h-6 gap-1 px-1.5 text-[11px]",iconClassName:"h-3 w-3"})}):null]},`${r.protocol}:${r.baseUrl}`)})})}function Bl({offering:e,methods:t,developerMode:n=!1}){const r=e.endpoints??[],a=Ee(e),i=e.kind?ul(e.kind):void 0,c=i&&i!==a?[i]:[];return s.jsxs("section",{className:"space-y-2","aria-labelledby":`offering-${e.id}`,children:[s.jsxs("div",{className:"flex items-start justify-between gap-3",children:[s.jsxs("div",{children:[s.jsx("h4",{id:`offering-${e.id}`,className:"text-sm font-medium text-foreground",children:a}),c.length?s.jsx("div",{className:"mt-1 flex items-center gap-2 text-xs text-muted-foreground",children:c.map(d=>s.jsx("span",{children:d},d))}):null]}),s.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-x-3 gap-y-1 text-xs",children:[s.jsx("span",{className:"text-muted-foreground",children:dl(e,t)}),e.consoleUrl?s.jsx(Vt,{href:e.consoleUrl,label:"控制台"}):null,e.subscriptionUrl?s.jsx(Vt,{href:e.subscriptionUrl,label:"订阅与账单"}):null,e.quota?.url?s.jsx(Vt,{href:e.quota.url,label:"额度与用量"}):null,e.usagePolicyUrl?s.jsx(Vt,{href:e.usagePolicyUrl,label:"使用政策"}):null]})]}),e.lifecycle==="unavailable"&&!_e(e).some(d=>d.lifecycle==="active")?s.jsx("p",{className:"text-xs text-muted-foreground",children:ia(e)}):null,n&&r.length?s.jsx(ha,{endpoints:r}):null]})}function Vt({href:e,label:t}){return s.jsx("a",{href:e,target:"_blank",rel:"noreferrer",className:"text-primary hover:underline",children:t})}function Sl({methods:e,offering:t,busy:n,disabled:r,onBeginOffering:a,onCreateLocalCredential:i}){return e.length===0?null:s.jsx("div",{className:"flex flex-wrap gap-2",children:e.map(c=>{const d=Ot(c),f=c.lifecycle==="unavailable";return c.label?nt(d)?s.jsxs(X,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",title:f?c.reason:void 0,disabled:n||r||f||!a,onClick:()=>a?.(t,d,c),children:[n?s.jsx(Te,{className:"h-3.5 w-3.5 animate-spin"}):s.jsx(es,{className:"h-3.5 w-3.5"}),c.label]},c.id):ds(c)?s.jsxs(X,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",title:f?c.reason:"导入当前设备已有登录态,不会发起新的浏览器授权。",disabled:n||r||f||!i,onClick:()=>{i?.(t,c)},children:[n?s.jsx(Te,{className:"h-3.5 w-3.5 animate-spin"}):s.jsx(mt,{className:"h-3.5 w-3.5"}),c.label]},c.id):null:null})})}function Nl({definition:e,offering:t,createOfferings:n,status:r,credentials:a,attempt:i,apiKey:c,baseUrl:d,busy:f,disabled:u,error:h,onApiKeyChange:p,onBaseUrlChange:y,onBeginApiKey:C,onBeginBrowser:R,onSaveApiKey:T,onDisconnect:E,onCreateApiKeyCredential:M,onUpdateCredential:g,initialEditing:B,initialCreate:S=!1,onSavingChange:D,onCloseEdit:w}){const A=i?.mode==="browserAssistedApiKey"&&i.status==="pending",j=r==="configured",K=r==="connected",L=!!M,Q=_e(t).find(H=>!pt(H)),[J,U]=m.useState(t.id),_=n.find(H=>H.id===J)??t,[G,ae]=m.useState(!1),[W,de]=m.useState(B?"edit":S&&M?"create":void 0),[te,ue]=m.useState(B),[me,ee]=m.useState(B?.label??""),[ie,se]=m.useState(""),[b,l]=m.useState(B?.baseUrl??""),[v,P]=m.useState(B?.proxyUrl??""),[z,oe]=m.useState(),[pe,ge]=m.useState(!1),[ne,Ce]=m.useState(!1),Ie=m.useRef(!1),xe=m.useRef(!1);m.useEffect(()=>{S&&!M&&!xe.current&&(xe.current=!0,C())},[S,M,C]);const Re=()=>{U(t.id),de("create"),ue(void 0),ee(""),se(""),l(""),P(""),oe(void 0),ge(!1)},Ke=()=>{w(),de(void 0),ue(void 0),ee(""),se(""),l(""),P(""),oe(void 0),ge(!1)},ye=async()=>{if(f||u||Ie.current)return;let H;try{H=ti(v)}catch{oe("Proxy URL 格式无效(支持 http、https)");return}if(oe(void 0),W==="create"){const Y=ie.trim();if(!Y||!M)return;Ie.current=!0,Ce(!0),D?.(!0);try{await M(_,{apiKey:Y,label:me.trim()||void 0,baseUrl:b.trim()||void 0,proxyUrl:H,priority:bl(a.filter(Ae=>Ae.offeringId===_.id))}),Ke()}catch(Ae){oe(Ae instanceof Error?Ae.message:"保存失败,请重试")}finally{Ie.current=!1,Ce(!1),D?.(!1)}return}if(W==="edit"&&te&&g){const Y=v.trim()!==(te.proxyUrl??"").trim();Ie.current=!0,Ce(!0),D?.(!0);try{await g(te,{...ie.trim()?{apiKey:ie.trim()}:{},label:me.trim()||void 0,baseUrl:b.trim()||void 0,...Y?{proxyUrl:H}:{}}),Ke()}catch(Ae){oe(Ae instanceof Error?Ae.message:"保存失败,请重试")}finally{Ie.current=!1,Ce(!1),D?.(!1)}}};return s.jsxs("div",{className:ve("space-y-3",W&&"w-full"),children:[i?.userCode?s.jsxs("div",{className:"border-l-2 border-primary bg-muted/30 px-3 py-2 text-sm",children:["验证码:",s.jsx("strong",{className:"font-mono",children:i.userCode})]}):null,!S&&!B?s.jsxs("div",{className:"flex flex-wrap gap-2",children:[M&&n.length>0?s.jsxs(X,{variant:"outline",size:"sm",disabled:f||u||ne,onClick:Re,children:[s.jsx(mt,{className:"mr-2 h-4 w-4"}),"添加 API Key"]}):null,L?null:K?s.jsxs(s.Fragment,{children:[s.jsxs(X,{variant:"outline",size:"sm",disabled:f||u||ne,onClick:R,children:[f?s.jsx(Te,{className:"mr-2 h-4 w-4 animate-spin"}):s.jsx(Sn,{className:"mr-2 h-4 w-4"}),"重新连接"]}),s.jsxs(X,{variant:"ghost",size:"sm",disabled:f||u||ne,onClick:E,children:[s.jsx(Bi,{className:"mr-2 h-4 w-4"}),"断开连接"]})]}):j?s.jsxs(s.Fragment,{children:[s.jsxs(X,{variant:"outline",size:"sm","aria-label":"更新 API Key",disabled:f||u||ne,onClick:C,children:[s.jsx(vs,{className:"mr-2 h-4 w-4"}),"更新 API Key"]}),s.jsx(X,{variant:"ghost",size:"sm",disabled:f||u||ne,onClick:E,children:"移除配置"})]}):s.jsxs(s.Fragment,{children:[Q?s.jsxs(X,{variant:"outline",size:"sm",title:Q.lifecycle==="unavailable"?Q.reason:void 0,disabled:f||u||ne||Q.lifecycle==="unavailable",onClick:R,children:[f?s.jsx(Te,{className:"mr-2 h-4 w-4 animate-spin"}):s.jsx(es,{className:"mr-2 h-4 w-4"}),Q.label]}):null,s.jsxs(X,{variant:"outline",size:"sm","aria-label":`${e.name} API Key`,disabled:f||u||ne,onClick:C,children:[s.jsx(vs,{className:"mr-2 h-4 w-4"}),"配置 API Key"]})]})]}):null,W?s.jsxs("div",{className:"space-y-2 rounded-lg border border-border/50 bg-muted/10 p-3",children:[W==="create"&&n.length>1?s.jsxs("label",{className:"block space-y-1 text-xs text-muted-foreground",children:[s.jsx("span",{children:"套餐 / 区域"}),s.jsx(zn,{"aria-label":`${e.name} 套餐 / 区域`,value:J,disabled:f||u||ne,onChange:H=>{U(H.target.value),oe(void 0)},className:"h-9",children:n.map(H=>s.jsx("option",{value:H.id,children:Ee(H)},H.id))})]}):null,W==="edit"?s.jsx(Pe,{disabled:f||u||ne,autoComplete:"off","aria-label":`${e.name} API Key 标签`,placeholder:"名称,例如 Work key",value:me,onChange:H=>ee(H.target.value)}):null,W==="create"||W==="edit"?s.jsx(Pe,{disabled:f||u||ne,type:G?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:W==="edit"?"留空保留现有 Key,填写以替换":e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:ie,onChange:H=>se(H.target.value),className:"font-mono"}):null,W==="edit"||pe?s.jsxs(s.Fragment,{children:[s.jsx(Pe,{disabled:f||u||ne,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:jl(W==="edit"?t:_)||e.defaultBaseUrl||"默认服务地址",value:b,onChange:H=>l(H.target.value),className:"font-mono text-xs"}),s.jsx(Pe,{disabled:f||u||ne,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Proxy URL 输入`,placeholder:"http://127.0.0.1:7890",value:v,onChange:H=>P(H.target.value),className:"font-mono text-xs"})]}):null,z?s.jsx("p",{className:"text-xs text-destructive",children:z}):null,s.jsxs("div",{className:"flex flex-wrap gap-2",children:[s.jsx(X,{size:"sm","aria-label":W==="create"?`保存 ${e.name} API Key`:"保存凭证",disabled:f||u||ne||W==="create"&&!ie.trim(),onClick:ye,children:W==="create"?"保存 API Key":"保存凭证"}),s.jsx(X,{variant:"ghost",size:"sm",disabled:ne,onClick:Ke,children:"取消"}),W==="create"?s.jsx(X,{variant:"ghost",size:"sm",disabled:ne,onClick:()=>ge(H=>!H),children:pe?"收起高级设置":"高级设置"}):null]})]}):null,A&&!W?s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:"text-sm font-medium",children:"API Key"}),e.apiKeyUrl?s.jsx("a",{href:e.apiKeyUrl,target:"_blank",rel:"noreferrer",className:"text-xs text-primary hover:underline",children:"获取 API Key"}):null]}),s.jsxs("div",{className:"group relative",children:[s.jsx(Pe,{disabled:f||u||ne,type:G?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:c,onChange:H=>p(H.target.value),className:"border-border/60 bg-muted/20 pr-10 font-mono transition-colors focus:border-primary/50 focus:bg-background"}),s.jsx("div",{className:"absolute bottom-1 right-1 top-1 flex items-center",children:s.jsx(X,{variant:"ghost",size:"icon",className:"h-full w-8 rounded hover:bg-muted",onClick:()=>ae(H=>!H),"aria-label":G?"隐藏 API Key":"显示 API Key",children:G?s.jsx(yi,{className:"h-4 w-4 text-muted-foreground"}):s.jsx(wi,{className:"h-4 w-4 text-muted-foreground"})})})]}),y?s.jsxs("div",{className:"space-y-1.5",children:[s.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:"Base URL(选填)"}),s.jsx(Pe,{disabled:f||u||ne,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:e.defaultBaseUrl||"默认服务地址",value:d,onChange:H=>y(H.target.value),className:"border-border/60 bg-muted/20 font-mono text-xs transition-colors focus:border-primary/50 focus:bg-background"}),s.jsxs("p",{className:"break-all font-mono text-[11px] text-muted-foreground opacity-80",children:[s.jsx("span",{className:"mr-1 select-none opacity-50",children:"预览:"}),(d.trim()||e.defaultBaseUrl||"").replace(/\/+$/,""),"/chat/completions"]})]}):null,s.jsx(X,{size:"sm","aria-label":`保存 ${e.name} API Key`,disabled:!c.trim()||f||u,onClick:T,children:"保存 API Key"})]}):null,h?s.jsx("p",{className:"text-sm text-destructive",children:h}):null]})}function Ml({controller:e,definition:t,offerings:n,apiOfferings:r,credentials:a,status:i,attempt:c,attemptOfferingId:d,apiKey:f,baseUrl:u="",busy:h,disabled:p=!1,error:y,onApiKeyChange:C,onBaseUrlChange:R,onBeginApiKey:T,onBeginBrowser:E,onSaveApiKey:M,onDisconnect:g,onUpdateCredential:B,onCreateApiKeyCredential:S,onBeginOffering:D,onCancelConnect:w,onDismissError:A}){const{editing:j,authorizationOfferingId:K,error:L,saving:Q}=e,J=j||K?n.filter(U=>U.id===(j?.offeringId??K)):r;return s.jsx(jt,{open:e.open,onOpenChange:U=>{U||Q||(c&&Xt(c)&&nt(c.mode)&&w?.({mode:c.mode,attemptId:c.attemptId,state:c.state,signature:c.signature,...c.offeringId?{offeringId:c.offeringId}:{}}),e.close())},children:s.jsxs(Ft,{className:"max-h-[85vh] overflow-y-auto sm:max-w-lg","aria-describedby":void 0,children:[s.jsx(dn,{children:s.jsx(kt,{children:e.title})}),s.jsx("div",{className:"space-y-5","aria-label":"添加连接",children:e.choosingConsole?s.jsxs(s.Fragment,{children:[s.jsx("p",{className:"text-sm text-muted-foreground",children:"打开服务商控制台创建 API Key,再回到 Xpod 填写。此入口不会进行账号授权。"}),n.map(U=>{const _=_e(U).find(Ct);return _?s.jsx(X,{variant:"outline",className:"w-full",disabled:h||p||_.lifecycle!=="active",title:_.reason,onClick:()=>e.beginBrowser(U,_),children:Ee(U)},U.id):null})]}):J.map(U=>{const _=Xt(c)&&nt(c?.mode)&&(d??c?.offeringId)!==U.id,G=p||Q||_,ae=_e(U),W=ae.filter(b=>b.lifecycle==="active"),de=W.some(pt),te=d===U.id?c:void 0,ue=y?.offeringId===U.id?y.authorization:void 0,me=ae.find(b=>b.id===(ue?.authorizationMethodId??te?.authorizationMethodId))??W.find(ra),ee=ue?.mode??te?.mode??(me?Ot(me):ll(U)),ie=y?.offeringId===U.id?y.message:void 0;if(U.lifecycle==="unavailable"&&W.length===0)return s.jsxs("fieldset",{"data-create-offering":U.id,className:"space-y-2 border-t border-border/50 pt-3 first:border-t-0 first:pt-0",children:[s.jsx("legend",{className:"px-1 text-sm font-medium",children:Ee(U)}),s.jsx("p",{className:"text-xs text-muted-foreground",children:ia(U)})]},U.id);const se=ue?.mode;return ie&&nt(se)?s.jsxs("fieldset",{"data-create-offering":U.id,disabled:G,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ee(U)}接入操作`,children:[s.jsx("legend",{className:"px-1 text-sm font-medium",children:Ee(U)}),te?.status==="unsupported"?s.jsx("p",{className:"text-sm",children:"当前部署未启用账号授权"}):s.jsx(Ta,{title:"登录未完成",description:ie,primaryLabel:"重试登录",onPrimary:()=>D?.(U,se,me),secondaryLabel:"关闭",onSecondary:()=>{A?.(),e.close()}})]},U.id):Xt(te)&&nt(ee)?s.jsxs("fieldset",{"data-create-offering":U.id,disabled:G,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ee(U)}接入操作`,children:[s.jsx("legend",{className:"px-1 text-sm font-medium",children:Ee(U)}),s.jsx(ys,{title:"正在连接",detail:ee==="authorizationCodeOAuth"?"等待网页授权,请在打开的页面完成登录。":te?.userCode?`验证码:${te.userCode}`:"请在打开的页面完成授权。",providerLabel:me?.label??Ee(U),providerHost:t.name}),s.jsx(X,{variant:"ghost",size:"sm",disabled:p,onClick:()=>{te&&w?.({mode:te.mode,attemptId:te.attemptId,state:te.state,signature:te.signature,...te.offeringId?{offeringId:te.offeringId}:{}}),e.close()},children:"取消连接"})]},U.id):s.jsxs("fieldset",{"data-create-offering":U.id,disabled:G,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ee(U)}接入操作`,children:[s.jsx("legend",{className:"px-1 text-sm font-medium",children:Ee(U)}),de&&K?s.jsx("p",{className:"text-sm text-muted-foreground",children:"请在控制台创建 API Key,再返回此处填写;无需等待网页授权。"}):null,de?s.jsx(Nl,{definition:t,offering:U,status:i,createOfferings:[U],initialCreate:!j,credentials:a,initialEditing:j?.offeringId===U.id?j:void 0,onCloseEdit:e.close,onSavingChange:e.setSaving,attempt:te??(!d&&!c?.offeringId&&c?.mode==="browserAssistedApiKey"?c:void 0),apiKey:f,baseUrl:u,busy:h,disabled:G,onApiKeyChange:C,onBaseUrlChange:R,onBeginApiKey:T,onBeginBrowser:E,onSaveApiKey:M,onDisconnect:g,onUpdateCredential:B,onCreateApiKeyCredential:S},`${U.id}:${j?.id??""}`):null,K&&!de&&!ie?s.jsx(ys,{title:"正在连接",detail:"正在启动授权,请稍候。",providerLabel:Ee(U),providerHost:t.name}):null,ie?s.jsx("p",{className:"w-full text-sm text-destructive",children:ie}):null]},U.id)})}),L?s.jsx("p",{role:"alert",className:"text-sm text-destructive",children:L}):null]})})}function Ul({credential:e,offering:t,onReconnect:n,label:r,busy:a,disabled:i,dragHandle:c,kindLabel:d,quota:f,onToggle:u,onTest:h,onEdit:p,onDelete:y,deleteAriaLabel:C}){const[R,T]=m.useState(Date.now),[E,M]=m.useState(!1);m.useEffect(()=>{const A=e.rateLimitResetAt?new Date(e.rateLimitResetAt).getTime():0;if(A<=Date.now()||!Number.isFinite(A))return;const j=setTimeout(()=>T(Date.now()),Math.min(A-Date.now()+1,2147483647));return()=>clearTimeout(j)},[e.rateLimitResetAt]);const g=El(e,Math.max(R,Date.now())),B=t?.subscriptionUrl??t?.consoleUrl,S=i||a,D=Cl(e.health),w=`${e.enabled?"已启用":"已停用"} · ${wl(e.health)}`;return s.jsxs("div",{"data-credential-state":e.enabled?"enabled":"disabled",className:ve("flex flex-wrap items-center gap-x-3 gap-y-2 rounded-[inherit] px-4 py-3 transition-colors",e.enabled?D.row:"bg-muted/40 opacity-70"),children:[c,s.jsxs(cn,{children:[s.jsx(ln,{asChild:!0,children:s.jsx("span",{"aria-label":w,className:ve("h-2 w-2 shrink-0 rounded-full",e.enabled?D.dot:"bg-muted-foreground/40")})}),s.jsx(un,{className:"text-xs",children:w})]}),s.jsxs("div",{className:"min-w-0 flex-1 basis-24",children:[s.jsx("p",{className:"truncate text-sm font-medium text-foreground",children:r}),d?s.jsx("p",{className:"text-xs text-muted-foreground",children:d}):null,e.maskedHint&&!r.includes(e.maskedHint)?s.jsx("p",{className:"mt-1 truncate font-mono text-xs text-muted-foreground",children:e.maskedHint}):null]}),s.jsx("div",{className:"order-last w-full min-w-0 sm:order-none sm:w-auto sm:max-w-[45%]",role:"group","aria-label":`${ht(e)}额度`,children:f}),g?s.jsxs("div",{role:"alert",className:"order-last flex w-full flex-wrap items-center gap-2 text-sm text-destructive",children:[s.jsx("span",{children:g.message}),g.action==="key"||g.action==="login"?s.jsx(X,{size:"sm",variant:"outline",disabled:S,onClick:g.action==="key"?p:n,children:g.action==="key"?"换一把 Key":"重新登录"}):null,g.action==="charge"&&B?s.jsx("a",{href:B,target:"_blank",rel:"noreferrer",className:"text-primary",children:"去充值 ↗"}):null,g.action==="reason"?s.jsx(X,{size:"sm",variant:"outline",onClick:()=>M(A=>!A),children:"查看原因"}):null,E&&g.action==="reason"?s.jsx("span",{className:"w-full text-xs text-muted-foreground",children:"服务商未允许这条连接访问所请求的模型,请在控制台检查模型权限和可用地区。"}):null]}):null,s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[t?.consoleUrl||t?.subscriptionUrl?s.jsxs("details",{className:"relative text-sm",children:[s.jsx("summary",{"aria-label":`${r} 更多操作`,className:"cursor-pointer px-2 py-1",children:"⋯"}),s.jsxs("div",{className:"absolute right-0 z-10 min-w-32 rounded-md border bg-popover p-2 shadow-md",children:[t.consoleUrl?s.jsx("a",{className:"block py-1",href:t.consoleUrl,target:"_blank",rel:"noreferrer",children:"控制台 ↗"}):null,t.subscriptionUrl?s.jsx("a",{className:"block py-1",href:t.subscriptionUrl,target:"_blank",rel:"noreferrer",children:"订阅与账单 ↗"}):null]})]}):null,h?s.jsx(st,{label:`测试连接 ${r}`,disabled:S,onClick:()=>h(e),children:s.jsx(Pi,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,p?s.jsx(st,{label:`编辑 ${r}`,disabled:S,onClick:p,children:s.jsx(Ar,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,u?s.jsx(st,{label:`${e.enabled?"停用":"启用"} ${r}`,disabled:S,onClick:()=>u(e,{enabled:!e.enabled}),children:e.enabled?s.jsx(gr,{"aria-hidden":"true",className:"h-3.5 w-3.5"}):s.jsx(xr,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,y?s.jsx(st,{label:C??`删除 ${r}`,disabled:S,onClick:y,children:s.jsx(ts,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null]})]})}function Pl({credentials:e,disabled:t,onMove:n,children:r}){const a=m.useRef(null),i=m.useRef(null),c=m.useRef(void 0),d=m.useRef(void 0),f=m.useRef(null),u=m.useRef(void 0),h=m.useRef(t),[p,y]=m.useState(""),C=t||!n||e.length<2,R=e.map(w=>w.id).join("\0"),T=()=>Array.from(a.current?.querySelectorAll("[data-sortable-credential]")??[]),E=()=>{c.current!==void 0&&cancelAnimationFrame(c.current),d.current!==void 0&&clearTimeout(d.current),c.current=void 0,d.current=void 0;for(const w of T()){for(const A of["transform","transition","zIndex","position","boxShadow","willChange","backgroundColor"])w.style[A]="";delete w.dataset.dragging}},M=()=>{const w=f.current;if(!w)return;f.current=null,E();const A=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1,j=T();for(const K of j){const L=w.get(K.dataset.sortableCredential);if(!L||A)continue;const Q=K.getBoundingClientRect();K.style.transition="none",K.style.transform=`translateY(${L.top-Q.top}px)`}a.current?.getBoundingClientRect(),c.current=requestAnimationFrame(()=>{c.current=void 0;for(const K of j)K.style.transition=A?"none":"transform 160ms ease-out, box-shadow 160ms ease-out",K.style.transform="translateY(0px)";d.current=setTimeout(E,A?0:180)})},g=w=>{const A=i.current;if(A){if(c.current!==void 0&&cancelAnimationFrame(c.current),f.current=new Map(A.rows.map(j=>[j.dataset.sortableCredential,j.getBoundingClientRect()])),u.current=R,w&&A.from!==A.to&&!C){const j=A.rects[A.from],K=A.rects[A.to],L=Math.max(0,A.rects[1].top-A.rects[0].bottom),Q=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;A.rows.forEach((J,U)=>{const _=U===A.from?A.from<A.to?K.bottom-j.bottom:K.top-j.top:A.from<U&&U<=A.to?-(j.height+L):A.to<=U&&U<A.from?j.height+L:0;J.style.transition=Q?"none":"transform 160ms ease-out",J.style.transform=`translateY(${_}px)`;const G=A.rects[U];f.current.set(J.dataset.sortableCredential,{...G,top:G.top+_,bottom:G.bottom+_})})}i.current=null,A.handle.hasPointerCapture?.(A.pointerId)&&A.handle.releasePointerCapture?.(A.pointerId),w&&!C&&e[A.from]?.id===A.id&&B(A.from,A.to),c.current=requestAnimationFrame(()=>{c.current=void 0,(!w||!h.current)&&M()}),d.current=setTimeout(M,1e4)}},B=(w,A)=>{C||w===A||A<0||A>=e.length||(n?.(w,A),y(`已请求将${ht(e[w])}移至第 ${A+1} 位`))},S=m.useRef({finish:g,settle:M,clearMotion:E});m.useLayoutEffect(()=>{S.current={finish:g,settle:M,clearMotion:E},h.current=t}),m.useLayoutEffect(()=>{i.current&&S.current.finish(!1),f.current&&(u.current!==R||!t)&&S.current.settle()},[R,C,t]),m.useEffect(()=>()=>{const w=i.current;i.current=null,f.current=null,w?.handle.hasPointerCapture?.(w.pointerId)&&w.handle.releasePointerCapture?.(w.pointerId),S.current.clearMotion()},[]);const D=()=>{c.current=void 0;const w=i.current;if(!w)return;const A=w.rects[w.from],j=w.rects.length>1?Math.max(0,w.rects[1].top-w.rects[0].bottom):0;w.rows.forEach((K,L)=>{const Q=L===w.from?w.y-w.startY:w.from<L&&L<=w.to?-(A.height+j):w.to<=L&&L<w.from?A.height+j:0;K.style.transform=`translateY(${Q}px)`})};return s.jsx(dr,{asChild:!0,ref:a,className:ve("divide-y-0 bg-transparent",e.length>0?"border-border/70":"border-0 rounded-none"),children:s.jsxs("div",{children:[s.jsx("span",{className:"sr-only",role:"status",children:p}),e.map((w,A)=>s.jsx("div",{"data-sortable-credential":w.id,className:"border-b border-border/60 first-of-type:rounded-t-xl last-of-type:rounded-b-xl last:border-b-0",children:r(w,n?s.jsx("button",{type:"button",disabled:C,"aria-label":`拖动排序 ${ht(w)}`,title:e.length<2?"至少添加两条连接后可拖动排序":"拖动调整优先级,或使用方向键、Home / End 排序",className:ve("flex h-8 w-6 shrink-0 touch-none select-none items-center justify-center rounded text-muted-foreground hover:text-foreground disabled:opacity-40 enabled:cursor-grab active:cursor-grabbing",oi),onKeyDown:j=>{if(j.key==="Escape"){g(!1);return}const K=j.key==="ArrowUp"?A-1:j.key==="ArrowDown"?A+1:j.key==="Home"?0:j.key==="End"?e.length-1:void 0;K!==void 0&&(j.preventDefault(),B(A,K))},onPointerDown:j=>{if(C||j.button!==0||i.current)return;j.preventDefault(),f.current=null,E(),j.currentTarget.focus(),j.currentTarget.setPointerCapture?.(j.pointerId);const K=T(),L=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;i.current={id:w.id,from:A,to:A,pointerId:j.pointerId,startY:j.clientY,y:j.clientY,handle:j.currentTarget,rows:K,rects:K.map(Q=>Q.getBoundingClientRect())};for(const[Q,J]of K.entries())J.style.willChange="transform",J.style.transition=L||Q===A?"none":"transform 160ms ease-out",Q===A&&(J.dataset.dragging="true",J.style.position="relative",J.style.zIndex="10",J.style.boxShadow="0 8px 24px rgb(0 0 0 / 0.18)",J.style.backgroundColor="hsl(var(--card))")},onPointerMove:j=>{const K=i.current;if(!K||K.pointerId!==j.pointerId||C)return;K.y=j.clientY;let L=1/0;K.rects.forEach((Q,J)=>{const U=Math.abs(j.clientY-(Q.top+Q.bottom)/2);U<L&&(L=U,K.to=J)}),c.current===void 0&&(c.current=requestAnimationFrame(D))},onPointerUp:j=>{i.current?.pointerId===j.pointerId&&g(!0)},onPointerCancel:j=>{i.current?.pointerId===j.pointerId&&g(!1)},onLostPointerCapture:j=>{i.current?.pointerId===j.pointerId&&g(!1)},children:s.jsx(ji,{"aria-hidden":"true",className:"h-4 w-4"})}):null)},w.id))]})})}function Rl({attempt:e,onDismissError:t,onBeginOffering:n,onBeginBrowser:r,onCreateLocalCredential:a}){const[i,c]=m.useState(!1),[d,f]=m.useState(!1),[u,h]=m.useState(),[p,y]=m.useState(),[C,R]=m.useState(),[T,E]=m.useState(!1),M=d||i||!!u||!!p,g=m.useCallback(()=>{f(!1),c(!1),y(void 0),h(void 0),R(void 0)},[]),B=m.useRef(e);m.useEffect(()=>{const L=B.current;B.current=e,M&&e!==L&&e?.status==="completed"&&g()},[e,M,g]);const S=m.useCallback(()=>{R(void 0),t?.()},[t]),D=m.useCallback(()=>{S(),c(!0)},[S]),w=m.useCallback((L,Q)=>{if(S(),!L){f(!0);return}f(!1),c(!0),y(L.id),n?n(L,"browserAssistedApiKey",Q):r()},[S,r,n]),A=m.useCallback((L,Q,J)=>{S(),y(L.id),n?.(L,Q,J)},[S,n]),j=m.useCallback(async(L,Q)=>{if(a){S(),E(!0);try{await a(L,Q)}catch(J){R(J instanceof Error?J.message:"连接失败,请重试")}finally{E(!1)}}},[S,a]),K=m.useCallback(L=>{h(L)},[]);return{open:M,choosingConsole:d,title:d?"选择控制台":u?"编辑连接":i?"新建连接":p?"连接账号":"新建连接",...u?{editing:u}:{},...p?{authorizationOfferingId:p}:{},...C?{error:C}:{},saving:T,beginApiKey:D,beginEdit:K,beginAuthorization:A,beginBrowser:w,beginLocal:j,setSaving:E,close:g}}function Kl({definition:e,product:t,status:n,accountLabel:r,attempt:a,attemptOfferingId:i,apiKey:c,baseUrl:d="",busy:f,disabled:u=!1,developerMode:h=!1,error:p,suppressError:y=!1,quotas:C={},onApiKeyChange:R,onBaseUrlChange:T,onBeginApiKey:E,onBeginOffering:M,onCancelConnect:g,onBeginBrowser:B,onSaveApiKey:S,onDisconnect:D,onCreateApiKeyCredential:w,onCreateLocalCredential:A,onUpdateCredential:j,onDeleteCredential:K,onTestCredential:L,onReorderCredentials:Q,onRefreshQuota:J,onDismissError:U}){const _=[{id:"api-platform",label:"API Key",kind:"api-platform",authModes:["apiKey"]}],G=t?.credentials??[],ae=t?.offerings.length?t.offerings:_,W=ae.map(l=>({offering:l,methods:_e(l)})),de=W.filter(l=>l.methods.some(v=>v.lifecycle==="active"&&pt(v))).map(l=>l.offering),te=W.flatMap(l=>l.methods).find(l=>pt(l)&&!Ct(l)&&l.lifecycle==="active"&&l.label)??W.flatMap(l=>l.methods).find(l=>pt(l)&&!Ct(l)&&l.label),me=[...W.flatMap(l=>l.methods.filter(v=>v.label&&(ra(v)||ds(v))).map(v=>({offering:l.offering,method:v}))).map(l=>({key:`${l.offering.id}:${l.method.id}`,rank:qs(l.method),authorization:l})),...te?[{key:"api-key",rank:qs(te),apiKeyMethod:te}]:[]].sort((l,v)=>l.rank-v.rank),ee=Xt(a)&&nt(a?.mode),ie=[...G].sort((l,v)=>l.priority-v.priority),se=G.some(l=>C[l.id]?.busy),b=Rl({attempt:a,onDismissError:U,onBeginOffering:M,onBeginBrowser:B,onCreateLocalCredential:A});return s.jsx(It,{children:s.jsxs("section",{className:"space-y-3","aria-label":"当前连接",children:[s.jsx(fr,{level:3,className:"items-center gap-2",titleClassName:"flex items-center gap-2 text-sm font-medium text-foreground/90",title:s.jsxs(s.Fragment,{children:[s.jsx(yr,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"当前连接"]}),actions:s.jsxs("div",{"data-testid":"provider-connect-actions",className:"flex flex-wrap items-center justify-end gap-2",children:[G.length>1?s.jsx(X,{variant:"ghost",size:"sm","aria-label":`刷新全部 ${e.name}额度`,disabled:u||se||!G.some(l=>l.enabled)||!J,onClick:()=>ae.forEach(l=>J?.(l)),children:se?"查询中":"刷新全部额度"}):null,me.map(l=>"authorization"in l?s.jsx("fieldset",{className:"m-0 min-w-0 border-0 p-0","aria-label":`${Ee(l.authorization.offering)}快捷接入`,children:s.jsx(Sl,{methods:[l.authorization.method],offering:l.authorization.offering,busy:f||b.saving,disabled:u||ee,onBeginOffering:M?b.beginAuthorization:void 0,onCreateLocalCredential:A?b.beginLocal:void 0})},l.key):s.jsxs(X,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs","aria-label":"新建 API Key 连接",title:l.apiKeyMethod.lifecycle==="unavailable"?l.apiKeyMethod.reason:void 0,disabled:f||b.saving||u||ee||l.apiKeyMethod.lifecycle==="unavailable"||!t&&n==="pending"&&!a,onClick:b.beginApiKey,children:[s.jsx(mt,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),l.apiKeyMethod.label]},l.key))]})}),W.filter(({offering:l,methods:v})=>l.lifecycle==="unavailable"&&!v.some(P=>P.lifecycle==="active")).map(({offering:l,methods:v})=>s.jsx(Bl,{offering:l,methods:v,developerMode:h},l.id)),G.some(l=>l.enabled&&(l.health==="expired"||l.health==="invalid"||l.lastFailureCode==="quota_exhausted"))?s.jsxs("p",{role:"status",className:"text-sm text-destructive",children:[G.length," 条里有 ",G.filter(l=>l.enabled&&l.health==="healthy"&&l.lastFailureCode!=="quota_exhausted").length," 条已验证可用"]}):null,G.some(l=>l.enabled&&l.lastFailureCode==="upstream_unavailable")?s.jsx("p",{role:"status",className:"text-sm text-destructive",children:"连接暂时不可用,请检查网络或稍后重试。"}):null,s.jsxs("div",{"aria-label":"凭据列表",className:"space-y-2",children:[s.jsx(Pl,{credentials:ie,disabled:f||u,onMove:Q?(l,v)=>{const P=ae.find(z=>z.id===ie[l]?.offeringId);P&&Q(P,ie,l,v)}:void 0,children:(l,v)=>{const P=ae.find(ge=>ge.id===l.offeringId);if(!P)return null;const z=l.authMode==="apiKey"?ht(l):l.label?zs(l.label):ht(l),oe=C[l.id],pe=oe?.credentialId===l.id?oe:void 0;return s.jsx(Ul,{credential:l,label:z,dragHandle:v,kindLabel:Ee(P),offering:P,onReconnect:()=>{const ge=_e(P).find(ne=>ne.lifecycle==="active"&&ne.authMode===l.authMode);ge&&b.beginAuthorization(P,ge.connectMode??"connectUnsupported",ge)},busy:f,disabled:u,onToggle:j?(ge,ne)=>{j(ge,ne).catch(()=>{})}:void 0,onTest:L,onEdit:l.authMode==="apiKey"?()=>b.beginEdit(l):void 0,onDelete:()=>l.authMode==="apiKey"?K?.(l):D(l),deleteAriaLabel:l.authMode==="apiKey"?`删除 ${z}`:`${z} 移除`,quota:s.jsx(vl,{compact:!0,providerName:e.name,offeringName:Ee(P),credentialLabel:ht(l),multiple:G.length>1,quota:pe?.quota,busy:pe?.busy??!1,error:pe?.error,paused:!l.enabled,disabled:u||!J,onRefresh:()=>J?.(P,l)})})}}),G.length?null:s.jsx("p",{className:"flex items-center gap-2 py-6 text-sm text-muted-foreground",children:r?zs(r):"尚未添加连接"}),G.length===0&&(n==="configured"||n==="connected")?s.jsx(X,{variant:"ghost",size:"sm",disabled:f||u,onClick:()=>D(),children:n==="configured"?"移除配置":"断开连接"}):null]}),s.jsx(Ml,{controller:b,definition:e,offerings:ae,apiOfferings:de,credentials:G,status:n,attempt:a,attemptOfferingId:i,apiKey:c,baseUrl:d,busy:f,disabled:u,error:p,onApiKeyChange:R,onBaseUrlChange:T,onBeginApiKey:E,onBeginBrowser:B,onSaveApiKey:S,onDisconnect:D,onUpdateCredential:j,onCreateApiKeyCredential:w,onBeginOffering:M,onCancelConnect:g,onDismissError:U}),b.error&&!b.open&&b.error!==p?.message?s.jsx("p",{role:"alert",className:"text-sm text-destructive",children:b.error}):null,p&&(p.offeringId?!b.open:!y)?s.jsx("p",{role:"alert",className:"text-sm text-destructive",children:p.message}):null]})})}function Ol({definition:e,product:t,status:n,accountLabel:r,attempt:a,attemptOfferingId:i,apiKey:c,baseUrl:d="",busy:f,disabled:u=!1,developerMode:h=!1,error:p,quotas:y,models:C,verifyPending:R=!1,onApiKeyChange:T,onBaseUrlChange:E,onBeginApiKey:M,onBeginOffering:g,onCancelConnect:B,onBeginBrowser:S,onSaveApiKey:D,onDisconnect:w,onCreateApiKeyCredential:A,onCreateLocalCredential:j,onUpdateCredential:K,onDeleteCredential:L,onTestCredential:Q,onReorderCredentials:J,onRefreshQuota:U,onVerify:_,onAddModel:G,onEditModel:ae,onDeleteModel:W,selectedModelIds:de,modelSelectionStatus:te,onModelSelectionChange:ue,onDismissError:me}){const ee=t?.offerings.find(Y=>Y.consoleUrl&&_e(Y).some(Ct))?.consoleUrl,ie=n==="configured",se=n==="connected",b=C.length===0&&p?.message&&!p.offeringId?p.message:void 0,[l,v]=m.useState(""),[P,z]=m.useState("chat"),[oe,pe]=m.useState(de??[]),ge=de??oe,ne=m.useMemo(()=>Ll(C),[C]),Ce=[...new Set(ne.map(Fn))],Ie=Ce.includes(P)?P:Ce[0],xe=Y=>Y.selectionIds.some(Ae=>ge.includes(Ae)),Re=m.useMemo(()=>{const Y=l.trim().toLocaleLowerCase();return ne.filter(Ae=>Fn(Ae)===Ie&&(!Y||Ae.searchText.includes(Y)))},[ne,l,Ie]),Ke=ne.filter(xe).length,ye=ne.filter(Y=>Y.availability==="unavailable").length,H=Y=>{const Ae=new Set(ge),Le=xe(Y);for(const $ of Le?Y.selectionIds:Y.availableSelectionIds)Le?Ae.delete($):Ae.add($);const re=[...Ae];de===void 0&&pe(re),ue?.(e.id,re)};return s.jsx(It,{children:s.jsxs("div",{className:"space-y-8",children:[s.jsx(fa,{name:e.name,mark:Tl(e.id),avatar:en(e.id),avatarBackground:Rn(e.id),infoLabel:"提供商说明",infoLines:[e.description,"连接凭据保存在当前 Pod,由 Pod 权限保护。"],link:{href:e.homeUrl,label:"访问官网"},links:ee?[{href:ee,label:"打开工作台"}]:[],badge:s.jsx(dt,{variant:se||ie?"default":"secondary",children:Ql(n)})}),s.jsx(Kl,{definition:e,product:t,status:n,accountLabel:r,attempt:a,attemptOfferingId:i,apiKey:c,baseUrl:d,busy:f,disabled:u,developerMode:h,error:p,suppressError:!!b,quotas:y,onApiKeyChange:T,onBaseUrlChange:E,onBeginApiKey:M,onBeginOffering:g,onCancelConnect:B,onBeginBrowser:S,onSaveApiKey:D,onDisconnect:w,onCreateApiKeyCredential:t?.offerings.length?A:void 0,onCreateLocalCredential:t?.offerings.length?j:void 0,onUpdateCredential:K,onDeleteCredential:L,onTestCredential:Q,onReorderCredentials:J,onRefreshQuota:U,onDismissError:me}),s.jsxs("section",{className:"space-y-8",children:[s.jsxs("div",{"data-testid":"provider-models-header",className:"flex flex-wrap items-center justify-between gap-2",children:[s.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1",children:[s.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[s.jsx(Dt,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"可用模型"]}),s.jsxs("span",{className:"text-xs text-muted-foreground",children:["共 ",ne.length," · 已加入 ",Ke," · 已失效 ",ye]}),te==="saving"?s.jsxs("span",{role:"status","aria-live":"polite","aria-atomic":"true",className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[s.jsx(Te,{"aria-hidden":"true",className:"h-3 w-3 animate-spin motion-reduce:animate-none"}),"保存中…"]}):null,te==="saved"?s.jsxs("span",{role:"status","aria-live":"polite","aria-atomic":"true",className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[s.jsx($n,{"aria-hidden":"true",className:"h-3 w-3"}),"已保存"]}):null]}),s.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:[(ie||se)&&(_||G)?s.jsxs(s.Fragment,{children:[G?s.jsxs(X,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||f,onClick:G,children:[s.jsx(mt,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"添加模型"]}):null,_&&C.length>0?s.jsxs(X,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||f||R,onClick:_,children:[R?s.jsx(Te,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):s.jsx(Sn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),R?"同步中...":"刷新模型"]}):_?s.jsxs(X,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||f||R,onClick:_,children:[R?s.jsx(Te,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):s.jsx(Sn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),R?"同步中...":"同步模型"]}):null]}):null,s.jsx(ua,{value:l,onChange:v})]})]}),Ie?s.jsx(xl,{classes:Ce,selected:Ie,onChange:z}):null,C.length===0?s.jsx(yt,{className:b?"text-destructive":void 0,description:b??"暂无可用模型"}):Re.length===0?s.jsx(yt,{description:"未找到匹配的模型"}):s.jsx("div",{className:"grid gap-2",children:Re.map(Y=>{const Ae=ma(Y),Le=xe(Y),re=Y.availability==="unavailable",$=Y.displayName??Y.id,k=la(Y);return s.jsx(da,{label:$,modelId:Y.id,iconTokens:k,enabled:Le,toggleDisabled:u||f||re&&!Le,onToggle:()=>H(Y),onEdit:Y.custom&&ae?()=>ae(Y):void 0,onDelete:Y.custom&&W?()=>W(Y):void 0,unavailable:re,badges:s.jsxs(s.Fragment,{children:[Fn(Y)==="embedding"&&Y.dimension?s.jsxs("span",{className:"text-xs text-muted-foreground",children:[Y.dimension," 维"]}):null,Y.custom?s.jsx(dt,{variant:"outline",className:"shrink-0 text-[10px] font-normal",children:"手工"}):null,re?s.jsx(dt,{variant:"destructive",className:"shrink-0 text-[10px] font-normal",children:"已失效"}):null]})},Ae)})})]})]})})}function Tl(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 ma(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function Ll(e){const t=new Map;for(const n of e){const r=`${n.provider}\0${n.id}`,a=ma(n),i=t.get(r),c=[n.id,n.displayName].filter(Boolean).join(`
|
|
5
|
+
`).toLocaleLowerCase();if(!i){t.set(r,{...n,selectionIds:[a],availableSelectionIds:n.availability==="unavailable"?[]:[a],searchText:c});continue}i.selectionIds.includes(a)||i.selectionIds.push(a),n.availability!=="unavailable"&&!i.availableSelectionIds.includes(a)&&i.availableSelectionIds.push(a),n.availability!=="unavailable"&&(i.availability=n.availability),i.capabilities=[...new Set([...i.capabilities??[],...n.capabilities??[]])],i.inputModalities=[...new Set([...i.inputModalities??[],...n.inputModalities??[]])],i.searchText+=`
|
|
6
|
+
${c}`}return[...t.values()]}function Ql(e){switch(e){case"pending":return"连接中";case"configured":return"已配置";case"connected":return"已连接";case"disconnected":return"未设置";case"reauthRequired":return"需要重新登录";case"failed":return"连接失败";default:return"未检查"}}const ql=[{id:"image",label:"视觉识别",icon:mr}],zl=[{id:"tool_call",label:"函数调用",icon:Dt},{id:"reasoning",label:"推理",icon:pr},{id:"web",label:"联网搜索",icon:hr}];function Vl({open:e,providerName:t,initialValue:n,error:r,saving:a=!1,onOpenChange:i,onSave:c}){const d=!!n,[f,u]=m.useState(""),[h,p]=m.useState(""),[y,C]=m.useState([]),[R,T]=m.useState([]);m.useEffect(()=>{e&&(u(n?.id??""),p(n?.name??""),C(n?.inputModalities??[]),T(n?.capabilities??[]))},[n,e]);const E=f.trim(),M=!!E&&!a,g=(S,D,w)=>{D(S.includes(w)?S.filter(A=>A!==w):[...S,w])},B=(S,D,w)=>{const A=D.includes(S.id),j=S.icon;return s.jsxs("button",{type:"button","aria-pressed":A,disabled:a,onClick:()=>g(D,w,S.id),className:ve("flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors",A?"border-primary/50 bg-primary/10 text-primary":"border-border/60 text-muted-foreground hover:border-border hover:text-foreground"),children:[s.jsx(j,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),S.label]},S.id)};return s.jsx(jt,{open:e,onOpenChange:i,children:s.jsxs(Ft,{className:"max-w-md",children:[s.jsx(dn,{children:s.jsxs(kt,{children:[d?"编辑模型":"添加模型"," · ",t]})}),s.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{htmlFor:"ai-model-id",children:"模型 ID"}),s.jsx(Pe,{id:"ai-model-id",value:f,disabled:d||a,placeholder:"例如 gpt-4o-mini",onChange:S=>u(S.target.value)})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{htmlFor:"ai-model-name",children:"显示名称"}),s.jsx(Pe,{id:"ai-model-name",value:h,disabled:a,placeholder:"留空则使用模型 ID",onChange:S=>p(S.target.value)})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{children:"输入模态"}),s.jsx("div",{className:"flex flex-wrap gap-2",children:ql.map(S=>B(S,y,C))})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{children:"能力标记"}),s.jsx("div",{className:"flex flex-wrap gap-2",children:zl.map(S=>B(S,R,T))})]}),r?s.jsx("p",{className:"text-xs text-destructive",role:"alert",children:r}):null]}),s.jsxs(Zt,{children:[s.jsx(X,{variant:"outline",disabled:a,onClick:()=>i(!1),children:"取消"}),s.jsx(X,{disabled:!M,onClick:()=>c({id:E,name:h.trim(),inputModalities:y,capabilities:R}),children:a?"保存中...":"保存"})]})]})})}const Hl="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",Jl="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",Xl={codex:en("openai"),"claude-code":en("anthropic"),pi:Hl,codebuddy:Jl};function Gl(e){return Xl[e]}function Ln(e){const t=e.trim().replace(/\/+$/,"");return t.endsWith("/v1")?t:`${t}/v1`}function ga(e){return e.trim().replace(/\/+$/,"").replace(/\/v1$/,"")}const ct=["codex","claude-code","pi","codebuddy"],ze={codex:"Codex","claude-code":"Claude Code",pi:"Pi",codebuddy:"CodeBuddy"};function Wl({client:e,className:t="h-4 w-4"}){const n=Gl(e);return n?s.jsx("img",{src:n,alt:"","aria-hidden":"true",className:`${t} shrink-0 rounded-[3px] object-cover`}):s.jsx(Qi,{className:t,"aria-hidden":"true"})}function Yl(e,t,n){const r=n??"<粘贴 Xpod API Key>",a=Ln(t),i=ga(t);switch(e){case"codex":return["# ~/.codex/config.toml","# 将 model_provider 放在第一个配置节之前;已有同名顶层字段时替换",'model_provider = "xpod"',"","[model_providers.xpod]",'name = "Xpod AI Connection"',`base_url = ${JSON.stringify(a)}`,'wire_api = "responses"',"requires_openai_auth = false",`experimental_bearer_token = ${JSON.stringify(r)}`,"# 保留现有订阅登录,Xpod 单独使用此 provider 的 Key"].join(`
|
|
7
|
+
`);case"claude-code":return["# ~/.claude/settings.json(合并 env 到现有 JSON)",JSON.stringify({env:{ANTHROPIC_BASE_URL:i,ANTHROPIC_AUTH_TOKEN:r}},null,2)].join(`
|
|
8
|
+
`);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:a,apiKey:r,authHeader:!0,api:"openai-responses",models:[{id:"<model-id>",name:"<model-id>"}]}}},null,2)].join(`
|
|
9
|
+
`);case"codebuddy":return["# ~/.codebuddy/settings.json(合并 env 到现有 JSON)",JSON.stringify({env:{CODEBUDDY_BASE_URL:a,CODEBUDDY_API_KEY:r}},null,2)].join(`
|
|
10
|
+
`)}}function Zl(e){return[{protocol:"chatCompletions",baseUrl:Ln(e)},{protocol:"responses",baseUrl:Ln(e)},{protocol:"anthropic",baseUrl:ga(e)}]}function _l({record:e,busy:t,confirming:n=!1,configurationStatus:r,onReissue:a,onTest:i,testing:c=!1,onRequestDestroy:d,onCancelDestroy:f,onDestroy:u}){const h=e.name||"未命名 Xpod 密钥",p=$l(e),y=e.kind!=="client-credentials"||!!e.clientCredentialId;return s.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:[s.jsxs("dl",{className:"flex min-w-0 flex-1 basis-64 flex-wrap items-center gap-x-6 gap-y-2",children:[s.jsx(At,{label:"名称",className:"min-w-0 flex-1 basis-28",children:s.jsx("span",{className:"block truncate text-sm font-medium text-foreground/90",title:h,children:h})}),s.jsx(At,{label:"应用到",className:"min-w-0 flex-1 basis-28",children:s.jsxs("span",{className:"flex min-w-0 items-center gap-1.5 text-xs text-muted-foreground",children:[p.clientId?s.jsx(Wl,{client:p.clientId,className:"h-3.5 w-3.5"}):null,s.jsx("span",{className:"truncate",title:p.label,children:p.label})]})}),s.jsx(At,{label:"最后使用",className:"shrink-0",children:s.jsx("span",{className:"block text-xs text-muted-foreground",children:e.lastUsedAt?Js(e.lastUsedAt):"暂无调用记录"})}),s.jsx(At,{label:"范围",children:s.jsx("span",{className:"text-xs",children:"范围:整个 Pod"})}),e.appliedAt?s.jsx(At,{label:"写入时间",children:s.jsx("span",{className:"text-xs",children:Js(e.appliedAt)})}):null]}),r&&(r.status==="unavailable"||e.fingerprint&&r.appliedKeyFingerprint===e.fingerprint)&&r.status!=="configured"&&r.status!=="notConfigured"?s.jsx("p",{role:"status",className:"order-last w-full text-sm text-muted-foreground",children:eu(r.status)}):null,i?s.jsx(X,{variant:"outline",size:"sm",disabled:t,onClick:i,children:c?"正在测试…":"测试一次"}):null,e.plaintextAvailable===!1&&a?s.jsxs("div",{className:"order-last flex w-full flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[s.jsx("span",{children:"密钥原文没有保存,不能再显示"}),s.jsx(X,{variant:"ghost",size:"sm",disabled:t,onClick:a,children:"重新签发"})]}):null,y?n?s.jsxs("div",{"data-testid":"gateway-key-destroy-confirm",className:"mt-2 shrink-0 rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-xs",children:[s.jsxs("p",{className:"text-foreground",children:["删除后,正在使用这把密钥的客户端会立即失效。已记录的应用:",p.label,"。"]}),s.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[s.jsx(X,{variant:"secondary",size:"sm",className:"h-8 text-xs","aria-label":`确认删除 ${h}`,disabled:t,onClick:u,children:"确认删除"}),s.jsx(X,{variant:"ghost",size:"sm",className:"h-8 text-xs","aria-label":`取消删除 ${h}`,disabled:t,onClick:f,children:"取消"})]})]}):s.jsxs(X,{variant:"ghost",size:"sm",className:"h-8 shrink-0 gap-1.5 text-xs text-muted-foreground hover:text-destructive","aria-label":`销毁 ${h}`,title:`销毁 ${h}`,disabled:t,onClick:d,children:[s.jsx(ts,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"销毁"]}):s.jsx("span",{className:"shrink-0 text-xs text-muted-foreground",children:"缺少密钥标识,无法在此销毁"})]})}function $l(e){const t=e.appliedTo?.trim();if(!t)return{label:"只复制"};const n=ct.find(i=>i===t),r=n?ze[n]:t,a=e.appliedOn?.trim();return{clientId:n,label:a?`${r} · ${a}`:r}}function At({label:e,className:t,children:n}){return s.jsxs("div",{className:t,children:[s.jsx("dt",{className:"text-xs leading-tight text-muted-foreground/80",children:e}),s.jsx("dd",{className:"mt-0.5",children:n})]})}function Js(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function eu(e){switch(e){case"drifted":return"配置被改动过";case"failedAndRestored":return"写入失败,原配置已恢复";case"unverifiable":return"已写入,还没验证";case"unavailable":return"这台电脑上找不到这个客户端,请改为只复制";default:return""}}function tu({models:e,selection:t}){const[n,r]=m.useState(""),a=m.useMemo(()=>nu(e??[]),[e]),i=n.trim().toLocaleLowerCase(),c=i?a.filter(u=>u.searchText.includes(i)):a,d=a.filter(u=>u.availability==="unavailable").length,f=t?a.filter(u=>t.isSelected(u)).length:a.length;return s.jsxs("section",{className:"space-y-8","aria-label":"可用模型",children:[s.jsxs("div",{"data-testid":"gateway-models-header",className:"flex flex-wrap items-center justify-between gap-2",children:[s.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1",children:[s.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium leading-normal text-foreground/90",children:[s.jsx(Dt,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"可用模型"]}),s.jsx("span",{className:"text-xs leading-normal text-muted-foreground",children:t?`共 ${a.length} · 已发布 ${f} · 已失效 ${d}`:`共 ${a.length} · 已失效 ${d}`}),s.jsx("span",{className:"text-xs leading-normal text-muted-foreground",children:"Xpod 当前发布的模型"})]}),s.jsx(ua,{value:n,onChange:r})]}),e===void 0?s.jsx(yt,{description:"Xpod 模型目录尚未就绪"}):a.length===0?s.jsx(yt,{description:"暂无可用模型"}):c.length===0?s.jsx(yt,{description:"未找到匹配的模型"}):s.jsx("div",{className:"grid gap-2",children:c.map(u=>s.jsx(da,{label:u.displayName??u.id,modelId:u.id,iconTokens:u.iconTokens,enabled:t?.isSelected(u)??!1,toggleDisabled:t?.disabled,onToggle:t?()=>t.toggle(u):void 0,unavailable:u.availability==="unavailable",badges:s.jsxs(s.Fragment,{children:[u.custom?s.jsx(dt,{variant:"outline",className:"shrink-0 text-[10px] font-normal",children:"手工"}):null,u.availability==="unavailable"?s.jsx(dt,{variant:"destructive",className:"shrink-0 text-[10px] font-normal",children:"已失效"}):null]})},u.key))})]})}function nu(e){const t=new Map;for(const n of e){const r=Kn(n),a=`${r.provider}\0${r.id}`,i=la(r),c=[r.id,r.displayName].filter(Boolean).join(`
|
|
11
|
+
`).toLocaleLowerCase(),d=t.get(a);if(!d){t.set(a,{...r,key:a,iconTokens:i,searchText:c});continue}r.availability!=="unavailable"&&(d.availability=r.availability),d.displayName===void 0&&r.displayName!==void 0&&(d.displayName=r.displayName),d.iconTokens=[...new Set([...d.iconTokens,...i])],d.searchText+=`
|
|
12
|
+
${c}`}return[...t.values()]}const Ht="我的 Xpod 密钥",su="Xpod 密钥 已创建,请复制或应用到客户端。",Xs="这个 Xpod 密钥 只在创建时可见:请销毁它,然后重新创建并立即复制或应用。",ru="这个 Xpod 密钥 只在创建时可见:请销毁它,然后重新创建并直接应用到客户端。",au="把已接入的模型提供给客户端。",iu="密钥允许客户端以你的 WebID 访问整个 Pod。";function ou({client:e,onAuthorizeService:t,clientConfigurationBridge:n,gatewayModels:r,modelSelection:a,liveRevision:i=0}){const c=n?.available===!1?void 0:n,[d,f]=m.useState(),u=m.useRef(!1),h=m.useRef(0),p=m.useRef(new Map),[y,C]=m.useState({}),[R,T]=m.useState(),[E,M]=m.useState({});m.useEffect(()=>{let k=!0;if(h.current+=1,u.current=!1,f(void 0),T(void 0),M({}),C({}),p.current.clear(),c)for(const O of ct)c.inspect(O).then(Z=>{k&&M(he=>({...he,[O]:Z}))}).catch(()=>{});return()=>{k=!1,h.current+=1}},[c,e]);const[g,B]=m.useState([]),[S,D]=m.useState(void 0),[w,A]=m.useState(),[j,K]=m.useState(!1),[L,Q]=m.useState(!1),[J,U]=m.useState(!0),[_,G]=m.useState(!1),[ae,W]=m.useState(Ht),[de,te]=m.useState(""),[ue,me]=m.useState(!1),[ee,ie]=m.useState(),[se,b]=m.useState(),[l,v]=m.useState(),[P,z]=m.useState(!1),[oe,pe]=m.useState(),ge=m.useRef(new Map),ne=m.useRef(void 0),Ce=m.useCallback(k=>{ne.current&&bs(ne.current),ne.current=Se(k)},[]),Ie=m.useCallback(k=>{Ce({variant:"destructive",description:ot(k),duration:8e3})},[Ce]),xe=m.useCallback(k=>{const O=new Set(k.map(Z=>Z.id));for(const Z of[...p.current.keys()])O.has(Z)||p.current.delete(Z);return k.filter(Z=>!Z.revokedAt).map(Z=>{const he=Z.appliedTo?void 0:p.current.get(Z.id),Me=he&&Z.fingerprint!==void 0&&he.fingerprint===Z.fingerprint?{...Z,appliedTo:he.appliedTo}:Z;return ge.current.has(Z.id)?{...Me,plaintextAvailable:void 0}:Me})},[]);m.useEffect(()=>{let k=!0;return U(!0),A(void 0),K(!1),pe(void 0),ge.current.clear(),e.listGatewayKeys().then(O=>{k&&B(xe(O))}).catch(O=>{k&&A(Wt(O))}).finally(()=>{k&&U(!1)}),()=>{k=!1,ne.current&&bs(ne.current)}},[e,Ie,xe]),m.useEffect(()=>{if(!t)return;let k=!0;return e.getServiceAccess().then(()=>{k&&K(!1)}).catch(O=>{k&&cu(O)==="service_access_missing"&&K(!0)}),()=>{k=!1}},[e,t,i]),m.useEffect(()=>{if(i===0)return;let k=!0;return e.listGatewayKeys().then(O=>{k&&B(xe(O))}).catch(()=>{}),()=>{k=!1}},[e,i,xe]);const Re=async()=>{if(!(!t||L)){Q(!0);try{await t();const k=await e.listGatewayKeys();B(xe(k)),A(void 0),K(!1)}catch(k){A(Wt(k))}finally{Q(!1)}}},Ke=()=>{pe(void 0),W(Ht),te(""),G(!0)},ye=()=>{ie(void 0),b(void 0),v(void 0),pe(void 0),W(Ht),te("")},H=async()=>{const k=ae.trim();if(!k){pe("请填写 Xpod 密钥 名称。");return}me(!0),pe(void 0);try{const O=await e.createGatewayKey({name:k,...de?{appliedTo:de}:{}});ge.current.set(O.record.id,O.plaintext),B(Z=>[O.record,...Z.filter(he=>he.id!==O.record.id)]),ie(O.record),b(de||void 0),v(void 0),Ce({variant:"success",description:su})}catch(O){pe(ot(O))}finally{me(!1)}},Y=(k,O)=>{const Z=ge.current.get(k.id);if(!Z)throw new Error(O);return Z},Ae=async()=>{if(!ee||!se||!c)return;pe(void 0);let k;try{k=Y(ee,ru)}catch(O){pe(ot(O));return}z(!0);try{const O=await c.plan({client:se,endpoint:e.apiBase,...se==="codex"&&r!==void 0?{activeModels:r.map(({id:Z,provider:he,displayName:Me,availability:Xe,contextWindow:gn,inputModalities:An,capabilities:Tt})=>({id:Z,provider:he,displayName:Me,availability:Xe,contextWindow:gn,inputModalities:An,capabilities:Tt}))}:{}});await c.apply({client:O.client,planId:O.planId,apiKey:k,...O.confirmation?.required?{confirmation:{token:O.confirmation.token,targetHash:O.confirmation.targetHash}}:{}}),C(Z=>({...Z,[O.client]:ee.fingerprint?{planId:O.planId,fingerprint:ee.fingerprint}:void 0})),v(O.client),ee.fingerprint&&p.current.set(ee.id,{appliedTo:O.client,fingerprint:ee.fingerprint}),M(Z=>({...Z,[O.client]:{status:"unverifiable",appliedKeyFingerprint:ee.fingerprint}})),B(Z=>Z.map(he=>he.id===ee.id?{...he,appliedTo:O.client}:he)),Ce({variant:"success",description:O.client==="codex"&&r===void 0?"Codex 连接配置已应用,模型目录尚未加载,请稍后刷新配置。":`${ze[O.client]} 配置已应用。`})}catch(O){pe(ot(O))}finally{z(!1)}},Le=k=>{const O=ct.find(Me=>Me===k.appliedTo);if(!c||!O||k.disabledAt||!k.fingerprint)return;const Z=E[O],he=y[O];if(!(Z?.status!=="unverifiable"||Z.appliedKeyFingerprint!==k.fingerprint||he?.fingerprint!==k.fingerprint))return{clientId:O,...he}},re=async k=>{const O=Le(k);if(!c||!O||u.current)return;const Z=h.current;u.current=!0,f(k.id),T(k.id);try{let he=await c.verify({client:O.clientId,planId:O.planId});if(Z!==h.current)return;if(he.status==="configured"&&!he.appliedKeyFingerprint){const Xe=await c.inspect(O.clientId);if(Z!==h.current)return;he={...he,...Xe}}const Me=he.appliedKeyFingerprint;if(Me!==void 0&&Me!==O.fingerprint)throw new Error("Configuration key changed");M(Xe=>({...Xe,[O.clientId]:{...he,...Me?{}:{status:"unverifiable"},appliedKeyFingerprint:Me??O.fingerprint}}))}catch{Z===h.current&&Ce({variant:"destructive",description:"客户端配置测试失败,请重试。",duration:8e3})}finally{Z===h.current&&(u.current=!1,f(void 0),T(void 0))}},$=async k=>{if(!u.current){u.current=!0,f(k.id),pe(void 0);try{await e.deleteGatewayKey(k.id),ge.current.delete(k.id),p.current.delete(k.id),B(O=>O.filter(Z=>Z.id!==k.id)),ee?.id===k.id&&(ie(void 0),b(void 0),v(void 0))}catch(O){Ie(O)}finally{u.current=!1,f(void 0)}}};return s.jsx(It,{children:s.jsx(jt,{open:_,onOpenChange:k=>{!k&&(ue||P)||G(k)},children:s.jsxs("section",{className:"space-y-8","aria-label":"Xpod 密钥",children:[s.jsx(fa,{name:"Xpod",mark:"XP",avatar:Wr,infoLabel:"Xpod 说明",infoLines:[au,iu],link:{href:e.apiBase,label:"访问 Xpod"},badge:s.jsx(dt,{variant:g.length>0?"default":"secondary",children:g.length>0?`已签发 ${g.length} 个`:"未配置"})}),s.jsxs("section",{className:"space-y-3","aria-label":"当前连接",children:[s.jsx(fr,{level:3,title:s.jsxs(s.Fragment,{children:[s.jsx(yr,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"当前连接"]}),titleClassName:"flex items-center gap-2 font-medium text-foreground/90",actions:s.jsx(ur,{asChild:!0,children:s.jsxs(X,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs","aria-label":"新建 Xpod 密钥",disabled:ue||J,onClick:Ke,children:[s.jsx(mt,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"Xpod 密钥"]})})}),w||j?s.jsx(rr,{tone:"destructive",role:"alert",action:j&&t?s.jsx(X,{size:"sm",disabled:L,onClick:()=>{Re()},children:L?"正在授权…":"允许 Xpod 访问"}):void 0,children:w??"Xpod 尚未获准访问这个 Pod"}):null,J?s.jsxs("div",{className:"flex items-center gap-2 py-6 text-sm text-muted-foreground",children:[s.jsx(Te,{"aria-hidden":"true",className:"h-4 w-4 animate-spin"}),"正在读取 Xpod 密钥"]}):w?null:g.length===0?s.jsx("p",{className:"py-2 text-xs text-muted-foreground",children:"尚未签发 Xpod 密钥"}):s.jsx(dr,{asChild:!0,className:"divide-y-0 border-border/70 bg-transparent",children:s.jsx("ul",{"aria-label":"Xpod 密钥 列表",children:g.map(k=>s.jsx(_l,{record:k,busy:!!d,confirming:S===k.id,configurationStatus:k.appliedTo&&ct.includes(k.appliedTo)?E[k.appliedTo]:void 0,onTest:Le(k)?()=>{re(k)}:void 0,testing:R===k.id,onReissue:()=>{ye(),W(k.name??Ht),te(ct.find(O=>O===k.appliedTo)??""),G(!0)},onRequestDestroy:()=>D(k.id),onCancelDestroy:()=>D(O=>O===k.id?void 0:O),onDestroy:()=>{D(void 0),$(k)}},k.id))})})]}),s.jsx(tu,{models:r,selection:a}),s.jsxs(Ft,{className:"sm:max-w-md","aria-describedby":void 0,children:[s.jsx(dn,{children:s.jsx(kt,{children:ee?"Xpod 密钥 已签发":"新建 Xpod 密钥"})}),ee?s.jsxs("div",{className:"space-y-5",children:[s.jsxs("div",{className:"space-y-1.5",children:[s.jsxs("p",{className:"text-sm",children:["已签发「",ee.name||"未命名 Xpod 密钥","」,用途:",se?ze[se]:"只复制","。"]}),s.jsx("p",{className:"text-xs text-muted-foreground",children:"密钥只显示这一次,请立即复制。范围:整个 Pod。"})]}),ee.maskedHint?s.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:ee.maskedHint}):null,s.jsx(ha,{endpoints:Zl(e.apiBase),copy:!0,display:"protocol"}),c?null:s.jsx("p",{className:"text-xs text-muted-foreground",children:"当前 Web 环境无法自动写入客户端配置,请复制后手动粘贴;自动应用需要本机连接。"}),oe?s.jsx("p",{role:"alert",className:"text-sm text-destructive",children:oe}):null,s.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[s.jsx(Et,{value:()=>Y(ee,Xs),label:"Xpod 密钥",text:"复制 Xpod 密钥",disabled:P,iconClassName:"mr-1.5 h-3.5 w-3.5",copiedIconClassName:"mr-1.5 h-3.5 w-3.5 text-emerald-600",onError:k=>pe(ot(k))}),se?s.jsx(Et,{value:()=>Yl(se,e.apiBase,Y(ee,Xs)),label:`${ze[se]} 配置`,text:`复制 ${ze[se]} 配置`,disabled:P,iconClassName:"mr-1.5 h-3.5 w-3.5",copiedIconClassName:"mr-1.5 h-3.5 w-3.5 text-emerald-600",onError:k=>pe(ot(k))}):null,c&&se?l?s.jsxs("span",{role:"status",className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[s.jsx($n,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"已应用到 ",ze[l]]}):s.jsxs(X,{type:"button",size:"sm",disabled:P||E[se]?.status==="unavailable","aria-label":`写入 ${ze[se]}`,onClick:()=>{Ae()},children:[P?s.jsx(Te,{"aria-hidden":"true",className:"mr-2 h-4 w-4 animate-spin"}):null,P?"正在应用…":`写入 ${ze[se]}`]}):null]}),s.jsxs(Zt,{children:[s.jsx(X,{type:"button",variant:"ghost",disabled:P,onClick:ye,children:"再建一个"}),s.jsx(X,{type:"button",variant:"outline",onClick:()=>G(!1),children:"完成"})]})]}):s.jsxs("form",{className:"space-y-5",onSubmit:k=>{k.preventDefault(),ue||H()},children:[s.jsxs("label",{className:"block space-y-2",children:[s.jsx("span",{className:"text-sm font-medium",children:"名称"}),s.jsx(Pe,{autoFocus:!0,"aria-label":"Xpod 密钥 名称",value:ae,disabled:ue,onChange:k=>W(k.target.value)})]}),s.jsxs("label",{className:"block space-y-2",children:[s.jsx("span",{className:"text-sm font-medium",children:"给哪个客户端用"}),s.jsxs(zn,{"aria-label":"Xpod 密钥 用途",value:de,disabled:ue,onChange:k=>te(k.target.value),children:[s.jsx("option",{value:"",children:"不写入,只复制"}),ct.map(k=>s.jsxs("option",{value:k,children:[ze[k],c?E[k]?.status==="unavailable"?" · 未安装":E[k]?" · 可配置":" · 检测中":" · 只复制配置"]},k))]})]}),s.jsx("p",{className:"text-xs leading-normal text-muted-foreground",children:"客户端默认跟随 Pod 的智能模型。"}),oe?s.jsx("p",{role:"alert",className:"text-sm text-destructive",children:oe}):null,s.jsxs(Zt,{children:[s.jsx(X,{type:"button",variant:"outline",disabled:ue,onClick:()=>G(!1),children:"取消"}),s.jsxs(X,{type:"submit","aria-label":"创建 Xpod 密钥",disabled:ue||!ae.trim(),children:[ue?s.jsx(Te,{"aria-hidden":"true",className:"mr-2 h-4 w-4 animate-spin"}):null,ue?"正在创建…":"创建 Xpod 密钥"]})]})]})]})]})})})}function cu(e){return e&&typeof e=="object"&&"code"in e&&typeof e.code=="string"?e.code:void 0}function ot(e){if(e&&typeof e=="object"&&"code"in e&&e.code==="verification_failed_restored")return"写入失败,原配置已恢复";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)?"Xpod 密钥 操作失败,请重试。":t}const lu={},uu={};function du({client:e,onAuthorizeService:t,renderToaster:n=!0,developerMode:r=!1,openExternal:a=xu,clientConfigurationBridge:i,selectedSection:c="provider",selectedProvider:d,selectedCredentialId:f,providerSummaries:u=lu,providerProducts:h=uu,providerLoadError:p,providerLoading:y=!1,onProviderStateChange:C,onModelSelectionChange:R,liveRevision:T=0,liveCredentialRows:E}){const[M,g]=m.useState({source:{},states:{}}),[B,S]=m.useState([]),[D,w]=m.useState(),[A,j]=m.useState(0),[K,L]=m.useState(()=>({source:h,ids:{}})),[Q,J]=m.useState({}),[U,_]=m.useState({}),[G,ae]=m.useState({}),[W,de]=m.useState({}),[te,ue]=m.useState({source:{},values:{}}),[me,ee]=m.useState({}),[ie,se]=m.useState({}),[b,l]=m.useState({}),[v,P]=m.useState({}),[z,oe]=m.useState(),[pe,ge]=m.useState(),[ne,Ce]=m.useState(!1),[Ie,xe]=m.useState({}),Re=m.useRef(0),Ke=m.useRef({}),ye=Qc({...h,...Ie},Lc(h,Ie),E),H=m.useCallback((o,x)=>{g(F=>({source:{...F.source,[o]:u[o]},states:{...F.states,[o]:x}})),C?.(o,mu(x))},[C,u]),Y=o=>{const x=u[o];return(M.source[o]===x?M.states[o]:void 0)??fu(x)},Ae=o=>{const x=u[o];return(te.source[o]===x?te.values[o]:void 0)??x?.baseUrl??""};m.useEffect(()=>{let o=!0;return e.listModels().then(x=>{o&&S(x)}).catch(()=>{}),()=>{o=!1,Re.current+=1}},[e,T]),m.useEffect(()=>{let o=!0;return e.listGatewayModels?.().then(x=>{o&&w({client:e,version:A,models:x})}).catch(()=>{}),()=>{o=!1}},[e,A]);const Le=D?.client===e&&D.version===A?D.models:void 0,re=(o,x)=>{ee(F=>({...F,[o]:x}))},$=(o,x,F,N)=>{se(I=>({...I,[o]:x?{message:x,offeringId:F,authorization:N}:void 0}))},k=m.useCallback(async o=>{const x=o.verificationUriComplete??o.authorizationUrl??o.verificationUri;x&&await a(x)},[a]),O=async(o,x,F)=>{re(o,!0),$(o),ae(N=>({...N,[o]:x}));try{const N=x?await e.beginConnect(o,"browserAssistedApiKey",{offeringId:x,authorizationMethodId:F}):await e.beginConnect(o,"browserAssistedApiKey");_(q=>({...q,[o]:N}));const I=Qn(N.status);if(H(o,I?"pending":N.status==="completed"?"configured":"failed"),!I&&N.status!=="completed"){$(o,N.message??Gs(N.status),x,{mode:"browserAssistedApiKey",authorizationMethodId:F});return}await k(N)}catch(N){H(o,"failed"),$(o,we(N),x,{mode:"browserAssistedApiKey",authorizationMethodId:F})}finally{re(o,!1)}},Z=async o=>{await O(o.id)},he=async(o,x,F,N)=>{if(F==="browserAssistedApiKey"){await O(o,x.id,N?.id);return}await Me(o,F,x.id,N?.id)},Me=async(o,x,F,N)=>{if(x==="connectUnsupported")return;re(o,!0),$(o),ae(q=>({...q,[o]:F}));const I=Re.current+1;Re.current=I;try{const q=await e.beginConnect(o,x,{offeringId:F,authorizationMethodId:N});if(_(ce=>({...ce,[o]:q})),!Qn(q.status)){const ce=q.status==="completed";ce?await Xe(o):H(o,"failed"),ce||$(o,q.status==="unsupported"?"当前部署未启用账号授权":q.message??Gs(q.status),F,{mode:x,authorizationMethodId:N}),re(o,!1);return}H(o,"pending"),await k(q),hu(e,o,q,I,Re,{onAttempt:ce=>_(le=>({...le,[o]:ce})),onConnected:()=>Xe(o),onFailed:ce=>{H(o,"failed"),$(o,ce,F,{mode:x,authorizationMethodId:N})},onFinished:()=>re(o,!1)})}catch(q){H(o,"failed"),$(o,we(q),F,{mode:x,authorizationMethodId:N}),re(o,!1)}},Xe=async o=>{H(o,"connected");try{const x=(await e.listProviders()).find(F=>F.id===o);x&&xe(F=>({...F,[o]:x}))}catch(x){$(o,`账号已连接,连接信息刷新失败:${we(x)}`)}},gn=async(o,x)=>{Re.current+=1,re(o,!1),_(F=>({...F,[o]:void 0})),ae(F=>({...F,[o]:void 0})),H(o,"failed");try{await e.cancelConnect?.(o,x),$(o,"连接已取消")}catch(F){$(o,we(F))}},An=async o=>{const x=W[o.id]?.trim(),F=Ae(o.id),N=U[o.id];if(!(!x||!N)){re(o.id,!0),$(o.id);try{const I=await e.completeApiKey(o.id,N,x,void 0,F.trim());_(q=>({...q,[o.id]:I})),de(q=>({...q,[o.id]:""})),H(o.id,"configured"),Se({description:"API Key 已保存"})}catch(I){$(o.id,we(I)),H(o.id,"failed")}finally{re(o.id,!1)}}},Tt=async(o,x)=>{const F=x?ye[o]?.credentials.find(N=>N.id===x)?.offeringId:void 0;re(o,!0),$(o);try{await e.disconnect(o,x),_(N=>({...N,[o]:void 0})),ae(N=>({...N,[o]:void 0})),l(N=>({...N,[o]:F?{...N[o],[F]:void 0}:void 0})),x?(xe(N=>({...N,[o]:Ys(ye[o],o,x)})),Se({description:"已从当前 Pod 移除账号"})):(H(o,"disconnected"),Se({description:"已断开连接"}))}catch(N){$(o,we(N),F)}finally{re(o,!1)}},xn=(o,x)=>{xe(F=>({...F,[o]:Ws(ye[o],o,x)})),H(o,x.authMode==="apiKey"||x.authMode==="local"?"configured":"connected")},Lt=async(o,x,F=!1,N="")=>{P(I=>({...I,[o]:!0})),$(o);try{const I=x?await e.discoverModels(o,x):await e.discoverModels(o);j(le=>le+1);const q=ye[o]?.selectedModels??[],ce={...bu(o,x),...I.complete===!1?{markMissing:!1}:{}};try{const De=(await e.listModels()).filter(Be=>Be.provider===o);S(Be=>{const qt=kn(Be,o,De,ce),Ka=kn(qt,o,I.models,ce);return _s(Ka,o,q,I.models,ce)})}catch{S(le=>_s(kn(le,o,I.models,ce),o,q,I.models,ce))}try{const De=(await e.listProviders()).find(Be=>Be.id===o);De&&xe(Be=>({...Be,[o]:De}))}catch{}return I.complete===!1?$(o,"部分连接同步失败,已保留原有模型目录,可稍后重试。",x?.offeringId):F&&Se({variant:I.models.length>0?"success":"default",description:I.models.length>0?`连接成功,已同步 ${I.models.length} 个模型`:"连接成功,但服务商未返回任何模型。请确认该服务支持 /models 接口,或使用「添加模型」手工录入。"}),!0}catch(I){const q=we(I);return $(o,`${N}${q}`,x?.offeringId),!1}finally{P(I=>({...I,[o]:!1}))}},va=async(o,x,F)=>{re(o,!0),$(o);try{const N=await e.createApiKeyCredential(o,{offeringId:x.id,apiKey:F.apiKey,label:F.label,baseUrl:F.baseUrl,proxyUrl:F.proxyUrl,priority:F.priority});xn(o,N),Se({description:"API Key 已添加"}),await Lt(o,{offeringId:N.offeringId,credentialId:N.id})}catch(N){const I=we(N);throw $(o,I,x.id),new Error(I)}finally{re(o,!1)}},Ia=async(o,x,F)=>{re(o,!0),$(o);try{const N=x.kind==="local",I=await e.createLocalCredential(o,{offeringId:x.id,authorizationMethodId:F?.id,label:x.label??Ee(x),...N?{baseUrl:x.endpoints?.[0]?.baseUrl}:{},priority:10});xn(o,I),Se({description:`${Ee(x)} 已连接`}),x.modelDiscovery?.strategy!=="unsupported"&&await Lt(o,{offeringId:I.offeringId,credentialId:I.id},!1,N?"本地服务已连接,模型获取失败:":"订阅已读取,模型获取失败:")}catch(N){const I=we(N);throw $(o,I,x.id),new Error(I)}finally{re(o,!1)}},ja=async(o,x,F)=>{re(o,!0),$(o);try{const N=await e.updateProviderCredential(o,x.id,{expectedVersion:x.version,...F});xn(o,N),Se({description:"凭证已更新"}),N.enabled&&await Lt(o,{offeringId:N.offeringId,credentialId:N.id})}catch(N){const I=we(N);throw $(o,I,x.offeringId),new Error(I)}finally{re(o,!1)}},Fa=async(o,x)=>{if(x.id===`${o}:current`&&x.version===0){if(ye[o]?.credentials.some(F=>F.id!==x.id)){$(o,"请重新加载连接后再移除旧连接。",x.offeringId);return}await Tt(o);return}re(o,!0),$(o);try{await e.deleteProviderCredential(o,x.id);const F=Ys(ye[o],o,x.id);xe(N=>({...N,[o]:F})),H(o,Aa(F)),Se({description:"凭证已删除"})}catch(F){$(o,we(F),x.offeringId)}finally{re(o,!1)}},ka=async(o,x)=>{re(o,!0),$(o);try{const F=await e.testProviderCredential(o,{credentialId:x.id}),N=gu(F);xe(I=>({...I,[o]:N?Ws(ye[o],o,N):Zs(ye[o],o,x.id,"healthy")})),Se({variant:"success",description:"测试通过"})}catch(F){const N=(await e.listProviders().catch(()=>[])).find(I=>I.id===o);xe(I=>({...I,[o]:N??Zs(ye[o],o,x.id,"invalid")})),$(o,we(F),x.offeringId)}finally{re(o,!1)}},Da=async(o,x,F,N,I)=>{if(I<0||I>=F.length)return;const q=[...F],[ce]=q.splice(N,1);if(ce){q.splice(I,0,ce),re(o,!0),$(o);try{const le=[];for(const[De,Be]of q.entries()){const qt=(De+1)*10;if(Be.priority===qt){le.push(Be);continue}le.push(await e.updateProviderCredential(o,Be.id,{expectedVersion:Be.version,priority:qt}))}xe(De=>({...De,[o]:Au(ye[o],o,x,le)})),Se({description:"顺序已保存"})}catch(le){$(o,we(le),x.id)}finally{re(o,!1)}}},yn=m.useRef(new Set),Ba=async(o,x,F)=>{const N=F?[F]:(ye[o]?.credentials??[]).filter(I=>I.enabled&&I.offeringId===x.id);await Promise.all(N.map(async I=>{const q=`${o}\0${I.id}`;if(yn.current.has(q))return;yn.current.add(q);const ce=le=>{l(De=>({...De,[o]:{...De[o],[I.id]:le}}))};ce({busy:!0,credentialId:I.id});try{const le=await e.quota(o,!0,{offeringId:x.id,credentialId:I.id,credentialIri:I.id});ce({quota:le,busy:!1,credentialId:I.id})}catch(le){ce({busy:!1,error:we(le),credentialId:I.id})}finally{yn.current.delete(q)}}))},Sa=async o=>{await Lt(o,o==="custom"&&f?{credentialId:f}:void 0,!0)},hs=m.useCallback(async()=>{j(o=>o+1);try{S(await e.listModels())}catch{}},[e]),ms=(o,x)=>{ge(void 0),oe({provider:o,model:x})},Na=async o=>{if(!z)return;const x=!!z.model;Ce(!0),ge(void 0);try{await e.saveProviderModel(z.provider,{id:o.id,displayName:o.name||void 0,inputModalities:o.inputModalities.length>0?o.inputModalities:void 0,capabilities:o.capabilities.length>0?o.capabilities:void 0}),oe(void 0),Se({description:x?"模型已更新":"模型已添加"}),await hs()}catch(F){ge(we(F))}finally{Ce(!1)}},Ma=async(o,x)=>{$(o);try{await e.deleteProviderModel(o,x.id),S(F=>F.filter(N=>!(N.provider===o&&N.id===x.id))),Se({description:"模型已移除"}),hs()}catch(F){$(o,we(F))}},Qt=o=>(K.source===h?K.ids:{})[o]??ye[o]?.selectedModels.map(Ze)??[],gs=(o,x)=>{L(F=>({source:h,ids:{...F.source===h?F.ids:{},[o]:x}}))},As=(o,x)=>{const F=[...new Set(x)],N=Qt(o),I=(Ke.current[o]??0)+1;Ke.current[o]=I,gs(o,F),J(q=>({...q,[o]:"saving"})),(async()=>{try{const q=[...B.filter(le=>le.provider===o),...ye[o]?.selectedModels??[]],ce=F.map(le=>{const De=q.find(Be=>Ze(Be)===le);return De?Cu(De):{id:le}});o==="custom"?await e.saveModelSelection?.(o,ce,f):await e.saveModelSelection?.(o,ce),Ke.current[o]===I&&(j(le=>le+1),J(le=>({...le,[o]:"saved"})),R?.(o,F))}catch(q){if(Ke.current[o]!==I)return;J(ce=>({...ce,[o]:"error"})),gs(o,N),R?.(o,N),Se({variant:"destructive",description:we(q)})}})()},xs=o=>{const x=B.find(F=>F.provider===o.provider&&vt(F)===vt(o));return Ze(x||o)},Ua={isSelected:o=>Qt(o.provider).includes(xs(o)),toggle:o=>{const x=Qt(o.provider),F=xs(o);As(o.provider,x.includes(F)?x.filter(N=>N!==F):[...x,F])},disabled:y},Pa=s.jsxs("section",{children:[p?s.jsxs("p",{className:"mb-4 rounded-md border border-destructive/30 px-3 py-2 text-sm text-destructive",children:["Provider 状态读取失败:",p]}):null,je.filter(o=>o.id===(d??"openai")).map(o=>{const x=ye[o.id],F=wu(B.filter(I=>I.provider===o.id&&(o.id!=="custom"||!f||I.credentialId===f)),x?.selectedModels??[],Le??[]),N=Qt(o.id);return s.jsx(Ol,{definition:o,product:x,status:pu(Y(o.id),x),accountLabel:u[o.id]?.accountLabel,attempt:U[o.id],attemptOfferingId:G[o.id],apiKey:W[o.id]??"",baseUrl:Ae(o.id),busy:!!(me[o.id]||v[o.id]),disabled:y,developerMode:r,error:ie[o.id],quotas:b[o.id],models:F,selectedModelIds:N,modelSelectionStatus:Q[o.id],onApiKeyChange:I=>de(q=>({...q,[o.id]:I})),onBaseUrlChange:I=>ue(q=>({source:{...q.source,[o.id]:u[o.id]},values:{...q.values,[o.id]:I}})),onBeginApiKey:()=>{O(o.id)},onBeginOffering:(I,q,ce)=>{he(o.id,I,q,ce)},onCancelConnect:I=>{gn(o.id,I)},onBeginBrowser:()=>{Z(o)},onSaveApiKey:()=>{An(o)},onDisconnect:I=>{Tt(o.id,I?.id)},onCreateApiKeyCredential:(I,q)=>va(o.id,I,q),onCreateLocalCredential:(I,q)=>Ia(o.id,I,q),onUpdateCredential:(I,q)=>ja(o.id,I,q),onDeleteCredential:I=>{Fa(o.id,I)},onTestCredential:I=>{ka(o.id,I)},onReorderCredentials:(I,q,ce,le)=>{Da(o.id,I,q,ce,le)},onRefreshQuota:(I,q)=>{Ba(o.id,I,q)},verifyPending:!!v[o.id],onVerify:()=>{Sa(o.id)},onAddModel:()=>ms(o.id),onEditModel:I=>ms(o.id,I),onDeleteModel:I=>{Ma(o.id,I)},onModelSelectionChange:As,onDismissError:()=>$(o.id)},o.id)})]}),Ra=s.jsx(ou,{client:e,onAuthorizeService:t,clientConfigurationBridge:i,gatewayModels:Le,modelSelection:Ua,liveRevision:T});return s.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:[n?s.jsx(La,{}):null,c==="keys"?Ra:null,c==="provider"?Pa:null,c==="provider"&&z?s.jsx(Vl,{open:!0,providerName:je.find(o=>o.id===z.provider)?.name??z.provider,initialValue:z.model?{id:z.model.id,name:z.model.displayName??"",inputModalities:z.model.inputModalities??[],capabilities:z.model.capabilities??[]}:void 0,error:pe,saving:ne,onOpenChange:o=>{o||oe(void 0)},onSave:o=>{Na(o)}}):null]})}function Aa(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 fu(e){if(e)return e.status==="connected"&&e.authMode==="browserAssistedApiKey"?"configured":e.status}function pu(e,t){return e==="pending"||e==="failed"?e:t?Aa(t):e??"unknown"}async function hu(e,t,n,r,a,i){let c=n;try{for(;a.current===r&&Qn(c.status);){if(await yu(Math.max(1,c.intervalSeconds??2)*1e3),a.current!==r)return;c={...c,...await e.pollDevice(t,c)},i.onAttempt(c)}c.status==="completed"?await i.onConnected():a.current===r&&i.onFailed(c.message||`连接${c.status==="expired"?"已过期":"失败"}`)}catch(d){a.current===r&&i.onFailed(we(d))}finally{a.current===r&&i.onFinished()}}function Qn(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"}function Gs(e){return e==="expired"?"连接已过期,请重新开始":e==="cancelled"?"连接已取消":e==="unsupported"?"当前 Provider 不支持此连接方式":"连接失败"}function mu(e){return e==="configured"?"configured":e==="connected"?"connected":e==="failed"||e==="reauthRequired"?"attention":e==="pending"?"loading":"unconfigured"}function Ws(e,t,n){const r=e??mn(t),a=xa([...r.credentials.filter(i=>i.id!==n.id),n]);return{...r,credentials:a,status:fs(a)}}function Ys(e,t,n){const r=e??mn(t),a=r.credentials.filter(i=>i.id!==n);return{...r,credentials:a,status:fs(a)}}function Zs(e,t,n,r){const a=e??mn(t),i=a.credentials.map(c=>c.id===n?{...c,health:r}:c);return{...a,credentials:i,status:i.some(c=>c.enabled&&c.health==="invalid")?"attention":fs(i)}}function gu(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 fs(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 Au(e,t,n,r){const a=e??mn(t),i=new Set(r.map(c=>c.id));return{...a,offerings:a.offerings.some(c=>c.id===n.id)?a.offerings:[...a.offerings,n],credentials:xa([...a.credentials.filter(c=>!i.has(c.id)),...r])}}function mn(e){return{id:e,name:je.find(t=>t.id===e)?.name??e,offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function xa(e){return[...e].sort((t,n)=>t.priority-n.priority)}function xu(e){window.open(e,"_blank","noopener,noreferrer")}function yu(e){return new Promise(t=>window.setTimeout(t,e))}function we(e){if(e instanceof TypeError&&/failed to fetch|fetch failed|networkerror|load failed/i.test(e.message))return"暂时无法连接 Xpod,请在连接恢复后确认操作结果,再重试。";const t=Wt(e);return t==="AI Connection request failed. Please try again."?"请求未完成。请确认 Xpod 正在运行且登录仍有效,然后重试。":t}function bu(e,t){return e==="custom"?t?.credentialId?{markMissing:!0,credentialId:t.credentialId}:{markMissing:!t}:t?.offeringId?{markMissing:!0,offeringId:t.offeringId}:{markMissing:!t}}function kn(e,t,n,r={markMissing:!1}){const a=new Set(n.map(c=>c.id)),i=e.map(c=>r.markMissing&&c.provider===t&&!c.custom&&!a.has(c.id)&&(r.offeringId===void 0||c.offeringId===r.offeringId)&&(r.credentialId===void 0||c.credentialId===r.credentialId)?rt({...c,availability:"unavailable"}):c);for(const c of n){const d=c,f="provider"in c,u=d.offeringId??(f?void 0:r.offeringId),h=d.credentialId??(f?void 0:r.credentialId),p=i.findIndex(y=>y.provider!==t?!1:d.resourceId&&y.resourceId?d.resourceId===y.resourceId:h!==void 0?y.id===d.id&&y.credentialId===h:u!==void 0?y.id===d.id&&y.offeringId===u:y.id===d.id&&y.offeringId===void 0);p===-1?i.push(rt({...d,id:d.id,provider:t,availability:d.availability??"available",...u?{offeringId:u}:{},...h?{credentialId:h}:{}})):i[p]=rt({...i[p],...d,provider:t,displayName:d.displayName??i[p].displayName,availability:d.availability??"available",...u?{offeringId:u}:{},...h?{credentialId:h}:{}})}return i}function _s(e,t,n,r,a){if(!a.markMissing||n.length===0)return e;const i=new Set(r.map(d=>d.id)),c=[...e];for(const d of n.filter(f=>f.provider===t)){if(d.custom||a.offeringId!==void 0&&d.offeringId!==a.offeringId||a.credentialId!==void 0&&d.credentialId!==a.credentialId||i.has(d.id))continue;const f=Ze(d),u=c.findIndex(p=>p.provider===t&&Ze(p)===f),h=rt({...d,availability:"unavailable"});u===-1?c.push(h):c[u]=rt({...c[u],...h,displayName:c[u].displayName??h.displayName})}return c}function wu(e,t,n=[]){const r=new Map;for(const c of n)r.set(`${c.provider}\0${vt(c)}`,c);const a=c=>{const d=r.get(`${c.provider}\0${vt(c)}`),f=[...new Set([...c.capabilities??[],...d?.capabilities??[]])],u=c.inputModalities??d?.inputModalities;return f.length===0&&!u?c:rt({...c,...f.length>0?{capabilities:f}:{},...u?{inputModalities:u}:{}})},i=e.map(c=>a(Kn(c)));for(const c of t.map(Kn)){const d=i.findIndex(f=>Ze(f)===Ze(c));if(d===-1){i.push(a(c));continue}i[d]=a(rt({...i[d],...c,displayName:i[d].displayName??c.displayName,availability:i[d].availability==="unavailable"?"unavailable":c.availability}))}return i}function rt(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Ze(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function Cu(e){return{id:e.id,...e.offeringId?{offeringId:e.offeringId}:{},...e.resourceId?{resourceId:e.resourceId}:{}}}function ya({controller:e,renderToaster:t=!0}){const n=Uc(e);return s.jsx(Eu,{controller:e,renderToaster:t,liveCredentialRows:n})}function Eu({controller:e,renderToaster:t,liveCredentialRows:n}){const r=cs(e),a=ls(e),i=_r(e),c=ea(e),d=us(e),f=ta(e),u=Gc(e),h=je.find(E=>E.id===a),p=a==="custom"?d.custom?.credentials.find(E=>E.id===i):void 0,y=os.find(E=>E.id===r)?.title,C=p?.label??d[a]?.name??h?.name??a,R=y??`${C} 详情`,T=a==="custom"&&i&&d.custom?{...d,custom:{...d.custom,name:C,offerings:vu(d.custom,p),credentials:d.custom.credentials.filter(E=>E.id===i),selectedModels:d.custom.selectedModels.filter(E=>E.credentialId===i)}}:d;return m.useEffect(()=>e.watchPageTables(),[e]),m.useEffect(()=>(e.client&&e.loadProviders(),()=>e.cancelProviderLoads()),[e,u]),e.client?s.jsx("section",{role:"region","aria-label":R,children:s.jsx(du,{client:e.client,onAuthorizeService:e.authorizeService,renderToaster:t,clientConfigurationBridge:e.clientConfigurationBridge,selectedSection:r,selectedProvider:a,selectedCredentialId:i,openExternal:e.openExternal,providerSummaries:c,providerProducts:T,providerLoadError:f,providerLoading:!d[a]&&!f,onProviderStateChange:e.setProviderState,liveRevision:u,liveCredentialRows:n})}):s.jsxs("section",{role:"alert","aria-label":"AI 连接尚未就绪",children:[s.jsx("h2",{children:"AI 连接尚未就绪"}),s.jsx("p",{children:"宿主需要先提供已登录的 WebID 和可用的 Pod。"})]})}function vu(e,t){if(!t)return e.offerings;const n=t.compatibility??(t.offeringId==="anthropic-compatible"?"anthropic":"openai"),r=e.offerings.find(a=>a.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 Iu({open:e,saving:t=!1,error:n,onOpenChange:r,onSave:a}){const[i,c]=m.useState(""),[d,f]=m.useState("auto"),[u,h]=m.useState(""),[p,y]=m.useState(""),[C,R]=m.useState(""),[T,E]=m.useState();m.useEffect(()=>{e&&(c(""),f("auto"),h(""),y(""),R(""),E(void 0))},[e]);const M=()=>{E(void 0);let g;try{g=ju(u)}catch{E("Base URL 必须是有效的 http(s) 地址。");return}const B=i.trim(),S=p.trim();if(!B){E("请输入 Provider 名称。");return}if(!S){E("请输入 API Key。");return}a({offeringId:Fu(d),apiKey:S,label:B,baseUrl:g,priority:10,compatibility:d,...C.trim()?{proxyUrl:C.trim()}:{}})};return s.jsx(jt,{open:e,onOpenChange:r,children:s.jsxs(Ft,{className:"max-w-md",style:{maxHeight:"calc(100vh - 2rem)",overflowY:"auto"},"aria-describedby":"ai-custom-provider-description",children:[s.jsx(dn,{children:s.jsx(kt,{children:"添加自定义服务商"})}),s.jsx("p",{id:"ai-custom-provider-description",className:"text-sm text-muted-foreground",children:"用 OpenAI/Anthropic 兼容协议接入第三方模型服务。Xpod 会把真实 API Key 存进当前 Pod。"}),s.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{htmlFor:"ai-custom-provider-name",children:"Provider 名称"}),s.jsx(Pe,{id:"ai-custom-provider-name",value:i,disabled:t,placeholder:"例如 OpenRouter",onChange:g=>c(g.target.value)})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{htmlFor:"ai-custom-provider-compatibility",children:"兼容协议"}),s.jsxs(zn,{id:"ai-custom-provider-compatibility",value:d,disabled:t,"aria-label":"兼容协议",className:"h-9",onChange:g=>f(g.target.value),children:[s.jsx("option",{value:"auto",children:"自动探测"}),s.jsx("option",{value:"openai",children:"OpenAI 兼容优先"}),s.jsx("option",{value:"anthropic",children:"Anthropic 兼容优先"})]})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{htmlFor:"ai-custom-provider-base-url",children:"Base URL"}),s.jsx(Pe,{id:"ai-custom-provider-base-url",value:u,disabled:t,placeholder:"https://openrouter.ai/api 或 https://openrouter.ai/api/v1",onChange:g=>h(g.target.value)}),s.jsx("p",{className:"text-xs text-muted-foreground",children:"裸域名会自动补齐为 /v1。"})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{htmlFor:"ai-custom-provider-api-key",children:"API Key"}),s.jsx(Pe,{id:"ai-custom-provider-api-key",type:"password",value:p,disabled:t,autoComplete:"new-password","data-lpignore":"true",onChange:g=>y(g.target.value)})]}),s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx(He,{htmlFor:"ai-custom-provider-proxy-url",children:"Proxy URL(可选)"}),s.jsx(Pe,{id:"ai-custom-provider-proxy-url",value:C,disabled:t,placeholder:"http://127.0.0.1:7890",onChange:g=>R(g.target.value)})]}),T||n?s.jsx("p",{className:"text-sm text-destructive",children:T??n}):null]}),s.jsxs(Zt,{children:[s.jsx(X,{type:"button",variant:"outline",disabled:t,onClick:()=>r(!1),children:"取消"}),s.jsx(X,{type:"button",disabled:t,onClick:M,children:"保存自定义服务商"})]})]})})}function ju(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 Fu(e){return e==="anthropic"?"anthropic-compatible":"openai-compatible"}function ku({controller:e}){const t=$r(e),[n,r]=m.useState(!1),[a,i]=m.useState(!1),[c,d]=m.useState(),f=async u=>{if(!e.client){d("请先登录后再添加自定义服务商。");return}i(!0),d(void 0);let h;try{const p=await e.client.createApiKeyCredential("custom",u);h=p.id,await e.client.discoverModels("custom",{offeringId:p.offeringId,credentialId:p.id,compatibility:u.compatibility}),e.selectProvider("custom",p.id),await e.loadProviders(),r(!1)}catch(p){h&&await e.client.deleteProviderCredential("custom",h).catch(()=>{}),d(p instanceof Error?p.message:"AI Connection request failed. Please try again.")}finally{i(!1)}};return s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex h-full min-w-0 items-center gap-2 px-3",children:[s.jsx("div",{className:"relative min-w-0 flex-1",children:s.jsx(ar,{"aria-label":"搜索服务商",value:t,onChange:u=>e.setSearchQuery(u.target.value)})}),s.jsx(X,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 shrink-0","aria-label":"添加 AI Connection",title:"添加 AI Connection",onClick:()=>r(!0),children:s.jsx(mt,{className:"h-4 w-4","aria-hidden":"true"})})]}),s.jsx(Iu,{open:n,saving:a,error:c,onOpenChange:r,onSave:u=>{f(u)}})]})}const Du={live:{label:"实时",title:"实时更新已开启:Pod 中的改动会立即反映到本页。",dotClass:"bg-emerald-500"},unavailable:{label:"实时不可用",title:"实时更新当前不可用;本页仍会正常读取与操作。",dotClass:"bg-muted-foreground/60"}};function Bu({controller:e}){const t=cs(e),n=ls(e),r=us(e),a=Xc(e),i=je.find(f=>f.id===n),c=os.find(f=>f.id===t)?.title??r[n]?.name??i?.name??n,d=a==="idle"?void 0:Du[a];return s.jsxs("div",{className:"flex h-full min-w-0 items-center gap-2 px-4",children:[s.jsx("h1",{className:"truncate text-sm font-medium text-foreground",children:c}),d&&s.jsxs("span",{"data-live-updates":a,title:d.title,"aria-label":d.title,className:"ml-auto inline-flex shrink-0 items-center gap-1 text-[10px] font-medium text-muted-foreground",children:[s.jsx("span",{"aria-hidden":"true",className:`h-1.5 w-1.5 rounded-full ${d.dotClass}`}),d.label]})]})}const Su=["navigation.openExternal","aiClientConfiguration","solidNotifications","podCollections"];function Nu(e){const t=Dn(e,"Extension manifest");$s(t.extensionId,"extensionId"),lt(t.name,"name"),lt(t.version,"version"),lt(t.sdkVersion,"sdkVersion");const n=Dn(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 a of n.applets){const i=Dn(a,"Applet manifest"),c=$s(i.appId,"appId");if(r.has(c))throw new Error(`Extension manifest has duplicate appId: ${c}`);if(r.add(c),lt(i.name,"Applet name"),lt(i.entry,"Applet entry"),!Array.isArray(i.commands))throw new Error("Applet commands must be an array");if(i.layout!=="single-pane"&&i.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 a of t.hostCapabilities)if(!Su.includes(a))throw new Error(`Extension manifest requested unknown Host capability: ${String(a)}`);return e}function Dn(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function lt(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string`);return e}function $s(e,t){const n=lt(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 ba=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","solidNotifications","podCollections"]}),ps=ba.contributes.applets[0],qn={manifest:ps,createController:zc,activate(e){e.loadProviders()},slots:{listHeader:ku,list:nl,mainHeader:Bu,main:ya}},er={manifest:ba,applets:{[ps.appId]:qn}};function Mu(e={}){return e.renderToaster!==!1?er:{...er,applets:{[ps.appId]:{...qn,slots:{...qn.slots,main:({controller:t})=>m.createElement(ya,{controller:t,renderToaster:!1})}}}}}function Uu(e){let t,n,r,a=!1;const i=new Set,c=f=>{if(!t)throw new Error(`pod_collections_not_loaded: ${f}() needs the collection engine; use load() so the host can fetch it first`);return t},d=()=>(n??=sr(()=>import("./pod-collections-host-BqOAkacM.js"),__vite__mapDeps([17,9])).then(f=>{const u=f.createPodCollectionsCapability(e);return a?(u.dispose(),u):(t=u,r=u.subscribeSyncState(()=>{for(const h of[...i])h()}),u)}),n);return{define(f,u){return c("define").define(f,u)},async load(f,u){return(await d()).define(f,u)},syncState(f){return c("syncState").syncState(f)},subscribeSyncState(f){return i.add(f),()=>{i.delete(f)}},dispose(){a=!0,r?.(),r=void 0,i.clear(),t?.dispose(),t=void 0}}}const Pu="/.notifications/WebSocketChannel2023/",Ru="http://www.w3.org/ns/solid/notifications#WebSocketChannel2023",Ku="https://www.w3.org/ns/solid/notification/v1",Ou=1,Tu={initialMs:1e3,factor:2,maxMs:3e4},Lu=5,Qu=1e3;function qu(e){const t=e.indexOf("#");return t<0?e:e.slice(0,t)}function zu(e,t){const n=Vu(e);return n?Hu(t(n))??e:e}function Vu(e){const t=wa(e);return t==="wss:"?`https:${e.slice(t.length)}`:t==="ws:"?`http:${e.slice(t.length)}`:t==="http:"||t==="https:"?e:void 0}function Hu(e){const t=wa(e);if(t==="https:")return`wss:${e.slice(t.length)}`;if(t==="http:")return`ws:${e.slice(t.length)}`}function wa(e){return/^[a-z][a-z\d+.-]*:/iu.exec(e)?.[0].toLowerCase()}function tr(){const e=globalThis;return typeof e.addEventListener=="function"&&typeof e.removeEventListener=="function"?globalThis:null}function Ju(e){const t=e.fetch,n=e.document===void 0?typeof document>"u"?null:document:e.document,r=e.page===void 0?tr():e.page,a=e.environment===void 0?tr():e.environment,i=e.createSocket??(l=>new WebSocket(l)),c=e.channelEndpoint??(l=>new URL(Pu,l).toString()),d=e.resolveLocalUrl,f=l=>d?zu(l,d):l,u=e.backoff??Tu,h=e.maxAttempts??Lu,p=e.rearmCoalesceMs??Qu,y=new Map,C=new Map,R=new Set;let T="idle",E=!1,M=e.session?e.session.getSnapshot().status==="authenticated":!0,g=Number.NEGATIVE_INFINITY,B=!1,S;const D=()=>n?.visibilityState!=="hidden",w=l=>!E&&M&&D()&&y.get(l.topic)===l&&l.listeners.size>0;function A(){const l=j();if(l!==T){T=l;for(const v of[...R])v(T)}}function j(){if(y.size===0||E||!M||!D())return"idle";let l=!1,v=!1;for(const P of y.values())P.socket?.readyState===Ou?l=!0:P.attempts>=h&&(v=!0);return l?"live":v?"unavailable":"idle"}function K(l){const v=(C.get(l.topic)??0)+1;C.set(l.topic,v);const P={topic:l.topic,sequence:v,receivedAt:Date.now()};for(const z of[...l.listeners])z(P)}async function L(l){const v=await t(c(l),{method:"POST",headers:{"content-type":"application/ld+json",accept:"application/ld+json"},body:JSON.stringify({"@context":Ku,"@type":Ru,topic:l})});if(!v.ok)throw new Error(`Notification subscription failed with status ${v.status}`);const P=await v.json(),z=typeof P.receiveFrom=="string"?P.receiveFrom:void 0;if(!z)throw new Error("Notification subscription response carried no receiveFrom");const oe=typeof P.id=="string"?P.id:typeof P["@id"]=="string"?P["@id"]:void 0;return{receiveFrom:z,id:oe}}async function Q(l){if(l)try{await t(l,{method:"DELETE",keepalive:!0})}catch{}}function J(l){const v=l.socket;l.socket=void 0,v&&(v.onopen=null,v.onmessage=null,v.onerror=null,v.onclose=null,v.close(1e3,"client unsubscribe"))}function U(l){l.retryTimer!==void 0&&(clearTimeout(l.retryTimer),l.retryTimer=void 0),J(l);const v=l.channelId;l.channelId=void 0,Q(v)}function _(l){if(l.retryTimer!==void 0)return;if(l.attempts>=h||!w(l)){A();return}const v=Math.min(u.initialMs*u.factor**(l.attempts-1),u.maxMs);l.retryTimer=setTimeout(()=>{l.retryTimer=void 0,ae(l)},v),A()}function G(l,v){const P=i(v);l.socket=P,P.onopen=()=>{l.socket===P&&(l.attempts=0,l.settled&&K(l),l.settled=!0,A())},P.onmessage=()=>{l.socket===P&&K(l)},P.onerror=()=>{},P.onclose=()=>{if(l.socket!==P)return;l.socket=void 0;const z=l.channelId;if(l.channelId=void 0,Q(z),!w(l)){A();return}l.attempts+=1,_(l)}}async function ae(l){if(E||l.opening||l.socket||l.retryTimer!==void 0||!M||!D()||l.listeners.size===0)return;l.opening=!0,A();let v;try{v=await L(l.topic)}catch{if(l.opening=!1,!w(l))return;l.attempts+=1,_(l);return}if(l.opening=!1,!w(l)){Q(v.id);return}l.channelId=v.id,G(l,f(v.receiveFrom))}function W(l,v){const P=qu(l);let z=y.get(P);return z||(z={topic:P,listeners:new Set,attempts:0,opening:!1,settled:!1},y.set(P,z)),z.listeners.add(v),se(),!z.socket&&!z.opening&&z.retryTimer===void 0&&(z.attempts=0,ae(z)),A(),()=>{const oe=y.get(P);!oe||!oe.listeners.delete(v)||(oe.listeners.size===0&&(y.delete(P),U(oe),y.size===0&&b()),A())}}function de(){for(const l of y.values())U(l);A()}function te(){if(y.size===0)return!1;const l=Date.now();if(l-g<p)return!1;g=l;for(const v of y.values())v.attempts=0;return!0}function ue(){if(te()){for(const l of y.values())l.socket!==void 0||l.opening||(l.retryTimer!==void 0&&(clearTimeout(l.retryTimer),l.retryTimer=void 0),ae(l));A()}}function me(){te();for(const l of y.values())ae(l);A()}const ee=()=>{D()?me():de()},ie=()=>{ue()};function se(){B||E||(B=!0,M=e.session?e.session.getSnapshot().status==="authenticated":!0,n?.addEventListener("visibilitychange",ee),r?.addEventListener("pagehide",de),a?.addEventListener("online",ie),a?.addEventListener("focus",ie),S=e.session?.subscribe(l=>{const v=l.status==="authenticated";v!==M&&(M=v,M?me():de())}))}function b(){B&&(B=!1,n?.removeEventListener("visibilitychange",ee),r?.removeEventListener("pagehide",de),a?.removeEventListener("online",ie),a?.removeEventListener("focus",ie),S?.(),S=void 0)}return{watch:W,getState:()=>T,subscribeState(l){return R.add(l),()=>{R.delete(l)}},dispose(){if(!E){E=!0,b();for(const l of y.values())U(l);y.clear(),A()}}}}const Ca=Mu({renderToaster:!1}),nr=Ca.manifest.contributes.applets[0]?.appId,Ea=nr?Ca.applets[nr]:void 0;if(!Ea)throw new Error("AI Connection extension did not contribute an applet");const Xu=Ea;function Gu(e,t){const n=Qa({runtime:e}),r=e.currentPod?.podUrl??e.selectedStorage?.storageUrl??e.podUrl,a=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"},i=e.transportFetch??window.fetch.bind(window),c={getSnapshot:()=>e.session.getSnapshot(),subscribe:f=>e.session.subscribe(f),fetch:e.fetch},d=Ju({fetch:e.fetch,session:c,document:typeof document>"u"?null:document,resolveLocalUrl:f=>e.resolveLocalUrl?.(f)??f});return{solid:{session:c,pod:a,permissions:{...sc({fetch:e.fetch})},requireLogin:async()=>{await n.startLogin()}},navigation:{openExternal:async f=>{window.open(f,"_blank","noopener,noreferrer")}},capabilities:{solidNotifications:d,podCollections:e.currentPod?Uu({database:e.currentPod.database,podUrl:e.currentPod.podUrl,feed:d}):void 0,aiClientCredentials:t?.controls?.account?.clientCredentials&&t.bindAccountCapability?qa({collection:t.controls.account.clientCredentials,assertCurrent:t.bindAccountCapability(),accountIndex:t.idpIndex,fetch:t.accountFetch??i}):void 0,aiConnectionsPodStore:e.currentPod?si({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")?ni({podUrl:r,controlPlaneOrigin:window.location.origin,authenticatedFetch:e.fetch,invocationFetch:i}):void 0}}}function Wu(e){const t=m.useContext(ci),n=m.useMemo(()=>Gu(e,t),[e,t]);return m.useMemo(()=>{const r=uc(Xu,n);if(r.layout!=="two-pane")throw new Error("AI Connection applet must use a two-pane layout");return r},[n])}function Yu(){const e=za(),t=Wu(e);return s.jsx(Xa,{listHeader:t.slots.listHeader,list:t.slots.list,mainHeader:s.jsxs("div",{className:"flex h-full min-w-0 items-center justify-between pr-3",children:[s.jsx("div",{className:"min-w-0 flex-1",children:t.slots.mainHeader}),s.jsx(Va,{})]}),main:t.slots.main,mode:"auto"})}const cd=Object.freeze(Object.defineProperty({__proto__:null,default:Yu},Symbol.toStringTag,{value:"Module"}));export{cd as M,Oc as c};
|