@undefineds.co/xpod 0.4.25 → 0.4.28
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.d.ts +1 -0
- package/dist/api/ApiServer.js +38 -0
- package/dist/api/ai-config/AiConfigStore.js +18 -6
- package/dist/api/ai-gateway/connect/index.d.ts +1 -0
- package/dist/api/ai-gateway/connect/index.js +39 -18
- package/dist/api/ai-gateway/models/ProviderModelsAdapter.js +5 -2
- package/dist/api/container/common.js +8 -2
- package/dist/api/container/index.js +2 -2
- package/dist/api/container/local.js +6 -3
- package/dist/api/handlers/AiGatewayHandler.d.ts +1 -0
- package/dist/api/handlers/AiGatewayHandler.js +53 -3
- package/dist/api/handlers/AiGatewayManagementHandler.js +9 -0
- package/dist/api/handlers/TaskHandler.js +15 -10
- package/dist/api/network/NetworkEnvironmentConfigurationStore.js +1 -1
- package/dist/api/runs/ManagedRunWorker.d.ts +0 -1
- package/dist/api/runs/ManagedRunWorker.js +2 -14
- package/dist/api/runs/PiAgentRuntimeDriver.d.ts +0 -8
- package/dist/api/runs/PiAgentRuntimeDriver.js +65 -21
- package/dist/api/runs/RunStateCenter.js +1 -0
- package/dist/api/runs/store.d.ts +1 -0
- package/dist/api/runs/store.js +13 -0
- package/dist/api/tasks/TaskMaterializer.js +13 -6
- package/dist/api/tasks/TaskResumeDiagnostics.d.ts +28 -0
- package/dist/api/tasks/TaskResumeDiagnostics.js +148 -0
- package/dist/api/tasks/TaskService.js +40 -23
- package/dist/storage/conditions/StorageETagHandler.d.ts +1 -1
- package/dist/storage/conditions/StorageETagHandler.js +13 -4
- package/dist/util/task-model-diagnostics.d.ts +67 -0
- package/dist/util/task-model-diagnostics.js +118 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.d.ts +1 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.d.ts +1 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +1 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +10 -10
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.d.ts +3 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +77 -23
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +1 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.js +59 -59
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +2 -0
- package/node_modules/@undefineds.co/ai-connections/dist/collections.js +14 -6
- package/node_modules/@undefineds.co/ai-connections/dist/contract/ai-connections-client.d.ts +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/contract/ai-connections-client.js +1 -0
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/gateway-model-roles.d.ts +11 -0
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/gateway-model-roles.js +11 -0
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/normalize.d.ts +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/normalize.js +12 -5
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/request.js +10 -2
- package/node_modules/@undefineds.co/ai-connections/dist/contract/client/types.d.ts +10 -0
- package/node_modules/@undefineds.co/ai-connections/package.json +1 -1
- package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +1 -0
- package/node_modules/@undefineds.co/extension-sdk/package.json +1 -1
- package/node_modules/@undefineds.co/pod-collections/dist/index.cjs +60 -13
- package/node_modules/@undefineds.co/pod-collections/dist/mapping.d.ts +16 -1
- package/node_modules/@undefineds.co/pod-collections/dist/mapping.js +51 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mutations.js +14 -18
- package/node_modules/@undefineds.co/pod-collections/package.json +1 -1
- package/node_modules/@undefineds.co/shared-ui/dist/list.d.ts +8 -1
- package/node_modules/@undefineds.co/shared-ui/dist/list.js +4 -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/section-header.js +1 -1
- package/node_modules/@undefineds.co/shared-ui/dist/theme.css +5 -32
- package/node_modules/@undefineds.co/shared-ui/package.json +1 -1
- package/node_modules/@undefineds.co/solid-sdk/package.json +1 -1
- package/package.json +2 -2
- package/static/app/assets/main.css +1 -1
- package/static/app/assets/main.js +1 -1
- package/static/dashboard/assets/AccountAuthBoundary-Dv52SZc6.js +1 -0
- package/static/dashboard/assets/DesktopOidcCallback-DaT_Rumf.js +1 -0
- package/static/dashboard/assets/DevicePages-HjclpIVm.js +2 -0
- package/static/dashboard/assets/ModelsPage-Be2TPd-x.js +11 -0
- package/static/dashboard/assets/{PaneListHeader-Dn5O0mwy.js → PaneListHeader-DtvnRmFq.js} +1 -1
- package/static/dashboard/assets/{PodDeletionAuthorizationPanel-D3NOG6ZM.js → PodDeletionAuthorizationPanel-BJk_8rJq.js} +3 -3
- package/static/dashboard/assets/PodPage-C4gzEspV.js +1 -0
- package/static/dashboard/assets/{SystemSettingsPage-BNQP_Yuc.js → SystemSettingsPage-HaNrP1H1.js} +1 -1
- package/static/dashboard/assets/TasksPage-BdO5K2L7.js +1 -0
- package/static/dashboard/assets/{WebDesktopEntry-vnb4CZWp.js → WebDesktopEntry-Cj9_ZfJU.js} +1 -1
- package/static/dashboard/assets/XpodAiConnectionsPodStore-B7gmXBmC.js +3 -0
- package/static/dashboard/assets/XpodShellApp-D_KY4nCW.js +4 -0
- package/static/dashboard/assets/{account-session-DCUmCop1.js → account-session-DlcKNG7k.js} +1 -1
- package/static/dashboard/assets/{button-By5Bgvmb.js → button-wslF55uZ.js} +1 -1
- package/static/dashboard/assets/collection-runtime-uxxgEu13.js +1 -0
- package/static/dashboard/assets/{createLucideIcon-bunMzPms.js → createLucideIcon-BJQl82Qk.js} +1 -1
- package/static/dashboard/assets/dashboard-CbJ-JkrI.css +1 -0
- package/static/dashboard/assets/{dashboard-mlsg3yaw.js → dashboard-Or0gnkou.js} +2 -2
- package/static/dashboard/assets/index-BqFeOML9.js +1 -0
- package/static/dashboard/assets/{index-DvMG5pHk.js → index-DgKn1twH.js} +2 -2
- package/static/dashboard/assets/{label-Bj03L9xs.js → label-CS6Sx6Zb.js} +1 -1
- package/static/dashboard/assets/list-UyhlCFKk.js +1 -0
- package/static/dashboard/assets/{nav-item-style-BNqWQY6p.js → nav-item-style-CW1Nnorq.js} +1 -1
- package/static/dashboard/assets/{pod-collections-host-KnnGFZHL.js → pod-collections-host-DjK2xf-b.js} +6 -6
- package/static/dashboard/assets/{safe-continuation-D9AhcWiB.js → safe-continuation-ClWAhcma.js} +1 -1
- package/static/dashboard/assets/{section-header-CLCzbOp_.js → section-header-CEIEcco-.js} +1 -1
- package/static/dashboard/assets/{setting-row-DTCec8A2.js → setting-row-CaYv3dfF.js} +1 -1
- package/static/dashboard/assets/xpod-remembered-login-BUF9fin1.js +310 -0
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AccountAuthBoundary-C0og_gIA.js → AccountAuthBoundary-Chqd38oU.js} +1 -1
- package/static/settings/assets/{DesktopOidcCallback-C5q4oFZ0.js → DesktopOidcCallback-VUrOSM_q.js} +1 -1
- package/static/settings/assets/DevicePages-C6qwvWwu.js +2 -0
- package/static/settings/assets/ModelsPage-Ry_dObRQ.js +11 -0
- package/static/settings/assets/{PaneListHeader-DqVlMe2D.js → PaneListHeader-B5RkRqr4.js} +1 -1
- package/static/settings/assets/{PodDeletionAuthorizationPanel-DgVvarVY.js → PodDeletionAuthorizationPanel-DPM-5Izt.js} +3 -3
- package/static/settings/assets/PodPage-CxND6wwc.js +1 -0
- package/static/settings/assets/{SystemSettingsPage-Crzm_DrI.js → SystemSettingsPage-C8EdMkW7.js} +1 -1
- package/static/settings/assets/TasksPage-DuqptEm8.js +1 -0
- package/static/settings/assets/{WebDesktopEntry-BGC5eRF2.js → WebDesktopEntry-BRcyktkv.js} +1 -1
- package/static/settings/assets/XpodAiConnectionsPodStore-CyA_BJVC.js +3 -0
- package/static/settings/assets/XpodShellApp-CsivHJl0.js +4 -0
- package/static/settings/assets/XpodThemeProvider-CbJ-JkrI.css +1 -0
- package/static/settings/assets/{XpodThemeProvider-CB6LepTA.js → XpodThemeProvider-DK3pIdRG.js} +2 -2
- package/static/settings/assets/{account-session-BcLjCj0x.js → account-session-DJOZ03xr.js} +1 -1
- package/static/settings/assets/auth-callback-GIBYEz_7.js +1 -0
- package/static/settings/assets/{button-BObT8pTE.js → button-D3yW-2o1.js} +1 -1
- package/static/settings/assets/collection-runtime-DfGo25mh.js +1 -0
- package/static/settings/assets/{createLucideIcon-BVsUxXpZ.js → createLucideIcon-CacwLsmB.js} +1 -1
- package/static/settings/assets/{index-ktjMkj7-.js → index-r5KRYsKC.js} +1 -1
- package/static/settings/assets/{label-BrqO8_m_.js → label-MJjUmvzG.js} +1 -1
- package/static/settings/assets/list-Ce-5k1MX.js +1 -0
- package/static/settings/assets/{nav-item-style-Di2CxkDU.js → nav-item-style-ZUbL8KOZ.js} +1 -1
- package/static/settings/assets/{pod-collections-host-KnnGFZHL.js → pod-collections-host-DjK2xf-b.js} +6 -6
- package/static/settings/assets/{safe-continuation-Dx6ceJpY.js → safe-continuation-vlBZFSlU.js} +1 -1
- package/static/settings/assets/{section-header-Dtl7yjVr.js → section-header-DGJdEvQw.js} +1 -1
- package/static/settings/assets/{setting-row-BL6Hhe8N.js → setting-row-C7tuFiho.js} +1 -1
- package/static/settings/assets/{settings-DaRBxoZk.js → settings-CyQPih1O.js} +1 -1
- package/static/settings/assets/xpod-remembered-login-D-TzzT5K.js +567 -0
- package/static/settings/auth-callback.html +3 -3
- package/static/settings/settings.html +3 -3
- package/static/dashboard/assets/AccountAuthBoundary-BvoDydRz.js +0 -1
- package/static/dashboard/assets/DesktopOidcCallback-BwIj874x.js +0 -1
- package/static/dashboard/assets/DevicePages-jOjMcvsr.js +0 -2
- package/static/dashboard/assets/ModelsPage-CMTdfqBR.js +0 -11
- package/static/dashboard/assets/PodPage-BueBdJ9_.js +0 -1
- package/static/dashboard/assets/TasksPage-CxtLJiSF.js +0 -1
- package/static/dashboard/assets/XpodAiConnectionsPodStore-wx3Ttupm.js +0 -18
- package/static/dashboard/assets/XpodShellApp-5FWY8-d5.js +0 -4
- package/static/dashboard/assets/collection-runtime-BnomuB0E.js +0 -1
- package/static/dashboard/assets/dashboard-C64R553B.css +0 -1
- package/static/dashboard/assets/xpod-remembered-login-Dr69A0Rv.js +0 -295
- package/static/settings/assets/DevicePages-fyHjjucT.js +0 -2
- package/static/settings/assets/ModelsPage-EyOByLyE.js +0 -11
- package/static/settings/assets/PodPage-DY4Oi9wg.js +0 -1
- package/static/settings/assets/TasksPage-CfXJbnlt.js +0 -1
- package/static/settings/assets/XpodAiConnectionsPodStore-CXcmgKmQ.js +0 -3
- package/static/settings/assets/XpodShellApp-D1PS3Iut.js +0 -4
- package/static/settings/assets/XpodThemeProvider-C64R553B.css +0 -1
- package/static/settings/assets/auth-callback-DSPQ28ar.js +0 -1
- package/static/settings/assets/collection-runtime-DzNbdZGe.js +0 -1
- package/static/settings/assets/index-browser-3WfrNbcG.js +0 -273
- package/static/settings/assets/xpod-remembered-login-Q66DH12t.js +0 -295
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as c,j as t}from"./XpodThemeProvider-CB6LepTA.js";import{v as U,w as Q,F as J,t as ie,x as re,y as se,A as oe}from"./xpod-remembered-login-Q66DH12t.js";import{f as le,g as de}from"./XpodAiConnectionsPodStore-CXcmgKmQ.js";import{g as I,u as X,l as ce}from"./XpodShellApp-D1PS3Iut.js";import{D as ue,j as ge,k as fe,l as me,m as be,n as he,o as pe}from"./PodDeletionAuthorizationPanel-DgVvarVY.js";import{B as C}from"./button-BObT8pTE.js";import{S as G,B as xe}from"./section-header-Dtl7yjVr.js";import{S as ve}from"./setting-row-BL6Hhe8N.js";import"./createLucideIcon-BVsUxXpZ.js";import"./account-session-BcLjCj0x.js";import"./index-browser-3WfrNbcG.js";import"./safe-continuation-Dx6ceJpY.js";import"./nav-item-style-Di2CxkDU.js";function O(e){return e.map(n=>{const s=U(n)??U(n.toLowerCase().replaceAll("-","_"));return s?Q(s)??n:n})}function W(e,n){const s={chatModel:"chat",ocrModel:"vision",readerModel:"document_understanding",embeddingModel:"embedding",indexerModel:"indexing",rerankerModel:"reranking"}[n];return e.filter(i=>O(i.capabilities).includes(s))}function we(e,n){const s=W(e,"embeddingModel");return n?.restricted?s.filter(i=>n.allowed.some(o=>o.provider===i.owner&&o.model===i.id)):s}const N="flex min-h-14 flex-wrap items-center justify-between gap-3 border-b border-border py-3",ye={queued:"排队中",running:"进行中",succeeded:"已完成",failed:"失败"};function Ee(e){const[n,s]=c.useState(!1),[i,o]=c.useState("platform"),[d,g]=c.useState(""),[v,u]=c.useState(),[w,h]=c.useState(!1),[b,E]=c.useState("all"),p=async(r,a="已保存")=>{h(!0),u(void 0);try{await r(),u(a)}catch{u("操作未完成,请重试。")}finally{h(!1)}},f=e.busy||w,j=r=>r.map(a=>t.jsx(ve,{label:a.label,description:a.description,control:({id:l,"aria-describedby":y})=>t.jsx(ie,{id:l,"aria-describedby":y,checked:a.checked,disabled:f,onChange:A=>{p(()=>e.onToggle(a.id,A.target.checked))}})},a.id));return t.jsx(ue,{open:n,onOpenChange:r=>{f||s(r)},children:t.jsxs("div",{className:"mx-auto max-w-4xl space-y-6 p-6",children:[(v||e.error)&&t.jsx("p",{role:"status",className:"text-sm leading-normal",children:e.error?"Pod 设置暂时无法保存,请重试。":v}),e.section==="models"&&t.jsxs("section",{"aria-label":"默认模型",children:[t.jsx("p",{className:"text-sm leading-normal text-muted-foreground",children:"应用没有指定模型时用这里的默认值,随时可以改。"}),Array.from(new Set(e.models.map(r=>r.group))).map(r=>t.jsxs("section",{className:"mt-5",children:[t.jsx("h2",{className:"text-xs leading-normal text-muted-foreground",children:r}),e.models.filter(a=>a.group===r).map(a=>t.jsxs("div",{className:N,children:[t.jsx("label",{htmlFor:`pod-model-${a.id}`,className:"min-w-28 text-sm leading-normal",children:a.label}),a.id==="embeddingModel"?t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"flex-1 text-sm leading-normal",children:e.embeddingLabel}),t.jsx(C,{variant:"outline",size:"sm",onClick:()=>e.onSection("search"),children:"去更换 ›"})]}):a.models?t.jsxs(t.Fragment,{children:[t.jsxs(I,{id:`pod-model-${a.id}`,className:"min-w-[10ch] flex-1",value:a.value??"",disabled:f,onChange:l=>{p(()=>e.onModel(a.id,l.target.value))},children:[t.jsx("option",{value:"",children:a.defaultLabel}),a.value&&!a.models.some(l=>l.ref===a.value)&&t.jsx("option",{value:a.value,children:"当前模型(暂不可用)"}),a.models.map(l=>t.jsx("option",{value:l.ref,children:l.label},l.ref))]}),a.testable?t.jsx(C,{variant:"outline",size:"sm",disabled:f||!a.value,onClick:()=>{p(()=>e.onTest(a.id,a.value),"测试通过")},children:"测试"}):t.jsx(T,{}),a.models.length===0&&e.freeQuotaUrl&&t.jsx("a",{href:e.freeQuotaUrl,className:"text-sm leading-normal text-primary",children:"领免费额度 ›"})]}):t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"flex-1 text-sm leading-normal text-muted-foreground",children:a.defaultLabel}),t.jsx(T,{})]})]},a.id))]},r))]}),e.section==="search"&&t.jsxs(t.Fragment,{children:[t.jsxs("section",{"aria-label":"检索",children:[j(e.search),t.jsxs("div",{className:N,children:[t.jsxs("span",{className:"text-sm leading-normal",children:["语义检索用的 Embedding",t.jsx("br",{}),t.jsx("span",{className:"text-xs leading-normal text-muted-foreground",children:e.embeddingLabel})]}),t.jsx(ge,{asChild:!0,children:t.jsx(C,{variant:"outline",size:"sm",disabled:f||!e.canChangeEmbedding,onClick:()=>{g(""),o("platform")},children:"更换"})})]})]}),t.jsxs("section",{"aria-label":"索引",children:[t.jsx(G,{level:2,title:"索引",titleClassName:"font-semibold",description:t.jsxs(t.Fragment,{children:["待处理 ",e.pending??0," · 配置版本 ",e.version??"默认"]}),actions:t.jsxs(t.Fragment,{children:[t.jsxs(I,{"aria-label":"重建哪部分",className:"min-w-[10ch] w-auto",value:b,onChange:r=>E(r.target.value),children:[t.jsx("option",{value:"all",children:"重建全部"}),t.jsx("option",{value:"fts",children:"只重建全文"}),t.jsx("option",{value:"vector",children:"只重建向量"})]}),t.jsx(C,{variant:"outline",size:"sm",disabled:f||!e.rebuildTargets.includes(b),onClick:()=>{p(()=>e.onRebuild(b),"重建已排队")},children:"重建"})]})}),e.jobs.length?e.jobs.map(r=>t.jsxs("div",{className:N,children:[t.jsx("span",{className:"text-sm leading-normal",children:r.label}),t.jsxs("span",{className:"text-sm leading-normal",children:[ye[r.status],r.progress===void 0?"":` · ${r.progress}%`]})]},r.id)):t.jsx("p",{className:"py-4 text-sm leading-normal text-muted-foreground",children:"还没有重建记录"}),j(e.maintenance),t.jsx("p",{className:"mt-3 text-xs leading-normal text-muted-foreground",children:"重建只重算索引,不改动 Pod 里的原始资料。"})]}),e.error?.includes("service_access_missing")&&t.jsx(C,{variant:"outline",size:"sm",disabled:f||e.backgroundAccess.busy,onClick:()=>{p(e.onGrant,"已允许 Xpod 访问")},children:"允许 Xpod 访问"})]}),e.section==="apps"&&t.jsxs("section",{"aria-label":"授权应用",children:[t.jsx("p",{className:"text-sm leading-normal text-muted-foreground",children:"哪些应用和服务能读写这个 Pod。"}),t.jsxs("div",{className:N,children:[t.jsxs("details",{className:"flex-1",children:[t.jsxs("summary",{className:"cursor-pointer text-sm leading-normal font-medium",children:["Xpod 后台访问 · ",e.backgroundAccess.loading?"读取中":e.backgroundAccess.granted?"已授权":"未授权"]}),t.jsx("p",{className:"py-3 text-xs leading-normal text-muted-foreground",children:"用于索引维护和后台任务。流量与访问记录:待接入。"})]}),e.backgroundAccess.granted?t.jsxs("details",{children:[t.jsx("summary",{"aria-label":"Xpod 后台访问的更多操作",className:"cursor-pointer p-2",children:"⋯"}),t.jsx("span",{className:"block py-2 text-xs leading-normal text-muted-foreground",children:"修改权限 · 待接入"}),t.jsx(C,{variant:"outline",size:"sm",disabled:f||e.backgroundAccess.busy,onClick:()=>{p(e.onRevoke,"已撤销授权")},children:"撤销"})]}):t.jsx(C,{variant:"outline",size:"sm",disabled:f||e.backgroundAccess.busy||e.backgroundAccess.loading,onClick:()=>{p(e.onGrant,"已允许 Xpod 访问")},children:"允许"})]}),e.backgroundAccess.error&&t.jsx("p",{role:"alert",className:"text-sm leading-normal",children:"授权操作暂时不可用,请重试。"}),t.jsx("p",{className:"mt-4 text-xs leading-normal text-muted-foreground",children:"其他授权应用 · 待接入"})]}),e.section==="data"&&t.jsxs(t.Fragment,{children:[t.jsxs("section",{"aria-label":"用量",children:[t.jsx(G,{level:2,title:"用量",titleClassName:"font-semibold"}),t.jsx("div",{className:"mt-3 grid grid-cols-2 gap-3",children:e.usage.map(r=>t.jsxs("div",{className:"rounded-xl border border-border p-4",children:[t.jsx("span",{className:"block text-xs leading-normal text-muted-foreground",children:r.label}),t.jsx("span",{className:"mt-2 block text-sm leading-normal",children:r.value})]},r.label))})]}),t.jsx("section",{"aria-label":"数据管理",children:["导入","导出","迁移"].map(r=>t.jsxs("div",{className:N,children:[t.jsx("span",{className:"text-sm leading-normal",children:r}),t.jsx(T,{}),r==="迁移"&&e.accountUrl&&t.jsx("a",{className:"text-sm leading-normal text-primary",href:e.accountUrl,children:"管理账号 ↗"})]},r))})]}),t.jsxs(fe,{closeLabel:"关闭",closeDisabled:f,className:"max-h-[90dvh] w-[calc(100%-2rem)] overflow-y-auto",onEscapeKeyDown:r=>{f&&r.preventDefault()},onInteractOutside:r=>{f&&r.preventDefault()},children:[t.jsx(me,{children:t.jsx(be,{children:"更换语义检索模型"})}),t.jsx(J,{label:"来源",children:r=>t.jsxs(I,{...r,value:i,disabled:f,onChange:a=>{o(a.target.value),g("")},children:[t.jsx("option",{value:"platform",children:"Xpod 提供"}),t.jsx("option",{value:"own",children:"用我自己的 Key"})]})}),t.jsx(J,{label:"模型",children:r=>t.jsxs(I,{...r,value:d,disabled:f,onChange:a=>g(a.target.value),children:[t.jsx("option",{value:"",children:"请选择"}),e.embeddingModels.filter(a=>a.source===i).map(a=>t.jsx("option",{value:a.ref,children:a.label},a.ref))]})}),!e.embeddingModels.some(r=>r.source===i)&&t.jsx("p",{className:"text-xs leading-normal text-muted-foreground",children:i==="platform"?"Xpod 提供的模型目录 · 待接入":"暂无可用向量模型,请先在 AI 连接中添加。"}),t.jsx(he,{children:"更换后会重建全部语义索引,重建期间只能全文检索。"}),t.jsxs(pe,{className:"gap-2",children:[t.jsx(C,{variant:"outline",disabled:f,onClick:()=>s(!1),children:"取消"}),t.jsx(C,{disabled:f||!e.canChangeEmbedding||!e.embeddingModels.some(r=>r.ref===d&&r.source===i),onClick:()=>{p(async()=>{await e.onEmbedding(d),s(!1)},"更换已保存,重建已排队")},children:"更换并重建索引"})]})]})]})})}function T(){return t.jsx(xe,{variant:"pending",className:"font-normal",children:"待接入"})}async function V(e){return Y(e(P("/api/ai/config"),{method:"GET",credentials:"include",headers:{accept:"application/json"}}))}async function je(e,n){return Y(e(P("/api/ai/config"),{method:"PATCH",credentials:"include",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify(n)}))}async function Ce(e,n){const s=await e(P("/api/ai/config/rebuild"),{method:"POST",credentials:"include",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({target:n})}),i=await s.json().catch(()=>{});if(!s.ok||!i?.job)throw new Error(i?.error??"Index rebuild request failed");return i.job}async function Fe(e,n){const s=n.capabilities.some(o=>o.toLowerCase()==="embedding"),i=await e(P(s?"/v1/embeddings":"/v1/chat/completions"),{method:"POST",credentials:"include",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify(s?{model:n.id,input:"xpod readiness probe"}:{model:n.id,messages:[{role:"user",content:"Reply OK."}],max_tokens:1,stream:!1})});if(!i.ok){const o=await i.json().catch(()=>{}),d=typeof o?.error=="string"?o.error:o?.error?.message;throw new Error(d??"Model readiness probe failed")}await i.arrayBuffer()}function P(e){if(typeof window>"u")throw new Error("AI Config API requires the current browser origin");return new URL(e,window.location.origin).toString()}async function Y(e){const n=await e,s=await n.json().catch(()=>{});if(!n.ok||!s?.config||!s.capabilities)throw new Error(s?.error??"AI Config request failed");return s}const Z=c.createContext(void 0),Ae=2e3;function ke({children:e}){const n=X(),[s,i]=c.useState(),[o,d]=c.useState(),[g,v]=c.useState([]),[u,w]=c.useState(),[h,b]=c.useState(!0),[E,p]=c.useState(!1),[f,j]=c.useState(!1),[r,a]=c.useState(),[l,y]=c.useState(0),A=!!(n.webId&&n.currentPod);c.useEffect(()=>{if(!n.webId||!n.currentPod)return;let x=!1;return queueMicrotask(()=>{if(x||!n.webId||!n.currentPod)return;b(!0),a(void 0);const m=le({webId:n.webId,podUrl:n.currentPod.podUrl,authenticatedFetch:n.fetch}),ae=de({database:n.currentPod.database,authenticatedFetch:n.fetch,podUrl:n.currentPod.podUrl,webId:n.currentPod.webId}).listModels?.()?.catch(()=>[])??Promise.resolve([]);Promise.all([V(n.fetch),m.listModels().catch(()=>[]),ae]).then(([k,ne,te])=>{x||(i(k.config),d(k.capabilities),w(k.lifecycle),v(Be(De(te,ne))))}).catch(k=>{x||a(k instanceof Error?k.message:String(k))}).finally(()=>{x||b(!1)})}),()=>{x=!0}},[l,n.currentPod,n.fetch,n.webId]);const B=c.useCallback(()=>{y(x=>x+1)},[]),S=u?.pending??0;c.useEffect(()=>{if(S<=0||!n.webId||!n.currentPod)return;let x=!1;const m=setInterval(()=>{V(n.fetch).then(D=>{x||w(D.lifecycle)}).catch(()=>{})},Ae);return()=>{x=!0,clearInterval(m)}},[S,n.currentPod,n.fetch,n.webId]);const F=c.useCallback(async x=>{p(!0),a(void 0);try{const m=await je(n.fetch,x);i(m.config),d(m.capabilities),w(m.lifecycle)}catch(m){throw a(m instanceof Error?m.message:String(m)),m}finally{p(!1)}},[n.fetch]),M=c.useCallback(async x=>{j(!0),a(void 0);try{const m=await Ce(n.fetch,x);w(D=>({configurationVersion:D?.configurationVersion,pending:(D?.pending??0)+1,recent:[m,...D?.recent??[]].slice(0,20)}))}catch(m){throw a(m instanceof Error?m.message:String(m)),m}finally{j(!1)}},[n.fetch]),z=c.useCallback(async(x,m)=>{await F(x),await M(m)},[M,F]),K=A?h:!1,ee=c.useMemo(()=>({config:s,capabilities:o,lifecycle:u,models:g,loading:K,saving:E,rebuilding:f,error:r,reload:B,save:F,rebuild:M,saveAndRebuild:z}),[o,s,K,r,u,g,M,f,B,F,z,E]);return t.jsx(Z.Provider,{value:ee,children:e})}function De(e,n){const s=new Map,i=o=>`${o.provider}\0${L(o.id)}`;for(const o of[...e,...n]){const d=i(o),g=s.get(d);if(!g){s.set(d,{...o,id:L(o.id)});continue}const v=[...new Set([...g.capabilities??[],...o.capabilities??[]])];s.set(d,{...g,...o,id:L(o.id),resourceId:g.resourceId??o.resourceId,displayName:g.displayName??o.displayName,availability:g.availability==="available"?g.availability:o.availability,modelType:g.modelType??o.modelType,...v.length>0?{capabilities:v}:{},...g.inputModalities??o.inputModalities?{inputModalities:g.inputModalities??o.inputModalities}:{}})}return[...s.values()]}function L(e){const n=e.lastIndexOf("#");return n>=0?e.slice(n+1):e}function Be(e){return e.map(n=>{const s=[...n.capabilities??[]],i=n.modelType?re(n.modelType):void 0,o=i?oe[i]:void 0;return o&&!s.some(d=>U(d)===o)&&s.push(Q(o)),{id:n.id,displayName:n.displayName,owner:n.provider,ref:se(n.provider,n.id),capabilities:s}})}function Se(){const e=c.useContext(Z);if(!e)throw new Error("useAiConfig must be used within AiConfigProvider");return e}function H(e,n=!1){if(n)return!0;const s=Me(e)?.phase;return s==="queued"||s==="running"}function Ne(e){const n=e?.rebuildTargets??[];if(n.includes("vector"))return"vector";if(n.includes("all"))return"all"}function Me(e){if(!e)return;const n=e.recent[0];if(!n)return e.pending>0?{phase:"queued",pending:e.pending}:void 0;if(!(n.status==="queued"&&e.pending<=0))return{phase:n.status,pending:e.pending,target:n.target,...n.progress!==void 0?{progress:n.progress}:{},...n.error?{error:n.error}:{}}}function _(e,n){const s=n??(typeof window>"u"?void 0:window.location.origin);if(!s)throw new Error("task credential request needs a current browser origin");return new URL(e,s).toString()}async function $(e){const n=await e.text().catch(()=>"");if(n)try{const s=JSON.parse(n);return s&&typeof s=="object"&&!Array.isArray(s)?s:void 0}catch{return}}function q(e,n){const s=e?.error;return typeof s=="string"&&s?s:n}async function Ie(e){const n=await e.fetch(_("/api/ai/task-credentials",e.origin),{method:"GET",credentials:"include",headers:{accept:"application/json"}}),s=await $(n);if(!n.ok)throw new Error(q(s,"Task credential request failed"));const i=s?.data;return Array.isArray(i)?i:[]}async function Pe(e){const n=await e.fetch(_("/api/ai/task-credentials",e.origin),{method:"POST",credentials:"include",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({apiKey:e.apiKey,...e.name?{name:e.name}:{}})}),s=await $(n);if(!n.ok)throw new Error(q(s,"Task credential grant failed"));const i=s?.credential;if(!i||typeof i!="object")throw new Error("Task credential grant returned no grant");return i}async function Te(e){const n=await e.fetch(_(`/api/ai/task-credentials/${encodeURIComponent(e.credentialRef)}`,e.origin),{method:"DELETE",credentials:"include",headers:{accept:"application/json"}});if(!n.ok)throw new Error(q(await $(n),"Task credential revocation failed"))}function Le(e,n){return e.filter(s=>s.status==="active"&&(!n||s.issuer===n)).sort((s,i)=>i.version-s.version)[0]}function Re(e,n){return e?`${e}\0${n??""}`:void 0}function R(e){return e instanceof Error?e.message:String(e)}const Ue=()=>({loaded:!1,working:!1});function Oe(){const e=X(),{fetch:n,issuer:s,requestPodApiKey:i,webId:o}=e,d=Re(o,s),[g,v]=c.useState(()=>({scope:d,generation:0}));g.scope!==d&&v({scope:d,generation:g.generation+1});const{generation:u}=g,w=c.useRef(u);c.useLayoutEffect(()=>{w.current=u},[u]);const h=g.scope===d?g.entry:void 0,b=c.useCallback((r,a)=>{v(l=>l.generation===r?{...l,entry:a(l.entry??Ue())}:l)},[]),E=c.useCallback(r=>Ie({fetch:n}).then(a=>{b(r,l=>({...l,credential:Le(a,s),loaded:!0,error:void 0}))}).catch(a=>{b(r,l=>({...l,loaded:!0,error:R(a)}))}),[s,n,b]);c.useEffect(()=>{d!==void 0&&E(u)},[u,E,d]);const p=c.useCallback(async()=>{d!==void 0&&await E(u)},[u,E,d]),f=c.useCallback(async()=>{if(d===void 0)return;const r=u;b(r,a=>({...a,working:!0,error:void 0}));try{const a=await i?.();if(!a)throw new Error("当前会话无法准备凭据");if(w.current!==r)throw new Error("会话已改变,本次授权已取消");const l=await Pe({fetch:n,apiKey:a,name:"Xpod 后台任务"});b(r,y=>({...y,credential:l,loaded:!0,working:!1,error:void 0}))}catch(a){throw b(r,l=>({...l,loaded:!0,working:!1,error:R(a)})),a}},[u,i,n,d,b]),j=c.useCallback(async()=>{if(d===void 0||!h?.credential)return;const r=u,a=h.credential.credentialRef;b(r,l=>({...l,working:!0,error:void 0}));try{await Te({fetch:n,credentialRef:a}),b(r,l=>({...l,credential:void 0,loaded:!0,working:!1,error:void 0}))}catch(l){throw b(r,y=>({...y,loaded:!0,working:!1,error:R(l)})),l}},[h,u,n,d,b]);return{...h?.credential?{credential:h.credential}:{},loading:d!==void 0&&h?.loaded!==!0,working:h?.working===!0,...h?.error?{error:h.error}:{},grant:f,revoke:j,reload:p}}function ea(e){return t.jsx(ke,{children:t.jsx(Xe,{...e})})}function Xe({section:e,onSection:n,accountUrl:s}){const i=Se(),o=X(),d=Oe(),[g,v]=c.useState();if(c.useEffect(()=>{let a=!1;if(!(e!=="data"||!o.webId||!o.currentPod))return ce({webId:o.webId,podUrl:o.currentPod.podUrl,authenticatedFetch:o.fetch}).then(l=>{a||v({webId:o.webId,podUrl:o.currentPod.podUrl,value:l.storage})}).catch(()=>{a||v({webId:o.webId,podUrl:o.currentPod.podUrl,value:{status:"error"}})}),()=>{a=!0}},[e,o.webId,o.currentPod,o.fetch]),(e==="models"||e==="search")&&!i.config)return t.jsxs("div",{className:"p-6 text-sm",children:[i.loading?"正在读取 Pod 设置…":"暂时无法读取 Pod 设置。",!i.loading&&(i.error?.includes("service_access_missing")?t.jsx("button",{className:"ml-3 text-primary",disabled:d.working||d.loading,onClick:()=>{d.grant().then(i.reload).catch(()=>{})},children:"允许 Xpod 访问"}):t.jsx("button",{className:"ml-3 text-primary",onClick:i.reload,children:"重试"}))]});const u=i.config,w=a=>({ref:a.ref,label:`${a.displayName??a.id} · ${a.owner}`,capabilities:a.capabilities,source:"own"}),h=(a,l,y,A)=>{const B=W(i.models,a),S=B.find(F=>F.ref===u?.models[a]);return{id:a,label:l,group:y,defaultLabel:A,value:u?.models[a],models:B.map(w),testable:!!(S&&O(S.capabilities).some(F=>["chat","embedding"].includes(F)))}},b=[h("chatModel","智能","对话","Xpod 提供"),{id:"fast",label:"快速",group:"对话",defaultLabel:"Xpod 提供"},h("ocrModel","视觉辅助","对话","不使用"),h("readerModel","文档理解","文档理解","PaddleOCR · 百度(Xpod 提供)"),{id:"embeddingModel",label:"语义检索",group:"向量",defaultLabel:""},...["语音合成","语音识别"].map(a=>({id:a,label:a,group:"语音",defaultLabel:"不使用"})),...["图像生成","视频生成"].map(a=>({id:a,label:a,group:"图像与视频",defaultLabel:"不使用"})),{id:"decision",label:"决策",group:"决策",defaultLabel:"不使用"}],E=i.models.find(a=>a.ref===u?.models.embeddingModel),p=Ne(i.capabilities),f=async(a,l)=>{a==="ftsEnabled"||a==="vectorEnabled"||a==="progressiveIndexingEnabled"?await i.save({searchIndexing:{[a]:l}}):(a==="automaticIndexing"||a==="refreshAfterSourceUpdate"||a==="removeAfterSourceDeletion")&&await i.save({lifecycle:{[a]:l}})},j=g?.webId===o.webId&&g?.podUrl===o.currentPod?.podUrl?g?.value:void 0,r=j?.status==="available"?j.usage:void 0;return t.jsx(Ee,{section:e,onSection:n,accountUrl:s,busy:i.saving||i.rebuilding,error:i.error,models:b,embeddingLabel:E?w(E).label:u?.models.embeddingModel?"当前模型暂不可用":"Xpod 提供",embeddingValue:u?.models.embeddingModel,embeddingModels:we(i.models,i.capabilities?.embeddingModels).map(w),canChangeEmbedding:!!p&&!H(i.lifecycle,i.rebuilding),search:[{id:"ftsEnabled",label:"全文检索",checked:u?.searchIndexing.ftsEnabled??!1},{id:"vectorEnabled",label:"语义检索",checked:u?.searchIndexing.vectorEnabled??!1,description:"资料片段会发给向量模型的服务商。"},{id:"progressiveIndexingEnabled",label:"渐进式索引",checked:u?.searchIndexing.progressiveIndexingEnabled??!1}],maintenance:[{id:"automaticIndexing",label:"自动索引新资料",checked:u?.lifecycle.automaticIndexing??!1},{id:"refreshAfterSourceUpdate",label:"资料更新后刷新索引",checked:u?.lifecycle.refreshAfterSourceUpdate??!1},{id:"removeAfterSourceDeletion",label:"资料删除后清理索引",checked:u?.lifecycle.removeAfterSourceDeletion??!1}],pending:i.lifecycle?.pending,version:i.lifecycle?.configurationVersion,jobs:(i.lifecycle?.recent??[]).map(a=>({id:a.id,label:{all:"全部索引",fts:"全文索引",vector:"语义索引"}[a.target],status:a.status,progress:a.progress})),rebuildTargets:i.capabilities?.rebuildTargets??[],onRebuild:i.rebuild,backgroundAccess:{granted:!!d.credential,loading:d.loading,busy:d.working,error:d.error},onGrant:d.grant,onRevoke:d.revoke,usage:[{label:"存储",value:r?`${(r.storageBytes/1024/1024).toFixed(1)} MiB`:"—"},{label:"流量",value:r?`${((r.ingressBytes+r.egressBytes)/1024/1024).toFixed(1)} MiB`:"—"},{label:"AI 用量",value:r?`${r.tokensUsed.toLocaleString()} tokens`:"—"},{label:"计算时长",value:r?`${r.computeSeconds.toLocaleString()} 秒`:"—"}],onModel:async(a,l)=>{(a==="chatModel"||a==="ocrModel"||a==="readerModel")&&await i.save({models:{[a]:l||null}})},onTest:async(a,l)=>{const y=i.models.find(A=>A.ref===l);if(!y)throw new Error("Model unavailable");await Fe(o.fetch,{...y,capabilities:O(y.capabilities)})},onToggle:f,onEmbedding:async a=>{if(!p||H(i.lifecycle,i.rebuilding))throw new Error("Rebuild unavailable");a===u?.models.embeddingModel?await i.rebuild(p):await i.saveAndRebuild({models:{embeddingModel:a}},p)}})}export{ea as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as i,j as e,u as ve,b as Ee}from"./XpodThemeProvider-CB6LepTA.js";import{I as Z,S as Fe,g as be,u as ke,h as Ce,i as Ae,A as Be,j as we,k as De}from"./XpodShellApp-D1PS3Iut.js";import{i as ye,I as P}from"./PodDeletionAuthorizationPanel-DgVvarVY.js";import{T as Ne,u as te,W as Se}from"./nav-item-style-Di2CxkDU.js";import{c as ee,B as E,i as L}from"./button-BObT8pTE.js";import{t as Te}from"./xpod-remembered-login-Q66DH12t.js";import"./account-session-BcLjCj0x.js";import"./safe-continuation-Dx6ceJpY.js";import"./createLucideIcon-BVsUxXpZ.js";const ae=i.forwardRef(({className:s,...u},c)=>e.jsx("textarea",{ref:c,className:ee(ye,"min-h-20 resize-y",s),...u}));ae.displayName="Textarea";const ze={sm:"min-h-9 px-2.5 text-xs [@media(pointer:coarse)]:min-h-11",md:"min-h-9 px-3 text-sm [@media(pointer:coarse)]:min-h-11"},Le="bg-card font-semibold text-primary shadow-sm",Ie="text-foreground hover:text-primary";function se({value:s,onValueChange:u,options:c,ariaLabel:d,name:o,size:p="md",className:n,onKeyDown:x,...m}){const h=i.useId(),b=o??h,A=i.useRef([]),k=c.findIndex(r=>r.value===s),F=c.map((r,j)=>r.disabled?-1:j).filter(r=>r>=0),f=k>=0&&!c[k]?.disabled?k:F[0],_=r=>{const j=c[r];!j||j.disabled||(A.current[r]?.focus(),j.value!==s&&u(j.value))},N=(r,j)=>{if(F.length===0)return;const C=F.indexOf(r),y=C<0?j>0?0:F.length-1:(C+j+F.length)%F.length;_(F[y])},W=r=>{if(x?.(r),r.defaultPrevented)return;const j=A.current.findIndex(y=>y===document.activeElement),C=j>=0?j:f;switch(r.key){case"ArrowRight":case"ArrowDown":r.preventDefault(),N(C,1);break;case"ArrowLeft":case"ArrowUp":r.preventDefault(),N(C,-1);break;case"Home":r.preventDefault(),N(-1,1);break;case"End":r.preventDefault(),N(-1,-1);break}};return e.jsx("div",{role:"radiogroup","aria-label":d,className:ee("inline-flex items-center gap-0.5 rounded-lg bg-muted p-0.5",n),onKeyDown:W,...m,children:c.map((r,j)=>{const C=r.value===s,y=r["aria-label"];return e.jsxs("label",{className:ee("relative inline-flex min-w-0 grow cursor-pointer select-none items-center justify-center gap-1.5 rounded-md transition-colors",ze[p],C?Le:Ie,r.disabled&&"cursor-not-allowed opacity-50"),children:[e.jsx("input",{ref:$=>{A.current[j]=$},type:"radio",className:"absolute inset-0 m-0 h-full w-full cursor-pointer appearance-none opacity-0 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:cursor-not-allowed",name:b,value:r.value,checked:C,disabled:r.disabled,tabIndex:j===f?0:-1,"aria-label":y,onChange:()=>_(j)}),r.icon?e.jsx("span",{"aria-hidden":"true",className:"inline-flex shrink-0 items-center",children:r.icon}):null,r.label?e.jsx("span",{className:"min-w-0 break-words text-center",children:r.label}):null]},r.value)})})}const q=s=>["completed","failed","cancelled"].includes(s.status),B=(s,u)=>s.assignedTo===u;function $e(s,u,c,d){const o=s.filter(n=>c==="all"||(c==="mine"?B(n,u):!!n.assignedTo&&!B(n,u))),p=o.filter(n=>!q(n));return{waiting:p.filter(n=>n.waiting),mine:p.filter(n=>!n.waiting&&B(n,u)).sort((n,x)=>(n.dueAt??1/0)-(x.dueAt??1/0)||n.createdAt-x.createdAt),ai:p.filter(n=>!n.waiting&&!!n.assignedTo&&!B(n,u)),unassigned:p.filter(n=>!n.waiting&&!n.assignedTo),recent:o.filter(n=>q(n)&&n.completedAt!==void 0&&n.completedAt>=d-7*86400),ended:o.filter(q)}}function Me(s,u,c){const d=new Date(c.getFullYear(),c.getMonth(),c.getDate()),o=new Date(d);o.setDate(o.getDate()+1);const p=new Date(d);p.setDate(p.getDate()+2);const n=new Date(d);n.setDate(n.getDate()+(7-(d.getDay()+6)%7));const x={overdue:[],today:[],tomorrow:[],week:[],later:[]};for(const m of s.filter(h=>!q(h))){const h=B(m,u)?m.dueAt:m.schedule?.kind==="cron"||m.schedule?.kind==="once"?m.schedule.nextRunAt:void 0;if(h===void 0)continue;const b=h*1e3,A=b<+d?"overdue":b<+o?"today":b<+p?"tomorrow":b<+n?"week":"later";x[A].push(m)}for(const m of Object.values(x))m.sort((h,b)=>(h.dueAt??h.schedule?.nextRunAt??0)-(b.dueAt??b.schedule?.nextRunAt??0));return x}const ce={createAi:!1,resumeStep:!1,handoff:!1,approve:!1},U={open:"待办",active:"按计划运行",blocked:"已暂停",completed:"已完成",failed:"失败",cancelled:"已取消",running:"进行中",queued:"等待执行",waiting_input:"在等你",waiting_runner:"等待执行环境"},I={cron:"定时",interval:"周期",event:"事件",once:"定时"},V=s=>s===void 0?"未设置":new Date(s*1e3).toLocaleString("zh-CN",{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit"}),Re=s=>{const u=/^(\d+) (\d+) \* \* \*$/.exec(s??"");return u?`每天 ${u[2].padStart(2,"0")}:${u[1].padStart(2,"0")}`:"自定义计划"},oe=s=>s&&/^https?:\/\//.test(s)?s:void 0;function Pe({client:s,webId:u,workspace:c,onOpenConnections:d,selectedTaskId:o,selectedRunId:p,renderApproval:n,headerActions:x}){const[m,h]=i.useState([]),[b,A]=i.useState(ce),[k,F]=i.useState(),[f,_]=i.useState("all"),[N,W]=i.useState("list"),[r,j]=i.useState(""),[C,y]=i.useState(""),[$,he]=i.useState(!1),[M,me]=i.useState(!1),[ne,R]=i.useState(!1),[ue,H]=i.useState([]),[v,T]=i.useState(),[O,K]=i.useState(),[pe,X]=i.useState([]),[Y,S]=i.useState(""),[w,ie]=i.useState(!1),[xe,le]=i.useState(!0),G=async()=>{const t=await s.list();h(t.tasks),A(t.capabilities)};i.useEffect(()=>{let t=!0;return le(!0),h([]),A(ce),F(void 0),K(void 0),S(""),s.list().then(a=>{t&&(h(a.tasks),A(a.capabilities))}).catch(a=>{t&&S(String(a.message??a))}).finally(()=>{t&&le(!1)}),()=>{t=!1}},[s,u]),i.useEffect(()=>{let t=!0;return H([]),T(void 0),X([]),k&&s.runs(k).then(a=>{t&&(H(a.runs),O&&T(a.runs.find(Q=>Q.id===O.id)??O))}).catch(a=>{t&&S(String(a.message??a))}),()=>{t=!1}},[s,k,O]),i.useEffect(()=>{let t=!0;return X([]),v&&s.steps(v.id).then(a=>{t&&X(a.steps)}).catch(a=>{t&&S(String(a.message??a))}),()=>{t=!1}},[s,v?.id]),i.useEffect(()=>{if(!o)return;const t=m.find(a=>a.id===o||a.iri===o);t&&(F(t.id),R(!1))},[o,m]),i.useEffect(()=>{let t=!0;return p&&s.selection(p).then(a=>{t&&(F(a.taskId),K(a.run),R(!1))}).catch(a=>{t&&S(String(a.message??a))}),()=>{t=!1}},[s,p]);const D=async t=>{if(!w){ie(!0),S("");try{await t(),await G()}catch(a){S(a instanceof Error?a.message:String(a))}finally{ie(!1)}}},l=m.find(t=>t.id===k),re=m.filter(t=>`${t.title??""} ${t.instruction}`.toLowerCase().includes(r.toLowerCase())),g=$e(re,u,f,Date.now()/1e3),fe=Me(re.filter(t=>f==="all"||(f==="mine"?B(t,u):!!t.assignedTo&&!B(t,u))),u,new Date),J=t=>{F(t.id),K(void 0),R(!1)},z=t=>t.map(a=>e.jsxs("div",{className:`task-row ${k===a.id?"selected":""}`,children:[B(a,u)?e.jsx(Te,{"aria-label":`完成 ${a.title??a.instruction}`,checked:a.status==="completed",disabled:w,onChange:Q=>{D(()=>s.update(a.id,{completed:Q.target.checked}))}}):e.jsx("span",{"aria-label":I[a.schedule?.kind??""]??"任务",children:a.schedule?.kind==="event"?"ϟ":a.schedule?.kind==="interval"?"↻":"▦"}),e.jsxs(qe,{onClick:()=>J(a),"aria-current":k===a.id?"true":void 0,children:[e.jsx("strong",{children:a.title??a.instruction}),e.jsx("small",{children:a.waiting?"在等你":a.dueAt?V(a.dueAt):U[a.status]??a.status})]})]},a.id)),je=t=>{t.preventDefault(),C.trim()&&D(async()=>{const a=await s.create({prompt:C.trim(),kind:"todo",workspace:c});y(""),J(a.task)})},ge=e.jsxs("form",{onSubmit:je,className:"task-quick-add",children:[e.jsx("span",{"aria-hidden":!0,children:"+"}),e.jsx(P,{"aria-label":"添加待办",placeholder:"添加待办,回车",value:C,onChange:t=>y(t.target.value),disabled:w})]});return e.jsx(Ne,{className:"tasks-panel",pageType:"collection",hasObjectCollection:!0,listHeader:e.jsxs("div",{className:"tasks-list-header",children:[e.jsx(Fe,{"aria-label":"搜索任务",value:r,onChange:t=>j(t.target.value)}),e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button","aria-label":"新建任务",onClick:()=>{R(!0),F(void 0)},children:"+"})]}),list:e.jsxs("div",{className:"tasks-list",children:[e.jsx(_e,{selection:k??(ne?"create":void 0)}),e.jsxs("div",{className:"tasks-toolbar",children:[e.jsx(se,{className:"flex-1",size:"sm",ariaLabel:"交给谁",value:f,onValueChange:_,options:[{value:"all",label:"全部"},{value:"mine",label:"我的"},{value:"ai",label:"AI 的"}]}),e.jsx(se,{size:"sm",ariaLabel:"视图",value:N,onValueChange:W,options:[{value:"list",icon:e.jsx(Ve,{}),"aria-label":"清单"},{value:"agenda",icon:e.jsx(We,{}),"aria-label":"日程"}]})]}),e.jsx("div",{className:"tasks-scroll",children:xe?e.jsx("p",{role:"status",children:"正在读取任务…"}):e.jsxs(e.Fragment,{children:[g.waiting.length>0&&e.jsxs("section",{children:[e.jsxs("h3",{children:["在等你 ",e.jsx("small",{children:g.waiting.length})]}),z(g.waiting)]}),N==="list"?e.jsxs(e.Fragment,{children:[f!=="ai"&&e.jsxs("section",{children:[e.jsxs("h3",{children:["我的待办 ",e.jsx("small",{children:g.mine.length})]}),ge,z($?g.mine:g.mine.slice(0,5)),g.mine.length>5&&e.jsx(E,{size:"sm",variant:"ghost",className:"task-more h-auto min-h-9 whitespace-normal py-1",type:"button",onClick:()=>he(!$),children:$?"收起":`还有 ${g.mine.length-5} 条`})]}),f!=="mine"&&e.jsxs("details",{children:[e.jsxs("summary",{className:L,children:["AI 按计划在做 ",e.jsx("small",{children:g.ai.length})]}),z(g.ai)]}),g.unassigned.length>0&&e.jsxs("details",{children:[e.jsxs("summary",{className:L,children:["未分配 ",e.jsx("small",{children:g.unassigned.length})]}),z(g.unassigned)]}),e.jsxs("details",{children:[e.jsxs("summary",{className:L,children:["已结束 · ",M?"全部":"最近 7 天"," ",e.jsx("small",{children:(M?g.ended:g.recent).length})]}),z(M?g.ended:g.recent),e.jsx(E,{size:"sm",variant:"ghost",className:"task-more h-auto min-h-9 whitespace-normal py-1",type:"button",onClick:()=>me(!M),children:M?"只看最近 7 天":"查看全部已完成"})]})]}):Object.entries(fe).map(([t,a])=>e.jsxs("section",{children:[e.jsx("h3",{children:{overdue:"已逾期",today:"今天",tomorrow:"明天",week:"本周",later:"以后"}[t]}),a.length?z(a):e.jsx("p",{className:"task-muted",children:"没有安排"})]},t))]})}),e.jsx("footer",{children:e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",disabled:w,onClick:()=>{D(G)},children:"刷新"})})]}),mainHeader:e.jsxs("div",{className:"tasks-main-header",children:[e.jsx(He,{}),e.jsx("span",{children:"任务与待办"}),x]}),main:e.jsxs("div",{className:"tasks-detail",children:[Y&&e.jsx(Z,{className:"task-notice",tone:"destructive",role:"alert",action:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",onClick:()=>{D(G)},children:"重试"}),d&&e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",onClick:d,children:"检查连接与授权"})]}),children:e.jsx("p",{children:/[\u4e00-\u9fff]/.test(Y)?Y:"暂时无法加载任务,请检查连接后重试"})}),ne?e.jsx(Ue,{supported:b.createAi,busy:w,onCancel:()=>R(!1),onSubmit:t=>{D(async()=>{const a=await s.create({...t,workspace:c});J(a.task)})}},"create"):l?e.jsxs(e.Fragment,{children:[e.jsxs("header",{children:[e.jsxs("div",{children:[e.jsx("span",{className:"task-eyebrow",children:B(l,u)?"我的待办":I[l.schedule?.kind??""]??"任务"}),e.jsx("h2",{children:l.title??l.instruction})]}),e.jsx("span",{className:"task-badge",children:U[l.status]??l.status})]}),e.jsxs("section",{children:[e.jsx("h3",{children:"要做什么"}),e.jsx("p",{className:"task-instruction",children:l.instruction})]}),B(l,u)?e.jsx(Oe,{task:l,busy:w,onSave:t=>{D(()=>s.update(l.id,t))}},`${l.id}:${l.updatedAt}`):e.jsxs(e.Fragment,{children:[e.jsxs("section",{children:[e.jsx("h3",{children:"什么时候"}),e.jsxs("p",{children:[I[l.schedule?.kind??""]??"未设置"," · ",(l.schedule?.cron?Re(l.schedule.cron):void 0)??(l.schedule?.intervalSeconds?`每 ${l.schedule.intervalSeconds} 秒`:l.schedule?.eventName??"待接入")]}),e.jsxs("p",{children:["下次运行:",V(l.schedule?.nextRunAt)]})]}),e.jsxs("section",{children:[e.jsx("h3",{children:"能动哪些资料"}),e.jsx("p",{className:"task-muted",children:"资料授权明细待接入"})]}),e.jsxs("div",{className:"task-actions",children:[e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",disabled:w||!["active","blocked"].includes(l.status)||!l.schedule,onClick:()=>{D(async()=>{const t=await s.run(l.id);T(t.run),H((await s.runs(l.id)).runs)})},children:"立即运行一次"}),e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",disabled:w||q(l)||!l.schedule||l.schedule.kind==="once",onClick:()=>{D(()=>s.pause(l.id,!l.schedule?.paused))},children:l.schedule?.paused?"恢复后续运行":"暂停后续运行"})]})]}),e.jsxs("section",{children:[e.jsx("h3",{children:"怎么来的"}),oe(l.source)?e.jsx("a",{className:L,href:oe(l.source),target:"_blank",rel:"noreferrer",children:"查看来源对话"}):e.jsx("p",{className:"task-muted",children:"未记录来源"})]}),e.jsxs("section",{children:[e.jsx("h3",{children:"最近运行"}),ue.length?ue.map(t=>e.jsxs("button",{type:"button",className:`task-run-row ${L}`,onClick:()=>T(t),children:[e.jsx("span",{children:V(t.createdAt)}),e.jsx("span",{children:U[t.status]??t.status})]},t.id)):e.jsx("p",{className:"task-muted",children:"暂无运行记录"})]}),v&&e.jsxs("section",{className:"task-run-detail","aria-label":"运行详情",children:[e.jsxs("header",{children:[e.jsxs("h3",{children:["这次运行 · ",U[v.status]??v.status]}),e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",onClick:()=>T(void 0),children:"关闭"})]}),v.status==="waiting_input"&&(n?n(v):e.jsx("p",{children:"这次运行在等你确认。继续同一次运行的确认入口待接入。"})),v.error&&e.jsx(Z,{className:"task-notice",tone:"destructive",role:"alert",children:/[\u4e00-\u9fff]/.test(v.error)?v.error:"本次执行未完成,请检查连接与授权后重试"}),e.jsx("ol",{children:pe.map(t=>e.jsxs("li",{children:[e.jsx("span",{children:V(t.createdAt)})," ",t.message??t.type]},t.id))}),v.status==="failed"&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"task-muted",children:"以上是已记录的执行步骤;未记录的副作用无法确认。"}),d&&e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",onClick:d,children:"检查并修复连接"}),e.jsx("p",{className:"task-muted",children:"从失败这一步继续 · 待接入"})]}),["queued","running","waiting_input","waiting_runner"].includes(v.status)&&e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",disabled:w||!!v.cancelRequestedAt,onClick:()=>{D(async()=>{const t=await s.stop(v.id);T(t.run),H((await s.runs(l.id)).runs)})},children:v.cancelRequestedAt?"已请求停止":"停止这次运行"})]})]}):e.jsxs("div",{className:"tasks-empty",children:[e.jsx("span",{className:"task-eyebrow",children:"任务与待办"}),e.jsx("h2",{children:"把想做的事,安排好"}),e.jsx("p",{children:"记下自己的待办,或让 AI 按计划完成任务。"}),e.jsx("p",{className:"task-muted",children:"从左边选择一项,查看详情和运行记录。"})]})]})})}function qe({onClick:s,children:u,...c}){const{openMain:d}=te();return e.jsx("button",{className:L,type:"button",...c,onClick:()=>{s(),d()},children:u})}function _e({selection:s}){const{openMain:u}=te();return i.useEffect(()=>{s&&u()},[s,u]),null}function He(){const{mode:s,openList:u}=te();return!i.useContext(Se)&&s==="stack"?e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",onClick:u,"aria-label":"返回任务清单",children:"‹"}):null}function Oe({task:s,busy:u,onSave:c}){const[d,o]=i.useState(s.notes??""),[p,n]=i.useState(s.priority??"normal"),[x,m]=i.useState(s.dueAt?new Date(s.dueAt*1e3-new Date(s.dueAt*1e3).getTimezoneOffset()*6e4).toISOString().slice(0,16):"");return e.jsxs("form",{className:"task-form",onSubmit:h=>{h.preventDefault(),c({notes:d,priority:p,dueAt:x?new Date(x).getTime()/1e3:null})},children:[e.jsxs("label",{children:["截止日期",e.jsx(P,{type:"datetime-local",value:x,onChange:h=>m(h.target.value)})]}),e.jsxs("label",{children:["重要程度",e.jsxs(be,{value:p,onChange:h=>n(h.target.value),children:[e.jsx("option",{value:"normal",children:"普通"}),e.jsx("option",{value:"high",children:"重要"}),e.jsx("option",{value:"urgent",children:"紧急"})]})]}),e.jsxs("label",{children:["备注",e.jsx(ae,{value:d,onChange:h=>o(h.target.value)})]}),e.jsxs("div",{className:"task-actions",children:[e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"submit",disabled:u,children:"保存待办"}),e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",disabled:u,onClick:()=>c({completed:s.status!=="completed"}),children:s.status==="completed"?"重新打开":"标记完成"})]}),e.jsx("p",{className:"task-muted",children:"交给 AI 去做 · 待接入"})]})}function Ue({supported:s,busy:u,onSubmit:c,onCancel:d}){const[o,p]=i.useState(""),[n,x]=i.useState("cron"),[m,h]=i.useState("09:00"),[b,A]=i.useState(60),[k,F]=i.useState("");return e.jsxs("form",{className:"task-form",onSubmit:f=>{f.preventDefault(),c({prompt:o,kind:n,...n==="cron"?{cron:`${Number(m.split(":")[1])} ${Number(m.split(":")[0])} * * *`}:n==="interval"?{intervalSeconds:b*60}:{eventName:k}})},children:[e.jsxs("header",{children:[e.jsx("h2",{children:"新建任务"}),e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"button",onClick:d,children:"取消"})]}),e.jsxs("label",{children:["要做什么",e.jsx(ae,{required:!0,value:o,placeholder:"例如,每天整理我关注的信息",onChange:f=>p(f.target.value)})]}),e.jsxs("fieldset",{children:[e.jsx("legend",{children:"什么时候"}),e.jsx(se,{className:"grow",size:"sm",ariaLabel:"什么时候",value:n,onValueChange:x,options:[{value:"cron",label:I.cron},{value:"interval",label:I.interval},{value:"event",label:I.event}]})]}),n==="cron"?e.jsxs("label",{children:["每天几点",e.jsx(P,{type:"time",required:!0,value:m,onChange:f=>h(f.target.value)}),e.jsx("small",{children:"按执行环境的时区安排。"})]}):n==="interval"?e.jsxs("label",{children:["每隔多少分钟",e.jsx(P,{type:"number",min:"1",required:!0,value:b,onChange:f=>A(Number(f.target.value))})]}):e.jsxs("label",{children:["事件名称",e.jsx(P,{required:!0,value:k,onChange:f=>F(f.target.value)})]}),!s&&e.jsx(Z,{tone:"info",role:"status",children:"代理执行身份待接入。你可以先在清单中添加自己的待办。"}),e.jsx(E,{size:"sm",variant:"outline",className:"h-auto min-h-9 whitespace-normal py-1",type:"submit",disabled:u||!s||!o.trim(),children:"创建任务"})]})}const de={width:15,height:15,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};function Ve(){return e.jsx("svg",{...de,children:e.jsx("path",{d:"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"})})}function We(){return e.jsx("svg",{...de,children:e.jsx("path",{d:"M4 5h16v15H4zM4 10h16M8 3v4M16 3v4"})})}function Ke(s,u,c){if(!u.thread)return;const d=s.filter(o=>o.approvalId&&o.run===u.id&&o.thread===u.thread);return d.find(o=>o.approvalId===c)??d[0]}function as(){const s=ke(),u=ve(),[c]=Ee(),d=Ce(),o=i.useMemo(()=>{const n=Ae({fetch:s.fetch,baseUrl:window.location.origin});return{...n,stop:async x=>{const m=await n.stop(x);return window.dispatchEvent(new Event("xpod:pod-changed")),m}}},[s.fetch]),p=c.get("approval");return e.jsx(Pe,{client:o,webId:s.webId,workspace:s.currentPod.podUrl,selectedTaskId:c.get("task")??void 0,selectedRunId:c.get("run")??void 0,onOpenConnections:()=>u("/ai-connections"),headerActions:e.jsx(De,{}),renderApproval:n=>{const x=Ke(d.snapshot.attention,n,p),m=d.snapshot.attention.some(h=>h.id===n.id&&h.resumeApproval);return e.jsxs(e.Fragment,{children:[x?e.jsx(Be,{item:x}):!m&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"这次运行在等你确认,暂未收到对应的申请。"}),e.jsx(we,{run:n.id})]})}},`${s.webId}:${s.currentPod?.podUrl}`)}export{as as default};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{z as bt,B as I,D as gt,a as h,G as P,c as Ce}from"./xpod-remembered-login-Q66DH12t.js";import{r as wt,a as It,b as At}from"./index-browser-3WfrNbcG.js";const V=["openai","anthropic","kimi","bailian","deepseek","zhipu","ollama","custom"],He={openai:"OpenAI",anthropic:"Anthropic",kimi:"Kimi",bailian:"百炼",deepseek:"DeepSeek",zhipu:"智谱 AI",ollama:"Ollama",custom:"Custom"},Ge=[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"]}],Pt={id:"api-key",authMode:"apiKey",lifecycle:"active"},_t={id:"browser-login",authMode:"apiKey",connectMode:"browserAssistedApiKey",lifecycle:"active"},v=[Pt,_t],B=[{id:"openai-compatible",label:"OpenAI Compatible",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],consoleUrl:"https://undefineds.co",subscriptionUrl:"https://undefineds.co",endpoints:[{protocol:"chatCompletions",baseUrl:"https://example.invalid/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"unsupported",url:"https://undefineds.co"}},{id:"anthropic-compatible",label:"Anthropic Compatible",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],consoleUrl:"https://undefineds.co",subscriptionUrl:"https://undefineds.co",endpoints:[{protocol:"anthropic",baseUrl:"https://example.invalid/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"unsupported",url:"https://undefineds.co"}}],Ue="https://www.kimi.com/code",Ct="https://www.kimi.com/code/console",Ut="https://www.kimi.com/user/agreement",St="https://api.kimi.com/coding/v1",Et="https://api.kimi.com/coding/",kt="https://platform.moonshot.cn/console/api-keys",Se="https://platform.moonshot.cn/console/account",Mt="https://platform.moonshot.cn/docs/intro",Rt="https://api.moonshot.ai/v1",W="https://bailian.console.aliyun.com/",J="https://help.aliyun.com/zh/model-studio/",Ee="https://open.bigmodel.cn/usercenter/apikeys",ke="https://open.bigmodel.cn/",Ot="https://open.bigmodel.cn/api/paas/v4",xt="https://open.bigmodel.cn/api/coding/paas/v4",Ve={openai:[{id:"official-subscription",label:"OpenAI Subscription",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth","local"],productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:[],consoleUrl:"https://chatgpt.com/codex",subscriptionUrl:"https://chatgpt.com/codex",endpoints:[{protocol:"responses",baseUrl:"https://chatgpt.com/backend-api/codex"}],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"responses"},quota:{strategy:"subscription",url:"https://chatgpt.com/codex"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"},{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],authorizationMethods:v,productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.openai.com/api-keys",subscriptionUrl:"https://platform.openai.com/settings/organization/billing/overview",endpoints:[{protocol:"responses",baseUrl:"https://api.openai.com/v1"},{protocol:"chatCompletions",baseUrl:"https://api.openai.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"responses"},quota:{strategy:"providerApi",url:"https://platform.openai.com/usage"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"}],anthropic:[{id:"official-subscription",label:"Claude Pro / Max",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth"],authorizationMethods:[],productLabel:"Claude Code",runtimeProviderIds:["anthropic"],credentialPrefixHints:[],consoleUrl:"https://claude.ai/",subscriptionUrl:"https://claude.com/pricing",endpoints:[],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"subscription",url:"https://claude.ai/settings/usage"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"},{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],authorizationMethods:v,productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:["sk-ant-"],consoleUrl:"https://console.anthropic.com/settings/keys",subscriptionUrl:"https://console.anthropic.com/settings/plans",endpoints:[{protocol:"anthropic",baseUrl:"https://api.anthropic.com/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"console",url:"https://console.anthropic.com/settings/limits"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"}],kimi:[Me({id:"subscription-key",label:"Token Plan",kind:"token-plan",authModes:["apiKey"],productLabel:"Kimi Coding",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-kimi-"],baseUrl:St,anthropicBaseUrl:Et,quotaStrategy:"subscription",quotaUrl:Ue,consoleUrl:Ct,subscriptionUrl:Ue,usagePolicyUrl:Ut,supportsDeveloperMessages:!1}),Me({id:"api-platform",label:"API Platform",kind:"api-platform",authModes:["apiKey"],productLabel:"Moonshot AI",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-"],baseUrl:Rt,quotaStrategy:"console",quotaUrl:Se,consoleUrl:kt,subscriptionUrl:Se,usagePolicyUrl:Mt})],bailian:[X({id:"pay-as-you-go",label:"Pay as You Go",kind:"api-platform",runtimeProviderIds:["bailian"],credentialPrefixHints:["sk-"],region:"cn",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"console",consoleUrl:W,usagePolicyUrl:J}),X({id:"token-plan",label:"Token Plan Personal",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:W,usagePolicyUrl:J}),X({id:"token-plan-team",label:"Token Plan Team",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:W,usagePolicyUrl:J}),X({id:"coding-plan",label:"Coding Plan Pro",kind:"token-plan",runtimeProviderIds:["bailian-coding-plan"],credentialPrefixHints:["sk-sp-"],region:"cn",baseUrl:"https://coding.dashscope.aliyuncs.com/v1",anthropicBaseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:W,usagePolicyUrl:J})],deepseek:[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"DeepSeek",runtimeProviderIds:["deepseek"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.deepseek.com/api_keys",subscriptionUrl:"https://platform.deepseek.com/usage",endpoints:[{protocol:"chatCompletions",baseUrl:"https://api.deepseek.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://platform.deepseek.com/usage"},usagePolicyUrl:"https://cdn.deepseek.com/policies/en-US/deepseek-open-platform-terms-of-use.html",region:"global"}],ollama:[{id:"local",label:"Local Ollama",kind:"local",lifecycle:"active",authModes:["local"],productLabel:"Ollama",runtimeProviderIds:["ollama"],credentialPrefixHints:[],consoleUrl:"https://ollama.com",subscriptionUrl:"https://ollama.com",endpoints:[{protocol:"chatCompletions",baseUrl:"http://localhost:11434/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"unsupported",url:"https://ollama.com"},usagePolicyUrl:"https://ollama.com",region:"local"}],zhipu:[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],authorizationMethods:v,productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:Ee,subscriptionUrl:"https://open.bigmodel.cn/finance-center/expense-manage",endpoints:[{protocol:"chatCompletions",baseUrl:Ot,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://open.bigmodel.cn/finance-center/expense-manage"},usagePolicyUrl:ke,region:"cn"},{id:"coding-plan",label:"GLM Coding Plan",kind:"token-plan",lifecycle:"active",authModes:["apiKey"],authorizationMethods:v,productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:Ee,subscriptionUrl:"https://bigmodel.cn/glm-coding",endpoints:[{protocol:"chatCompletions",baseUrl:xt,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"subscription",url:"https://bigmodel.cn/glm-coding"},usagePolicyUrl:ke,region:"cn"}]};function Me(e){return{id:e.id,label:e.label,kind:e.kind,lifecycle:"active",authModes:e.authModes,authorizationMethods:v,productLabel:e.productLabel,runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.subscriptionUrl,endpoints:We(e.baseUrl,e.anthropicBaseUrl,"cn",e.supportsDeveloperMessages),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.quotaUrl},usagePolicyUrl:e.usagePolicyUrl,region:"cn"}}function X(e){return{id:e.id,label:e.label,lifecycle:"active",productLabel:"Alibaba Bailian",kind:e.kind,authModes:["apiKey"],authorizationMethods:v,runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.consoleUrl,endpoints:We(e.baseUrl,e.anthropicBaseUrl,e.region),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.consoleUrl},usagePolicyUrl:e.usagePolicyUrl,region:e.region}}function We(e,t,r,n){return[{protocol:"chatCompletions",baseUrl:e,region:r,...n===void 0?{}:{supportsDeveloperMessages:n}},...t?[{protocol:"anthropic",baseUrl:t,region:r}]:[]]}function Je(e,t=!1){return(Ve[e]??Ge).map(r=>e==="openai"&&r.id==="official-subscription"&&t?{...r,lifecycle:"active",authModes:Array.from(new Set([...r.authModes??[],"local"])),authorizationMethods:[{id:"device-code",authMode:"deviceCode",connectMode:"deviceCodeOAuth",lifecycle:"active"},{id:"local-session-import",authMode:"local",lifecycle:"active"}]}:{...r})}const yn=V.flatMap(e=>[e,...Tt(e).map(t=>`${e}-${t.id}`)]);function Tt(e){return e==="custom"?B:Ve[e]??Ge}function Lt(e,t){return e==="anthropic"||t==="anthropic-compatible"?"anthropic":"openai"}function K(e,t){return e==="openai"&&(t==="local"||t==="oauth"||t==="deviceCode")?"official-subscription":e==="kimi"&&(t==="oauth"||t==="deviceCode")?"subscription-key":e==="bailian"?"pay-as-you-go":e==="ollama"?"local":e==="custom"?"openai-compatible":"api-platform"}function Re(e,t){const r=Je(e).find(o=>o.id===(t??K(e,"apiKey")));if(!r)return;const n=r.modelDiscovery?.endpointProtocol;return r.endpoints?.find(o=>o.protocol===n)?.baseUrl??r.endpoints?.[0]?.baseUrl}function Y(e,t){const r=t.trim().toLowerCase();if(e==="bailian"){if(r==="token-plan-personal")return"token-plan";if(r==="coding-plan-pro")return"coding-plan"}return r}function Z(e){return{offeringId:e.offeringId,priority:e.priority??100,enabled:e.enabled??!0,health:e.health??"unknown",...e.baseUrl?{baseUrl:e.baseUrl}:{}}}function mn(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{throw new Error("invalid_proxy_url")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash)throw new Error("invalid_proxy_url");if(!t.hostname)throw new Error("invalid_proxy_url");return t.href.replace(/\/$/u,"")}class te extends Error{constructor(t,r,n={}){const o=Xe(t);super(o?`AI Connection request failed: ${o}`:`AI Connection request failed (HTTP ${r})`),this.name="AiConnectionsRequestError",this.code=o,this.status=r,this.providerStatus=b(t)&&typeof t.providerStatus=="number"?t.providerStatus:void 0,this.payload=t,this.provider=n.provider,this.authMode=n.authMode}}function Xe(e){if(b(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}}async function Oe(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 $t(e){if(!V.includes(e))throw new Error(`Unsupported AI provider: ${e}`)}function ae(e){if(!(!b(e)||typeof e.id!="string"||typeof e.owner!="string"||!Array.isArray(e.scopes)||!e.scopes.every(t=>typeof t=="string")||typeof e.createdAt!="string"))return g({id:e.id,kind:e.kind==="client-credentials"?e.kind:void 0,credentialResource:p(e.credentialResource),fingerprint:p(e.fingerprint),owner:e.owner,scopes:e.scopes,createdAt:e.createdAt,expiresAt:p(e.expiresAt),lastUsedAt:p(e.lastUsedAt),disabledAt:p(e.disabledAt),revokedAt:p(e.revokedAt),name:p(e.name),maskedHint:p(e.maskedHint),plaintextAvailable:typeof e.plaintextAvailable=="boolean"?e.plaintextAvailable:void 0,clientCredentialId:p(e.clientCredentialId),appliedTo:p(e.appliedTo),appliedOn:p(e.appliedOn),appliedAt:p(e.appliedAt),appliedClients:z(e.appliedClients)})}function xe(e){if(!Array.isArray(e))throw new Error("AI Connection returned an invalid custom models response");const t=[];for(const r of e)!b(r)||typeof r.id!="string"||!r.id||t.push(g({id:r.id,displayName:p(r.displayName),inputModalities:z(r.inputModalities),outputModalities:z(r.outputModalities),capabilities:z(r.capabilities)}));return t}function z(e){if(!Array.isArray(e))return;const t=e.filter(r=>typeof r=="string");return t.length>0?t:void 0}function Ye(e){if(!b(e)||typeof e.id!="string"||zt(e.id))return;const t=S(e.provider)??S(e.providerId)??S(e.owned_by)??Nt(e.id);if(!t)return;const r=b(e.capabilities)?e.capabilities.imageInput:void 0;return g({id:e.id,provider:t,offeringId:p(e.offeringId),resourceId:p(e.resourceId),displayName:p(e.displayName)??p(e.display_name)??p(e.name),modelType:typeof e.modelType=="string"&&Object.prototype.hasOwnProperty.call(bt,e.modelType)?e.modelType:void 0,contextWindow:fe(e.contextWindow)??fe(e.context_window),dimension:typeof e.dimension=="number"&&Number.isInteger(e.dimension)&&e.dimension>0?e.dimension:void 0,protocols:Array.isArray(e.protocols)?e.protocols.filter(n=>typeof n=="string"):void 0,custom:e.custom===!0?!0:void 0,inputModalities:Te(e.modalities,"input")??(r===!0?["text","image"]:r===!1?["text"]:void 0),outputModalities:Te(e.modalities,"output"),capabilities:vt(e)})}function Te(e,t){if(!b(e))return;const r=e[t];if(!Array.isArray(r))return;const n=r.filter(o=>typeof o=="string");return n.length>0?n:void 0}function vt(e){if(Array.isArray(e.custom_capabilities)){const r=e.custom_capabilities.filter(n=>typeof n=="string");if(r.length>0)return r}if(!b(e.capabilities))return;const t=[];return e.capabilities.imageInput===!0&&t.push("image"),e.capabilities.toolCalls===!0&&t.push("tool_call"),e.capabilities.reasoningEffort===!0&&t.push("reasoning"),e.capabilities.fast===!0&&t.push("fast"),e.capabilities.embedding===!0&&t.push("embedding"),t.length>0?t:void 0}function zt(e){const t=e.toLowerCase();return t==="linx"||t==="linx-lite"||t==="undefineds/linx"||t==="undefineds/linx-lite"}function S(e){if(typeof e!="string")return;const t=e.toLowerCase().trim();return t==="alibaba"||t==="dashscope"||t==="alibaba-bailian"||t==="bailian-coding-plan"||t==="bailian-token-plan"?"bailian":V.includes(t)?t:void 0}function Nt(e){const t=e.split("/",1)[0];return e.includes("/")?S(t):void 0}function fe(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Dt(e){const t=new Map;for(const r of e){const n=qt(r);if(!n)continue;const o=t.get(n.id);t.set(n.id,o?Xt(o,n):n)}return[...t.values()]}function qt(e){return jt(e)??Bt(e)}function Bt(e){if(!b(e)||typeof e.provider!="string"||!ur(e.status)||!b(e.connect)||!Array.isArray(e.connect.modes)||!e.connect.modes.every(ge)||typeof e.connect.configured!="boolean")return;const t=S(e.provider);if(!t)return;const r=er(e,t);return{id:t,name:ot(t),offerings:[],credentials:r?[r]:[],selectedModels:[],status:Zt(e.status)}}function jt(e){if(!b(e))return;const t=S(e.id)??S(e.provider);if(!t||!or(e.status))return;const r=k(e.offerings,Ft),n=k(e.credentials,j),o=k(e.selectedModels,Ye);return{id:t,name:p(e.name)??ot(t),offerings:r,credentials:n,selectedModels:o,status:e.status}}function Ft(e){if(!b(e)||typeof e.id!="string"||!e.id)return;const t=k(e.authModes,rt);return g({id:e.id,label:p(e.label),kind:p(e.kind),lifecycle:Gt(e.lifecycle),authModes:t,authorizationMethods:k(e.authorizationMethods,Ze),runtimeProviderIds:z(e.runtimeProviderIds),productLabel:p(e.productLabel),credentialPrefixHints:z(e.credentialPrefixHints),consoleUrl:p(e.consoleUrl),subscriptionUrl:p(e.subscriptionUrl),endpoints:k(e.endpoints,Qe),modelDiscovery:Vt(e.modelDiscovery),quota:Wt(e.quota),usagePolicyUrl:p(e.usagePolicyUrl),region:p(e.region)})}function Kt(e){if(!b(e)||typeof e.offeringId!="string"||!e.offeringId)return;const t=S(e.provider);if(!t)return;const r=k(e.authorizationMethods,Ze);return{provider:t,offeringId:e.offeringId,...Array.isArray(e.endpoints)?{endpoints:k(e.endpoints,Qe)}:{},authorizationMethods:r}}function Ze(e){if(!b(e)||typeof e.id!="string"||!e.id)return;const t=rt(e.authMode),r=Ht(e.lifecycle);if(!t||!r)return;const n=ge(e.connectMode)?e.connectMode:void 0;return g({id:e.id,authMode:t,connectMode:n,label:p(e.label),lifecycle:r,reason:p(e.reason)})}function Ht(e){return e==="active"||e==="unavailable"?e:void 0}function Gt(e){return e==="active"||e==="legacy"||e==="unavailable"?e:void 0}function Qe(e){if(!b(e))return;const t=p(e.protocol),r=p(e.baseUrl);if(!(!t||!r))return g({protocol:t,baseUrl:r,region:p(e.region)})}function Vt(e){if(!b(e))return;const t=p(e.strategy),r=p(e.path),n=p(e.endpointProtocol);return t&&r&&n?{strategy:t,path:r,endpointProtocol:n}:void 0}function Wt(e){if(!b(e))return;const t=p(e.strategy),r=p(e.url);return t&&r?{strategy:t,url:r}:void 0}function j(e){if(!(!b(e)||typeof e.id!="string"||!e.id||typeof e.offeringId!="string"||!e.offeringId||!nt(e.authMode)||typeof e.enabled!="boolean"||typeof e.priority!="number"||!Number.isFinite(e.priority)||!nr(e.health)||typeof e.version!="number"||!Number.isFinite(e.version)))return g({id:e.id,provider:S(e.provider),offeringId:e.offeringId,authMode:e.authMode,label:p(e.label),enabled:e.enabled,priority:e.priority,health:e.health,maskedHint:p(e.maskedHint),baseUrl:p(e.baseUrl),proxyUrl:p(e.proxyUrl),expiresAt:p(e.expiresAt),lastFailureCode:p(e.lastFailureCode),lastFailureAt:p(e.lastFailureAt),rateLimitResetAt:p(e.rateLimitResetAt),failCount:fe(e.failCount),version:e.version})}function et(e){return b(e)?Object.fromEntries(Object.entries(e).filter(([t])=>!Jt(t)).map(([t,r])=>[t,tt(r)])):{}}function tt(e){return Array.isArray(e)?e.map(tt):b(e)?et(e):e}function Jt(e){const t=e.toLocaleLowerCase();return t.includes("secret")||t.includes("token")||t.includes("apikey")||t==="api_key"||t==="key"||t==="authorization"}function Xt(e,t){const r=se([...e.credentials,...t.credentials],i=>i.id),n=se([...e.offerings,...t.offerings],i=>i.id),o=se([...e.selectedModels,...t.selectedModels],Yt);return{id:e.id,name:e.name??t.name,offerings:n,credentials:r,selectedModels:o,status:Qt(e.status,t.status)}}function Yt(e){return e.resourceId??`${e.provider}:${e.offeringId??""}:${e.id}`}function Zt(e){return e==="connected"?"available":e==="reauthRequired"?"attention":"unconfigured"}function Qt(e,t){return e==="available"||t==="available"?"available":e==="attention"||t==="attention"?"attention":e==="configured"||t==="configured"?"configured":e==="unconfigured"||t==="unconfigured"?"unconfigured":"unavailable"}function er(e,t){if(e.status==="disconnected")return;const r=tr(e.authMode);return g({id:p(e.credentialIri)??`${t}:current`,offeringId:rr(t,r),authMode:r,label:p(e.accountLabel),enabled:e.status==="connected",priority:0,health:e.status==="reauthRequired"||e.reauthRequired===!0?"expired":"healthy",maskedHint:p(e.maskedHint),baseUrl:p(e.baseUrl),proxyUrl:p(e.proxyUrl),expiresAt:p(e.expiresAt),version:typeof e.version=="number"?e.version:0})}function tr(e){return e==="deviceCodeOAuth"?"deviceCode":"apiKey"}function rr(e,t){return e==="kimi"&&(t==="deviceCode"||t==="oauth")?"subscription-key":t==="deviceCode"||t==="oauth"?"official-subscription":"api-platform"}function rt(e){return nt(e)?e:void 0}function nt(e){return e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local"}function nr(e){return e==="healthy"||e==="expired"||e==="invalid"||e==="unknown"}function or(e){return e==="unconfigured"||e==="configured"||e==="available"||e==="attention"||e==="unavailable"}function k(e,t){return Array.isArray(e)?e.map(t).filter(H):[]}function se(e,t){const r=new Set,n=[];for(const o of e){const i=t(o);r.has(i)||(r.add(i),n.push(o))}return n}function ot(e){return He[e]}function ir(e){if(!b(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;const t=S(e.provider);if(t)return g({id:e.id,credentialIri:e.credentialIri,webId:e.webId,provider:t,authMode:e.authMode,status:e.status,accountLabel:p(e.accountLabel),expiresAt:p(e.expiresAt),version:typeof e.version=="number"?e.version:void 0,reauthRequired:typeof e.reauthRequired=="boolean"?e.reauthRequired:void 0})}function ar(e,t){if(!b(e)||!ge(e.mode)||!lr(e.status)||e.provider!==t)throw new Error("AI Connection returned an invalid Connect response");return g({mode:e.mode,status:e.status,provider:t,attemptId:p(e.attemptId),state:p(e.state),signature:p(e.signature),expiresAt:p(e.expiresAt),authorizationUrl:ce(e.authorizationUrl),userCode:p(e.userCode),verificationUri:ce(e.verificationUri),verificationUriComplete:ce(e.verificationUriComplete),intervalSeconds:typeof e.intervalSeconds=="number"?e.intervalSeconds:void 0,apiKeyManagementSupported:typeof e.apiKeyManagementSupported=="boolean"?e.apiKeyManagementSupported:void 0,credentialId:p(e.credentialId),offeringId:p(e.offeringId),authorizationMethodId:p(e.authorizationMethodId),oauthCredential:sr(e.oauthCredential),message:p(e.message)})}function sr(e){if(e!==void 0){if(!b(e)||typeof e.accessToken!="string"||!e.accessToken||typeof e.refreshToken!="string"||!e.refreshToken)throw new Error("AI Connection returned an invalid OAuth credential payload");return g({accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:p(e.expiresAt),scope:p(e.scope),idToken:p(e.idToken),accountSubject:p(e.accountSubject),accountId:p(e.accountId),accountLabel:p(e.accountLabel),offeringId:p(e.offeringId),authorizationMethodId:p(e.authorizationMethodId),expectedVersion:typeof e.expectedVersion=="number"?e.expectedVersion:void 0})}}function cr(e,t){if(!b(e)||!Array.isArray(e.models))throw new Error("AI Connection returned an invalid model discovery response");const r=e.models.map(n=>{if(!b(n)||typeof n.id!="string"||!n.id)return;const o=Array.isArray(n.capabilities)?n.capabilities.filter(d=>typeof d=="string"):void 0,i=dr(n.modelType);return g({id:n.id,displayName:p(n.displayName),capabilities:o??(i==="embedding"?["embedding"]:void 0),modelType:i})}).filter(H);return{provider:t,credential:typeof e.credential=="string"?e.credential:"",models:r,observedAt:typeof e.observedAt=="string"?e.observedAt:new Date(0).toISOString(),source:typeof e.source=="string"?e.source:""}}function g(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function dr(e){return e==="chat"||e==="embedding"?e:void 0}function p(e){return typeof e=="string"?e:void 0}function ce(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 ge(e){return e==="browserAssistedApiKey"||e==="deviceCodeOAuth"||e==="authorizationCodeOAuth"||e==="connectUnsupported"}function lr(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"||e==="completed"||e==="expired"||e==="cancelled"||e==="unsupported"}function ur(e){return e==="connected"||e==="disconnected"||e==="reauthRequired"}function b(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function H(e){return e!==void 0}function we(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 pr({webId:e,podBaseUrl:t,authenticatedFetch:r}){const n=we(t),o=async(s,a,c,f={})=>{const y=await r(`${n}${s}`,{method:a,credentials:"omit",mode:"cors",headers:{accept:"application/json",...c?{"content-type":"application/json"}:{}},...c?{body:JSON.stringify(c)}:{}}),m=await Oe(y);if(!y.ok)throw new te(m,y.status,f);return m},i=s=>($t(s),`/api/ai/gateway/providers/${s}`),d=async(s,a,c,f)=>{const y=await o(`${i(s)}${a}`,c,f,{provider:s});return ar(y,s)},l=async()=>{const s=await o("/v1/models","GET");return Array.isArray(s.data)?s.data.map(Ye).filter(H):[]};return{webId:e,apiBase:n,getServiceAccess(){return o("/api/applets/service-access/ai-connections","GET")},async listProviders(){const s=await o("/api/ai/providers","GET");return Array.isArray(s.data)?Dt(s.data):[]},async listAuthorizationMethods(){const s=await r(`${n}/api/ai/connections/authorization-methods`,{method:"GET",credentials:"omit",mode:"cors",headers:{accept:"application/json"}});if(s.status===404)return[];const a=await Oe(s);if(!s.ok)throw new te(a,s.status);return b(a)&&Array.isArray(a.data)?a.data.map(Kt).filter(H):[]},listModels:l,listGatewayModels:l,async listGatewayKeys(){const s=await o("/api/ai/gateway/keys","GET");return Array.isArray(s.data)?s.data.map(ae).filter(H):[]},async createGatewayKey(s){const a=await o("/api/ai/gateway/keys","POST",g(s));if(typeof a.key!="string"||!a.key)throw new Error("Xpod did not return the new API Key");const c=ae(a.record);if(!c)throw new Error("Xpod returned an invalid API Key record");return{plaintext:a.key,record:c}},async updateGatewayKey(s,a){const c=await o(`/api/ai/gateway/keys/${encodeURIComponent(s)}`,"PATCH",a),f=ae(c.record);if(!f)throw new Error("Xpod returned an invalid API Key record");return f},async deleteGatewayKey(s){await o(`/api/ai/gateway/keys/${encodeURIComponent(s)}`,"DELETE")},async beginConnect(s,a,c){return await d(s,"/connect/begin","POST",g({mode:a,offeringId:c?.offeringId,authorizationMethodId:c?.authorizationMethodId}))},connectStatus(s,a){if(!a.attemptId)throw new Error("Connect attempt id is required");const c=new URLSearchParams({state:a.state??"",signature:a.signature??""});return a.mode&&c.set("mode",a.mode),d(s,`/connect/status/${encodeURIComponent(a.attemptId)}?${c}`,"GET")},completeApiKey(s,a,c,f,y){return d(s,"/connect/complete-api-key","POST",g({attemptId:a.attemptId,state:a.state,signature:a.signature,offeringId:a.offeringId,apiKey:c,accountLabel:f,baseUrl:y}))},pollDevice(s,a){return d(s,"/connect/poll","POST",g({mode:a.mode,attemptId:a.attemptId,state:a.state,signature:a.signature,offeringId:a.offeringId}))},cancelConnect(s,a){return d(s,"/connect/cancel","POST",g({mode:a.mode,attemptId:a.attemptId,state:a.state,signature:a.signature,offeringId:a.offeringId}))},refreshOAuthCredential(s,a,c,f,y,m){return d(s,"/connect/refresh","POST",{credentialId:a,refreshToken:c,expectedVersion:f,...y?{offeringId:y}:{},...m?{mode:m}:{}})},async disconnect(s,a){const c=a?`?${new URLSearchParams({credentialId:a})}`:"",f=await o(`${i(s)}/connect${c}`,"DELETE");return ir(f.record)},async createApiKeyCredential(s,a){const c=await o(`/api/ai/providers/${s}/credentials/api-key`,"POST",g({...a}),{provider:s}),f=j(c.credential);if(!f)throw new Error("AI Connection returned an invalid Provider credential");return f},async createLocalCredential(s,a){const c=await o(`/api/ai/providers/${s}/credentials/local`,"POST",g(a),{provider:s}),f=j(c.credential);if(!f)throw new Error("AI Connection returned an invalid Provider credential");return f},async updateProviderCredential(s,a,c){const f=await o(`/api/ai/providers/${s}/credentials/${encodeURIComponent(a)}`,"PATCH",g({...c}),{provider:s}),y=j(f.credential);if(!y)throw new Error("AI Connection returned an invalid Provider credential");return y},async deleteProviderCredential(s,a){const c=await o(`/api/ai/providers/${s}/credentials/${encodeURIComponent(a)}`,"DELETE",void 0,{provider:s});return j(c.credential)},async testProviderCredential(s,a){const c=await o(`/api/ai/providers/${s}/credentials/test`,"POST",g({...a}),{provider:s});return et(c.result)},quota(s,a=!1,c){const f=!a&&c?.credentialIri?`?credentialIri=${encodeURIComponent(c.credentialIri)}${c.offeringId?`&offeringId=${encodeURIComponent(c.offeringId)}`:""}`:"";return o(`${i(s)}/quota/${a?"refresh":"status"}${f}`,a?"POST":"GET",a?g({offeringId:c?.offeringId,credentialId:c?.credentialId,credentialIri:c?.credentialIri}):void 0,{provider:s})},quotaFromSecret(s,a){return o(`${i(s)}/quota/refresh`,"POST",g(a),{provider:s})},async discoverModels(s,a){const c=await o(`${i(s)}/models/refresh`,"POST",g({...a}),{provider:s,authMode:a?.authMode});return cr(c,s)},async saveProviderModel(s,a){const c=await o(i(s)+"/models","POST",g({id:a.id,displayName:a.displayName,inputModalities:a.inputModalities,outputModalities:a.outputModalities,capabilities:a.capabilities}),{provider:s});return xe(c.data)},async deleteProviderModel(s,a){const c=await o(`${i(s)}/models/${encodeURIComponent(a)}`,"DELETE",void 0,{provider:s});return xe(c.data)}}}function fr(e){const t=new TextEncoder().encode(JSON.stringify(e));let r="";for(const n of t)r+=String.fromCharCode(n);return btoa(r)}function yr(e){const t=atob(e),r=Uint8Array.from(t,n=>n.charCodeAt(0));return JSON.parse(new TextDecoder().decode(r))}function mr(e){return JSON.stringify({algorithm:"PLAINTEXT",encoding:"base64",ciphertext:fr(e.secret),webId:e.webId,credentialIri:e.credentialIri,provider:e.provider})}function hr(e){if(!(typeof e.envelope!="string"||!e.envelope.trim()))try{const t=JSON.parse(e.envelope);if(t.algorithm!=="PLAINTEXT"||t.webId!==e.webId||t.provider!==e.provider||t.credentialIri!==e.credentialIri)return;const r=t.encoding==="base64"?yr(String(t.ciphertext)):JSON.parse(String(t.ciphertext));return typeof r=="object"&&r!==null&&!Array.isArray(r)?r:void 0}catch{return}}function br(e){return I.buildId({id:e})}function gr(e){return I.buildId({id:`custom-instance-${encodeURIComponent(e)}.ttl#this`})}function Le(e,t){const r=crypto.randomUUID();return t==="local"?`${e}-local-${r}`:`${e}-${r}`}function hn(e){const t=(e.split("#",1)[0]??e).split("/").filter(Boolean).at(-1)??"",r=t.endsWith(".ttl")?t.slice(0,-4):t;if(r)return r.startsWith("custom-")||r==="custom"?"custom":V.find(n=>r===n||r.startsWith(`${n}-`))}function x(e){if(!e)return;const t=e.split("#",1)[0]??e,r=t.split("/").filter(Boolean).at(-1)??t;if(!r)return;const n=r.endsWith(".ttl")?r:`${r}.ttl`,o=e.indexOf("#");return o<0?n:`${n}${e.slice(o)}`}function M(e){const t=x(e);if(t)return(t.split("#",1)[0]??t).replace(/\.ttl$/u,"")}const it="AI Connection request failed. Please try again.";function Q(e){return typeof e=="object"&&e!==null}const at="订阅登录态自动刷新失败,请稍后重试。",st="订阅登录态已失效,请在原客户端重新登录后重读,或使用设备码登录。",ct="模型服务请求超时。请检查网络或代理设置,稍后重试同步模型。",dt="订阅登录态不可用,请重读登录态或重新登录后再同步模型。",lt=new Set([ct,dt,at,st,"密钥不可用。请检查密钥是否填写正确,或换一个密钥后重试。","模型服务地址不正确。请检查服务地址后重试。","请求太频繁。请稍等一会儿再试。","模型服务暂时没有响应。请稍后重试。","模型列表获取失败。请检查密钥、服务地址或网络后重试。"]);function $e(e){if(e.startsWith("provider_models_response_error:"))return Ie(e.slice(31))??"模型列表获取失败。请检查密钥、服务地址或网络后重试。";const t=re(e);if(t)return t;const r=e.split(":",1)[0]?.trim(),n=r?re(r):void 0;return n||(e==="AI Connection service identity is unavailable"||lt.has(e)||_r(e)?e:e.startsWith("invalid_")?"AI Connection returned an invalid response.":it)}function wr(e){return e instanceof te?Ir(e.payload,e.status,{provider:e.provider,authMode:e.authMode}):e instanceof Error?$e(e.message):$e(String(e))}function Ir(e,t,r={}){const n=Xe(e);if(n==="provider_models_response_error"){const d=Q(e)&&typeof e.message=="string"?Ie(e.message):void 0;return d||"模型列表获取失败。请检查密钥、服务地址或网络后重试。"}if(n==="provider_models_fetch_failed"){const d=Q(e)&&typeof e.providerStatus=="number"?e.providerStatus:void 0,l=Q(e)&&typeof e.providerMessage=="string"?e.providerMessage.trim():void 0;return Pr(Ar(d,r.authMode),l)}const o=n?re(n,r.provider):void 0;if(o)return o;const i=Q(e)&&typeof e.error=="string"?e.error:void 0;if(i){const d=re(i,r.provider);if(d)return d;if(i==="AI Connection service identity is unavailable")return i;if(i==="Provider credential not found for current identity")return"当前身份没有可用的额度凭证。";if(i==="Provider quota adapter not found"||i==="Provider quota lookup failed")return"该接入方式不支持查询官方额度。"}return t===401?"Please sign in again to continue.":t===403?"AI Connection permission was denied.":t===404&&r.provider?`${ye(r.provider)} connection is not configured.`:t===429?"AI Connection is rate limited. Please try again later.":t===503?"AI Connection service is unavailable.":it}function re(e,t){switch(e.trim().toLowerCase().replace(/-/g,"_")){case"not_configured":case"notconfigured":return t?`${ye(t)} connection is not configured.`:"AI provider connection is not configured.";case"unsupported":return t?`${ye(t)} does not support this operation.`:"This AI Connection operation is not supported.";case"service_access_missing":case"pod_interface_key_missing":case"pod_interface_key_rejected":case"caller_dpop_replay_unsupported":return"Xpod 尚未获准访问这个 Pod,请到 Pod 的授权应用中允许 Xpod 访问。";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.";case"unsafe_provider_base_url":return"该服务地址指向 Xpod 不允许访问的网络,请改用公网 HTTPS 地址。";case"provider_request_timeout":return ct;case"invalid_proxy_url":return"代理地址必须是无账号密码的 HTTP 或 HTTPS 地址。";case"oauth_refresh_failed":case"oauth_refresh_unavailable":case"local_session_refresh_failed":return at;case"oauth_session_reauth_required":case"oauth_refresh_token_required":case"local_session_reauth_required":case"local_session_missing_refresh_token":return st;case"models_persistence_failed":return"模型已获取,但保存到 Pod 失败。请重试同步模型。";case"quota_credential_not_found":return"当前身份没有可用的额度凭证。";case"credential_secret_unavailable":return"当前凭证密钥不可用,请重新保存后再查询额度。";case"gateway_api_key_plaintext_unavailable":return"Pod 中未找到此 API Key 的原文,无法复制配置。请创建新的 Key,更新客户端后再删除旧 Key。";case"quota_adapter_not_found":return"该接入方式不支持查询官方额度。";default:return}}function Ar(e,t){return e===401||e===403?t==="deviceCodeOAuth"?dt:"密钥不可用。请检查密钥是否填写正确,或换一个密钥后重试。":e===404?"模型服务地址不正确。请检查服务地址后重试。":e===429?"请求太频繁。请稍等一会儿再试。":e!==void 0&&e>=500?"模型服务暂时没有响应。请稍后重试。":"模型列表获取失败。请检查密钥、服务地址或网络后重试。"}function Pr(e,t){const r=t?Ie(t):void 0;return r?`${e} 上游返回:${r}`:e}function _r(e){const r=e.indexOf(" 上游返回:");return r<=0?!1:lt.has(e.slice(0,r))}function Ie(e){return e.replace(/[\u0000-\u001f\u007f]/gu," ").replace(/\bBearer\s+[^\s,;]+/giu,"Bearer [REDACTED]").replace(/(?:sk|id)[._-][A-Za-z0-9._-]{8,}/gu,"[REDACTED]").replace(/https?:\/\/[^\s]+/giu,"[URL]").trim().slice(0,240)||void 0}function ye(e){switch(e){case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"kimi":return"Kimi";case"bailian":return"Bailian";case"deepseek":return"DeepSeek";case"zhipu":return"Zhipu";case"ollama":return"Ollama";case"custom":return"Custom"}}function Cr(e){const t={...e};for(const[r,n]of Object.entries(e))typeof n=="function"&&(t[r]=async(...o)=>{try{return await n.apply(e,o)}catch(i){throw i instanceof te&&(i.message=wr(i)),i}});return t}const Ur={"api-key":"添加 API Key","browser-login":"打开控制台","browser-oauth":"浏览器登录","device-code":"设备码登录","local-session-import":"已有登录态","local-service":"本地服务"};function Sr(e){return e.label??Ur[e.id]}function bn(e){return e.map(t=>{const r=Sr(t);return r===t.label?t:{...t,label:r}})}function ne(e){return He[e]}const Er=3e4;function gn({webId:e,podUrl:t,authenticatedFetch:r}){return Cr(pr({webId:e,podBaseUrl:t,authenticatedFetch:kr(r)}))}function kr(e){return(async(t,r)=>me(await e(t,r)))}function Mr({podUrl:e,authenticatedFetch:t,invocationFetch:r=t,now:n=()=>new Date,invocationSelector:o=Tr}){const i=we(e);let d,l;const s=async(y,m)=>{const w=await t(y,m);return d=await xr(w.clone(),o),w},a=async()=>{if($r(d,n()))return d;if(l)return l;l=c();try{return await l}finally{l=void 0}},c=async()=>{if(!(await s(`${i}/api/applets/service-access/ai-connections`,{method:"GET",credentials:"include",headers:{accept:"application/json"}})).ok)throw new Error("AI Connection request failed. Please try again.");const m=d;if(!m?.token)throw new Error("AI Connection request failed. Please try again.");return m},f=async(y,m)=>{const w=await a(),_=vr(w);if(!_)throw new Error("AI Connection request failed. Please try again.");const q=new Headers(m?.headers);return q.set("Authorization",`Bearer ${_}`),r(y,{...m,credentials:"omit",headers:q})};return(async(y,m)=>{if(Rr(y,i))return s(y,m);if(!Or(y,i))return t(y,m);const w=await f(y,m);if(w.status!==401)return me(w);await w.arrayBuffer(),d=void 0;const _=await f(y,m);return me(_)})}function wn({podUrl:e,controlPlaneOrigin:t,authenticatedFetch:r,invocationFetch:n,now:o}){const i=we(e),d=n??r,s=Mr({podUrl:e,authenticatedFetch:r,invocationFetch:(a,c)=>{const f=new URL(a instanceof Request?a.url:String(a),i);if(t&&f.origin===i&&f.pathname.startsWith("/api/ai/client-configuration/")){const y=new URL(`${f.pathname}${f.search}`,t);return d(a instanceof Request?new Request(y,a):y.href,c)}return d(a,c)},now:o,invocationSelector:Lr});return{inspect:async a=>{const c=await s(L(i,a),{method:"GET",credentials:"omit",headers:{accept:"application/json"}});return c.status===403||c.status===404||c.status===503?(await c.arrayBuffer(),ve()):$(c)},plan:async a=>$(await s(`${L(i,a.client)}/plan`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({endpoint:t?new URL(t).origin:a.endpoint,...a.activeModels!==void 0?{activeModels:a.activeModels}:{}})})),apply:async a=>$(await s(`${L(i,a.client)}/apply`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({planId:a.planId,apiKey:a.apiKey,confirmation:a.confirmation})})),verify:async a=>$(await s(`${L(i,a.client)}/verify`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({planId:a.planId})})),launch:async a=>$(await s(`${L(i,a)}/launch`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({})})),restore:async a=>{const c=await s(`${L(i,a)}/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(),ve()):$(c)}}}function Rr(e,t){try{const r=new URL(String(e),t),n=new URL(t);return r.origin===n.origin&&r.pathname==="/api/applets/service-access/ai-connections"}catch{return!1}}function Or(e,t){try{const r=new URL(String(e),t),n=new URL(t);return r.origin===n.origin&&(r.pathname.startsWith("/api/ai/")||r.pathname.startsWith("/v1/"))}catch{return!1}}async function xr(e,t){if(!(!e.ok||!e.headers.get("content-type")?.includes("application/json")))try{const r=await e.json();return zr(t(r))}catch{return}}function Tr(e){return e.invocation}function Lr(e){const t=e.aiClientConfiguration;return oe(t)?t.invocation:void 0}function $r(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()>Er}function vr(e){return e?.token}function zr(e){if(!oe(e))return;const t=["gateway","Key"].join("");return{token:typeof e.token=="string"?e.token:typeof e.apiKey=="string"?e.apiKey: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 me(e){return e.ok?e:e.headers.get("content-type")?.includes("application/json")?Dr(e):(await e.arrayBuffer(),new Response(JSON.stringify({error:"internal_error"}),{status:e.status,statusText:e.statusText,headers:{"content-type":"application/json"}}))}function L(e,t){return`${e}/api/ai/client-configuration/${encodeURIComponent(t)}`}async function $(e){if(!e.ok)throw await Nr(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 Nr(e){let t;try{t=e.headers.get("content-type")?.includes("application/json")?await e.json():void 0}catch{t=void 0}if(oe(t)){const r=typeof t.code=="string"?t.code:typeof t.error=="string"?t.error:void 0,n=typeof t.message=="string"?t.message:"AI client configuration request failed. Please try again.",o=new Error(n);return o.code=r,o.status=e.status,o.details=t.details,o}return await e.arrayBuffer().catch(()=>{}),new Error("AI client configuration request failed. Please try again.")}function ve(){return{status:"unavailable",message:"Host does not support local client configuration. Use the manual setup instructions for your client."}}async function Dr(e){let t;try{t=await e.clone().json()}catch{return e}const r=Br(t);return r?new Response(JSON.stringify({code:r}),{status:e.status,statusText:e.statusText,headers:{"content-type":"application/json"}}):qr(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 qr(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 Br(e){if(!(!oe(e)||typeof e.error!="string")&&e.error==="Gateway API Key plaintext is not available")return"gateway_api_key_plaintext_unavailable"}function oe(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}var jr=wt(),Fr=It();const G=Array.from(new Set([...V,"zhipu","ollama","custom"])),ze=new WeakMap,Kr=Ce.storage.base.slice(Ce.storage.base.lastIndexOf("/")+1);function Hr(e){const t=e.indexOf("#");return t<0?e:e.slice(0,t)}function In(e){Wr(),gt({createQueryEngine:async()=>new At.QueryEngine});const t=new URL("settings/-/sparql",e.podUrl).toString();return h.setSparqlEndpoint(t),I.setSparqlEndpoint(t),P.setSparqlEndpoint(t),{credentialsTableDocument(){return h.buildIri(e.podUrl,{id:Kr})},providerTableDocument(r,n){const o=C(r);if(!o)throw new Error("unsupported_provider");const i=o==="custom"&&n?he(n):R(o);return I.buildIri(e.podUrl,{id:Hr(i)})},async listModels(){return await e.database.init?.(P),(await e.database.select().from(P).execute()).map(Qr).filter(D)},async listProviders(){await e.database.init?.(h,I,P);const r=await e.database.select().from(h).execute(),n=await e.database.select().from(I).execute(),o=await e.database.select().from(P).execute();return Jr(e,r,n,o)},async createApiKeyCredential(r,n){const o=C(r);if(!o)throw new Error("unsupported_provider");await e.database.init?.(h,I);const i=u(n.id),d=i??h.buildId({id:Le(o,"apiKey")}),l=1,s=Y(o,n.offeringId??K(o,"apiKey")),a=n.baseUrl??Re(o,s),c=le(n.proxyUrl),f={id:d,provider:o==="custom"?he(d):R(o),service:"ai",authMode:"apiKey",offeringId:s,status:"active",accountLabel:n.label,label:n.label,baseUrl:a,proxyUrl:c,keyVersion:String(l),reauthRequired:!1,encryptedSecret:ee(e,o,d,{type:"apiKey",apiKey:n.apiKey}),encryptionAlgorithm:"PLAINTEXT",metadata:{...Z({offeringId:s,baseUrl:a,priority:n.priority}),...n.compatibility?{compatibility:n.compatibility}:{}}};return await qe(e,d,f,i!==void 0),A(e,o,f)},async createLocalCredential(r,n){const o=C(r);if(!o)throw new Error("unsupported_provider");await e.database.init?.(h,I);const i=u(n.id),d=i??h.buildId({id:Le(o,"local")}),l=Y(o,n.offeringId??K(o,"local")),s=n.baseUrl??Re(o,l),a={id:d,provider:R(o),service:"ai",authMode:"local",offeringId:l,status:"active",accountLabel:n.label??"Local",label:n.label??"Local",baseUrl:s,keyVersion:"1",reauthRequired:!1,encryptedSecret:ee(e,o,d,{type:"local"}),encryptionAlgorithm:"PLAINTEXT",metadata:Z({offeringId:l,baseUrl:s,priority:n.priority})};return await qe(e,d,a,i!==void 0),A(e,o,a)},async saveOAuthCredential(r,n){const o=C(r);if(!o)throw new Error("unsupported_provider");const d=(ze.get(e.database)??Promise.resolve()).then(async()=>{await e.database.init?.(h,I);const l=Y(o,n.offeringId??K(o,"deviceCode")),a=(await e.database.select().from(h).execute()).find(E=>{const T=A(e,o,E);if(!T||T.authMode!=="deviceCode"&&T.authMode!=="oauth"||je(o,T.offeringId)!==je(o,l)||E.status!=="active"&&E.status!=="disabled")return!1;const ht=F(e,o,T.id,E.encryptedSecret);return Xr(n,U(E.metadata),ht)}),c=a&&A(e,o,a),f=U(a?.metadata),y=c&&F(e,o,c.id,a?.encryptedSecret),m=c?.id??h.buildId({id:`${o}-oauth-${crypto.randomUUID()}`}),w=n.accountLabel??"OAuth",_=n.accountId??u(f?.accountId)??u(y?.accountId),q=n.accountSubject??u(f?.authoritativeSubject)??u(y?.accountSubject)??u(y?.authoritativeSubject),ie={...a,id:m,provider:R(o),service:"ai",authMode:"deviceCodeOAuth",offeringId:l,status:c?.enabled===!1?"disabled":"active",accountLabel:a?.accountLabel??w,label:a?.label??w,expiresAt:n.expiresAt,scopes:n.scope?n.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String((c?.version??0)+1),reauthRequired:!1,failCount:0,lastFailureCode:null,lastFailureAt:null,rateLimitResetAt:null,encryptedSecret:ee(e,o,m,{type:"deviceCodeOAuth",accessToken:n.accessToken,refreshToken:n.refreshToken,expiresAt:n.expiresAt,scope:n.scope,idToken:n.idToken,accountId:_,accountSubject:q,accountLabel:n.accountLabel,offeringId:l,authorizationMethodId:n.authorizationMethodId}),encryptionAlgorithm:"PLAINTEXT",metadata:{...f,...Z({offeringId:l,priority:c?.priority,enabled:c?.enabled,health:"healthy"}),authoritativeSubject:q,accountId:_,authorizationMethodId:n.authorizationMethodId}};if(a){const E={...ie};if(delete E.id,!await e.database.updateById(h,m,E))throw new Error("credential_version_conflict")}else await e.database.insert(h).values(ie).execute();return A(e,o,ie)});return ze.set(e.database,d.then(()=>{},()=>{})),d},async updateOAuthCredential(r,n,o,i){const d=C(r);if(!d)throw new Error("unsupported_provider");await e.database.init?.(h,I);const l=await e.database.findById(h,n),s=l&&A(e,d,l);if(!l||!s||s.authMode!=="deviceCode")throw new Error("oauth_credential_not_found");if(s.version!==o)throw new Error("credential_version_conflict");const a=F(e,d,n,l.encryptedSecret),c=i.accountId??u(U(l.metadata)?.accountId)??u(a?.accountId),f=i.accountSubject??u(U(l.metadata)?.authoritativeSubject)??u(a?.accountSubject)??u(a?.authoritativeSubject),y=Y(d,i.offeringId??s.offeringId),m={expiresAt:i.expiresAt,scopes:i.scope?i.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String(o+1),reauthRequired:!1,failCount:0,lastFailureCode:null,lastFailureAt:null,rateLimitResetAt:null,status:"active",encryptedSecret:ee(e,d,n,{type:"deviceCodeOAuth",accessToken:i.accessToken,refreshToken:i.refreshToken,expiresAt:i.expiresAt,scope:i.scope,idToken:i.idToken,accountId:c,accountSubject:f,accountLabel:i.accountLabel??u(l.accountLabel),offeringId:y,authorizationMethodId:i.authorizationMethodId??u(U(l.metadata)?.authorizationMethodId)}),accountLabel:i.accountLabel??u(l.accountLabel),label:i.accountLabel??u(l.label),offeringId:y,metadata:{...U(l.metadata),...Z({offeringId:y,health:"healthy"}),authoritativeSubject:f,accountId:c,authorizationMethodId:i.authorizationMethodId??u(U(l.metadata)?.authorizationMethodId)}},w=await e.database.updateById(h,n,m);if(!w)throw new Error("credential_version_conflict");return A(e,d,w)},async updateProviderCredential(r,n,o){const i=C(r);if(!i)throw new Error("unsupported_provider");await e.database.init?.(h,I);const d=await e.database.findById(h,n),l=d&&A(e,i,d);if(!d||!l)throw new Error("credential_not_found");if(l.version!==o.expectedVersion)throw new Error("credential_version_conflict");const s={...U(d.metadata),...o.priority===void 0?{}:{priority:o.priority},...o.enabled===void 0?{}:{enabled:o.enabled},...o.baseUrl===void 0?{}:{baseUrl:o.baseUrl},...o.proxyUrl===void 0?{}:{proxyUrl:le(o.proxyUrl)}},a={...o.label===void 0?{}:{accountLabel:o.label,label:o.label},...o.baseUrl===void 0?{}:{baseUrl:o.baseUrl},...o.proxyUrl===void 0?{}:{proxyUrl:le(o.proxyUrl)},...o.enabled===void 0?{}:{status:o.enabled?"active":"disabled"},keyVersion:String(l.version+1),metadata:s},c=await e.database.updateById(h,n,a);if(!c)throw new Error("credential_update_failed");const f=A(e,i,c);if(!f)throw new Error("credential_update_failed");return f},async markCredentialHealth(r,n,o,i){const d=C(r);if(!d)throw new Error("unsupported_provider");await e.database.init?.(h);const l=await e.database.findById(h,n),s=l&&A(e,d,l);if(!l||!s)throw new Error("credential_not_found");if(s.version!==i)throw new Error("credential_version_conflict");const a=await e.database.updateById(h,n,{keyVersion:String(s.version+1),metadata:{...U(l.metadata),health:o},...o==="healthy"?{failCount:0,lastFailureCode:null,lastFailureAt:null,rateLimitResetAt:null,reauthRequired:!1}:{}});if(!a)throw new Error("credential_update_failed");const c=A(e,d,a);if(!c)throw new Error("credential_update_failed");return c},async deleteProviderCredential(r,n){const o=C(r);if(!o)throw new Error("unsupported_provider");await e.database.init?.(h,I);const i=await e.database.findById(h,n),d=i&&A(e,o,i);if(d)return await e.database.deleteById(h,n),d},async readCredentialSecret(r,n){const o=C(r);if(!o)throw new Error("unsupported_provider");const i=await e.database.findById(h,n);if(!i||!A(e,o,i))throw new Error("credential_not_found");const d=F(e,o,n,i.encryptedSecret);if(!d)throw new Error("credential_secret_unavailable");return d},async saveDiscoveredModels(r,n,o){const i=C(r);if(!i)throw new Error("unsupported_provider");await e.database.init?.(h,I,P);const d=await Ne(e,n),l=Be(i,d);await Fe(e.database,l,ne(i));const s=await e.database.select().from(P).execute(),a=new Set(s.map(y=>u(y.id)).filter(D)),c=o.map(en).filter(D),f=new Set(c.map(y=>y.id));for(const y of s.filter(m=>tn(m,l,i))){const m=O(u(y.id),l)??pt(u(y.id));m&&!f.has(m)&&u(y.status)!=="unavailable"&&await e.database.updateById(P,String(y.id),{status:"unavailable"})}for(const y of c)await rn(e.database,l,y,a)},async saveModelSelection(r,n,o){const i=C(r);if(!i)throw new Error("unsupported_provider");await e.database.init?.(I,P);const d=i==="custom"&&o?await Ne(e,o):null;if(i==="custom"&&o&&!d)throw new Error("credential_not_found");const l=d?Be(i,d):R(i);await Fe(e.database,l,ne(i));const a=(await e.database.select().from(I).execute()).find(_=>N(u(_.id),l)),c=u(a?.id)??l,f=yt(a?.hasModel),y=await e.database.select().from(P).execute(),m=[...new Set(n.map(_=>on(i,_,y,d?l:void 0)))];if(!await e.database.updateById(I,c,{hasModel:m}))throw new Error("provider_model_selection_update_failed");e.authenticatedFetch&&await Vr(e,c,f,m)}}}const Gr="https://undefineds.co/ns#hasModel";async function Vr(e,t,r,n){const o=de(I,e.podUrl,t),i=r.map(c=>de(P,e.podUrl,c)),d=n.map(c=>de(P,e.podUrl,c)),l=c=>c.map(f=>`<${o}> <${Gr}> <${f}> .`).join(`
|
|
2
|
-
`),s=[i.length>0?`DELETE DATA { ${l(i)} }`:void 0,d.length>0?`INSERT DATA { ${l(d)} }`:void 0].filter(c=>!!c);if(s.length===0)return;const a=await e.authenticatedFetch(o.split("#",1)[0],{method:"PATCH",headers:{"content-type":"application/sparql-update"},body:s.join(`;
|
|
3
|
-
`)});if(!a.ok)throw new Error(`provider_model_selection_persist_failed:${a.status}`)}function de(e,t,r){return/^https?:\/\//u.test(r)?r:e.buildIri(t,{id:r})}async function Ne(e,t){const r=await e.database.findById(h,t);return r||((await e.database.select().from(h).execute()).find(o=>{const i=u(o.id);return i===t||(i?h.buildIri(e.podUrl,{id:i})===t:!1)})??null)}function Wr(){De(jr.ActionObserverHttp.prototype),De(Fr.ActionObserverHttp.prototype)}function De(e){const t=e;if(t.__xpodObservedActorsPatch)return;const r=t.onRun;t.onRun=function(n,o,i){return Array.isArray(this.observedActors)||(this.observedActors=[]),r.call(this,n,o,i)},t.__xpodObservedActorsPatch=!0}function Jr(e,t,r,n){const o=t.filter(i=>u(i.service)==="ai").filter(i=>u(i.status)!=="revoked");return G.map(i=>{const d=o.map(c=>A(e,i,c)).filter(D).sort((c,f)=>c.priority-f.priority||c.id.localeCompare(f.id)),l=r.find(c=>M(u(c.id))===i),a=yt(l?.hasModel).map(c=>Zr(i,c,n));return{id:i,name:i==="custom"?d.find(c=>c.label)?.label??ne(i):ne(i),offerings:i==="custom"?an(o.filter(c=>A(e,i,c))):Je(i,e.openAiSubscriptionImportAvailable===!0),credentials:d,selectedModels:a,status:sn(d)}})}async function qe(e,t,r,n){if(!(n?await e.database.findById(h,t):null)){await e.database.insert(h).values(r).execute();return}const i={...r};if(delete i.id,!await e.database.updateById(h,t,i))throw new Error("credential_create_failed")}function ee(e,t,r,n){return mr({webId:e.webId,provider:t,credentialIri:h.buildIri(e.podUrl,{id:r}),secret:n})}function Xr(e,t,r){let n=!1;for(const[o,i]of[[e.accountId,[t?.accountId,r?.accountId]],[e.accountSubject,[t?.authoritativeSubject,r?.accountSubject,r?.authoritativeSubject]]]){const d=[...new Set(i.map(u).filter(D).filter(l=>l.trim()))];if(d.length>1)return!1;if(!(!o?.trim()||!d.length)){if(d[0]!==o)return!1;n=!0}}return n}function A(e,t,r){const n=u(r.id);if(!n)return;const o=Pe(u(r.provider))??dn(n);if(o!==t)return;const i=U(r.metadata),d=mt(r.authMode);if(d)return{id:n,provider:o,offeringId:ut(r,o,d),authMode:d,label:u(r.accountLabel)??u(r.label),enabled:Ke(i?.enabled)??u(r.status)==="active",priority:ue(i?.priority)??100,health:un(i?.health)??(Ke(r.reauthRequired)?"expired":"healthy"),lastFailureCode:u(r.lastFailureCode),lastFailureAt:pe(r.lastFailureAt),rateLimitResetAt:pe(r.rateLimitResetAt),failCount:ue(r.failCount),maskedHint:cn(e,o,n,r.encryptedSecret),baseUrl:u(r.baseUrl),proxyUrl:ln(u(r.proxyUrl)??u(i?.proxyUrl)),compatibility:Yr(i?.compatibility),expiresAt:pe(r.expiresAt),version:ue(r.keyVersion)??0}}function Yr(e){return e==="auto"||e==="openai"||e==="anthropic"?e:void 0}function ut(e,t,r){return u(e.offeringId)??u(U(e.metadata)?.offeringId)??_e(u(e.provider))??K(t,r)}function Zr(e,t,r){const n=r.find(l=>x(u(l.id))===x(t)),o=u(n?.isProvidedBy),i=n?O(t,o??e)??t:O(t,e)??t,d=n??r.find(l=>{const s=u(l.id),a=u(l.isProvidedBy);return s===t||O(s,e)===i||Pe(a)===e&&O(s,a??e)===i});return{id:i,provider:e,offeringId:_e(u(d?.isProvidedBy)),credentialId:Ae(o),resourceId:u(d?.id)??t,displayName:u(d?.displayName),availability:u(d?.status)==="unavailable"||!d?"unavailable":"available"}}function Qr(e){const t=u(e.isProvidedBy),r=Pe(t),n=r&&O(u(e.id),t??r);if(!(!r||!n))return{id:n,provider:r,offeringId:_e(t),credentialId:Ae(t),resourceId:u(e.id),displayName:u(e.displayName),availability:u(e.status)==="unavailable"?"unavailable":"available",...nn(e)}}function en(e){const t=U(e),r=u(t?.id);if(r)return{id:r,displayName:u(t?.displayName),modelType:ft(t?.modelType)}}function Be(e,t){const r=Ae(u(t?.provider));return r?he(r):R(e)}function R(e){return br(e)}function he(e){return gr(e)}function Ae(e){const t=M(e),r=t?.startsWith("custom-instance-")?t.slice(16):void 0;if(r)try{return decodeURIComponent(r)}catch{return}}function je(e,t){if(!t)return;const r=t.trim().toLowerCase();if(e==="bailian"){if(r==="token-plan")return"token-plan-personal";if(r==="coding-plan")return"coding-plan-pro";if(r==="payg")return"pay-as-you-go"}return r}function N(e,t){const r=x(e),n=x(t);return r!==void 0&&r===n}function tn(e,t,r){const n=u(e.isProvidedBy);return N(n,t)?!0:r==="custom"?!1:M(n)?.startsWith(`${r}-`)===!0}function pt(e){if(!e)return;const t=e.lastIndexOf("#");if(t<0||t===e.length-1)return;const r=e.slice(t+1);try{return decodeURIComponent(r)}catch{return r}}async function Fe(e,t,r){(await e.select().from(I).execute()).some(o=>N(u(o.id),t))||await e.insert(I).values({id:t,displayName:r}).execute()}async function rn(e,t,r,n){const o=be(t,r.id),i={displayName:r.displayName??r.id,isProvidedBy:t,status:"active",...r.modelType?{modelType:r.modelType}:{}};if(n.has(o)){await e.updateById(P,o,i);return}await e.insert(P).values({id:o,...i}).execute(),n.add(o)}function nn(e){const t=ft(e.modelType);return t?{modelType:t,...t==="embedding"?{capabilities:["embedding"]}:{}}:{}}function ft(e){const t=u(e)?.trim().toLowerCase();return t==="chat"||t==="embedding"?t:void 0}function be(e,t){const r=x(e)??`${e}.ttl`;return`${r.split("#",1)[0]??r}#${encodeURIComponent(t)}`}function on(e,t,r,n){const o=u(t.resourceId),i=n??R(e),d=u(t.id),l=d?r.filter(a=>{const c=u(a.isProvidedBy),f=M(c);return(n?N(c,n):f===e||f?.startsWith(`${e}-`)===!0)&&O(u(a.id),c??i)===d}):[],s=n||l.length===1?l[0]:void 0;if(o){const a=r.find(m=>u(m.id)===o);if(!a&&s)return String(s.id);const c=u(a?.isProvidedBy),f=M(c),y=n?N(c,n):f===e||f?.startsWith(`${e}-`)===!0;if(a&&!y)throw new Error("invalid_model_selection_resource");if(!a){const m=d??pt(o),w=M(o),_=n?N(w,n):w===e||w?.startsWith(`${e}-`)===!0;if(!m||!_)throw new Error("invalid_model_selection_resource");return be(i,m)}return o}if(!d)throw new Error("invalid_model_selection_resource");return u(s?.id)??be(i,d)}function O(e,t){if(!e)return;const n=x(t)?.split("#",1)[0]??t,o=n.endsWith(".ttl")?`${n}#`:`${n}.ttl#`,i=e.lastIndexOf(o);if(!(i<0))try{return decodeURIComponent(e.slice(i+o.length))}catch{return e.slice(i+o.length)}}function yt(e){if(Array.isArray(e))return e.map(u).filter(D);const t=u(e);return t?[t]:[]}function an(e){const t=new Map;for(const r of e){const n=U(r.metadata),o=ut(r,"custom",mt(r.authMode)??"apiKey"),i=Lt(n?.compatibility,o),d=u(r.baseUrl)??u(n?.baseUrl),l=B.find(s=>s.id===o)??B.find(s=>s.id===`${i}-compatible`)??B[0];t.set(o,{...l,id:o,endpoints:d?[{protocol:i==="anthropic"?"anthropic":"chatCompletions",baseUrl:d}]:l.endpoints,modelDiscovery:i==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}})}return t.size>0?[...t.values()]:B}function sn(e){return e.some(t=>t.health==="expired"||t.health==="invalid")?"attention":e.some(t=>t.enabled)?"available":e.length>0?"configured":"unconfigured"}function cn(e,t,r,n){const o=F(e,t,r,n),i=u(o?.apiKey);if(i)return i.length<=8?`${i.slice(0,2)}…`:`${i.slice(0,3)}...${i.slice(-4)}`}function F(e,t,r,n){return hr({webId:e.webId,provider:t,credentialIri:h.buildIri(e.podUrl,{id:r}),envelope:n})}function Pe(e){const t=M(e),r=C(t);return r||G.find(n=>t?.startsWith(`${n}-`))}function _e(e){const t=M(e);if(t&&!t.startsWith("custom-instance-")){if(t==="bailian-token-plan-personal")return"token-plan";if(t==="bailian-token-plan-team")return"token-plan-team";if(t==="bailian-coding-plan-pro")return"coding-plan";if(t==="bailian-pay-as-you-go")return"pay-as-you-go";for(const r of G)if(t.startsWith(`${r}-`))return t.slice(r.length+1)}}function dn(e){const t=/\/([^/#]+)\.ttl#/u.exec(e);return C(t?.[1])}function C(e){if(typeof e!="string"||!e.trim())return;const t=e.trim().toLowerCase();if(t==="zhipu"||t.startsWith("zhipu-"))return"zhipu";if(G.includes(t))return t;for(const r of G)if(t.startsWith(`${r}-`)||r==="bailian"&&(t==="bailian-token-plan"||t==="bailian-coding-plan"))return r}function le(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{throw new Error("invalid_proxy_url")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash||!t.hostname)throw new Error("invalid_proxy_url");return t.toString().replace(/\/$/u,"")}function ln(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{return}if(!(!["http:","https:"].includes(t.protocol)||!t.hostname))return t.username="",t.password="",t.search="",t.hash="",t.toString().replace(/\/$/u,"")}function mt(e){if(e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local")return e;if(e==="deviceCodeOAuth")return"deviceCode"}function un(e){if(e==="healthy"||e==="expired"||e==="invalid"||e==="unknown")return e;if(e==="reauthRequired")return"expired";if(e==="disabled")return"unknown"}function U(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function u(e){return typeof e=="string"&&e.trim()?e:void 0}function ue(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 Ke(e){if(typeof e=="boolean")return e;if(e==="true")return!0;if(e==="false")return!1}function pe(e){return e instanceof Date?e.toISOString():u(e)}function D(e){return e!==void 0}export{yn as A,He as P,Z as a,gr as b,Le as c,K as d,br as e,gn as f,In as g,V as h,hn as i,pr as j,te as k,wr as l,wn as m,mn as n,Re as o,M as p,Y as s,bn as w};
|