cicy-desktop 2.1.211 → 2.1.212
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cicy-desktop",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.212",
|
|
4
4
|
"description": "CiCy - AI-powered operating system browser",
|
|
5
5
|
"main": "src/main.js",
|
|
6
6
|
"bin": {
|
|
@@ -140,11 +140,11 @@
|
|
|
140
140
|
"//optionalDependencies": "(2026-06 回调): mac/linux 改回 native cicy-code(:8008,colima 在 16G mac 上压垮内存)→ 重新内置 cicy-code-<plat> / cicy-mihomo-<plat>,localbin.fromBundle 零网络 seed(npm 仅作更新通道,带 npmmirror→npmjs 回退)。这些由 scripts/sync-runtime-deps.cjs 在 tag-push 时同步到最新版。npm 的 os/cpu 字段保证每个平台只装自己那份。Windows 仍走 docker(WSL :8009),它那份 cicy-code-windows 用不到但 bundle 着无害。",
|
|
141
141
|
"optionalDependencies": {
|
|
142
142
|
"electron": "41.0.3",
|
|
143
|
-
"cicy-code-darwin-x64": "2.3.
|
|
144
|
-
"cicy-code-darwin-arm64": "2.3.
|
|
145
|
-
"cicy-code-linux-x64": "2.3.
|
|
146
|
-
"cicy-code-linux-arm64": "2.3.
|
|
147
|
-
"cicy-code-windows-x64": "2.3.
|
|
143
|
+
"cicy-code-darwin-x64": "2.3.74",
|
|
144
|
+
"cicy-code-darwin-arm64": "2.3.74",
|
|
145
|
+
"cicy-code-linux-x64": "2.3.74",
|
|
146
|
+
"cicy-code-linux-arm64": "2.3.74",
|
|
147
|
+
"cicy-code-windows-x64": "2.3.74",
|
|
148
148
|
"cicy-mihomo-darwin-x64": "1.10.4",
|
|
149
149
|
"cicy-mihomo-darwin-arm64": "1.10.4",
|
|
150
150
|
"cicy-mihomo-linux-x64": "1.10.4",
|
|
@@ -374,4 +374,4 @@ Error generating stack: `+l.message+`
|
|
|
374
374
|
`};function Iy(s){return s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Bl(s){return Iy(s).replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>").replace(/`([^`]+)`/g,"<code>$1</code>")}function ym(s){return s.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(b=>b.trim())}function Py(s){const b=String(s||"").replace(/\r\n/g,`
|
|
375
375
|
`).split(`
|
|
376
376
|
`),_=[];let d=0;for(;d<b.length;){const E=b[d];if(!E.trim()){d++;continue}if(/^---+\s*$/.test(E)){_.push("<hr/>"),d++;continue}const k=/^(#{1,6})\s+(.*)$/.exec(E);if(k){const M=Math.min(k[1].length,6);_.push(`<h${M}>${Bl(k[2])}</h${M}>`),d++;continue}if(E.trim().startsWith("|")&&d+1<b.length&&/^\s*\|?[\s:|-]+\|?\s*$/.test(b[d+1])&&b[d+1].includes("-")){const M=ym(E);d+=2;const q=[];for(;d<b.length&&b[d].trim().startsWith("|");)q.push(ym(b[d])),d++;let T="<table><thead><tr>";T+=M.map(m=>`<th>${Bl(m)}</th>`).join(""),T+="</tr></thead><tbody>";for(const m of q)T+="<tr>"+m.map(J=>`<td>${Bl(J)}</td>`).join("")+"</tr>";T+="</tbody></table>",_.push(T);continue}if(E.trim().startsWith(">")){const M=[];for(;d<b.length&&b[d].trim().startsWith(">");)M.push(b[d].replace(/^\s*>\s?/,"")),d++;_.push(`<blockquote>${M.map(Bl).join("<br/>")}</blockquote>`);continue}if(/^\s*-\s+/.test(E)){const M=[];for(;d<b.length&&/^\s*-\s+/.test(b[d]);)M.push(`<li>${Bl(b[d].replace(/^\s*-\s+/,""))}</li>`),d++;_.push(`<ul>${M.join("")}</ul>`);continue}if(/^\s*\d+\.\s+/.test(E)){const M=[];for(;d<b.length&&/^\s*\d+\.\s+/.test(b[d]);)M.push(`<li>${Bl(b[d].replace(/^\s*\d+\.\s+/,""))}</li>`),d++;_.push(`<ol>${M.join("")}</ol>`);continue}_.push(`<p>${Bl(E)}</p>`),d++}return _.join(`
|
|
377
|
-
`)}const r=(s,b,_)=>{var E,k;const d=M=>_&&typeof M=="string"?M.replace(/\{\{\s*(\w+)\s*\}\}/g,(q,T)=>_[T]!=null?String(_[T]):q):M;try{const M=(k=(E=window.cicyI18n)==null?void 0:E.t)==null?void 0:k.call(E,s,_);return d(M&&M!==s?M:b)}catch{return d(b)}},Cn="cicy_token",Uu="cicy_access_token",Ru="cicy_user_id",Ll="https://cicy-ai.com",tp=1;async function _i(s){var _,d,E,k,M,q,T,m;const b=`${Ll}/dash${s}`;try{if((d=(_=window.cicy)==null?void 0:_.tabs)!=null&&d.openIn){await window.cicy.tabs.openIn(tp,b,"cicy-ai");return}(M=(k=(E=window.cicy)==null?void 0:E.shell)==null?void 0:k.openExternal)==null||M.call(k,b)}catch{try{(m=(T=(q=window.cicy)==null?void 0:q.shell)==null?void 0:T.openExternal)==null||m.call(T,b)}catch{}}}const lo=new Set;let ep=0,vl=[];const vi=new Map;function pm(){lo.forEach(s=>s(vl))}const Nt={show(s={}){const b=s.id||`t${++ep}`,_=vl.find(k=>k.id===b),d={id:b,status:"running",..._,...s};vl=_?vl.map(k=>k.id===b?d:k):[...vl,d],pm();const E=vi.get(b);return E&&(clearTimeout(E),vi.delete(b)),s.ttl&&vi.set(b,setTimeout(()=>Nt.dismiss(b),s.ttl)),b},dismiss(s){vl=vl.filter(_=>_.id!==s);const b=vi.get(s);b&&(clearTimeout(b),vi.delete(s)),pm()}};function ap(){const[s,b]=x.useState(vl);return x.useEffect(()=>(lo.add(b),()=>{lo.delete(b)}),[]),s.length?u.jsx("div",{className:"toast-host","data-id":"ToastHost",children:s.map(_=>u.jsxs("div",{className:"toast","data-id":`Toast-${_.id}`,"data-status":_.status||"running",children:[u.jsx("button",{type:"button",className:"toast__x","data-id":"Toast-dismiss",onClick:()=>Nt.dismiss(_.id),"aria-label":"dismiss",children:"×"}),u.jsxs("span",{className:"toast__msg",children:[_.message,Number.isFinite(_.progress)?` ${_.progress}%`:""]}),Number.isFinite(_.progress)&&u.jsx("span",{className:"toast__bar",children:u.jsx("span",{style:{width:`${Math.min(100,_.progress)}%`}})})]},_.id))}):null}const no=new Set;let Ps=0,Jt=null;function bl(){no.forEach(s=>s(Jt))}function xi(){return new Date().toTimeString().slice(0,8)}const me={open({teamId:s,fromVer:b,toVer:_,onRetry:d,title:E,kind:k}={}){Jt={teamId:s,title:E||null,fromVer:b||null,toVer:_||null,kind:k||"sidecar",status:"running",phase:"download",progress:null,onInstall:null,logs:[],onRetry:d||null,lastAt:Date.now()},bl()},setProgress(s){Jt&&(Jt={...Jt,status:"running",progress:s||Jt.progress,lastAt:Date.now()},bl())},ready({onInstall:s,message:b}={}){if(!Jt)return;const _={id:++Ps,t:xi(),phase:"done",status:"done",message:b||r("updateBanner.readyDrawer","下载完成,点「安装」重启更新")};Jt={...Jt,status:"ready",phase:"done",progress:{...Jt.progress||{},percent:100},onInstall:s||null,minimized:!1,logs:[...Jt.logs,_],lastAt:Date.now()},bl()},push(s={}){if(!Jt)return;const b={id:++Ps,t:xi(),phase:s.phase||Jt.phase,status:s.status||"running",message:s.message||""};Jt={...Jt,phase:s.phase||Jt.phase,toVer:s.toVer||Jt.toVer,logs:[...Jt.logs,b],lastAt:Date.now()},bl()},minimize(){Jt&&(Jt={...Jt,minimized:!0},bl())},restore(){Jt&&(Jt={...Jt,minimized:!1},bl())},finish({ok:s,message:b}={}){if(!Jt)return;const _=s?"done":"error",d={id:++Ps,t:xi(),phase:"done",status:_,message:b||(s?r("updateDrawer.done","更新完成"):r("updateDrawer.failed","更新失败"))};Jt={...Jt,status:_,phase:"done",minimized:!1,logs:[...Jt.logs,d],lastAt:Date.now()},bl()},close(){Jt=null,bl()}},to=["download","swap","done"],gm=s=>({download:r("updateDrawer.phaseDownload","下载"),swap:r("updateDrawer.phaseSwap","切换"),done:r("updateDrawer.phaseDone","完成")})[s]||s;function lp(){var q;const[s,b]=x.useState(Jt);x.useEffect(()=>(no.add(b),()=>{no.delete(b)}),[]);const _=x.useRef(null);x.useEffect(()=>{const T=_.current;T&&(T.scrollTop=T.scrollHeight)},[(q=s==null?void 0:s.logs)==null?void 0:q.length]);const[d,E]=x.useState(!1);if(x.useEffect(()=>{if(!s||s.status!=="running"){E(!1);return}const T=setInterval(()=>E(Date.now()-(s.lastAt||0)>25e3),3e3);return()=>clearInterval(T)},[s==null?void 0:s.lastAt,s==null?void 0:s.status]),!s)return null;const k=s.status==="running",M=to.findIndex(T=>T===s.phase);return s.minimized?u.jsxs("button",{type:"button",className:`drawer-min drawer-min--${s.status}`,"data-id":"UpdateDrawer-restore",onClick:()=>me.restore(),children:[u.jsx("span",{className:"drawer-min__spark",children:k?u.jsx(Ye,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("span",{className:"drawer-min__label",children:[s.title||r("updateDrawer.title","更新 cicy-code"),s.toVer?` · v${s.toVer}`:""]})]}):u.jsx("div",{className:"drawer-scrim","data-id":"UpdateDrawer-scrim",onClick:()=>k?me.minimize():me.close(),children:u.jsxs("div",{className:"drawer","data-id":"UpdateDrawer","data-status":s.status,onClick:T=>T.stopPropagation(),children:[u.jsxs("div",{className:"drawer__head",children:[u.jsxs("div",{className:"drawer__title",children:[u.jsx("span",{className:`drawer__spark drawer__spark--${s.status}`,children:k?u.jsx(Ye,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("div",{children:[u.jsx("div",{className:"drawer__h",children:s.title||r("updateDrawer.title","更新 cicy-code")}),u.jsxs("div",{className:"drawer__sub",children:[s.fromVer?`v${s.fromVer}`:r("updateDrawer.current","当前")," → ",s.toVer?`v${s.toVer}`:r("updateDrawer.latest","最新版")]})]})]}),u.jsx("div",{className:"drawer__headbtns",children:u.jsx("button",{type:"button",className:"drawer__x","data-id":"UpdateDrawer-min",title:r("updateDrawer.minimize","最小化"),onClick:()=>me.minimize(),"aria-label":"minimize",children:"‒"})})]}),s.kind!=="app"&&u.jsx("div",{className:"drawer__steps","data-id":"UpdateDrawer-steps",children:to.map((T,m)=>{const J=gm(T),U=s.status==="done"||m<M,at=m===M&&k,F=s.status==="error"&&m===M;return u.jsxs("div",{className:`drawer__step${at?" is-active":""}${U?" is-done":""}${F?" is-error":""}`,children:[u.jsx("span",{className:"drawer__step-dot",children:U?"✓":F?"!":m+1}),u.jsx("span",{className:"drawer__step-label",children:J}),m<to.length-1&&u.jsx("span",{className:"drawer__step-bar"})]},T)})}),s.progress&&(()=>{const T=s.progress,m=J=>J?(J/1048576).toFixed(1):"0";return u.jsxs("div",{className:"drawer__dl","data-id":"UpdateDrawer-dl",children:[u.jsxs("div",{className:"drawer__dl-head",children:[u.jsxs("span",{className:"drawer__dl-pct",children:[T.percent||0,"%"]}),u.jsxs("span",{className:"drawer__dl-stats",children:[T.total?`${m(T.transferred)} / ${m(T.total)} MB`:`${m(T.transferred)} MB`,T.bytesPerSec?` · ${m(T.bytesPerSec)} MB/s`:"",T.etaSec?` · ${r("updateBanner.eta","剩 {{s}}s",{s:T.etaSec})}`:""]})]}),u.jsx("div",{className:"drawer__dl-track",children:u.jsx("span",{className:"drawer__dl-fill",style:{width:`${T.percent||0}%`}})})]})})(),u.jsx("div",{className:"drawer__log","data-id":"UpdateDrawer-log",ref:_,children:s.logs.length===0?u.jsx("div",{className:"drawer__log-empty",children:r("updateDrawer.preparing","准备中…")}):s.logs.map(T=>u.jsxs("div",{className:"drawer__line","data-status":T.status,children:[u.jsx("span",{className:"drawer__t",children:T.t}),u.jsx("span",{className:`drawer__badge drawer__badge--${T.phase}`,children:gm(T.phase)}),u.jsx("span",{className:"drawer__linemsg",children:T.message})]},T.id))}),d&&k&&u.jsx("div",{className:"drawer__hint","data-id":"UpdateDrawer-stuck",children:r("updateDrawer.stuckHint","正在等待新版本就绪,耗时比平常久。可以放到后台继续,完成或失败都会提示。")}),u.jsx("div",{className:"drawer__foot",children:k?u.jsx(u.Fragment,{children:u.jsx("span",{className:"drawer__foot-status",children:s.kind==="app"?r("updateBanner.downloading","正在下载更新")+"…":r("updateDrawer.inProgress","更新进行中…")})}):s.status==="ready"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("updateBanner.readyShort","下载完成")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-install",onClick:()=>s.onInstall&&s.onInstall(),children:r("updateBanner.installBtn","立即安装")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-later",onClick:()=>me.close(),children:r("updateBanner.later","稍后")})]}):s.status==="error"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-error",children:r("updateDrawer.failed","更新失败")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-dismiss",onClick:()=>me.close(),children:r("common.close","关闭")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("updateDrawer.updatedLatest","已更新到最新")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-finish",onClick:()=>me.close(),children:r("common.done","完成")})]})})]})})}function np(){const[s,b]=x.useState(void 0);x.useEffect(()=>{var j,L;if(!((L=(j=window.cicy)==null?void 0:j.terms)!=null&&L.status)){b(!0);return}window.cicy.terms.status(Em).then(H=>b(!!(H!=null&&H.accepted))).catch(()=>b(!0))},[]),x.useEffect(()=>{var H,Z,et,Kt;const j=document.documentElement;try{j.setAttribute("data-platform",((H=window.cicy)==null?void 0:H.platform)||"linux")}catch{}j.setAttribute("data-fullscreen","0");let L;try{L=(Kt=(et=(Z=window.cicy)==null?void 0:Z.window)==null?void 0:et.onFullscreen)==null?void 0:Kt.call(et,jt=>j.setAttribute("data-fullscreen",jt?"1":"0"))}catch{}return()=>{try{L&&L()}catch{}}},[]),x.useEffect(()=>{var L,H;if(!((H=(L=window.cicy)==null?void 0:L.docker)!=null&&H.onAppProgress))return;const j=window.cicy.docker.onAppProgress(Z=>{!Z||Z.phase==="open"||(Bt||zt.open({source:"auto"}),(Bt==null?void 0:Bt.source)==="auto"&&(Z.phase==="done"&&(Z.status==="done"||Z.status==="reboot")?zt.finish({ok:Z.status==="done",status:Z.status==="reboot"?"reboot":void 0,message:Z.message}):Z.status==="error"?zt.finish({ok:!1,message:Z.message}):zt.push(Z)))});return()=>{try{j&&j()}catch{}}},[]);const[_,d]=x.useState(()=>Si(Cn)),[E,k]=x.useState(()=>Si(Uu)),[M,q]=x.useState(()=>Si(Ru)),[T,m]=x.useState(()=>!Si(Cn)),[J,U]=x.useState(!1),[at,F]=x.useState(!1),[I,X]=x.useState(""),[dt,_t]=x.useState(""),[It,ht]=x.useState(!1),[Gt,lt]=x.useState(""),[wt,G]=x.useState(""),[ot,B]=x.useState(null),[Lt,Pt]=x.useState(null),[re,he]=x.useState(!1),[le,Zt]=x.useState(""),z=x.useRef(!1),[Y,ct]=x.useState(null),[yt,Dt]=x.useState(!1),[h,N]=x.useState(!1),[Q,W]=x.useState({}),pt=x.useCallback(async()=>{var j,L,H;try{const Z=await((H=(L=(j=window.cicy)==null?void 0:j.localTeams)==null?void 0:L.avatars)==null?void 0:H.call(L));W(Z&&typeof Z=="object"?Z:{})}catch{}},[]),[vt,St]=x.useState(!1),[ue,Rt]=x.useState(!1),[ge,V]=x.useState(""),[Yt,we]=x.useState(""),[qt,Ne]=x.useState(!1),[Fe,Ge]=x.useState(""),[be,Ca]=x.useState("all"),je=x.useCallback(async(j,L)=>{var Z,et,Kt,jt;if(!j)return;if(!((et=(Z=window.cicy)==null?void 0:Z.cloud)!=null&&et.fetch)){Zt("cloud fetch bridge missing");return}he(!0),Zt("");const H={Authorization:`Bearer ${j}`};try{const[Ie,Le]=await Promise.all([window.cicy.cloud.fetch(`${Ll}/api/user/self`,{headers:H}),window.cicy.cloud.fetch(`${Ll}/api/teams`,{headers:H})]);if((Le==null?void 0:Le.status)===401){if(!z.current&&((jt=(Kt=window.cicy)==null?void 0:Kt.auth)!=null&&jt.loginStart)){z.current=!0,Zt(r("auth.sessionExpired","会话已过期,正在重新登录…"));try{await window.cicy.auth.loginStart()}catch{}}return}if(Le!=null&&Le.ok){const ze=JSON.parse(Le.body||"{}");Pt(Array.isArray(ze==null?void 0:ze.teams)?ze.teams:[])}if(Ie!=null&&Ie.ok)try{const ze=JSON.parse(Ie.body||"{}");B((ze==null?void 0:ze.success)===!1?null:(ze==null?void 0:ze.data)||null)}catch{B(null)}else B(null)}catch{Zt("")}finally{he(!1)}},[]),He=x.useRef("");x.useEffect(()=>{He.current=_||E||""},[_,E]);const Be=x.useCallback(async()=>{var L,H;const j=He.current;if(!(!j||!((H=(L=window.cicy)==null?void 0:L.cloud)!=null&&H.fetch)))try{const Z=await window.cicy.cloud.fetch(`${Ll}/api/teams`,{headers:{Authorization:`Bearer ${j}`}});if(Z!=null&&Z.ok){const et=JSON.parse(Z.body||"{}");Array.isArray(et==null?void 0:et.teams)&&Pt(et.teams)}}catch{}},[]),R=x.useCallback(async(j,L)=>{var et,Kt;const H=He.current,Z=String(L||"").trim();if(!H||!((Kt=(et=window.cicy)==null?void 0:et.cloud)!=null&&Kt.fetch)||!Z)return{ok:!1,error:"no session / empty"};try{const jt=await window.cicy.cloud.fetch(`${Ll}/api/teams/${j}`,{method:"PATCH",headers:{Authorization:`Bearer ${H}`,"Content-Type":"application/json"},body:JSON.stringify({title:Z})});return jt!=null&&jt.ok?(await Be(),{ok:!0}):{ok:!1,error:`${(jt==null?void 0:jt.status)||"?"} ${(jt==null?void 0:jt.error)||""}`}}catch(jt){return{ok:!1,error:jt.message}}},[Be]),$=x.useCallback(async(j,L)=>{var et,Kt;const H=He.current,Z=String(L||"").trim();if(!H||!((Kt=(et=window.cicy)==null?void 0:et.cloud)!=null&&Kt.fetch)||!Z)return{ok:!1,error:"no session / empty"};try{new URL(Z)}catch{return{ok:!1,error:"地址格式不对(需 http(s)://…)"}}try{const jt=await window.cicy.cloud.fetch(`${Ll}/api/teams/${j}`,{method:"PATCH",headers:{Authorization:`Bearer ${H}`,"Content-Type":"application/json"},body:JSON.stringify({hostUrl:Z})});return jt!=null&&jt.ok?(await Be(),{ok:!0}):{ok:!1,error:`${(jt==null?void 0:jt.status)||"?"} ${(jt==null?void 0:jt.error)||""}`}}catch(jt){return{ok:!1,error:jt.message}}},[Be]),it=x.useCallback(async j=>{var H,Z;const L=He.current;if(!L||!((Z=(H=window.cicy)==null?void 0:H.cloud)!=null&&Z.fetch)){Nt.show({message:r("common.noAuth","未登录"),status:"error",ttl:5e3});return}try{const et=await window.cicy.cloud.fetch(`${Ll}/api/teams/${j.id}`,{method:"DELETE",headers:{Authorization:`Bearer ${L}`}});et!=null&&et.ok||(et==null?void 0:et.status)===200||(et==null?void 0:et.status)===204?(Nt.show({message:r("teamCard.deleted","团队已删除"),status:"done",ttl:3e3}),await Be()):Nt.show({message:`${r("teamCard.deleteFailed","删除失败")}: ${(et==null?void 0:et.status)||"?"} ${(et==null?void 0:et.error)||""}`,status:"error",ttl:7e3})}catch(et){Nt.show({message:`${r("teamCard.deleteFailed","删除失败")}: ${et.message}`,status:"error",ttl:7e3})}},[Be]);x.useEffect(()=>{const j=_||E;j&&je(j,M)},[_,E,M,je]);const tt=x.useCallback(async()=>{var j,L;if((L=(j=window.cicy)==null?void 0:j.localTeams)!=null&&L.list){Dt(!0);try{const H=await window.cicy.localTeams.list({refresh:!0});ct(Array.isArray(H)?H:[])}catch{ct([])}finally{Dt(!1),N(!0)}}},[]);async function Et(){if(qt)return;const j=Yt.trim();if(!j){Ge(r("teams.urlRequired","请输入地址 URL"));return}try{new URL(j)}catch{Ge(r("teams.badUrl","URL 无效(需含 http(s)://)"));return}Ge(""),Ne(!0);try{const L=await window.cicy.localTeams.add({base_url:j,name:ge.trim(),failIfExists:!0});if(!L||L.ok===!1){Ge((L==null?void 0:L.error)==="exists"?r("teams.urlExists","该地址已存在"):Ka((L==null?void 0:L.error)||"add failed"));return}Rt(!1),V(""),we(""),await tt()}catch(L){Ge(Ka((L==null?void 0:L.message)||String(L)))}finally{Ne(!1)}}const At=x.useCallback(async(j,L)=>{var Z,et;if(!((et=(Z=window.cicy)==null?void 0:Z.localTeams)!=null&&et.update))return{ok:!1,error:"no_bridge"};let H;try{H=await window.cicy.localTeams.update(j,{name:String(L||"").trim()||r("localTeams.unnamed","未命名")})}catch(Kt){H={ok:!1,error:(Kt==null?void 0:Kt.message)||String(Kt)}}return await tt(),H||{ok:!1,error:"no_result"}},[tt]);x.useEffect(()=>{let j,L=!1;const H=3e3,Z=3e4,et=async()=>{var Ie,Le,ze;try{await((ze=(Le=(Ie=window.cicy)==null?void 0:Ie.localTeams)==null?void 0:Le.syncCloud)==null?void 0:ze.call(Le))}catch{}await Promise.all([tt(),Be(),pt()])},Kt=()=>{if(L)return;const Ie=document.visibilityState==="visible";j=setTimeout(async()=>{document.visibilityState==="visible"?await et():await tt(),Kt()},Ie?H:Z)};et(),Kt();const jt=()=>{document.visibilityState==="visible"&&et()};return document.addEventListener("visibilitychange",jt),window.addEventListener("focus",jt),()=>{L=!0,clearTimeout(j),document.removeEventListener("visibilitychange",jt),window.removeEventListener("focus",jt)}},[tt,Be]),x.useEffect(()=>{var L,H;if(!((H=(L=window.cicy)==null?void 0:L.localTeams)!=null&&H.onWebviewRelay))return;const j=window.cicy.localTeams.onWebviewRelay(async({reqId:Z,msg:et})=>{let Kt={ok:!1,error:"unknown relay type"};try{(et==null?void 0:et.type)==="localTeams:add"?Kt=await window.cicy.localTeams.add(et.spec||{}):(et==null?void 0:et.type)==="localTeams:remove"?Kt=await window.cicy.localTeams.remove(et.id):(et==null?void 0:et.type)==="localTeams:update"?Kt=await window.cicy.localTeams.update(et.id,et.patch||{}):(et==null?void 0:et.type)==="localTeams:upgrade"?Kt=await window.cicy.localTeams.upgrade(et.id):(et==null?void 0:et.type)==="localTeams:list"&&(Kt={ok:!0,teams:await window.cicy.localTeams.list({refresh:!0})}),tt()}catch(jt){Kt={ok:!1,error:(jt==null?void 0:jt.message)||String(jt)}}try{window.cicy.localTeams.replyWebviewRelay(Z,Kt)}catch{}});return()=>{try{j==null||j()}catch{}}},[tt]);const ne=x.useCallback(async j=>{var L,H;if((H=(L=window.cicy)==null?void 0:L.localTeams)!=null&&H.open)try{await window.cicy.localTeams.open(j)}catch{}},[]);x.useEffect(()=>{var L,H;if(Si(Cn)){m(!1);return}if(!((H=(L=window.cicy)==null?void 0:L.auth)!=null&&H.getSaved)){m(!1);return}let j=!1;return(async()=>{try{const Z=await window.cicy.auth.getSaved();if(j)return;if(Z!=null&&Z.token){try{localStorage.setItem(Cn,Z.token)}catch{}if(d(Z.token),Z.accessToken){try{localStorage.setItem(Uu,Z.accessToken)}catch{}k(Z.accessToken)}if(Z.userId){try{localStorage.setItem(Ru,String(Z.userId))}catch{}q(String(Z.userId))}}}catch{}finally{j||m(!1)}})(),()=>{j=!0}},[]),x.useEffect(()=>{var j,L;if((L=(j=window.cicy)==null?void 0:j.auth)!=null&&L.onComplete)return window.cicy.auth.onComplete(H=>{if(U(!1),ht(!1),H!=null&&H.error){lt(Ka(H.error));return}if(H!=null&&H.token){z.current=!1,Zt("");try{localStorage.setItem(Cn,H.token)}catch{}if(d(H.token),H.accessToken){try{localStorage.setItem(Uu,H.accessToken)}catch{}k(H.accessToken)}if(H.userId){try{localStorage.setItem(Ru,String(H.userId))}catch{}q(String(H.userId))}lt(""),G(H.reused?r("auth.welcomeBack","已恢复你之前的登录"):r("auth.loginSuccess","登录成功")),setTimeout(()=>G(""),3e3)}})},[]);async function g(){var j,L;if(!(at||J)){if(!((L=(j=window.cicy)==null?void 0:j.auth)!=null&&L.loginStart)){lt("auth bridge missing");return}lt(""),F(!0);try{const H=await window.cicy.auth.loginStart();if(!(H!=null&&H.ok)){lt(Ka((H==null?void 0:H.error)||"login start failed"));return}X(H.url||""),U(!0)}catch(H){lt(Ka((H==null?void 0:H.message)||String(H)))}finally{F(!1)}}}async function K(){var L,H;if(at)return;if(!((H=(L=window.cicy)==null?void 0:L.auth)!=null&&H.emailLoginStart)){lt("auth bridge missing");return}const j=dt.trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(j)){lt(r("auth.badEmail","请输入有效的邮箱地址"));return}lt(""),F(!0);try{const Z=await window.cicy.auth.emailLoginStart(j);if(!(Z!=null&&Z.ok)){lt(Ka((Z==null?void 0:Z.error)||"email login failed"));return}ht(!0)}catch(Z){lt(Ka((Z==null?void 0:Z.message)||String(Z)))}finally{F(!1)}}function gt(){var j,L,H;try{localStorage.removeItem(Cn),localStorage.removeItem(Uu),localStorage.removeItem(Ru)}catch{}try{(H=(L=(j=window.cicy)==null?void 0:j.auth)==null?void 0:L.logout)==null||H.call(L)}catch{}d(null),k(null),q(null),B(null),Pt(null),lt(""),Zt("")}if(s===void 0)return u.jsxs("div",{className:"shell","data-id":"TermsCheckingSplash",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(ao,{}),u.jsx("div",{className:"spinner-row",children:u.jsx(Ye,{})})]})]});if(!s)return u.jsx(Am,{onAgree:()=>b(!0)});if(!_&&T)return u.jsxs("div",{className:"shell","data-id":"AuthRestoringSplash",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(ao,{}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Ye,{}),u.jsx("span",{children:r("auth.restoring","正在恢复登录…")})]})]})]});if(!_)return u.jsxs("div",{className:"shell",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(ao,{}),!J&&!It&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline",children:r("auth.tagline","登录以同步你的团队、配置与 AI 助手")}),u.jsx("label",{className:"login-label","data-id":"EmailLoginLabel",htmlFor:"cicy-email-login",children:r("auth.emailLabel","输入邮箱,用邮件链接登录")}),u.jsx("input",{id:"cicy-email-login",type:"email",className:"login-email-input","data-id":"EmailLoginInput",value:dt,onChange:j=>_t(j.target.value),onKeyDown:j=>{j.key==="Enter"&&K()},placeholder:r("auth.emailPlaceholder","you@example.com"),autoComplete:"email",spellCheck:!1,autoFocus:!0}),u.jsx("button",{className:"btn-primary","data-id":"EmailLoginSubmit",onClick:K,disabled:at,children:at?u.jsxs(u.Fragment,{children:[u.jsx(Ye,{}),u.jsx("span",{children:r("auth.sending","发送中…")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{children:r("auth.emailLogin","发送登录链接")}),u.jsx(Hu,{})]})}),u.jsx("p",{className:"hint",children:r("auth.emailHint","手机上点邮件里的链接,也能登录这台电脑")}),u.jsx("div",{className:"login-divider","data-id":"LoginDivider",children:u.jsx("span",{children:r("auth.or","或")})}),u.jsx("button",{className:"btn-ghost","data-id":"BrowserLoginBtn",onClick:g,disabled:at,children:at?r("auth.opening","打开中…"):r("auth.browserLogin","用浏览器登录(Google / SSO,仅同一台电脑)")})]}),It&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline","data-id":"EmailSentTagline",children:r("auth.emailSentTagline","登录邮件已发送")}),u.jsxs("p",{className:"hint","data-id":"EmailSentHint",style:{textAlign:"center"},children:[r("auth.emailSentHint","到邮箱打开链接即可(手机、电脑都行),这里会自动登录。"),u.jsx("br",{}),dt]}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Ye,{}),u.jsx("span",{children:r("auth.emailWaiting","等待确认…")})]}),u.jsx("button",{className:"btn-ghost","data-id":"EmailSentCancel",onClick:()=>{var j,L,H;(H=(L=(j=window.cicy)==null?void 0:j.auth)==null?void 0:L.emailLoginCancel)==null||H.call(L),ht(!1)},children:r("auth.cancel","取消")})]}),J&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline",children:r("auth.waitingTagline","已在浏览器打开登录页,等待你完成…")}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Ye,{}),u.jsx("span",{children:r("auth.waitingCallback","等待回调")})]}),I&&u.jsxs("div",{className:"login-fallback","data-id":"LoginUrlFallback",style:{marginTop:10,textAlign:"center"},children:[u.jsx("p",{className:"hint",style:{marginBottom:6},children:r("auth.browserNotOpened","浏览器没自动打开?")}),u.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-open",onClick:()=>{var j,L,H;try{(H=(L=(j=window.cicy)==null?void 0:j.shell)==null?void 0:L.openExternal)==null||H.call(L,I)}catch{}},children:r("auth.openManually","手动打开登录页")}),u.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-copy",onClick:()=>{var j;try{(j=navigator.clipboard)==null||j.writeText(I),G(r("auth.linkCopied","链接已复制,粘到浏览器打开")),setTimeout(()=>G(""),2500)}catch{}},children:r("auth.copyLink","复制链接")}),u.jsx("p",{className:"hint","data-id":"LoginUrlFallback-url",style:{wordBreak:"break-all",marginTop:6,fontSize:11,opacity:.7,userSelect:"text"},children:I})]}),u.jsx("button",{className:"btn-ghost",onClick:()=>{var j,L,H;(H=(L=(j=window.cicy)==null?void 0:j.auth)==null?void 0:L.loginCancel)==null||H.call(L),U(!1),X("")},children:r("auth.cancel","取消")})]}),Gt&&u.jsx("div",{className:"error",children:Gt})]})]});const P=(Y||[]).find(j=>xm(j.base_url))||null,ut=P&&P.cloud_team_id?(Lt||[]).find(j=>String(j.teamId||j.id)===String(P.cloud_team_id)):null,rt=j=>{if(!j)return null;const L=(Lt||[]).find(H=>String(H.teamId||H.id)===String(j));return L&&L.code||null},mt=(Y||[]).filter(j=>uo(j.base_url)),Ce=(Y||[]).filter(j=>!uo(j.base_url)&&!xm(j.base_url)),za=mt.length,Sl=Ce.length,Wt=(Lt||[]).filter(j=>!j.is_local&&j.kind!=="local"&&(j.kind==="private"||j.team_kind==="personal")),De=Wt.length,xa=be==="all"||be==="local",ua=be==="all"||be==="custom",ql=be==="all"||be==="cloud",Ea=Y===null&&Lt===null;return u.jsxs("div",{className:"shell shell--app",children:[u.jsx("div",{className:"glow glow--app","aria-hidden":!0}),u.jsxs("div",{className:"shell__left",children:[u.jsx(cp,{me:ot,welcome:wt,onLogout:gt,mitmTeam:mt.length>0?mt[0]:null}),u.jsx(hp,{}),u.jsxs("main",{className:"main",children:[u.jsxs("div",{className:"app__tabsrow",children:[u.jsx("div",{className:"app__tabs",children:[{k:"all",label:r("teamFilter.all","全部"),n:za+Sl+De},{k:"local",label:r("teamFilter.local","本地"),n:za},{k:"cloud",label:r("teamFilter.cloud","私有云"),n:De},{k:"custom",label:r("teamFilter.custom","自定义"),n:Sl}].map(({k:j,label:L,n:H})=>u.jsxs("button",{type:"button",className:`app__tab ${be===j?"is-active":""}`,onClick:()=>Ca(j),children:[L,u.jsx("span",{className:"app__tab-count",children:H})]},j))}),u.jsxs("div",{"data-id":"AddTeamWrap",style:{position:"relative"},children:[u.jsxs("button",{type:"button","data-id":"AddTeamButton",className:"app__add-team",title:r("teams.addHint","添加团队"),onClick:()=>St(j=>!j),children:["+ ",r("teams.add","新加团队")]}),vt&&u.jsxs(u.Fragment,{children:[u.jsx("div",{onClick:()=>St(!1),style:{position:"fixed",inset:0,zIndex:40}}),u.jsxs("div",{"data-id":"AddTeamMenu",role:"menu",style:{position:"absolute",top:"calc(100% + 6px)",right:0,zIndex:41,minWidth:240,background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:10,boxShadow:"0 10px 30px rgba(0,0,0,.45)",overflow:"hidden"},children:[u.jsxs("button",{type:"button","data-id":"AddTeamMenu-custom",className:"bcard__menu-item",style:{display:"block",width:"100%",textAlign:"left",padding:"11px 14px",border:"none",background:"transparent",cursor:"pointer",color:"inherit"},onClick:()=>{St(!1),Ge(""),Rt(!0)},children:[u.jsx("div",{style:{fontSize:13,fontWeight:600},children:r("teams.addCustom","自定义团队")}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:2},children:r("teams.addCustomSub","手动输入地址和名称")})]}),u.jsxs("button",{type:"button","data-id":"AddTeamMenu-private",className:"bcard__menu-item",style:{display:"block",width:"100%",textAlign:"left",padding:"11px 14px",border:"none",borderTop:"1px solid var(--border, #2c2f36)",background:"transparent",cursor:"pointer",color:"inherit"},onClick:()=>{St(!1),_i("?tab=private")},children:[u.jsx("div",{style:{fontSize:13,fontWeight:600},children:r("teams.addPrivate","私有云团队")}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:2},children:r("teams.addPrivateSub","去云端团队中心添加")})]})]})]})]})]}),ue&&u.jsx("div",{"data-id":"CustomTeamModal",style:{position:"fixed",inset:0,zIndex:60,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:j=>{!qt&&j.target===j.currentTarget&&Rt(!1)},children:u.jsxs("div",{onClick:j=>j.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("teams.customTitle","添加自定义团队")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:r("teams.customSub","连接到一个已有的 cicy-code 地址")}),u.jsx("label",{style:{display:"block",fontSize:12,opacity:.75,marginBottom:6},children:r("teams.customNameLabel","名称")}),u.jsx("input",{"data-id":"CustomTeamModal-title",className:"login-email-input",style:{width:"100%",marginBottom:14},value:ge,onChange:j=>V(j.target.value),placeholder:r("teams.customNamePlaceholder","我的团队"),spellCheck:!1,autoFocus:!0}),u.jsx("label",{style:{display:"block",fontSize:12,opacity:.75,marginBottom:6},children:r("teams.customUrlLabel","地址 URL")}),u.jsx("input",{"data-id":"CustomTeamModal-url",className:"login-email-input",style:{width:"100%",marginBottom:6},value:Yt,onChange:j=>we(j.target.value),placeholder:"https://example.com:8008",spellCheck:!1,onKeyDown:j=>{j.key==="Enter"&&Et()}}),Fe&&u.jsx("div",{className:"error",style:{marginTop:10},children:Fe}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost","data-id":"CustomTeamModal-cancel",disabled:qt,onClick:()=>Rt(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"CustomTeamModal-submit",disabled:qt,onClick:Et,children:qt?r("teams.adding","添加中…"):r("teams.addAction","添加")})]})]})}),le&&u.jsxs("div",{className:"error",style:{marginBottom:12},children:[r("common.cloud","云端"),": ",le,u.jsx("button",{className:"btn-ghost",style:{marginLeft:8},onClick:()=>je(_||E,M),children:r("common.retry","重试")})]}),u.jsxs("div",{className:"app__grid",children:[Ea&&[0,1,2].map(j=>u.jsx(yp,{},"skc"+j)),!Ea&&xa&&mt.map(j=>u.jsx(Sm,{team:j,cloudCode:rt(j.cloud_team_id),onOpen:()=>ne(j.id),onRename:At,onRefresh:tt},"local:"+j.id)),!Ea&&xa&&u.jsx(fp,{dockerTeam:P,onOpen:async()=>{var j,L,H;try{const Z=await((H=(L=(j=window.cicy)==null?void 0:j.docker)==null?void 0:L.appOpen)==null?void 0:H.call(L));Z!=null&&Z.ok||Nt.show({id:"docker-open",status:"error",ttl:6e3,message:r("docker.openNoToken","服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。")})}catch(Z){console.warn("[DockerCard] open",Z)}},cloudTitle:ut==null?void 0:ut.title,cloudCode:ut==null?void 0:ut.code,onRename:P!=null&&P.cloud_team_id?(j=>R(P.cloud_team_id,j)):void 0,onRefresh:tt}),ua&&Ce.map(j=>u.jsx(Sm,{team:j,cloudCode:rt(j.cloud_team_id),onOpen:()=>ne(j.id),onRename:At,onRefresh:tt},"custom:"+j.id)),ql&&Wt.map(j=>u.jsx(mp,{team:j,onOpen:()=>{var H,Z,et;const L=j.kind==="private"?j.host_url:j.workspace_url||j.workspace_direct_url;L&&((et=(Z=(H=window.cicy)==null?void 0:H.tabs)==null?void 0:Z.open)==null||et.call(Z,L,j.name||j.title||"",Q[j.id]||"",!0,j.id))},avatar:Q[j.id]||"",onAvatar:pt,onRename:R,onEditUrl:$,onDelete:it},"cloud:"+j.id))]}),!re&&!le&&Lt&&Lt.length===0&&!(Y!=null&&Y.length)&&u.jsx("div",{className:"empty",style:{marginTop:14},children:r("teams.emptyHint","还没有团队 — 安装本地 cicy-code 起一个本地 team,或在云端创建。")})]})]}),u.jsx(ap,{}),u.jsx(lp,{}),u.jsx(dp,{})]})}function ip({onClose:s}){const[b,_]=x.useState(null),[d,E]=x.useState(""),[k,M]=x.useState(!1),[q,T]=x.useState(""),m=typeof window<"u"&&window.cicy&&window.cicy.trustedOrigins||null,J=x.useCallback(async()=>{try{_(m&&await m.list()||[])}catch{_([])}},[m]);x.useEffect(()=>{J()},[J]);const U=async()=>{const I=d.trim();if(!(!I||k||!m)){M(!0),T("");try{const X=await m.add(I);X&&X.ok===!1?T(X.error||r("trustedSites.addFailed","添加失败")):(E(""),_(X&&X.origins||await m.list()))}catch(X){T(String(X&&X.message||X))}finally{M(!1)}}},at=async I=>{if(!(k||!m)){M(!0),T("");try{const X=await m.remove(I);X&&X.ok===!1?T(X.error||r("trustedSites.removeFailed","删除失败")):_(X&&X.origins||await m.list())}catch(X){T(String(X&&X.message||X))}finally{M(!1)}}},F={overlay:{position:"fixed",inset:0,zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.62)",backdropFilter:"blur(3px)"},card:{width:560,maxWidth:"94vw",maxHeight:"82vh",display:"flex",flexDirection:"column",background:"#101012",border:"1px solid rgba(255,255,255,.09)",borderRadius:16,boxShadow:"0 24px 64px rgba(0,0,0,.55)",overflow:"hidden",color:"#e4e4e7"},head:{display:"flex",alignItems:"center",gap:8,padding:"14px 16px",borderBottom:"1px solid rgba(255,255,255,.06)"},title:{margin:0,fontSize:15,fontWeight:600,flex:1},x:{background:"transparent",border:"none",color:"#a1a1aa",fontSize:16,cursor:"pointer",lineHeight:1,padding:4},warn:{margin:"14px 16px 0",padding:"10px 12px",fontSize:12.5,lineHeight:1.55,color:"#fca5a5",background:"rgba(239,68,68,.08)",border:"1px solid rgba(239,68,68,.25)",borderRadius:10},addRow:{display:"flex",gap:8,padding:"12px 16px 4px"},input:{flex:1,minWidth:0,background:"#161618",border:"1px solid rgba(255,255,255,.1)",borderRadius:9,padding:"9px 11px",color:"#e4e4e7",fontSize:13,outline:"none"},addBtn:{background:"rgba(255,255,255,.1)",border:"none",borderRadius:9,padding:"0 16px",color:"#fff",fontSize:13,fontWeight:500,cursor:"pointer"},err:{margin:"6px 16px 0",fontSize:12,color:"#fca5a5"},listWrap:{margin:"10px 16px 16px",border:"1px solid rgba(255,255,255,.07)",borderRadius:10,overflow:"auto",flex:1,minHeight:80},row:{display:"flex",alignItems:"center",gap:10,padding:"9px 12px",borderTop:"1px solid rgba(255,255,255,.05)"},host:I=>({flex:1,fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:13,color:I?"#71717a":"#e4e4e7",wordBreak:"break-all"}),tag:{fontSize:11,color:"#71717a",background:"rgba(255,255,255,.05)",borderRadius:6,padding:"2px 7px"},rm:{background:"transparent",border:"none",color:"#a1a1aa",fontSize:12,cursor:"pointer",padding:"3px 6px",borderRadius:6},muted:{padding:"16px",textAlign:"center",color:"#71717a",fontSize:12.5}};return Sa.createPortal(u.jsx("div",{style:F.overlay,onMouseDown:I=>{I.target===I.currentTarget&&s()},"data-id":"TrustedSitesModal",children:u.jsxs("div",{style:F.card,onClick:I=>I.stopPropagation(),children:[u.jsxs("div",{style:F.head,children:[u.jsx("h2",{style:F.title,children:r("trustedSites.title","受信任站点")}),u.jsx("button",{type:"button",style:F.x,onClick:s,"aria-label":"close",children:"✕"})]}),u.jsx("div",{style:F.warn,children:r("trustedSites.warn","⚠ 列表中的站点可以在你的电脑上执行命令(exec)。只添加你完全信任的地址。")}),u.jsxs("div",{style:F.addRow,children:[u.jsx("input",{"data-id":"trusted-sites-input",style:F.input,value:d,onChange:I=>E(I.target.value),onKeyDown:I=>{I.key==="Enter"&&U()},placeholder:r("trustedSites.placeholder","添加站点,如 app.cicy-ai.com 或 my-cloud.example.org")}),u.jsx("button",{type:"button","data-id":"trusted-sites-add",style:{...F.addBtn,opacity:k||!d.trim()?.5:1},onClick:U,disabled:k||!d.trim(),children:r("trustedSites.add","添加")})]}),q&&u.jsx("div",{style:F.err,children:q}),u.jsx("div",{style:F.listWrap,children:b===null?u.jsx("div",{style:F.muted,children:r("trustedSites.loading","加载中…")}):b.length===0?u.jsx("div",{style:F.muted,children:r("trustedSites.empty","暂无")}):b.map(I=>u.jsxs("div",{style:F.row,"data-id":"trusted-sites-row",children:[u.jsx("span",{style:F.host(I.builtin),children:I.host}),I.builtin?u.jsx("span",{style:F.tag,children:r("trustedSites.builtin","系统")}):u.jsx("button",{type:"button",style:F.rm,onClick:()=>at(I.host),disabled:k,children:r("trustedSites.remove","删除")})]},I.host))})]})}),document.body)}function up({onClose:s}){const[b,_]=x.useState(null),[d,E]=x.useState(""),[k,M]=x.useState(""),[q,T]=x.useState(!1),m=typeof window<"u"&&window.cicy&&window.cicy.rpcAudit||null,J=x.useCallback(async()=>{T(!0),E("");try{const B=m&&await m.tail(400);!B||B.ok===!1?(E(B&&B.error||r("audit.loadFailed","读取失败")),_([])):(_(B.entries||[]),M(B.path||""))}catch(B){E(String(B&&B.message||B)),_([])}finally{T(!1)}},[m]);x.useEffect(()=>{J()},[J]);const[U,at]=x.useState("all"),[F,I]=x.useState(""),X=B=>{try{return new Date(B).toLocaleString()}catch{return B||""}},dt=B=>{if(B.kind==="auth"){const Lt=/deny/.test(B.decision||"");return{text:B.decision||"auth",color:Lt?"#fca5a5":"#86efac",bg:Lt?"rgba(239,68,68,.14)":"rgba(34,197,94,.14)"}}if(B.kind==="rpc"){const Lt=B.ok!==!1&&!B.error;return{text:Lt?"ok":"err",color:Lt?"#86efac":"#fca5a5",bg:Lt?"rgba(34,197,94,.14)":"rgba(239,68,68,.14)"}}return{text:B.kind||"log",color:"#a1a1aa",bg:"rgba(255,255,255,.06)"}},_t=B=>B.kind==="auth"?`${B.gate||""}${B.decision?" · "+B.decision:""}`:B.kind==="rpc"?`${B.tool||""}${B.dangerous?" ⚠":""}`:B.kind||"",It=B=>B.error||B.args||(B.kind==="rpc"?B.channel:"")||"",ht=b||[],Gt=F.trim().toLowerCase(),lt=ht.filter(B=>U!=="all"&&B.kind!==U?!1:Gt?[B.origin,B.host,B.tool,B.gate,B.decision,B.channel,B.args,B.error,B.kind].filter(Boolean).join(" ").toLowerCase().includes(Gt):!0),wt="186px 104px minmax(160px,1.1fr) minmax(150px,1.1fr) minmax(220px,1.8fr)",G={overlay:{position:"fixed",inset:0,zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.66)",backdropFilter:"blur(4px)"},card:{width:"96vw",height:"92vh",maxWidth:1480,display:"flex",flexDirection:"column",background:"#0d0d0f",border:"1px solid rgba(255,255,255,.09)",borderRadius:18,boxShadow:"0 32px 80px rgba(0,0,0,.6)",overflow:"hidden",color:"#e4e4e7"},head:{display:"flex",alignItems:"center",gap:14,padding:"20px 24px",borderBottom:"1px solid rgba(255,255,255,.07)"},titleWrap:{flex:1,minWidth:0},title:{margin:0,fontSize:21,fontWeight:650,letterSpacing:.2},subtitle:{margin:"3px 0 0",fontSize:12.5,color:"#71717a",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",wordBreak:"break-all"},count:{fontSize:12.5,color:"#a1a1aa",whiteSpace:"nowrap"},refresh:{background:"rgba(255,255,255,.1)",border:"none",borderRadius:9,padding:"9px 16px",color:"#fff",fontSize:13,fontWeight:500,cursor:"pointer"},x:{background:"transparent",border:"none",color:"#a1a1aa",fontSize:20,cursor:"pointer",lineHeight:1,padding:6},toolbar:{display:"flex",alignItems:"center",gap:10,padding:"14px 24px",borderBottom:"1px solid rgba(255,255,255,.05)"},chips:{display:"flex",gap:6},chip:B=>({background:B?"rgba(255,255,255,.14)":"transparent",border:"1px solid rgba(255,255,255,.12)",borderRadius:999,padding:"6px 16px",color:B?"#fff":"#a1a1aa",fontSize:13,cursor:"pointer"}),search:{flex:1,minWidth:0,background:"#161618",border:"1px solid rgba(255,255,255,.1)",borderRadius:10,padding:"10px 14px",color:"#e4e4e7",fontSize:13.5,outline:"none"},err:{margin:"10px 24px 0",fontSize:12.5,color:"#fca5a5"},tableWrap:{flex:1,overflow:"auto",margin:"0"},theadRow:{position:"sticky",top:0,zIndex:1,display:"grid",gridTemplateColumns:wt,gap:16,padding:"12px 24px",background:"#141417",borderBottom:"1px solid rgba(255,255,255,.08)",fontSize:11.5,letterSpacing:.6,textTransform:"uppercase",color:"#71717a",fontWeight:600},row:{display:"grid",gridTemplateColumns:wt,gap:16,padding:"13px 24px",borderBottom:"1px solid rgba(255,255,255,.045)",alignItems:"center"},time:{fontSize:12.5,color:"#a1a1aa",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",whiteSpace:"nowrap"},badge:B=>({justifySelf:"start",fontSize:11.5,color:B.color,background:B.bg,borderRadius:7,padding:"3px 10px",whiteSpace:"nowrap",fontWeight:500}),cell:{fontSize:13,color:"#d4d4d8",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",wordBreak:"break-all"},detail:{fontSize:12.5,color:"#8b8b93",wordBreak:"break-all"},muted:{padding:"60px 24px",textAlign:"center",color:"#71717a",fontSize:14}},ot=B=>u.jsx("div",{children:B});return Sa.createPortal(u.jsx("div",{style:G.overlay,onMouseDown:B=>{B.target===B.currentTarget&&s()},"data-id":"AuditLogModal",children:u.jsxs("div",{style:G.card,onClick:B=>B.stopPropagation(),children:[u.jsxs("div",{style:G.head,children:[u.jsxs("div",{style:G.titleWrap,children:[u.jsx("h2",{style:G.title,children:r("audit.title","审计日志")}),k&&u.jsx("p",{style:G.subtitle,children:k})]}),u.jsxs("span",{style:G.count,children:[r("audit.count","共")," ",lt.length,U!=="all"||Gt?` / ${ht.length}`:""]}),u.jsx("button",{type:"button","data-id":"audit-refresh",style:{...G.refresh,opacity:q?.5:1},onClick:J,disabled:q,children:r("audit.refresh","刷新")}),u.jsx("button",{type:"button",style:G.x,onClick:s,"aria-label":"close",children:"✕"})]}),u.jsxs("div",{style:G.toolbar,children:[u.jsxs("div",{style:G.chips,children:[u.jsx("button",{type:"button",style:G.chip(U==="all"),onClick:()=>at("all"),children:r("audit.all","全部")}),u.jsx("button",{type:"button",style:G.chip(U==="rpc"),onClick:()=>at("rpc"),children:r("audit.rpc","RPC 调用")}),u.jsx("button",{type:"button",style:G.chip(U==="auth"),onClick:()=>at("auth"),children:r("audit.auth","授权决定")})]}),u.jsx("input",{"data-id":"audit-search",style:G.search,value:F,onChange:B=>I(B.target.value),placeholder:r("audit.search","搜索来源 / 工具 / 命令…")})]}),d&&u.jsx("div",{style:G.err,children:d}),u.jsxs("div",{style:G.tableWrap,children:[u.jsxs("div",{style:G.theadRow,children:[ot(r("audit.colTime","时间")),ot(r("audit.colType","类型")),ot(r("audit.colSource","来源")),ot(r("audit.colOp","操作")),ot(r("audit.colDetail","详情"))]}),b===null?u.jsx("div",{style:G.muted,children:r("audit.loading","加载中…")}):lt.length===0?u.jsx("div",{style:G.muted,children:ht.length===0?r("audit.empty","暂无审计记录"):r("audit.noMatch","无匹配记录")}):lt.map((B,Lt)=>{const Pt=dt(B);return u.jsxs("div",{style:G.row,"data-id":"audit-row",children:[u.jsx("span",{style:G.time,children:X(B.ts)}),u.jsx("span",{style:G.badge(Pt),children:Pt.text}),u.jsx("span",{style:G.cell,children:B.origin||B.host||"—"}),u.jsx("span",{style:G.cell,children:_t(B)||"—"}),u.jsx("span",{style:G.detail,children:It(B)||"—"})]},Lt)})]})]})}),document.body)}function cp({me:s,welcome:b,onLogout:_,mitmTeam:d}){const E=(s==null?void 0:s.display_name)||(s==null?void 0:s.username)||"…",k=E.slice(0,1).toUpperCase(),[M,q]=x.useState(!1),[T,m]=x.useState(!1),[J,U]=x.useState(!1),[at,F]=x.useState(!1),[I,X]=x.useState(!1),[dt,_t]=x.useState(""),It=x.useRef(null);x.useEffect(()=>{var wt,G,ot;let lt=!0;return(ot=(G=(wt=window.cicy)==null?void 0:wt.app)==null?void 0:G.getVersion)==null||ot.call(G).then(B=>{lt&&_t(typeof B=="string"?B:String((B==null?void 0:B.desktop)||""))}).catch(()=>{}),()=>{lt=!1}},[]),x.useEffect(()=>{if(!M)return;const lt=wt=>{It.current&&!It.current.contains(wt.target)&&q(!1)};return document.addEventListener("mousedown",lt),()=>document.removeEventListener("mousedown",lt)},[M]);const ht=lt=>{_i(lt),q(!1)},Gt=async()=>{var lt,wt,G;q(!1),X(!0),Nt.show({id:"app-update",message:r("updateBanner.checking","正在检查更新…"),status:"running"});try{const ot=await((G=(wt=(lt=window.cicy)==null?void 0:lt.app)==null?void 0:wt.checkUpdate)==null?void 0:G.call(wt));(ot==null?void 0:ot.status)==="available"?Nt.show({id:"app-update",message:r("updateBanner.available","发现新版本 v{{v}}",{v:ot.version}),status:"done",ttl:4e3}):(ot==null?void 0:ot.status)==="up-to-date"?Nt.show({id:"app-update",message:r("updateBanner.upToDate","已是最新版本 v{{v}}",{v:ot.version||ot.current}),status:"done",ttl:3e3}):Nt.show({id:"app-update",message:r("updateBanner.error","更新失败")+(ot!=null&&ot.error?`:${ot.error}`:""),status:"error",ttl:5e3})}catch(ot){Nt.show({id:"app-update",message:ot.message,status:"error",ttl:5e3})}finally{X(!1)}};return u.jsxs(u.Fragment,{children:[u.jsx("header",{className:"topbar",children:u.jsxs("div",{className:"user-chip","data-id":"UserChip",ref:It,children:[b&&u.jsx("span",{className:"welcome",children:b}),s?u.jsxs("button",{type:"button","data-id":"UserChip-trigger",className:`user-chip__trigger${M?" is-open":""}`,onClick:()=>q(lt=>!lt),children:[u.jsx("div",{className:"avatar",children:k}),u.jsx("span",{className:"user-name",children:E}),u.jsx("span",{className:"user-chip__caret","aria-hidden":!0,children:"▾"})]}):u.jsxs("div",{className:"user-chip__trigger user-chip__trigger--skel","data-id":"UserChip-skeleton","aria-hidden":!0,children:[u.jsx("div",{className:"skel skel--avatar"}),u.jsx("div",{className:"skel skel--name"})]}),M&&u.jsxs("div",{className:"user-chip__menu","data-id":"UserChip-menu",role:"menu",children:[u.jsx("button",{type:"button","data-id":"UserChip-wallet",className:"user-chip__menu-item",onClick:()=>ht("?view=wallet"),children:r("userMenu.wallet","我的钱包")}),u.jsx("button",{type:"button","data-id":"UserChip-billing",className:"user-chip__menu-item",onClick:()=>ht("?view=usage"),children:r("userMenu.billing","我的账单")}),u.jsx("button",{type:"button","data-id":"UserChip-trusted-sites",className:"user-chip__menu-item",onClick:()=>{q(!1),m(!0)},children:r("trustedSites.menu","受信任站点")}),u.jsx("button",{type:"button","data-id":"UserChip-audit-log",className:"user-chip__menu-item",onClick:()=>{q(!1),U(!0)},children:r("audit.menu","审计日志")}),u.jsx("button",{type:"button","data-id":"UserChip-terms",className:"user-chip__menu-item",onClick:()=>{q(!1),F(!0)},children:r("firstRunTerms.menu","用户协议")}),u.jsx("button",{type:"button","data-id":"UserChip-check-update",className:"user-chip__menu-item",disabled:I,onClick:Gt,children:I?r("updateBanner.checkingShort","检查中…"):r("updateBanner.checkBtn","检查更新")}),!1,u.jsx("div",{className:"user-chip__menu-sep","aria-hidden":!0}),u.jsx("button",{type:"button","data-id":"UserChip-logout",className:"user-chip__menu-item is-danger",onClick:()=>{q(!1),_()},children:r("userMenu.logout","退出")}),u.jsxs("div",{className:"user-chip__menu-version","data-id":"UserChip-version",children:["CiCy Desktop ",dt?`v${dt}`:"…"]})]})]})}),T&&u.jsx(ip,{onClose:()=>m(!1)}),J&&u.jsx(up,{onClose:()=>U(!1)}),at&&u.jsx(Am,{onClose:()=>F(!1)})]})}function Am({onAgree:s,onClose:b}){var I;const[_,d]=x.useState(!1),[E,k]=x.useState(!1),M=(((I=window.cicyI18n)==null?void 0:I.locale)||"en").startsWith("zh")?"zh-CN":"en",q=(X,dt)=>r(`firstRunTerms.${X}`,dt),T=!!b,m=x.useMemo(()=>Py(Fy(M)),[M]),J=X=>{const dt=X.currentTarget;dt.scrollHeight-dt.scrollTop-dt.clientHeight<24&&d(!0)},U=x.useRef(null);x.useEffect(()=>{const X=U.current;X&&X.scrollHeight<=X.clientHeight+24&&d(!0)},[]);const at=async()=>{var X,dt,_t;if(!(E||!_)){k(!0);try{await((_t=(dt=(X=window.cicy)==null?void 0:X.terms)==null?void 0:dt.agree)==null?void 0:_t.call(dt,Em)),s==null||s()}catch{s==null||s()}}},F=()=>{var X,dt,_t;try{(_t=(dt=(X=window.cicy)==null?void 0:X.terms)==null?void 0:dt.decline)==null||_t.call(dt)}catch{}};return u.jsxs("div",{className:T?"terms-gate terms-gate--review":"shell terms-gate","data-id":"FirstRunTermsGate",style:T?{position:"fixed",inset:0,zIndex:1e3,background:"rgba(8,9,14,.72)",backdropFilter:"blur(4px)"}:void 0,onClick:T?X=>{X.target===X.currentTarget&&b()}:void 0,children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"terms-gate__panel",children:[u.jsx("h1",{className:"terms-gate__title","data-id":"FirstRunTermsGate-title",children:q("title","用户协议与授权说明")}),u.jsx("p",{className:"terms-gate__subtitle",children:q("subtitle","使用 CiCy Desktop 前,请阅读并同意以下条款")}),u.jsx("div",{className:"terms-gate__body",ref:U,onScroll:J,"data-id":"FirstRunTermsGate-body",children:u.jsx("div",{className:"terms-md","data-id":"FirstRunTermsGate-md",dangerouslySetInnerHTML:{__html:m}})}),T?u.jsx("div",{className:"terms-gate__actions",children:u.jsx("button",{"data-id":"FirstRunTermsGate-close",className:"terms-gate__btn",onClick:b,children:q("close","关闭")})}):u.jsxs(u.Fragment,{children:[!_&&u.jsx("div",{className:"terms-gate__scrollhint","data-id":"FirstRunTermsGate-scrollhint",children:q("scrollHint","请阅读至底部以继续")}),u.jsxs("div",{className:"terms-gate__actions",children:[u.jsx("button",{"data-id":"FirstRunTermsGate-decline",className:"terms-gate__btn terms-gate__btn--ghost",onClick:F,children:q("decline","不同意并退出")}),u.jsx("button",{"data-id":"FirstRunTermsGate-agree",className:"terms-gate__btn",disabled:!_||E,title:_?"":q("mustAgree","未同意则无法使用本软件。"),onClick:at,children:q("agree","同意并继续")})]})]})]})]})}const io=new Set;let bm=0,Bt=null;function zn(){io.forEach(s=>s(Bt))}const zt={open({onRetry:s,kind:b,source:_}={}){Bt={status:"running",phase:"install-docker",kind:b||"install",source:_||"op",logs:[],bars:{},minimized:!1,onRetry:s||null,lastAt:Date.now()},zn()},minimize(){Bt&&(Bt={...Bt,minimized:!0},zn())},restore(){Bt&&(Bt={...Bt,minimized:!1},zn())},push(s={}){var M;if(!Bt)return;const b=s.phase==="health"?"container":s.phase||Bt.phase,_={...Bt,phase:b,lastAt:Date.now()},d=Number.isFinite(s.progress),E=b==="install-docker"||b==="image";if(E&&(d||s.dest||s.url)){const q=((M=Bt.bars)==null?void 0:M[b])||{},T=d?s.progress:s.status==="skip"||s.status==="done"?100:q.progress;_.bars={...Bt.bars,[b]:{progress:T,received:s.received??q.received,total:s.total??q.total,url:s.url||q.url,dest:s.dest||q.dest}}}if(!(s.status==="running"&&d&&E)){const q=Bt.logs[Bt.logs.length-1],T=s.status||"running",m=s.message||"";if(!(q&&q.phase===b&&q.status===T&&q.message===m)){const J={id:++bm,t:xi(),phase:b,status:T,message:m};_.logs=[...Bt.logs,J]}}Bt=_,zn()},finish({ok:s,message:b,status:_}={}){if(!Bt||Bt.status!=="running")return;const d=_||(s?"done":"error"),E=d==="error"?Bt.phase:"done",k={id:++bm,t:xi(),phase:E,status:d,message:b||(s?"完成":"失败")};Bt={...Bt,status:d,phase:E,minimized:!1,logs:[...Bt.logs,k],lastAt:Date.now()},zn()},close(){Bt=null,zn()}},eo=[["install-docker","准备环境"],["image","下载运行环境"],["container","启动服务"],["done","完成"]],sp={"install-docker":"准备",image:"下载",container:"启动",health:"启动",done:"完成",open:"打开"},op={"install-docker":"Docker Desktop",image:"基础镜像"};function vm(s){return Number.isFinite(s)?s<1024?s+" B":s<1048576?(s/1024).toFixed(0)+" KB":s<1073741824?(s/1048576).toFixed(1)+" MB":(s/1073741824).toFixed(2)+" GB":"?"}function rp({phaseKey:s,bar:b}){const _=Number.isFinite(b==null?void 0:b.progress)?Math.max(0,Math.min(100,b.progress)):0,d=_>=100;return u.jsxs("div",{className:"dlbar","data-id":`DockerDrawer-dlbar-${s}`,children:[u.jsxs("div",{className:"dlbar__head",children:[u.jsx("span",{className:"dlbar__name",children:op[s]||s}),u.jsxs("span",{className:"dlbar__pct",children:[_,"%",b!=null&&b.total?` · ${vm(b.received)} / ${vm(b.total)}`:""]})]}),u.jsx("div",{className:"dlbar__track",children:u.jsx("div",{className:`dlbar__fill${d?" is-done":""}`,style:{width:`${_}%`}})}),(b==null?void 0:b.url)&&u.jsxs("div",{className:"dlbar__url",title:b.url,children:[u.jsx("span",{className:"dlbar__urlk",children:"源"})," ",b.url]}),(b==null?void 0:b.dest)&&u.jsxs("div",{className:"dlbar__url",title:b.dest,children:[u.jsx("span",{className:"dlbar__urlk",children:"存"})," ",b.dest]})]})}function dp(){var T;const[s,b]=x.useState(Bt);x.useEffect(()=>(io.add(b),()=>{io.delete(b)}),[]);const _=x.useRef(null);if(x.useEffect(()=>{const m=_.current;m&&(m.scrollTop=m.scrollHeight)},[(T=s==null?void 0:s.logs)==null?void 0:T.length]),!s)return null;const d=s.status==="running",E=s.kind==="open",k=eo.findIndex(([m])=>m===s.phase),M=E?[]:["install-docker","image"].filter(m=>{var J;return(J=s.bars)==null?void 0:J[m]}),q=E?r("docker.openTitle","打开 Docker 团队"):r("docker.setupTitle","安装 Docker cicy-code");if(s.minimized){const m=M.map(U=>{var at;return(at=s.bars[U])==null?void 0:at.progress}).filter(Number.isFinite),J=m.length?Math.round(m.reduce((U,at)=>U+at,0)/m.length):null;return u.jsxs("button",{type:"button",className:`drawer-min drawer-min--${s.status}`,"data-id":"DockerDrawer-restore",onClick:()=>zt.restore(),children:[u.jsx("span",{className:"drawer-min__spark",children:d?u.jsx(Ye,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("span",{className:"drawer-min__label",children:[q,J!=null?` · ${J}%`:""]})]})}return u.jsx("div",{className:"drawer-scrim","data-id":"DockerDrawer-scrim",onClick:()=>d?zt.minimize():zt.close(),children:u.jsxs("div",{className:"drawer","data-id":"DockerDrawer","data-status":s.status,onClick:m=>m.stopPropagation(),children:[u.jsxs("div",{className:"drawer__head",children:[u.jsxs("div",{className:"drawer__title",children:[u.jsx("span",{className:`drawer__spark drawer__spark--${s.status}`,children:d?u.jsx(Ye,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("div",{children:[u.jsx("div",{className:"drawer__h",children:q}),u.jsx("div",{className:"drawer__sub",children:"127.0.0.1:8008"})]})]}),u.jsx("div",{className:"drawer__headbtns",children:u.jsx("button",{type:"button",className:"drawer__x","data-id":"DockerDrawer-min",title:r("common.minimize","最小化"),onClick:()=>zt.minimize(),"aria-label":"minimize",children:"‒"})})]}),!E&&u.jsx("div",{className:"drawer__steps","data-id":"DockerDrawer-steps",children:eo.map(([m,J],U)=>{const at=s.status==="done"||k>=0&&U<k,F=U===k&&d,I=s.status==="error"&&U===k;return u.jsxs("div",{className:`drawer__step${F?" is-active":""}${at?" is-done":""}${I?" is-error":""}`,children:[u.jsx("span",{className:"drawer__step-dot",children:at?"✓":I?"!":U+1}),u.jsx("span",{className:"drawer__step-label",children:J}),U<eo.length-1&&u.jsx("span",{className:"drawer__step-bar"})]},m)})}),M.length>0&&u.jsx("div",{className:"drawer__dlbars","data-id":"DockerDrawer-dlbars",children:M.map(m=>u.jsx(rp,{phaseKey:m,bar:s.bars[m]},m))}),d&&s.logs.length>0&&u.jsxs("div",{className:"drawer__now","data-id":"DockerDrawer-now",children:[u.jsx(Ye,{}),u.jsx("span",{children:s.logs[s.logs.length-1].message})]}),u.jsx("div",{className:"drawer__log drawer__log--scroll","data-id":"DockerDrawer-log",ref:_,children:s.logs.length===0?u.jsx("div",{className:"drawer__log-empty",children:r("docker.preparing","准备中…")}):s.logs.map(m=>u.jsxs("div",{className:"drawer__line","data-status":m.status,children:[u.jsx("span",{className:"drawer__t",children:m.t}),u.jsx("span",{className:`drawer__badge drawer__badge--${m.phase}`,children:r(`dockerBadge.${m.phase}`,sp[m.phase]||m.phase)}),u.jsx("span",{className:"drawer__linemsg",children:m.message})]},m.id))}),u.jsx("div",{className:"drawer__foot",children:d?u.jsx(u.Fragment,{children:u.jsx("span",{className:"drawer__foot-status",children:E?r("docker.opening","打开中…"):r("docker.installing2","安装进行中…")})}):s.status==="reboot"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-reboot",children:r("docker.rebootShort","需重启 Windows")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>zt.close(),children:r("common.close","关闭")})]}):s.status==="error"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-error",children:E?r("docker.openFailed","打开失败"):r("docker.failed","安装失败")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>zt.close(),children:r("common.close","关闭")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("docker.ready","已就绪")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-finish",onClick:()=>zt.close(),children:r("common.done","完成")})]})})]})})}function fp({dockerTeam:s,cloudTitle:b,cloudCode:_,onOpen:d,onRename:E,onRefresh:k}){var Be;const[M,q]=x.useState(null),[T,m]=x.useState(""),[J,U]=x.useState(!1),[at,F]=x.useState(!1),[I,X]=x.useState(!1),[dt,_t]=x.useState([]),[It,ht]=x.useState(!1),[Gt,lt]=x.useState(""),[wt,G]=x.useState(!1),[ot,B]=x.useState(""),Lt=b||"Docker 团队",Pt=R=>{var $;($=R==null?void 0:R.stopPropagation)==null||$.call(R),B(Lt),G(!0)},re=async()=>{G(!1);const R=String(ot||"").trim();if(!(!R||R===Lt||!E))try{await E(R),k==null||k()}catch{}},[he,le]=x.useState({top:0,left:0}),Zt=x.useRef(null),z=x.useRef(null),Y=184,ct="#2496ed",yt=x.useCallback(async()=>{var R,$,it;try{const tt=await((it=($=(R=window.cicy)==null?void 0:R.docker)==null?void 0:$.appStatus)==null?void 0:it.call($));q(tt);const Et=Date.now()-((Bt==null?void 0:Bt.lastAt)||0)>3e4;tt!=null&&tt.running&&Bt&&Bt.status==="running"&&Bt.kind!=="open"&&Et&&zt.finish({ok:!0,message:"Docker cicy-code 已就绪"})}catch(tt){console.warn("[DockerCard]",tt)}},[]);x.useEffect(()=>{yt();const R=setInterval(()=>{T||yt()},12e3);return()=>clearInterval(R)},[yt,T]);const Dt=x.useCallback(async()=>{var R,$,it;U(!1),lt("");try{const tt=await((it=($=(R=window.cicy)==null?void 0:R.docker)==null?void 0:$.getPorts)==null?void 0:it.call($));_t(((tt==null?void 0:tt.ports)||[]).map(String))}catch{_t([])}X(!0)},[]),h=x.useCallback(async()=>{var tt,Et,At,ne,g,K,gt,P,ut;const R=new Set,$=[];for(const rt of dt){const mt=String(rt).trim();if(!mt)continue;const Ce=Number(mt);if(!Number.isInteger(Ce)||Ce<1||Ce>65535||Ce===8008||R.has(Ce)){lt(r("docker.ports.invalid","有端口无效(1-65535,不能是 8008,不能重复)"));return}R.add(Ce),$.push(Ce)}lt(""),ht(!0),X(!1),m("recreate"),zt.open({onRetry:h});const it=(At=(Et=(tt=window.cicy)==null?void 0:tt.docker)==null?void 0:Et.onAppProgress)==null?void 0:At.call(Et,rt=>zt.push(rt));try{const rt=await((K=(g=(ne=window.cicy)==null?void 0:ne.docker)==null?void 0:g.setPorts)==null?void 0:K.call(g,$));if(zt.finish({ok:!!(rt!=null&&rt.ok),message:rt!=null&&rt.ok?r("docker.ports.save","保存并重建")+" ✅":(rt==null?void 0:rt.error)||r("docker.opFailed","操作失败")}),rt!=null&&rt.ok)try{const mt=await((ut=(P=(gt=window.cicy)==null?void 0:gt.docker)==null?void 0:P.appRedetect)==null?void 0:ut.call(P));mt&&q(mt)}catch{}}catch(rt){zt.finish({ok:!1,message:rt.message})}finally{try{it&&it()}catch{}ht(!1),m(""),yt()}},[dt,yt]);x.useEffect(()=>{if(!J)return;const R=it=>{var tt,Et;(tt=Zt.current)!=null&&tt.contains(it.target)||(Et=z.current)!=null&&Et.contains(it.target)||U(!1)},$=it=>{it.key==="Escape"&&U(!1)};return document.addEventListener("mousedown",R),document.addEventListener("keydown",$),()=>{document.removeEventListener("mousedown",R),document.removeEventListener("keydown",$)}},[J]);const N=()=>{if(!J&&Zt.current){const R=Zt.current.getBoundingClientRect(),$=Math.max(8,Math.min(R.right-Y,window.innerWidth-Y-8));le({top:Math.round(R.bottom+4),left:Math.round($)})}U(R=>!R)},Q=x.useCallback(async()=>{var $,it,tt,Et,At,ne;m("bootstrap"),zt.open({onRetry:Q});const R=(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.onAppProgress)==null?void 0:tt.call(it,g=>zt.push(g));try{const g=await((ne=(At=(Et=window.cicy)==null?void 0:Et.docker)==null?void 0:At.appBootstrap)==null?void 0:ne.call(At));(g==null?void 0:g.reason)==="installer_launched"?zt.finish({status:"reboot",message:r("docker.installerLaunched","已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」")}):(g==null?void 0:g.reason)==="wsl_reboot_required"?zt.finish({status:"reboot",message:r("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):zt.finish({ok:!!(g!=null&&g.ok),message:g!=null&&g.ok?r("docker.ready","Docker cicy-code 已就绪"):(g==null?void 0:g.error)||r("docker.failed","安装失败")}),g!=null&&g.ok&&(k==null||k())}catch(g){zt.finish({ok:!1,message:g.message})}finally{try{R&&R()}catch{}m(""),yt()}},[yt,k]),W=x.useCallback(async()=>{var $,it,tt,Et,At,ne;m("repair"),zt.open({onRetry:W});const R=(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.onAppProgress)==null?void 0:tt.call(it,g=>zt.push(g));try{const g=await((ne=(At=(Et=window.cicy)==null?void 0:Et.docker)==null?void 0:At.appRepairWsl)==null?void 0:ne.call(At));g!=null&&g.needsReboot?zt.finish({status:"reboot",message:r("docker.wslNeedReboot","WSL 服务卡死,请【重启 Windows】;重启后打开 CiCy 会自动修复(旧数据已改名备份,不删)。")}):g!=null&&g.ok?(zt.finish({ok:!0,message:r("docker.wslRepaired","WSL 已修复 ✅")}),k==null||k()):zt.finish({ok:!1,message:(g==null?void 0:g.error)||r("docker.repairFailed","修复失败")})}catch(g){zt.finish({ok:!1,message:g.message})}finally{try{R&&R()}catch{}m(""),yt()}},[yt,k]),pt=x.useCallback(async()=>{var $,it,tt,Et,At,ne;U(!1),m("upgrade"),zt.open({onRetry:pt});const R=(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.onAppProgress)==null?void 0:tt.call(it,g=>zt.push(g));try{const g=await((ne=(At=(Et=window.cicy)==null?void 0:Et.docker)==null?void 0:At.appUpgrade)==null?void 0:ne.call(At));(g==null?void 0:g.reason)==="wsl_reboot_required"?zt.finish({status:"reboot",message:r("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):zt.finish({ok:!!(g!=null&&g.ok),message:g!=null&&g.ok?r("docker.upgraded","已升级到最新"):(g==null?void 0:g.error)||r("docker.upgradeFailed","升级失败")}),g!=null&&g.ok&&(k==null||k())}catch(g){zt.finish({ok:!1,message:g.message})}finally{try{R&&R()}catch{}m(""),yt()}},[yt,k]),vt=x.useCallback(async()=>{var $,it,tt,Et,At,ne,g,K,gt,P,ut,rt;U(!1),m("update"),zt.open({onRetry:vt});const R=(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.onAppProgress)==null?void 0:tt.call(it,mt=>zt.push(mt));try{const mt=await((ne=(At=(Et=window.cicy)==null?void 0:Et.docker)==null?void 0:At.appUpdate)==null?void 0:ne.call(At));if(zt.finish({ok:!!(mt!=null&&mt.ok),message:mt!=null&&mt.ok?r("docker.updated","cicy-code 已更新到最新"):(mt==null?void 0:mt.error)||r("docker.updateFailed","更新失败")}),mt!=null&&mt.ok){k==null||k();try{(gt=(K=(g=window.cicy)==null?void 0:g.tabs)==null?void 0:K.reloadIfOpen)==null||gt.call(K,"http://127.0.0.1:8008",r("docker.teamTab","Docker 团队"))}catch{}try{const Ce=await((rt=(ut=(P=window.cicy)==null?void 0:P.docker)==null?void 0:ut.appRedetect)==null?void 0:rt.call(ut));Ce&&q(Ce)}catch{}}}catch(mt){zt.finish({ok:!1,message:mt.message})}finally{try{R&&R()}catch{}m(""),yt()}},[yt,k]),St=x.useCallback(async(R,$,it)=>{U(!1),m(R),Nt.show({id:"docker-op",message:r(`docker.${R}ing`,R==="restart"?"重启中…":R==="reload"?"刷新中…":"停止中…"),status:"running"});try{const tt=await $();tt!=null&&tt.ok?Nt.show({id:"docker-op",message:it,status:"done",ttl:2500}):Nt.show({id:"docker-op",message:(tt==null?void 0:tt.error)||r("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(tt){Nt.show({id:"docker-op",message:tt.message,status:"error",ttl:6e3})}finally{m(""),yt()}},[yt]),ue=x.useCallback(async()=>{U(!1),m("authssh"),Nt.show({id:"docker-op",message:r("docker.authorizingHost","授权容器访问 Mac(配置 SSH)…"),status:"running"});try{const R=await window.cicy.docker.appAuthorizeHostSsh();R!=null&&R.ok?Nt.show({id:"docker-op",message:R.verified?r("docker.authorizedHostOk","已授权:容器内 `ssh mac` 可访问 Mac ✅"):r("docker.authorizedHostPartial","公钥已写入 Mac(未验证成功,可在容器内手动 `ssh mac` 试)"),status:R.verified?"done":"error",ttl:5e3}):Nt.show({id:"docker-op",message:(R==null?void 0:R.error)||r("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(R){Nt.show({id:"docker-op",message:R.message,status:"error",ttl:6e3})}finally{m(""),yt()}},[yt]),Rt=((Be=window.cicy)==null?void 0:Be.platform)||(M==null?void 0:M.platform);if(Rt!=="win32")return null;const ge=M?!!M.running:(s==null?void 0:s.status)==="running",V=!!(M!=null&&M.dockerRunning),Yt=!!(M!=null&&M.installed),we=!!(M!=null&&M.unknown)&&!ge&&!V&&!Yt,qt=!!(M!=null&&M.wslUnmanaged),Ne=!!(M!=null&&M.wslWedged),Fe=ge&&!qt,Ge=Fe?"ok":Ne||qt||V||Yt||we?"warn":"off",be=!!T;Ne?r("docker.wslWedged","WSL 卡死 · 点「修复 WSL」"):qt?r("docker.wslBrokenRepair","WSL 管理异常 · 点「修复 WSL」重装"):ge?r("docker.running","运行中"):V?r("docker.notRunning","未启动 · 点「启动」"):Yt?r("docker.engineDown","Docker 未运行 · 点启动"):we?r("docker.wslUnresponsive","WSL 未响应 · 点「重试检测」"):r("docker.notInstalled","Docker Desktop 未安装");const Ca=T==="open"?r("docker.opening","打开中…"):T==="probe"?r("docker.probing","检测中…"):be?r("docker.working","处理中…"):Fe?r("localTeams.open","打开"):Ne||qt?r("docker.repairWsl","修复 WSL"):V?r("docker.start","启动"):Yt?r("docker.startDocker","启动 Docker"):we?r("docker.retryProbe","重试检测"):r("docker.install","下载安装"),je=async()=>{var R,$,it,tt,Et,At,ne,g,K,gt,P,ut;if(!be){if(Ne){W();return}if(qt){Q();return}if(Fe){try{const mt=await((it=($=(R=window.cicy)==null?void 0:R.tabs)==null?void 0:$.activateIfOpen)==null?void 0:it.call($,"http://127.0.0.1:8008"));if(mt!=null&&mt.active)return}catch{}m("open");let rt=null;try{rt=await((At=(Et=(tt=window.cicy)==null?void 0:tt.docker)==null?void 0:Et.appOpen)==null?void 0:At.call(Et))}catch(mt){rt={ok:!1,hint:(mt==null?void 0:mt.message)||r("docker.openFailed","打开失败"),log:[]}}m(""),rt&&rt.ok===!1&&(zt.open({onRetry:je,kind:"open"}),(rt.log||[]).forEach(mt=>zt.push(mt)),zt.finish({ok:!1,message:rt.hint||rt.error||r("docker.openFailed","打开失败")}));return}if(we){m("probe");try{const rt=await(((K=(g=(ne=window.cicy)==null?void 0:ne.docker)==null?void 0:g.appRedetect)==null?void 0:K.call(g))??((ut=(P=(gt=window.cicy)==null?void 0:gt.docker)==null?void 0:P.appStatus)==null?void 0:ut.call(P)));rt&&q(rt),rt!=null&&rt.unknown&&Nt.show({id:"docker-probe",status:"error",message:r("docker.wslStillStuck","WSL 仍无响应 —— 多半要重启 Windows 后再试"),ttl:6e3})}catch{Nt.show({id:"docker-probe",status:"error",message:r("docker.probeFailed","检测失败,请重试"),ttl:5e3})}finally{m("")}return}Q()}},He=ge;return u.jsxs("div",{"data-id":"DockerCard",className:`bcard bcard--docker${ge?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent",style:{background:ct}}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",style:{color:ct},children:[u.jsx("span",{className:"bcard__dot","data-tone":Ge}),u.jsx("svg",{style:{width:18,height:18},viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:u.jsx("path",{d:"M21.81 10.25c-.06-.05-.67-.51-1.95-.51-.34 0-.68.03-1.01.09-.25-1.69-1.64-2.51-1.7-2.55l-.34-.2-.22.32a4.5 4.5 0 0 0-.59 1.4c-.23.94-.09 1.83.39 2.59-.58.32-1.51.4-1.7.41H2.62a.61.61 0 0 0-.61.61 9.32 9.32 0 0 0 .57 3.35 4.9 4.9 0 0 0 1.95 2.53c.92.52 2.42.82 4.12.82.77 0 1.54-.07 2.3-.21a9.6 9.6 0 0 0 3-1.09 8.3 8.3 0 0 0 2.05-1.68c.98-1.11 1.56-2.35 1.99-3.45h.17c1.36 0 2.2-.55 2.66-1l.13-.16zM4.7 11.33h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H4.7a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.46 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16M7.16 9.06h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16"})})]}),He&&u.jsxs("div",{className:"bcard__menuwrap",onClick:R=>R.stopPropagation(),children:[u.jsx("button",{type:"button",ref:Zt,"data-id":"DockerCard-menu-btn",className:"bcard__kebab",title:r("docker.manage","管理 Docker cicy-code"),disabled:be,onClick:N,children:be?u.jsx(Ye,{}):u.jsx(oo,{})}),J&&Sa.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"DockerCard-menu",role:"menu",ref:z,style:{position:"fixed",top:he.top,left:he.left,width:Y},onClick:R=>R.stopPropagation(),children:[u.jsx("button",{type:"button","data-id":"DockerCard-update",className:"bcard__menu-item is-accent",onClick:vt,children:r("docker.update","更新 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-restart",className:"bcard__menu-item",onClick:()=>St("restart",()=>window.cicy.docker.appRestart(),r("docker.restarted","已重启 cicy-code")),children:r("docker.restart","重启 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-stop",className:"bcard__menu-item is-danger",onClick:()=>St("stop",()=>window.cicy.docker.appStop(),r("docker.stopped","已停止 cicy-code")),children:r("docker.stop","停止 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-reload",className:"bcard__menu-item",onClick:R=>{var $,it,tt;R.stopPropagation(),U(!1),(tt=(it=($=window.cicy)==null?void 0:$.tabs)==null?void 0:it.reloadIfOpen)==null||tt.call(it,"http://127.0.0.1:8008","Docker 团队")},children:r("docker.reloadWindow","刷新窗口")}),u.jsx("button",{type:"button","data-id":"DockerCard-open-dir",className:"bcard__menu-item",onClick:R=>{var $,it,tt;R.stopPropagation(),U(!1),(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.openDir)==null||tt.call(it)},children:r("docker.openWslDir","打开 WSL 目录")}),u.jsx("button",{type:"button","data-id":"DockerCard-open-projects",className:"bcard__menu-item",onClick:R=>{var $,it,tt;R.stopPropagation(),U(!1),(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.openDir)==null||tt.call(it,"projects")},children:r("docker.openProjectsDir","打开项目目录")}),u.jsx("button",{type:"button","data-id":"DockerCard-billing",className:"bcard__menu-item",onClick:()=>{U(!1),_i(_||s!=null&&s.cloud_team_id?`?team=${encodeURIComponent(_||s.cloud_team_id)}`:"?view=usage")},children:r("docker.billing","帐单")}),u.jsx("div",{className:"bcard__menu-sep","data-id":"DockerCard-menu-sep",role:"separator","aria-hidden":!0}),Rt==="darwin"&&u.jsx("button",{type:"button","data-id":"DockerCard-authorize-host-ssh",className:"bcard__menu-item",title:r("docker.authorizeHostHint","把容器公钥加到 Mac 的 authorized_keys,容器内 `ssh mac` 即可访问本机"),onClick:ue,children:r("docker.authorizeHost","授权容器访问 Mac")}),u.jsx("button",{type:"button","data-id":"DockerCard-docker-restart",className:"bcard__menu-item",onClick:()=>St("restart",()=>window.cicy.docker.appDockerRestart(),r("docker.dockerRestarted","已重启 Docker 容器")),children:r("docker.dockerRestart","重启 Docker")}),u.jsx("button",{type:"button","data-id":"DockerCard-ports",className:"bcard__menu-item",onClick:R=>{R.stopPropagation(),Dt()},children:r("docker.ports.menu","端口设置")}),u.jsx("button",{type:"button","data-id":"DockerCard-recreate",className:"bcard__menu-item is-danger",onClick:R=>{R.stopPropagation(),U(!1),F(!0)},children:r("docker.recreate","重建 Docker")})]}),document.body)]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(so,{size:24,avatar:s==null?void 0:s.avatar,name:Lt,teamId:s==null?void 0:s.id,onChanged:k}),wt?u.jsx("input",{"data-id":"DockerCard-rename-input",autoFocus:!0,value:ot,onChange:R=>B(R.target.value),onFocus:R=>R.target.select(),onBlur:re,onClick:R=>R.stopPropagation(),onKeyDown:R=>{R.nativeEvent.isComposing||R.keyCode===229||(R.key==="Enter"?re():R.key==="Escape"&&G(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:E?r("localTeams.renameHint","点名字或 ✎ 改名"):Lt,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:E?Pt:void 0,children:[u.jsx("span",{onClick:E?Pt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:E?"text":"default"},children:Lt}),E&&u.jsx("button",{type:"button","data-id":"DockerCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:Pt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsxs("div",{className:"bcard__meta",children:[u.jsx("span",{className:"bcard__chip",children:"Docker"}),(M==null?void 0:M.version)&&u.jsxs("span",{className:"bcard__ver","data-id":"DockerCard-ver",style:{marginLeft:8,fontSize:11,opacity:.6},children:["v",M.version]})]})]}),u.jsxs("button",{type:"button",className:"bcard__cta","data-id":"DockerCard-cta",disabled:be,onClick:je,style:ge?void 0:{background:ct,color:"white"},children:[be?u.jsx(Ye,{}):u.jsx(Hu,{}),u.jsx("span",{children:Ca})]}),at&&Sa.createPortal(u.jsx("div",{"data-id":"DockerCard-recreate-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:R=>{R.target===R.currentTarget&&F(!1)},children:u.jsxs("div",{onClick:R=>R.stopPropagation(),style:{width:360,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[u.jsx("h3",{style:{margin:"0 0 8px",fontSize:16,color:"#e6edf3"},children:r("docker.recreate","重建 Docker")}),u.jsx("p",{style:{margin:"0 0 18px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:r("docker.recreateConfirm","会删除当前容器并重新创建(volume 数据保留),用于切换为独立 team 的网关 key。确定重建?")}),u.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[u.jsx("button",{type:"button","data-id":"DockerCard-recreate-cancel",onClick:()=>F(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:r("common.cancel","取消")}),u.jsx("button",{type:"button","data-id":"DockerCard-recreate-confirm",onClick:()=>{F(!1),St("restart",()=>window.cicy.docker.appRecreate(),r("docker.recreated","已重建 Docker 容器"))},style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#da3633",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:r("docker.recreateOk","确定重建")})]})]})}),document.body),I&&Sa.createPortal(u.jsx("div",{"data-id":"DockerCard-ports-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:R=>{R.target===R.currentTarget&&X(!1)},children:u.jsxs("div",{onClick:R=>R.stopPropagation(),style:{width:420,maxWidth:"92vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[u.jsx("h3",{style:{margin:"0 0 6px",fontSize:16,color:"#e6edf3"},children:r("docker.ports.title","端口设置")}),u.jsx("p",{style:{margin:"0 0 14px",fontSize:12.5,lineHeight:1.6,color:"#9aa4b2"},children:r("docker.ports.sub","除 :8008 外,额外发布、可从 Windows 直达容器内服务的端口")}),u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"8px 10px",marginBottom:10,borderRadius:8,background:"#0d1117",border:"1px solid #21262d",color:"#7d8590",fontSize:13},children:["🔒 ",r("docker.ports.mainFixed",":8008 · cicy-code(固定)")]}),u.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8,maxHeight:220,overflowY:"auto"},children:[dt.length===0&&u.jsx("div",{style:{fontSize:12.5,color:"#6e7681",padding:"4px 2px"},children:r("docker.ports.none","暂无额外端口")}),dt.map((R,$)=>u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[u.jsx("input",{"data-id":`DockerCard-port-input-${$}`,type:"text",inputMode:"numeric",value:R,placeholder:r("docker.ports.ph","端口号 1-65535"),onChange:it=>{const tt=it.target.value.replace(/[^0-9]/g,"");_t(Et=>Et.map((At,ne)=>ne===$?tt:At)),lt("")},style:{flex:1,padding:"7px 10px",borderRadius:8,border:"1px solid #30363d",background:"#0d1117",color:"#e6edf3",fontSize:13,fontFamily:"var(--mono)"}}),u.jsx("button",{type:"button","data-id":`DockerCard-port-remove-${$}`,title:r("docker.ports.remove","移除"),onClick:()=>{_t(it=>it.filter((tt,Et)=>Et!==$)),lt("")},style:{padding:"6px 10px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#da3633",cursor:"pointer",fontSize:14},children:"✕"})]},$))]}),u.jsx("button",{type:"button","data-id":"DockerCard-port-add",onClick:()=>_t(R=>[...R,""]),style:{marginTop:10,padding:"7px 12px",borderRadius:8,border:"1px dashed #30363d",background:"transparent",color:"#58a6ff",cursor:"pointer",fontSize:13,width:"100%"},children:r("docker.ports.add","+ 添加端口")}),Gt&&u.jsx("div",{style:{marginTop:10,fontSize:12.5,color:"#f85149"},children:Gt}),u.jsx("p",{style:{margin:"12px 0 16px",fontSize:11.5,lineHeight:1.5,color:"#6e7681"},children:r("docker.ports.hint","保存会重建容器(volume 数据保留),会有短暂中断")}),u.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[u.jsx("button",{type:"button","data-id":"DockerCard-ports-cancel",disabled:It,onClick:()=>X(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:r("docker.ports.cancel","取消")}),u.jsx("button",{type:"button","data-id":"DockerCard-ports-save",disabled:It,onClick:h,style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#238636",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:It?r("docker.ports.saving","保存中…"):r("docker.ports.save","保存并重建")})]})]})}),document.body)]})}function Sm({team:s,cloudCode:b,onOpen:_,onRename:d,onRefresh:E}){var tt,Et,At,ne;const M=(wm[s.status]||wm.error).tone,[q,T]=x.useState(!1),[m,J]=x.useState(s.name||""),[U,at]=x.useState(null),[F,I]=x.useState(""),X=U??s.name;x.useEffect(()=>{U!=null&&s.name===U&&at(null)},[s.name,U]);const dt=g=>{var K;(K=g==null?void 0:g.stopPropagation)==null||K.call(g),J(X||""),T(!0)},_t=async()=>{T(!1);const g=String(m||"").trim();if(!d||!g||g===X)return;at(g),I("saving");let K;try{K=await d(s.id,g)}catch(gt){K={ok:!1,error:gt==null?void 0:gt.message}}at(null),K&&K.ok?(I("saved"),setTimeout(()=>I(gt=>gt==="saved"?"":gt),1500)):(I(""),Nt.show({message:r("localTeams.renameFailed","改名没保存,已恢复"),status:"error",ttl:4e3}))},ht=!!((Et=(tt=window.cicy)==null?void 0:tt.sidecar)!=null&&Et.restart)&&uo(s.base_url),Gt=s.status==="running",[lt,wt]=x.useState(""),[G,ot]=x.useState(!1),[B,Lt]=x.useState(!1);x.useEffect(()=>{var g,K;!ht||!((K=(g=window.cicy)==null?void 0:g.sidecar)!=null&&K.getPublic)||window.cicy.sidecar.getPublic().then(gt=>Lt(!!(gt!=null&>.public))).catch(()=>{})},[ht]);const[Pt,re]=x.useState({running:void 0,latest:null,installed:null}),he=Pt.latest,le=Pt.running,[Zt,z]=x.useState(!1),Y=x.useRef(null),ct=x.useRef(null),yt=x.useRef(null),[Dt,h]=x.useState({top:0,left:0}),N=184,Q=()=>{if(!G&&ct.current){const g=ct.current.getBoundingClientRect(),K=Math.max(8,Math.min(g.right-N,window.innerWidth-N-8));h({top:Math.round(g.bottom+4),left:Math.round(K)})}ot(g=>!g)},W=x.useCallback(async(g=!1)=>{var K,gt;if(!(!ht||!((gt=(K=window.cicy)==null?void 0:K.sidecar)!=null&>.versions))){g&&z(!0);try{const P=await window.cicy.sidecar.versions();re({running:(P==null?void 0:P.running)??null,latest:(P==null?void 0:P.latest)??null,installed:(P==null?void 0:P.installed)??null}),g&&(P!=null&&P.running&&(P!=null&&P.latest)&&_m(P.latest,P.running)>0?Nt.show({message:`${r("sidecar.found","发现新版本")} v${P.latest}`,status:"done",ttl:2500}):P!=null&&P.running?Nt.show({message:`${r("sidecar.upToDate","已是最新")} v${P.running}`,status:"done",ttl:2500}):Nt.show({message:r("sidecar.notRunning","cicy-code 未运行"),status:"error",ttl:4e3}))}catch{g&&Nt.show({message:r("sidecar.checkFailed","检查更新失败"),status:"error",ttl:5e3})}finally{g&&z(!1)}}},[ht]);x.useEffect(()=>{W(!1)},[W]),x.useEffect(()=>{Gt&&W(!1)},[Gt,W]);const pt=!!(ht&&he&&le&&_m(he,le)>0),vt=!ht&&!!((ne=(At=window.cicy)==null?void 0:At.localTeams)!=null&&ne.remove),St=ht||vt,[ue,Rt]=x.useState(!1),[ge,V]=x.useState(!1),[Yt,we]=x.useState(""),[qt,Ne]=x.useState(!1),[Fe,Ge]=x.useState("");x.useEffect(()=>{if(!G)return;const g=K=>{var gt,P;(gt=ct.current)!=null&>.contains(K.target)||(P=yt.current)!=null&&P.contains(K.target)||ot(!1)};return document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[G]);const be=async()=>{var K,gt,P;if(qt)return;const g=String(Yt||"").trim();if(!g||g===(s.base_url||"")){V(!1);return}try{new URL(g)}catch{Ge(r("teams.badUrl","URL 无效(需含 http(s)://)"));return}Ge(""),Ne(!0);try{const ut=await((P=(gt=(K=window.cicy)==null?void 0:K.localTeams)==null?void 0:gt.update)==null?void 0:P.call(gt,s.id,{base_url:g}));ut!=null&&ut.ok?(V(!1),E==null||E()):Ge(Ka((ut==null?void 0:ut.error)||"update failed"))}catch(ut){Ge(Ka((ut==null?void 0:ut.message)||String(ut)))}Ne(!1)},Ca=async()=>{var K,gt,P;if(lt)return;Rt(!1),wt("remove");const g="op-"+Date.now();Nt.show({id:g,message:r("localTeams.removing","删除中…"),status:"running"});try{const ut=await((P=(gt=(K=window.cicy)==null?void 0:K.localTeams)==null?void 0:gt.remove)==null?void 0:P.call(gt,s.id));ut!=null&&ut.ok?Nt.show({id:g,message:r("localTeams.removed","已删除"),status:"done",ttl:3e3}):Nt.show({id:g,message:r("localTeams.removeFailed","删除失败")+(ut!=null&&ut.error?": "+ut.error:""),status:"error",ttl:7e3})}catch(ut){Nt.show({id:g,message:r("localTeams.removeFailed","删除失败")+": "+((ut==null?void 0:ut.message)||ut),status:"error",ttl:7e3})}wt(""),E==null||E()},je=`sidecar-op:${s.id}`,He=async(g,K,gt)=>{var rt,mt,Ce,za,Sl;if(ot(!1),lt)return;wt(g);const P=g==="update";let ut=null;P?(me.open({teamId:s.id,fromVer:le,toVer:he,onRetry:()=>He("update",K,gt)}),(mt=(rt=window.cicy)==null?void 0:rt.sidecar)!=null&&mt.onOpProgress&&(ut=window.cicy.sidecar.onOpProgress(Wt=>{(Wt==null?void 0:Wt.op)==="update"&&me.push(Wt)}))):Nt.show({id:je,message:Be[g]||`${g}…`,status:"running",progress:void 0});try{const Wt=await K(),De=!!(Wt!=null&&Wt.ok),xa=Wt!=null&&Wt.warning?`${gt}(${Wt.warning})`:gt,ua=r("sidecar.failed","操作失败")+(Wt!=null&&Wt.error?`: ${Wt.error}`:"");if(P){if(me.finish({ok:De,message:De?xa:ua}),De)try{await((Sl=(za=(Ce=window.cicy)==null?void 0:Ce.localTeams)==null?void 0:za.reload)==null?void 0:Sl.call(za,s.id,{ignoreCache:!0}))}catch{}}else Nt.show({id:je,message:De?xa:ua,progress:void 0,status:De?"done":"error",ttl:De?4e3:8e3})}catch(Wt){const De=r("sidecar.failed","操作失败")+`: ${(Wt==null?void 0:Wt.message)||Wt}`;P?me.finish({ok:!1,message:De}):Nt.show({id:je,message:De,progress:void 0,status:"error",ttl:8e3})}finally{try{ut&&ut()}catch{}wt(""),E==null||E(),(g==="update"||g==="restart"||g==="start")&&W(!1)}},Be={start:r("busy.start","启动中…"),restart:r("busy.restart","重启中…"),update:r("busy.update","更新中…"),stop:r("busy.stop","停止中…")},R=async()=>{var gt,P,ut;wt("start"),me.open({teamId:s.id,title:r("sidecar.startTitle","启动 cicy-code"),onRetry:R}),me.push({phase:"download",status:"running",message:r("sidecar.starting","启动 cicy-code(首次需安装 Node + 依赖,日志见下)…")});const g=(ut=(P=(gt=window.cicy)==null?void 0:gt.sidecar)==null?void 0:P.onOpProgress)==null?void 0:ut.call(P,rt=>me.push(rt));let K;try{K=await window.cicy.sidecar.start()}catch(rt){K={ok:!1,error:(rt==null?void 0:rt.message)||String(rt)}}try{g==null||g()}catch{}return wt(""),E==null||E(),!(K!=null&&K.ok)||K!=null&&K.warning?(me.finish({ok:!1,message:r("sidecar.startFailed","启动失败")+(K!=null&&K.error?`: ${K.error}`:K!=null&&K.warning?`: ${K.warning}`:"")}),!1):(me.finish({ok:!0,message:r("sidecar.startedOk","cicy-code 已就绪")}),!0)},$=async()=>{var g,K;lt||!Gt&&ht&&((K=(g=window.cicy)==null?void 0:g.sidecar)!=null&&K.start)&&!await R()||_()},it=Gt?r("localTeams.open","打开"):ht?r("localTeams.startOpen","启动并打开"):r("localTeams.open","打开");return u.jsxs(u.Fragment,{children:[u.jsxs("div",{"data-id":"LocalTeamCard",className:`bcard ${ht?"bcard--local":"bcard--custom"}${M==="ok"?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent"}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":M}),u.jsx(bp,{})]}),St&&u.jsxs("div",{className:"bcard__menuwrap",ref:Y,onClick:g=>g.stopPropagation(),children:[u.jsx("button",{type:"button",ref:ct,"data-id":"LocalTeamCard-menu-btn",className:`bcard__kebab${pt?" has-dot":""}`,title:ht?r("localTeams.manage","管理本地 cicy-code"):r("localTeams.more","更多"),disabled:!!lt,onClick:Q,children:lt?u.jsx(Ye,{}):u.jsx(oo,{})}),G&&Sa.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"LocalTeamCard-menu",role:"menu",ref:yt,style:{position:"fixed",top:Dt.top,left:Dt.left,width:N},onClick:g=>g.stopPropagation(),children:[ht&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-check-update",className:"bcard__menu-item",disabled:Zt,onClick:g=>{g.stopPropagation(),W(!0)},children:Zt?r("sidecar.checking2","检查中…"):r("sidecar.checkUpdate","检查更新")}),pt&&u.jsxs("button",{type:"button","data-id":"LocalTeamCard-update",className:"bcard__menu-item is-accent",onClick:()=>He("update",()=>window.cicy.sidecar.update(),r("sidecar.updated","已更新到最新")),children:[r("sidecar.updateTo","更新到")," v",he]}),s.base_url&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-reload",className:"bcard__menu-item",onClick:g=>{var K,gt,P;g.stopPropagation(),ot(!1),(P=(gt=(K=window.cicy)==null?void 0:K.tabs)==null?void 0:gt.reloadIfOpen)==null||P.call(gt,s.base_url,s.name)},children:r("localTeams.reloadWindow","刷新窗口")}),ht&&Gt&&u.jsxs(u.Fragment,{children:[u.jsx("button",{type:"button","data-id":"LocalTeamCard-restart",className:"bcard__menu-item",onClick:()=>He("restart",()=>window.cicy.sidecar.restart(),r("sidecar.restarted","已重启")),children:r("sidecar.restart","重启")}),u.jsxs("button",{type:"button","data-id":"LocalTeamCard-lan",className:"bcard__menu-item",title:r("sidecar.lanHint","开启后同局域网设备可用本机 IP 访问(api_token 仍校验);切换会自动重启 cicy-code"),disabled:lt==="lan",onClick:async()=>{if(lt)return;const g=!B;ot(!1),wt("lan"),Lt(g),Nt.show({id:je,message:g?r("sidecar.lanEnabling","开启局域网访问,重启中…"):r("sidecar.lanDisabling","关闭局域网访问,重启中…"),status:"running",progress:void 0});try{const K=await window.cicy.sidecar.setPublic(g);K!=null&&K.ok?Nt.show({id:je,message:g?r("sidecar.lanOn","已开启局域网访问"):r("sidecar.lanOff","已关闭局域网访问"),status:"done",ttl:3e3}):Nt.show({id:je,message:r("sidecar.lanFailed","设置失败")+(K!=null&&K.error?`: ${K.error}`:""),status:"error",ttl:7e3})}catch(K){Nt.show({id:je,message:r("sidecar.lanFailed","设置失败")+`: ${(K==null?void 0:K.message)||K}`,status:"error",ttl:7e3})}try{const K=await window.cicy.sidecar.getPublic();Lt(!!(K!=null&&K.public))}catch{}wt(""),E==null||E()},children:[r("sidecar.lanAccess","局域网访问")," · ",B?r("common.on","开"):r("common.off","关")]}),u.jsx("button",{type:"button","data-id":"LocalTeamCard-stop",className:"bcard__menu-item is-danger",onClick:()=>He("stop",()=>window.cicy.sidecar.stop(),r("sidecar.stoppedDone","已停止")),children:r("sidecar.stop","停止")})]}),s.cloud_team_id&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-billing",className:"bcard__menu-item",onClick:g=>{g.stopPropagation(),ot(!1),_i(`?team=${encodeURIComponent(b||s.cloud_team_id)}`)},children:r("localTeams.billing","账单")}),vt&&u.jsxs(u.Fragment,{children:[u.jsx("button",{type:"button","data-id":"LocalTeamCard-edit-url",className:"bcard__menu-item",onClick:g=>{g.stopPropagation(),ot(!1),V(!0),we(s.base_url||"")},children:r("teamCard.editUrl","更改访问地址")}),u.jsx("button",{type:"button","data-id":"LocalTeamCard-remove",className:"bcard__menu-item is-danger",onClick:()=>{ot(!1),Rt(!0)},children:r("localTeams.remove","删除")})]}),(le||s.version)&&u.jsxs("div",{"data-id":"LocalTeamCard-version",className:"bcard__menu-item",style:{cursor:"default",color:"#8b949e",fontSize:12},children:[r("localTeams.version","版本")," v",le||s.version]})]}),document.body)]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(so,{size:24,avatar:s==null?void 0:s.avatar,name:s==null?void 0:s.name,teamId:s==null?void 0:s.id,onChanged:E}),q?u.jsx("input",{"data-id":"LocalTeamCard-rename-input",autoFocus:!0,value:m,onChange:g=>J(g.target.value),onFocus:g=>g.target.select(),onBlur:_t,onClick:g=>g.stopPropagation(),onKeyDown:g=>{g.nativeEvent.isComposing||g.keyCode===229||(g.key==="Enter"?_t():g.key==="Escape"&&T(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:r("localTeams.renameHint","点名字或 ✎ 改名"),style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:dt,children:[u.jsx("span",{"data-id":"LocalTeamCard-name-text",onClick:dt,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"text"},children:X}),F==="saving"&&u.jsx("span",{"data-id":"LocalTeamCard-save-state",title:r("localTeams.saving","保存中…"),style:{flex:"none",display:"inline-flex"},children:u.jsx(Ye,{})}),F==="saved"&&u.jsx("span",{"data-id":"LocalTeamCard-save-state",title:r("localTeams.saved","已保存"),style:{flex:"none",color:"#3fb950",fontSize:13,lineHeight:1},children:"✓"}),!F&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:dt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsx("div",{className:"bcard__meta",children:u.jsx("span",{className:"bcard__chip","data-id":"LocalTeamCard-kind",children:ht?r("localTeams.kindLocal","本地"):r("localTeams.kindCustom","自定义")})})]}),u.jsxs("button",{type:"button",className:"bcard__cta","data-id":"LocalTeamCard-open",disabled:!!lt||!s.base_url,onClick:$,children:[lt&<!=="stop"?u.jsx(Ye,{}):u.jsx(Hu,{}),u.jsx("span",{children:lt&&Be[lt]||it})]})]}),ge&&Sa.createPortal(u.jsx("div",{"data-id":"LocalTeamCard-url-modal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:g=>{!qt&&g.target===g.currentTarget&&V(!1)},children:u.jsxs("div",{onClick:g=>g.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("teamCard.editUrl","更改访问地址")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:s.name}),u.jsx("textarea",{"data-id":"LocalTeamCard-url-input",autoFocus:!0,rows:3,className:"login-email-input",style:{width:"100%",resize:"vertical",lineHeight:1.5,fontFamily:"var(--mono)"},value:Yt,placeholder:"https://example.com:8008",spellCheck:!1,disabled:qt,onChange:g=>we(g.target.value.replace(/[\r\n]+/g,"")),onKeyDown:g=>{g.nativeEvent.isComposing||g.keyCode===229||(g.key==="Enter"?(g.preventDefault(),be()):g.key==="Escape"&&V(!1))}}),Fe&&u.jsx("div",{className:"error",style:{marginTop:8,fontSize:12},children:Fe}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",disabled:qt,onClick:()=>V(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"LocalTeamCard-url-save",disabled:qt,onClick:be,children:qt?r("common.saving","保存中…"):r("common.save","保存")})]})]})}),document.body),u.jsx(Nm,{open:ue,title:r("localTeams.deleteTitle","删除团队"),message:r("localTeams.deleteMsg","确定删除「{{name}}」?此操作不可撤销。",{name:s.name}),confirmLabel:r("common.delete","删除"),danger:!0,onConfirm:Ca,onCancel:()=>Rt(!1)})]})}function uo(s){var b;try{if(((b=window.cicy)==null?void 0:b.platform)==="win32")return!1;const _=new URL(s);return(_.hostname==="127.0.0.1"||_.hostname==="localhost"||_.hostname==="::1")&&(_.port==="8008"||_.port==="")}catch{return!1}}function xm(s){var b;try{if(((b=window.cicy)==null?void 0:b.platform)!=="win32")return!1;const _=new URL(s);return(_.hostname==="127.0.0.1"||_.hostname==="localhost"||_.hostname==="::1")&&_.port==="8008"}catch{return!1}}function _m(s,b){const _=String(s).split("."),d=String(b).split(".");for(let E=0;E<Math.max(_.length,d.length);E++){const k=(parseInt(_[E],10)||0)-(parseInt(d[E],10)||0);if(k)return k>0?1:-1}return 0}const wm={running:{tone:"ok",label:"running",cta:r("localStatus.open","打开")},stopped:{tone:"off",label:"stopped",cta:r("localStatus.notRunning","未运行")},auth_error:{tone:"warn",label:"auth error",cta:r("localStatus.tokenInvalid","Token 失效")},misconfigured:{tone:"err",label:"bad config",cta:r("localStatus.badUrl","URL 错误")},error:{tone:"err",label:"error",cta:r("localStatus.error","异常")}};function Nm({open:s,title:b,message:_,confirmLabel:d,danger:E,onConfirm:k,onCancel:M}){return s?Sa.createPortal(u.jsx("div",{"data-id":"ConfirmModal",style:{position:"fixed",inset:0,zIndex:70,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:q=>{q.target===q.currentTarget&&(M==null||M())},children:u.jsxs("div",{onClick:q=>q.stopPropagation(),style:{width:360,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:6},children:b}),_&&u.jsx("div",{style:{fontSize:13,opacity:.7,marginBottom:16},children:_}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:M,children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"ConfirmModal-ok",style:E?{background:"#dc2626",borderColor:"#dc2626"}:{},onClick:k,children:d||r("common.confirm","确认")})]})]})}),document.body):null}function mp({team:s,onOpen:b,onRename:_,onEditUrl:d,onDelete:E,avatar:k,onAvatar:M}){const q=s.kind==="private",T=s.status==="active",m=s.name||s.title||"—",[J,U]=x.useState(!1),[at,F]=x.useState(""),[I,X]=x.useState(null),dt=I??m;x.useEffect(()=>{I!=null&&m===I&&X(null)},[m,I]);const _t=V=>{var Yt;(Yt=V==null?void 0:V.stopPropagation)==null||Yt.call(V),F(dt==="—"?"":dt),U(!0)},It=async()=>{U(!1);const V=String(at||"").trim();if(!(!_||!V||V===dt)){X(V);try{const Yt=await _(s.id,V);Yt!=null&&Yt.ok||X(null)}catch{X(null)}}},ht=s.host_url||"",[Gt,lt]=x.useState(!1),[wt,G]=x.useState(""),[ot,B]=x.useState(null),Lt=ot??ht;x.useEffect(()=>{ot!=null&&ht===ot&&B(null)},[ht,ot]);const Pt=s.teamId||s.id,re=q?r("teamKind.private","私有云"):s.team_kind==="personal"?r("teamKind.personal","个人"):r("teamKind.shared","共享"),he=q?Lt:s.workspace_url||s.workspace_direct_url,le=!!he,[Zt,z]=x.useState(!1),[Y,ct]=x.useState(!1),[yt,Dt]=x.useState({top:0,left:0}),h=x.useRef(null),N=x.useRef(null),Q=x.useRef(null),W=184,pt=()=>{if(!Zt&&N.current){const V=N.current.getBoundingClientRect(),Yt=Math.max(8,Math.min(V.right-W,window.innerWidth-W-8));Dt({top:Math.round(V.bottom+4),left:Math.round(Yt)})}z(V=>!V)};x.useEffect(()=>{if(!Zt)return;const V=Yt=>{var we,qt;(we=N.current)!=null&&we.contains(Yt.target)||(qt=Q.current)!=null&&qt.contains(Yt.target)||z(!1)};return document.addEventListener("mousedown",V),()=>document.removeEventListener("mousedown",V)},[Zt]);const vt=V=>{var Yt,we,qt,Ne;(Yt=V==null?void 0:V.stopPropagation)==null||Yt.call(V),le&&(z(!1),(Ne=(qt=(we=window.cicy)==null?void 0:we.tabs)==null?void 0:qt.reloadIfOpen)==null||Ne.call(qt,he,dt))},[St,ue]=x.useState(!1),Rt=()=>{G(ht),lt(!0),z(!1)},ge=async()=>{lt(!1);const V=String(wt||"").trim();if(!(!d||!V||V===ht)){B(V);try{const Yt=await d(s.id,V);Yt!=null&&Yt.ok||B(null)}catch{B(null)}}};return u.jsxs(u.Fragment,{children:[u.jsxs("div",{"data-id":"TeamCard",className:`bcard bcard--cloud${T?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent"}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":T?"ok":"off"}),u.jsx(vp,{})]}),u.jsxs("div",{className:"bcard__top-right",children:[s.is_trial&&u.jsx("span",{className:"bcard__badge",children:"trial"}),(le||Pt!=null||q&&d)&&u.jsxs("div",{className:"bcard__menuwrap",ref:h,onClick:V=>V.stopPropagation(),children:[u.jsx("button",{type:"button",ref:N,"data-id":"TeamCard-menu-btn",className:"bcard__kebab",title:r("localTeams.more","更多"),disabled:Y,onClick:pt,children:Y?u.jsx(Ye,{}):u.jsx(oo,{})}),Zt&&Sa.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"TeamCard-menu",role:"menu",ref:Q,style:{position:"fixed",top:yt.top,left:yt.left,width:W},onClick:V=>V.stopPropagation(),children:[le&&u.jsx("button",{type:"button","data-id":"TeamCard-reload",className:"bcard__menu-item",onClick:vt,children:r("localTeams.reloadWindow","刷新窗口")}),Pt!=null&&u.jsx("button",{type:"button","data-id":"TeamCard-billing",className:"bcard__menu-item",onClick:V=>{V.stopPropagation(),z(!1),_i(`?team=${encodeURIComponent(Pt)}`)},children:r("localTeams.billing","账单")}),q&&d&&u.jsx("button",{type:"button","data-id":"TeamCard-edit-url",className:"bcard__menu-item",onClick:V=>{V.stopPropagation(),Rt()},children:ht?r("teamCard.editUrl","更改访问地址"):r("teamCard.setUrl","填写访问地址")}),q&&E&&u.jsx("button",{type:"button","data-id":"TeamCard-delete",className:"bcard__menu-item is-danger",onClick:V=>{V.stopPropagation(),z(!1),ue(!0)},children:r("teamCard.delete","删除")})]}),document.body)]})]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(so,{size:24,avatar:k,name:(s==null?void 0:s.name)||(s==null?void 0:s.title),teamId:s==null?void 0:s.id,onChanged:M}),J?u.jsx("input",{"data-id":"TeamCard-rename-input",autoFocus:!0,value:at,onChange:V=>F(V.target.value),onFocus:V=>V.target.select(),onBlur:It,onClick:V=>V.stopPropagation(),onKeyDown:V=>{V.nativeEvent.isComposing||V.keyCode===229||(V.key==="Enter"?It():V.key==="Escape"&&U(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:_?r("localTeams.renameHint","点名字或 ✎ 改名"):dt,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:_?_t:void 0,children:[u.jsx("span",{onClick:_?_t:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:_?"text":"default"},children:dt}),_&&u.jsx("button",{type:"button","data-id":"TeamCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:_t,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsxs("div",{className:"bcard__meta",children:[u.jsx("span",{className:"bcard__chip",children:re}),!q&&s.membership_status&&s.membership_status!=="active"&&u.jsx("span",{className:"bcard__chip",children:s.membership_status})]})]}),u.jsxs("button",{type:"button",className:"bcard__cta",onClick:b,disabled:!le,children:[u.jsx(Hu,{}),u.jsx("span",{children:le?r("localTeams.open","打开"):q?r("teamCard.noHost","未填访问地址"):r("teamCard.noUrl","无 URL")})]})]}),Gt&&Sa.createPortal(u.jsx("div",{"data-id":"TeamCard-url-modal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:V=>{V.target===V.currentTarget&<(!1)},children:u.jsxs("div",{onClick:V=>V.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:ht?r("teamCard.editUrl","更改访问地址"):r("teamCard.setUrl","填写访问地址")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:dt}),u.jsx("textarea",{"data-id":"TeamCard-url-input",autoFocus:!0,rows:3,className:"login-email-input",style:{width:"100%",resize:"vertical",lineHeight:1.5,fontFamily:"var(--mono)"},value:wt,placeholder:"https://你的私有云地址:端口",spellCheck:!1,onChange:V=>G(V.target.value.replace(/[\r\n]+/g,"")),onKeyDown:V=>{V.nativeEvent.isComposing||V.keyCode===229||(V.key==="Enter"?(V.preventDefault(),ge()):V.key==="Escape"&<(!1))}}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:()=>lt(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"TeamCard-url-save",onClick:ge,children:r("common.save","保存")})]})]})}),document.body),u.jsx(Nm,{open:St,title:r("localTeams.deleteTitle","删除团队"),message:r("localTeams.deleteMsg","确定删除「{{name}}」?此操作不可撤销。",{name:dt}),confirmLabel:r("common.delete","删除"),danger:!0,onConfirm:async()=>{ue(!1),E&&await E(s)},onCancel:()=>ue(!1)})]})}function ao(){return u.jsxs("div",{className:"brand",children:[u.jsx("div",{className:"brand-mark",children:u.jsx(gp,{})}),u.jsxs("div",{className:"brand-text",children:[u.jsx("div",{className:"brand-name",children:"CiCy Desktop"}),u.jsx("div",{className:"brand-sub",children:r("app.brandSub","团队 AI 协作工作台")})]})]})}function hp(){const[s,b]=x.useState(null),[_,d]=x.useState(!1),E=x.useRef(!1);x.useEffect(()=>{var m,J,U,at,F,I;let q=!0;(U=(J=(m=window.cicy)==null?void 0:m.app)==null?void 0:J.updateState)==null||U.call(J).then(X=>{q&&b(X)}).catch(()=>{});const T=(I=(F=(at=window.cicy)==null?void 0:at.app)==null?void 0:F.onUpdateState)==null?void 0:I.call(F,X=>{b(X),E.current&&(X.status==="downloading"?me.setProgress(X.progress||{}):X.status==="ready"?me.ready({onInstall:()=>{var dt,_t,It;return(It=(_t=(dt=window.cicy)==null?void 0:dt.app)==null?void 0:_t.installUpdate)==null?void 0:It.call(_t)}}):X.status==="error"&&(me.finish({ok:!1,message:X.error||r("updateBanner.error","更新失败")}),E.current=!1))});return()=>{q=!1;try{T&&T()}catch{}}},[]);const k=s==null?void 0:s.status;x.useEffect(()=>{d(!1)},[k]);const M=()=>{var q,T,m;E.current=!0,d(!0),me.open({kind:"app",title:r("updateBanner.drawerTitle","应用更新"),fromVer:s==null?void 0:s.current,toVer:s==null?void 0:s.version,onRetry:M}),me.push({phase:"download",status:"running",message:r("updateBanner.startDl","开始下载安装包…")}),me.setProgress({percent:0}),(m=(T=(q=window.cicy)==null?void 0:q.app)==null?void 0:T.downloadUpdate)==null||m.call(T)};return k!=="available"||_?null:Sa.createPortal(u.jsx("div",{"data-id":"UpdateBanner",style:{position:"fixed",inset:0,zIndex:1e4,background:"rgba(0,0,0,0.6)",backdropFilter:"blur(3px)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:q=>{q.target===q.currentTarget&&d(!0)},children:u.jsxs("div",{onClick:q=>q.stopPropagation(),style:{width:380,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:14,padding:"24px 24px 20px",boxShadow:"0 20px 60px rgba(0,0,0,0.55)",textAlign:"center"},children:[u.jsx("div",{style:{fontSize:34,lineHeight:1,marginBottom:12},"aria-hidden":!0,children:"🚀"}),u.jsx("h3",{style:{margin:"0 0 8px",fontSize:17,color:"#e6edf3"},"data-id":"UpdateBanner-text",children:r("updateBanner.available","发现新版本 v{{v}}",{v:s.version})}),u.jsx("p",{style:{margin:"0 0 20px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:r("updateBanner.modalSub","建议尽快更新到最新版本")}),u.jsxs("div",{style:{display:"flex",gap:10,justifyContent:"center"},children:[u.jsx("button",{type:"button","data-id":"UpdateBanner-later",onClick:()=>d(!0),style:{flex:1,padding:"9px 16px",borderRadius:9,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:14},children:r("updateBanner.later","稍后")}),u.jsx("button",{type:"button","data-id":"UpdateBanner-download",onClick:M,style:{flex:1,padding:"9px 16px",borderRadius:9,border:"none",background:"#238636",color:"white",cursor:"pointer",fontSize:14,fontWeight:600},children:r("updateBanner.updateNow","立即更新")})]})]})}),document.body)}function yp(){return u.jsxs("div",{className:"bcard bcard--skeleton","data-id":"SkeletonCard","aria-hidden":!0,children:[u.jsxs("div",{className:"bcard--skeleton__head",children:[u.jsx("div",{className:"skel skel--avatar"}),u.jsxs("div",{className:"bcard--skeleton__lines",children:[u.jsx("div",{className:"skel skel--line",style:{width:"58%"}}),u.jsx("div",{className:"skel skel--line",style:{width:"34%",height:10,marginTop:8}})]})]}),u.jsx("div",{className:"skel skel--cta"})]})}function pp(s){let b=0;for(let _=0;_<(s||"").length;_++)b=(b*31+s.charCodeAt(_))%360;return b}function so({avatar:s,name:b,teamId:_,onChanged:d,size:E=34}){const k=x.useRef(null),M=((b||"?").trim()[0]||"?").toUpperCase(),q=pp(_||b||""),T=m=>{const J=m.target.files&&m.target.files[0];if(m.target.value="",!J)return;const U=new FileReader;U.onload=async()=>{var at,F,I;try{await((I=(F=(at=window.cicy)==null?void 0:at.localTeams)==null?void 0:F.setAvatar)==null?void 0:I.call(F,_,U.result)),d&&d()}catch{}},U.readAsDataURL(J)};return u.jsxs("div",{"data-id":"TeamAvatar",className:"team-avatar",title:_?r("teamCard.changeAvatar","点击更换头像"):"",onClick:_?m=>{m.stopPropagation(),k.current&&k.current.click()}:void 0,style:{width:E,height:E,borderRadius:9,flex:"none",overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"center",cursor:_?"pointer":"default",background:s?"#0d1117":`hsl(${q} 52% 46%)`,color:"#fff",fontWeight:700,fontSize:Math.round(E*.42),userSelect:"none"},children:[s?u.jsx("img",{src:s,alt:"",style:{width:"100%",height:"100%",objectFit:"cover"}}):M,_&&u.jsx("input",{ref:k,type:"file",accept:"image/*",style:{display:"none"},onChange:T})]})}function gp(){return u.jsx("svg",{width:"22",height:"22",viewBox:"0 0 96 96",fill:"none",children:u.jsx("path",{d:"M48 11L39.5 33.3L16 29.5L31 48L16 66.5L39.5 62.7L48 85L56.5 62.7L80 66.5L65 48L80 29.5L56.5 33.3Z",fill:"white",stroke:"white",strokeWidth:"8",strokeLinejoin:"round",strokeLinecap:"round"})})}function Hu(){return u.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),u.jsx("polyline",{points:"12 5 19 12 12 19"})]})}function Ye(){return u.jsx("svg",{className:"spin",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.4",strokeLinecap:"round",children:u.jsx("path",{d:"M21 12a9 9 0 1 1-6.2-8.55"})})}function bp(){return u.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),u.jsx("line",{x1:"2",y1:"20",x2:"22",y2:"20"})]})}function oo(){return u.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[u.jsx("circle",{cx:"12",cy:"5",r:"1.7"}),u.jsx("circle",{cx:"12",cy:"12",r:"1.7"}),u.jsx("circle",{cx:"12",cy:"19",r:"1.7"})]})}function vp(){return u.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("circle",{cx:"12",cy:"12",r:"10"}),u.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),u.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}function Si(s){try{return localStorage.getItem(s)||null}catch{return null}}function Ka(s){return s?/timeout/i.test(s)?"登录超时,请重新点击 Login。":/state/i.test(s)?"校验失败,请重新登录。":/no token/i.test(s)?"登录未完成,请重试。":/bridge missing/i.test(s)?"无法连接到登录服务(preload 未就绪)。":s:""}var Tm;const Sp=((Tm=window.cicy)==null?void 0:Tm.platform)||(()=>{const s=navigator.userAgent||"";return/Mac/i.test(s)?"darwin":/Windows/i.test(s)?"win32":"linux"})();document.documentElement.dataset.platform=Sp;document.documentElement.dataset.fullscreen="0";var jm,Cm;(Cm=(jm=window.cicy)==null?void 0:jm.window)!=null&&Cm.onFullscreen&&window.cicy.window.onFullscreen(s=>{document.documentElement.dataset.fullscreen=s?"1":"0"});$y.createRoot(document.getElementById("root")).render(u.jsx(np,{}));
|
|
377
|
+
`)}const r=(s,b,_)=>{var E,k;const d=M=>_&&typeof M=="string"?M.replace(/\{\{\s*(\w+)\s*\}\}/g,(q,T)=>_[T]!=null?String(_[T]):q):M;try{const M=(k=(E=window.cicyI18n)==null?void 0:E.t)==null?void 0:k.call(E,s,_);return d(M&&M!==s?M:b)}catch{return d(b)}},Cn="cicy_token",Uu="cicy_access_token",Ru="cicy_user_id",Ll="https://cicy-ai.com",tp=1;async function _i(s){var _,d,E,k,M,q,T,m;const b=`${Ll}/dash${s}`;try{if((d=(_=window.cicy)==null?void 0:_.tabs)!=null&&d.openIn){await window.cicy.tabs.openIn(tp,b,"cicy-ai");return}(M=(k=(E=window.cicy)==null?void 0:E.shell)==null?void 0:k.openExternal)==null||M.call(k,b)}catch{try{(m=(T=(q=window.cicy)==null?void 0:q.shell)==null?void 0:T.openExternal)==null||m.call(T,b)}catch{}}}const lo=new Set;let ep=0,vl=[];const vi=new Map;function pm(){lo.forEach(s=>s(vl))}const Nt={show(s={}){const b=s.id||`t${++ep}`,_=vl.find(k=>k.id===b),d={id:b,status:"running",..._,...s};vl=_?vl.map(k=>k.id===b?d:k):[...vl,d],pm();const E=vi.get(b);return E&&(clearTimeout(E),vi.delete(b)),s.ttl&&vi.set(b,setTimeout(()=>Nt.dismiss(b),s.ttl)),b},dismiss(s){vl=vl.filter(_=>_.id!==s);const b=vi.get(s);b&&(clearTimeout(b),vi.delete(s)),pm()}};function ap(){const[s,b]=x.useState(vl);return x.useEffect(()=>(lo.add(b),()=>{lo.delete(b)}),[]),s.length?u.jsx("div",{className:"toast-host","data-id":"ToastHost",children:s.map(_=>u.jsxs("div",{className:"toast","data-id":`Toast-${_.id}`,"data-status":_.status||"running",children:[u.jsx("button",{type:"button",className:"toast__x","data-id":"Toast-dismiss",onClick:()=>Nt.dismiss(_.id),"aria-label":"dismiss",children:"×"}),u.jsxs("span",{className:"toast__msg",children:[_.message,Number.isFinite(_.progress)?` ${_.progress}%`:""]}),Number.isFinite(_.progress)&&u.jsx("span",{className:"toast__bar",children:u.jsx("span",{style:{width:`${Math.min(100,_.progress)}%`}})})]},_.id))}):null}const no=new Set;let Ps=0,Jt=null;function bl(){no.forEach(s=>s(Jt))}function xi(){return new Date().toTimeString().slice(0,8)}const me={open({teamId:s,fromVer:b,toVer:_,onRetry:d,title:E,kind:k}={}){Jt={teamId:s,title:E||null,fromVer:b||null,toVer:_||null,kind:k||"sidecar",status:"running",phase:"download",progress:null,onInstall:null,logs:[],onRetry:d||null,lastAt:Date.now()},bl()},setProgress(s){Jt&&(Jt={...Jt,status:"running",progress:s||Jt.progress,lastAt:Date.now()},bl())},ready({onInstall:s,message:b}={}){if(!Jt)return;const _={id:++Ps,t:xi(),phase:"done",status:"done",message:b||r("updateBanner.readyDrawer","下载完成,点「安装」重启更新")};Jt={...Jt,status:"ready",phase:"done",progress:{...Jt.progress||{},percent:100},onInstall:s||null,minimized:!1,logs:[...Jt.logs,_],lastAt:Date.now()},bl()},push(s={}){if(!Jt)return;const b={id:++Ps,t:xi(),phase:s.phase||Jt.phase,status:s.status||"running",message:s.message||""};Jt={...Jt,phase:s.phase||Jt.phase,toVer:s.toVer||Jt.toVer,logs:[...Jt.logs,b],lastAt:Date.now()},bl()},minimize(){Jt&&(Jt={...Jt,minimized:!0},bl())},restore(){Jt&&(Jt={...Jt,minimized:!1},bl())},finish({ok:s,message:b}={}){if(!Jt)return;const _=s?"done":"error",d={id:++Ps,t:xi(),phase:"done",status:_,message:b||(s?r("updateDrawer.done","更新完成"):r("updateDrawer.failed","更新失败"))};Jt={...Jt,status:_,phase:"done",minimized:!1,logs:[...Jt.logs,d],lastAt:Date.now()},bl()},close(){Jt=null,bl()}},to=["download","swap","done"],gm=s=>({download:r("updateDrawer.phaseDownload","下载"),swap:r("updateDrawer.phaseSwap","切换"),done:r("updateDrawer.phaseDone","完成")})[s]||s;function lp(){var q;const[s,b]=x.useState(Jt);x.useEffect(()=>(no.add(b),()=>{no.delete(b)}),[]);const _=x.useRef(null);x.useEffect(()=>{const T=_.current;T&&(T.scrollTop=T.scrollHeight)},[(q=s==null?void 0:s.logs)==null?void 0:q.length]);const[d,E]=x.useState(!1);if(x.useEffect(()=>{if(!s||s.status!=="running"){E(!1);return}const T=setInterval(()=>E(Date.now()-(s.lastAt||0)>25e3),3e3);return()=>clearInterval(T)},[s==null?void 0:s.lastAt,s==null?void 0:s.status]),!s)return null;const k=s.status==="running",M=to.findIndex(T=>T===s.phase);return s.minimized?u.jsxs("button",{type:"button",className:`drawer-min drawer-min--${s.status}`,"data-id":"UpdateDrawer-restore",onClick:()=>me.restore(),children:[u.jsx("span",{className:"drawer-min__spark",children:k?u.jsx(Ye,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("span",{className:"drawer-min__label",children:[s.title||r("updateDrawer.title","更新 cicy-code"),s.toVer?` · v${s.toVer}`:""]})]}):u.jsx("div",{className:"drawer-scrim","data-id":"UpdateDrawer-scrim",onClick:()=>k?me.minimize():me.close(),children:u.jsxs("div",{className:"drawer","data-id":"UpdateDrawer","data-status":s.status,onClick:T=>T.stopPropagation(),children:[u.jsxs("div",{className:"drawer__head",children:[u.jsxs("div",{className:"drawer__title",children:[u.jsx("span",{className:`drawer__spark drawer__spark--${s.status}`,children:k?u.jsx(Ye,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("div",{children:[u.jsx("div",{className:"drawer__h",children:s.title||r("updateDrawer.title","更新 cicy-code")}),u.jsxs("div",{className:"drawer__sub",children:[s.fromVer?`v${s.fromVer}`:r("updateDrawer.current","当前")," → ",s.toVer?`v${s.toVer}`:r("updateDrawer.latest","最新版")]})]})]}),u.jsx("div",{className:"drawer__headbtns",children:u.jsx("button",{type:"button",className:"drawer__x","data-id":"UpdateDrawer-min",title:r("updateDrawer.minimize","最小化"),onClick:()=>me.minimize(),"aria-label":"minimize",children:"‒"})})]}),s.kind!=="app"&&u.jsx("div",{className:"drawer__steps","data-id":"UpdateDrawer-steps",children:to.map((T,m)=>{const J=gm(T),U=s.status==="done"||m<M,at=m===M&&k,F=s.status==="error"&&m===M;return u.jsxs("div",{className:`drawer__step${at?" is-active":""}${U?" is-done":""}${F?" is-error":""}`,children:[u.jsx("span",{className:"drawer__step-dot",children:U?"✓":F?"!":m+1}),u.jsx("span",{className:"drawer__step-label",children:J}),m<to.length-1&&u.jsx("span",{className:"drawer__step-bar"})]},T)})}),s.progress&&(()=>{const T=s.progress,m=J=>J?(J/1048576).toFixed(1):"0";return u.jsxs("div",{className:"drawer__dl","data-id":"UpdateDrawer-dl",children:[u.jsxs("div",{className:"drawer__dl-head",children:[u.jsxs("span",{className:"drawer__dl-pct",children:[T.percent||0,"%"]}),u.jsxs("span",{className:"drawer__dl-stats",children:[T.total?`${m(T.transferred)} / ${m(T.total)} MB`:`${m(T.transferred)} MB`,T.bytesPerSec?` · ${m(T.bytesPerSec)} MB/s`:"",T.etaSec?` · ${r("updateBanner.eta","剩 {{s}}s",{s:T.etaSec})}`:""]})]}),u.jsx("div",{className:"drawer__dl-track",children:u.jsx("span",{className:"drawer__dl-fill",style:{width:`${T.percent||0}%`}})})]})})(),u.jsx("div",{className:"drawer__log","data-id":"UpdateDrawer-log",ref:_,children:s.logs.length===0?u.jsx("div",{className:"drawer__log-empty",children:r("updateDrawer.preparing","准备中…")}):s.logs.map(T=>u.jsxs("div",{className:"drawer__line","data-status":T.status,children:[u.jsx("span",{className:"drawer__t",children:T.t}),u.jsx("span",{className:`drawer__badge drawer__badge--${T.phase}`,children:gm(T.phase)}),u.jsx("span",{className:"drawer__linemsg",children:T.message})]},T.id))}),d&&k&&u.jsx("div",{className:"drawer__hint","data-id":"UpdateDrawer-stuck",children:r("updateDrawer.stuckHint","正在等待新版本就绪,耗时比平常久。可以放到后台继续,完成或失败都会提示。")}),u.jsx("div",{className:"drawer__foot",children:k?u.jsx(u.Fragment,{children:u.jsx("span",{className:"drawer__foot-status",children:s.kind==="app"?r("updateBanner.downloading","正在下载更新")+"…":r("updateDrawer.inProgress","更新进行中…")})}):s.status==="ready"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("updateBanner.readyShort","下载完成")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-install",onClick:()=>s.onInstall&&s.onInstall(),children:r("updateBanner.installBtn","立即安装")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-later",onClick:()=>me.close(),children:r("updateBanner.later","稍后")})]}):s.status==="error"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-error",children:r("updateDrawer.failed","更新失败")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-dismiss",onClick:()=>me.close(),children:r("common.close","关闭")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("updateDrawer.updatedLatest","已更新到最新")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-finish",onClick:()=>me.close(),children:r("common.done","完成")})]})})]})})}function np(){const[s,b]=x.useState(void 0);x.useEffect(()=>{var j,L;if(!((L=(j=window.cicy)==null?void 0:j.terms)!=null&&L.status)){b(!0);return}window.cicy.terms.status(Em).then(H=>b(!!(H!=null&&H.accepted))).catch(()=>b(!0))},[]),x.useEffect(()=>{var H,Z,et,Kt;const j=document.documentElement;try{j.setAttribute("data-platform",((H=window.cicy)==null?void 0:H.platform)||"linux")}catch{}j.setAttribute("data-fullscreen","0");let L;try{L=(Kt=(et=(Z=window.cicy)==null?void 0:Z.window)==null?void 0:et.onFullscreen)==null?void 0:Kt.call(et,jt=>j.setAttribute("data-fullscreen",jt?"1":"0"))}catch{}return()=>{try{L&&L()}catch{}}},[]),x.useEffect(()=>{var L,H;if(!((H=(L=window.cicy)==null?void 0:L.docker)!=null&&H.onAppProgress))return;const j=window.cicy.docker.onAppProgress(Z=>{!Z||Z.phase==="open"||(Bt||zt.open({source:"auto"}),(Bt==null?void 0:Bt.source)==="auto"&&(Z.phase==="done"&&(Z.status==="done"||Z.status==="reboot")?zt.finish({ok:Z.status==="done",status:Z.status==="reboot"?"reboot":void 0,message:Z.message}):Z.status==="error"?zt.finish({ok:!1,message:Z.message}):zt.push(Z)))});return()=>{try{j&&j()}catch{}}},[]);const[_,d]=x.useState(()=>Si(Cn)),[E,k]=x.useState(()=>Si(Uu)),[M,q]=x.useState(()=>Si(Ru)),[T,m]=x.useState(()=>!Si(Cn)),[J,U]=x.useState(!1),[at,F]=x.useState(!1),[I,X]=x.useState(""),[dt,_t]=x.useState(""),[It,ht]=x.useState(!1),[Gt,lt]=x.useState(""),[wt,G]=x.useState(""),[ot,B]=x.useState(null),[Lt,Pt]=x.useState(null),[re,he]=x.useState(!1),[le,Zt]=x.useState(""),z=x.useRef(!1),[Y,ct]=x.useState(null),[yt,Dt]=x.useState(!1),[h,N]=x.useState(!1),[Q,W]=x.useState({}),pt=x.useCallback(async()=>{var j,L,H;try{const Z=await((H=(L=(j=window.cicy)==null?void 0:j.localTeams)==null?void 0:L.avatars)==null?void 0:H.call(L));W(Z&&typeof Z=="object"?Z:{})}catch{}},[]),[vt,St]=x.useState(!1),[ue,Rt]=x.useState(!1),[ge,V]=x.useState(""),[Yt,we]=x.useState(""),[qt,Ne]=x.useState(!1),[Fe,Ge]=x.useState(""),[be,Ca]=x.useState("all"),je=x.useCallback(async(j,L)=>{var Z,et,Kt,jt;if(!j)return;if(!((et=(Z=window.cicy)==null?void 0:Z.cloud)!=null&&et.fetch)){Zt("cloud fetch bridge missing");return}he(!0),Zt("");const H={Authorization:`Bearer ${j}`};try{const[Ie,Le]=await Promise.all([window.cicy.cloud.fetch(`${Ll}/api/user/self`,{headers:H}),window.cicy.cloud.fetch(`${Ll}/api/teams`,{headers:H})]);if((Le==null?void 0:Le.status)===401){if(!z.current&&((jt=(Kt=window.cicy)==null?void 0:Kt.auth)!=null&&jt.loginStart)){z.current=!0,Zt(r("auth.sessionExpired","会话已过期,正在重新登录…"));try{await window.cicy.auth.loginStart()}catch{}}return}if(Le!=null&&Le.ok){const ze=JSON.parse(Le.body||"{}");Pt(Array.isArray(ze==null?void 0:ze.teams)?ze.teams:[])}if(Ie!=null&&Ie.ok)try{const ze=JSON.parse(Ie.body||"{}");B((ze==null?void 0:ze.success)===!1?null:(ze==null?void 0:ze.data)||null)}catch{B(null)}else B(null)}catch{Zt("")}finally{he(!1)}},[]),He=x.useRef("");x.useEffect(()=>{He.current=_||E||""},[_,E]);const Be=x.useCallback(async()=>{var L,H;const j=He.current;if(!(!j||!((H=(L=window.cicy)==null?void 0:L.cloud)!=null&&H.fetch)))try{const Z=await window.cicy.cloud.fetch(`${Ll}/api/teams`,{headers:{Authorization:`Bearer ${j}`}});if(Z!=null&&Z.ok){const et=JSON.parse(Z.body||"{}");Array.isArray(et==null?void 0:et.teams)&&Pt(et.teams)}}catch{}},[]),R=x.useCallback(async(j,L)=>{var et,Kt;const H=He.current,Z=String(L||"").trim();if(!H||!((Kt=(et=window.cicy)==null?void 0:et.cloud)!=null&&Kt.fetch)||!Z)return{ok:!1,error:"no session / empty"};try{const jt=await window.cicy.cloud.fetch(`${Ll}/api/teams/${j}`,{method:"PATCH",headers:{Authorization:`Bearer ${H}`,"Content-Type":"application/json"},body:JSON.stringify({title:Z})});return jt!=null&&jt.ok?(await Be(),{ok:!0}):{ok:!1,error:`${(jt==null?void 0:jt.status)||"?"} ${(jt==null?void 0:jt.error)||""}`}}catch(jt){return{ok:!1,error:jt.message}}},[Be]),$=x.useCallback(async(j,L)=>{var et,Kt;const H=He.current,Z=String(L||"").trim();if(!H||!((Kt=(et=window.cicy)==null?void 0:et.cloud)!=null&&Kt.fetch)||!Z)return{ok:!1,error:"no session / empty"};try{new URL(Z)}catch{return{ok:!1,error:"地址格式不对(需 http(s)://…)"}}try{const jt=await window.cicy.cloud.fetch(`${Ll}/api/teams/${j}`,{method:"PATCH",headers:{Authorization:`Bearer ${H}`,"Content-Type":"application/json"},body:JSON.stringify({hostUrl:Z})});return jt!=null&&jt.ok?(await Be(),{ok:!0}):{ok:!1,error:`${(jt==null?void 0:jt.status)||"?"} ${(jt==null?void 0:jt.error)||""}`}}catch(jt){return{ok:!1,error:jt.message}}},[Be]),it=x.useCallback(async j=>{var H,Z;const L=He.current;if(!L||!((Z=(H=window.cicy)==null?void 0:H.cloud)!=null&&Z.fetch)){Nt.show({message:r("common.noAuth","未登录"),status:"error",ttl:5e3});return}try{const et=await window.cicy.cloud.fetch(`${Ll}/api/teams/${j.id}`,{method:"DELETE",headers:{Authorization:`Bearer ${L}`}});et!=null&&et.ok||(et==null?void 0:et.status)===200||(et==null?void 0:et.status)===204?(Nt.show({message:r("teamCard.deleted","团队已删除"),status:"done",ttl:3e3}),await Be()):Nt.show({message:`${r("teamCard.deleteFailed","删除失败")}: ${(et==null?void 0:et.status)||"?"} ${(et==null?void 0:et.error)||""}`,status:"error",ttl:7e3})}catch(et){Nt.show({message:`${r("teamCard.deleteFailed","删除失败")}: ${et.message}`,status:"error",ttl:7e3})}},[Be]);x.useEffect(()=>{const j=_||E;j&&je(j,M)},[_,E,M,je]);const tt=x.useCallback(async()=>{var j,L;if((L=(j=window.cicy)==null?void 0:j.localTeams)!=null&&L.list){Dt(!0);try{const H=await window.cicy.localTeams.list({refresh:!0});ct(Array.isArray(H)?H:[])}catch{ct([])}finally{Dt(!1),N(!0)}}},[]);async function Et(){if(qt)return;const j=Yt.trim();if(!j){Ge(r("teams.urlRequired","请输入地址 URL"));return}try{new URL(j)}catch{Ge(r("teams.badUrl","URL 无效(需含 http(s)://)"));return}Ge(""),Ne(!0);try{const L=await window.cicy.localTeams.add({base_url:j,name:ge.trim(),failIfExists:!0});if(!L||L.ok===!1){Ge((L==null?void 0:L.error)==="exists"?r("teams.urlExists","该地址已存在"):Ka((L==null?void 0:L.error)||"add failed"));return}Rt(!1),V(""),we(""),await tt()}catch(L){Ge(Ka((L==null?void 0:L.message)||String(L)))}finally{Ne(!1)}}const At=x.useCallback(async(j,L)=>{var Z,et;if(!((et=(Z=window.cicy)==null?void 0:Z.localTeams)!=null&&et.update))return{ok:!1,error:"no_bridge"};let H;try{H=await window.cicy.localTeams.update(j,{name:String(L||"").trim()||r("localTeams.unnamed","未命名")})}catch(Kt){H={ok:!1,error:(Kt==null?void 0:Kt.message)||String(Kt)}}return await tt(),H||{ok:!1,error:"no_result"}},[tt]);x.useEffect(()=>{let j,L=!1;const H=3e3,Z=3e4,et=async()=>{var Ie,Le,ze;try{await((ze=(Le=(Ie=window.cicy)==null?void 0:Ie.localTeams)==null?void 0:Le.syncCloud)==null?void 0:ze.call(Le))}catch{}await Promise.all([tt(),Be(),pt()])},Kt=()=>{if(L)return;const Ie=document.visibilityState==="visible";j=setTimeout(async()=>{document.visibilityState==="visible"?await et():await tt(),Kt()},Ie?H:Z)};et(),Kt();const jt=()=>{document.visibilityState==="visible"&&et()};return document.addEventListener("visibilitychange",jt),window.addEventListener("focus",jt),()=>{L=!0,clearTimeout(j),document.removeEventListener("visibilitychange",jt),window.removeEventListener("focus",jt)}},[tt,Be]),x.useEffect(()=>{var L,H;if(!((H=(L=window.cicy)==null?void 0:L.localTeams)!=null&&H.onWebviewRelay))return;const j=window.cicy.localTeams.onWebviewRelay(async({reqId:Z,msg:et})=>{let Kt={ok:!1,error:"unknown relay type"};try{(et==null?void 0:et.type)==="localTeams:add"?Kt=await window.cicy.localTeams.add(et.spec||{}):(et==null?void 0:et.type)==="localTeams:remove"?Kt=await window.cicy.localTeams.remove(et.id):(et==null?void 0:et.type)==="localTeams:update"?Kt=await window.cicy.localTeams.update(et.id,et.patch||{}):(et==null?void 0:et.type)==="localTeams:upgrade"?Kt=await window.cicy.localTeams.upgrade(et.id):(et==null?void 0:et.type)==="localTeams:list"&&(Kt={ok:!0,teams:await window.cicy.localTeams.list({refresh:!0})}),tt()}catch(jt){Kt={ok:!1,error:(jt==null?void 0:jt.message)||String(jt)}}try{window.cicy.localTeams.replyWebviewRelay(Z,Kt)}catch{}});return()=>{try{j==null||j()}catch{}}},[tt]);const ne=x.useCallback(async j=>{var L,H;if((H=(L=window.cicy)==null?void 0:L.localTeams)!=null&&H.open)try{await window.cicy.localTeams.open(j)}catch{}},[]);x.useEffect(()=>{var L,H;if(Si(Cn)){m(!1);return}if(!((H=(L=window.cicy)==null?void 0:L.auth)!=null&&H.getSaved)){m(!1);return}let j=!1;return(async()=>{try{const Z=await window.cicy.auth.getSaved();if(j)return;if(Z!=null&&Z.token){try{localStorage.setItem(Cn,Z.token)}catch{}if(d(Z.token),Z.accessToken){try{localStorage.setItem(Uu,Z.accessToken)}catch{}k(Z.accessToken)}if(Z.userId){try{localStorage.setItem(Ru,String(Z.userId))}catch{}q(String(Z.userId))}}}catch{}finally{j||m(!1)}})(),()=>{j=!0}},[]),x.useEffect(()=>{var j,L;if((L=(j=window.cicy)==null?void 0:j.auth)!=null&&L.onComplete)return window.cicy.auth.onComplete(H=>{if(U(!1),ht(!1),H!=null&&H.error){lt(Ka(H.error));return}if(H!=null&&H.token){z.current=!1,Zt("");try{localStorage.setItem(Cn,H.token)}catch{}if(d(H.token),H.accessToken){try{localStorage.setItem(Uu,H.accessToken)}catch{}k(H.accessToken)}if(H.userId){try{localStorage.setItem(Ru,String(H.userId))}catch{}q(String(H.userId))}lt(""),G(H.reused?r("auth.welcomeBack","已恢复你之前的登录"):r("auth.loginSuccess","登录成功")),setTimeout(()=>G(""),3e3)}})},[]);async function g(){var j,L;if(!(at||J)){if(!((L=(j=window.cicy)==null?void 0:j.auth)!=null&&L.loginStart)){lt("auth bridge missing");return}lt(""),F(!0);try{const H=await window.cicy.auth.loginStart();if(!(H!=null&&H.ok)){lt(Ka((H==null?void 0:H.error)||"login start failed"));return}X(H.url||""),U(!0)}catch(H){lt(Ka((H==null?void 0:H.message)||String(H)))}finally{F(!1)}}}async function K(){var L,H;if(at)return;if(!((H=(L=window.cicy)==null?void 0:L.auth)!=null&&H.emailLoginStart)){lt("auth bridge missing");return}const j=dt.trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(j)){lt(r("auth.badEmail","请输入有效的邮箱地址"));return}lt(""),F(!0);try{const Z=await window.cicy.auth.emailLoginStart(j);if(!(Z!=null&&Z.ok)){lt(Ka((Z==null?void 0:Z.error)||"email login failed"));return}ht(!0)}catch(Z){lt(Ka((Z==null?void 0:Z.message)||String(Z)))}finally{F(!1)}}function gt(){var j,L,H;try{localStorage.removeItem(Cn),localStorage.removeItem(Uu),localStorage.removeItem(Ru)}catch{}try{(H=(L=(j=window.cicy)==null?void 0:j.auth)==null?void 0:L.logout)==null||H.call(L)}catch{}d(null),k(null),q(null),B(null),Pt(null),lt(""),Zt("")}if(s===void 0)return u.jsxs("div",{className:"shell","data-id":"TermsCheckingSplash",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(ao,{}),u.jsx("div",{className:"spinner-row",children:u.jsx(Ye,{})})]})]});if(!s)return u.jsx(Am,{onAgree:()=>b(!0)});if(!_&&T)return u.jsxs("div",{className:"shell","data-id":"AuthRestoringSplash",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(ao,{}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Ye,{}),u.jsx("span",{children:r("auth.restoring","正在恢复登录…")})]})]})]});if(!_)return u.jsxs("div",{className:"shell",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(ao,{}),!J&&!It&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline",children:r("auth.tagline","登录以同步你的团队、配置与 AI 助手")}),u.jsx("label",{className:"login-label","data-id":"EmailLoginLabel",htmlFor:"cicy-email-login",children:r("auth.emailLabel","输入邮箱,用邮件链接登录")}),u.jsx("input",{id:"cicy-email-login",type:"email",className:"login-email-input","data-id":"EmailLoginInput",value:dt,onChange:j=>_t(j.target.value),onKeyDown:j=>{j.key==="Enter"&&K()},placeholder:r("auth.emailPlaceholder","you@example.com"),autoComplete:"email",spellCheck:!1,autoFocus:!0}),u.jsx("button",{className:"btn-primary","data-id":"EmailLoginSubmit",onClick:K,disabled:at,children:at?u.jsxs(u.Fragment,{children:[u.jsx(Ye,{}),u.jsx("span",{children:r("auth.sending","发送中…")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{children:r("auth.emailLogin","发送登录链接")}),u.jsx(Hu,{})]})}),u.jsx("p",{className:"hint",children:r("auth.emailHint","手机上点邮件里的链接,也能登录这台电脑")}),u.jsx("div",{className:"login-divider","data-id":"LoginDivider",children:u.jsx("span",{children:r("auth.or","或")})}),u.jsx("button",{className:"btn-ghost","data-id":"BrowserLoginBtn",onClick:g,disabled:at,children:at?r("auth.opening","打开中…"):r("auth.browserLogin","用浏览器登录(Google / SSO,仅同一台电脑)")})]}),It&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline","data-id":"EmailSentTagline",children:r("auth.emailSentTagline","登录邮件已发送")}),u.jsxs("p",{className:"hint","data-id":"EmailSentHint",style:{textAlign:"center"},children:[r("auth.emailSentHint","到邮箱打开链接即可(手机、电脑都行),这里会自动登录。"),u.jsx("br",{}),dt]}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Ye,{}),u.jsx("span",{children:r("auth.emailWaiting","等待确认…")})]}),u.jsx("button",{className:"btn-ghost","data-id":"EmailSentCancel",onClick:()=>{var j,L,H;(H=(L=(j=window.cicy)==null?void 0:j.auth)==null?void 0:L.emailLoginCancel)==null||H.call(L),ht(!1)},children:r("auth.cancel","取消")})]}),J&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline",children:r("auth.waitingTagline","已在浏览器打开登录页,等待你完成…")}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Ye,{}),u.jsx("span",{children:r("auth.waitingCallback","等待回调")})]}),I&&u.jsxs("div",{className:"login-fallback","data-id":"LoginUrlFallback",style:{marginTop:10,textAlign:"center"},children:[u.jsx("p",{className:"hint",style:{marginBottom:6},children:r("auth.browserNotOpened","浏览器没自动打开?")}),u.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-open",onClick:()=>{var j,L,H;try{(H=(L=(j=window.cicy)==null?void 0:j.shell)==null?void 0:L.openExternal)==null||H.call(L,I)}catch{}},children:r("auth.openManually","手动打开登录页")}),u.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-copy",onClick:()=>{var j;try{(j=navigator.clipboard)==null||j.writeText(I),G(r("auth.linkCopied","链接已复制,粘到浏览器打开")),setTimeout(()=>G(""),2500)}catch{}},children:r("auth.copyLink","复制链接")}),u.jsx("p",{className:"hint","data-id":"LoginUrlFallback-url",style:{wordBreak:"break-all",marginTop:6,fontSize:11,opacity:.7,userSelect:"text"},children:I})]}),u.jsx("button",{className:"btn-ghost",onClick:()=>{var j,L,H;(H=(L=(j=window.cicy)==null?void 0:j.auth)==null?void 0:L.loginCancel)==null||H.call(L),U(!1),X("")},children:r("auth.cancel","取消")})]}),Gt&&u.jsx("div",{className:"error",children:Gt})]})]});const P=(Y||[]).find(j=>xm(j.base_url))||null,ut=P&&P.cloud_team_id?(Lt||[]).find(j=>String(j.teamId||j.id)===String(P.cloud_team_id)):null,rt=j=>{if(!j)return null;const L=(Lt||[]).find(H=>String(H.teamId||H.id)===String(j));return L&&L.code||null},mt=(Y||[]).filter(j=>uo(j.base_url)),Ce=(Y||[]).filter(j=>!uo(j.base_url)&&!xm(j.base_url)),za=mt.length,Sl=Ce.length,Wt=(Lt||[]).filter(j=>!j.is_local&&j.kind!=="local"&&(j.kind==="private"||j.team_kind==="personal")),De=Wt.length,xa=be==="all"||be==="local",ua=be==="all"||be==="custom",ql=be==="all"||be==="cloud",Ea=Y===null&&Lt===null;return u.jsxs("div",{className:"shell shell--app",children:[u.jsx("div",{className:"glow glow--app","aria-hidden":!0}),u.jsxs("div",{className:"shell__left",children:[u.jsx(cp,{me:ot,welcome:wt,onLogout:gt,mitmTeam:mt.length>0?mt[0]:null}),u.jsx(hp,{}),u.jsxs("main",{className:"main",children:[u.jsxs("div",{className:"app__tabsrow",children:[u.jsx("div",{className:"app__tabs",children:[{k:"all",label:r("teamFilter.all","全部"),n:za+Sl+De},{k:"local",label:r("teamFilter.local","本地"),n:za},{k:"cloud",label:r("teamFilter.cloud","私有云"),n:De},{k:"custom",label:r("teamFilter.custom","自定义"),n:Sl}].map(({k:j,label:L,n:H})=>u.jsxs("button",{type:"button",className:`app__tab ${be===j?"is-active":""}`,onClick:()=>Ca(j),children:[L,u.jsx("span",{className:"app__tab-count",children:H})]},j))}),u.jsxs("div",{"data-id":"AddTeamWrap",style:{position:"relative"},children:[u.jsxs("button",{type:"button","data-id":"AddTeamButton",className:"app__add-team",title:r("teams.addHint","添加团队"),onClick:()=>St(j=>!j),children:["+ ",r("teams.add","新加团队")]}),vt&&u.jsxs(u.Fragment,{children:[u.jsx("div",{onClick:()=>St(!1),style:{position:"fixed",inset:0,zIndex:40}}),u.jsxs("div",{"data-id":"AddTeamMenu",role:"menu",style:{position:"absolute",top:"calc(100% + 6px)",right:0,zIndex:41,minWidth:240,background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:10,boxShadow:"0 10px 30px rgba(0,0,0,.45)",overflow:"hidden"},children:[u.jsxs("button",{type:"button","data-id":"AddTeamMenu-custom",className:"bcard__menu-item",style:{display:"block",width:"100%",textAlign:"left",padding:"11px 14px",border:"none",background:"transparent",cursor:"pointer",color:"inherit"},onClick:()=>{St(!1),Ge(""),Rt(!0)},children:[u.jsx("div",{style:{fontSize:13,fontWeight:600},children:r("teams.addCustom","自定义团队")}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:2},children:r("teams.addCustomSub","手动输入地址和名称")})]}),u.jsxs("button",{type:"button","data-id":"AddTeamMenu-private",className:"bcard__menu-item",style:{display:"block",width:"100%",textAlign:"left",padding:"11px 14px",border:"none",borderTop:"1px solid var(--border, #2c2f36)",background:"transparent",cursor:"pointer",color:"inherit"},onClick:()=>{St(!1),_i("?tab=private")},children:[u.jsx("div",{style:{fontSize:13,fontWeight:600},children:r("teams.addPrivate","私有云团队")}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:2},children:r("teams.addPrivateSub","去云端团队中心添加")})]})]})]})]})]}),ue&&u.jsx("div",{"data-id":"CustomTeamModal",style:{position:"fixed",inset:0,zIndex:60,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:j=>{!qt&&j.target===j.currentTarget&&Rt(!1)},children:u.jsxs("div",{onClick:j=>j.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("teams.customTitle","添加自定义团队")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:r("teams.customSub","连接到一个已有的 cicy-code 地址")}),u.jsx("label",{style:{display:"block",fontSize:12,opacity:.75,marginBottom:6},children:r("teams.customNameLabel","名称")}),u.jsx("input",{"data-id":"CustomTeamModal-title",className:"login-email-input",style:{width:"100%",marginBottom:14},value:ge,onChange:j=>V(j.target.value),placeholder:r("teams.customNamePlaceholder","我的团队"),spellCheck:!1,autoFocus:!0}),u.jsx("label",{style:{display:"block",fontSize:12,opacity:.75,marginBottom:6},children:r("teams.customUrlLabel","地址 URL")}),u.jsx("input",{"data-id":"CustomTeamModal-url",className:"login-email-input",style:{width:"100%",marginBottom:6},value:Yt,onChange:j=>we(j.target.value),placeholder:"https://example.com:8008",spellCheck:!1,onKeyDown:j=>{j.key==="Enter"&&Et()}}),Fe&&u.jsx("div",{className:"error",style:{marginTop:10},children:Fe}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost","data-id":"CustomTeamModal-cancel",disabled:qt,onClick:()=>Rt(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"CustomTeamModal-submit",disabled:qt,onClick:Et,children:qt?r("teams.adding","添加中…"):r("teams.addAction","添加")})]})]})}),le&&u.jsxs("div",{className:"error",style:{marginBottom:12},children:[r("common.cloud","云端"),": ",le,u.jsx("button",{className:"btn-ghost",style:{marginLeft:8},onClick:()=>je(_||E,M),children:r("common.retry","重试")})]}),u.jsxs("div",{className:"app__grid",children:[Ea&&[0,1,2].map(j=>u.jsx(yp,{},"skc"+j)),!Ea&&xa&&mt.map(j=>u.jsx(Sm,{team:j,cloudCode:rt(j.cloud_team_id),onOpen:()=>ne(j.id),onRename:At,onRefresh:tt},"local:"+j.id)),!Ea&&xa&&u.jsx(fp,{dockerTeam:P,onOpen:async()=>{var j,L,H;try{const Z=await((H=(L=(j=window.cicy)==null?void 0:j.docker)==null?void 0:L.appOpen)==null?void 0:H.call(L));Z!=null&&Z.ok||Nt.show({id:"docker-open",status:"error",ttl:6e3,message:r("docker.openNoToken","服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。")})}catch(Z){console.warn("[DockerCard] open",Z)}},cloudTitle:ut==null?void 0:ut.title,cloudCode:ut==null?void 0:ut.code,onRename:P!=null&&P.cloud_team_id?(j=>R(P.cloud_team_id,j)):void 0,onRefresh:tt}),ua&&Ce.map(j=>u.jsx(Sm,{team:j,cloudCode:rt(j.cloud_team_id),onOpen:()=>ne(j.id),onRename:At,onRefresh:tt},"custom:"+j.id)),ql&&Wt.map(j=>u.jsx(mp,{team:j,onOpen:()=>{var H,Z,et;const L=j.kind==="private"?j.host_url:j.workspace_url||j.workspace_direct_url;L&&((et=(Z=(H=window.cicy)==null?void 0:H.tabs)==null?void 0:Z.open)==null||et.call(Z,L,j.name||j.title||"",Q[j.id]||"",!0,j.id))},avatar:Q[j.id]||"",onAvatar:pt,onRename:R,onEditUrl:$,onDelete:it},"cloud:"+j.id))]}),!re&&!le&&Lt&&Lt.length===0&&!(Y!=null&&Y.length)&&u.jsx("div",{className:"empty",style:{marginTop:14},children:r("teams.emptyHint","还没有团队 — 安装本地 cicy-code 起一个本地 team,或在云端创建。")})]})]}),u.jsx(ap,{}),u.jsx(lp,{}),u.jsx(dp,{})]})}function ip({onClose:s}){const[b,_]=x.useState(null),[d,E]=x.useState(""),[k,M]=x.useState(!1),[q,T]=x.useState(""),m=typeof window<"u"&&window.cicy&&window.cicy.trustedOrigins||null,J=x.useCallback(async()=>{try{_(m&&await m.list()||[])}catch{_([])}},[m]);x.useEffect(()=>{J()},[J]);const U=async()=>{const I=d.trim();if(!(!I||k||!m)){M(!0),T("");try{const X=await m.add(I);X&&X.ok===!1?T(X.error||r("trustedSites.addFailed","添加失败")):(E(""),_(X&&X.origins||await m.list()))}catch(X){T(String(X&&X.message||X))}finally{M(!1)}}},at=async I=>{if(!(k||!m)){M(!0),T("");try{const X=await m.remove(I);X&&X.ok===!1?T(X.error||r("trustedSites.removeFailed","删除失败")):_(X&&X.origins||await m.list())}catch(X){T(String(X&&X.message||X))}finally{M(!1)}}},F={overlay:{position:"fixed",inset:0,zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.62)",backdropFilter:"blur(3px)"},card:{width:560,maxWidth:"94vw",maxHeight:"82vh",display:"flex",flexDirection:"column",background:"#101012",border:"1px solid rgba(255,255,255,.09)",borderRadius:16,boxShadow:"0 24px 64px rgba(0,0,0,.55)",overflow:"hidden",color:"#e4e4e7"},head:{display:"flex",alignItems:"center",gap:8,padding:"14px 16px",borderBottom:"1px solid rgba(255,255,255,.06)"},title:{margin:0,fontSize:15,fontWeight:600,flex:1},x:{background:"transparent",border:"none",color:"#a1a1aa",fontSize:16,cursor:"pointer",lineHeight:1,padding:4},warn:{margin:"14px 16px 0",padding:"10px 12px",fontSize:12.5,lineHeight:1.55,color:"#fca5a5",background:"rgba(239,68,68,.08)",border:"1px solid rgba(239,68,68,.25)",borderRadius:10},addRow:{display:"flex",gap:8,padding:"12px 16px 4px"},input:{flex:1,minWidth:0,background:"#161618",border:"1px solid rgba(255,255,255,.1)",borderRadius:9,padding:"9px 11px",color:"#e4e4e7",fontSize:13,outline:"none"},addBtn:{background:"rgba(255,255,255,.1)",border:"none",borderRadius:9,padding:"0 16px",color:"#fff",fontSize:13,fontWeight:500,cursor:"pointer"},err:{margin:"6px 16px 0",fontSize:12,color:"#fca5a5"},listWrap:{margin:"10px 16px 16px",border:"1px solid rgba(255,255,255,.07)",borderRadius:10,overflow:"auto",flex:1,minHeight:80},row:{display:"flex",alignItems:"center",gap:10,padding:"9px 12px",borderTop:"1px solid rgba(255,255,255,.05)"},host:I=>({flex:1,fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:13,color:I?"#71717a":"#e4e4e7",wordBreak:"break-all"}),tag:{fontSize:11,color:"#71717a",background:"rgba(255,255,255,.05)",borderRadius:6,padding:"2px 7px"},rm:{background:"transparent",border:"none",color:"#a1a1aa",fontSize:12,cursor:"pointer",padding:"3px 6px",borderRadius:6},muted:{padding:"16px",textAlign:"center",color:"#71717a",fontSize:12.5}};return Sa.createPortal(u.jsx("div",{style:F.overlay,onMouseDown:I=>{I.target===I.currentTarget&&s()},"data-id":"TrustedSitesModal",children:u.jsxs("div",{style:F.card,onClick:I=>I.stopPropagation(),children:[u.jsxs("div",{style:F.head,children:[u.jsx("h2",{style:F.title,children:r("trustedSites.title","受信任站点")}),u.jsx("button",{type:"button",style:F.x,onClick:s,"aria-label":"close",children:"✕"})]}),u.jsx("div",{style:F.warn,children:r("trustedSites.warn","⚠ 列表中的站点可以在你的电脑上执行命令(exec)。只添加你完全信任的地址。")}),u.jsxs("div",{style:F.addRow,children:[u.jsx("input",{"data-id":"trusted-sites-input",style:F.input,value:d,onChange:I=>E(I.target.value),onKeyDown:I=>{I.key==="Enter"&&U()},placeholder:r("trustedSites.placeholder","添加站点,如 app.cicy-ai.com 或 my-cloud.example.org")}),u.jsx("button",{type:"button","data-id":"trusted-sites-add",style:{...F.addBtn,opacity:k||!d.trim()?.5:1},onClick:U,disabled:k||!d.trim(),children:r("trustedSites.add","添加")})]}),q&&u.jsx("div",{style:F.err,children:q}),u.jsx("div",{style:F.listWrap,children:b===null?u.jsx("div",{style:F.muted,children:r("trustedSites.loading","加载中…")}):b.length===0?u.jsx("div",{style:F.muted,children:r("trustedSites.empty","暂无")}):b.map(I=>u.jsxs("div",{style:F.row,"data-id":"trusted-sites-row",children:[u.jsx("span",{style:F.host(I.builtin),children:I.host}),I.builtin?u.jsx("span",{style:F.tag,children:r("trustedSites.builtin","系统")}):u.jsx("button",{type:"button",style:F.rm,onClick:()=>at(I.host),disabled:k,children:r("trustedSites.remove","删除")})]},I.host))})]})}),document.body)}function up({onClose:s}){const[b,_]=x.useState(null),[d,E]=x.useState(""),[k,M]=x.useState(""),[q,T]=x.useState(!1),m=typeof window<"u"&&window.cicy&&window.cicy.rpcAudit||null,J=x.useCallback(async()=>{T(!0),E("");try{const B=m&&await m.tail(400);!B||B.ok===!1?(E(B&&B.error||r("audit.loadFailed","读取失败")),_([])):(_(B.entries||[]),M(B.path||""))}catch(B){E(String(B&&B.message||B)),_([])}finally{T(!1)}},[m]);x.useEffect(()=>{J()},[J]);const[U,at]=x.useState("all"),[F,I]=x.useState(""),X=B=>{try{return new Date(B).toLocaleString()}catch{return B||""}},dt=B=>{if(B.kind==="auth"){const Lt=/deny/.test(B.decision||"");return{text:B.decision||"auth",color:Lt?"#fca5a5":"#86efac",bg:Lt?"rgba(239,68,68,.14)":"rgba(34,197,94,.14)"}}if(B.kind==="rpc"){const Lt=B.ok!==!1&&!B.error;return{text:Lt?"ok":"err",color:Lt?"#86efac":"#fca5a5",bg:Lt?"rgba(34,197,94,.14)":"rgba(239,68,68,.14)"}}return{text:B.kind||"log",color:"#a1a1aa",bg:"rgba(255,255,255,.06)"}},_t=B=>B.kind==="auth"?`${B.gate||""}${B.decision?" · "+B.decision:""}`:B.kind==="rpc"?`${B.tool||""}${B.dangerous?" ⚠":""}`:B.kind||"",It=B=>B.error||B.args||(B.kind==="rpc"?B.channel:"")||"",ht=b||[],Gt=F.trim().toLowerCase(),lt=ht.filter(B=>U!=="all"&&B.kind!==U?!1:Gt?[B.origin,B.host,B.tool,B.gate,B.decision,B.channel,B.args,B.error,B.kind].filter(Boolean).join(" ").toLowerCase().includes(Gt):!0),wt="186px 104px minmax(160px,1.1fr) minmax(150px,1.1fr) minmax(220px,1.8fr)",G={overlay:{position:"fixed",inset:0,zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.66)",backdropFilter:"blur(4px)"},card:{width:"96vw",height:"92vh",maxWidth:1480,display:"flex",flexDirection:"column",background:"#0d0d0f",border:"1px solid rgba(255,255,255,.09)",borderRadius:18,boxShadow:"0 32px 80px rgba(0,0,0,.6)",overflow:"hidden",color:"#e4e4e7"},head:{display:"flex",alignItems:"center",gap:14,padding:"20px 24px",borderBottom:"1px solid rgba(255,255,255,.07)"},titleWrap:{flex:1,minWidth:0},title:{margin:0,fontSize:21,fontWeight:650,letterSpacing:.2},subtitle:{margin:"3px 0 0",fontSize:12.5,color:"#71717a",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",wordBreak:"break-all"},count:{fontSize:12.5,color:"#a1a1aa",whiteSpace:"nowrap"},refresh:{background:"rgba(255,255,255,.1)",border:"none",borderRadius:9,padding:"9px 16px",color:"#fff",fontSize:13,fontWeight:500,cursor:"pointer"},x:{background:"transparent",border:"none",color:"#a1a1aa",fontSize:20,cursor:"pointer",lineHeight:1,padding:6},toolbar:{display:"flex",alignItems:"center",gap:10,padding:"14px 24px",borderBottom:"1px solid rgba(255,255,255,.05)"},chips:{display:"flex",gap:6},chip:B=>({background:B?"rgba(255,255,255,.14)":"transparent",border:"1px solid rgba(255,255,255,.12)",borderRadius:999,padding:"6px 16px",color:B?"#fff":"#a1a1aa",fontSize:13,cursor:"pointer"}),search:{flex:1,minWidth:0,background:"#161618",border:"1px solid rgba(255,255,255,.1)",borderRadius:10,padding:"10px 14px",color:"#e4e4e7",fontSize:13.5,outline:"none"},err:{margin:"10px 24px 0",fontSize:12.5,color:"#fca5a5"},tableWrap:{flex:1,overflow:"auto",margin:"0"},theadRow:{position:"sticky",top:0,zIndex:1,display:"grid",gridTemplateColumns:wt,gap:16,padding:"12px 24px",background:"#141417",borderBottom:"1px solid rgba(255,255,255,.08)",fontSize:11.5,letterSpacing:.6,textTransform:"uppercase",color:"#71717a",fontWeight:600},row:{display:"grid",gridTemplateColumns:wt,gap:16,padding:"13px 24px",borderBottom:"1px solid rgba(255,255,255,.045)",alignItems:"center"},time:{fontSize:12.5,color:"#a1a1aa",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",whiteSpace:"nowrap"},badge:B=>({justifySelf:"start",fontSize:11.5,color:B.color,background:B.bg,borderRadius:7,padding:"3px 10px",whiteSpace:"nowrap",fontWeight:500}),cell:{fontSize:13,color:"#d4d4d8",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",wordBreak:"break-all"},detail:{fontSize:12.5,color:"#8b8b93",wordBreak:"break-all"},muted:{padding:"60px 24px",textAlign:"center",color:"#71717a",fontSize:14}},ot=B=>u.jsx("div",{children:B});return Sa.createPortal(u.jsx("div",{style:G.overlay,onMouseDown:B=>{B.target===B.currentTarget&&s()},"data-id":"AuditLogModal",children:u.jsxs("div",{style:G.card,onClick:B=>B.stopPropagation(),children:[u.jsxs("div",{style:G.head,children:[u.jsxs("div",{style:G.titleWrap,children:[u.jsx("h2",{style:G.title,children:r("audit.title","审计日志")}),k&&u.jsx("p",{style:G.subtitle,children:k})]}),u.jsxs("span",{style:G.count,children:[r("audit.count","共")," ",lt.length,U!=="all"||Gt?` / ${ht.length}`:""]}),u.jsx("button",{type:"button","data-id":"audit-refresh",style:{...G.refresh,opacity:q?.5:1},onClick:J,disabled:q,children:r("audit.refresh","刷新")}),u.jsx("button",{type:"button",style:G.x,onClick:s,"aria-label":"close",children:"✕"})]}),u.jsxs("div",{style:G.toolbar,children:[u.jsxs("div",{style:G.chips,children:[u.jsx("button",{type:"button",style:G.chip(U==="all"),onClick:()=>at("all"),children:r("audit.all","全部")}),u.jsx("button",{type:"button",style:G.chip(U==="rpc"),onClick:()=>at("rpc"),children:r("audit.rpc","RPC 调用")}),u.jsx("button",{type:"button",style:G.chip(U==="auth"),onClick:()=>at("auth"),children:r("audit.auth","授权决定")})]}),u.jsx("input",{"data-id":"audit-search",style:G.search,value:F,onChange:B=>I(B.target.value),placeholder:r("audit.search","搜索来源 / 工具 / 命令…")})]}),d&&u.jsx("div",{style:G.err,children:d}),u.jsxs("div",{style:G.tableWrap,children:[u.jsxs("div",{style:G.theadRow,children:[ot(r("audit.colTime","时间")),ot(r("audit.colType","类型")),ot(r("audit.colSource","来源")),ot(r("audit.colOp","操作")),ot(r("audit.colDetail","详情"))]}),b===null?u.jsx("div",{style:G.muted,children:r("audit.loading","加载中…")}):lt.length===0?u.jsx("div",{style:G.muted,children:ht.length===0?r("audit.empty","暂无审计记录"):r("audit.noMatch","无匹配记录")}):lt.map((B,Lt)=>{const Pt=dt(B);return u.jsxs("div",{style:G.row,"data-id":"audit-row",children:[u.jsx("span",{style:G.time,children:X(B.ts)}),u.jsx("span",{style:G.badge(Pt),children:Pt.text}),u.jsx("span",{style:G.cell,children:B.origin||B.host||"—"}),u.jsx("span",{style:G.cell,children:_t(B)||"—"}),u.jsx("span",{style:G.detail,children:It(B)||"—"})]},Lt)})]})]})}),document.body)}function cp({me:s,welcome:b,onLogout:_,mitmTeam:d}){const E=(s==null?void 0:s.display_name)||(s==null?void 0:s.username)||"…",k=E.slice(0,1).toUpperCase(),[M,q]=x.useState(!1),[T,m]=x.useState(!1),[J,U]=x.useState(!1),[at,F]=x.useState(!1),[I,X]=x.useState(!1),[dt,_t]=x.useState(""),It=x.useRef(null);x.useEffect(()=>{var wt,G,ot;let lt=!0;return(ot=(G=(wt=window.cicy)==null?void 0:wt.app)==null?void 0:G.getVersion)==null||ot.call(G).then(B=>{lt&&_t(typeof B=="string"?B:String((B==null?void 0:B.desktop)||""))}).catch(()=>{}),()=>{lt=!1}},[]),x.useEffect(()=>{if(!M)return;const lt=wt=>{It.current&&!It.current.contains(wt.target)&&q(!1)};return document.addEventListener("mousedown",lt),()=>document.removeEventListener("mousedown",lt)},[M]);const ht=lt=>{_i(lt),q(!1)},Gt=async()=>{var lt,wt,G;q(!1),X(!0),Nt.show({id:"app-update",message:r("updateBanner.checking","正在检查更新…"),status:"running"});try{const ot=await((G=(wt=(lt=window.cicy)==null?void 0:lt.app)==null?void 0:wt.checkUpdate)==null?void 0:G.call(wt));(ot==null?void 0:ot.status)==="available"?Nt.show({id:"app-update",message:r("updateBanner.available","发现新版本 v{{v}}",{v:ot.version}),status:"done",ttl:4e3}):(ot==null?void 0:ot.status)==="up-to-date"?Nt.show({id:"app-update",message:r("updateBanner.upToDate","已是最新版本 v{{v}}",{v:ot.version||ot.current}),status:"done",ttl:3e3}):Nt.show({id:"app-update",message:r("updateBanner.error","更新失败")+(ot!=null&&ot.error?`:${ot.error}`:""),status:"error",ttl:5e3})}catch(ot){Nt.show({id:"app-update",message:ot.message,status:"error",ttl:5e3})}finally{X(!1)}};return u.jsxs(u.Fragment,{children:[u.jsx("header",{className:"topbar",children:u.jsxs("div",{className:"user-chip","data-id":"UserChip",ref:It,children:[b&&u.jsx("span",{className:"welcome",children:b}),s?u.jsxs("button",{type:"button","data-id":"UserChip-trigger",className:`user-chip__trigger${M?" is-open":""}`,onClick:()=>q(lt=>!lt),children:[u.jsx("div",{className:"avatar",children:k}),u.jsx("span",{className:"user-name",children:E}),u.jsx("span",{className:"user-chip__caret","aria-hidden":!0,children:"▾"})]}):u.jsxs("div",{className:"user-chip__trigger user-chip__trigger--skel","data-id":"UserChip-skeleton","aria-hidden":!0,children:[u.jsx("div",{className:"skel skel--avatar"}),u.jsx("div",{className:"skel skel--name"})]}),M&&u.jsxs("div",{className:"user-chip__menu","data-id":"UserChip-menu",role:"menu",children:[u.jsx("button",{type:"button","data-id":"UserChip-wallet",className:"user-chip__menu-item",onClick:()=>ht("?view=wallet"),children:r("userMenu.wallet","我的钱包")}),u.jsx("button",{type:"button","data-id":"UserChip-billing",className:"user-chip__menu-item",onClick:()=>ht("?view=usage"),children:r("userMenu.billing","我的账单")}),u.jsx("button",{type:"button","data-id":"UserChip-trusted-sites",className:"user-chip__menu-item",onClick:()=>{q(!1),m(!0)},children:r("trustedSites.menu","受信任站点")}),u.jsx("button",{type:"button","data-id":"UserChip-audit-log",className:"user-chip__menu-item",onClick:()=>{q(!1),U(!0)},children:r("audit.menu","审计日志")}),u.jsx("button",{type:"button","data-id":"UserChip-terms",className:"user-chip__menu-item",onClick:()=>{q(!1),F(!0)},children:r("firstRunTerms.menu","用户协议")}),u.jsx("button",{type:"button","data-id":"UserChip-check-update",className:"user-chip__menu-item",disabled:I,onClick:Gt,children:I?r("updateBanner.checkingShort","检查中…"):r("updateBanner.checkBtn","检查更新")}),!1,u.jsx("div",{className:"user-chip__menu-sep","aria-hidden":!0}),u.jsx("button",{type:"button","data-id":"UserChip-logout",className:"user-chip__menu-item is-danger",onClick:()=>{q(!1),_()},children:r("userMenu.logout","退出")}),u.jsxs("div",{className:"user-chip__menu-version","data-id":"UserChip-version",children:["CiCy Desktop ",dt?`v${dt}`:"…"]})]})]})}),T&&u.jsx(ip,{onClose:()=>m(!1)}),J&&u.jsx(up,{onClose:()=>U(!1)}),at&&u.jsx(Am,{onClose:()=>F(!1)})]})}function Am({onAgree:s,onClose:b}){var I;const[_,d]=x.useState(!1),[E,k]=x.useState(!1),M=(((I=window.cicyI18n)==null?void 0:I.locale)||"en").startsWith("zh")?"zh-CN":"en",q=(X,dt)=>r(`firstRunTerms.${X}`,dt),T=!!b,m=x.useMemo(()=>Py(Fy(M)),[M]),J=X=>{const dt=X.currentTarget;dt.scrollHeight-dt.scrollTop-dt.clientHeight<24&&d(!0)},U=x.useRef(null);x.useEffect(()=>{const X=U.current;X&&X.scrollHeight<=X.clientHeight+24&&d(!0)},[]);const at=async()=>{var X,dt,_t;if(!(E||!_)){k(!0);try{await((_t=(dt=(X=window.cicy)==null?void 0:X.terms)==null?void 0:dt.agree)==null?void 0:_t.call(dt,Em)),s==null||s()}catch{s==null||s()}}},F=()=>{var X,dt,_t;try{(_t=(dt=(X=window.cicy)==null?void 0:X.terms)==null?void 0:dt.decline)==null||_t.call(dt)}catch{}};return u.jsxs("div",{className:T?"terms-gate terms-gate--review":"shell terms-gate","data-id":"FirstRunTermsGate",style:T?{position:"fixed",inset:0,zIndex:1e3,background:"rgba(8,9,14,.72)",backdropFilter:"blur(4px)"}:void 0,onClick:T?X=>{X.target===X.currentTarget&&b()}:void 0,children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"terms-gate__panel",children:[u.jsx("h1",{className:"terms-gate__title","data-id":"FirstRunTermsGate-title",children:q("title","用户协议与授权说明")}),u.jsx("p",{className:"terms-gate__subtitle",children:q("subtitle","使用 CiCy Desktop 前,请阅读并同意以下条款")}),u.jsx("div",{className:"terms-gate__body",ref:U,onScroll:J,"data-id":"FirstRunTermsGate-body",children:u.jsx("div",{className:"terms-md","data-id":"FirstRunTermsGate-md",dangerouslySetInnerHTML:{__html:m}})}),T?u.jsx("div",{className:"terms-gate__actions",children:u.jsx("button",{"data-id":"FirstRunTermsGate-close",className:"terms-gate__btn",onClick:b,children:q("close","关闭")})}):u.jsxs(u.Fragment,{children:[!_&&u.jsx("div",{className:"terms-gate__scrollhint","data-id":"FirstRunTermsGate-scrollhint",children:q("scrollHint","请阅读至底部以继续")}),u.jsxs("div",{className:"terms-gate__actions",children:[u.jsx("button",{"data-id":"FirstRunTermsGate-decline",className:"terms-gate__btn terms-gate__btn--ghost",onClick:F,children:q("decline","不同意并退出")}),u.jsx("button",{"data-id":"FirstRunTermsGate-agree",className:"terms-gate__btn",disabled:!_||E,title:_?"":q("mustAgree","未同意则无法使用本软件。"),onClick:at,children:q("agree","同意并继续")})]})]})]})]})}const io=new Set;let bm=0,Bt=null;function zn(){io.forEach(s=>s(Bt))}const zt={open({onRetry:s,kind:b,source:_}={}){Bt={status:"running",phase:"install-docker",kind:b||"install",source:_||"op",logs:[],bars:{},minimized:!1,onRetry:s||null,lastAt:Date.now()},zn()},minimize(){Bt&&(Bt={...Bt,minimized:!0},zn())},restore(){Bt&&(Bt={...Bt,minimized:!1},zn())},push(s={}){var M;if(!Bt)return;const b=s.phase==="health"?"container":s.phase||Bt.phase,_={...Bt,phase:b,lastAt:Date.now()},d=Number.isFinite(s.progress),E=b==="install-docker"||b==="image";if(E&&(d||s.dest||s.url)){const q=((M=Bt.bars)==null?void 0:M[b])||{},T=d?s.progress:s.status==="skip"||s.status==="done"?100:q.progress;_.bars={...Bt.bars,[b]:{progress:T,received:s.received??q.received,total:s.total??q.total,url:s.url||q.url,dest:s.dest||q.dest}}}if(!(s.status==="running"&&d&&E)){const q=Bt.logs[Bt.logs.length-1],T=s.status||"running",m=s.message||"";if(!(q&&q.phase===b&&q.status===T&&q.message===m)){const J={id:++bm,t:xi(),phase:b,status:T,message:m};_.logs=[...Bt.logs,J]}}Bt=_,zn()},finish({ok:s,message:b,status:_}={}){if(!Bt||Bt.status!=="running")return;const d=_||(s?"done":"error"),E=d==="error"?Bt.phase:"done",k={id:++bm,t:xi(),phase:E,status:d,message:b||(s?"完成":"失败")};Bt={...Bt,status:d,phase:E,minimized:!1,logs:[...Bt.logs,k],lastAt:Date.now()},zn()},close(){Bt=null,zn()}},eo=[["install-docker","准备环境"],["image","下载运行环境"],["container","启动服务"],["done","完成"]],sp={"install-docker":"准备",image:"下载",container:"启动",health:"启动",done:"完成",open:"打开"},op={"install-docker":"Docker Desktop",image:"基础镜像"};function vm(s){return Number.isFinite(s)?s<1024?s+" B":s<1048576?(s/1024).toFixed(0)+" KB":s<1073741824?(s/1048576).toFixed(1)+" MB":(s/1073741824).toFixed(2)+" GB":"?"}function rp({phaseKey:s,bar:b}){const _=Number.isFinite(b==null?void 0:b.progress)?Math.max(0,Math.min(100,b.progress)):0,d=_>=100;return u.jsxs("div",{className:"dlbar","data-id":`DockerDrawer-dlbar-${s}`,children:[u.jsxs("div",{className:"dlbar__head",children:[u.jsx("span",{className:"dlbar__name",children:op[s]||s}),u.jsxs("span",{className:"dlbar__pct",children:[_,"%",b!=null&&b.total?` · ${vm(b.received)} / ${vm(b.total)}`:""]})]}),u.jsx("div",{className:"dlbar__track",children:u.jsx("div",{className:`dlbar__fill${d?" is-done":""}`,style:{width:`${_}%`}})}),(b==null?void 0:b.url)&&u.jsxs("div",{className:"dlbar__url",title:b.url,children:[u.jsx("span",{className:"dlbar__urlk",children:"源"})," ",b.url]}),(b==null?void 0:b.dest)&&u.jsxs("div",{className:"dlbar__url",title:b.dest,children:[u.jsx("span",{className:"dlbar__urlk",children:"存"})," ",b.dest]})]})}function dp(){var T;const[s,b]=x.useState(Bt);x.useEffect(()=>(io.add(b),()=>{io.delete(b)}),[]);const _=x.useRef(null);if(x.useEffect(()=>{const m=_.current;m&&(m.scrollTop=m.scrollHeight)},[(T=s==null?void 0:s.logs)==null?void 0:T.length]),!s)return null;const d=s.status==="running",E=s.kind==="open",k=eo.findIndex(([m])=>m===s.phase),M=E?[]:["install-docker","image"].filter(m=>{var J;return(J=s.bars)==null?void 0:J[m]}),q=E?r("docker.openTitle","打开 Docker 团队"):r("docker.setupTitle","安装 Docker cicy-code");if(s.minimized){const m=M.map(U=>{var at;return(at=s.bars[U])==null?void 0:at.progress}).filter(Number.isFinite),J=m.length?Math.round(m.reduce((U,at)=>U+at,0)/m.length):null;return u.jsxs("button",{type:"button",className:`drawer-min drawer-min--${s.status}`,"data-id":"DockerDrawer-restore",onClick:()=>zt.restore(),children:[u.jsx("span",{className:"drawer-min__spark",children:d?u.jsx(Ye,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("span",{className:"drawer-min__label",children:[q,J!=null?` · ${J}%`:""]})]})}return u.jsx("div",{className:"drawer-scrim","data-id":"DockerDrawer-scrim",onClick:()=>d?zt.minimize():zt.close(),children:u.jsxs("div",{className:"drawer","data-id":"DockerDrawer","data-status":s.status,onClick:m=>m.stopPropagation(),children:[u.jsxs("div",{className:"drawer__head",children:[u.jsxs("div",{className:"drawer__title",children:[u.jsx("span",{className:`drawer__spark drawer__spark--${s.status}`,children:d?u.jsx(Ye,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("div",{children:[u.jsx("div",{className:"drawer__h",children:q}),u.jsx("div",{className:"drawer__sub",children:"127.0.0.1:8008"})]})]}),u.jsx("div",{className:"drawer__headbtns",children:u.jsx("button",{type:"button",className:"drawer__x","data-id":"DockerDrawer-min",title:r("common.minimize","最小化"),onClick:()=>zt.minimize(),"aria-label":"minimize",children:"‒"})})]}),!E&&u.jsx("div",{className:"drawer__steps","data-id":"DockerDrawer-steps",children:eo.map(([m,J],U)=>{const at=s.status==="done"||k>=0&&U<k,F=U===k&&d,I=s.status==="error"&&U===k;return u.jsxs("div",{className:`drawer__step${F?" is-active":""}${at?" is-done":""}${I?" is-error":""}`,children:[u.jsx("span",{className:"drawer__step-dot",children:at?"✓":I?"!":U+1}),u.jsx("span",{className:"drawer__step-label",children:J}),U<eo.length-1&&u.jsx("span",{className:"drawer__step-bar"})]},m)})}),M.length>0&&u.jsx("div",{className:"drawer__dlbars","data-id":"DockerDrawer-dlbars",children:M.map(m=>u.jsx(rp,{phaseKey:m,bar:s.bars[m]},m))}),d&&s.logs.length>0&&u.jsxs("div",{className:"drawer__now","data-id":"DockerDrawer-now",children:[u.jsx(Ye,{}),u.jsx("span",{children:s.logs[s.logs.length-1].message})]}),u.jsx("div",{className:"drawer__log drawer__log--scroll","data-id":"DockerDrawer-log",ref:_,children:s.logs.length===0?u.jsx("div",{className:"drawer__log-empty",children:r("docker.preparing","准备中…")}):s.logs.map(m=>u.jsxs("div",{className:"drawer__line","data-status":m.status,children:[u.jsx("span",{className:"drawer__t",children:m.t}),u.jsx("span",{className:`drawer__badge drawer__badge--${m.phase}`,children:r(`dockerBadge.${m.phase}`,sp[m.phase]||m.phase)}),u.jsx("span",{className:"drawer__linemsg",children:m.message})]},m.id))}),u.jsx("div",{className:"drawer__foot",children:d?u.jsx(u.Fragment,{children:u.jsx("span",{className:"drawer__foot-status",children:E?r("docker.opening","打开中…"):r("docker.installing2","安装进行中…")})}):s.status==="reboot"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-reboot",children:r("docker.rebootShort","需重启 Windows")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>zt.close(),children:r("common.close","关闭")})]}):s.status==="error"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-error",children:E?r("docker.openFailed","打开失败"):r("docker.failed","安装失败")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>zt.close(),children:r("common.close","关闭")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("docker.ready","已就绪")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-finish",onClick:()=>zt.close(),children:r("common.done","完成")})]})})]})})}function fp({dockerTeam:s,cloudTitle:b,cloudCode:_,onOpen:d,onRename:E,onRefresh:k}){var Be;const[M,q]=x.useState(null),[T,m]=x.useState(""),[J,U]=x.useState(!1),[at,F]=x.useState(!1),[I,X]=x.useState(!1),[dt,_t]=x.useState([]),[It,ht]=x.useState(!1),[Gt,lt]=x.useState(""),[wt,G]=x.useState(!1),[ot,B]=x.useState(""),Lt=b||"Docker 团队",Pt=R=>{var $;($=R==null?void 0:R.stopPropagation)==null||$.call(R),B(Lt),G(!0)},re=async()=>{G(!1);const R=String(ot||"").trim();if(!(!R||R===Lt||!E))try{await E(R),k==null||k()}catch{}},[he,le]=x.useState({top:0,left:0}),Zt=x.useRef(null),z=x.useRef(null),Y=184,ct="#2496ed",yt=x.useCallback(async()=>{var R,$,it;try{const tt=await((it=($=(R=window.cicy)==null?void 0:R.docker)==null?void 0:$.appStatus)==null?void 0:it.call($));q(tt);const Et=Date.now()-((Bt==null?void 0:Bt.lastAt)||0)>3e4;tt!=null&&tt.running&&Bt&&Bt.status==="running"&&Bt.kind!=="open"&&Et&&zt.finish({ok:!0,message:"Docker cicy-code 已就绪"})}catch(tt){console.warn("[DockerCard]",tt)}},[]);x.useEffect(()=>{yt();const R=setInterval(()=>{T||yt()},12e3);return()=>clearInterval(R)},[yt,T]);const Dt=x.useCallback(async()=>{var R,$,it;U(!1),lt("");try{const tt=await((it=($=(R=window.cicy)==null?void 0:R.docker)==null?void 0:$.getPorts)==null?void 0:it.call($));_t(((tt==null?void 0:tt.ports)||[]).map(String))}catch{_t([])}X(!0)},[]),h=x.useCallback(async()=>{var tt,Et,At,ne,g,K,gt,P,ut;const R=new Set,$=[];for(const rt of dt){const mt=String(rt).trim();if(!mt)continue;const Ce=Number(mt);if(!Number.isInteger(Ce)||Ce<1||Ce>65535||Ce===8008||R.has(Ce)){lt(r("docker.ports.invalid","有端口无效(1-65535,不能是 8008,不能重复)"));return}R.add(Ce),$.push(Ce)}lt(""),ht(!0),X(!1),m("recreate"),zt.open({onRetry:h});const it=(At=(Et=(tt=window.cicy)==null?void 0:tt.docker)==null?void 0:Et.onAppProgress)==null?void 0:At.call(Et,rt=>zt.push(rt));try{const rt=await((K=(g=(ne=window.cicy)==null?void 0:ne.docker)==null?void 0:g.setPorts)==null?void 0:K.call(g,$));if(zt.finish({ok:!!(rt!=null&&rt.ok),message:rt!=null&&rt.ok?r("docker.ports.save","保存并重建")+" ✅":(rt==null?void 0:rt.error)||r("docker.opFailed","操作失败")}),rt!=null&&rt.ok)try{const mt=await((ut=(P=(gt=window.cicy)==null?void 0:gt.docker)==null?void 0:P.appRedetect)==null?void 0:ut.call(P));mt&&q(mt)}catch{}}catch(rt){zt.finish({ok:!1,message:rt.message})}finally{try{it&&it()}catch{}ht(!1),m(""),yt()}},[dt,yt]);x.useEffect(()=>{if(!J)return;const R=it=>{var tt,Et;(tt=Zt.current)!=null&&tt.contains(it.target)||(Et=z.current)!=null&&Et.contains(it.target)||U(!1)},$=it=>{it.key==="Escape"&&U(!1)};return document.addEventListener("mousedown",R),document.addEventListener("keydown",$),()=>{document.removeEventListener("mousedown",R),document.removeEventListener("keydown",$)}},[J]);const N=()=>{if(!J&&Zt.current){const R=Zt.current.getBoundingClientRect(),$=Math.max(8,Math.min(R.right-Y,window.innerWidth-Y-8));le({top:Math.round(R.bottom+4),left:Math.round($)})}U(R=>!R)},Q=x.useCallback(async()=>{var $,it,tt,Et,At,ne;m("bootstrap"),zt.open({onRetry:Q});const R=(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.onAppProgress)==null?void 0:tt.call(it,g=>zt.push(g));try{const g=await((ne=(At=(Et=window.cicy)==null?void 0:Et.docker)==null?void 0:At.appBootstrap)==null?void 0:ne.call(At));(g==null?void 0:g.reason)==="installer_launched"?zt.finish({status:"reboot",message:r("docker.installerLaunched","已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」")}):(g==null?void 0:g.reason)==="wsl_reboot_required"?zt.finish({status:"reboot",message:r("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):zt.finish({ok:!!(g!=null&&g.ok),message:g!=null&&g.ok?r("docker.ready","Docker cicy-code 已就绪"):(g==null?void 0:g.error)||r("docker.failed","安装失败")}),g!=null&&g.ok&&(k==null||k())}catch(g){zt.finish({ok:!1,message:g.message})}finally{try{R&&R()}catch{}m(""),yt()}},[yt,k]),W=x.useCallback(async()=>{var $,it,tt,Et,At,ne;m("repair"),zt.open({onRetry:W});const R=(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.onAppProgress)==null?void 0:tt.call(it,g=>zt.push(g));try{const g=await((ne=(At=(Et=window.cicy)==null?void 0:Et.docker)==null?void 0:At.appRepairWsl)==null?void 0:ne.call(At));g!=null&&g.needsReboot?zt.finish({status:"reboot",message:r("docker.wslNeedReboot","WSL 服务卡死,请【重启 Windows】;重启后打开 CiCy 会自动修复(旧数据已改名备份,不删)。")}):g!=null&&g.ok?(zt.finish({ok:!0,message:r("docker.wslRepaired","WSL 已修复 ✅")}),k==null||k()):zt.finish({ok:!1,message:(g==null?void 0:g.error)||r("docker.repairFailed","修复失败")})}catch(g){zt.finish({ok:!1,message:g.message})}finally{try{R&&R()}catch{}m(""),yt()}},[yt,k]),pt=x.useCallback(async()=>{var $,it,tt,Et,At,ne;U(!1),m("upgrade"),zt.open({onRetry:pt});const R=(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.onAppProgress)==null?void 0:tt.call(it,g=>zt.push(g));try{const g=await((ne=(At=(Et=window.cicy)==null?void 0:Et.docker)==null?void 0:At.appUpgrade)==null?void 0:ne.call(At));(g==null?void 0:g.reason)==="wsl_reboot_required"?zt.finish({status:"reboot",message:r("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):zt.finish({ok:!!(g!=null&&g.ok),message:g!=null&&g.ok?r("docker.upgraded","已升级到最新"):(g==null?void 0:g.error)||r("docker.upgradeFailed","升级失败")}),g!=null&&g.ok&&(k==null||k())}catch(g){zt.finish({ok:!1,message:g.message})}finally{try{R&&R()}catch{}m(""),yt()}},[yt,k]),vt=x.useCallback(async()=>{var $,it,tt,Et,At,ne,g,K,gt,P,ut,rt;U(!1),m("update"),zt.open({onRetry:vt});const R=(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.onAppProgress)==null?void 0:tt.call(it,mt=>zt.push(mt));try{const mt=await((ne=(At=(Et=window.cicy)==null?void 0:Et.docker)==null?void 0:At.appUpdate)==null?void 0:ne.call(At));if(zt.finish({ok:!!(mt!=null&&mt.ok),message:mt!=null&&mt.ok?r("docker.updated","cicy-code 已更新到最新"):(mt==null?void 0:mt.error)||r("docker.updateFailed","更新失败")}),mt!=null&&mt.ok){k==null||k();try{(gt=(K=(g=window.cicy)==null?void 0:g.tabs)==null?void 0:K.reloadIfOpen)==null||gt.call(K,"http://127.0.0.1:8008",r("docker.teamTab","Docker 团队"))}catch{}try{const Ce=await((rt=(ut=(P=window.cicy)==null?void 0:P.docker)==null?void 0:ut.appRedetect)==null?void 0:rt.call(ut));Ce&&q(Ce)}catch{}}}catch(mt){zt.finish({ok:!1,message:mt.message})}finally{try{R&&R()}catch{}m(""),yt()}},[yt,k]),St=x.useCallback(async(R,$,it)=>{U(!1),m(R),Nt.show({id:"docker-op",message:r(`docker.${R}ing`,R==="restart"?"重启中…":R==="reload"?"刷新中…":"停止中…"),status:"running"});try{const tt=await $();tt!=null&&tt.ok?Nt.show({id:"docker-op",message:it,status:"done",ttl:2500}):Nt.show({id:"docker-op",message:(tt==null?void 0:tt.error)||r("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(tt){Nt.show({id:"docker-op",message:tt.message,status:"error",ttl:6e3})}finally{m(""),yt()}},[yt]),ue=x.useCallback(async()=>{U(!1),m("authssh"),Nt.show({id:"docker-op",message:r("docker.authorizingHost","授权容器访问 Mac(配置 SSH)…"),status:"running"});try{const R=await window.cicy.docker.appAuthorizeHostSsh();R!=null&&R.ok?Nt.show({id:"docker-op",message:R.verified?r("docker.authorizedHostOk","已授权:容器内 `ssh mac` 可访问 Mac ✅"):r("docker.authorizedHostPartial","公钥已写入 Mac(未验证成功,可在容器内手动 `ssh mac` 试)"),status:R.verified?"done":"error",ttl:5e3}):Nt.show({id:"docker-op",message:(R==null?void 0:R.error)||r("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(R){Nt.show({id:"docker-op",message:R.message,status:"error",ttl:6e3})}finally{m(""),yt()}},[yt]),Rt=((Be=window.cicy)==null?void 0:Be.platform)||(M==null?void 0:M.platform);if(Rt!=="win32")return null;const ge=M?!!M.running:(s==null?void 0:s.status)==="running",V=!!(M!=null&&M.dockerRunning),Yt=!!(M!=null&&M.installed),we=!!(M!=null&&M.unknown)&&!ge&&!V&&!Yt,qt=!!(M!=null&&M.wslUnmanaged),Ne=!!(M!=null&&M.wslWedged),Fe=ge&&!qt,Ge=Fe?"ok":Ne||qt||V||Yt||we?"warn":"off",be=!!T;Ne?r("docker.wslWedged","WSL 卡死 · 点「修复 WSL」"):qt?r("docker.wslBrokenRepair","WSL 管理异常 · 点「修复 WSL」重装"):ge?r("docker.running","运行中"):V?r("docker.notRunning","未启动 · 点「启动」"):Yt?r("docker.engineDown","Docker 未运行 · 点启动"):we?r("docker.wslUnresponsive","WSL 未响应 · 点「重试检测」"):r("docker.notInstalled","Docker Desktop 未安装");const Ca=T==="open"?r("docker.opening","打开中…"):T==="probe"?r("docker.probing","检测中…"):be?r("docker.working","处理中…"):Fe?r("localTeams.open","打开"):Ne||qt?r("docker.repairWsl","修复 WSL"):V?r("docker.start","启动"):Yt?r("docker.startDocker","启动 Docker"):we?r("docker.retryProbe","重试检测"):r("docker.install","下载安装"),je=async()=>{var R,$,it,tt,Et,At,ne,g,K,gt,P,ut;if(!be){if(Ne){W();return}if(qt){Q();return}if(Fe){try{const mt=await((it=($=(R=window.cicy)==null?void 0:R.tabs)==null?void 0:$.activateIfOpen)==null?void 0:it.call($,"http://127.0.0.1:8008"));if(mt!=null&&mt.active)return}catch{}m("open");let rt=null;try{rt=await((At=(Et=(tt=window.cicy)==null?void 0:tt.docker)==null?void 0:Et.appOpen)==null?void 0:At.call(Et))}catch(mt){rt={ok:!1,hint:(mt==null?void 0:mt.message)||r("docker.openFailed","打开失败"),log:[]}}m(""),rt&&rt.ok===!1&&(zt.open({onRetry:je,kind:"open"}),(rt.log||[]).forEach(mt=>zt.push(mt)),zt.finish({ok:!1,message:rt.hint||rt.error||r("docker.openFailed","打开失败")}));return}if(we){m("probe");try{const rt=await(((K=(g=(ne=window.cicy)==null?void 0:ne.docker)==null?void 0:g.appRedetect)==null?void 0:K.call(g))??((ut=(P=(gt=window.cicy)==null?void 0:gt.docker)==null?void 0:P.appStatus)==null?void 0:ut.call(P)));rt&&q(rt),rt!=null&&rt.unknown&&Nt.show({id:"docker-probe",status:"error",message:r("docker.wslStillStuck","WSL 仍无响应 —— 多半要重启 Windows 后再试"),ttl:6e3})}catch{Nt.show({id:"docker-probe",status:"error",message:r("docker.probeFailed","检测失败,请重试"),ttl:5e3})}finally{m("")}return}Q()}},He=ge;return u.jsxs("div",{"data-id":"DockerCard",className:`bcard bcard--docker${ge?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent",style:{background:ct}}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",style:{color:ct},children:[u.jsx("span",{className:"bcard__dot","data-tone":Ge}),u.jsx("svg",{style:{width:18,height:18},viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:u.jsx("path",{d:"M21.81 10.25c-.06-.05-.67-.51-1.95-.51-.34 0-.68.03-1.01.09-.25-1.69-1.64-2.51-1.7-2.55l-.34-.2-.22.32a4.5 4.5 0 0 0-.59 1.4c-.23.94-.09 1.83.39 2.59-.58.32-1.51.4-1.7.41H2.62a.61.61 0 0 0-.61.61 9.32 9.32 0 0 0 .57 3.35 4.9 4.9 0 0 0 1.95 2.53c.92.52 2.42.82 4.12.82.77 0 1.54-.07 2.3-.21a9.6 9.6 0 0 0 3-1.09 8.3 8.3 0 0 0 2.05-1.68c.98-1.11 1.56-2.35 1.99-3.45h.17c1.36 0 2.2-.55 2.66-1l.13-.16zM4.7 11.33h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H4.7a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.46 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16M7.16 9.06h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16"})})]}),He&&u.jsxs("div",{className:"bcard__menuwrap",onClick:R=>R.stopPropagation(),children:[u.jsx("button",{type:"button",ref:Zt,"data-id":"DockerCard-menu-btn",className:"bcard__kebab",title:r("docker.manage","管理 Docker cicy-code"),disabled:be,onClick:N,children:be?u.jsx(Ye,{}):u.jsx(oo,{})}),J&&Sa.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"DockerCard-menu",role:"menu",ref:z,style:{position:"fixed",top:he.top,left:he.left,width:Y},onClick:R=>R.stopPropagation(),children:[u.jsx("button",{type:"button","data-id":"DockerCard-update",className:"bcard__menu-item is-accent",onClick:vt,children:r("docker.update","更新 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-restart",className:"bcard__menu-item",onClick:()=>St("restart",()=>window.cicy.docker.appRestart(),r("docker.restarted","已重启 cicy-code")),children:r("docker.restart","重启 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-stop",className:"bcard__menu-item is-danger",onClick:()=>St("stop",()=>window.cicy.docker.appStop(),r("docker.stopped","已停止 cicy-code")),children:r("docker.stop","停止 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-reload",className:"bcard__menu-item",onClick:R=>{var $,it,tt;R.stopPropagation(),U(!1),(tt=(it=($=window.cicy)==null?void 0:$.tabs)==null?void 0:it.reloadIfOpen)==null||tt.call(it,"http://127.0.0.1:8008","Docker 团队")},children:r("docker.reloadWindow","刷新窗口")}),u.jsx("button",{type:"button","data-id":"DockerCard-open-dir",className:"bcard__menu-item",onClick:R=>{var $,it,tt;R.stopPropagation(),U(!1),(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.openDir)==null||tt.call(it)},children:r("docker.openWslDir","打开 WSL 目录")}),u.jsx("button",{type:"button","data-id":"DockerCard-open-projects",className:"bcard__menu-item",onClick:R=>{var $,it,tt;R.stopPropagation(),U(!1),(tt=(it=($=window.cicy)==null?void 0:$.docker)==null?void 0:it.openDir)==null||tt.call(it,"projects")},children:r("docker.openProjectsDir","打开项目目录")}),u.jsx("button",{type:"button","data-id":"DockerCard-billing",className:"bcard__menu-item",onClick:()=>{U(!1),_i(_||s!=null&&s.cloud_team_id?`?team=${encodeURIComponent(_||s.cloud_team_id)}`:"?view=usage")},children:r("docker.billing","帐单")}),u.jsx("div",{className:"bcard__menu-sep","data-id":"DockerCard-menu-sep",role:"separator","aria-hidden":!0}),Rt==="darwin"&&u.jsx("button",{type:"button","data-id":"DockerCard-authorize-host-ssh",className:"bcard__menu-item",title:r("docker.authorizeHostHint","把容器公钥加到 Mac 的 authorized_keys,容器内 `ssh mac` 即可访问本机"),onClick:ue,children:r("docker.authorizeHost","授权容器访问 Mac")}),u.jsx("button",{type:"button","data-id":"DockerCard-docker-restart",className:"bcard__menu-item",onClick:()=>St("restart",()=>window.cicy.docker.appDockerRestart(),r("docker.dockerRestarted","已重启 Docker 容器")),children:r("docker.dockerRestart","重启 Docker")}),u.jsx("button",{type:"button","data-id":"DockerCard-ports",className:"bcard__menu-item",onClick:R=>{R.stopPropagation(),Dt()},children:r("docker.ports.menu","端口设置")}),u.jsx("button",{type:"button","data-id":"DockerCard-recreate",className:"bcard__menu-item is-danger",onClick:R=>{R.stopPropagation(),U(!1),F(!0)},children:r("docker.recreate","重建 Docker")})]}),document.body)]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(so,{size:24,avatar:s==null?void 0:s.avatar,name:Lt,teamId:s==null?void 0:s.id,onChanged:k}),wt?u.jsx("input",{"data-id":"DockerCard-rename-input",autoFocus:!0,value:ot,onChange:R=>B(R.target.value),onFocus:R=>R.target.select(),onBlur:re,onClick:R=>R.stopPropagation(),onKeyDown:R=>{R.nativeEvent.isComposing||R.keyCode===229||(R.key==="Enter"?re():R.key==="Escape"&&G(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:E?r("localTeams.renameHint","点名字或 ✎ 改名"):Lt,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:E?Pt:void 0,children:[u.jsx("span",{onClick:E?Pt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:E?"text":"default"},children:Lt}),E&&u.jsx("button",{type:"button","data-id":"DockerCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:Pt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsxs("div",{className:"bcard__meta",children:[u.jsx("span",{className:"bcard__chip",children:"Docker"}),(M==null?void 0:M.version)&&u.jsxs("span",{className:"bcard__ver","data-id":"DockerCard-ver",style:{marginLeft:8,fontSize:11,opacity:.6},children:["v",M.version]})]})]}),u.jsxs("button",{type:"button",className:"bcard__cta","data-id":"DockerCard-cta",disabled:be,onClick:je,style:ge?void 0:{background:ct,color:"white"},children:[be?u.jsx(Ye,{}):u.jsx(Hu,{}),u.jsx("span",{children:Ca})]}),at&&Sa.createPortal(u.jsx("div",{"data-id":"DockerCard-recreate-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:R=>{R.target===R.currentTarget&&F(!1)},children:u.jsxs("div",{onClick:R=>R.stopPropagation(),style:{width:360,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[u.jsx("h3",{style:{margin:"0 0 8px",fontSize:16,color:"#e6edf3"},children:r("docker.recreate","重建 Docker")}),u.jsx("p",{style:{margin:"0 0 18px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:r("docker.recreateConfirm","会删除当前容器并重新创建(volume 数据保留),用于切换为独立 team 的网关 key。确定重建?")}),u.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[u.jsx("button",{type:"button","data-id":"DockerCard-recreate-cancel",onClick:()=>F(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:r("common.cancel","取消")}),u.jsx("button",{type:"button","data-id":"DockerCard-recreate-confirm",onClick:()=>{F(!1),St("restart",()=>window.cicy.docker.appRecreate(),r("docker.recreated","已重建 Docker 容器"))},style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#da3633",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:r("docker.recreateOk","确定重建")})]})]})}),document.body),I&&Sa.createPortal(u.jsx("div",{"data-id":"DockerCard-ports-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:R=>{R.target===R.currentTarget&&X(!1)},children:u.jsxs("div",{onClick:R=>R.stopPropagation(),style:{width:420,maxWidth:"92vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[u.jsx("h3",{style:{margin:"0 0 6px",fontSize:16,color:"#e6edf3"},children:r("docker.ports.title","端口设置")}),u.jsx("p",{style:{margin:"0 0 14px",fontSize:12.5,lineHeight:1.6,color:"#9aa4b2"},children:r("docker.ports.sub","除 :8008 外,额外发布、可从 Windows 直达容器内服务的端口")}),u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"8px 10px",marginBottom:10,borderRadius:8,background:"#0d1117",border:"1px solid #21262d",color:"#7d8590",fontSize:13},children:["🔒 ",r("docker.ports.mainFixed",":8008 · cicy-code(固定)")]}),u.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8,maxHeight:220,overflowY:"auto"},children:[dt.length===0&&u.jsx("div",{style:{fontSize:12.5,color:"#6e7681",padding:"4px 2px"},children:r("docker.ports.none","暂无额外端口")}),dt.map((R,$)=>u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[u.jsx("input",{"data-id":`DockerCard-port-input-${$}`,type:"text",inputMode:"numeric",value:R,placeholder:r("docker.ports.ph","端口号 1-65535"),onChange:it=>{const tt=it.target.value.replace(/[^0-9]/g,"");_t(Et=>Et.map((At,ne)=>ne===$?tt:At)),lt("")},style:{flex:1,padding:"7px 10px",borderRadius:8,border:"1px solid #30363d",background:"#0d1117",color:"#e6edf3",fontSize:13,fontFamily:"var(--mono)"}}),u.jsx("button",{type:"button","data-id":`DockerCard-port-remove-${$}`,title:r("docker.ports.remove","移除"),onClick:()=>{_t(it=>it.filter((tt,Et)=>Et!==$)),lt("")},style:{padding:"6px 10px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#da3633",cursor:"pointer",fontSize:14},children:"✕"})]},$))]}),u.jsx("button",{type:"button","data-id":"DockerCard-port-add",onClick:()=>_t(R=>[...R,""]),style:{marginTop:10,padding:"7px 12px",borderRadius:8,border:"1px dashed #30363d",background:"transparent",color:"#58a6ff",cursor:"pointer",fontSize:13,width:"100%"},children:r("docker.ports.add","+ 添加端口")}),Gt&&u.jsx("div",{style:{marginTop:10,fontSize:12.5,color:"#f85149"},children:Gt}),u.jsx("p",{style:{margin:"12px 0 16px",fontSize:11.5,lineHeight:1.5,color:"#6e7681"},children:r("docker.ports.hint","保存会重建容器(volume 数据保留),会有短暂中断")}),u.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[u.jsx("button",{type:"button","data-id":"DockerCard-ports-cancel",disabled:It,onClick:()=>X(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:r("docker.ports.cancel","取消")}),u.jsx("button",{type:"button","data-id":"DockerCard-ports-save",disabled:It,onClick:h,style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#238636",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:It?r("docker.ports.saving","保存中…"):r("docker.ports.save","保存并重建")})]})]})}),document.body)]})}function Sm({team:s,cloudCode:b,onOpen:_,onRename:d,onRefresh:E}){var tt,Et,At,ne;const M=(wm[s.status]||wm.error).tone,[q,T]=x.useState(!1),[m,J]=x.useState(s.name||""),[U,at]=x.useState(null),[F,I]=x.useState(""),X=U??s.name;x.useEffect(()=>{U!=null&&s.name===U&&at(null)},[s.name,U]);const dt=g=>{var K;(K=g==null?void 0:g.stopPropagation)==null||K.call(g),J(X||""),T(!0)},_t=async()=>{T(!1);const g=String(m||"").trim();if(!d||!g||g===X)return;at(g),I("saving");let K;try{K=await d(s.id,g)}catch(gt){K={ok:!1,error:gt==null?void 0:gt.message}}at(null),K&&K.ok?(I("saved"),setTimeout(()=>I(gt=>gt==="saved"?"":gt),1500)):(I(""),Nt.show({message:r("localTeams.renameFailed","改名没保存,已恢复"),status:"error",ttl:4e3}))},ht=!!((Et=(tt=window.cicy)==null?void 0:tt.sidecar)!=null&&Et.restart)&&uo(s.base_url),Gt=s.status==="running",[lt,wt]=x.useState(""),[G,ot]=x.useState(!1),[B,Lt]=x.useState(!1);x.useEffect(()=>{var g,K;!ht||!((K=(g=window.cicy)==null?void 0:g.sidecar)!=null&&K.getPublic)||window.cicy.sidecar.getPublic().then(gt=>Lt(!!(gt!=null&>.public))).catch(()=>{})},[ht]);const[Pt,re]=x.useState({running:void 0,latest:null,installed:null}),he=Pt.latest,le=Pt.running,[Zt,z]=x.useState(!1),Y=x.useRef(null),ct=x.useRef(null),yt=x.useRef(null),[Dt,h]=x.useState({top:0,left:0}),N=184,Q=()=>{if(!G&&ct.current){const g=ct.current.getBoundingClientRect(),K=Math.max(8,Math.min(g.right-N,window.innerWidth-N-8));h({top:Math.round(g.bottom+4),left:Math.round(K)})}ot(g=>!g)},W=x.useCallback(async(g=!1)=>{var K,gt;if(!(!ht||!((gt=(K=window.cicy)==null?void 0:K.sidecar)!=null&>.versions))){g&&z(!0);try{const P=await window.cicy.sidecar.versions();re({running:(P==null?void 0:P.running)??null,latest:(P==null?void 0:P.latest)??null,installed:(P==null?void 0:P.installed)??null}),g&&(P!=null&&P.running&&(P!=null&&P.latest)&&_m(P.latest,P.running)>0?Nt.show({message:`${r("sidecar.found","发现新版本")} v${P.latest}`,status:"done",ttl:2500}):P!=null&&P.running?Nt.show({message:`${r("sidecar.upToDate","已是最新")} v${P.running}`,status:"done",ttl:2500}):Nt.show({message:r("sidecar.notRunning","cicy-code 未运行"),status:"error",ttl:4e3}))}catch{g&&Nt.show({message:r("sidecar.checkFailed","检查更新失败"),status:"error",ttl:5e3})}finally{g&&z(!1)}}},[ht]);x.useEffect(()=>{W(!1)},[W]),x.useEffect(()=>{Gt&&W(!1)},[Gt,W]);const pt=!!(ht&&he&&le&&_m(he,le)>0),vt=!ht&&!!((ne=(At=window.cicy)==null?void 0:At.localTeams)!=null&&ne.remove),St=ht||vt,[ue,Rt]=x.useState(!1),[ge,V]=x.useState(!1),[Yt,we]=x.useState(""),[qt,Ne]=x.useState(!1),[Fe,Ge]=x.useState("");x.useEffect(()=>{if(!G)return;const g=K=>{var gt,P;(gt=ct.current)!=null&>.contains(K.target)||(P=yt.current)!=null&&P.contains(K.target)||ot(!1)};return document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[G]);const be=async()=>{var K,gt,P;if(qt)return;const g=String(Yt||"").trim();if(!g||g===(s.base_url||"")){V(!1);return}try{new URL(g)}catch{Ge(r("teams.badUrl","URL 无效(需含 http(s)://)"));return}Ge(""),Ne(!0);try{const ut=await((P=(gt=(K=window.cicy)==null?void 0:K.localTeams)==null?void 0:gt.update)==null?void 0:P.call(gt,s.id,{base_url:g}));ut!=null&&ut.ok?(V(!1),E==null||E()):Ge(Ka((ut==null?void 0:ut.error)||"update failed"))}catch(ut){Ge(Ka((ut==null?void 0:ut.message)||String(ut)))}Ne(!1)},Ca=async()=>{var K,gt,P;if(lt)return;Rt(!1),wt("remove");const g="op-"+Date.now();Nt.show({id:g,message:r("localTeams.removing","删除中…"),status:"running"});try{const ut=await((P=(gt=(K=window.cicy)==null?void 0:K.localTeams)==null?void 0:gt.remove)==null?void 0:P.call(gt,s.id));ut!=null&&ut.ok?Nt.show({id:g,message:r("localTeams.removed","已删除"),status:"done",ttl:3e3}):Nt.show({id:g,message:r("localTeams.removeFailed","删除失败")+(ut!=null&&ut.error?": "+ut.error:""),status:"error",ttl:7e3})}catch(ut){Nt.show({id:g,message:r("localTeams.removeFailed","删除失败")+": "+((ut==null?void 0:ut.message)||ut),status:"error",ttl:7e3})}wt(""),E==null||E()},je=`sidecar-op:${s.id}`,He=async(g,K,gt)=>{var rt,mt,Ce,za,Sl;if(ot(!1),lt)return;wt(g);const P=g==="update";let ut=null;P?(me.open({teamId:s.id,fromVer:le,toVer:he,onRetry:()=>He("update",K,gt)}),(mt=(rt=window.cicy)==null?void 0:rt.sidecar)!=null&&mt.onOpProgress&&(ut=window.cicy.sidecar.onOpProgress(Wt=>{(Wt==null?void 0:Wt.op)==="update"&&me.push(Wt)}))):Nt.show({id:je,message:Be[g]||`${g}…`,status:"running",progress:void 0});try{const Wt=await K(),De=!!(Wt!=null&&Wt.ok),xa=Wt!=null&&Wt.warning?`${gt}(${Wt.warning})`:gt,ua=r("sidecar.failed","操作失败")+(Wt!=null&&Wt.error?`: ${Wt.error}`:"");if(P){if(me.finish({ok:De,message:De?xa:ua}),De)try{await((Sl=(za=(Ce=window.cicy)==null?void 0:Ce.localTeams)==null?void 0:za.reload)==null?void 0:Sl.call(za,s.id,{ignoreCache:!0}))}catch{}}else Nt.show({id:je,message:De?xa:ua,progress:void 0,status:De?"done":"error",ttl:De?4e3:8e3})}catch(Wt){const De=r("sidecar.failed","操作失败")+`: ${(Wt==null?void 0:Wt.message)||Wt}`;P?me.finish({ok:!1,message:De}):Nt.show({id:je,message:De,progress:void 0,status:"error",ttl:8e3})}finally{try{ut&&ut()}catch{}wt(""),E==null||E(),(g==="update"||g==="restart"||g==="start")&&W(!1)}},Be={start:r("busy.start","启动中…"),restart:r("busy.restart","重启中…"),update:r("busy.update","更新中…"),stop:r("busy.stop","停止中…")},R=async()=>{var gt,P,ut;wt("start"),me.open({teamId:s.id,title:r("sidecar.startTitle","启动 cicy-code"),onRetry:R}),me.push({phase:"download",status:"running",message:r("sidecar.starting","启动 cicy-code(首次需安装 Node + 依赖,日志见下)…")});const g=(ut=(P=(gt=window.cicy)==null?void 0:gt.sidecar)==null?void 0:P.onOpProgress)==null?void 0:ut.call(P,rt=>me.push(rt));let K;try{K=await window.cicy.sidecar.start()}catch(rt){K={ok:!1,error:(rt==null?void 0:rt.message)||String(rt)}}try{g==null||g()}catch{}return wt(""),E==null||E(),!(K!=null&&K.ok)||K!=null&&K.warning?(me.finish({ok:!1,message:r("sidecar.startFailed","启动失败")+(K!=null&&K.error?`: ${K.error}`:K!=null&&K.warning?`: ${K.warning}`:"")}),!1):(me.finish({ok:!0,message:r("sidecar.startedOk","cicy-code 已就绪")}),!0)},$=async()=>{var g,K;lt||!Gt&&ht&&((K=(g=window.cicy)==null?void 0:g.sidecar)!=null&&K.start)&&!await R()||_()},it=Gt?r("localTeams.open","打开"):ht?r("localTeams.startOpen","启动并打开"):r("localTeams.open","打开");return u.jsxs(u.Fragment,{children:[u.jsxs("div",{"data-id":"LocalTeamCard",className:`bcard ${ht?"bcard--local":"bcard--custom"}${M==="ok"?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent"}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":M}),u.jsx(bp,{})]}),St&&u.jsxs("div",{className:"bcard__menuwrap",ref:Y,onClick:g=>g.stopPropagation(),children:[u.jsx("button",{type:"button",ref:ct,"data-id":"LocalTeamCard-menu-btn",className:`bcard__kebab${pt?" has-dot":""}`,title:ht?r("localTeams.manage","管理本地 cicy-code"):r("localTeams.more","更多"),disabled:!!lt,onClick:Q,children:lt?u.jsx(Ye,{}):u.jsx(oo,{})}),G&&Sa.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"LocalTeamCard-menu",role:"menu",ref:yt,style:{position:"fixed",top:Dt.top,left:Dt.left,width:N},onClick:g=>g.stopPropagation(),children:[ht&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-check-update",className:"bcard__menu-item",disabled:Zt,onClick:g=>{g.stopPropagation(),W(!0)},children:Zt?r("sidecar.checking2","检查中…"):r("sidecar.checkUpdate","检查更新")}),pt&&u.jsxs("button",{type:"button","data-id":"LocalTeamCard-update",className:"bcard__menu-item is-accent",onClick:()=>He("update",()=>window.cicy.sidecar.update(),r("sidecar.updated","已更新到最新")),children:[r("sidecar.updateTo","更新到")," v",he]}),s.base_url&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-reload",className:"bcard__menu-item",onClick:g=>{var K,gt,P;g.stopPropagation(),ot(!1),(P=(gt=(K=window.cicy)==null?void 0:K.tabs)==null?void 0:gt.reloadIfOpen)==null||P.call(gt,s.base_url,s.name)},children:r("localTeams.reloadWindow","刷新窗口")}),ht&&Gt&&u.jsxs(u.Fragment,{children:[u.jsx("button",{type:"button","data-id":"LocalTeamCard-restart",className:"bcard__menu-item",onClick:()=>He("restart",()=>window.cicy.sidecar.restart(),r("sidecar.restarted","已重启")),children:r("sidecar.restart","重启")}),u.jsx("button",{type:"button","data-id":"LocalTeamCard-stop",className:"bcard__menu-item is-danger",onClick:()=>He("stop",()=>window.cicy.sidecar.stop(),r("sidecar.stoppedDone","已停止")),children:r("sidecar.stop","停止")}),u.jsxs("button",{type:"button","data-id":"LocalTeamCard-lan",className:"bcard__menu-item",title:r("sidecar.lanHint","开启后同局域网设备可用本机 IP 访问(api_token 仍校验);切换会自动重启 cicy-code"),disabled:lt==="lan",onClick:async()=>{if(lt)return;const g=!B;ot(!1),wt("lan"),Lt(g),Nt.show({id:je,message:g?r("sidecar.lanEnabling","开启局域网访问,重启中…"):r("sidecar.lanDisabling","关闭局域网访问,重启中…"),status:"running",progress:void 0});try{const K=await window.cicy.sidecar.setPublic(g);K!=null&&K.ok?Nt.show({id:je,message:g?r("sidecar.lanOn","已开启局域网访问"):r("sidecar.lanOff","已关闭局域网访问"),status:"done",ttl:3e3}):Nt.show({id:je,message:r("sidecar.lanFailed","设置失败")+(K!=null&&K.error?`: ${K.error}`:""),status:"error",ttl:7e3})}catch(K){Nt.show({id:je,message:r("sidecar.lanFailed","设置失败")+`: ${(K==null?void 0:K.message)||K}`,status:"error",ttl:7e3})}try{const K=await window.cicy.sidecar.getPublic();Lt(!!(K!=null&&K.public))}catch{}wt(""),E==null||E()},children:[r("sidecar.lanAccess","局域网访问")," · ",B?r("common.on","开"):r("common.off","关")]})]}),s.cloud_team_id&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-billing",className:"bcard__menu-item",onClick:g=>{g.stopPropagation(),ot(!1),_i(`?team=${encodeURIComponent(b||s.cloud_team_id)}`)},children:r("localTeams.billing","账单")}),vt&&u.jsxs(u.Fragment,{children:[u.jsx("button",{type:"button","data-id":"LocalTeamCard-edit-url",className:"bcard__menu-item",onClick:g=>{g.stopPropagation(),ot(!1),V(!0),we(s.base_url||"")},children:r("teamCard.editUrl","更改访问地址")}),u.jsx("button",{type:"button","data-id":"LocalTeamCard-remove",className:"bcard__menu-item is-danger",onClick:()=>{ot(!1),Rt(!0)},children:r("localTeams.remove","删除")})]}),(le||s.version)&&u.jsxs("div",{"data-id":"LocalTeamCard-version",className:"bcard__menu-item",style:{cursor:"default",color:"#8b949e",fontSize:12},children:[r("localTeams.version","版本")," v",le||s.version]})]}),document.body)]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(so,{size:24,avatar:s==null?void 0:s.avatar,name:s==null?void 0:s.name,teamId:s==null?void 0:s.id,onChanged:E}),q?u.jsx("input",{"data-id":"LocalTeamCard-rename-input",autoFocus:!0,value:m,onChange:g=>J(g.target.value),onFocus:g=>g.target.select(),onBlur:_t,onClick:g=>g.stopPropagation(),onKeyDown:g=>{g.nativeEvent.isComposing||g.keyCode===229||(g.key==="Enter"?_t():g.key==="Escape"&&T(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:r("localTeams.renameHint","点名字或 ✎ 改名"),style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:dt,children:[u.jsx("span",{"data-id":"LocalTeamCard-name-text",onClick:dt,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"text"},children:X}),F==="saving"&&u.jsx("span",{"data-id":"LocalTeamCard-save-state",title:r("localTeams.saving","保存中…"),style:{flex:"none",display:"inline-flex"},children:u.jsx(Ye,{})}),F==="saved"&&u.jsx("span",{"data-id":"LocalTeamCard-save-state",title:r("localTeams.saved","已保存"),style:{flex:"none",color:"#3fb950",fontSize:13,lineHeight:1},children:"✓"}),!F&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:dt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsx("div",{className:"bcard__meta",children:u.jsx("span",{className:"bcard__chip","data-id":"LocalTeamCard-kind",children:ht?r("localTeams.kindLocal","本地"):r("localTeams.kindCustom","自定义")})})]}),u.jsxs("button",{type:"button",className:"bcard__cta","data-id":"LocalTeamCard-open",disabled:!!lt||!s.base_url,onClick:$,children:[lt&<!=="stop"?u.jsx(Ye,{}):u.jsx(Hu,{}),u.jsx("span",{children:lt&&Be[lt]||it})]})]}),ge&&Sa.createPortal(u.jsx("div",{"data-id":"LocalTeamCard-url-modal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:g=>{!qt&&g.target===g.currentTarget&&V(!1)},children:u.jsxs("div",{onClick:g=>g.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("teamCard.editUrl","更改访问地址")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:s.name}),u.jsx("textarea",{"data-id":"LocalTeamCard-url-input",autoFocus:!0,rows:3,className:"login-email-input",style:{width:"100%",resize:"vertical",lineHeight:1.5,fontFamily:"var(--mono)"},value:Yt,placeholder:"https://example.com:8008",spellCheck:!1,disabled:qt,onChange:g=>we(g.target.value.replace(/[\r\n]+/g,"")),onKeyDown:g=>{g.nativeEvent.isComposing||g.keyCode===229||(g.key==="Enter"?(g.preventDefault(),be()):g.key==="Escape"&&V(!1))}}),Fe&&u.jsx("div",{className:"error",style:{marginTop:8,fontSize:12},children:Fe}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",disabled:qt,onClick:()=>V(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"LocalTeamCard-url-save",disabled:qt,onClick:be,children:qt?r("common.saving","保存中…"):r("common.save","保存")})]})]})}),document.body),u.jsx(Nm,{open:ue,title:r("localTeams.deleteTitle","删除团队"),message:r("localTeams.deleteMsg","确定删除「{{name}}」?此操作不可撤销。",{name:s.name}),confirmLabel:r("common.delete","删除"),danger:!0,onConfirm:Ca,onCancel:()=>Rt(!1)})]})}function uo(s){var b;try{if(((b=window.cicy)==null?void 0:b.platform)==="win32")return!1;const _=new URL(s);return(_.hostname==="127.0.0.1"||_.hostname==="localhost"||_.hostname==="::1")&&(_.port==="8008"||_.port==="")}catch{return!1}}function xm(s){var b;try{if(((b=window.cicy)==null?void 0:b.platform)!=="win32")return!1;const _=new URL(s);return(_.hostname==="127.0.0.1"||_.hostname==="localhost"||_.hostname==="::1")&&_.port==="8008"}catch{return!1}}function _m(s,b){const _=String(s).split("."),d=String(b).split(".");for(let E=0;E<Math.max(_.length,d.length);E++){const k=(parseInt(_[E],10)||0)-(parseInt(d[E],10)||0);if(k)return k>0?1:-1}return 0}const wm={running:{tone:"ok",label:"running",cta:r("localStatus.open","打开")},stopped:{tone:"off",label:"stopped",cta:r("localStatus.notRunning","未运行")},auth_error:{tone:"warn",label:"auth error",cta:r("localStatus.tokenInvalid","Token 失效")},misconfigured:{tone:"err",label:"bad config",cta:r("localStatus.badUrl","URL 错误")},error:{tone:"err",label:"error",cta:r("localStatus.error","异常")}};function Nm({open:s,title:b,message:_,confirmLabel:d,danger:E,onConfirm:k,onCancel:M}){return s?Sa.createPortal(u.jsx("div",{"data-id":"ConfirmModal",style:{position:"fixed",inset:0,zIndex:70,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:q=>{q.target===q.currentTarget&&(M==null||M())},children:u.jsxs("div",{onClick:q=>q.stopPropagation(),style:{width:360,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:6},children:b}),_&&u.jsx("div",{style:{fontSize:13,opacity:.7,marginBottom:16},children:_}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:M,children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"ConfirmModal-ok",style:E?{background:"#dc2626",borderColor:"#dc2626"}:{},onClick:k,children:d||r("common.confirm","确认")})]})]})}),document.body):null}function mp({team:s,onOpen:b,onRename:_,onEditUrl:d,onDelete:E,avatar:k,onAvatar:M}){const q=s.kind==="private",T=s.status==="active",m=s.name||s.title||"—",[J,U]=x.useState(!1),[at,F]=x.useState(""),[I,X]=x.useState(null),dt=I??m;x.useEffect(()=>{I!=null&&m===I&&X(null)},[m,I]);const _t=V=>{var Yt;(Yt=V==null?void 0:V.stopPropagation)==null||Yt.call(V),F(dt==="—"?"":dt),U(!0)},It=async()=>{U(!1);const V=String(at||"").trim();if(!(!_||!V||V===dt)){X(V);try{const Yt=await _(s.id,V);Yt!=null&&Yt.ok||X(null)}catch{X(null)}}},ht=s.host_url||"",[Gt,lt]=x.useState(!1),[wt,G]=x.useState(""),[ot,B]=x.useState(null),Lt=ot??ht;x.useEffect(()=>{ot!=null&&ht===ot&&B(null)},[ht,ot]);const Pt=s.teamId||s.id,re=q?r("teamKind.private","私有云"):s.team_kind==="personal"?r("teamKind.personal","个人"):r("teamKind.shared","共享"),he=q?Lt:s.workspace_url||s.workspace_direct_url,le=!!he,[Zt,z]=x.useState(!1),[Y,ct]=x.useState(!1),[yt,Dt]=x.useState({top:0,left:0}),h=x.useRef(null),N=x.useRef(null),Q=x.useRef(null),W=184,pt=()=>{if(!Zt&&N.current){const V=N.current.getBoundingClientRect(),Yt=Math.max(8,Math.min(V.right-W,window.innerWidth-W-8));Dt({top:Math.round(V.bottom+4),left:Math.round(Yt)})}z(V=>!V)};x.useEffect(()=>{if(!Zt)return;const V=Yt=>{var we,qt;(we=N.current)!=null&&we.contains(Yt.target)||(qt=Q.current)!=null&&qt.contains(Yt.target)||z(!1)};return document.addEventListener("mousedown",V),()=>document.removeEventListener("mousedown",V)},[Zt]);const vt=V=>{var Yt,we,qt,Ne;(Yt=V==null?void 0:V.stopPropagation)==null||Yt.call(V),le&&(z(!1),(Ne=(qt=(we=window.cicy)==null?void 0:we.tabs)==null?void 0:qt.reloadIfOpen)==null||Ne.call(qt,he,dt))},[St,ue]=x.useState(!1),Rt=()=>{G(ht),lt(!0),z(!1)},ge=async()=>{lt(!1);const V=String(wt||"").trim();if(!(!d||!V||V===ht)){B(V);try{const Yt=await d(s.id,V);Yt!=null&&Yt.ok||B(null)}catch{B(null)}}};return u.jsxs(u.Fragment,{children:[u.jsxs("div",{"data-id":"TeamCard",className:`bcard bcard--cloud${T?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent"}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":T?"ok":"off"}),u.jsx(vp,{})]}),u.jsxs("div",{className:"bcard__top-right",children:[s.is_trial&&u.jsx("span",{className:"bcard__badge",children:"trial"}),(le||Pt!=null||q&&d)&&u.jsxs("div",{className:"bcard__menuwrap",ref:h,onClick:V=>V.stopPropagation(),children:[u.jsx("button",{type:"button",ref:N,"data-id":"TeamCard-menu-btn",className:"bcard__kebab",title:r("localTeams.more","更多"),disabled:Y,onClick:pt,children:Y?u.jsx(Ye,{}):u.jsx(oo,{})}),Zt&&Sa.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"TeamCard-menu",role:"menu",ref:Q,style:{position:"fixed",top:yt.top,left:yt.left,width:W},onClick:V=>V.stopPropagation(),children:[le&&u.jsx("button",{type:"button","data-id":"TeamCard-reload",className:"bcard__menu-item",onClick:vt,children:r("localTeams.reloadWindow","刷新窗口")}),Pt!=null&&u.jsx("button",{type:"button","data-id":"TeamCard-billing",className:"bcard__menu-item",onClick:V=>{V.stopPropagation(),z(!1),_i(`?team=${encodeURIComponent(Pt)}`)},children:r("localTeams.billing","账单")}),q&&d&&u.jsx("button",{type:"button","data-id":"TeamCard-edit-url",className:"bcard__menu-item",onClick:V=>{V.stopPropagation(),Rt()},children:ht?r("teamCard.editUrl","更改访问地址"):r("teamCard.setUrl","填写访问地址")}),q&&E&&u.jsx("button",{type:"button","data-id":"TeamCard-delete",className:"bcard__menu-item is-danger",onClick:V=>{V.stopPropagation(),z(!1),ue(!0)},children:r("teamCard.delete","删除")})]}),document.body)]})]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(so,{size:24,avatar:k,name:(s==null?void 0:s.name)||(s==null?void 0:s.title),teamId:s==null?void 0:s.id,onChanged:M}),J?u.jsx("input",{"data-id":"TeamCard-rename-input",autoFocus:!0,value:at,onChange:V=>F(V.target.value),onFocus:V=>V.target.select(),onBlur:It,onClick:V=>V.stopPropagation(),onKeyDown:V=>{V.nativeEvent.isComposing||V.keyCode===229||(V.key==="Enter"?It():V.key==="Escape"&&U(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:_?r("localTeams.renameHint","点名字或 ✎ 改名"):dt,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:_?_t:void 0,children:[u.jsx("span",{onClick:_?_t:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:_?"text":"default"},children:dt}),_&&u.jsx("button",{type:"button","data-id":"TeamCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:_t,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsxs("div",{className:"bcard__meta",children:[u.jsx("span",{className:"bcard__chip",children:re}),!q&&s.membership_status&&s.membership_status!=="active"&&u.jsx("span",{className:"bcard__chip",children:s.membership_status})]})]}),u.jsxs("button",{type:"button",className:"bcard__cta",onClick:b,disabled:!le,children:[u.jsx(Hu,{}),u.jsx("span",{children:le?r("localTeams.open","打开"):q?r("teamCard.noHost","未填访问地址"):r("teamCard.noUrl","无 URL")})]})]}),Gt&&Sa.createPortal(u.jsx("div",{"data-id":"TeamCard-url-modal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:V=>{V.target===V.currentTarget&<(!1)},children:u.jsxs("div",{onClick:V=>V.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:ht?r("teamCard.editUrl","更改访问地址"):r("teamCard.setUrl","填写访问地址")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:dt}),u.jsx("textarea",{"data-id":"TeamCard-url-input",autoFocus:!0,rows:3,className:"login-email-input",style:{width:"100%",resize:"vertical",lineHeight:1.5,fontFamily:"var(--mono)"},value:wt,placeholder:"https://你的私有云地址:端口",spellCheck:!1,onChange:V=>G(V.target.value.replace(/[\r\n]+/g,"")),onKeyDown:V=>{V.nativeEvent.isComposing||V.keyCode===229||(V.key==="Enter"?(V.preventDefault(),ge()):V.key==="Escape"&<(!1))}}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:()=>lt(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"TeamCard-url-save",onClick:ge,children:r("common.save","保存")})]})]})}),document.body),u.jsx(Nm,{open:St,title:r("localTeams.deleteTitle","删除团队"),message:r("localTeams.deleteMsg","确定删除「{{name}}」?此操作不可撤销。",{name:dt}),confirmLabel:r("common.delete","删除"),danger:!0,onConfirm:async()=>{ue(!1),E&&await E(s)},onCancel:()=>ue(!1)})]})}function ao(){return u.jsxs("div",{className:"brand",children:[u.jsx("div",{className:"brand-mark",children:u.jsx(gp,{})}),u.jsxs("div",{className:"brand-text",children:[u.jsx("div",{className:"brand-name",children:"CiCy Desktop"}),u.jsx("div",{className:"brand-sub",children:r("app.brandSub","团队 AI 协作工作台")})]})]})}function hp(){const[s,b]=x.useState(null),[_,d]=x.useState(!1),E=x.useRef(!1);x.useEffect(()=>{var m,J,U,at,F,I;let q=!0;(U=(J=(m=window.cicy)==null?void 0:m.app)==null?void 0:J.updateState)==null||U.call(J).then(X=>{q&&b(X)}).catch(()=>{});const T=(I=(F=(at=window.cicy)==null?void 0:at.app)==null?void 0:F.onUpdateState)==null?void 0:I.call(F,X=>{b(X),E.current&&(X.status==="downloading"?me.setProgress(X.progress||{}):X.status==="ready"?me.ready({onInstall:()=>{var dt,_t,It;return(It=(_t=(dt=window.cicy)==null?void 0:dt.app)==null?void 0:_t.installUpdate)==null?void 0:It.call(_t)}}):X.status==="error"&&(me.finish({ok:!1,message:X.error||r("updateBanner.error","更新失败")}),E.current=!1))});return()=>{q=!1;try{T&&T()}catch{}}},[]);const k=s==null?void 0:s.status;x.useEffect(()=>{d(!1)},[k]);const M=()=>{var q,T,m;E.current=!0,d(!0),me.open({kind:"app",title:r("updateBanner.drawerTitle","应用更新"),fromVer:s==null?void 0:s.current,toVer:s==null?void 0:s.version,onRetry:M}),me.push({phase:"download",status:"running",message:r("updateBanner.startDl","开始下载安装包…")}),me.setProgress({percent:0}),(m=(T=(q=window.cicy)==null?void 0:q.app)==null?void 0:T.downloadUpdate)==null||m.call(T)};return k!=="available"||_?null:Sa.createPortal(u.jsx("div",{"data-id":"UpdateBanner",style:{position:"fixed",inset:0,zIndex:1e4,background:"rgba(0,0,0,0.6)",backdropFilter:"blur(3px)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:q=>{q.target===q.currentTarget&&d(!0)},children:u.jsxs("div",{onClick:q=>q.stopPropagation(),style:{width:380,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:14,padding:"24px 24px 20px",boxShadow:"0 20px 60px rgba(0,0,0,0.55)",textAlign:"center"},children:[u.jsx("div",{style:{fontSize:34,lineHeight:1,marginBottom:12},"aria-hidden":!0,children:"🚀"}),u.jsx("h3",{style:{margin:"0 0 8px",fontSize:17,color:"#e6edf3"},"data-id":"UpdateBanner-text",children:r("updateBanner.available","发现新版本 v{{v}}",{v:s.version})}),u.jsx("p",{style:{margin:"0 0 20px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:r("updateBanner.modalSub","建议尽快更新到最新版本")}),u.jsxs("div",{style:{display:"flex",gap:10,justifyContent:"center"},children:[u.jsx("button",{type:"button","data-id":"UpdateBanner-later",onClick:()=>d(!0),style:{flex:1,padding:"9px 16px",borderRadius:9,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:14},children:r("updateBanner.later","稍后")}),u.jsx("button",{type:"button","data-id":"UpdateBanner-download",onClick:M,style:{flex:1,padding:"9px 16px",borderRadius:9,border:"none",background:"#238636",color:"white",cursor:"pointer",fontSize:14,fontWeight:600},children:r("updateBanner.updateNow","立即更新")})]})]})}),document.body)}function yp(){return u.jsxs("div",{className:"bcard bcard--skeleton","data-id":"SkeletonCard","aria-hidden":!0,children:[u.jsx("div",{className:"bcard__accent",style:{background:"rgba(255,255,255,.08)",opacity:1}}),u.jsxs("div",{className:"bcard__top",children:[u.jsx("div",{className:"skel",style:{width:84,height:26,borderRadius:999}}),u.jsx("div",{className:"skel",style:{width:22,height:22,borderRadius:6}})]}),u.jsxs("div",{style:{flex:1,minHeight:0,marginTop:14},children:[u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[u.jsx("div",{className:"skel",style:{width:24,height:24,borderRadius:6,flex:"0 0 auto"}}),u.jsx("div",{className:"skel skel--line",style:{width:"55%"}})]}),u.jsx("div",{className:"skel",style:{width:60,height:18,borderRadius:6,marginTop:12}})]}),u.jsx("div",{className:"skel skel--cta",style:{marginTop:0}})]})}function pp(s){let b=0;for(let _=0;_<(s||"").length;_++)b=(b*31+s.charCodeAt(_))%360;return b}function so({avatar:s,name:b,teamId:_,onChanged:d,size:E=34}){const k=x.useRef(null),M=((b||"?").trim()[0]||"?").toUpperCase(),q=pp(_||b||""),T=m=>{const J=m.target.files&&m.target.files[0];if(m.target.value="",!J)return;const U=new FileReader;U.onload=async()=>{var at,F,I;try{await((I=(F=(at=window.cicy)==null?void 0:at.localTeams)==null?void 0:F.setAvatar)==null?void 0:I.call(F,_,U.result)),d&&d()}catch{}},U.readAsDataURL(J)};return u.jsxs("div",{"data-id":"TeamAvatar",className:"team-avatar",title:_?r("teamCard.changeAvatar","点击更换头像"):"",onClick:_?m=>{m.stopPropagation(),k.current&&k.current.click()}:void 0,style:{width:E,height:E,borderRadius:9,flex:"none",overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"center",cursor:_?"pointer":"default",background:s?"#0d1117":`hsl(${q} 52% 46%)`,color:"#fff",fontWeight:700,fontSize:Math.round(E*.42),userSelect:"none"},children:[s?u.jsx("img",{src:s,alt:"",style:{width:"100%",height:"100%",objectFit:"cover"}}):M,_&&u.jsx("input",{ref:k,type:"file",accept:"image/*",style:{display:"none"},onChange:T})]})}function gp(){return u.jsx("svg",{width:"22",height:"22",viewBox:"0 0 96 96",fill:"none",children:u.jsx("path",{d:"M48 11L39.5 33.3L16 29.5L31 48L16 66.5L39.5 62.7L48 85L56.5 62.7L80 66.5L65 48L80 29.5L56.5 33.3Z",fill:"white",stroke:"white",strokeWidth:"8",strokeLinejoin:"round",strokeLinecap:"round"})})}function Hu(){return u.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),u.jsx("polyline",{points:"12 5 19 12 12 19"})]})}function Ye(){return u.jsx("svg",{className:"spin",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.4",strokeLinecap:"round",children:u.jsx("path",{d:"M21 12a9 9 0 1 1-6.2-8.55"})})}function bp(){return u.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),u.jsx("line",{x1:"2",y1:"20",x2:"22",y2:"20"})]})}function oo(){return u.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[u.jsx("circle",{cx:"12",cy:"5",r:"1.7"}),u.jsx("circle",{cx:"12",cy:"12",r:"1.7"}),u.jsx("circle",{cx:"12",cy:"19",r:"1.7"})]})}function vp(){return u.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("circle",{cx:"12",cy:"12",r:"10"}),u.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),u.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}function Si(s){try{return localStorage.getItem(s)||null}catch{return null}}function Ka(s){return s?/timeout/i.test(s)?"登录超时,请重新点击 Login。":/state/i.test(s)?"校验失败,请重新登录。":/no token/i.test(s)?"登录未完成,请重试。":/bridge missing/i.test(s)?"无法连接到登录服务(preload 未就绪)。":s:""}var Tm;const Sp=((Tm=window.cicy)==null?void 0:Tm.platform)||(()=>{const s=navigator.userAgent||"";return/Mac/i.test(s)?"darwin":/Windows/i.test(s)?"win32":"linux"})();document.documentElement.dataset.platform=Sp;document.documentElement.dataset.fullscreen="0";var jm,Cm;(Cm=(jm=window.cicy)==null?void 0:jm.window)!=null&&Cm.onFullscreen&&window.cicy.window.onFullscreen(s=>{document.documentElement.dataset.fullscreen=s?"1":"0"});$y.createRoot(document.getElementById("root")).render(u.jsx(np,{}));
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<link rel="icon" type="image/svg+xml" href="./favicon.svg" />
|
|
7
7
|
<link rel="icon" type="image/png" sizes="256x256" href="./favicon-256.png" />
|
|
8
8
|
<title>CiCy Desktop</title>
|
|
9
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
+
<script type="module" crossorigin src="./assets/index-CJVmUzZL.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="./assets/index-C6Zrdgc0.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
@@ -399,7 +399,15 @@ function installIpc() {
|
|
|
399
399
|
if (ipcInstalled) return;
|
|
400
400
|
ipcInstalled = true;
|
|
401
401
|
const mgr = (e) => managerByHost.get(e.sender.id);
|
|
402
|
-
ipcMain.on("tabwin:ready", (e) => {
|
|
402
|
+
ipcMain.on("tabwin:ready", (e) => {
|
|
403
|
+
const m = mgr(e);
|
|
404
|
+
if (!m) return;
|
|
405
|
+
m.pushState();
|
|
406
|
+
// 关键:shell 此刻已订阅好 onFullscreen,补发**当前**全屏状态。否则窗口若是全屏出生
|
|
407
|
+
// (mac 上次全屏退出后再开,enter-full-screen 不触发)或事件早于订阅发出 → shell 收不到
|
|
408
|
+
// → #tabs 卡在非全屏的 78px 红绿灯让位区 = 我的团队 tab 左边一大块空(实测 mac 全屏)。
|
|
409
|
+
try { e.sender.send("window:fullscreen", !!m.win.isFullScreen()); } catch (err) {}
|
|
410
|
+
});
|
|
403
411
|
ipcMain.on("tabwin:new", (e, { url }) => { const m = mgr(e); if (m) m.addTab(url || ""); });
|
|
404
412
|
ipcMain.on("tabwin:activate", (e, { id }) => { const m = mgr(e); if (m) m.activate(id); });
|
|
405
413
|
ipcMain.on("tabwin:close", (e, { id }) => { const m = mgr(e); if (m) m.close(id); });
|
|
@@ -2872,6 +2872,15 @@ function LocalTeamCard({ team, cloudCode, onOpen, onRename, onRefresh }) {
|
|
|
2872
2872
|
>
|
|
2873
2873
|
{tr("sidecar.restart", "重启")}
|
|
2874
2874
|
</button>
|
|
2875
|
+
<button
|
|
2876
|
+
type="button"
|
|
2877
|
+
data-id="LocalTeamCard-stop"
|
|
2878
|
+
className="bcard__menu-item is-danger"
|
|
2879
|
+
onClick={() => runOp("stop", () => window.cicy.sidecar.stop(), tr("sidecar.stoppedDone", "已停止"))}
|
|
2880
|
+
>
|
|
2881
|
+
{tr("sidecar.stop", "停止")}
|
|
2882
|
+
</button>
|
|
2883
|
+
{/* 局域网访问紧挨「帐单」上方(放在 stop 之后)。 */}
|
|
2875
2884
|
<button
|
|
2876
2885
|
type="button"
|
|
2877
2886
|
data-id="LocalTeamCard-lan"
|
|
@@ -2894,14 +2903,6 @@ function LocalTeamCard({ team, cloudCode, onOpen, onRename, onRefresh }) {
|
|
|
2894
2903
|
>
|
|
2895
2904
|
{tr("sidecar.lanAccess", "局域网访问")} · {lanOn ? tr("common.on", "开") : tr("common.off", "关")}
|
|
2896
2905
|
</button>
|
|
2897
|
-
<button
|
|
2898
|
-
type="button"
|
|
2899
|
-
data-id="LocalTeamCard-stop"
|
|
2900
|
-
className="bcard__menu-item is-danger"
|
|
2901
|
-
onClick={() => runOp("stop", () => window.cicy.sidecar.stop(), tr("sidecar.stoppedDone", "已停止"))}
|
|
2902
|
-
>
|
|
2903
|
-
{tr("sidecar.stop", "停止")}
|
|
2904
|
-
</button>
|
|
2905
2906
|
</>
|
|
2906
2907
|
)}
|
|
2907
2908
|
{team.cloud_team_id && (
|
|
@@ -3388,14 +3389,21 @@ function UpdateBanner() {
|
|
|
3388
3389
|
function SkeletonCard() {
|
|
3389
3390
|
return (
|
|
3390
3391
|
<div className="bcard bcard--skeleton" data-id="SkeletonCard" aria-hidden>
|
|
3391
|
-
<div className="
|
|
3392
|
-
|
|
3393
|
-
|
|
3394
|
-
|
|
3395
|
-
|
|
3392
|
+
<div className="bcard__accent" style={{ background: "rgba(255,255,255,.08)", opacity: 1 }} />
|
|
3393
|
+
{/* 对齐真实卡片:顶部 pill + kebab */}
|
|
3394
|
+
<div className="bcard__top">
|
|
3395
|
+
<div className="skel" style={{ width: 84, height: 26, borderRadius: 999 }} />
|
|
3396
|
+
<div className="skel" style={{ width: 22, height: 22, borderRadius: 6 }} />
|
|
3397
|
+
</div>
|
|
3398
|
+
{/* body:方头像(24)+ 名字行,下面 meta chip;flex:1 把 CTA 顶到底 */}
|
|
3399
|
+
<div style={{ flex: 1, minHeight: 0, marginTop: 14 }}>
|
|
3400
|
+
<div style={{ display: "flex", alignItems: "center", gap: 8 }}>
|
|
3401
|
+
<div className="skel" style={{ width: 24, height: 24, borderRadius: 6, flex: "0 0 auto" }} />
|
|
3402
|
+
<div className="skel skel--line" style={{ width: "55%" }} />
|
|
3396
3403
|
</div>
|
|
3404
|
+
<div className="skel" style={{ width: 60, height: 18, borderRadius: 6, marginTop: 12 }} />
|
|
3397
3405
|
</div>
|
|
3398
|
-
<div className="skel skel--cta" />
|
|
3406
|
+
<div className="skel skel--cta" style={{ marginTop: 0 }} />
|
|
3399
3407
|
</div>
|
|
3400
3408
|
);
|
|
3401
3409
|
}
|