@undefineds.co/xpod 0.3.71-rc.8 → 0.3.71

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.
Files changed (48) hide show
  1. package/dist/api/ai-gateway/connect/index.d.ts +2 -0
  2. package/dist/api/ai-gateway/connect/index.js +87 -24
  3. package/dist/api/ai-gateway/connect/index.js.map +1 -1
  4. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +2 -2
  5. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js.map +1 -1
  6. package/dist/api/container/common.js +1 -1
  7. package/dist/api/container/common.js.map +1 -1
  8. package/dist/api/container/routes.js +1 -1
  9. package/dist/api/container/routes.js.map +1 -1
  10. package/dist/api/handlers/AiGatewayManagementHandler.js +28 -12
  11. package/dist/api/handlers/AiGatewayManagementHandler.js.map +1 -1
  12. package/dist/api/handlers/PodSettingsHandler.d.ts +12 -19
  13. package/dist/api/handlers/PodSettingsHandler.js +12 -51
  14. package/dist/api/handlers/PodSettingsHandler.js.map +1 -1
  15. package/dist/http/InternalPodDataHttpHandler.d.ts +3 -1
  16. package/dist/http/InternalPodDataHttpHandler.js +48 -7
  17. package/dist/http/InternalPodDataHttpHandler.js.map +1 -1
  18. package/dist/http/InternalPodDataHttpHandler.jsonld +10 -2
  19. package/dist/runtime/GatewayAdminProxyAuth.d.ts +1 -1
  20. package/dist/runtime/GatewayAdminProxyAuth.js +1 -1
  21. package/dist/runtime/GatewayAdminProxyAuth.js.map +1 -1
  22. package/dist/runtime/Proxy.d.ts +1 -0
  23. package/dist/runtime/Proxy.js +22 -0
  24. package/dist/runtime/Proxy.js.map +1 -1
  25. package/package.json +1 -1
  26. package/static/dashboard/assets/{NetworkPage-CXjiUMR1.js → NetworkPage-CsERgA2D.js} +1 -1
  27. package/static/dashboard/assets/{PaneListHeader-BSipfl0W.js → PaneListHeader-WJWFvTKY.js} +1 -1
  28. package/static/dashboard/assets/{PodPage-Bd3Xhmp-.js → PodPage-Bo_NbnK1.js} +1 -1
  29. package/static/dashboard/assets/{ServicesPage-CI3jWZGe.js → ServicesPage-CrNDXQlg.js} +1 -1
  30. package/static/dashboard/assets/{card-z5BV5hTo.js → card-Cjax171A.js} +1 -1
  31. package/static/dashboard/assets/{dashboard-CSrqAv2L.js → dashboard-CaE1mRUL.js} +4 -4
  32. package/static/dashboard/assets/{database-Ct5ZPe6L.js → database-B0sGiSz2.js} +1 -1
  33. package/static/dashboard/assets/{external-link-B7wD1hkm.js → external-link-C_ANDdCY.js} +1 -1
  34. package/static/dashboard/assets/{index-tOBaUnM1.js → index-CDoxbvUP.js} +1 -1
  35. package/static/dashboard/assets/{refresh-cw-CFDZPaE8.js → refresh-cw-DHzHxCme.js} +1 -1
  36. package/static/dashboard/assets/{services-status-context-DN1Icg4A.js → services-status-context-ukghtkFD.js} +1 -1
  37. package/static/dashboard/dashboard.html +1 -1
  38. package/static/settings/assets/ModelsPage-ClTKzRGm.js +1 -0
  39. package/static/settings/assets/{PaneListHeader-BtON8Z5Q.js → PaneListHeader-DTVY4Ig2.js} +1 -1
  40. package/static/settings/assets/{PodPage-9LGuOloQ.js → PodPage-L_JAOD-r.js} +1 -1
  41. package/static/settings/assets/{ServicesPage-ZoT9-B_0.js → ServicesPage-BwLxrSWw.js} +1 -1
  42. package/static/settings/assets/{SettingsPage-Bj4lB3mq.js → SettingsPage-DUGHDPQx.js} +1 -1
  43. package/static/settings/assets/{card-CCGngjas.js → card-BZF0jSa_.js} +1 -1
  44. package/static/settings/assets/{services-status-context-CBfImxL_.js → services-status-context-BnbZHZnu.js} +1 -1
  45. package/static/settings/assets/{settings-yUyFIJxi.js → settings-BN7FyntE.js} +4 -4
  46. package/static/settings/assets/{workspace-layout-B0wJpPze.js → workspace-layout-jzYHoh3_.js} +1 -1
  47. package/static/settings/settings.html +1 -1
  48. package/static/settings/assets/ModelsPage-D87RrLB0.js +0 -1
@@ -1 +1 @@
1
- import{r as t,j as s,c as k}from"./settings-yUyFIJxi.js";const y=t.createContext(null);function P(){const e=t.useContext(y);if(!e)throw new Error("useWorkspaceLayout must be used inside TwoPaneLayout");return e}const g="(max-width: 767px)",v={gridTemplateColumns:"210px minmax(0, 1fr)"};function j(e){return e==="context"?"main":e}function C(e){if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const a=window.matchMedia(g);return a.addEventListener("change",e),()=>a.removeEventListener("change",e)}function R(){return typeof window>"u"||typeof window.matchMedia!="function"?"split":window.matchMedia(g).matches?"stack":"split"}function L(){return"split"}function M(e){const a=t.useSyncExternalStore(C,R,L);return e==="auto"?a:e}function N({resolvedMode:e,history:a,resolvePane:l}){const[f,m]=t.useState("list"),c=t.useRef(null),h=t.useRef(null),r=t.useRef(null),i=t.useRef(null),u=t.useMemo(()=>({list:h,main:r,context:i}),[]),o=t.useCallback((n,b={})=>{const d=l?.(n)??n;m(d),e==="stack"&&(c.current=d,b.fromHistory||a?.push(d))},[a,l,e]),p=t.useCallback(()=>o("list"),[o]),x=t.useCallback(()=>o("main"),[o]),w=t.useCallback(()=>o("context"),[o]);return t.useLayoutEffect(()=>{if(e!=="stack"){c.current=null;return}const n=c.current;n&&(c.current=null,u[n].current?.focus())},[f,u,e]),t.useLayoutEffect(()=>{if(!(e!=="stack"||!a))return a.subscribe(n=>{o(n,{fromHistory:!0})})},[a,o,e]),{activePane:f,paneRefs:u,openList:p,openMain:x,openContext:w}}function S({listHeader:e,list:a,mainHeader:l,main:f,mode:m="auto",history:c,className:h}){const r=M(m),{activePane:i,paneRefs:u,openList:o,openMain:p,openContext:x}=N({resolvedMode:r,history:c,resolvePane:j}),w=t.useMemo(()=>({mode:r,activePane:i,openList:o,openMain:p,openContext:x}),[i,x,o,p,r]),n=r==="stack",b=n&&i!=="list",d=n&&i!=="main";return s.jsx(y.Provider,{value:w,children:s.jsx("section",{className:k("flex min-h-0 flex-1 flex-col bg-background",h),"data-workspace-layout":"two-pane","data-workspace-mode":r,children:s.jsxs("div",{className:k("grid min-h-0 flex-1",n?"grid-cols-1":null),style:n?void 0:v,"data-workspace-layout-mode":m,"data-workspace-active-pane":i,children:[s.jsxs("aside",{ref:u.list,className:k("flex min-h-0 flex-col overflow-hidden bg-layout-list-item @container",n?"border-r-0":"border-r border-border"),"data-testid":"workspace-list-pane","data-workspace-pane":"list",hidden:b,tabIndex:n?-1:void 0,children:[s.jsx("header",{className:"h-12 shrink-0 border-b border-border bg-layout-list-header","data-workspace-list-header":"true",children:e}),s.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto",children:a})]}),s.jsxs("main",{ref:u.main,className:"flex min-h-0 flex-col overflow-hidden bg-layout-content @container","data-testid":"workspace-main-pane","data-workspace-pane":"main",hidden:d,tabIndex:n?-1:void 0,children:[s.jsx("header",{className:"h-12 shrink-0 border-b border-border bg-layout-content","data-workspace-main-header":"true",children:l}),s.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto",children:[n?s.jsx("button",{type:"button",className:"inline-flex items-center px-4 py-3 text-sm text-muted-foreground hover:text-foreground",onClick:o,children:"返回列表"}):null,f]})]})]})})})}export{S as T,P as u};
1
+ import{r as t,j as s,c as k}from"./settings-BN7FyntE.js";const y=t.createContext(null);function P(){const e=t.useContext(y);if(!e)throw new Error("useWorkspaceLayout must be used inside TwoPaneLayout");return e}const g="(max-width: 767px)",v={gridTemplateColumns:"210px minmax(0, 1fr)"};function j(e){return e==="context"?"main":e}function C(e){if(typeof window>"u"||typeof window.matchMedia!="function")return()=>{};const a=window.matchMedia(g);return a.addEventListener("change",e),()=>a.removeEventListener("change",e)}function R(){return typeof window>"u"||typeof window.matchMedia!="function"?"split":window.matchMedia(g).matches?"stack":"split"}function L(){return"split"}function M(e){const a=t.useSyncExternalStore(C,R,L);return e==="auto"?a:e}function N({resolvedMode:e,history:a,resolvePane:l}){const[f,m]=t.useState("list"),c=t.useRef(null),h=t.useRef(null),r=t.useRef(null),i=t.useRef(null),u=t.useMemo(()=>({list:h,main:r,context:i}),[]),o=t.useCallback((n,b={})=>{const d=l?.(n)??n;m(d),e==="stack"&&(c.current=d,b.fromHistory||a?.push(d))},[a,l,e]),p=t.useCallback(()=>o("list"),[o]),x=t.useCallback(()=>o("main"),[o]),w=t.useCallback(()=>o("context"),[o]);return t.useLayoutEffect(()=>{if(e!=="stack"){c.current=null;return}const n=c.current;n&&(c.current=null,u[n].current?.focus())},[f,u,e]),t.useLayoutEffect(()=>{if(!(e!=="stack"||!a))return a.subscribe(n=>{o(n,{fromHistory:!0})})},[a,o,e]),{activePane:f,paneRefs:u,openList:p,openMain:x,openContext:w}}function S({listHeader:e,list:a,mainHeader:l,main:f,mode:m="auto",history:c,className:h}){const r=M(m),{activePane:i,paneRefs:u,openList:o,openMain:p,openContext:x}=N({resolvedMode:r,history:c,resolvePane:j}),w=t.useMemo(()=>({mode:r,activePane:i,openList:o,openMain:p,openContext:x}),[i,x,o,p,r]),n=r==="stack",b=n&&i!=="list",d=n&&i!=="main";return s.jsx(y.Provider,{value:w,children:s.jsx("section",{className:k("flex min-h-0 flex-1 flex-col bg-background",h),"data-workspace-layout":"two-pane","data-workspace-mode":r,children:s.jsxs("div",{className:k("grid min-h-0 flex-1",n?"grid-cols-1":null),style:n?void 0:v,"data-workspace-layout-mode":m,"data-workspace-active-pane":i,children:[s.jsxs("aside",{ref:u.list,className:k("flex min-h-0 flex-col overflow-hidden bg-layout-list-item @container",n?"border-r-0":"border-r border-border"),"data-testid":"workspace-list-pane","data-workspace-pane":"list",hidden:b,tabIndex:n?-1:void 0,children:[s.jsx("header",{className:"h-12 shrink-0 border-b border-border bg-layout-list-header","data-workspace-list-header":"true",children:e}),s.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto",children:a})]}),s.jsxs("main",{ref:u.main,className:"flex min-h-0 flex-col overflow-hidden bg-layout-content @container","data-testid":"workspace-main-pane","data-workspace-pane":"main",hidden:d,tabIndex:n?-1:void 0,children:[s.jsx("header",{className:"h-12 shrink-0 border-b border-border bg-layout-content","data-workspace-main-header":"true",children:l}),s.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto",children:[n?s.jsx("button",{type:"button",className:"inline-flex items-center px-4 py-3 text-sm text-muted-foreground hover:text-foreground",onClick:o,children:"返回列表"}):null,f]})]})]})})})}export{S as T,P as u};
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Xpod Settings</title>
7
- <script type="module" crossorigin src="/settings/assets/settings-yUyFIJxi.js"></script>
7
+ <script type="module" crossorigin src="/settings/assets/settings-BN7FyntE.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/settings/assets/settings-CSdewNeA.css">
9
9
  </head>
10
10
  <body>
@@ -1 +0,0 @@
1
- import{r as p,j as n,c as Be,B as S,I as X,e as mt}from"./settings-yUyFIJxi.js";import{C as _e,a as De,b as Le,c as Re,d as Ue,B as Te}from"./card-CCGngjas.js";import{T as ht}from"./workspace-layout-B0wJpPze.js";function yt(e){if(!Me(e))throw new Error("Applet layout descriptor must be an object");if(typeof e.type!="string")throw new Error("Applet layout descriptor type must be a string");switch(e.type){case"single-pane":case"two-pane":return ge(e.context),e;case"three-pane":return ge(e.context),e;default:throw new Error(`Unsupported applet layout type: ${e.type}`)}}function Me(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ge(e){if(e!==void 0){if(!Me(e))throw new Error("Applet layout descriptor context must be an object");if("collapsible"in e&&typeof e.collapsible!="boolean")throw new Error("Applet layout descriptor context.collapsible must be a boolean");if("initiallyCollapsed"in e&&typeof e.initiallyCollapsed!="boolean")throw new Error("Applet layout descriptor context.initiallyCollapsed must be a boolean")}}const xt=yt;function wt(e,t){return gt(e,t)}function gt(e,t){const r=At(e),s=e.createController(t);return r.type==="single-pane"?{layout:"single-pane",controller:s,element:p.createElement(r.render,{controller:s,host:t})}:r.type==="two-pane"?{layout:"two-pane",controller:s,slots:{listHeader:p.createElement(r.slots.listHeader,{controller:s,host:t}),list:p.createElement(r.slots.list,{controller:s,host:t}),mainHeader:p.createElement(r.slots.mainHeader,{controller:s,host:t}),main:p.createElement(r.slots.main,{controller:s,host:t})}}:{layout:"three-pane",controller:s,contextConfig:r.contextConfig,slots:{listHeader:p.createElement(r.slots.listHeader,{controller:s,host:t}),list:p.createElement(r.slots.list,{controller:s,host:t}),mainHeader:p.createElement(r.slots.mainHeader,{controller:s,host:t}),main:p.createElement(r.slots.main,{controller:s,host:t}),context:p.createElement(r.slots.context,{controller:s,host:t})}}}function At(e){if("layout"in e){const t=jt(e.layout),r=xt(t.descriptor),s=r.type;if(e.manifest.layout!==s)throw new Error(`Applet manifest layout ${e.manifest.layout} does not match descriptor layout ${s}`);if(s==="single-pane"){if(!("render"in t))throw new Error("Applet descriptor single-pane render must be a function");return D(t.render,"Applet descriptor single-pane render"),{type:"single-pane",render:t.render}}if(!("slots"in t))throw new Error(`Applet descriptor declares ${s} but no slots were provided`);return s==="two-pane"?(ne(t.slots,"Applet descriptor two-pane"),{type:"two-pane",slots:t.slots}):(Ct(t.slots,"Applet descriptor three-pane"),{type:"three-pane",contextConfig:r.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 D(e.render,"Applet single-pane render"),{type:"single-pane",render:e.render}}if(e.manifest.layout==="two-pane"&&"slots"in e)return ne(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 ne(e,t){bt(e,t),D(e.listHeader,`${t} slot listHeader`),D(e.list,`${t} slot list`),D(e.mainHeader,`${t} slot mainHeader`),D(e.main,`${t} slot main`)}function Ct(e,t){ne(e,t),D(e.context,`${t} slot context`)}function bt(e,t){if(typeof e!="object"||e===null)throw new Error(`${t} slots must be an object`)}function D(e,t){if(typeof e!="function")throw new Error(`${t} must be a function`)}function jt(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 Et=p.createContext(null);function vt(e){return n.jsx("nav",{className:Be("space-y-1 p-3",e.className),...e})}function St({selected:e,className:t,onClick:r,...s}){const a=p.useContext(Et);return n.jsx("button",{type:"button","aria-current":e?"page":void 0,className:Be("flex w-full items-center rounded-md px-3 py-2 text-left text-sm hover:bg-accent aria-[current=page]:bg-accent aria-[current=page]:font-medium",t),onClick:o=>{r?.(o),a?.showMain()},...s})}const ie=["openai","anthropic","kimi","bailian","deepseek"],Oe="AI Connection request failed. Please try again.";function oe(e){const t=new URL(e);if(t.protocol!=="https:"&&t.protocol!=="http:")throw new Error("Current Pod URL must use HTTP or HTTPS");return t.origin}function Nt({webId:e,podBaseUrl:t,authenticatedFetch:r}){const s=oe(t),a=async(d,f,g,y={})=>{const b=await r(`${s}${d}`,{method:f,credentials:"omit",mode:"cors",headers:{accept:"application/json",...g?{"content-type":"application/json"}:{}},...g?{body:JSON.stringify(g)}:{}}),E=await Pt(b);if(!b.ok)throw new Error(It(E,b.status,y));return E},o=d=>(ce(d),`/api/ai/gateway/providers/${d}`),c=async(d,f,g,y)=>{const b=await a(`${o(d)}${f}`,g,y,{provider:d});return Lt(b,d)};return{webId:e,apiBase:s,getServiceAccess(){return a("/api/applets/service-access/ai-connection","GET")},async listProviders(){const d=await a("/api/ai/connections/providers","GET");return Array.isArray(d.data)?d.data.map(_t).filter(be):[]},async listModels(){const d=await a("/v1/models","GET");return Array.isArray(d.data)?d.data.map(Ft).filter(be):[]},async beginConnect(d,f){return await c(d,"/connect/begin","POST",{mode:f})},connectStatus(d,f){if(!f.attemptId)throw new Error("Connect attempt id is required");const g=new URLSearchParams({state:f.state??"",signature:f.signature??""});return c(d,`/connect/status/${encodeURIComponent(f.attemptId)}?${g}`,"GET")},completeApiKey(d,f,g,y){return c(d,"/connect/complete-api-key","POST",L({attemptId:f.attemptId,state:f.state,signature:f.signature,apiKey:g,accountLabel:y}))},pollDevice(d,f){return c(d,"/connect/poll","POST",L({attemptId:f.attemptId,state:f.state,signature:f.signature}))},async disconnect(d){const f=await a(`${o(d)}/connect`,"DELETE");return Dt(f.record)},quota(d,f=!1){return a(`${o(d)}/quota/${f?"refresh":"status"}`,f?"POST":"GET",f?{}:void 0,{provider:d})}}}function ae(e){return e instanceof Error?Ae(e.message):Ae(String(e))}function It(e,t,r={}){const s=kt(e),a=s?Q(s,r.provider):void 0;if(a)return a;const o=R(e)&&typeof e.error=="string"?e.error:void 0;if(o){const c=Q(o,r.provider);if(c)return c;if(o==="AI Connection service identity is unavailable")return o}return t===401?"Please sign in again to continue.":t===403?"AI Connection permission was denied.":t===404&&r.provider?`${re(r.provider)} connection is not configured.`:t===429?"AI Connection is rate limited. Please try again later.":t===503?"AI Connection service is unavailable.":Oe}function Ae(e){const t=Q(e);if(t)return t;const r=e.split(":",1)[0]?.trim(),s=r?Q(r):void 0;return s||(e==="AI Connection service identity is unavailable"?e:e.startsWith("invalid_")?"AI Connection returned an invalid response.":Oe)}function kt(e){if(R(e)){if(typeof e.code=="string")return e.code;if(typeof e.errorCode=="string")return e.errorCode;if(typeof e.error=="string"&&/^[a-z][a-z0-9_:-]{0,80}$/i.test(e.error))return e.error}}function Q(e,t){switch(e.trim().toLowerCase().replace(/-/g,"_")){case"not_configured":case"notconfigured":return t?`${re(t)} connection is not configured.`:"AI provider connection is not configured.";case"unsupported":return t?`${re(t)} does not support this operation.`:"This AI Connection operation is not supported.";case"service_identity_unavailable":return"AI Connection service identity is unavailable";case"unauthorized":return"Please sign in again to continue.";case"forbidden":case"permission_denied":return"AI Connection permission was denied.";case"rate_limited":return"AI Connection is rate limited. Please try again later.";case"service_unavailable":return"AI Connection service is unavailable.";default:return}}function re(e){switch(e){case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"kimi":return"Kimi";case"bailian":return"Bailian";case"deepseek":return"DeepSeek"}}async function Pt(e){const t=await e.text();if(t)try{return JSON.parse(t)}catch{throw new Error(`AI Connection returned invalid JSON (${e.status})`)}}function ce(e){if(!ie.includes(e))throw new Error(`Unsupported AI provider: ${e}`)}function Ft(e){if(!R(e)||typeof e.id!="string"||$t(e.id))return;const t=V(e.provider)??V(e.providerId)??V(e.owned_by)??Bt(e.id);if(t)return L({id:e.id,provider:t,displayName:I(e.displayName)??I(e.name),contextWindow:Ce(e.contextWindow)??Ce(e.context_window),protocols:Array.isArray(e.protocols)?e.protocols.filter(r=>typeof r=="string"):void 0})}function $t(e){const t=e.toLowerCase();return t==="linx"||t==="linx-lite"||t==="undefineds/linx"||t==="undefineds/linx-lite"}function V(e){if(typeof e!="string")return;const t=e.toLowerCase();return t==="alibaba"||t==="dashscope"?"bailian":ie.includes(t)?t:void 0}function Bt(e){const t=e.split("/",1)[0];return e.includes("/")?V(t):void 0}function Ce(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function _t(e){if(!(!R(e)||typeof e.provider!="string"||!Ut(e.status)||!R(e.connect)||!Array.isArray(e.connect.modes)||!e.connect.modes.every(Ke)||typeof e.connect.configured!="boolean"))return ce(e.provider),L({provider:e.provider,status:e.status,authMode:I(e.authMode),accountLabel:I(e.accountLabel),expiresAt:I(e.expiresAt),reauthRequired:typeof e.reauthRequired=="boolean"?e.reauthRequired:void 0,credentialIri:I(e.credentialIri),version:typeof e.version=="number"?e.version:void 0,connect:L({modes:[...e.connect.modes],configured:e.connect.configured,message:I(e.connect.message)})})}function Dt(e){if(!(!R(e)||typeof e.id!="string"||typeof e.credentialIri!="string"||typeof e.webId!="string"||typeof e.provider!="string"||typeof e.authMode!="string"||typeof e.status!="string"))return ce(e.provider),L({id:e.id,credentialIri:e.credentialIri,webId:e.webId,provider:e.provider,authMode:e.authMode,status:e.status,accountLabel:I(e.accountLabel),expiresAt:I(e.expiresAt),version:typeof e.version=="number"?e.version:void 0,reauthRequired:typeof e.reauthRequired=="boolean"?e.reauthRequired:void 0})}function Lt(e,t){if(!R(e)||!Ke(e.mode)||!Rt(e.status)||e.provider!==t)throw new Error("AI Connection returned an invalid Connect response");return L({mode:e.mode,status:e.status,provider:t,attemptId:I(e.attemptId),state:I(e.state),signature:I(e.signature),expiresAt:I(e.expiresAt),authorizationUrl:Z(e.authorizationUrl),userCode:I(e.userCode),verificationUri:Z(e.verificationUri),verificationUriComplete:Z(e.verificationUriComplete),intervalSeconds:typeof e.intervalSeconds=="number"?e.intervalSeconds:void 0,apiKeyManagementSupported:typeof e.apiKeyManagementSupported=="boolean"?e.apiKeyManagementSupported:void 0,credentialId:I(e.credentialId),message:I(e.message)})}function L(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function I(e){return typeof e=="string"?e:void 0}function Z(e){if(typeof e=="string")try{const t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"?t.href:void 0}catch{return}}function Ke(e){return e==="browserAssistedApiKey"||e==="deviceCodeOAuth"||e==="connectUnsupported"}function Rt(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"||e==="completed"||e==="expired"||e==="cancelled"||e==="unsupported"}function Ut(e){return e==="connected"||e==="disconnected"||e==="reauthRequired"}function R(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function be(e){return e!==void 0}const je="co.undefineds.ai-connection",Tt=new Set(["providerCredentials","providerDefinitions","quotaSnapshots"]);function Ee(e,t){if(!J(e))throw new Error("invalid_descriptor");if(e.appletId!==je)throw new Error("invalid_applet_id");const r=e.service;if(!J(r)||typeof r.webId!="string"||typeof r.label!="string"||!Vt(r.webId))throw new Error("invalid_service");if(!Array.isArray(e.resources)||e.resources.length===0)throw new Error("invalid_empty_resources");const s=zt(t),a=new Set,o=e.resources.map(c=>Mt(c,s,a));return{appletId:je,service:{webId:r.webId,label:r.label},resources:o}}function Mt(e,t,r){if(!J(e)||typeof e.id!="string"||typeof e.url!="string"||e.mediaType!=="text/turtle"||!J(e.access))throw new Error("invalid_resource");if(!Tt.has(e.id)||r.has(e.id))throw new Error("invalid_resource");Ot(e.url);let s;try{s=new URL(e.url)}catch{throw new Error("invalid_resource")}if(!qt(s,t))throw new Error("invalid_resource");return r.add(e.id),{id:e.id,url:s.href,mediaType:"text/turtle",access:Ht(e.access)}}function Ot(e){if(/%(?![0-9a-fA-F]{2})/.test(e)||/%(?:2f|5c)/i.test(e)||e.includes("\\"))throw new Error("invalid_resource");const t=Kt(e);if(ve(t))throw new Error("invalid_resource");try{const r=decodeURIComponent(t);if(r.includes("\\")||ve(r))throw new Error("invalid_resource")}catch{throw new Error("invalid_resource")}}function Kt(e){const t=e.split("#",1)[0]??e;return(t.split("?",1)[0]??t).replace(/^[a-z][a-z0-9+.-]*:\/\/[^/\\?#]*/i,"")}function ve(e){return e.split("/").some(t=>t==="."||t==="..")}function Ht(e){if(Object.keys(e).some(r=>r!=="read"&&r!=="append"&&r!=="write")||e.read!==!0||e.append!==!0||e.write!==!0)throw new Error("invalid_resource");return{read:!0,append:!0,write:!0}}function zt(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 qt(e,t){return(e.protocol==="http:"||e.protocol==="https:")&&e.origin===t.origin&&e.pathname.startsWith(t.pathname)}function Vt(e){try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function J(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}const _=[{id:"openai",name:"OpenAI",browserMode:"browserAssistedApiKey",browserLabel:"打开官方控制台"},{id:"anthropic",name:"Anthropic",browserMode:"browserAssistedApiKey",browserLabel:"打开官方控制台"},{id:"kimi",name:"Kimi",browserMode:"deviceCodeOAuth",browserLabel:"浏览器鉴权"},{id:"bailian",name:"百炼",browserMode:"browserAssistedApiKey",browserLabel:"打开官方控制台"},{id:"deepseek",name:"DeepSeek",browserMode:"connectUnsupported",browserLabel:"浏览器鉴权不支持"}];if(_.map(e=>e.id).join(",")!==ie.join(","))throw new Error("AI Connection provider UI is out of sync with the client catalog");function Qt(e){const t=e.solid.session.getSnapshot(),r=Jt(t),s=e.solid.pod,o=t.status==="authenticated"&&s.status==="ready"?Nt({webId:t.webId,podBaseUrl:s.current.podUrl,authenticatedFetch:e.solid.session.fetch}):null;let c="openai",d="",f={},g={},y,b=0,E,v=o?"checking":"missing",l;const A=new Set,h=()=>A.forEach(m=>m()),j={client:o,sessionStatus:r,podStatus:s.status,error:s.status==="error"?s.error:t.status==="error"&&!t.webId?t.error:void 0,login:e.solid.requireLogin,openExternal:e.navigation.openExternal,clientConfigurationBridge:e.capabilities.aiClientConfiguration,clientCredentialManager:e.capabilities.aiClientCredentials,get selectedProvider(){return c},get searchQuery(){return d},get providerStates(){return f},get providerSummaries(){return g},get providerLoadError(){return y},get serviceAccessState(){return v},selectProvider(m){c!==m&&(c=m,h())},selectFirstUnconfiguredProvider(){const m=_.find(x=>f[x.id]==="unconfigured")??_[0];m&&j.selectProvider(m.id)},setSearchQuery(m){d!==m&&(d=m,h())},setProviderState(m,x){if(f[m]===x)return;b+=1,f={...f,[m]:x};const C=Zt(m,x);C&&(g={...g,[m]:C}),h()},async ensureServiceAccess(){return l||(l=(async()=>{if(!o){v="missing",h();return}if(!e.solid.permissions){v="capabilityUnavailable",h();return}if(e.solid.pod.status!=="ready"){v="missing",h();return}v="checking",h();try{const m=Ee(await o.getServiceAccess(),e.solid.pod.current.podUrl),x=await e.solid.permissions.ensureAgentAccess(m);v=x.status==="granted"?"granted":x.status,h(),x.status==="granted"&&await j.loadProviders()}catch(m){v=m instanceof Error&&m.message.startsWith("invalid_")?"invalidDescriptor":"permissionDenied",h()}finally{l=void 0}})(),l)},async revokeServiceAccess(){if(!o){v="missing",h();return}if(!e.solid.permissions){v="capabilityUnavailable",h();return}if(e.solid.pod.status!=="ready"){v="missing",h();return}v="checking",h();try{const m=Ee(await o.getServiceAccess(),e.solid.pod.current.podUrl),x=await e.solid.permissions.revokeAgentAccess(m);v=x.status==="granted"?"granted":x.status,h()}catch(m){v=m instanceof Error&&m.message.startsWith("invalid_")?"invalidDescriptor":"permissionDenied",h()}},async loadProviders(){if(o)return E||(E=(async()=>{const m=b+1;b=m,y=void 0,h();try{const x=await o.listProviders();if(m!==b)return;g=Object.fromEntries(x.map(C=>[C.provider,C])),f=Object.fromEntries(_.map(C=>[C.id,Yt(g[C.id])])),h()}catch(x){if(m!==b)return;y=en(x),h()}finally{E=void 0}})(),E)},subscribe(m){return A.add(m),()=>A.delete(m)}};return j}function Jt(e){return e.status==="initializing"?"authenticating":e.status==="authenticated"?"authenticated":e.status==="error"&&e.webId?"expired":"anonymous"}function de(e){return p.useSyncExternalStore(e.subscribe,()=>e.selectedProvider,()=>e.selectedProvider)}function He(e){return p.useSyncExternalStore(e.subscribe,()=>e.searchQuery,()=>e.searchQuery)}function Wt(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerStates,()=>e.providerStates)}function Gt(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerSummaries,()=>e.providerSummaries)}function ze(e){return p.useSyncExternalStore(e.subscribe,()=>e.providerLoadError,()=>e.providerLoadError)}function Xt(e){return p.useSyncExternalStore(e.subscribe,()=>e.serviceAccessState,()=>e.serviceAccessState)}function Yt(e){return!e||e.status==="disconnected"?"unconfigured":e.status==="reauthRequired"?"attention":e.authMode==="browserAssistedApiKey"?"configured":"connected"}function Zt(e,t){if(t==="configured")return{provider:e,status:"connected",authMode:"browserAssistedApiKey",connect:{modes:["browserAssistedApiKey"],configured:!0}};if(t==="connected")return{provider:e,status:"connected",connect:{modes:["deviceCodeOAuth","browserAssistedApiKey"],configured:!0}};if(t!=="attention"&&t!=="loading")return{provider:e,status:"disconnected",connect:{modes:["browserAssistedApiKey"],configured:!1}}}function en(e){return ae(e)}function tn({controller:e}){const t=de(e),r=He(e).trim().toLocaleLowerCase(),s=Wt(e),a=ze(e),o=r?_.filter(c=>c.name.toLocaleLowerCase().includes(r)):_;return n.jsxs(vt,{"aria-label":"AI 服务",children:[o.map(c=>n.jsx(nn,{provider:c,selected:t===c.id,state:s[c.id]??"loading",onSelect:()=>e.selectProvider(c.id)},c.id)),o.length===0?n.jsx("p",{className:"px-3 py-6 text-center text-xs text-muted-foreground",children:"没有匹配的 Provider"}):null,a?n.jsxs("p",{className:"px-3 py-2 text-xs text-destructive",children:["Provider 状态读取失败:",a]}):null]})}function nn({provider:e,selected:t,state:r,onSelect:s}){const a=`ai-connection-provider-${e.id}-status`,o=sn(r);return n.jsxs(St,{selected:t,"aria-label":e.name,"aria-describedby":a,onClick:s,className:"gap-3 py-2.5",children:[n.jsx("span",{"aria-hidden":"true",className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-muted text-[10px] font-semibold text-muted-foreground",children:rn(e.id)}),n.jsx("span",{className:"min-w-0 flex-1 truncate",children:e.name}),n.jsx("span",{id:a,role:"status","aria-live":"polite",className:"shrink-0 text-[11px] font-normal text-muted-foreground",children:o})]})}function rn(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS"}}function sn(e){switch(e){case"unconfigured":return"未设置";case"configured":return"已配置";case"connected":return"已连接";case"attention":return"需处理";default:return"读取中"}}const on=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),qe=(...e)=>e.filter((t,r,s)=>!!t&&t.trim()!==""&&s.indexOf(t)===r).join(" ").trim();var an={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const cn=p.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:s,className:a="",children:o,iconNode:c,...d},f)=>p.createElement("svg",{ref:f,...an,width:t,height:t,stroke:e,strokeWidth:s?Number(r)*24/Number(t):r,className:qe("lucide",a),...d},[...c.map(([g,y])=>p.createElement(g,y)),...Array.isArray(o)?o:[o]]));const P=(e,t)=>{const r=p.forwardRef(({className:s,...a},o)=>p.createElement(cn,{ref:o,iconNode:t,className:qe(`lucide-${on(e)}`,s),...a}));return r.displayName=`${e}`,r};const dn=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],un=P("Check",dn);const ln=[["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"}]],pn=P("Copy",ln);const fn=[["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"}]],mn=P("ExternalLink",fn);const hn=[["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"}]],W=P("KeyRound",hn);const yn=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],G=P("LoaderCircle",yn);const xn=[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]],wn=P("LogOut",xn);const gn=[["path",{d:"M12 17v4",key:"1riwvh"}],["path",{d:"m15.2 4.9-.9-.4",key:"12wd2u"}],["path",{d:"m15.2 7.1-.9.4",key:"1r2vl7"}],["path",{d:"m16.9 3.2-.4-.9",key:"3zbo91"}],["path",{d:"m16.9 8.8-.4.9",key:"1qr2dn"}],["path",{d:"m19.5 2.3-.4.9",key:"1rjrkq"}],["path",{d:"m19.5 9.7-.4-.9",key:"heryx5"}],["path",{d:"m21.7 4.5-.9.4",key:"17fqt1"}],["path",{d:"m21.7 7.5-.9-.4",key:"14zyni"}],["path",{d:"M22 13v2a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7",key:"1tnzv8"}],["path",{d:"M8 21h8",key:"1ev6f3"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}]],An=P("MonitorCog",gn);const Cn=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],bn=P("Plus",Cn);const jn=[["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"}]],En=P("RefreshCcw",jn);const vn=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Sn=P("RotateCcw",vn);const Nn=[["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"}]],In=P("RotateCw",Nn);const kn=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],Pn=P("Search",kn);const Fn=[["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"}]],$n=P("Trash2",Fn),Se=["codex","claude-code","pi","codebuddy"],U={codex:"Codex","claude-code":"Claude Code",pi:"Pi",codebuddy:"CodeBuddy"};function Bn({bridge:e,endpoint:t,createClientCredential:r}){const[s,a]=p.useState({}),[o,c]=p.useState({}),[d,f]=p.useState({}),[g,y]=p.useState();p.useEffect(()=>{if(!e)return;let l=!0;return Promise.all(Se.map(async A=>{let h;try{h=await e.inspect(A)}catch(j){h={status:"unavailable",message:K(j)}}l&&a(j=>({...j,[A]:h}))})),()=>{l=!1}},[e]);const b=async l=>{if(e){y(l);try{const A=await e.plan({client:l,endpoint:t});c(h=>({...h,[l]:A})),f(h=>({...h,[l]:""}))}catch(A){a(h=>({...h,[l]:{status:"unavailable",message:K(A)}}))}finally{y(void 0)}}},E=async l=>{const A=o[l];if(!e||!A||!r)return;y(l);let h,j=!1;try{h=await r(l),await e.apply({client:l,planId:A.planId,apiKey:h.apiKey,...A.confirmation?.required?{confirmation:{token:A.confirmation.token,targetHash:A.confirmation.targetHash}}:{}}),j=!0;const m=await e.verify({client:l,planId:A.planId});a(x=>({...x,[l]:m})),c(x=>({...x,[l]:void 0}))}catch(m){let x=K(m);if(h&&!j)try{await h.revoke()}catch(C){x=`${x};自动撤销新建 Client Credential 失败:${K(C)}。请到 Account Developer Access 手动撤销。`}a(C=>({...C,[l]:Dn(m)?{status:"failedAndRestored",message:"配置验证失败,已自动恢复原配置。"}:{status:"unavailable",message:x}}))}finally{y(void 0)}},v=async l=>{if(e){y(l);try{const A=await e.restore(l);a(h=>({...h,[l]:A}))}catch(A){a(h=>({...h,[l]:{status:"unavailable",message:K(A)}}))}finally{y(void 0)}}};return n.jsxs(_e,{children:[n.jsxs(De,{children:[n.jsxs(Le,{className:"flex items-center gap-2 text-base",children:[n.jsx(An,{className:"h-4 w-4"}),"Developer Access"]}),n.jsxs(Re,{children:["使用 Solid Client Credentials 生成 ",n.jsx("code",{children:"sk-*"})," API Key;Provider 凭证不会离开 Pod。"]})]}),n.jsx(Ue,{className:"space-y-2",children:Se.map(l=>{const A=s[l]??{status:e?"notConfigured":"unavailable",message:e?void 0:"当前 Host 不支持修改本机客户端配置。"},h=o[l],j=h?.confirmation,m=d[l]??"",x=!j?.required||m===j.token;return n.jsxs("div",{className:"space-y-3 rounded-lg border p-3",children:[n.jsxs("div",{className:"flex items-center justify-between gap-3",children:[n.jsxs("div",{children:[n.jsx("div",{className:"text-sm font-medium",children:U[l]}),n.jsx("div",{className:"mt-1 text-xs text-muted-foreground",children:A.message??Ne(A.status)})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(Te,{variant:"secondary",children:Ne(A.status)}),n.jsx(S,{variant:"outline",size:"sm",disabled:!e||!!g,onClick:()=>{b(l)},children:"配置"}),n.jsx(S,{variant:"ghost",size:"icon","aria-label":`恢复 ${U[l]} 配置`,disabled:!e||A.status==="notConfigured"||!!g,onClick:()=>{v(l)},children:n.jsx(Sn,{className:"h-4 w-4"})})]})]}),h?n.jsxs("div",{className:"space-y-2 rounded-md border bg-muted/20 p-3",children:[n.jsx("div",{className:"text-xs font-medium",children:"将执行以下更改"}),h.changes.map(C=>n.jsxs("div",{className:"text-xs text-muted-foreground",children:[n.jsx("span",{className:"font-mono",children:C.target})," · ",_n(C.action),C.backup?" · 创建备份":""]},`${C.target}:${C.action}`)),j?.required?n.jsxs("div",{className:"space-y-2",children:[j.message?n.jsx("div",{className:"text-xs text-muted-foreground",children:j.message}):null,n.jsx(X,{"aria-label":`输入确认码以应用 ${U[l]} 配置`,value:m,onChange:C=>f(Y=>({...Y,[l]:C.target.value}))})]}):null,n.jsxs("div",{className:"flex gap-2",children:[n.jsx(S,{size:"sm","aria-label":j?.required?`确认并应用 ${U[l]} 配置`:`应用 ${U[l]} 配置`,disabled:!r||!!g||!x,onClick:()=>{E(l)},children:j?.required?"确认并应用":"应用更改"}),n.jsx(S,{variant:"ghost",size:"sm",disabled:!!g,onClick:()=>{c(C=>({...C,[l]:void 0})),f(C=>({...C,[l]:void 0}))},children:"取消"})]})]}):null]},l)})})]})}function _n(e){switch(e){case"update":return"更新";case"delete":return"删除";default:return"创建或更新"}}function Ne(e){switch(e){case"configured":return"已配置";case"drifted":return"配置已变化";case"unverifiable":return"无法验证";case"failedAndRestored":return"已恢复";case"unavailable":return"当前不可用";default:return"未配置"}}function Dn(e){return!!(e&&typeof e=="object"&&"code"in e&&e.code==="verification_failed_restored")}function K(e){return ae(e)}function Ln({providerName:e,quota:t,busy:r,disabled:s=!1,onRefresh:a}){return n.jsxs("div",{className:"space-y-2",children:[n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[n.jsx("div",{className:"text-sm font-medium",children:"剩余额度"}),n.jsxs(S,{variant:"ghost",size:"sm","aria-label":`刷新 ${e} 额度`,disabled:r||s,onClick:a,children:[n.jsx(En,{className:"mr-2 h-3.5 w-3.5"}),"刷新"]})]}),t?t.status==="unsupported"?n.jsxs(n.Fragment,{children:[n.jsx("p",{className:"text-sm",children:"官方额度接口不支持"}),n.jsxs("p",{className:"text-xs text-muted-foreground",children:["来源:",t.source]})]}):t.status==="error"?n.jsx("p",{className:"text-sm text-destructive",children:"额度查询失败"}):n.jsxs("div",{className:"space-y-1 text-sm",children:[typeof t.balance=="number"?n.jsxs("div",{children:["余额:",t.balance]}):null,t.windows.map((o,c)=>n.jsxs("div",{children:[o.name?`${o.name}:`:"",typeof o.remaining=="number"?`剩余 ${o.remaining}`:"官方数据可用"]},`${String(o.name)}-${c}`)),n.jsxs("p",{className:"text-xs text-muted-foreground",children:["来源:",t.source,t.stale?" · 数据可能已过期":""]})]}):n.jsx("p",{className:"text-xs text-muted-foreground",children:"尚未检查"})]})}function Rn({definition:e,status:t,accountLabel:r,attempt:s,apiKey:a,busy:o,disabled:c=!1,error:d,quota:f,models:g,onApiKeyChange:y,onBeginApiKey:b,onBeginBrowser:E,onSaveApiKey:v,onDisconnect:l,onRefreshQuota:A}){const h=s?.mode==="browserAssistedApiKey"&&s.status==="pending",j=t==="configured",m=t==="connected";return n.jsxs("div",{children:[n.jsxs("header",{className:"flex items-start justify-between gap-4 pb-5",children:[n.jsxs("div",{className:"min-w-0",children:[n.jsx("h2",{className:"text-lg font-semibold text-foreground",children:e.name}),n.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:Un(e.id)})]}),n.jsx(Te,{variant:m||j?"default":"secondary",children:Tn(t)})]}),n.jsxs("section",{className:"border-t border-border/60 py-5","aria-label":"当前连接",children:[n.jsxs("div",{className:"mb-4",children:[n.jsx("h3",{className:"text-sm font-medium",children:"当前连接"}),r?n.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:Mn(r)}):n.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"Provider 凭证加密保存在当前 Pod。"})]}),s?.userCode?n.jsxs("div",{className:"mb-4 border-l-2 border-primary bg-muted/30 px-3 py-2 text-sm",children:["验证码:",n.jsx("strong",{className:"font-mono",children:s.userCode})]}):null,n.jsx("div",{className:"flex flex-wrap gap-2",children:m?n.jsxs(n.Fragment,{children:[n.jsxs(S,{variant:"outline",size:"sm",disabled:o||c,onClick:E,children:[o?n.jsx(G,{className:"mr-2 h-4 w-4 animate-spin"}):n.jsx(In,{className:"mr-2 h-4 w-4"}),"重新连接"]}),n.jsxs(S,{variant:"ghost",size:"sm",disabled:o||c,onClick:l,children:[n.jsx(wn,{className:"mr-2 h-4 w-4"}),"断开连接"]})]}):j?n.jsxs(n.Fragment,{children:[n.jsxs(S,{variant:"outline",size:"sm","aria-label":"更新 API Key",disabled:o||c,onClick:b,children:[n.jsx(W,{className:"mr-2 h-4 w-4"}),"更新 API Key"]}),n.jsx(S,{variant:"ghost",size:"sm",disabled:o||c,onClick:l,children:"移除配置"})]}):n.jsxs(n.Fragment,{children:[n.jsxs(S,{variant:"outline",size:"sm",disabled:o||c||e.browserMode==="connectUnsupported",onClick:E,children:[o?n.jsx(G,{className:"mr-2 h-4 w-4 animate-spin"}):n.jsx(mn,{className:"mr-2 h-4 w-4"}),e.browserLabel]}),n.jsxs(S,{variant:"outline",size:"sm","aria-label":`${e.name} API Key`,disabled:o||c,onClick:b,children:[n.jsx(W,{className:"mr-2 h-4 w-4"}),"配置 API Key"]})]})}),h?n.jsxs("div",{className:"mt-4 space-y-2",children:[n.jsx(X,{type:"password",autoComplete:"off","aria-label":`${e.name} API Key 输入`,placeholder:"从官方控制台复制 API Key",value:a,onChange:x=>y(x.target.value)}),n.jsx(S,{size:"sm","aria-label":`保存 ${e.name} API Key`,disabled:!a.trim()||o||c,onClick:v,children:"保存 API Key"})]}):null,d?n.jsx("p",{className:"mt-3 text-sm text-destructive",children:d}):null]}),n.jsx("section",{className:"border-t border-border/60 py-5",children:n.jsx(Ln,{providerName:e.name,quota:f,busy:o,disabled:c,onRefresh:A})}),n.jsxs("section",{className:"border-t border-border/60 py-5",children:[n.jsx("h3",{className:"text-sm font-medium",children:"可用模型"}),g.length===0?n.jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:"当前身份暂无可用模型"}):n.jsx("ul",{className:"mt-3 divide-y divide-border/50 text-sm",children:g.map(x=>n.jsxs("li",{className:"flex items-center justify-between gap-4 py-2.5",children:[n.jsx("span",{children:x.displayName??x.id}),x.displayName?n.jsx("span",{className:"truncate font-mono text-xs text-muted-foreground",children:x.id}):null]},x.id))})]})]})}function Un(e){switch(e){case"openai":return"OpenAI 模型与编码能力";case"anthropic":return"Claude 模型与编码能力";case"kimi":return"Moonshot AI 模型服务";case"bailian":return"阿里云百炼模型服务";case"deepseek":return"DeepSeek 模型服务"}}function Tn(e){switch(e){case"pending":return"连接中";case"configured":return"已配置";case"connected":return"已连接";case"disconnected":return"未设置";case"reauthRequired":return"需要重新鉴权";case"failed":return"连接失败";default:return"未检查"}}function Mn(e){const t=e.indexOf("@");if(t>0){const r=e.slice(0,t);return`${r.length>1?`${r[0]}***${r[r.length-1]}`:`${r[0]}***`}${e.slice(t)}`}return e.length<=2?`${e[0]??""}***`:`${e[0]}***${e[e.length-1]}`}const On={};function Kn({client:e,openExternal:t=qn,clientConfigurationBridge:r,clientCredentialManager:s,selectedProvider:a,providerSummaries:o=On,providerLoadError:c,serviceAccessGranted:d=!1,onProviderStateChange:f}){const[g,y]=p.useState([]),[b,E]=p.useState(!!s),[v,l]=p.useState(""),[A,h]=p.useState(!1),[j,m]=p.useState(),[x,C]=p.useState(),[Y,ue]=p.useState({}),[Ze,et]=p.useState([]),[le,M]=p.useState({}),[pe,fe]=p.useState({}),[tt,nt]=p.useState({}),[rt,st]=p.useState({}),[it,me]=p.useState({}),[he,ye]=p.useState(!1),q=p.useRef(0),$=p.useCallback((i,u)=>{ue(w=>({...w,[i]:u})),f?.(i,zn(u))},[f]);p.useEffect(()=>{ue(Object.fromEntries(Object.values(o).filter(Qn).map(i=>[i.provider,i.status==="connected"&&i.authMode==="browserAssistedApiKey"?"configured":i.status])))},[o]),p.useEffect(()=>{let i=!0;return s?(E(!0),s.list().then(u=>{i&&y(u)}).catch(u=>{i&&C(B(u))}).finally(()=>{i&&E(!1)})):(E(!1),y([])),e.listModels().then(u=>{i&&et(u)}).catch(u=>{i&&C(B(u))}),()=>{i=!1,q.current+=1}},[e,s]);const F=(i,u)=>{nt(w=>({...w,[i]:u}))},k=(i,u)=>{st(w=>({...w,[i]:u}))},xe=p.useCallback(async i=>{const u=i.verificationUriComplete??i.authorizationUrl??i.verificationUri;u&&await t(u)},[t]),we=async i=>{if(d){F(i,!0),k(i);try{const u=await e.beginConnect(i,"browserAssistedApiKey");M(N=>({...N,[i]:u}));const w=se(u.status);if($(i,w?"pending":u.status==="completed"?"configured":"failed"),!w&&u.status!=="completed"){k(i,u.message??Ie(u.status));return}await xe(u)}catch(u){$(i,"failed"),k(i,B(u))}finally{F(i,!1)}}},ot=async i=>{if(!d||i.browserMode==="connectUnsupported")return;if(i.browserMode==="browserAssistedApiKey"){await we(i.id);return}F(i.id,!0),k(i.id);const u=q.current+1;q.current=u;try{const w=await e.beginConnect(i.id,i.browserMode);if(M(N=>({...N,[i.id]:w})),!se(w.status)){const N=w.status==="completed";$(i.id,N?"connected":"failed"),N||k(i.id,w.message??Ie(w.status)),F(i.id,!1);return}$(i.id,"pending"),await xe(w),Hn(e,i.id,w,u,q,{onAttempt:N=>M(O=>({...O,[i.id]:N})),onConnected:()=>$(i.id,"connected"),onFailed:N=>{$(i.id,"failed"),k(i.id,N)},onFinished:()=>F(i.id,!1)})}catch(w){$(i.id,"failed"),k(i.id,B(w)),F(i.id,!1)}},at=async i=>{if(!d)return;const u=pe[i.id]?.trim(),w=le[i.id];if(!(!u||!w)){F(i.id,!0),k(i.id);try{const N=await e.completeApiKey(i.id,w,u);M(O=>({...O,[i.id]:N})),fe(O=>({...O,[i.id]:""})),$(i.id,"configured")}catch(N){k(i.id,B(N)),$(i.id,"failed")}finally{F(i.id,!1)}}},ct=async i=>{if(d){F(i,!0),k(i);try{await e.disconnect(i),M(u=>({...u,[i]:void 0})),me(u=>({...u,[i]:void 0})),$(i,"disconnected")}catch(u){k(i,B(u))}finally{F(i,!1)}}},dt=async i=>{F(i,!0),k(i);try{const u=await e.quota(i,!0);me(w=>({...w,[i]:u}))}catch(u){k(i,B(u))}finally{F(i,!1)}},ut=async()=>{if(!(!d||!s)){h(!0),C(void 0),m(void 0);try{const i=await s.create({name:v.trim()||"AI Connection",webId:e.webId});m({clientId:i.clientId,clientSecret:i.clientSecret,apiKey:i.apiKey}),y(u=>[i,...u.filter(w=>w.resourceUrl!==i.resourceUrl)]),l("")}catch(i){C(B(i))}finally{h(!1)}}},lt=async i=>{if(!(!d||!s)){C(void 0);try{await s.revoke(i.resourceUrl),y(u=>u.filter(w=>w.resourceUrl!==i.resourceUrl))}catch(u){C(B(u))}}},pt=async()=>{j&&(await navigator.clipboard?.writeText(j.apiKey),ye(!0))},ft=p.useCallback(async i=>{if(!d)throw new Error("AI Connection service access is not granted");if(!s)throw new Error("Client Credentials are not available in this host");const u=await s.create({name:`AI Connection · ${U[i]}`,webId:e.webId});return y(w=>[u,...w.filter(N=>N.resourceUrl!==u.resourceUrl)]),{apiKey:u.apiKey,revoke:async()=>{await s.revoke(u.resourceUrl),y(w=>w.filter(N=>N.resourceUrl!==u.resourceUrl))}}},[e.webId,s,d]);return n.jsxs("div",{className:"mx-auto w-full max-w-3xl px-6 py-6",children:[n.jsxs("section",{children:[c?n.jsxs("p",{className:"mb-4 rounded-md border border-destructive/30 px-3 py-2 text-sm text-destructive",children:["Provider 状态读取失败:",c]}):null,_.filter(i=>i.id===(a??"openai")).map(i=>n.jsx(Rn,{definition:i,status:Y[i.id]??"unknown",accountLabel:o[i.id]?.accountLabel,attempt:le[i.id],apiKey:pe[i.id]??"",busy:!!tt[i.id],disabled:!d,error:rt[i.id],quota:it[i.id],models:Ze.filter(u=>u.provider===i.id),onApiKeyChange:u=>fe(w=>({...w,[i.id]:u})),onBeginApiKey:()=>{we(i.id)},onBeginBrowser:()=>{ot(i)},onSaveApiKey:()=>{at(i)},onDisconnect:()=>{ct(i.id)},onRefreshQuota:()=>{dt(i.id)}},i.id))]}),n.jsxs("details",{className:"border-t border-border/60 py-5",children:[n.jsx("summary",{className:"cursor-pointer list-none text-sm font-medium",children:"客户端接入"}),n.jsxs("div",{className:"mt-4 space-y-6",children:[n.jsx(Bn,{bridge:r,endpoint:e.apiBase,createClientCredential:ft}),n.jsxs("details",{className:"border-t border-border/60 pt-4",children:[n.jsx("summary",{className:"cursor-pointer text-sm font-medium text-muted-foreground",children:"Client Credentials"}),n.jsx("div",{className:"mt-3",children:n.jsxs(_e,{children:[n.jsxs(De,{children:[n.jsxs(Le,{className:"flex items-center gap-2 text-base",children:[n.jsx(W,{className:"h-4 w-4"}),"Client Credentials"]}),n.jsxs(Re,{children:["为 Codex、Claude Code、Pi、CodeBuddy 创建 Solid Client Credentials。API Key 为 ",n.jsx("code",{children:"sk-base64(client_id:client_secret)"}),",只在创建后显示一次。"]})]}),n.jsxs(Ue,{className:"space-y-4",children:[s?null:n.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm text-muted-foreground",children:["当前 Host 没有提供 account-controls Client Credentials capability。",n.jsx("a",{className:"ml-1 underline",href:"/.account/",children:"打开 Account Developer Access"})," ","手动创建 API Key。"]}),n.jsxs("div",{className:"flex gap-2",children:[n.jsx(X,{"aria-label":"Client Credential 名称",placeholder:"名称,例如 Codex",value:v,onChange:i=>l(i.target.value)}),n.jsxs(S,{onClick:()=>{ut()},disabled:A||!d||!s,children:[A?n.jsx(G,{className:"mr-2 h-4 w-4 animate-spin"}):n.jsx(W,{className:"mr-2 h-4 w-4"}),"创建 Client Credential"]})]}),j?n.jsxs("div",{className:"space-y-3 rounded-lg border border-amber-500/30 bg-amber-500/5 p-4",children:[n.jsx("p",{className:"text-sm font-medium",children:"请立即保存;关闭后无法再次查看。"}),n.jsxs("div",{className:"space-y-2 rounded bg-background p-3 text-xs",children:[n.jsxs("div",{children:[n.jsx("span",{className:"text-muted-foreground",children:"Client ID: "}),n.jsx("code",{children:j.clientId})]}),n.jsxs("div",{children:[n.jsx("span",{className:"text-muted-foreground",children:"Client Secret: "}),n.jsx("code",{children:j.clientSecret})]}),n.jsxs("div",{children:[n.jsx("span",{className:"text-muted-foreground",children:"API Key: "}),n.jsx("code",{children:j.apiKey})]})]}),n.jsxs("div",{className:"flex flex-wrap gap-2",children:[n.jsxs(S,{variant:"outline",size:"sm",onClick:()=>{pt()},children:[he?n.jsx(un,{className:"mr-2 h-4 w-4"}):n.jsx(pn,{className:"mr-2 h-4 w-4"}),he?"已复制":"复制 API Key"]}),n.jsx(S,{size:"sm",onClick:()=>{m(void 0),ye(!1)},children:"我已保存,隐藏密钥"})]})]}):null,x?n.jsx("p",{className:"text-sm text-destructive",children:x}):null,b?n.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[n.jsx(G,{className:"h-4 w-4 animate-spin"}),"正在读取 Client Credentials"]}):g.length===0?n.jsx("p",{className:"text-sm text-muted-foreground",children:"尚未创建 Client Credential。"}):n.jsx("div",{className:"space-y-2",children:g.map(i=>n.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-lg border p-3",children:[n.jsxs("div",{className:"min-w-0",children:[n.jsx("div",{className:"truncate text-sm font-medium",children:i.id}),n.jsx("div",{className:"mt-1 text-xs text-muted-foreground",children:i.webId??e.webId})]}),n.jsx(S,{variant:"ghost",size:"icon","aria-label":`撤销 ${i.id}`,disabled:!d||!s,onClick:()=>{lt(i)},children:n.jsx($n,{className:"h-4 w-4"})})]},i.resourceUrl))})]})]})})]})]})]})]})}async function Hn(e,t,r,s,a,o){let c=r;try{for(;a.current===s&&se(c.status);){if(await Vn(Math.max(1,c.intervalSeconds??2)*1e3),a.current!==s)return;c=await e.pollDevice(t,c),o.onAttempt(c)}c.status==="completed"?o.onConnected():a.current===s&&o.onFailed(c.message||`连接${c.status==="expired"?"已过期":"失败"}`)}catch(d){a.current===s&&o.onFailed(B(d))}finally{a.current===s&&o.onFinished()}}function se(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"}function Ie(e){return e==="expired"?"连接已过期,请重新开始":e==="cancelled"?"连接已取消":e==="unsupported"?"当前 Provider 不支持此连接方式":"连接失败"}function zn(e){return e==="configured"?"configured":e==="connected"?"connected":e==="failed"||e==="reauthRequired"?"attention":e==="pending"?"loading":"unconfigured"}function qn(e){window.open(e,"_blank","noopener,noreferrer")}function Vn(e){return new Promise(t=>window.setTimeout(t,e))}function B(e){return ae(e)}function Qn(e){return e!==void 0}function Jn({controller:e}){const t=de(e),r=Gt(e),s=ze(e),a=Xt(e),o=_.find(c=>c.id===t);if(!e.client){const c=e.sessionStatus==="expired",d=e.sessionStatus==="authenticating"||e.podStatus==="opening",f=e.error??(e.sessionStatus==="authenticated"&&e.podStatus!=="ready"?new Error("当前 Pod 尚未就绪"):void 0);return d?n.jsx("section",{"aria-label":"AI Connection",className:"space-y-3 p-6",children:n.jsx("p",{role:"status",children:"正在打开当前 Pod..."})}):f?n.jsxs("section",{"aria-label":"AI Connection",className:"space-y-3 p-6",children:[n.jsx("p",{className:"text-sm text-destructive",children:f.message}),n.jsx(S,{size:"sm",onClick:()=>{e.login()},children:"重试登录"})]}):n.jsxs("section",{"aria-label":"AI Connection",className:"space-y-3 p-6",children:[n.jsx("p",{children:c?"当前登录已过期,请重新登录后继续。":"登录后即可管理当前 Pod 的 AI 连接。"}),n.jsx(S,{size:"sm",onClick:()=>{e.login()},children:c?"重新登录":"登录"})]})}return n.jsxs("section",{role:"region","aria-label":`${o?.name??t} 详情`,children:[n.jsx("p",{className:"px-6 pt-4 text-xs text-muted-foreground",role:"status",children:Wn(a)}),n.jsx(Kn,{client:e.client,selectedProvider:t,openExternal:e.openExternal,clientConfigurationBridge:e.clientConfigurationBridge,clientCredentialManager:e.clientCredentialManager,providerSummaries:r,providerLoadError:s,serviceAccessGranted:a==="granted",onProviderStateChange:e.setProviderState})]})}function Wn(e){return e==="granted"?"服务访问已授权":e==="checking"?"服务访问检查中":"服务访问未授权"}function Gn({controller:e}){const t=He(e);return n.jsxs("div",{className:"flex h-full min-w-0 items-center gap-2 px-3",children:[n.jsxs("div",{className:"relative min-w-0 flex-1",children:[n.jsx(Pn,{"aria-hidden":"true",className:"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),n.jsx(X,{type:"search","aria-label":"搜索 Provider",placeholder:"搜索 Provider",value:t,onChange:r=>e.setSearchQuery(r.target.value),className:"h-8 border-transparent bg-muted/50 pl-8 text-xs focus-visible:bg-background"})]}),n.jsx(S,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 shrink-0","aria-label":"添加 AI Connection",title:"添加 AI Connection",onClick:()=>e.selectFirstUnconfiguredProvider(),children:n.jsx(bn,{className:"h-4 w-4","aria-hidden":"true"})})]})}function Xn({controller:e}){const t=de(e),r=_.find(s=>s.id===t);return n.jsx("div",{className:"flex h-full min-w-0 items-center px-4",children:n.jsx("h1",{className:"truncate text-sm font-medium text-foreground",children:r?.name??t})})}const Yn=["navigation.openExternal","aiClientConfiguration"];function Zn(e){const t=ee(e,"Extension manifest");ke(t.extensionId,"extensionId"),T(t.name,"name"),T(t.version,"version"),T(t.sdkVersion,"sdkVersion");const r=ee(t.contributes,"contributes");if(!Array.isArray(r.applets)||r.applets.length===0)throw new Error("Extension manifest must contribute at least one Applet");const s=new Set;for(const a of r.applets){const o=ee(a,"Applet manifest"),c=ke(o.appId,"appId");if(s.has(c))throw new Error(`Extension manifest has duplicate appId: ${c}`);if(s.add(c),T(o.name,"Applet name"),T(o.entry,"Applet entry"),!Array.isArray(o.commands))throw new Error("Applet commands must be an array");if(o.layout!=="single-pane"&&o.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(!Yn.includes(a))throw new Error(`Extension manifest requested unknown Host capability: ${String(a)}`);return e}function ee(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function T(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string`);return e}function ke(e,t){const r=T(e,t);let s;try{s=new URL(r)}catch{throw new Error(`${t} must be a valid HTTPS URL`)}if(s.protocol!=="https:")throw new Error(`${t} must be a valid HTTPS URL`);return r}const Ve=Zn({extensionId:"https://undefineds.co/extensions/ai-connection",name:"AI Connection",version:"0.1.0",sdkVersion:"1",contributes:{applets:[{appId:"https://undefineds.co/applets/ai-connection",name:"AI Connection",entry:".",commands:[],layout:"two-pane"}]},dataModels:[],hostCapabilities:["navigation.openExternal","aiClientConfiguration"]}),Qe=Ve.contributes.applets[0],er={manifest:Qe,createController:Qt,activate(e){e.ensureServiceAccess()},slots:{listHeader:Gn,list:tn,mainHeader:Xn,main:Jn}},tr={manifest:Ve,applets:{[Qe.appId]:er}};function nr(){return tr}const rr=3e4;function sr({podUrl:e,authenticatedFetch:t,now:r=()=>new Date}){const s=oe(e);let a,o;const c=async(y,b)=>{const E=await t(y,b);return a=await ar(E.clone()),E},d=async()=>{if(cr(a,r()))return a;if(o)return o;o=f();try{return await o}finally{o=void 0}},f=async()=>{if(!(await c(`${s}/api/applets/service-access/ai-connection`,{method:"GET",credentials:"include",headers:{accept:"application/json"}})).ok)throw new Error("AI Connection request failed. Please try again.");const b=a;if(!b?.token)throw new Error("AI Connection request failed. Please try again.");return b},g=async(y,b)=>{const E=await d(),v=dr(E);if(!v)throw new Error("AI Connection request failed. Please try again.");const l=new Headers(b?.headers);return l.set("Authorization",`Bearer ${v}`),t(y,{...b,credentials:"omit",headers:l})};return(async(y,b)=>{if(or(y,s))return c(y,b);const E=await g(y,b);if(E.status!==401)return Pe(E);await E.arrayBuffer(),a=void 0;const v=await g(y,b);return Pe(v)})}function ir({podUrl:e,authenticatedFetch:t,now:r}){const s=oe(e),a=sr({podUrl:e,authenticatedFetch:t,now:r});return{inspect:async o=>{const c=await a(H(s,o),{method:"GET",credentials:"omit",headers:{accept:"application/json"}});return c.status===403||c.status===404||c.status===503?(await c.arrayBuffer(),Fe()):z(c)},plan:async o=>z(await a(`${H(s,o.client)}/plan`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({endpoint:o.endpoint})})),apply:async o=>z(await a(`${H(s,o.client)}/apply`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({planId:o.planId,apiKey:o.apiKey,confirmation:o.confirmation})})),verify:async o=>z(await a(`${H(s,o.client)}/verify`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({planId:o.planId})})),restore:async o=>{const c=await a(`${H(s,o)}/restore`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({})});return c.status===403||c.status===404||c.status===503?(await c.arrayBuffer(),Fe()):z(c)}}}function or(e,t){try{return new URL(String(e),t).pathname==="/api/applets/service-access/ai-connection"}catch{return!1}}async function ar(e){if(!(!e.ok||!e.headers.get("content-type")?.includes("application/json")))try{const t=await e.json();return ur(t.invocation)}catch{return}}function cr(e,t){if(!e?.token)return!1;if(!e.expiresAt)return!0;const r=Date.parse(e.expiresAt);return Number.isFinite(r)&&r-t.getTime()>rr}function dr(e){return e?.token}function ur(e){if(!Je(e))return;const t=["gateway","Key"].join("");return{token:typeof e.token=="string"?e.token:typeof e[t]=="string"?e[t]:void 0,baseUrl:typeof e.baseUrl=="string"?e.baseUrl:void 0,expiresAt:typeof e.expiresAt=="string"?e.expiresAt:void 0}}async function Pe(e){return e.ok?e:e.headers.get("content-type")?.includes("application/json")?pr(e):(await e.arrayBuffer(),new Response(JSON.stringify({error:"internal_error"}),{status:e.status,statusText:e.statusText,headers:{"content-type":"application/json"}}))}function H(e,t){return`${e}/api/ai/client-configuration/${encodeURIComponent(t)}`}async function z(e){if(!e.ok)throw await lr(e);if(!e.headers.get("content-type")?.includes("application/json"))throw await e.arrayBuffer(),new Error("AI client configuration request failed. Please try again.");return await e.json()}async function lr(e){let t;try{t=e.headers.get("content-type")?.includes("application/json")?await e.json():void 0}catch{t=void 0}if(Je(t)){const r=typeof t.code=="string"?t.code:typeof t.error=="string"?t.error:void 0,s=typeof t.message=="string"?t.message:"AI client configuration request failed. Please try again.",a=new Error(s);return a.code=r,a.status=e.status,a.details=t.details,a}return await e.arrayBuffer().catch(()=>{}),new Error("AI client configuration request failed. Please try again.")}function Fe(){return{status:"unavailable",message:"Host does not support local client configuration. Use the manual setup instructions for your client."}}async function pr(e){let t;try{t=await e.clone().json()}catch{return e}return fr(t)?new Response(JSON.stringify({code:t.error.code,error:t.error.message}),{status:e.status,statusText:e.statusText,headers:{"content-type":"application/json"}}):e}function fr(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const t=e.error;return!!(t&&typeof t=="object"&&!Array.isArray(t)&&typeof t.code=="string"&&typeof t.message=="string"&&typeof t.status=="number")}function Je(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}const We="css-account",mr="xpod.cssAccountToken",hr="CSS-Account-Token";function Ge(){return typeof window<"u"&&typeof document<"u"}function yr(){if(!Ge())return;const e=document.cookie.split(";");for(const t of e){const[r,...s]=t.trim().split("=");if(r===We){const a=s.join("=");try{return a?decodeURIComponent(a):void 0}catch{return}}}}function xr(e){Ge()&&(document.cookie=`${We}=${encodeURIComponent(e)}; Path=/; SameSite=Lax`)}function wr(){if(!(typeof window>"u"))try{return window.sessionStorage.getItem(mr)||void 0}catch{return}}function gr(){const e=yr();if(e)return e;const t=wr();if(t)return xr(t),t}function Ar(e,t={Accept:"application/json"}){const r={...t};return e&&!Cr(r,"Authorization")&&(r.Authorization=`${hr} ${e}`),r}function te(e={Accept:"application/json"}){return Ar(gr(),e)}function Cr(e,t){const r=t.toLowerCase();return Object.keys(e).some(s=>s.toLowerCase()===r)}function br(e,t){return`sk-${btoa(`${e}:${t}`)}`}function jr(e,t,r=fetch){if(!e||!t)return;const s=new Set;return{available:!0,accountUrl:"/.account/",async list(){const a=await r(e,{method:"GET",headers:te({Accept:"application/json"}),credentials:"include"});if(!a.ok)throw new Error("Failed to list Client Credentials");const o=await a.json(),c=Er(o.clientCredentials).filter(d=>d.webId===t);for(const d of c)s.add(d.resourceUrl);return c},async create(a){if(a.webId!==t)throw new Error("Cannot create a Client Credential for another WebID");const o=await r(e,{method:"POST",headers:te({Accept:"application/json","Content-Type":"application/json"}),credentials:"include",body:JSON.stringify({name:a.name,webId:a.webId})});if(!o.ok)throw new Error("Failed to create Client Credential");const c=await o.json(),d=vr(c,a.webId,e);return s.add(d.resourceUrl),d},async revoke(a){if(!s.has(a))throw new Error("Cannot revoke a Client Credential outside the current WebID");if(!(await r(a,{method:"DELETE",headers:te({Accept:"application/json"}),credentials:"include"})).ok)throw new Error("Failed to revoke Client Credential")}}}function Er(e){return!e||typeof e!="object"||Array.isArray(e)?[]:Object.entries(e).map(([t,r])=>({id:Sr(t),resourceUrl:t,webId:typeof r=="string"?r:void 0}))}function vr(e,t,r){if(!e.id||!e.secret)throw new Error("Client Credential response did not include the one-time secret");const s=e.resourceUrl??new URL(`${encodeURIComponent(e.id)}/`,r).href;return{id:e.id,resourceUrl:s,webId:e.webId??t,clientId:e.id,clientSecret:e.secret,apiKey:br(e.id,e.secret)}}function Sr(e){try{const t=new URL(e).pathname.split("/").filter(Boolean);return t[t.length-1]??e}catch{return e.split("/").filter(Boolean).pop()??e}}const Xe=nr(),$e=Xe.manifest.contributes.applets[0]?.appId,Ye=$e?Xe.applets[$e]:void 0;if(!Ye)throw new Error("AI Connection extension did not contribute an applet");const Nr=Ye;function Ir(e,t){const r=e.currentPod?{status:"ready",current:e.currentPod}:e.state.status==="authenticated"?{status:"opening"}:e.state.status==="error"?{status:"error",error:e.state.error}:{status:"unavailable"};return{solid:{session:{getSnapshot:e.session.getSnapshot,subscribe:e.session.subscribe,fetch:e.fetch},pod:r,permissions:{inspectAgentAccess:async s=>({status:"granted",resources:s.resources}),ensureAgentAccess:async s=>({status:"granted",resources:s.resources}),revokeAgentAccess:async s=>({status:"missing",resources:s.resources})},requireLogin:async()=>e.login(window.location.origin)},navigation:{openExternal:async s=>{window.open(s,"_blank","noopener,noreferrer")}},capabilities:{aiClientConfiguration:e.currentPod&&e.aiClientConfiguration?.available===!0&&e.aiClientConfiguration.authority==="local-filesystem"?ir({podUrl:e.currentPod.podUrl,authenticatedFetch:e.fetch}):kr,aiClientCredentials:jr(t?.account?.clientCredentials,e.webId,e.fetch)}}}const kr={inspect:async()=>({status:"unavailable",message:"Host does not support local client configuration. Use the manual setup instructions for your client."}),plan:async()=>{throw new Error("Host does not support local client configuration. Use the manual setup instructions for your client.")},apply:async()=>{throw new Error("Host does not support local client configuration. Use the manual setup instructions for your client.")},verify:async()=>({status:"unavailable",message:"Host does not support local client configuration. Use the manual setup instructions for your client."}),restore:async()=>({status:"unavailable",message:"Host does not support local client configuration. Use the manual setup instructions for your client."})};function Pr(e,t){const r=p.useMemo(()=>Ir(e,t),[e,t]);return p.useMemo(()=>{const s=wt(Nr,r);if(s.layout!=="two-pane")throw new Error("AI Connection applet must use a two-pane layout");return s},[r])}const Fr=p.createContext(null);function $r(){const e=p.useContext(Fr);if(!e)throw new Error("useAuth must be used within AuthProvider");return e}function Lr(){const e=mt(),{controls:t}=$r(),r=Pr(e,t);return p.useEffect(()=>{r.controller.ensureServiceAccess()},[r.controller]),n.jsx(ht,{listHeader:r.slots.listHeader,list:r.slots.list,mainHeader:r.slots.mainHeader,main:r.slots.main,mode:"auto"})}export{Lr as default};