cicy-desktop 2.1.193 → 2.1.195
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.195",
|
|
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.
|
|
143
|
+
"cicy-code-darwin-x64": "2.3.25",
|
|
144
144
|
"cicy-code-darwin-arm64": "2.3.25",
|
|
145
|
-
"cicy-code-linux-x64": "2.3.
|
|
145
|
+
"cicy-code-linux-x64": "2.3.25",
|
|
146
146
|
"cicy-code-linux-arm64": "2.3.25",
|
|
147
|
-
"cicy-code-windows-x64": "2.3.
|
|
147
|
+
"cicy-code-windows-x64": "2.3.25",
|
|
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 Fy(o){return o.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function vl(o){return Fy(o).replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>").replace(/`([^`]+)`/g,"<code>$1</code>")}function sm(o){return o.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(S=>S.trim())}function Iy(o){const S=String(o||"").replace(/\r\n/g,`
|
|
375
375
|
`).split(`
|
|
376
376
|
`),w=[];let r=0;for(;r<S.length;){const j=S[r];if(!j.trim()){r++;continue}if(/^---+\s*$/.test(j)){w.push("<hr/>"),r++;continue}const O=/^(#{1,6})\s+(.*)$/.exec(j);if(O){const Z=Math.min(O[1].length,6);w.push(`<h${Z}>${vl(O[2])}</h${Z}>`),r++;continue}if(j.trim().startsWith("|")&&r+1<S.length&&/^\s*\|?[\s:|-]+\|?\s*$/.test(S[r+1])&&S[r+1].includes("-")){const Z=sm(j);r+=2;const U=[];for(;r<S.length&&S[r].trim().startsWith("|");)U.push(sm(S[r])),r++;let T="<table><thead><tr>";T+=Z.map(v=>`<th>${vl(v)}</th>`).join(""),T+="</tr></thead><tbody>";for(const v of U)T+="<tr>"+v.map(Q=>`<td>${vl(Q)}</td>`).join("")+"</tr>";T+="</tbody></table>",w.push(T);continue}if(j.trim().startsWith(">")){const Z=[];for(;r<S.length&&S[r].trim().startsWith(">");)Z.push(S[r].replace(/^\s*>\s?/,"")),r++;w.push(`<blockquote>${Z.map(vl).join("<br/>")}</blockquote>`);continue}if(/^\s*-\s+/.test(j)){const Z=[];for(;r<S.length&&/^\s*-\s+/.test(S[r]);)Z.push(`<li>${vl(S[r].replace(/^\s*-\s+/,""))}</li>`),r++;w.push(`<ul>${Z.join("")}</ul>`);continue}if(/^\s*\d+\.\s+/.test(j)){const Z=[];for(;r<S.length&&/^\s*\d+\.\s+/.test(S[r]);)Z.push(`<li>${vl(S[r].replace(/^\s*\d+\.\s+/,""))}</li>`),r++;w.push(`<ol>${Z.join("")}</ol>`);continue}w.push(`<p>${vl(j)}</p>`),r++}return w.join(`
|
|
377
|
-
`)}const m=(o,S)=>{var w,r;try{const j=(r=(w=window.cicyI18n)==null?void 0:w.t)==null?void 0:r.call(w,o);return j&&j!==o?j:S}catch{return S}},ln="cicy_token",_u="cicy_access_token",xu="cicy_user_id",cn="https://cicy-ai.com";async function ni(o){var S,w,r;try{(r=(w=(S=window.cicy)==null?void 0:S.shell)==null?void 0:w.openExternal)==null||r.call(w,`${cn}/dash${o}`)}catch{}}const Ks=new Set;let Py=0,Pa=[];const ai=new Map;function om(){Ks.forEach(o=>o(Pa))}const te={show(o={}){const S=o.id||`t${++Py}`,w=Pa.find(O=>O.id===S),r={id:S,status:"running",...w,...o};Pa=w?Pa.map(O=>O.id===S?r:O):[...Pa,r],om();const j=ai.get(S);return j&&(clearTimeout(j),ai.delete(S)),o.ttl&&ai.set(S,setTimeout(()=>te.dismiss(S),o.ttl)),S},dismiss(o){Pa=Pa.filter(w=>w.id!==o);const S=ai.get(o);S&&(clearTimeout(S),ai.delete(o)),om()}};function tg(){const[o,S]=C.useState(Pa);return C.useEffect(()=>(Ks.add(S),()=>{Ks.delete(S)}),[]),o.length?c.jsx("div",{className:"toast-host","data-id":"ToastHost",children:o.map(w=>c.jsxs("div",{className:"toast","data-id":`Toast-${w.id}`,"data-status":w.status||"running",children:[c.jsx("button",{type:"button",className:"toast__x","data-id":"Toast-dismiss",onClick:()=>te.dismiss(w.id),"aria-label":"dismiss",children:"×"}),c.jsxs("span",{className:"toast__msg",children:[w.message,Number.isFinite(w.progress)?` ${w.progress}%`:""]}),Number.isFinite(w.progress)&&c.jsx("span",{className:"toast__bar",children:c.jsx("span",{style:{width:`${Math.min(100,w.progress)}%`}})})]},w.id))}):null}const Js=new Set;let rm=0,re=null;function nn(){Js.forEach(o=>o(re))}function Tu(){return new Date().toTimeString().slice(0,8)}const Ee={open({teamId:o,fromVer:S,toVer:w,onRetry:r,title:j}={}){re={teamId:o,title:j||null,fromVer:S||null,toVer:w||null,status:"running",phase:"download",logs:[],onRetry:r||null,lastAt:Date.now()},nn()},push(o={}){if(!re)return;const S={id:++rm,t:Tu(),phase:o.phase||re.phase,status:o.status||"running",message:o.message||""};re={...re,phase:o.phase||re.phase,toVer:o.toVer||re.toVer,logs:[...re.logs,S],lastAt:Date.now()},nn()},minimize(){re&&(re={...re,minimized:!0},nn())},restore(){re&&(re={...re,minimized:!1},nn())},finish({ok:o,message:S}={}){if(!re)return;const w=o?"done":"error",r={id:++rm,t:Tu(),phase:"done",status:w,message:S||(o?m("updateDrawer.done","更新完成"):m("updateDrawer.failed","更新失败"))};re={...re,status:w,phase:"done",minimized:!1,logs:[...re.logs,r],lastAt:Date.now()},nn()},close(){re=null,nn()}},Qs=["download","swap","done"],fm=o=>({download:m("updateDrawer.phaseDownload","下载"),swap:m("updateDrawer.phaseSwap","切换"),done:m("updateDrawer.phaseDone","完成")})[o]||o;function eg(){var U;const[o,S]=C.useState(re);C.useEffect(()=>(Js.add(S),()=>{Js.delete(S)}),[]);const w=C.useRef(null);C.useEffect(()=>{const T=w.current;T&&(T.scrollTop=T.scrollHeight)},[(U=o==null?void 0:o.logs)==null?void 0:U.length]);const[r,j]=C.useState(!1);if(C.useEffect(()=>{if(!o||o.status!=="running"){j(!1);return}const T=setInterval(()=>j(Date.now()-(o.lastAt||0)>25e3),3e3);return()=>clearInterval(T)},[o==null?void 0:o.lastAt,o==null?void 0:o.status]),!o)return null;const O=o.status==="running",Z=Qs.findIndex(T=>T===o.phase);return o.minimized?c.jsxs("button",{type:"button",className:`drawer-min drawer-min--${o.status}`,"data-id":"UpdateDrawer-restore",onClick:()=>Ee.restore(),children:[c.jsx("span",{className:"drawer-min__spark",children:O?c.jsx(je,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("span",{className:"drawer-min__label",children:[o.title||m("updateDrawer.title","更新 cicy-code"),o.toVer?` · v${o.toVer}`:""]})]}):c.jsx("div",{className:"drawer-scrim","data-id":"UpdateDrawer-scrim",onClick:()=>O?Ee.minimize():Ee.close(),children:c.jsxs("div",{className:"drawer","data-id":"UpdateDrawer","data-status":o.status,onClick:T=>T.stopPropagation(),children:[c.jsxs("div",{className:"drawer__head",children:[c.jsxs("div",{className:"drawer__title",children:[c.jsx("span",{className:`drawer__spark drawer__spark--${o.status}`,children:O?c.jsx(je,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("div",{children:[c.jsx("div",{className:"drawer__h",children:o.title||m("updateDrawer.title","更新 cicy-code")}),c.jsxs("div",{className:"drawer__sub",children:[o.fromVer?`v${o.fromVer}`:m("updateDrawer.current","当前")," → ",o.toVer?`v${o.toVer}`:m("updateDrawer.latest","最新版")]})]})]}),c.jsx("div",{className:"drawer__headbtns",children:c.jsx("button",{type:"button",className:"drawer__x","data-id":"UpdateDrawer-min",title:m("updateDrawer.minimize","最小化"),onClick:()=>Ee.minimize(),"aria-label":"minimize",children:"‒"})})]}),c.jsx("div",{className:"drawer__steps","data-id":"UpdateDrawer-steps",children:Qs.map((T,v)=>{const Q=fm(T),H=o.status==="done"||v<Z,at=v===Z&&O,et=o.status==="error"&&v===Z;return c.jsxs("div",{className:`drawer__step${at?" is-active":""}${H?" is-done":""}${et?" is-error":""}`,children:[c.jsx("span",{className:"drawer__step-dot",children:H?"✓":et?"!":v+1}),c.jsx("span",{className:"drawer__step-label",children:Q}),v<Qs.length-1&&c.jsx("span",{className:"drawer__step-bar"})]},T)})}),c.jsx("div",{className:"drawer__log","data-id":"UpdateDrawer-log",ref:w,children:o.logs.length===0?c.jsx("div",{className:"drawer__log-empty",children:m("updateDrawer.preparing","准备中…")}):o.logs.map(T=>c.jsxs("div",{className:"drawer__line","data-status":T.status,children:[c.jsx("span",{className:"drawer__t",children:T.t}),c.jsx("span",{className:`drawer__badge drawer__badge--${T.phase}`,children:fm(T.phase)}),c.jsx("span",{className:"drawer__linemsg",children:T.message})]},T.id))}),r&&O&&c.jsx("div",{className:"drawer__hint","data-id":"UpdateDrawer-stuck",children:m("updateDrawer.stuckHint","正在等待新版本就绪,耗时比平常久。可以放到后台继续,完成或失败都会提示。")}),c.jsx("div",{className:"drawer__foot",children:O?c.jsx(c.Fragment,{children:c.jsx("span",{className:"drawer__foot-status",children:m("updateDrawer.inProgress","更新进行中…")})}):o.status==="error"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-error",children:m("updateDrawer.failed","更新失败")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-retry",onClick:()=>o.onRetry(),children:m("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-dismiss",onClick:()=>Ee.close(),children:m("common.close","关闭")})]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-done",children:m("updateDrawer.updatedLatest","已更新到最新")}),c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-finish",onClick:()=>Ee.close(),children:m("common.done","完成")})]})})]})})}function ag(){const[o,S]=C.useState(void 0);C.useEffect(()=>{var N,Y;if(!((Y=(N=window.cicy)==null?void 0:N.terms)!=null&&Y.status)){S(!0);return}window.cicy.terms.status(xm).then(L=>S(!!(L!=null&&L.accepted))).catch(()=>S(!0))},[]),C.useEffect(()=>{var L,X,P,Rt;const N=document.documentElement;try{N.setAttribute("data-platform",((L=window.cicy)==null?void 0:L.platform)||"linux")}catch{}N.setAttribute("data-fullscreen","0");let Y;try{Y=(Rt=(P=(X=window.cicy)==null?void 0:X.window)==null?void 0:P.onFullscreen)==null?void 0:Rt.call(P,gt=>N.setAttribute("data-fullscreen",gt?"1":"0"))}catch{}return()=>{try{Y&&Y()}catch{}}},[]);const[w,r]=C.useState(()=>li(ln)),[j,O]=C.useState(()=>li(_u)),[Z,U]=C.useState(()=>li(xu)),[T,v]=C.useState(()=>!li(ln)),[Q,H]=C.useState(!1),[at,et]=C.useState(""),[nt,$]=C.useState(""),[ot,At]=C.useState(!1),[dt,rt]=C.useState(""),[xt,zt]=C.useState(""),[pt,G]=C.useState(null),[Nt,R]=C.useState(null),[mt,Lt]=C.useState(!1),[Yt,Ft]=C.useState(""),ce=C.useRef(!1),[Gt,x]=C.useState(null),[q,lt]=C.useState(!1),[ft,wt]=C.useState(!1),[d,E]=C.useState("all"),B=C.useCallback(async(N,Y)=>{var X,P,Rt,gt;if(!N)return;if(!((P=(X=window.cicy)==null?void 0:X.cloud)!=null&&P.fetch)){Ft("cloud fetch bridge missing");return}Lt(!0),Ft("");const L={Authorization:`Bearer ${N}`};try{const[Ze,pe]=await Promise.all([window.cicy.cloud.fetch(`${cn}/api/user/self`,{headers:L}),window.cicy.cloud.fetch(`${cn}/api/teams`,{headers:L})]);if((pe==null?void 0:pe.status)===401){if(!ce.current&&((gt=(Rt=window.cicy)==null?void 0:Rt.auth)!=null&>.loginStart)){ce.current=!0,Ft(m("auth.sessionExpired","会话已过期,正在重新登录…"));try{await window.cicy.auth.loginStart()}catch{}}return}if(pe!=null&&pe.ok){const Vt=JSON.parse(pe.body||"{}");R(Array.isArray(Vt==null?void 0:Vt.teams)?Vt.teams:[])}if(Ze!=null&&Ze.ok)try{const Vt=JSON.parse(Ze.body||"{}");G((Vt==null?void 0:Vt.success)===!1?null:(Vt==null?void 0:Vt.data)||null)}catch{G(null)}else G(null)}catch{Ft("")}finally{Lt(!1)}},[]),V=C.useRef("");C.useEffect(()=>{V.current=w||j||""},[w,j]);const I=C.useCallback(async()=>{var Y,L;const N=V.current;if(!(!N||!((L=(Y=window.cicy)==null?void 0:Y.cloud)!=null&&L.fetch)))try{const X=await window.cicy.cloud.fetch(`${cn}/api/teams`,{headers:{Authorization:`Bearer ${N}`}});if(X!=null&&X.ok){const P=JSON.parse(X.body||"{}");Array.isArray(P==null?void 0:P.teams)&&R(P.teams)}}catch{}},[]),M=C.useCallback(async(N,Y)=>{var P,Rt;const L=V.current,X=String(Y||"").trim();if(!L||!((Rt=(P=window.cicy)==null?void 0:P.cloud)!=null&&Rt.fetch)||!X)return{ok:!1,error:"no session / empty"};try{const gt=await window.cicy.cloud.fetch(`${cn}/api/teams/${N}`,{method:"PATCH",headers:{Authorization:`Bearer ${L}`,"Content-Type":"application/json"},body:JSON.stringify({title:X})});return gt!=null&>.ok?(await I(),{ok:!0}):{ok:!1,error:`${(gt==null?void 0:gt.status)||"?"} ${(gt==null?void 0:gt.error)||""}`}}catch(gt){return{ok:!1,error:gt.message}}},[I]),it=C.useCallback(async(N,Y)=>{var P,Rt;const L=V.current,X=String(Y||"").trim();if(!L||!((Rt=(P=window.cicy)==null?void 0:P.cloud)!=null&&Rt.fetch)||!X)return{ok:!1,error:"no session / empty"};try{new URL(X)}catch{return{ok:!1,error:"地址格式不对(需 http(s)://…)"}}try{const gt=await window.cicy.cloud.fetch(`${cn}/api/teams/${N}`,{method:"PATCH",headers:{Authorization:`Bearer ${L}`,"Content-Type":"application/json"},body:JSON.stringify({host_url:X})});return gt!=null&>.ok?(await I(),{ok:!0}):{ok:!1,error:`${(gt==null?void 0:gt.status)||"?"} ${(gt==null?void 0:gt.error)||""}`}}catch(gt){return{ok:!1,error:gt.message}}},[I]);C.useEffect(()=>{const N=w||j;N&&B(N,Z)},[w,j,Z,B]);const Ct=C.useCallback(async()=>{var N,Y;if((Y=(N=window.cicy)==null?void 0:N.localTeams)!=null&&Y.list){lt(!0);try{const L=await window.cicy.localTeams.list({refresh:!0});x(Array.isArray(L)?L:[])}catch{x([])}finally{lt(!1),wt(!0)}}},[]),Tt=C.useCallback(async(N,Y)=>{var X,P;if(!((P=(X=window.cicy)==null?void 0:X.localTeams)!=null&&P.update))return{ok:!1,error:"no_bridge"};let L;try{L=await window.cicy.localTeams.update(N,{name:String(Y||"").trim()||m("localTeams.unnamed","未命名")})}catch(Rt){L={ok:!1,error:(Rt==null?void 0:Rt.message)||String(Rt)}}return await Ct(),L||{ok:!1,error:"no_result"}},[Ct]);C.useEffect(()=>{let N,Y=!1;const L=3e3,X=3e4,P=async()=>{var Ze,pe,Vt;try{await((Vt=(pe=(Ze=window.cicy)==null?void 0:Ze.localTeams)==null?void 0:pe.syncCloud)==null?void 0:Vt.call(pe))}catch{}await Promise.all([Ct(),I()])},Rt=()=>{if(Y)return;const Ze=document.visibilityState==="visible";N=setTimeout(async()=>{document.visibilityState==="visible"?await P():await Ct(),Rt()},Ze?L:X)};P(),Rt();const gt=()=>{document.visibilityState==="visible"&&P()};return document.addEventListener("visibilitychange",gt),window.addEventListener("focus",gt),()=>{Y=!0,clearTimeout(N),document.removeEventListener("visibilitychange",gt),window.removeEventListener("focus",gt)}},[Ct,I]),C.useEffect(()=>{var Y,L;if(!((L=(Y=window.cicy)==null?void 0:Y.localTeams)!=null&&L.onWebviewRelay))return;const N=window.cicy.localTeams.onWebviewRelay(async({reqId:X,msg:P})=>{let Rt={ok:!1,error:"unknown relay type"};try{(P==null?void 0:P.type)==="localTeams:add"?Rt=await window.cicy.localTeams.add(P.spec||{}):(P==null?void 0:P.type)==="localTeams:remove"?Rt=await window.cicy.localTeams.remove(P.id):(P==null?void 0:P.type)==="localTeams:update"?Rt=await window.cicy.localTeams.update(P.id,P.patch||{}):(P==null?void 0:P.type)==="localTeams:upgrade"?Rt=await window.cicy.localTeams.upgrade(P.id):(P==null?void 0:P.type)==="localTeams:list"&&(Rt={ok:!0,teams:await window.cicy.localTeams.list({refresh:!0})}),Ct()}catch(gt){Rt={ok:!1,error:(gt==null?void 0:gt.message)||String(gt)}}try{window.cicy.localTeams.replyWebviewRelay(X,Rt)}catch{}});return()=>{try{N==null||N()}catch{}}},[Ct]);const k=C.useCallback(async N=>{var Y,L;if((L=(Y=window.cicy)==null?void 0:Y.localTeams)!=null&&L.open)try{await window.cicy.localTeams.open(N)}catch{}},[]);C.useEffect(()=>{var Y,L;if(li(ln)){v(!1);return}if(!((L=(Y=window.cicy)==null?void 0:Y.auth)!=null&&L.getSaved)){v(!1);return}let N=!1;return(async()=>{try{const X=await window.cicy.auth.getSaved();if(N)return;if(X!=null&&X.token){try{localStorage.setItem(ln,X.token)}catch{}if(r(X.token),X.accessToken){try{localStorage.setItem(_u,X.accessToken)}catch{}O(X.accessToken)}if(X.userId){try{localStorage.setItem(xu,String(X.userId))}catch{}U(String(X.userId))}}}catch{}finally{N||v(!1)}})(),()=>{N=!0}},[]),C.useEffect(()=>{var N,Y;if((Y=(N=window.cicy)==null?void 0:N.auth)!=null&&Y.onComplete)return window.cicy.auth.onComplete(L=>{if(H(!1),At(!1),L!=null&&L.error){rt(Vs(L.error));return}if(L!=null&&L.token){ce.current=!1,Ft("");try{localStorage.setItem(ln,L.token)}catch{}if(r(L.token),L.accessToken){try{localStorage.setItem(_u,L.accessToken)}catch{}O(L.accessToken)}if(L.userId){try{localStorage.setItem(xu,String(L.userId))}catch{}U(String(L.userId))}rt(""),zt(L.reused?m("auth.welcomeBack","已恢复你之前的登录"):m("auth.loginSuccess","登录成功")),setTimeout(()=>zt(""),3e3)}})},[]);async function st(){var Y,L;if(!((L=(Y=window.cicy)==null?void 0:Y.auth)!=null&&L.loginStart)){rt("auth bridge missing");return}rt(""),H(!0);const N=await window.cicy.auth.loginStart();if(!(N!=null&&N.ok)){H(!1),rt(Vs((N==null?void 0:N.error)||"login start failed"));return}et(N.url||"")}async function bt(){var L,X;if(!((X=(L=window.cicy)==null?void 0:L.auth)!=null&&X.emailLoginStart)){rt("auth bridge missing");return}const N=nt.trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(N)){rt(m("auth.badEmail","请输入有效的邮箱地址"));return}rt("");const Y=await window.cicy.auth.emailLoginStart(N);if(!(Y!=null&&Y.ok)){rt(Vs((Y==null?void 0:Y.error)||"email login failed"));return}At(!0)}function St(){var N,Y,L;try{localStorage.removeItem(ln),localStorage.removeItem(_u),localStorage.removeItem(xu)}catch{}try{(L=(Y=(N=window.cicy)==null?void 0:N.auth)==null?void 0:Y.logout)==null||L.call(Y)}catch{}r(null),O(null),U(null),G(null),R(null),rt(""),Ft("")}if(o===void 0)return c.jsxs("div",{className:"shell","data-id":"TermsCheckingSplash",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Zs,{}),c.jsx("div",{className:"spinner-row",children:c.jsx(je,{})})]})]});if(!o)return c.jsx(Tm,{onAgree:()=>S(!0)});if(!w&&T)return c.jsxs("div",{className:"shell","data-id":"AuthRestoringSplash",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Zs,{}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(je,{}),c.jsx("span",{children:m("auth.restoring","正在恢复登录…")})]})]})]});if(!w)return c.jsxs("div",{className:"shell",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Zs,{}),!Q&&!ot&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline",children:m("auth.tagline","登录以同步你的团队、配置与 AI 助手")}),c.jsx("label",{className:"login-label","data-id":"EmailLoginLabel",htmlFor:"cicy-email-login",children:m("auth.emailLabel","输入邮箱,用邮件链接登录")}),c.jsx("input",{id:"cicy-email-login",type:"email",className:"login-email-input","data-id":"EmailLoginInput",value:nt,onChange:N=>$(N.target.value),onKeyDown:N=>{N.key==="Enter"&&bt()},placeholder:m("auth.emailPlaceholder","you@example.com"),autoComplete:"email",spellCheck:!1,autoFocus:!0}),c.jsxs("button",{className:"btn-primary","data-id":"EmailLoginSubmit",onClick:bt,children:[c.jsx("span",{children:m("auth.emailLogin","发送登录链接")}),c.jsx(wu,{})]}),c.jsx("p",{className:"hint",children:m("auth.emailHint","手机上点邮件里的链接,也能登录这台电脑")}),c.jsx("div",{className:"login-divider","data-id":"LoginDivider",children:c.jsx("span",{children:m("auth.or","或")})}),c.jsx("button",{className:"btn-ghost","data-id":"BrowserLoginBtn",onClick:st,children:m("auth.browserLogin","用浏览器登录(Google / SSO,仅同一台电脑)")})]}),ot&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline","data-id":"EmailSentTagline",children:m("auth.emailSentTagline","登录邮件已发送")}),c.jsxs("p",{className:"hint","data-id":"EmailSentHint",style:{textAlign:"center"},children:[m("auth.emailSentHint","到邮箱打开链接即可(手机、电脑都行),这里会自动登录。"),c.jsx("br",{}),nt]}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(je,{}),c.jsx("span",{children:m("auth.emailWaiting","等待确认…")})]}),c.jsx("button",{className:"btn-ghost","data-id":"EmailSentCancel",onClick:()=>{var N,Y,L;(L=(Y=(N=window.cicy)==null?void 0:N.auth)==null?void 0:Y.emailLoginCancel)==null||L.call(Y),At(!1)},children:m("auth.cancel","取消")})]}),Q&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline",children:m("auth.waitingTagline","已在浏览器打开登录页,等待你完成…")}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(je,{}),c.jsx("span",{children:m("auth.waitingCallback","等待回调")})]}),at&&c.jsxs("div",{className:"login-fallback","data-id":"LoginUrlFallback",style:{marginTop:10,textAlign:"center"},children:[c.jsx("p",{className:"hint",style:{marginBottom:6},children:m("auth.browserNotOpened","浏览器没自动打开?")}),c.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-open",onClick:()=>{var N,Y,L;try{(L=(Y=(N=window.cicy)==null?void 0:N.shell)==null?void 0:Y.openExternal)==null||L.call(Y,at)}catch{}},children:m("auth.openManually","手动打开登录页")}),c.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-copy",onClick:()=>{var N;try{(N=navigator.clipboard)==null||N.writeText(at),zt(m("auth.linkCopied","链接已复制,粘到浏览器打开")),setTimeout(()=>zt(""),2500)}catch{}},children:m("auth.copyLink","复制链接")}),c.jsx("p",{className:"hint","data-id":"LoginUrlFallback-url",style:{wordBreak:"break-all",marginTop:6,fontSize:11,opacity:.7,userSelect:"text"},children:at})]}),c.jsx("button",{className:"btn-ghost",onClick:()=>{var N,Y,L;(L=(Y=(N=window.cicy)==null?void 0:N.auth)==null?void 0:Y.loginCancel)==null||L.call(Y),H(!1),et("")},children:m("auth.cancel","取消")})]}),dt&&c.jsx("div",{className:"error",children:dt})]})]});const Dt=(Gt||[]).find(N=>ym(N.base_url))||null,Zt=Dt&&Dt.cloud_team_id?(Nt||[]).find(N=>String(N.teamId||N.id)===String(Dt.cloud_team_id)):null,le=(Gt||[]).filter(N=>Ws(N.base_url)),J=(Gt||[]).filter(N=>!Ws(N.base_url)&&!ym(N.base_url)),K=le.length,F=J.length,Ut=(Nt||[]).filter(N=>!N.is_local&&N.kind!=="local"&&(N.kind==="private"||N.team_kind==="personal")),ht=Ut.length,aa=d==="all"||d==="local",Re=d==="all"||d==="custom",ge=d==="all"||d==="cloud";return c.jsxs("div",{className:"shell shell--app",children:[c.jsx("div",{className:"glow glow--app","aria-hidden":!0}),c.jsxs("div",{className:"shell__left",children:[c.jsx(ig,{me:pt,welcome:xt,onLogout:St,mitmTeam:le.length>0?le[0]:null}),c.jsxs("main",{className:"main",children:[c.jsxs("div",{className:"app__tabsrow",children:[c.jsx("div",{className:"app__tabs",children:[{k:"all",label:m("teamFilter.all","全部"),n:K+F+ht},{k:"local",label:m("teamFilter.local","本地"),n:K},{k:"cloud",label:m("teamFilter.cloud","私有云"),n:ht},{k:"custom",label:m("teamFilter.custom","自定义"),n:F}].map(({k:N,label:Y,n:L})=>c.jsxs("button",{type:"button",className:`app__tab ${d===N?"is-active":""}`,onClick:()=>E(N),children:[Y,c.jsx("span",{className:"app__tab-count",children:L})]},N))}),c.jsxs("button",{type:"button","data-id":"AddTeamButton",className:"app__add-team",title:m("teams.addHint","在云端新建私有云团队"),onClick:()=>ni("?tab=private"),children:["+ ",m("teams.add","新加团队")]})]}),Yt&&c.jsxs("div",{className:"error",style:{marginBottom:12},children:[m("common.cloud","云端"),": ",Yt,c.jsx("button",{className:"btn-ghost",style:{marginLeft:8},onClick:()=>B(w||j,Z),children:m("common.retry","重试")})]}),c.jsxs("div",{className:"app__grid",children:[aa&&le.map(N=>c.jsx(hm,{team:N,onOpen:()=>k(N.id),onRename:Tt,onRefresh:Ct},"local:"+N.id)),aa&&c.jsx(rg,{dockerTeam:Dt,onOpen:async()=>{var N,Y,L;try{const X=await((L=(Y=(N=window.cicy)==null?void 0:N.docker)==null?void 0:Y.appOpen)==null?void 0:L.call(Y));X!=null&&X.ok||te.show({id:"docker-open",status:"error",ttl:6e3,message:m("docker.openNoToken","服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。")})}catch(X){console.warn("[DockerCard] open",X)}},cloudTitle:Zt==null?void 0:Zt.title,onRename:Dt!=null&&Dt.cloud_team_id?(N=>M(Dt.cloud_team_id,N)):void 0,onRefresh:Ct}),Re&&J.map(N=>c.jsx(hm,{team:N,onOpen:()=>k(N.id),onRename:Tt,onRefresh:Ct},"custom:"+N.id)),ge&&Ut.map(N=>c.jsx(fg,{team:N,onOpen:()=>{var L,X,P;const Y=N.kind==="private"?N.host_url:N.workspace_url||N.workspace_direct_url;Y&&((P=(X=(L=window.cicy)==null?void 0:L.tabs)==null?void 0:X.open)==null||P.call(X,Y,N.name||N.title||""))},onRename:M,onEditUrl:it},"cloud:"+N.id))]}),!mt&&!Yt&&Nt&&Nt.length===0&&!(Gt!=null&&Gt.length)&&c.jsx("div",{className:"empty",style:{marginTop:14},children:m("teams.emptyHint","还没有团队 — 安装本地 cicy-code 起一个本地 team,或在云端创建。")})]})]}),c.jsx(tg,{}),c.jsx(eg,{}),c.jsx(og,{})]})}function lg({onClose:o}){const[S,w]=C.useState(null),[r,j]=C.useState(""),[O,Z]=C.useState(!1),[U,T]=C.useState(""),v=typeof window<"u"&&window.cicy&&window.cicy.trustedOrigins||null,Q=C.useCallback(async()=>{try{w(v&&await v.list()||[])}catch{w([])}},[v]);C.useEffect(()=>{Q()},[Q]);const H=async()=>{const nt=r.trim();if(!(!nt||O||!v)){Z(!0),T("");try{const $=await v.add(nt);$&&$.ok===!1?T($.error||m("trustedSites.addFailed","添加失败")):(j(""),w($&&$.origins||await v.list()))}catch($){T(String($&&$.message||$))}finally{Z(!1)}}},at=async nt=>{if(!(O||!v)){Z(!0),T("");try{const $=await v.remove(nt);$&&$.ok===!1?T($.error||m("trustedSites.removeFailed","删除失败")):w($&&$.origins||await v.list())}catch($){T(String($&&$.message||$))}finally{Z(!1)}}},et={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:nt=>({flex:1,fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:13,color:nt?"#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 sn.createPortal(c.jsx("div",{style:et.overlay,onClick:o,"data-id":"TrustedSitesModal",children:c.jsxs("div",{style:et.card,onClick:nt=>nt.stopPropagation(),children:[c.jsxs("div",{style:et.head,children:[c.jsx("h2",{style:et.title,children:m("trustedSites.title","受信任站点")}),c.jsx("button",{type:"button",style:et.x,onClick:o,"aria-label":"close",children:"✕"})]}),c.jsx("div",{style:et.warn,children:m("trustedSites.warn","⚠ 列表中的站点可以在你的电脑上执行命令(exec)。只添加你完全信任的地址。")}),c.jsxs("div",{style:et.addRow,children:[c.jsx("input",{"data-id":"trusted-sites-input",style:et.input,value:r,onChange:nt=>j(nt.target.value),onKeyDown:nt=>{nt.key==="Enter"&&H()},placeholder:m("trustedSites.placeholder","添加站点,如 app.cicy-ai.com 或 my-cloud.example.org")}),c.jsx("button",{type:"button","data-id":"trusted-sites-add",style:{...et.addBtn,opacity:O||!r.trim()?.5:1},onClick:H,disabled:O||!r.trim(),children:m("trustedSites.add","添加")})]}),U&&c.jsx("div",{style:et.err,children:U}),c.jsx("div",{style:et.listWrap,children:S===null?c.jsx("div",{style:et.muted,children:m("trustedSites.loading","加载中…")}):S.length===0?c.jsx("div",{style:et.muted,children:m("trustedSites.empty","暂无")}):S.map(nt=>c.jsxs("div",{style:et.row,"data-id":"trusted-sites-row",children:[c.jsx("span",{style:et.host(nt.builtin),children:nt.host}),nt.builtin?c.jsx("span",{style:et.tag,children:m("trustedSites.builtin","系统")}):c.jsx("button",{type:"button",style:et.rm,onClick:()=>at(nt.host),disabled:O,children:m("trustedSites.remove","删除")})]},nt.host))})]})}),document.body)}function ng({onClose:o}){const[S,w]=C.useState(null),[r,j]=C.useState(""),[O,Z]=C.useState(""),[U,T]=C.useState(!1),v=typeof window<"u"&&window.cicy&&window.cicy.rpcAudit||null,Q=C.useCallback(async()=>{T(!0),j("");try{const R=v&&await v.tail(400);!R||R.ok===!1?(j(R&&R.error||m("audit.loadFailed","读取失败")),w([])):(w(R.entries||[]),Z(R.path||""))}catch(R){j(String(R&&R.message||R)),w([])}finally{T(!1)}},[v]);C.useEffect(()=>{Q()},[Q]);const[H,at]=C.useState("all"),[et,nt]=C.useState(""),$=R=>{try{return new Date(R).toLocaleString()}catch{return R||""}},ot=R=>{if(R.kind==="auth"){const mt=/deny/.test(R.decision||"");return{text:R.decision||"auth",color:mt?"#fca5a5":"#86efac",bg:mt?"rgba(239,68,68,.14)":"rgba(34,197,94,.14)"}}if(R.kind==="rpc"){const mt=R.ok!==!1&&!R.error;return{text:mt?"ok":"err",color:mt?"#86efac":"#fca5a5",bg:mt?"rgba(34,197,94,.14)":"rgba(239,68,68,.14)"}}return{text:R.kind||"log",color:"#a1a1aa",bg:"rgba(255,255,255,.06)"}},At=R=>R.kind==="auth"?`${R.gate||""}${R.decision?" · "+R.decision:""}`:R.kind==="rpc"?`${R.tool||""}${R.dangerous?" ⚠":""}`:R.kind||"",dt=R=>R.error||R.args||(R.kind==="rpc"?R.channel:"")||"",rt=S||[],xt=et.trim().toLowerCase(),zt=rt.filter(R=>H!=="all"&&R.kind!==H?!1:xt?[R.origin,R.host,R.tool,R.gate,R.decision,R.channel,R.args,R.error,R.kind].filter(Boolean).join(" ").toLowerCase().includes(xt):!0),pt="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:R=>({background:R?"rgba(255,255,255,.14)":"transparent",border:"1px solid rgba(255,255,255,.12)",borderRadius:999,padding:"6px 16px",color:R?"#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:pt,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:pt,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:R=>({justifySelf:"start",fontSize:11.5,color:R.color,background:R.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}},Nt=R=>c.jsx("div",{children:R});return sn.createPortal(c.jsx("div",{style:G.overlay,onClick:o,"data-id":"AuditLogModal",children:c.jsxs("div",{style:G.card,onClick:R=>R.stopPropagation(),children:[c.jsxs("div",{style:G.head,children:[c.jsxs("div",{style:G.titleWrap,children:[c.jsx("h2",{style:G.title,children:m("audit.title","审计日志")}),O&&c.jsx("p",{style:G.subtitle,children:O})]}),c.jsxs("span",{style:G.count,children:[m("audit.count","共")," ",zt.length,H!=="all"||xt?` / ${rt.length}`:""]}),c.jsx("button",{type:"button","data-id":"audit-refresh",style:{...G.refresh,opacity:U?.5:1},onClick:Q,disabled:U,children:m("audit.refresh","刷新")}),c.jsx("button",{type:"button",style:G.x,onClick:o,"aria-label":"close",children:"✕"})]}),c.jsxs("div",{style:G.toolbar,children:[c.jsxs("div",{style:G.chips,children:[c.jsx("button",{type:"button",style:G.chip(H==="all"),onClick:()=>at("all"),children:m("audit.all","全部")}),c.jsx("button",{type:"button",style:G.chip(H==="rpc"),onClick:()=>at("rpc"),children:m("audit.rpc","RPC 调用")}),c.jsx("button",{type:"button",style:G.chip(H==="auth"),onClick:()=>at("auth"),children:m("audit.auth","授权决定")})]}),c.jsx("input",{"data-id":"audit-search",style:G.search,value:et,onChange:R=>nt(R.target.value),placeholder:m("audit.search","搜索来源 / 工具 / 命令…")})]}),r&&c.jsx("div",{style:G.err,children:r}),c.jsxs("div",{style:G.tableWrap,children:[c.jsxs("div",{style:G.theadRow,children:[Nt(m("audit.colTime","时间")),Nt(m("audit.colType","类型")),Nt(m("audit.colSource","来源")),Nt(m("audit.colOp","操作")),Nt(m("audit.colDetail","详情"))]}),S===null?c.jsx("div",{style:G.muted,children:m("audit.loading","加载中…")}):zt.length===0?c.jsx("div",{style:G.muted,children:rt.length===0?m("audit.empty","暂无审计记录"):m("audit.noMatch","无匹配记录")}):zt.map((R,mt)=>{const Lt=ot(R);return c.jsxs("div",{style:G.row,"data-id":"audit-row",children:[c.jsx("span",{style:G.time,children:$(R.ts)}),c.jsx("span",{style:G.badge(Lt),children:Lt.text}),c.jsx("span",{style:G.cell,children:R.origin||R.host||"—"}),c.jsx("span",{style:G.cell,children:At(R)||"—"}),c.jsx("span",{style:G.detail,children:dt(R)||"—"})]},mt)})]})]})}),document.body)}function ig({me:o,welcome:S,onLogout:w,mitmTeam:r}){const j=(o==null?void 0:o.display_name)||(o==null?void 0:o.username)||"…",O=j.slice(0,1).toUpperCase(),[Z,U]=C.useState(!1),[T,v]=C.useState(!1),[Q,H]=C.useState(!1),[at,et]=C.useState(!1),[nt,$]=C.useState(""),ot=C.useRef(null);C.useEffect(()=>{var rt,xt,zt;let dt=!0;return(zt=(xt=(rt=window.cicy)==null?void 0:rt.app)==null?void 0:xt.getVersion)==null||zt.call(xt).then(pt=>{dt&&$(typeof pt=="string"?pt:String((pt==null?void 0:pt.desktop)||""))}).catch(()=>{}),()=>{dt=!1}},[]),C.useEffect(()=>{if(!Z)return;const dt=rt=>{ot.current&&!ot.current.contains(rt.target)&&U(!1)};return document.addEventListener("mousedown",dt),()=>document.removeEventListener("mousedown",dt)},[Z]);const At=dt=>{ni(dt),U(!1)};return c.jsxs(c.Fragment,{children:[c.jsxs("header",{className:"topbar",children:[c.jsxs("div",{className:"brand-mini",children:[c.jsx("div",{className:"brand-mark sm",children:c.jsx(wm,{})}),c.jsx("span",{className:"brand-name",children:"CiCy Desktop"})]}),c.jsxs("div",{className:"user-chip","data-id":"UserChip",ref:ot,children:[S&&c.jsx("span",{className:"welcome",children:S}),c.jsxs("button",{type:"button","data-id":"UserChip-trigger",className:`user-chip__trigger${Z?" is-open":""}`,onClick:()=>U(dt=>!dt),children:[c.jsx("div",{className:"avatar",children:O}),c.jsx("span",{className:"user-name",children:j}),c.jsx("span",{className:"user-chip__caret","aria-hidden":!0,children:"▾"})]}),Z&&c.jsxs("div",{className:"user-chip__menu","data-id":"UserChip-menu",role:"menu",children:[c.jsx("button",{type:"button","data-id":"UserChip-wallet",className:"user-chip__menu-item",onClick:()=>At("?view=wallet"),children:m("userMenu.wallet","我的钱包")}),c.jsx("button",{type:"button","data-id":"UserChip-billing",className:"user-chip__menu-item",onClick:()=>At("?view=usage"),children:m("userMenu.billing","我的账单")}),c.jsx("button",{type:"button","data-id":"UserChip-trusted-sites",className:"user-chip__menu-item",onClick:()=>{U(!1),v(!0)},children:m("trustedSites.menu","受信任站点")}),c.jsx("button",{type:"button","data-id":"UserChip-audit-log",className:"user-chip__menu-item",onClick:()=>{U(!1),H(!0)},children:m("audit.menu","审计日志")}),c.jsx("button",{type:"button","data-id":"UserChip-terms",className:"user-chip__menu-item",onClick:()=>{U(!1),et(!0)},children:m("firstRunTerms.menu","用户协议")}),!1,c.jsx("div",{className:"user-chip__menu-sep","aria-hidden":!0}),c.jsx("button",{type:"button","data-id":"UserChip-logout",className:"user-chip__menu-item is-danger",onClick:()=>{U(!1),w()},children:m("userMenu.logout","退出")}),c.jsxs("div",{className:"user-chip__menu-version","data-id":"UserChip-version",children:["CiCy Desktop ",nt?`v${nt}`:"…"]})]})]})]}),T&&c.jsx(lg,{onClose:()=>v(!1)}),Q&&c.jsx(ng,{onClose:()=>H(!1)}),at&&c.jsx(Tm,{onClose:()=>et(!1)})]})}function Tm({onAgree:o,onClose:S}){var nt;const[w,r]=C.useState(!1),[j,O]=C.useState(!1),Z=(((nt=window.cicyI18n)==null?void 0:nt.locale)||"en").startsWith("zh")?"zh-CN":"en",U=($,ot)=>m(`firstRunTerms.${$}`,ot),T=!!S,v=C.useMemo(()=>Iy(Wy(Z)),[Z]),Q=$=>{const ot=$.currentTarget;ot.scrollHeight-ot.scrollTop-ot.clientHeight<24&&r(!0)},H=C.useRef(null);C.useEffect(()=>{const $=H.current;$&&$.scrollHeight<=$.clientHeight+24&&r(!0)},[]);const at=async()=>{var $,ot,At;if(!(j||!w)){O(!0);try{await((At=(ot=($=window.cicy)==null?void 0:$.terms)==null?void 0:ot.agree)==null?void 0:At.call(ot,xm)),o==null||o()}catch{o==null||o()}}},et=()=>{var $,ot,At;try{(At=(ot=($=window.cicy)==null?void 0:$.terms)==null?void 0:ot.decline)==null||At.call(ot)}catch{}};return c.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?$=>{$.target===$.currentTarget&&S()}:void 0,children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"terms-gate__panel",children:[c.jsx("h1",{className:"terms-gate__title","data-id":"FirstRunTermsGate-title",children:U("title","用户协议与授权说明")}),c.jsx("p",{className:"terms-gate__subtitle",children:U("subtitle","使用 CiCy Desktop 前,请阅读并同意以下条款")}),c.jsx("div",{className:"terms-gate__body",ref:H,onScroll:Q,"data-id":"FirstRunTermsGate-body",children:c.jsx("div",{className:"terms-md","data-id":"FirstRunTermsGate-md",dangerouslySetInnerHTML:{__html:v}})}),T?c.jsx("div",{className:"terms-gate__actions",children:c.jsx("button",{"data-id":"FirstRunTermsGate-close",className:"terms-gate__btn",onClick:S,children:U("close","关闭")})}):c.jsxs(c.Fragment,{children:[!w&&c.jsx("div",{className:"terms-gate__scrollhint","data-id":"FirstRunTermsGate-scrollhint",children:U("scrollHint","请阅读至底部以继续")}),c.jsxs("div",{className:"terms-gate__actions",children:[c.jsx("button",{"data-id":"FirstRunTermsGate-decline",className:"terms-gate__btn terms-gate__btn--ghost",onClick:et,children:U("decline","不同意并退出")}),c.jsx("button",{"data-id":"FirstRunTermsGate-agree",className:"terms-gate__btn",disabled:!w||j,title:w?"":U("mustAgree","未同意则无法使用本软件。"),onClick:at,children:U("agree","同意并继续")})]})]})]})]})}const $s=new Set;let dm=0,ae=null;function un(){$s.forEach(o=>o(ae))}const ne={open({onRetry:o}={}){ae={status:"running",phase:"install-docker",logs:[],bars:{},minimized:!1,onRetry:o||null,lastAt:Date.now()},un()},minimize(){ae&&(ae={...ae,minimized:!0},un())},restore(){ae&&(ae={...ae,minimized:!1},un())},push(o={}){var Z;if(!ae)return;const S=o.phase==="health"?"container":o.phase||ae.phase,w={...ae,phase:S,lastAt:Date.now()},r=Number.isFinite(o.progress),j=S==="install-docker"||S==="image";if(j&&(r||o.dest||o.url)){const U=((Z=ae.bars)==null?void 0:Z[S])||{},T=r?o.progress:o.status==="skip"||o.status==="done"?100:U.progress;w.bars={...ae.bars,[S]:{progress:T,received:o.received??U.received,total:o.total??U.total,url:o.url||U.url,dest:o.dest||U.dest}}}if(!(o.status==="running"&&r&&j)){const U={id:++dm,t:Tu(),phase:S,status:o.status||"running",message:o.message||""};w.logs=[...ae.logs,U]}ae=w,un()},finish({ok:o,message:S,status:w}={}){if(!ae)return;const r=w||(o?"done":"error"),j=r==="error"?ae.phase:"done",O={id:++dm,t:Tu(),phase:j,status:r,message:S||(o?"完成":"失败")};ae={...ae,status:r,phase:j,minimized:!1,logs:[...ae.logs,O],lastAt:Date.now()},un()},close(){ae=null,un()}},Xs=[["install-docker","准备环境"],["image","下载运行环境"],["container","启动服务"],["done","完成"]],ug={"install-docker":"准备",image:"下载",container:"启动",health:"启动",done:"完成"},cg={"install-docker":"Docker Desktop",image:"基础镜像"};function mm(o){return Number.isFinite(o)?o<1024?o+" B":o<1048576?(o/1024).toFixed(0)+" KB":o<1073741824?(o/1048576).toFixed(1)+" MB":(o/1073741824).toFixed(2)+" GB":"?"}function sg({phaseKey:o,bar:S}){const w=Number.isFinite(S==null?void 0:S.progress)?Math.max(0,Math.min(100,S.progress)):0,r=w>=100;return c.jsxs("div",{className:"dlbar","data-id":`DockerDrawer-dlbar-${o}`,children:[c.jsxs("div",{className:"dlbar__head",children:[c.jsx("span",{className:"dlbar__name",children:cg[o]||o}),c.jsxs("span",{className:"dlbar__pct",children:[w,"%",S!=null&&S.total?` · ${mm(S.received)} / ${mm(S.total)}`:""]})]}),c.jsx("div",{className:"dlbar__track",children:c.jsx("div",{className:`dlbar__fill${r?" is-done":""}`,style:{width:`${w}%`}})}),(S==null?void 0:S.url)&&c.jsxs("div",{className:"dlbar__url",title:S.url,children:[c.jsx("span",{className:"dlbar__urlk",children:"源"})," ",S.url]}),(S==null?void 0:S.dest)&&c.jsxs("div",{className:"dlbar__url",title:S.dest,children:[c.jsx("span",{className:"dlbar__urlk",children:"存"})," ",S.dest]})]})}function og(){var Z;const[o,S]=C.useState(ae);C.useEffect(()=>($s.add(S),()=>{$s.delete(S)}),[]);const w=C.useRef(null);if(C.useEffect(()=>{const U=w.current;U&&(U.scrollTop=U.scrollHeight)},[(Z=o==null?void 0:o.logs)==null?void 0:Z.length]),!o)return null;const r=o.status==="running",j=Xs.findIndex(([U])=>U===o.phase),O=["install-docker","image"].filter(U=>{var T;return(T=o.bars)==null?void 0:T[U]});if(o.minimized){const U=O.map(v=>{var Q;return(Q=o.bars[v])==null?void 0:Q.progress}).filter(Number.isFinite),T=U.length?Math.round(U.reduce((v,Q)=>v+Q,0)/U.length):null;return c.jsxs("button",{type:"button",className:`drawer-min drawer-min--${o.status}`,"data-id":"DockerDrawer-restore",onClick:()=>ne.restore(),children:[c.jsx("span",{className:"drawer-min__spark",children:r?c.jsx(je,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("span",{className:"drawer-min__label",children:[m("docker.setupTitle","安装 Docker cicy-code"),T!=null?` · ${T}%`:""]})]})}return c.jsx("div",{className:"drawer-scrim","data-id":"DockerDrawer-scrim",onClick:()=>r?ne.minimize():ne.close(),children:c.jsxs("div",{className:"drawer","data-id":"DockerDrawer","data-status":o.status,onClick:U=>U.stopPropagation(),children:[c.jsxs("div",{className:"drawer__head",children:[c.jsxs("div",{className:"drawer__title",children:[c.jsx("span",{className:`drawer__spark drawer__spark--${o.status}`,children:r?c.jsx(je,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("div",{children:[c.jsx("div",{className:"drawer__h",children:m("docker.setupTitle","安装 Docker cicy-code")}),c.jsx("div",{className:"drawer__sub",children:"127.0.0.1:8009"})]})]}),c.jsx("div",{className:"drawer__headbtns",children:c.jsx("button",{type:"button",className:"drawer__x","data-id":"DockerDrawer-min",title:m("common.minimize","最小化"),onClick:()=>ne.minimize(),"aria-label":"minimize",children:"‒"})})]}),c.jsx("div",{className:"drawer__steps","data-id":"DockerDrawer-steps",children:Xs.map(([U,T],v)=>{const Q=o.status==="done"||j>=0&&v<j,H=v===j&&r,at=o.status==="error"&&v===j;return c.jsxs("div",{className:`drawer__step${H?" is-active":""}${Q?" is-done":""}${at?" is-error":""}`,children:[c.jsx("span",{className:"drawer__step-dot",children:Q?"✓":at?"!":v+1}),c.jsx("span",{className:"drawer__step-label",children:T}),v<Xs.length-1&&c.jsx("span",{className:"drawer__step-bar"})]},U)})}),O.length>0&&c.jsx("div",{className:"drawer__dlbars","data-id":"DockerDrawer-dlbars",children:O.map(U=>c.jsx(sg,{phaseKey:U,bar:o.bars[U]},U))}),r&&o.logs.length>0&&c.jsxs("div",{className:"drawer__now","data-id":"DockerDrawer-now",children:[c.jsx(je,{}),c.jsx("span",{children:o.logs[o.logs.length-1].message})]}),c.jsx("div",{className:"drawer__log drawer__log--scroll","data-id":"DockerDrawer-log",ref:w,children:o.logs.length===0?c.jsx("div",{className:"drawer__log-empty",children:m("docker.preparing","准备中…")}):o.logs.map(U=>c.jsxs("div",{className:"drawer__line","data-status":U.status,children:[c.jsx("span",{className:"drawer__t",children:U.t}),c.jsx("span",{className:`drawer__badge drawer__badge--${U.phase}`,children:ug[U.phase]||U.phase}),c.jsx("span",{className:"drawer__linemsg",children:U.message})]},U.id))}),c.jsx("div",{className:"drawer__foot",children:r?c.jsx(c.Fragment,{children:c.jsx("span",{className:"drawer__foot-status",children:m("docker.installing2","安装进行中…")})}):o.status==="reboot"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-reboot",children:m("docker.rebootShort","需重启 Windows")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>o.onRetry(),children:m("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>ne.close(),children:m("common.close","关闭")})]}):o.status==="error"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-error",children:m("docker.failed","安装失败")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>o.onRetry(),children:m("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>ne.close(),children:m("common.close","关闭")})]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-done",children:m("docker.ready","已就绪")}),c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-finish",onClick:()=>ne.close(),children:m("common.done","完成")})]})})]})})}function rg({dockerTeam:o,cloudTitle:S,onOpen:w,onRename:r,onRefresh:j}){var Tt;const[O,Z]=C.useState(null),[U,T]=C.useState(""),[v,Q]=C.useState(!1),[H,at]=C.useState(!1),[et,nt]=C.useState(!1),[$,ot]=C.useState(""),At=S||"Docker 团队",dt=k=>{var st;(st=k==null?void 0:k.stopPropagation)==null||st.call(k),ot(At),nt(!0)},rt=async()=>{nt(!1);const k=String($||"").trim();if(!(!k||k===At||!r))try{await r(k),j==null||j()}catch{}},[xt,zt]=C.useState({top:0,left:0}),pt=C.useRef(null),G=C.useRef(null),Nt=184,R="#2496ed",mt=C.useCallback(async()=>{var k,st,bt;try{const St=await((bt=(st=(k=window.cicy)==null?void 0:k.docker)==null?void 0:st.appStatus)==null?void 0:bt.call(st));Z(St),St!=null&&St.running&&ae&&ae.status==="running"&&ne.finish({ok:!0,message:"Docker cicy-code 已就绪"})}catch(St){console.warn("[DockerCard]",St)}},[]);C.useEffect(()=>{mt();const k=setInterval(()=>{U||mt()},12e3);return()=>clearInterval(k)},[mt,U]),C.useEffect(()=>{if(!v)return;const k=bt=>{var St,Dt;(St=pt.current)!=null&&St.contains(bt.target)||(Dt=G.current)!=null&&Dt.contains(bt.target)||Q(!1)},st=bt=>{bt.key==="Escape"&&Q(!1)};return document.addEventListener("mousedown",k),document.addEventListener("keydown",st),()=>{document.removeEventListener("mousedown",k),document.removeEventListener("keydown",st)}},[v]);const Lt=()=>{if(!v&&pt.current){const k=pt.current.getBoundingClientRect(),st=Math.max(8,Math.min(k.right-Nt,window.innerWidth-Nt-8));zt({top:Math.round(k.bottom+4),left:Math.round(st)})}Q(k=>!k)},Yt=C.useCallback(async()=>{var st,bt,St,Dt,Zt,le;T("bootstrap"),ne.open({onRetry:Yt});const k=(St=(bt=(st=window.cicy)==null?void 0:st.docker)==null?void 0:bt.onAppProgress)==null?void 0:St.call(bt,J=>ne.push(J));try{const J=await((le=(Zt=(Dt=window.cicy)==null?void 0:Dt.docker)==null?void 0:Zt.appBootstrap)==null?void 0:le.call(Zt));(J==null?void 0:J.reason)==="installer_launched"?ne.finish({status:"reboot",message:m("docker.installerLaunched","已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」")}):(J==null?void 0:J.reason)==="wsl_reboot_required"?ne.finish({status:"reboot",message:m("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):ne.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?m("docker.ready","Docker cicy-code 已就绪"):(J==null?void 0:J.error)||m("docker.failed","安装失败")}),J!=null&&J.ok&&(j==null||j())}catch(J){ne.finish({ok:!1,message:J.message})}finally{try{k&&k()}catch{}T(""),mt()}},[mt,j]),Ft=C.useCallback(async()=>{var st,bt,St,Dt,Zt,le;Q(!1),T("upgrade"),ne.open({onRetry:Ft});const k=(St=(bt=(st=window.cicy)==null?void 0:st.docker)==null?void 0:bt.onAppProgress)==null?void 0:St.call(bt,J=>ne.push(J));try{const J=await((le=(Zt=(Dt=window.cicy)==null?void 0:Dt.docker)==null?void 0:Zt.appUpgrade)==null?void 0:le.call(Zt));(J==null?void 0:J.reason)==="wsl_reboot_required"?ne.finish({status:"reboot",message:m("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):ne.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?m("docker.upgraded","已升级到最新"):(J==null?void 0:J.error)||m("docker.upgradeFailed","升级失败")}),J!=null&&J.ok&&(j==null||j())}catch(J){ne.finish({ok:!1,message:J.message})}finally{try{k&&k()}catch{}T(""),mt()}},[mt,j]),ce=C.useCallback(async()=>{var st,bt,St,Dt,Zt,le;Q(!1),T("update"),ne.open({onRetry:ce});const k=(St=(bt=(st=window.cicy)==null?void 0:st.docker)==null?void 0:bt.onAppProgress)==null?void 0:St.call(bt,J=>ne.push(J));try{const J=await((le=(Zt=(Dt=window.cicy)==null?void 0:Dt.docker)==null?void 0:Zt.appUpdate)==null?void 0:le.call(Zt));ne.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?m("docker.updated","cicy-code 已更新到最新"):(J==null?void 0:J.error)||m("docker.updateFailed","更新失败")}),J!=null&&J.ok&&(j==null||j())}catch(J){ne.finish({ok:!1,message:J.message})}finally{try{k&&k()}catch{}T(""),mt()}},[mt,j]),Gt=C.useCallback(async(k,st,bt)=>{Q(!1),T(k),te.show({id:"docker-op",message:m(`docker.${k}ing`,k==="restart"?"重启中…":k==="reload"?"刷新中…":"停止中…"),status:"running"});try{const St=await st();St!=null&&St.ok?te.show({id:"docker-op",message:bt,status:"done",ttl:2500}):te.show({id:"docker-op",message:(St==null?void 0:St.error)||m("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(St){te.show({id:"docker-op",message:St.message,status:"error",ttl:6e3})}finally{T(""),mt()}},[mt]),x=C.useCallback(async()=>{Q(!1),T("authssh"),te.show({id:"docker-op",message:m("docker.authorizingHost","授权容器访问 Mac(配置 SSH)…"),status:"running"});try{const k=await window.cicy.docker.appAuthorizeHostSsh();k!=null&&k.ok?te.show({id:"docker-op",message:k.verified?m("docker.authorizedHostOk","已授权:容器内 `ssh mac` 可访问 Mac ✅"):m("docker.authorizedHostPartial","公钥已写入 Mac(未验证成功,可在容器内手动 `ssh mac` 试)"),status:k.verified?"done":"error",ttl:5e3}):te.show({id:"docker-op",message:(k==null?void 0:k.error)||m("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(k){te.show({id:"docker-op",message:k.message,status:"error",ttl:6e3})}finally{T(""),mt()}},[mt]),q=C.useCallback(async k=>{Q(!1),T("chromeproxy"),te.show({id:"docker-op",message:k?m("docker.chromeProxyOn","启用 Chrome 代理(宿主 mihomo)…"):m("docker.chromeProxyOff","关闭 Chrome 代理…"),status:"running"});try{const st=await window.cicy.docker.appChromeProxy(k);st!=null&&st.ok?te.show({id:"docker-op",message:k?m("docker.chromeProxyDone","Chrome 代理已启用 ✅"):m("docker.chromeProxyUndone","Chrome 代理已关闭"),status:"done",ttl:3e3}):te.show({id:"docker-op",message:(st==null?void 0:st.error)||m("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(st){te.show({id:"docker-op",message:st.message,status:"error",ttl:6e3})}finally{T(""),mt()}},[mt]),lt=((Tt=window.cicy)==null?void 0:Tt.platform)||(O==null?void 0:O.platform);if(lt!=="win32")return null;const ft=!!(O!=null&&O.running)||(o==null?void 0:o.status)==="running",wt=!!(O!=null&&O.dockerRunning),d=!!(O!=null&&O.installed),E=!!(O!=null&&O.unknown)&&!ft&&!wt&&!d,B=!!(O!=null&&O.wslUnmanaged),V=ft?B?"warn":"ok":wt||d||E?"warn":"off",I=!!U;ft?B?m("docker.runningWslBroken","运行中 · ⚠ WSL 管理异常(能打开;更新/重启需修复 WSL)"):m("docker.running","运行中"):wt?m("docker.notRunning","未启动 · 点「启动」"):d?m("docker.engineDown","Docker 未运行 · 点启动"):E?m("docker.wslUnresponsive","WSL 未响应 · 点「重试检测」"):m("docker.notInstalled","Docker Desktop 未安装");const M=U==="open"?m("docker.opening","打开中…"):U==="probe"?m("docker.probing","检测中…"):I?m("docker.working","处理中…"):ft?m("localTeams.open","打开"):wt?m("docker.start","启动"):d?m("docker.startDocker","启动 Docker"):E?m("docker.retryProbe","重试检测"):m("docker.install","下载安装"),it=async()=>{var k,st,bt,St,Dt,Zt,le,J,K;if(!I){if(ft){try{const F=await((bt=(st=(k=window.cicy)==null?void 0:k.tabs)==null?void 0:st.activateIfOpen)==null?void 0:bt.call(st,"http://127.0.0.1:8009"));if(F!=null&&F.active)return}catch{}T("open");try{await(w==null?void 0:w(o==null?void 0:o.id))}finally{T("")}return}if(E){T("probe");try{const F=await(((Zt=(Dt=(St=window.cicy)==null?void 0:St.docker)==null?void 0:Dt.appRedetect)==null?void 0:Zt.call(Dt))??((K=(J=(le=window.cicy)==null?void 0:le.docker)==null?void 0:J.appStatus)==null?void 0:K.call(J)));F&&Z(F),F!=null&&F.unknown&&te.show({id:"docker-probe",status:"error",message:m("docker.wslStillStuck","WSL 仍无响应 —— 多半要重启 Windows 后再试"),ttl:6e3})}catch{te.show({id:"docker-probe",status:"error",message:m("docker.probeFailed","检测失败,请重试"),ttl:5e3})}finally{T("")}return}Yt()}},Ct=ft;return c.jsxs("div",{"data-id":"DockerCard",className:`bcard bcard--docker${ft?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent",style:{background:R}}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",style:{color:R},children:[c.jsx("span",{className:"bcard__dot","data-tone":V}),c.jsx("svg",{style:{width:18,height:18},viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:c.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"})})]}),Ct&&c.jsxs("div",{className:"bcard__menuwrap",onClick:k=>k.stopPropagation(),children:[c.jsx("button",{type:"button",ref:pt,"data-id":"DockerCard-menu-btn",className:"bcard__kebab",title:m("docker.manage","管理 Docker cicy-code"),disabled:I,onClick:Lt,children:I?c.jsx(je,{}):c.jsx(Is,{})}),v&&sn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"DockerCard-menu",role:"menu",ref:G,style:{position:"fixed",top:xt.top,left:xt.left,width:Nt},onClick:k=>k.stopPropagation(),children:[c.jsx("button",{type:"button","data-id":"DockerCard-update",className:"bcard__menu-item is-accent",onClick:ce,children:m("docker.update","更新 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-restart",className:"bcard__menu-item",onClick:()=>Gt("restart",()=>window.cicy.docker.appRestart(),m("docker.restarted","已重启 cicy-code")),children:m("docker.restart","重启 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-stop",className:"bcard__menu-item is-danger",onClick:()=>Gt("stop",()=>window.cicy.docker.appStop(),m("docker.stopped","已停止 cicy-code")),children:m("docker.stop","停止 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-reload",className:"bcard__menu-item",onClick:k=>{var st,bt,St;k.stopPropagation(),Q(!1),(St=(bt=(st=window.cicy)==null?void 0:st.tabs)==null?void 0:bt.reloadIfOpen)==null||St.call(bt,"http://127.0.0.1:8009","Docker 团队")},children:m("docker.reloadWindow","刷新窗口")}),c.jsx("button",{type:"button","data-id":"DockerCard-billing",className:"bcard__menu-item",onClick:()=>{Q(!1),ni(o!=null&&o.cloud_team_id?`?team=${encodeURIComponent(o.cloud_team_id)}`:"?view=usage")},children:m("docker.billing","帐单")}),c.jsx("div",{className:"bcard__menu-sep","data-id":"DockerCard-menu-sep",role:"separator","aria-hidden":!0}),lt==="darwin"&&c.jsx("button",{type:"button","data-id":"DockerCard-authorize-host-ssh",className:"bcard__menu-item",title:m("docker.authorizeHostHint","把容器公钥加到 Mac 的 authorized_keys,容器内 `ssh mac` 即可访问本机"),onClick:x,children:m("docker.authorizeHost","授权容器访问 Mac")}),c.jsxs("button",{type:"button","data-id":"DockerCard-chrome-proxy",className:"bcard__menu-item bcard__menu-item--switch",role:"menuitemcheckbox","aria-checked":!!(O!=null&&O.chromeProxy),title:m("docker.chromeProxyHint","在本机起一个 mihomo,给系统 Chrome 的分身代理(127.0.0.1:2000N)。配置从容器同步"),onClick:()=>q(!(O!=null&&O.chromeProxy)),children:[c.jsx("span",{children:m("docker.chromeProxy","Chrome 代理")}),c.jsx("span",{className:`bcard__switch${O!=null&&O.chromeProxy?" is-on":""}`,"data-id":"DockerCard-chrome-proxy-switch","aria-hidden":!0})]}),c.jsx("button",{type:"button","data-id":"DockerCard-docker-restart",className:"bcard__menu-item",onClick:()=>Gt("restart",()=>window.cicy.docker.appDockerRestart(),m("docker.dockerRestarted","已重启 Docker 容器")),children:m("docker.dockerRestart","重启 Docker")}),c.jsx("button",{type:"button","data-id":"DockerCard-recreate",className:"bcard__menu-item is-danger",onClick:k=>{k.stopPropagation(),Q(!1),at(!0)},children:m("docker.recreate","重建 Docker")})]}),document.body)]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:et?c.jsx("input",{"data-id":"DockerCard-rename-input",autoFocus:!0,value:$,onChange:k=>ot(k.target.value),onFocus:k=>k.target.select(),onBlur:rt,onClick:k=>k.stopPropagation(),onKeyDown:k=>{k.nativeEvent.isComposing||k.keyCode===229||(k.key==="Enter"?rt():k.key==="Escape"&&nt(!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"}}):c.jsxs("h3",{className:"bcard__name",title:r?m("localTeams.renameHint","点名字或 ✎ 改名"):At,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:r?dt:void 0,children:[c.jsx("span",{onClick:r?dt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:r?"text":"default"},children:At}),r&&c.jsx("button",{type:"button","data-id":"DockerCard-rename-btn",title:m("localTeams.rename","重命名"),onClick:dt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsxs("div",{className:"bcard__meta",children:[c.jsx("span",{className:"bcard__chip",children:"Docker"}),(O==null?void 0:O.version)&&c.jsxs("span",{className:"bcard__ver","data-id":"DockerCard-ver",style:{marginLeft:8,fontSize:11,opacity:.6},children:["v",O.version]})]})]}),c.jsxs("button",{type:"button",className:"bcard__cta","data-id":"DockerCard-cta",disabled:I,onClick:it,style:ft?void 0:{background:R,color:"white"},children:[I?c.jsx(je,{}):c.jsx(wu,{}),c.jsx("span",{children:M})]}),H&&sn.createPortal(c.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"},onClick:()=>at(!1),children:c.jsxs("div",{onClick:k=>k.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:[c.jsx("h3",{style:{margin:"0 0 8px",fontSize:16,color:"#e6edf3"},children:m("docker.recreate","重建 Docker")}),c.jsx("p",{style:{margin:"0 0 18px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:m("docker.recreateConfirm","会删除当前容器并重新创建(volume 数据保留),用于切换为独立 team 的网关 key。确定重建?")}),c.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[c.jsx("button",{type:"button","data-id":"DockerCard-recreate-cancel",onClick:()=>at(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:m("common.cancel","取消")}),c.jsx("button",{type:"button","data-id":"DockerCard-recreate-confirm",onClick:()=>{at(!1),Gt("restart",()=>window.cicy.docker.appRecreate(),m("docker.recreated","已重建 Docker 容器"))},style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#da3633",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:m("docker.recreateOk","确定重建")})]})]})}),document.body)]})}function hm({team:o,onOpen:S,onRename:w,onRefresh:r}){var Dt,Zt,le,J;const O=(pm[o.status]||pm.error).tone,[Z,U]=C.useState(!1),[T,v]=C.useState(o.name||""),[Q,H]=C.useState(null),[at,et]=C.useState(""),nt=Q??o.name;C.useEffect(()=>{Q!=null&&o.name===Q&&H(null)},[o.name,Q]);const $=K=>{var F;(F=K==null?void 0:K.stopPropagation)==null||F.call(K),v(nt||""),U(!0)},ot=async()=>{U(!1);const K=String(T||"").trim();if(!w||!K||K===nt)return;H(K),et("saving");let F;try{F=await w(o.id,K)}catch(Ut){F={ok:!1,error:Ut==null?void 0:Ut.message}}H(null),F&&F.ok?(et("saved"),setTimeout(()=>et(Ut=>Ut==="saved"?"":Ut),1500)):(et(""),te.show({message:m("localTeams.renameFailed","改名没保存,已恢复"),status:"error",ttl:4e3}))},dt=!!((Zt=(Dt=window.cicy)==null?void 0:Dt.sidecar)!=null&&Zt.restart)&&Ws(o.base_url),rt=o.status==="running",[xt,zt]=C.useState(""),[pt,G]=C.useState(!1),[Nt,R]=C.useState({running:void 0,latest:null,installed:null}),mt=Nt.latest,Lt=Nt.running,[Yt,Ft]=C.useState(!1),ce=C.useRef(null),Gt=C.useRef(null),x=C.useRef(null),[q,lt]=C.useState({top:0,left:0}),ft=184,wt=()=>{if(!pt&&Gt.current){const K=Gt.current.getBoundingClientRect(),F=Math.max(8,Math.min(K.right-ft,window.innerWidth-ft-8));lt({top:Math.round(K.bottom+4),left:Math.round(F)})}G(K=>!K)},d=C.useCallback(async(K=!1)=>{var F,Ut;if(!(!dt||!((Ut=(F=window.cicy)==null?void 0:F.sidecar)!=null&&Ut.versions))){K&&Ft(!0);try{const ht=await window.cicy.sidecar.versions();R({running:(ht==null?void 0:ht.running)??null,latest:(ht==null?void 0:ht.latest)??null,installed:(ht==null?void 0:ht.installed)??null}),K&&(ht!=null&&ht.running&&(ht!=null&&ht.latest)&&gm(ht.latest,ht.running)>0?te.show({message:`${m("sidecar.found","发现新版本")} v${ht.latest}`,status:"done",ttl:2500}):ht!=null&&ht.running?te.show({message:`${m("sidecar.upToDate","已是最新")} v${ht.running}`,status:"done",ttl:2500}):te.show({message:m("sidecar.notRunning","cicy-code 未运行"),status:"error",ttl:4e3}))}catch{K&&te.show({message:m("sidecar.checkFailed","检查更新失败"),status:"error",ttl:5e3})}finally{K&&Ft(!1)}}},[dt]);C.useEffect(()=>{d(!1)},[d]),C.useEffect(()=>{rt&&d(!1)},[rt,d]);const E=!!(dt&&mt&&Lt&&gm(mt,Lt)>0),B=!dt&&!!((J=(le=window.cicy)==null?void 0:le.localTeams)!=null&&J.remove),V=dt||B,[I,M]=C.useState(!1);C.useEffect(()=>{if(!pt)return;const K=F=>{var Ut,ht;(Ut=Gt.current)!=null&&Ut.contains(F.target)||(ht=x.current)!=null&&ht.contains(F.target)||G(!1)};return document.addEventListener("mousedown",K),()=>document.removeEventListener("mousedown",K)},[pt]),C.useEffect(()=>{pt||M(!1)},[pt]);const it=async()=>{var K,F,Ut;if(!I){M(!0);return}if(G(!1),M(!1),!xt){zt("remove");try{await((Ut=(F=(K=window.cicy)==null?void 0:K.localTeams)==null?void 0:F.remove)==null?void 0:Ut.call(F,o.id))}catch{}zt(""),r==null||r()}},Ct=`sidecar-op:${o.id}`,Tt=async(K,F,Ut)=>{var Re,ge,N,Y,L;if(G(!1),xt)return;zt(K);const ht=K==="update";let aa=null;ht?(Ee.open({teamId:o.id,fromVer:Lt,toVer:mt,onRetry:()=>Tt("update",F,Ut)}),(ge=(Re=window.cicy)==null?void 0:Re.sidecar)!=null&&ge.onOpProgress&&(aa=window.cicy.sidecar.onOpProgress(X=>{(X==null?void 0:X.op)==="update"&&Ee.push(X)}))):te.show({id:Ct,message:k[K]||`${K}…`,status:"running",progress:void 0});try{const X=await F(),P=!!(X!=null&&X.ok),Rt=X!=null&&X.warning?`${Ut}(${X.warning})`:Ut,gt=m("sidecar.failed","操作失败")+(X!=null&&X.error?`: ${X.error}`:"");if(ht){if(Ee.finish({ok:P,message:P?Rt:gt}),P)try{await((L=(Y=(N=window.cicy)==null?void 0:N.localTeams)==null?void 0:Y.reload)==null?void 0:L.call(Y,o.id,{ignoreCache:!0}))}catch{}}else te.show({id:Ct,message:P?Rt:gt,progress:void 0,status:P?"done":"error",ttl:P?4e3:8e3})}catch(X){const P=m("sidecar.failed","操作失败")+`: ${(X==null?void 0:X.message)||X}`;ht?Ee.finish({ok:!1,message:P}):te.show({id:Ct,message:P,progress:void 0,status:"error",ttl:8e3})}finally{try{aa&&aa()}catch{}zt(""),r==null||r(),(K==="update"||K==="restart"||K==="start")&&d(!1)}},k={start:m("busy.start","启动中…"),restart:m("busy.restart","重启中…"),update:m("busy.update","更新中…"),stop:m("busy.stop","停止中…")},st=async()=>{var Ut,ht,aa;zt("start"),Ee.open({teamId:o.id,title:m("sidecar.startTitle","启动 cicy-code"),onRetry:st}),Ee.push({phase:"download",status:"running",message:m("sidecar.starting","启动 cicy-code(首次需安装 Node + 依赖,日志见下)…")});const K=(aa=(ht=(Ut=window.cicy)==null?void 0:Ut.sidecar)==null?void 0:ht.onOpProgress)==null?void 0:aa.call(ht,Re=>Ee.push(Re));let F;try{F=await window.cicy.sidecar.start()}catch(Re){F={ok:!1,error:(Re==null?void 0:Re.message)||String(Re)}}try{K==null||K()}catch{}return zt(""),r==null||r(),!(F!=null&&F.ok)||F!=null&&F.warning?(Ee.finish({ok:!1,message:m("sidecar.startFailed","启动失败")+(F!=null&&F.error?`: ${F.error}`:F!=null&&F.warning?`: ${F.warning}`:"")}),!1):(Ee.finish({ok:!0,message:m("sidecar.startedOk","cicy-code 已就绪")}),!0)},bt=async()=>{var K,F;xt||!rt&&dt&&((F=(K=window.cicy)==null?void 0:K.sidecar)!=null&&F.start)&&!await st()||S()},St=rt?m("localTeams.open","打开"):dt?m("localTeams.startOpen","启动并打开"):m("localTeams.open","打开");return c.jsxs("div",{"data-id":"LocalTeamCard",className:`bcard ${dt?"bcard--local":"bcard--custom"}${O==="ok"?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent"}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":O}),c.jsx(dg,{})]}),V&&c.jsxs("div",{className:"bcard__menuwrap",ref:ce,onClick:K=>K.stopPropagation(),children:[c.jsx("button",{type:"button",ref:Gt,"data-id":"LocalTeamCard-menu-btn",className:`bcard__kebab${E?" has-dot":""}`,title:dt?m("localTeams.manage","管理本地 cicy-code"):m("localTeams.more","更多"),disabled:!!xt,onClick:wt,children:xt?c.jsx(je,{}):c.jsx(Is,{})}),pt&&sn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"LocalTeamCard-menu",role:"menu",ref:x,style:{position:"fixed",top:q.top,left:q.left,width:ft},onClick:K=>K.stopPropagation(),children:[dt&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-check-update",className:"bcard__menu-item",disabled:Yt,onClick:K=>{K.stopPropagation(),d(!0)},children:Yt?m("sidecar.checking2","检查中…"):m("sidecar.checkUpdate","检查更新")}),E&&c.jsxs("button",{type:"button","data-id":"LocalTeamCard-update",className:"bcard__menu-item is-accent",onClick:()=>Tt("update",()=>window.cicy.sidecar.update(),m("sidecar.updated","已更新到最新")),children:[m("sidecar.updateTo","更新到")," v",mt]}),o.base_url&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-reload",className:"bcard__menu-item",onClick:K=>{var F,Ut,ht;K.stopPropagation(),G(!1),(ht=(Ut=(F=window.cicy)==null?void 0:F.tabs)==null?void 0:Ut.reloadIfOpen)==null||ht.call(Ut,o.base_url,o.name)},children:m("localTeams.reloadWindow","刷新窗口")}),dt&&rt&&c.jsxs(c.Fragment,{children:[c.jsx("button",{type:"button","data-id":"LocalTeamCard-restart",className:"bcard__menu-item",onClick:()=>Tt("restart",()=>window.cicy.sidecar.restart(),m("sidecar.restarted","已重启")),children:m("sidecar.restart","重启")}),c.jsx("button",{type:"button","data-id":"LocalTeamCard-stop",className:"bcard__menu-item is-danger",onClick:()=>Tt("stop",()=>window.cicy.sidecar.stop(),m("sidecar.stoppedDone","已停止")),children:m("sidecar.stop","停止")})]}),o.cloud_team_id&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-billing",className:"bcard__menu-item",onClick:K=>{K.stopPropagation(),G(!1),ni(`?team=${encodeURIComponent(o.cloud_team_id)}`)},children:m("localTeams.billing","账单")}),B&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-remove",className:"bcard__menu-item is-danger",onClick:it,children:I?m("localTeams.removeConfirm","确认删除?"):m("localTeams.remove","删除")}),c.jsx("button",{type:"button","data-id":"LocalTeamCard-addr",className:"bcard__menu-item",title:m("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:K=>{K.stopPropagation(),G(!1);try{navigator.clipboard.writeText(o.base_url||"")}catch{}},children:o.base_url||"—"}),(Lt||o.version)&&c.jsxs("div",{"data-id":"LocalTeamCard-version",className:"bcard__menu-item",style:{cursor:"default",color:"#8b949e",fontSize:12},children:[m("localTeams.version","版本")," v",Lt||o.version]})]}),document.body)]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:Z?c.jsx("input",{"data-id":"LocalTeamCard-rename-input",autoFocus:!0,value:T,onChange:K=>v(K.target.value),onFocus:K=>K.target.select(),onBlur:ot,onClick:K=>K.stopPropagation(),onKeyDown:K=>{K.nativeEvent.isComposing||K.keyCode===229||(K.key==="Enter"?ot():K.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"}}):c.jsxs("h3",{className:"bcard__name",title:m("localTeams.renameHint","点名字或 ✎ 改名"),style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:$,children:[c.jsx("span",{"data-id":"LocalTeamCard-name-text",onClick:$,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"text"},children:nt}),at==="saving"&&c.jsx("span",{"data-id":"LocalTeamCard-save-state",title:m("localTeams.saving","保存中…"),style:{flex:"none",display:"inline-flex"},children:c.jsx(je,{})}),at==="saved"&&c.jsx("span",{"data-id":"LocalTeamCard-save-state",title:m("localTeams.saved","已保存"),style:{flex:"none",color:"#3fb950",fontSize:13,lineHeight:1},children:"✓"}),!at&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-rename-btn",title:m("localTeams.rename","重命名"),onClick:$,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsx("div",{className:"bcard__meta",children:c.jsx("span",{className:"bcard__chip","data-id":"LocalTeamCard-kind",children:dt?m("localTeams.kindLocal","本地"):m("localTeams.kindCustom","自定义")})})]}),c.jsxs("button",{type:"button",className:"bcard__cta","data-id":"LocalTeamCard-open",disabled:!!xt||!o.base_url,onClick:bt,children:[xt&&xt!=="stop"?c.jsx(je,{}):c.jsx(wu,{}),c.jsx("span",{children:xt&&k[xt]||St})]})]})}function Ws(o){try{const S=new URL(o);return(S.hostname==="127.0.0.1"||S.hostname==="localhost"||S.hostname==="::1")&&(S.port==="8008"||S.port==="")}catch{return!1}}function ym(o){try{const S=new URL(o);return(S.hostname==="127.0.0.1"||S.hostname==="localhost"||S.hostname==="::1")&&S.port==="8009"}catch{return!1}}function gm(o,S){const w=String(o).split("."),r=String(S).split(".");for(let j=0;j<Math.max(w.length,r.length);j++){const O=(parseInt(w[j],10)||0)-(parseInt(r[j],10)||0);if(O)return O>0?1:-1}return 0}const pm={running:{tone:"ok",label:"running",cta:m("localStatus.open","打开")},stopped:{tone:"off",label:"stopped",cta:m("localStatus.notRunning","未运行")},auth_error:{tone:"warn",label:"auth error",cta:m("localStatus.tokenInvalid","Token 失效")},misconfigured:{tone:"err",label:"bad config",cta:m("localStatus.badUrl","URL 错误")},error:{tone:"err",label:"error",cta:m("localStatus.error","异常")}};function fg({team:o,onOpen:S,onRename:w,onEditUrl:r}){const j=o.kind==="private",O=o.status==="active",Z=o.name||o.title||"—",[U,T]=C.useState(!1),[v,Q]=C.useState(""),[H,at]=C.useState(null),et=H??Z;C.useEffect(()=>{H!=null&&Z===H&&at(null)},[Z,H]);const nt=M=>{var it;(it=M==null?void 0:M.stopPropagation)==null||it.call(M),Q(et==="—"?"":et),T(!0)},$=async()=>{T(!1);const M=String(v||"").trim();if(!(!w||!M||M===et)){at(M);try{const it=await w(o.id,M);it!=null&&it.ok||at(null)}catch{at(null)}}},ot=o.host_url||"",[At,dt]=C.useState(!1),[rt,xt]=C.useState(""),[zt,pt]=C.useState(null),G=zt??ot;C.useEffect(()=>{zt!=null&&ot===zt&&pt(null)},[ot,zt]);const Nt=o.teamId||o.id,R=j?m("teamKind.private","私有云"):o.team_kind==="personal"?m("teamKind.personal","个人"):m("teamKind.shared","共享"),mt=j?G:o.workspace_url||o.workspace_direct_url,Lt=!!mt,[Yt,Ft]=C.useState(!1),[ce,Gt]=C.useState(!1),[x,q]=C.useState({top:0,left:0}),lt=C.useRef(null),ft=C.useRef(null),wt=C.useRef(null),d=184,E=()=>{if(!Yt&&ft.current){const M=ft.current.getBoundingClientRect(),it=Math.max(8,Math.min(M.right-d,window.innerWidth-d-8));q({top:Math.round(M.bottom+4),left:Math.round(it)})}Ft(M=>!M)};C.useEffect(()=>{if(!Yt)return;const M=it=>{var Ct,Tt;(Ct=ft.current)!=null&&Ct.contains(it.target)||(Tt=wt.current)!=null&&Tt.contains(it.target)||Ft(!1)};return document.addEventListener("mousedown",M),()=>document.removeEventListener("mousedown",M)},[Yt]);const B=M=>{var it,Ct,Tt,k;(it=M==null?void 0:M.stopPropagation)==null||it.call(M),Lt&&(Ft(!1),(k=(Tt=(Ct=window.cicy)==null?void 0:Ct.tabs)==null?void 0:Tt.reloadIfOpen)==null||k.call(Tt,mt,et))},V=()=>{xt(ot),dt(!0),Ft(!1)},I=async()=>{dt(!1);const M=String(rt||"").trim();if(!(!r||!M||M===ot)){pt(M);try{const it=await r(o.id,M);it!=null&&it.ok||pt(null)}catch{pt(null)}}};return c.jsxs("div",{"data-id":"TeamCard",className:`bcard bcard--cloud${O?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent"}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":O?"ok":"off"}),c.jsx(mg,{})]}),c.jsxs("div",{className:"bcard__top-right",children:[o.is_trial&&c.jsx("span",{className:"bcard__badge",children:"trial"}),(Lt||Nt!=null||j&&r)&&c.jsxs("div",{className:"bcard__menuwrap",ref:lt,onClick:M=>M.stopPropagation(),children:[c.jsx("button",{type:"button",ref:ft,"data-id":"TeamCard-menu-btn",className:"bcard__kebab",title:m("localTeams.more","更多"),disabled:ce,onClick:E,children:ce?c.jsx(je,{}):c.jsx(Is,{})}),Yt&&sn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"TeamCard-menu",role:"menu",ref:wt,style:{position:"fixed",top:x.top,left:x.left,width:d},onClick:M=>M.stopPropagation(),children:[Lt&&c.jsx("button",{type:"button","data-id":"TeamCard-reload",className:"bcard__menu-item",onClick:B,children:m("localTeams.reloadWindow","刷新窗口")}),Nt!=null&&c.jsx("button",{type:"button","data-id":"TeamCard-billing",className:"bcard__menu-item",onClick:M=>{M.stopPropagation(),Ft(!1),ni(`?team=${encodeURIComponent(Nt)}`)},children:m("localTeams.billing","账单")}),Lt&&c.jsx("button",{type:"button","data-id":"TeamCard-addr",className:"bcard__menu-item",title:m("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:M=>{M.stopPropagation(),Ft(!1);try{navigator.clipboard.writeText(mt||ot||"")}catch{}},children:j?G||mt:mt||o.runtime_region||o.region||"—"}),j&&r&&c.jsx("button",{type:"button","data-id":"TeamCard-edit-url",className:"bcard__menu-item",onClick:M=>{M.stopPropagation(),V()},children:ot?m("teamCard.editUrl","更改访问地址"):m("teamCard.setUrl","填写访问地址")})]}),document.body)]})]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:U?c.jsx("input",{"data-id":"TeamCard-rename-input",autoFocus:!0,value:v,onChange:M=>Q(M.target.value),onFocus:M=>M.target.select(),onBlur:$,onClick:M=>M.stopPropagation(),onKeyDown:M=>{M.nativeEvent.isComposing||M.keyCode===229||(M.key==="Enter"?$():M.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"}}):c.jsxs("h3",{className:"bcard__name",title:w?m("localTeams.renameHint","点名字或 ✎ 改名"):et,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:w?nt:void 0,children:[c.jsx("span",{onClick:w?nt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:w?"text":"default"},children:et}),w&&c.jsx("button",{type:"button","data-id":"TeamCard-rename-btn",title:m("localTeams.rename","重命名"),onClick:nt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),At&&c.jsx("input",{"data-id":"TeamCard-url-input",autoFocus:!0,value:rt,placeholder:"https://你的私有云地址:端口",onChange:M=>xt(M.target.value),onFocus:M=>M.target.select(),onClick:M=>M.stopPropagation(),onBlur:I,onKeyDown:M=>{M.nativeEvent.isComposing||M.keyCode===229||(M.key==="Enter"?I():M.key==="Escape"&&dt(!1))},style:{width:"100%",font:"inherit",fontSize:12,padding:"3px 6px",margin:"2px 0 4px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}),c.jsxs("div",{className:"bcard__meta",children:[c.jsx("span",{className:"bcard__chip",children:R}),!j&&o.membership_status&&o.membership_status!=="active"&&c.jsx("span",{className:"bcard__chip",children:o.membership_status})]})]}),c.jsxs("button",{type:"button",className:"bcard__cta",onClick:S,disabled:!Lt,children:[c.jsx(wu,{}),c.jsx("span",{children:Lt?m("localTeams.open","打开"):j?m("teamCard.noHost","未填访问地址"):m("teamCard.noUrl","无 URL")})]})]})}function Zs(){return c.jsxs("div",{className:"brand",children:[c.jsx("div",{className:"brand-mark",children:c.jsx(wm,{})}),c.jsxs("div",{className:"brand-text",children:[c.jsx("div",{className:"brand-name",children:"CiCy Desktop"}),c.jsx("div",{className:"brand-sub",children:m("app.brandSub","团队 AI 协作工作台")})]})]})}function wm(){return c.jsx("svg",{width:"22",height:"22",viewBox:"0 0 96 96",fill:"none",children:c.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 wu(){return c.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),c.jsx("polyline",{points:"12 5 19 12 12 19"})]})}function je(){return c.jsx("svg",{className:"spin",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.4",strokeLinecap:"round",children:c.jsx("path",{d:"M21 12a9 9 0 1 1-6.2-8.55"})})}function dg(){return c.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),c.jsx("line",{x1:"2",y1:"20",x2:"22",y2:"20"})]})}function Is(){return c.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[c.jsx("circle",{cx:"12",cy:"5",r:"1.7"}),c.jsx("circle",{cx:"12",cy:"12",r:"1.7"}),c.jsx("circle",{cx:"12",cy:"19",r:"1.7"})]})}function mg(){return c.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("circle",{cx:"12",cy:"12",r:"10"}),c.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),c.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 li(o){try{return localStorage.getItem(o)||null}catch{return null}}function Vs(o){return o?/timeout/i.test(o)?"登录超时,请重新点击 Login。":/state/i.test(o)?"校验失败,请重新登录。":/no token/i.test(o)?"登录未完成,请重试。":/bridge missing/i.test(o)?"无法连接到登录服务(preload 未就绪)。":o:""}var vm;const hg=((vm=window.cicy)==null?void 0:vm.platform)||(()=>{const o=navigator.userAgent||"";return/Mac/i.test(o)?"darwin":/Windows/i.test(o)?"win32":"linux"})();document.documentElement.dataset.platform=hg;document.documentElement.dataset.fullscreen="0";var bm,Sm;(Sm=(bm=window.cicy)==null?void 0:bm.window)!=null&&Sm.onFullscreen&&window.cicy.window.onFullscreen(o=>{document.documentElement.dataset.fullscreen=o?"1":"0"});$y.createRoot(document.getElementById("root")).render(c.jsx(ag,{}));
|
|
377
|
+
`)}const m=(o,S)=>{var w,r;try{const j=(r=(w=window.cicyI18n)==null?void 0:w.t)==null?void 0:r.call(w,o);return j&&j!==o?j:S}catch{return S}},ln="cicy_token",_u="cicy_access_token",xu="cicy_user_id",cn="https://cicy-ai.com";async function ni(o){var S,w,r;try{(r=(w=(S=window.cicy)==null?void 0:S.shell)==null?void 0:w.openExternal)==null||r.call(w,`${cn}/dash${o}`)}catch{}}const Ks=new Set;let Py=0,Pa=[];const ai=new Map;function om(){Ks.forEach(o=>o(Pa))}const te={show(o={}){const S=o.id||`t${++Py}`,w=Pa.find(O=>O.id===S),r={id:S,status:"running",...w,...o};Pa=w?Pa.map(O=>O.id===S?r:O):[...Pa,r],om();const j=ai.get(S);return j&&(clearTimeout(j),ai.delete(S)),o.ttl&&ai.set(S,setTimeout(()=>te.dismiss(S),o.ttl)),S},dismiss(o){Pa=Pa.filter(w=>w.id!==o);const S=ai.get(o);S&&(clearTimeout(S),ai.delete(o)),om()}};function tg(){const[o,S]=C.useState(Pa);return C.useEffect(()=>(Ks.add(S),()=>{Ks.delete(S)}),[]),o.length?c.jsx("div",{className:"toast-host","data-id":"ToastHost",children:o.map(w=>c.jsxs("div",{className:"toast","data-id":`Toast-${w.id}`,"data-status":w.status||"running",children:[c.jsx("button",{type:"button",className:"toast__x","data-id":"Toast-dismiss",onClick:()=>te.dismiss(w.id),"aria-label":"dismiss",children:"×"}),c.jsxs("span",{className:"toast__msg",children:[w.message,Number.isFinite(w.progress)?` ${w.progress}%`:""]}),Number.isFinite(w.progress)&&c.jsx("span",{className:"toast__bar",children:c.jsx("span",{style:{width:`${Math.min(100,w.progress)}%`}})})]},w.id))}):null}const Js=new Set;let rm=0,re=null;function nn(){Js.forEach(o=>o(re))}function Tu(){return new Date().toTimeString().slice(0,8)}const Ee={open({teamId:o,fromVer:S,toVer:w,onRetry:r,title:j}={}){re={teamId:o,title:j||null,fromVer:S||null,toVer:w||null,status:"running",phase:"download",logs:[],onRetry:r||null,lastAt:Date.now()},nn()},push(o={}){if(!re)return;const S={id:++rm,t:Tu(),phase:o.phase||re.phase,status:o.status||"running",message:o.message||""};re={...re,phase:o.phase||re.phase,toVer:o.toVer||re.toVer,logs:[...re.logs,S],lastAt:Date.now()},nn()},minimize(){re&&(re={...re,minimized:!0},nn())},restore(){re&&(re={...re,minimized:!1},nn())},finish({ok:o,message:S}={}){if(!re)return;const w=o?"done":"error",r={id:++rm,t:Tu(),phase:"done",status:w,message:S||(o?m("updateDrawer.done","更新完成"):m("updateDrawer.failed","更新失败"))};re={...re,status:w,phase:"done",minimized:!1,logs:[...re.logs,r],lastAt:Date.now()},nn()},close(){re=null,nn()}},Qs=["download","swap","done"],fm=o=>({download:m("updateDrawer.phaseDownload","下载"),swap:m("updateDrawer.phaseSwap","切换"),done:m("updateDrawer.phaseDone","完成")})[o]||o;function eg(){var U;const[o,S]=C.useState(re);C.useEffect(()=>(Js.add(S),()=>{Js.delete(S)}),[]);const w=C.useRef(null);C.useEffect(()=>{const T=w.current;T&&(T.scrollTop=T.scrollHeight)},[(U=o==null?void 0:o.logs)==null?void 0:U.length]);const[r,j]=C.useState(!1);if(C.useEffect(()=>{if(!o||o.status!=="running"){j(!1);return}const T=setInterval(()=>j(Date.now()-(o.lastAt||0)>25e3),3e3);return()=>clearInterval(T)},[o==null?void 0:o.lastAt,o==null?void 0:o.status]),!o)return null;const O=o.status==="running",Z=Qs.findIndex(T=>T===o.phase);return o.minimized?c.jsxs("button",{type:"button",className:`drawer-min drawer-min--${o.status}`,"data-id":"UpdateDrawer-restore",onClick:()=>Ee.restore(),children:[c.jsx("span",{className:"drawer-min__spark",children:O?c.jsx(je,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("span",{className:"drawer-min__label",children:[o.title||m("updateDrawer.title","更新 cicy-code"),o.toVer?` · v${o.toVer}`:""]})]}):c.jsx("div",{className:"drawer-scrim","data-id":"UpdateDrawer-scrim",onClick:()=>O?Ee.minimize():Ee.close(),children:c.jsxs("div",{className:"drawer","data-id":"UpdateDrawer","data-status":o.status,onClick:T=>T.stopPropagation(),children:[c.jsxs("div",{className:"drawer__head",children:[c.jsxs("div",{className:"drawer__title",children:[c.jsx("span",{className:`drawer__spark drawer__spark--${o.status}`,children:O?c.jsx(je,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("div",{children:[c.jsx("div",{className:"drawer__h",children:o.title||m("updateDrawer.title","更新 cicy-code")}),c.jsxs("div",{className:"drawer__sub",children:[o.fromVer?`v${o.fromVer}`:m("updateDrawer.current","当前")," → ",o.toVer?`v${o.toVer}`:m("updateDrawer.latest","最新版")]})]})]}),c.jsx("div",{className:"drawer__headbtns",children:c.jsx("button",{type:"button",className:"drawer__x","data-id":"UpdateDrawer-min",title:m("updateDrawer.minimize","最小化"),onClick:()=>Ee.minimize(),"aria-label":"minimize",children:"‒"})})]}),c.jsx("div",{className:"drawer__steps","data-id":"UpdateDrawer-steps",children:Qs.map((T,v)=>{const Q=fm(T),H=o.status==="done"||v<Z,at=v===Z&&O,et=o.status==="error"&&v===Z;return c.jsxs("div",{className:`drawer__step${at?" is-active":""}${H?" is-done":""}${et?" is-error":""}`,children:[c.jsx("span",{className:"drawer__step-dot",children:H?"✓":et?"!":v+1}),c.jsx("span",{className:"drawer__step-label",children:Q}),v<Qs.length-1&&c.jsx("span",{className:"drawer__step-bar"})]},T)})}),c.jsx("div",{className:"drawer__log","data-id":"UpdateDrawer-log",ref:w,children:o.logs.length===0?c.jsx("div",{className:"drawer__log-empty",children:m("updateDrawer.preparing","准备中…")}):o.logs.map(T=>c.jsxs("div",{className:"drawer__line","data-status":T.status,children:[c.jsx("span",{className:"drawer__t",children:T.t}),c.jsx("span",{className:`drawer__badge drawer__badge--${T.phase}`,children:fm(T.phase)}),c.jsx("span",{className:"drawer__linemsg",children:T.message})]},T.id))}),r&&O&&c.jsx("div",{className:"drawer__hint","data-id":"UpdateDrawer-stuck",children:m("updateDrawer.stuckHint","正在等待新版本就绪,耗时比平常久。可以放到后台继续,完成或失败都会提示。")}),c.jsx("div",{className:"drawer__foot",children:O?c.jsx(c.Fragment,{children:c.jsx("span",{className:"drawer__foot-status",children:m("updateDrawer.inProgress","更新进行中…")})}):o.status==="error"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-error",children:m("updateDrawer.failed","更新失败")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-retry",onClick:()=>o.onRetry(),children:m("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-dismiss",onClick:()=>Ee.close(),children:m("common.close","关闭")})]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-done",children:m("updateDrawer.updatedLatest","已更新到最新")}),c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-finish",onClick:()=>Ee.close(),children:m("common.done","完成")})]})})]})})}function ag(){const[o,S]=C.useState(void 0);C.useEffect(()=>{var N,Y;if(!((Y=(N=window.cicy)==null?void 0:N.terms)!=null&&Y.status)){S(!0);return}window.cicy.terms.status(xm).then(L=>S(!!(L!=null&&L.accepted))).catch(()=>S(!0))},[]),C.useEffect(()=>{var L,X,P,Rt;const N=document.documentElement;try{N.setAttribute("data-platform",((L=window.cicy)==null?void 0:L.platform)||"linux")}catch{}N.setAttribute("data-fullscreen","0");let Y;try{Y=(Rt=(P=(X=window.cicy)==null?void 0:X.window)==null?void 0:P.onFullscreen)==null?void 0:Rt.call(P,gt=>N.setAttribute("data-fullscreen",gt?"1":"0"))}catch{}return()=>{try{Y&&Y()}catch{}}},[]);const[w,r]=C.useState(()=>li(ln)),[j,O]=C.useState(()=>li(_u)),[Z,U]=C.useState(()=>li(xu)),[T,v]=C.useState(()=>!li(ln)),[Q,H]=C.useState(!1),[at,et]=C.useState(""),[nt,$]=C.useState(""),[ot,At]=C.useState(!1),[dt,rt]=C.useState(""),[xt,zt]=C.useState(""),[pt,G]=C.useState(null),[Nt,R]=C.useState(null),[mt,Lt]=C.useState(!1),[Yt,Ft]=C.useState(""),ce=C.useRef(!1),[Gt,x]=C.useState(null),[q,lt]=C.useState(!1),[ft,wt]=C.useState(!1),[d,E]=C.useState("all"),B=C.useCallback(async(N,Y)=>{var X,P,Rt,gt;if(!N)return;if(!((P=(X=window.cicy)==null?void 0:X.cloud)!=null&&P.fetch)){Ft("cloud fetch bridge missing");return}Lt(!0),Ft("");const L={Authorization:`Bearer ${N}`};try{const[Ze,pe]=await Promise.all([window.cicy.cloud.fetch(`${cn}/api/user/self`,{headers:L}),window.cicy.cloud.fetch(`${cn}/api/teams`,{headers:L})]);if((pe==null?void 0:pe.status)===401){if(!ce.current&&((gt=(Rt=window.cicy)==null?void 0:Rt.auth)!=null&>.loginStart)){ce.current=!0,Ft(m("auth.sessionExpired","会话已过期,正在重新登录…"));try{await window.cicy.auth.loginStart()}catch{}}return}if(pe!=null&&pe.ok){const Vt=JSON.parse(pe.body||"{}");R(Array.isArray(Vt==null?void 0:Vt.teams)?Vt.teams:[])}if(Ze!=null&&Ze.ok)try{const Vt=JSON.parse(Ze.body||"{}");G((Vt==null?void 0:Vt.success)===!1?null:(Vt==null?void 0:Vt.data)||null)}catch{G(null)}else G(null)}catch{Ft("")}finally{Lt(!1)}},[]),V=C.useRef("");C.useEffect(()=>{V.current=w||j||""},[w,j]);const I=C.useCallback(async()=>{var Y,L;const N=V.current;if(!(!N||!((L=(Y=window.cicy)==null?void 0:Y.cloud)!=null&&L.fetch)))try{const X=await window.cicy.cloud.fetch(`${cn}/api/teams`,{headers:{Authorization:`Bearer ${N}`}});if(X!=null&&X.ok){const P=JSON.parse(X.body||"{}");Array.isArray(P==null?void 0:P.teams)&&R(P.teams)}}catch{}},[]),M=C.useCallback(async(N,Y)=>{var P,Rt;const L=V.current,X=String(Y||"").trim();if(!L||!((Rt=(P=window.cicy)==null?void 0:P.cloud)!=null&&Rt.fetch)||!X)return{ok:!1,error:"no session / empty"};try{const gt=await window.cicy.cloud.fetch(`${cn}/api/teams/${N}`,{method:"PATCH",headers:{Authorization:`Bearer ${L}`,"Content-Type":"application/json"},body:JSON.stringify({title:X})});return gt!=null&>.ok?(await I(),{ok:!0}):{ok:!1,error:`${(gt==null?void 0:gt.status)||"?"} ${(gt==null?void 0:gt.error)||""}`}}catch(gt){return{ok:!1,error:gt.message}}},[I]),it=C.useCallback(async(N,Y)=>{var P,Rt;const L=V.current,X=String(Y||"").trim();if(!L||!((Rt=(P=window.cicy)==null?void 0:P.cloud)!=null&&Rt.fetch)||!X)return{ok:!1,error:"no session / empty"};try{new URL(X)}catch{return{ok:!1,error:"地址格式不对(需 http(s)://…)"}}try{const gt=await window.cicy.cloud.fetch(`${cn}/api/teams/${N}`,{method:"PATCH",headers:{Authorization:`Bearer ${L}`,"Content-Type":"application/json"},body:JSON.stringify({hostUrl:X})});return gt!=null&>.ok?(await I(),{ok:!0}):{ok:!1,error:`${(gt==null?void 0:gt.status)||"?"} ${(gt==null?void 0:gt.error)||""}`}}catch(gt){return{ok:!1,error:gt.message}}},[I]);C.useEffect(()=>{const N=w||j;N&&B(N,Z)},[w,j,Z,B]);const Ct=C.useCallback(async()=>{var N,Y;if((Y=(N=window.cicy)==null?void 0:N.localTeams)!=null&&Y.list){lt(!0);try{const L=await window.cicy.localTeams.list({refresh:!0});x(Array.isArray(L)?L:[])}catch{x([])}finally{lt(!1),wt(!0)}}},[]),Tt=C.useCallback(async(N,Y)=>{var X,P;if(!((P=(X=window.cicy)==null?void 0:X.localTeams)!=null&&P.update))return{ok:!1,error:"no_bridge"};let L;try{L=await window.cicy.localTeams.update(N,{name:String(Y||"").trim()||m("localTeams.unnamed","未命名")})}catch(Rt){L={ok:!1,error:(Rt==null?void 0:Rt.message)||String(Rt)}}return await Ct(),L||{ok:!1,error:"no_result"}},[Ct]);C.useEffect(()=>{let N,Y=!1;const L=3e3,X=3e4,P=async()=>{var Ze,pe,Vt;try{await((Vt=(pe=(Ze=window.cicy)==null?void 0:Ze.localTeams)==null?void 0:pe.syncCloud)==null?void 0:Vt.call(pe))}catch{}await Promise.all([Ct(),I()])},Rt=()=>{if(Y)return;const Ze=document.visibilityState==="visible";N=setTimeout(async()=>{document.visibilityState==="visible"?await P():await Ct(),Rt()},Ze?L:X)};P(),Rt();const gt=()=>{document.visibilityState==="visible"&&P()};return document.addEventListener("visibilitychange",gt),window.addEventListener("focus",gt),()=>{Y=!0,clearTimeout(N),document.removeEventListener("visibilitychange",gt),window.removeEventListener("focus",gt)}},[Ct,I]),C.useEffect(()=>{var Y,L;if(!((L=(Y=window.cicy)==null?void 0:Y.localTeams)!=null&&L.onWebviewRelay))return;const N=window.cicy.localTeams.onWebviewRelay(async({reqId:X,msg:P})=>{let Rt={ok:!1,error:"unknown relay type"};try{(P==null?void 0:P.type)==="localTeams:add"?Rt=await window.cicy.localTeams.add(P.spec||{}):(P==null?void 0:P.type)==="localTeams:remove"?Rt=await window.cicy.localTeams.remove(P.id):(P==null?void 0:P.type)==="localTeams:update"?Rt=await window.cicy.localTeams.update(P.id,P.patch||{}):(P==null?void 0:P.type)==="localTeams:upgrade"?Rt=await window.cicy.localTeams.upgrade(P.id):(P==null?void 0:P.type)==="localTeams:list"&&(Rt={ok:!0,teams:await window.cicy.localTeams.list({refresh:!0})}),Ct()}catch(gt){Rt={ok:!1,error:(gt==null?void 0:gt.message)||String(gt)}}try{window.cicy.localTeams.replyWebviewRelay(X,Rt)}catch{}});return()=>{try{N==null||N()}catch{}}},[Ct]);const k=C.useCallback(async N=>{var Y,L;if((L=(Y=window.cicy)==null?void 0:Y.localTeams)!=null&&L.open)try{await window.cicy.localTeams.open(N)}catch{}},[]);C.useEffect(()=>{var Y,L;if(li(ln)){v(!1);return}if(!((L=(Y=window.cicy)==null?void 0:Y.auth)!=null&&L.getSaved)){v(!1);return}let N=!1;return(async()=>{try{const X=await window.cicy.auth.getSaved();if(N)return;if(X!=null&&X.token){try{localStorage.setItem(ln,X.token)}catch{}if(r(X.token),X.accessToken){try{localStorage.setItem(_u,X.accessToken)}catch{}O(X.accessToken)}if(X.userId){try{localStorage.setItem(xu,String(X.userId))}catch{}U(String(X.userId))}}}catch{}finally{N||v(!1)}})(),()=>{N=!0}},[]),C.useEffect(()=>{var N,Y;if((Y=(N=window.cicy)==null?void 0:N.auth)!=null&&Y.onComplete)return window.cicy.auth.onComplete(L=>{if(H(!1),At(!1),L!=null&&L.error){rt(Vs(L.error));return}if(L!=null&&L.token){ce.current=!1,Ft("");try{localStorage.setItem(ln,L.token)}catch{}if(r(L.token),L.accessToken){try{localStorage.setItem(_u,L.accessToken)}catch{}O(L.accessToken)}if(L.userId){try{localStorage.setItem(xu,String(L.userId))}catch{}U(String(L.userId))}rt(""),zt(L.reused?m("auth.welcomeBack","已恢复你之前的登录"):m("auth.loginSuccess","登录成功")),setTimeout(()=>zt(""),3e3)}})},[]);async function st(){var Y,L;if(!((L=(Y=window.cicy)==null?void 0:Y.auth)!=null&&L.loginStart)){rt("auth bridge missing");return}rt(""),H(!0);const N=await window.cicy.auth.loginStart();if(!(N!=null&&N.ok)){H(!1),rt(Vs((N==null?void 0:N.error)||"login start failed"));return}et(N.url||"")}async function bt(){var L,X;if(!((X=(L=window.cicy)==null?void 0:L.auth)!=null&&X.emailLoginStart)){rt("auth bridge missing");return}const N=nt.trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(N)){rt(m("auth.badEmail","请输入有效的邮箱地址"));return}rt("");const Y=await window.cicy.auth.emailLoginStart(N);if(!(Y!=null&&Y.ok)){rt(Vs((Y==null?void 0:Y.error)||"email login failed"));return}At(!0)}function St(){var N,Y,L;try{localStorage.removeItem(ln),localStorage.removeItem(_u),localStorage.removeItem(xu)}catch{}try{(L=(Y=(N=window.cicy)==null?void 0:N.auth)==null?void 0:Y.logout)==null||L.call(Y)}catch{}r(null),O(null),U(null),G(null),R(null),rt(""),Ft("")}if(o===void 0)return c.jsxs("div",{className:"shell","data-id":"TermsCheckingSplash",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Zs,{}),c.jsx("div",{className:"spinner-row",children:c.jsx(je,{})})]})]});if(!o)return c.jsx(Tm,{onAgree:()=>S(!0)});if(!w&&T)return c.jsxs("div",{className:"shell","data-id":"AuthRestoringSplash",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Zs,{}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(je,{}),c.jsx("span",{children:m("auth.restoring","正在恢复登录…")})]})]})]});if(!w)return c.jsxs("div",{className:"shell",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Zs,{}),!Q&&!ot&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline",children:m("auth.tagline","登录以同步你的团队、配置与 AI 助手")}),c.jsx("label",{className:"login-label","data-id":"EmailLoginLabel",htmlFor:"cicy-email-login",children:m("auth.emailLabel","输入邮箱,用邮件链接登录")}),c.jsx("input",{id:"cicy-email-login",type:"email",className:"login-email-input","data-id":"EmailLoginInput",value:nt,onChange:N=>$(N.target.value),onKeyDown:N=>{N.key==="Enter"&&bt()},placeholder:m("auth.emailPlaceholder","you@example.com"),autoComplete:"email",spellCheck:!1,autoFocus:!0}),c.jsxs("button",{className:"btn-primary","data-id":"EmailLoginSubmit",onClick:bt,children:[c.jsx("span",{children:m("auth.emailLogin","发送登录链接")}),c.jsx(wu,{})]}),c.jsx("p",{className:"hint",children:m("auth.emailHint","手机上点邮件里的链接,也能登录这台电脑")}),c.jsx("div",{className:"login-divider","data-id":"LoginDivider",children:c.jsx("span",{children:m("auth.or","或")})}),c.jsx("button",{className:"btn-ghost","data-id":"BrowserLoginBtn",onClick:st,children:m("auth.browserLogin","用浏览器登录(Google / SSO,仅同一台电脑)")})]}),ot&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline","data-id":"EmailSentTagline",children:m("auth.emailSentTagline","登录邮件已发送")}),c.jsxs("p",{className:"hint","data-id":"EmailSentHint",style:{textAlign:"center"},children:[m("auth.emailSentHint","到邮箱打开链接即可(手机、电脑都行),这里会自动登录。"),c.jsx("br",{}),nt]}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(je,{}),c.jsx("span",{children:m("auth.emailWaiting","等待确认…")})]}),c.jsx("button",{className:"btn-ghost","data-id":"EmailSentCancel",onClick:()=>{var N,Y,L;(L=(Y=(N=window.cicy)==null?void 0:N.auth)==null?void 0:Y.emailLoginCancel)==null||L.call(Y),At(!1)},children:m("auth.cancel","取消")})]}),Q&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline",children:m("auth.waitingTagline","已在浏览器打开登录页,等待你完成…")}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(je,{}),c.jsx("span",{children:m("auth.waitingCallback","等待回调")})]}),at&&c.jsxs("div",{className:"login-fallback","data-id":"LoginUrlFallback",style:{marginTop:10,textAlign:"center"},children:[c.jsx("p",{className:"hint",style:{marginBottom:6},children:m("auth.browserNotOpened","浏览器没自动打开?")}),c.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-open",onClick:()=>{var N,Y,L;try{(L=(Y=(N=window.cicy)==null?void 0:N.shell)==null?void 0:Y.openExternal)==null||L.call(Y,at)}catch{}},children:m("auth.openManually","手动打开登录页")}),c.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-copy",onClick:()=>{var N;try{(N=navigator.clipboard)==null||N.writeText(at),zt(m("auth.linkCopied","链接已复制,粘到浏览器打开")),setTimeout(()=>zt(""),2500)}catch{}},children:m("auth.copyLink","复制链接")}),c.jsx("p",{className:"hint","data-id":"LoginUrlFallback-url",style:{wordBreak:"break-all",marginTop:6,fontSize:11,opacity:.7,userSelect:"text"},children:at})]}),c.jsx("button",{className:"btn-ghost",onClick:()=>{var N,Y,L;(L=(Y=(N=window.cicy)==null?void 0:N.auth)==null?void 0:Y.loginCancel)==null||L.call(Y),H(!1),et("")},children:m("auth.cancel","取消")})]}),dt&&c.jsx("div",{className:"error",children:dt})]})]});const Dt=(Gt||[]).find(N=>ym(N.base_url))||null,Zt=Dt&&Dt.cloud_team_id?(Nt||[]).find(N=>String(N.teamId||N.id)===String(Dt.cloud_team_id)):null,le=(Gt||[]).filter(N=>Ws(N.base_url)),J=(Gt||[]).filter(N=>!Ws(N.base_url)&&!ym(N.base_url)),K=le.length,F=J.length,Ut=(Nt||[]).filter(N=>!N.is_local&&N.kind!=="local"&&(N.kind==="private"||N.team_kind==="personal")),ht=Ut.length,aa=d==="all"||d==="local",Re=d==="all"||d==="custom",ge=d==="all"||d==="cloud";return c.jsxs("div",{className:"shell shell--app",children:[c.jsx("div",{className:"glow glow--app","aria-hidden":!0}),c.jsxs("div",{className:"shell__left",children:[c.jsx(ig,{me:pt,welcome:xt,onLogout:St,mitmTeam:le.length>0?le[0]:null}),c.jsxs("main",{className:"main",children:[c.jsxs("div",{className:"app__tabsrow",children:[c.jsx("div",{className:"app__tabs",children:[{k:"all",label:m("teamFilter.all","全部"),n:K+F+ht},{k:"local",label:m("teamFilter.local","本地"),n:K},{k:"cloud",label:m("teamFilter.cloud","私有云"),n:ht},{k:"custom",label:m("teamFilter.custom","自定义"),n:F}].map(({k:N,label:Y,n:L})=>c.jsxs("button",{type:"button",className:`app__tab ${d===N?"is-active":""}`,onClick:()=>E(N),children:[Y,c.jsx("span",{className:"app__tab-count",children:L})]},N))}),c.jsxs("button",{type:"button","data-id":"AddTeamButton",className:"app__add-team",title:m("teams.addHint","在云端新建私有云团队"),onClick:()=>ni("?tab=private"),children:["+ ",m("teams.add","新加团队")]})]}),Yt&&c.jsxs("div",{className:"error",style:{marginBottom:12},children:[m("common.cloud","云端"),": ",Yt,c.jsx("button",{className:"btn-ghost",style:{marginLeft:8},onClick:()=>B(w||j,Z),children:m("common.retry","重试")})]}),c.jsxs("div",{className:"app__grid",children:[aa&&le.map(N=>c.jsx(hm,{team:N,onOpen:()=>k(N.id),onRename:Tt,onRefresh:Ct},"local:"+N.id)),aa&&c.jsx(rg,{dockerTeam:Dt,onOpen:async()=>{var N,Y,L;try{const X=await((L=(Y=(N=window.cicy)==null?void 0:N.docker)==null?void 0:Y.appOpen)==null?void 0:L.call(Y));X!=null&&X.ok||te.show({id:"docker-open",status:"error",ttl:6e3,message:m("docker.openNoToken","服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。")})}catch(X){console.warn("[DockerCard] open",X)}},cloudTitle:Zt==null?void 0:Zt.title,onRename:Dt!=null&&Dt.cloud_team_id?(N=>M(Dt.cloud_team_id,N)):void 0,onRefresh:Ct}),Re&&J.map(N=>c.jsx(hm,{team:N,onOpen:()=>k(N.id),onRename:Tt,onRefresh:Ct},"custom:"+N.id)),ge&&Ut.map(N=>c.jsx(fg,{team:N,onOpen:()=>{var L,X,P;const Y=N.kind==="private"?N.host_url:N.workspace_url||N.workspace_direct_url;Y&&((P=(X=(L=window.cicy)==null?void 0:L.tabs)==null?void 0:X.open)==null||P.call(X,Y,N.name||N.title||""))},onRename:M,onEditUrl:it},"cloud:"+N.id))]}),!mt&&!Yt&&Nt&&Nt.length===0&&!(Gt!=null&&Gt.length)&&c.jsx("div",{className:"empty",style:{marginTop:14},children:m("teams.emptyHint","还没有团队 — 安装本地 cicy-code 起一个本地 team,或在云端创建。")})]})]}),c.jsx(tg,{}),c.jsx(eg,{}),c.jsx(og,{})]})}function lg({onClose:o}){const[S,w]=C.useState(null),[r,j]=C.useState(""),[O,Z]=C.useState(!1),[U,T]=C.useState(""),v=typeof window<"u"&&window.cicy&&window.cicy.trustedOrigins||null,Q=C.useCallback(async()=>{try{w(v&&await v.list()||[])}catch{w([])}},[v]);C.useEffect(()=>{Q()},[Q]);const H=async()=>{const nt=r.trim();if(!(!nt||O||!v)){Z(!0),T("");try{const $=await v.add(nt);$&&$.ok===!1?T($.error||m("trustedSites.addFailed","添加失败")):(j(""),w($&&$.origins||await v.list()))}catch($){T(String($&&$.message||$))}finally{Z(!1)}}},at=async nt=>{if(!(O||!v)){Z(!0),T("");try{const $=await v.remove(nt);$&&$.ok===!1?T($.error||m("trustedSites.removeFailed","删除失败")):w($&&$.origins||await v.list())}catch($){T(String($&&$.message||$))}finally{Z(!1)}}},et={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:nt=>({flex:1,fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:13,color:nt?"#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 sn.createPortal(c.jsx("div",{style:et.overlay,onClick:o,"data-id":"TrustedSitesModal",children:c.jsxs("div",{style:et.card,onClick:nt=>nt.stopPropagation(),children:[c.jsxs("div",{style:et.head,children:[c.jsx("h2",{style:et.title,children:m("trustedSites.title","受信任站点")}),c.jsx("button",{type:"button",style:et.x,onClick:o,"aria-label":"close",children:"✕"})]}),c.jsx("div",{style:et.warn,children:m("trustedSites.warn","⚠ 列表中的站点可以在你的电脑上执行命令(exec)。只添加你完全信任的地址。")}),c.jsxs("div",{style:et.addRow,children:[c.jsx("input",{"data-id":"trusted-sites-input",style:et.input,value:r,onChange:nt=>j(nt.target.value),onKeyDown:nt=>{nt.key==="Enter"&&H()},placeholder:m("trustedSites.placeholder","添加站点,如 app.cicy-ai.com 或 my-cloud.example.org")}),c.jsx("button",{type:"button","data-id":"trusted-sites-add",style:{...et.addBtn,opacity:O||!r.trim()?.5:1},onClick:H,disabled:O||!r.trim(),children:m("trustedSites.add","添加")})]}),U&&c.jsx("div",{style:et.err,children:U}),c.jsx("div",{style:et.listWrap,children:S===null?c.jsx("div",{style:et.muted,children:m("trustedSites.loading","加载中…")}):S.length===0?c.jsx("div",{style:et.muted,children:m("trustedSites.empty","暂无")}):S.map(nt=>c.jsxs("div",{style:et.row,"data-id":"trusted-sites-row",children:[c.jsx("span",{style:et.host(nt.builtin),children:nt.host}),nt.builtin?c.jsx("span",{style:et.tag,children:m("trustedSites.builtin","系统")}):c.jsx("button",{type:"button",style:et.rm,onClick:()=>at(nt.host),disabled:O,children:m("trustedSites.remove","删除")})]},nt.host))})]})}),document.body)}function ng({onClose:o}){const[S,w]=C.useState(null),[r,j]=C.useState(""),[O,Z]=C.useState(""),[U,T]=C.useState(!1),v=typeof window<"u"&&window.cicy&&window.cicy.rpcAudit||null,Q=C.useCallback(async()=>{T(!0),j("");try{const R=v&&await v.tail(400);!R||R.ok===!1?(j(R&&R.error||m("audit.loadFailed","读取失败")),w([])):(w(R.entries||[]),Z(R.path||""))}catch(R){j(String(R&&R.message||R)),w([])}finally{T(!1)}},[v]);C.useEffect(()=>{Q()},[Q]);const[H,at]=C.useState("all"),[et,nt]=C.useState(""),$=R=>{try{return new Date(R).toLocaleString()}catch{return R||""}},ot=R=>{if(R.kind==="auth"){const mt=/deny/.test(R.decision||"");return{text:R.decision||"auth",color:mt?"#fca5a5":"#86efac",bg:mt?"rgba(239,68,68,.14)":"rgba(34,197,94,.14)"}}if(R.kind==="rpc"){const mt=R.ok!==!1&&!R.error;return{text:mt?"ok":"err",color:mt?"#86efac":"#fca5a5",bg:mt?"rgba(34,197,94,.14)":"rgba(239,68,68,.14)"}}return{text:R.kind||"log",color:"#a1a1aa",bg:"rgba(255,255,255,.06)"}},At=R=>R.kind==="auth"?`${R.gate||""}${R.decision?" · "+R.decision:""}`:R.kind==="rpc"?`${R.tool||""}${R.dangerous?" ⚠":""}`:R.kind||"",dt=R=>R.error||R.args||(R.kind==="rpc"?R.channel:"")||"",rt=S||[],xt=et.trim().toLowerCase(),zt=rt.filter(R=>H!=="all"&&R.kind!==H?!1:xt?[R.origin,R.host,R.tool,R.gate,R.decision,R.channel,R.args,R.error,R.kind].filter(Boolean).join(" ").toLowerCase().includes(xt):!0),pt="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:R=>({background:R?"rgba(255,255,255,.14)":"transparent",border:"1px solid rgba(255,255,255,.12)",borderRadius:999,padding:"6px 16px",color:R?"#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:pt,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:pt,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:R=>({justifySelf:"start",fontSize:11.5,color:R.color,background:R.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}},Nt=R=>c.jsx("div",{children:R});return sn.createPortal(c.jsx("div",{style:G.overlay,onClick:o,"data-id":"AuditLogModal",children:c.jsxs("div",{style:G.card,onClick:R=>R.stopPropagation(),children:[c.jsxs("div",{style:G.head,children:[c.jsxs("div",{style:G.titleWrap,children:[c.jsx("h2",{style:G.title,children:m("audit.title","审计日志")}),O&&c.jsx("p",{style:G.subtitle,children:O})]}),c.jsxs("span",{style:G.count,children:[m("audit.count","共")," ",zt.length,H!=="all"||xt?` / ${rt.length}`:""]}),c.jsx("button",{type:"button","data-id":"audit-refresh",style:{...G.refresh,opacity:U?.5:1},onClick:Q,disabled:U,children:m("audit.refresh","刷新")}),c.jsx("button",{type:"button",style:G.x,onClick:o,"aria-label":"close",children:"✕"})]}),c.jsxs("div",{style:G.toolbar,children:[c.jsxs("div",{style:G.chips,children:[c.jsx("button",{type:"button",style:G.chip(H==="all"),onClick:()=>at("all"),children:m("audit.all","全部")}),c.jsx("button",{type:"button",style:G.chip(H==="rpc"),onClick:()=>at("rpc"),children:m("audit.rpc","RPC 调用")}),c.jsx("button",{type:"button",style:G.chip(H==="auth"),onClick:()=>at("auth"),children:m("audit.auth","授权决定")})]}),c.jsx("input",{"data-id":"audit-search",style:G.search,value:et,onChange:R=>nt(R.target.value),placeholder:m("audit.search","搜索来源 / 工具 / 命令…")})]}),r&&c.jsx("div",{style:G.err,children:r}),c.jsxs("div",{style:G.tableWrap,children:[c.jsxs("div",{style:G.theadRow,children:[Nt(m("audit.colTime","时间")),Nt(m("audit.colType","类型")),Nt(m("audit.colSource","来源")),Nt(m("audit.colOp","操作")),Nt(m("audit.colDetail","详情"))]}),S===null?c.jsx("div",{style:G.muted,children:m("audit.loading","加载中…")}):zt.length===0?c.jsx("div",{style:G.muted,children:rt.length===0?m("audit.empty","暂无审计记录"):m("audit.noMatch","无匹配记录")}):zt.map((R,mt)=>{const Lt=ot(R);return c.jsxs("div",{style:G.row,"data-id":"audit-row",children:[c.jsx("span",{style:G.time,children:$(R.ts)}),c.jsx("span",{style:G.badge(Lt),children:Lt.text}),c.jsx("span",{style:G.cell,children:R.origin||R.host||"—"}),c.jsx("span",{style:G.cell,children:At(R)||"—"}),c.jsx("span",{style:G.detail,children:dt(R)||"—"})]},mt)})]})]})}),document.body)}function ig({me:o,welcome:S,onLogout:w,mitmTeam:r}){const j=(o==null?void 0:o.display_name)||(o==null?void 0:o.username)||"…",O=j.slice(0,1).toUpperCase(),[Z,U]=C.useState(!1),[T,v]=C.useState(!1),[Q,H]=C.useState(!1),[at,et]=C.useState(!1),[nt,$]=C.useState(""),ot=C.useRef(null);C.useEffect(()=>{var rt,xt,zt;let dt=!0;return(zt=(xt=(rt=window.cicy)==null?void 0:rt.app)==null?void 0:xt.getVersion)==null||zt.call(xt).then(pt=>{dt&&$(typeof pt=="string"?pt:String((pt==null?void 0:pt.desktop)||""))}).catch(()=>{}),()=>{dt=!1}},[]),C.useEffect(()=>{if(!Z)return;const dt=rt=>{ot.current&&!ot.current.contains(rt.target)&&U(!1)};return document.addEventListener("mousedown",dt),()=>document.removeEventListener("mousedown",dt)},[Z]);const At=dt=>{ni(dt),U(!1)};return c.jsxs(c.Fragment,{children:[c.jsxs("header",{className:"topbar",children:[c.jsxs("div",{className:"brand-mini",children:[c.jsx("div",{className:"brand-mark sm",children:c.jsx(wm,{})}),c.jsx("span",{className:"brand-name",children:"CiCy Desktop"})]}),c.jsxs("div",{className:"user-chip","data-id":"UserChip",ref:ot,children:[S&&c.jsx("span",{className:"welcome",children:S}),c.jsxs("button",{type:"button","data-id":"UserChip-trigger",className:`user-chip__trigger${Z?" is-open":""}`,onClick:()=>U(dt=>!dt),children:[c.jsx("div",{className:"avatar",children:O}),c.jsx("span",{className:"user-name",children:j}),c.jsx("span",{className:"user-chip__caret","aria-hidden":!0,children:"▾"})]}),Z&&c.jsxs("div",{className:"user-chip__menu","data-id":"UserChip-menu",role:"menu",children:[c.jsx("button",{type:"button","data-id":"UserChip-wallet",className:"user-chip__menu-item",onClick:()=>At("?view=wallet"),children:m("userMenu.wallet","我的钱包")}),c.jsx("button",{type:"button","data-id":"UserChip-billing",className:"user-chip__menu-item",onClick:()=>At("?view=usage"),children:m("userMenu.billing","我的账单")}),c.jsx("button",{type:"button","data-id":"UserChip-trusted-sites",className:"user-chip__menu-item",onClick:()=>{U(!1),v(!0)},children:m("trustedSites.menu","受信任站点")}),c.jsx("button",{type:"button","data-id":"UserChip-audit-log",className:"user-chip__menu-item",onClick:()=>{U(!1),H(!0)},children:m("audit.menu","审计日志")}),c.jsx("button",{type:"button","data-id":"UserChip-terms",className:"user-chip__menu-item",onClick:()=>{U(!1),et(!0)},children:m("firstRunTerms.menu","用户协议")}),!1,c.jsx("div",{className:"user-chip__menu-sep","aria-hidden":!0}),c.jsx("button",{type:"button","data-id":"UserChip-logout",className:"user-chip__menu-item is-danger",onClick:()=>{U(!1),w()},children:m("userMenu.logout","退出")}),c.jsxs("div",{className:"user-chip__menu-version","data-id":"UserChip-version",children:["CiCy Desktop ",nt?`v${nt}`:"…"]})]})]})]}),T&&c.jsx(lg,{onClose:()=>v(!1)}),Q&&c.jsx(ng,{onClose:()=>H(!1)}),at&&c.jsx(Tm,{onClose:()=>et(!1)})]})}function Tm({onAgree:o,onClose:S}){var nt;const[w,r]=C.useState(!1),[j,O]=C.useState(!1),Z=(((nt=window.cicyI18n)==null?void 0:nt.locale)||"en").startsWith("zh")?"zh-CN":"en",U=($,ot)=>m(`firstRunTerms.${$}`,ot),T=!!S,v=C.useMemo(()=>Iy(Wy(Z)),[Z]),Q=$=>{const ot=$.currentTarget;ot.scrollHeight-ot.scrollTop-ot.clientHeight<24&&r(!0)},H=C.useRef(null);C.useEffect(()=>{const $=H.current;$&&$.scrollHeight<=$.clientHeight+24&&r(!0)},[]);const at=async()=>{var $,ot,At;if(!(j||!w)){O(!0);try{await((At=(ot=($=window.cicy)==null?void 0:$.terms)==null?void 0:ot.agree)==null?void 0:At.call(ot,xm)),o==null||o()}catch{o==null||o()}}},et=()=>{var $,ot,At;try{(At=(ot=($=window.cicy)==null?void 0:$.terms)==null?void 0:ot.decline)==null||At.call(ot)}catch{}};return c.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?$=>{$.target===$.currentTarget&&S()}:void 0,children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"terms-gate__panel",children:[c.jsx("h1",{className:"terms-gate__title","data-id":"FirstRunTermsGate-title",children:U("title","用户协议与授权说明")}),c.jsx("p",{className:"terms-gate__subtitle",children:U("subtitle","使用 CiCy Desktop 前,请阅读并同意以下条款")}),c.jsx("div",{className:"terms-gate__body",ref:H,onScroll:Q,"data-id":"FirstRunTermsGate-body",children:c.jsx("div",{className:"terms-md","data-id":"FirstRunTermsGate-md",dangerouslySetInnerHTML:{__html:v}})}),T?c.jsx("div",{className:"terms-gate__actions",children:c.jsx("button",{"data-id":"FirstRunTermsGate-close",className:"terms-gate__btn",onClick:S,children:U("close","关闭")})}):c.jsxs(c.Fragment,{children:[!w&&c.jsx("div",{className:"terms-gate__scrollhint","data-id":"FirstRunTermsGate-scrollhint",children:U("scrollHint","请阅读至底部以继续")}),c.jsxs("div",{className:"terms-gate__actions",children:[c.jsx("button",{"data-id":"FirstRunTermsGate-decline",className:"terms-gate__btn terms-gate__btn--ghost",onClick:et,children:U("decline","不同意并退出")}),c.jsx("button",{"data-id":"FirstRunTermsGate-agree",className:"terms-gate__btn",disabled:!w||j,title:w?"":U("mustAgree","未同意则无法使用本软件。"),onClick:at,children:U("agree","同意并继续")})]})]})]})]})}const $s=new Set;let dm=0,ae=null;function un(){$s.forEach(o=>o(ae))}const ne={open({onRetry:o}={}){ae={status:"running",phase:"install-docker",logs:[],bars:{},minimized:!1,onRetry:o||null,lastAt:Date.now()},un()},minimize(){ae&&(ae={...ae,minimized:!0},un())},restore(){ae&&(ae={...ae,minimized:!1},un())},push(o={}){var Z;if(!ae)return;const S=o.phase==="health"?"container":o.phase||ae.phase,w={...ae,phase:S,lastAt:Date.now()},r=Number.isFinite(o.progress),j=S==="install-docker"||S==="image";if(j&&(r||o.dest||o.url)){const U=((Z=ae.bars)==null?void 0:Z[S])||{},T=r?o.progress:o.status==="skip"||o.status==="done"?100:U.progress;w.bars={...ae.bars,[S]:{progress:T,received:o.received??U.received,total:o.total??U.total,url:o.url||U.url,dest:o.dest||U.dest}}}if(!(o.status==="running"&&r&&j)){const U={id:++dm,t:Tu(),phase:S,status:o.status||"running",message:o.message||""};w.logs=[...ae.logs,U]}ae=w,un()},finish({ok:o,message:S,status:w}={}){if(!ae)return;const r=w||(o?"done":"error"),j=r==="error"?ae.phase:"done",O={id:++dm,t:Tu(),phase:j,status:r,message:S||(o?"完成":"失败")};ae={...ae,status:r,phase:j,minimized:!1,logs:[...ae.logs,O],lastAt:Date.now()},un()},close(){ae=null,un()}},Xs=[["install-docker","准备环境"],["image","下载运行环境"],["container","启动服务"],["done","完成"]],ug={"install-docker":"准备",image:"下载",container:"启动",health:"启动",done:"完成"},cg={"install-docker":"Docker Desktop",image:"基础镜像"};function mm(o){return Number.isFinite(o)?o<1024?o+" B":o<1048576?(o/1024).toFixed(0)+" KB":o<1073741824?(o/1048576).toFixed(1)+" MB":(o/1073741824).toFixed(2)+" GB":"?"}function sg({phaseKey:o,bar:S}){const w=Number.isFinite(S==null?void 0:S.progress)?Math.max(0,Math.min(100,S.progress)):0,r=w>=100;return c.jsxs("div",{className:"dlbar","data-id":`DockerDrawer-dlbar-${o}`,children:[c.jsxs("div",{className:"dlbar__head",children:[c.jsx("span",{className:"dlbar__name",children:cg[o]||o}),c.jsxs("span",{className:"dlbar__pct",children:[w,"%",S!=null&&S.total?` · ${mm(S.received)} / ${mm(S.total)}`:""]})]}),c.jsx("div",{className:"dlbar__track",children:c.jsx("div",{className:`dlbar__fill${r?" is-done":""}`,style:{width:`${w}%`}})}),(S==null?void 0:S.url)&&c.jsxs("div",{className:"dlbar__url",title:S.url,children:[c.jsx("span",{className:"dlbar__urlk",children:"源"})," ",S.url]}),(S==null?void 0:S.dest)&&c.jsxs("div",{className:"dlbar__url",title:S.dest,children:[c.jsx("span",{className:"dlbar__urlk",children:"存"})," ",S.dest]})]})}function og(){var Z;const[o,S]=C.useState(ae);C.useEffect(()=>($s.add(S),()=>{$s.delete(S)}),[]);const w=C.useRef(null);if(C.useEffect(()=>{const U=w.current;U&&(U.scrollTop=U.scrollHeight)},[(Z=o==null?void 0:o.logs)==null?void 0:Z.length]),!o)return null;const r=o.status==="running",j=Xs.findIndex(([U])=>U===o.phase),O=["install-docker","image"].filter(U=>{var T;return(T=o.bars)==null?void 0:T[U]});if(o.minimized){const U=O.map(v=>{var Q;return(Q=o.bars[v])==null?void 0:Q.progress}).filter(Number.isFinite),T=U.length?Math.round(U.reduce((v,Q)=>v+Q,0)/U.length):null;return c.jsxs("button",{type:"button",className:`drawer-min drawer-min--${o.status}`,"data-id":"DockerDrawer-restore",onClick:()=>ne.restore(),children:[c.jsx("span",{className:"drawer-min__spark",children:r?c.jsx(je,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("span",{className:"drawer-min__label",children:[m("docker.setupTitle","安装 Docker cicy-code"),T!=null?` · ${T}%`:""]})]})}return c.jsx("div",{className:"drawer-scrim","data-id":"DockerDrawer-scrim",onClick:()=>r?ne.minimize():ne.close(),children:c.jsxs("div",{className:"drawer","data-id":"DockerDrawer","data-status":o.status,onClick:U=>U.stopPropagation(),children:[c.jsxs("div",{className:"drawer__head",children:[c.jsxs("div",{className:"drawer__title",children:[c.jsx("span",{className:`drawer__spark drawer__spark--${o.status}`,children:r?c.jsx(je,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("div",{children:[c.jsx("div",{className:"drawer__h",children:m("docker.setupTitle","安装 Docker cicy-code")}),c.jsx("div",{className:"drawer__sub",children:"127.0.0.1:8009"})]})]}),c.jsx("div",{className:"drawer__headbtns",children:c.jsx("button",{type:"button",className:"drawer__x","data-id":"DockerDrawer-min",title:m("common.minimize","最小化"),onClick:()=>ne.minimize(),"aria-label":"minimize",children:"‒"})})]}),c.jsx("div",{className:"drawer__steps","data-id":"DockerDrawer-steps",children:Xs.map(([U,T],v)=>{const Q=o.status==="done"||j>=0&&v<j,H=v===j&&r,at=o.status==="error"&&v===j;return c.jsxs("div",{className:`drawer__step${H?" is-active":""}${Q?" is-done":""}${at?" is-error":""}`,children:[c.jsx("span",{className:"drawer__step-dot",children:Q?"✓":at?"!":v+1}),c.jsx("span",{className:"drawer__step-label",children:T}),v<Xs.length-1&&c.jsx("span",{className:"drawer__step-bar"})]},U)})}),O.length>0&&c.jsx("div",{className:"drawer__dlbars","data-id":"DockerDrawer-dlbars",children:O.map(U=>c.jsx(sg,{phaseKey:U,bar:o.bars[U]},U))}),r&&o.logs.length>0&&c.jsxs("div",{className:"drawer__now","data-id":"DockerDrawer-now",children:[c.jsx(je,{}),c.jsx("span",{children:o.logs[o.logs.length-1].message})]}),c.jsx("div",{className:"drawer__log drawer__log--scroll","data-id":"DockerDrawer-log",ref:w,children:o.logs.length===0?c.jsx("div",{className:"drawer__log-empty",children:m("docker.preparing","准备中…")}):o.logs.map(U=>c.jsxs("div",{className:"drawer__line","data-status":U.status,children:[c.jsx("span",{className:"drawer__t",children:U.t}),c.jsx("span",{className:`drawer__badge drawer__badge--${U.phase}`,children:ug[U.phase]||U.phase}),c.jsx("span",{className:"drawer__linemsg",children:U.message})]},U.id))}),c.jsx("div",{className:"drawer__foot",children:r?c.jsx(c.Fragment,{children:c.jsx("span",{className:"drawer__foot-status",children:m("docker.installing2","安装进行中…")})}):o.status==="reboot"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-reboot",children:m("docker.rebootShort","需重启 Windows")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>o.onRetry(),children:m("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>ne.close(),children:m("common.close","关闭")})]}):o.status==="error"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-error",children:m("docker.failed","安装失败")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>o.onRetry(),children:m("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>ne.close(),children:m("common.close","关闭")})]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-done",children:m("docker.ready","已就绪")}),c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-finish",onClick:()=>ne.close(),children:m("common.done","完成")})]})})]})})}function rg({dockerTeam:o,cloudTitle:S,onOpen:w,onRename:r,onRefresh:j}){var Tt;const[O,Z]=C.useState(null),[U,T]=C.useState(""),[v,Q]=C.useState(!1),[H,at]=C.useState(!1),[et,nt]=C.useState(!1),[$,ot]=C.useState(""),At=S||"Docker 团队",dt=k=>{var st;(st=k==null?void 0:k.stopPropagation)==null||st.call(k),ot(At),nt(!0)},rt=async()=>{nt(!1);const k=String($||"").trim();if(!(!k||k===At||!r))try{await r(k),j==null||j()}catch{}},[xt,zt]=C.useState({top:0,left:0}),pt=C.useRef(null),G=C.useRef(null),Nt=184,R="#2496ed",mt=C.useCallback(async()=>{var k,st,bt;try{const St=await((bt=(st=(k=window.cicy)==null?void 0:k.docker)==null?void 0:st.appStatus)==null?void 0:bt.call(st));Z(St),St!=null&&St.running&&ae&&ae.status==="running"&&ne.finish({ok:!0,message:"Docker cicy-code 已就绪"})}catch(St){console.warn("[DockerCard]",St)}},[]);C.useEffect(()=>{mt();const k=setInterval(()=>{U||mt()},12e3);return()=>clearInterval(k)},[mt,U]),C.useEffect(()=>{if(!v)return;const k=bt=>{var St,Dt;(St=pt.current)!=null&&St.contains(bt.target)||(Dt=G.current)!=null&&Dt.contains(bt.target)||Q(!1)},st=bt=>{bt.key==="Escape"&&Q(!1)};return document.addEventListener("mousedown",k),document.addEventListener("keydown",st),()=>{document.removeEventListener("mousedown",k),document.removeEventListener("keydown",st)}},[v]);const Lt=()=>{if(!v&&pt.current){const k=pt.current.getBoundingClientRect(),st=Math.max(8,Math.min(k.right-Nt,window.innerWidth-Nt-8));zt({top:Math.round(k.bottom+4),left:Math.round(st)})}Q(k=>!k)},Yt=C.useCallback(async()=>{var st,bt,St,Dt,Zt,le;T("bootstrap"),ne.open({onRetry:Yt});const k=(St=(bt=(st=window.cicy)==null?void 0:st.docker)==null?void 0:bt.onAppProgress)==null?void 0:St.call(bt,J=>ne.push(J));try{const J=await((le=(Zt=(Dt=window.cicy)==null?void 0:Dt.docker)==null?void 0:Zt.appBootstrap)==null?void 0:le.call(Zt));(J==null?void 0:J.reason)==="installer_launched"?ne.finish({status:"reboot",message:m("docker.installerLaunched","已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」")}):(J==null?void 0:J.reason)==="wsl_reboot_required"?ne.finish({status:"reboot",message:m("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):ne.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?m("docker.ready","Docker cicy-code 已就绪"):(J==null?void 0:J.error)||m("docker.failed","安装失败")}),J!=null&&J.ok&&(j==null||j())}catch(J){ne.finish({ok:!1,message:J.message})}finally{try{k&&k()}catch{}T(""),mt()}},[mt,j]),Ft=C.useCallback(async()=>{var st,bt,St,Dt,Zt,le;Q(!1),T("upgrade"),ne.open({onRetry:Ft});const k=(St=(bt=(st=window.cicy)==null?void 0:st.docker)==null?void 0:bt.onAppProgress)==null?void 0:St.call(bt,J=>ne.push(J));try{const J=await((le=(Zt=(Dt=window.cicy)==null?void 0:Dt.docker)==null?void 0:Zt.appUpgrade)==null?void 0:le.call(Zt));(J==null?void 0:J.reason)==="wsl_reboot_required"?ne.finish({status:"reboot",message:m("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):ne.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?m("docker.upgraded","已升级到最新"):(J==null?void 0:J.error)||m("docker.upgradeFailed","升级失败")}),J!=null&&J.ok&&(j==null||j())}catch(J){ne.finish({ok:!1,message:J.message})}finally{try{k&&k()}catch{}T(""),mt()}},[mt,j]),ce=C.useCallback(async()=>{var st,bt,St,Dt,Zt,le;Q(!1),T("update"),ne.open({onRetry:ce});const k=(St=(bt=(st=window.cicy)==null?void 0:st.docker)==null?void 0:bt.onAppProgress)==null?void 0:St.call(bt,J=>ne.push(J));try{const J=await((le=(Zt=(Dt=window.cicy)==null?void 0:Dt.docker)==null?void 0:Zt.appUpdate)==null?void 0:le.call(Zt));ne.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?m("docker.updated","cicy-code 已更新到最新"):(J==null?void 0:J.error)||m("docker.updateFailed","更新失败")}),J!=null&&J.ok&&(j==null||j())}catch(J){ne.finish({ok:!1,message:J.message})}finally{try{k&&k()}catch{}T(""),mt()}},[mt,j]),Gt=C.useCallback(async(k,st,bt)=>{Q(!1),T(k),te.show({id:"docker-op",message:m(`docker.${k}ing`,k==="restart"?"重启中…":k==="reload"?"刷新中…":"停止中…"),status:"running"});try{const St=await st();St!=null&&St.ok?te.show({id:"docker-op",message:bt,status:"done",ttl:2500}):te.show({id:"docker-op",message:(St==null?void 0:St.error)||m("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(St){te.show({id:"docker-op",message:St.message,status:"error",ttl:6e3})}finally{T(""),mt()}},[mt]),x=C.useCallback(async()=>{Q(!1),T("authssh"),te.show({id:"docker-op",message:m("docker.authorizingHost","授权容器访问 Mac(配置 SSH)…"),status:"running"});try{const k=await window.cicy.docker.appAuthorizeHostSsh();k!=null&&k.ok?te.show({id:"docker-op",message:k.verified?m("docker.authorizedHostOk","已授权:容器内 `ssh mac` 可访问 Mac ✅"):m("docker.authorizedHostPartial","公钥已写入 Mac(未验证成功,可在容器内手动 `ssh mac` 试)"),status:k.verified?"done":"error",ttl:5e3}):te.show({id:"docker-op",message:(k==null?void 0:k.error)||m("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(k){te.show({id:"docker-op",message:k.message,status:"error",ttl:6e3})}finally{T(""),mt()}},[mt]),q=C.useCallback(async k=>{Q(!1),T("chromeproxy"),te.show({id:"docker-op",message:k?m("docker.chromeProxyOn","启用 Chrome 代理(宿主 mihomo)…"):m("docker.chromeProxyOff","关闭 Chrome 代理…"),status:"running"});try{const st=await window.cicy.docker.appChromeProxy(k);st!=null&&st.ok?te.show({id:"docker-op",message:k?m("docker.chromeProxyDone","Chrome 代理已启用 ✅"):m("docker.chromeProxyUndone","Chrome 代理已关闭"),status:"done",ttl:3e3}):te.show({id:"docker-op",message:(st==null?void 0:st.error)||m("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(st){te.show({id:"docker-op",message:st.message,status:"error",ttl:6e3})}finally{T(""),mt()}},[mt]),lt=((Tt=window.cicy)==null?void 0:Tt.platform)||(O==null?void 0:O.platform);if(lt!=="win32")return null;const ft=!!(O!=null&&O.running)||(o==null?void 0:o.status)==="running",wt=!!(O!=null&&O.dockerRunning),d=!!(O!=null&&O.installed),E=!!(O!=null&&O.unknown)&&!ft&&!wt&&!d,B=!!(O!=null&&O.wslUnmanaged),V=ft?B?"warn":"ok":wt||d||E?"warn":"off",I=!!U;ft?B?m("docker.runningWslBroken","运行中 · ⚠ WSL 管理异常(能打开;更新/重启需修复 WSL)"):m("docker.running","运行中"):wt?m("docker.notRunning","未启动 · 点「启动」"):d?m("docker.engineDown","Docker 未运行 · 点启动"):E?m("docker.wslUnresponsive","WSL 未响应 · 点「重试检测」"):m("docker.notInstalled","Docker Desktop 未安装");const M=U==="open"?m("docker.opening","打开中…"):U==="probe"?m("docker.probing","检测中…"):I?m("docker.working","处理中…"):ft?m("localTeams.open","打开"):wt?m("docker.start","启动"):d?m("docker.startDocker","启动 Docker"):E?m("docker.retryProbe","重试检测"):m("docker.install","下载安装"),it=async()=>{var k,st,bt,St,Dt,Zt,le,J,K;if(!I){if(ft){try{const F=await((bt=(st=(k=window.cicy)==null?void 0:k.tabs)==null?void 0:st.activateIfOpen)==null?void 0:bt.call(st,"http://127.0.0.1:8009"));if(F!=null&&F.active)return}catch{}T("open");try{await(w==null?void 0:w(o==null?void 0:o.id))}finally{T("")}return}if(E){T("probe");try{const F=await(((Zt=(Dt=(St=window.cicy)==null?void 0:St.docker)==null?void 0:Dt.appRedetect)==null?void 0:Zt.call(Dt))??((K=(J=(le=window.cicy)==null?void 0:le.docker)==null?void 0:J.appStatus)==null?void 0:K.call(J)));F&&Z(F),F!=null&&F.unknown&&te.show({id:"docker-probe",status:"error",message:m("docker.wslStillStuck","WSL 仍无响应 —— 多半要重启 Windows 后再试"),ttl:6e3})}catch{te.show({id:"docker-probe",status:"error",message:m("docker.probeFailed","检测失败,请重试"),ttl:5e3})}finally{T("")}return}Yt()}},Ct=ft;return c.jsxs("div",{"data-id":"DockerCard",className:`bcard bcard--docker${ft?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent",style:{background:R}}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",style:{color:R},children:[c.jsx("span",{className:"bcard__dot","data-tone":V}),c.jsx("svg",{style:{width:18,height:18},viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:c.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"})})]}),Ct&&c.jsxs("div",{className:"bcard__menuwrap",onClick:k=>k.stopPropagation(),children:[c.jsx("button",{type:"button",ref:pt,"data-id":"DockerCard-menu-btn",className:"bcard__kebab",title:m("docker.manage","管理 Docker cicy-code"),disabled:I,onClick:Lt,children:I?c.jsx(je,{}):c.jsx(Is,{})}),v&&sn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"DockerCard-menu",role:"menu",ref:G,style:{position:"fixed",top:xt.top,left:xt.left,width:Nt},onClick:k=>k.stopPropagation(),children:[c.jsx("button",{type:"button","data-id":"DockerCard-update",className:"bcard__menu-item is-accent",onClick:ce,children:m("docker.update","更新 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-restart",className:"bcard__menu-item",onClick:()=>Gt("restart",()=>window.cicy.docker.appRestart(),m("docker.restarted","已重启 cicy-code")),children:m("docker.restart","重启 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-stop",className:"bcard__menu-item is-danger",onClick:()=>Gt("stop",()=>window.cicy.docker.appStop(),m("docker.stopped","已停止 cicy-code")),children:m("docker.stop","停止 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-reload",className:"bcard__menu-item",onClick:k=>{var st,bt,St;k.stopPropagation(),Q(!1),(St=(bt=(st=window.cicy)==null?void 0:st.tabs)==null?void 0:bt.reloadIfOpen)==null||St.call(bt,"http://127.0.0.1:8009","Docker 团队")},children:m("docker.reloadWindow","刷新窗口")}),c.jsx("button",{type:"button","data-id":"DockerCard-billing",className:"bcard__menu-item",onClick:()=>{Q(!1),ni(o!=null&&o.cloud_team_id?`?team=${encodeURIComponent(o.cloud_team_id)}`:"?view=usage")},children:m("docker.billing","帐单")}),c.jsx("div",{className:"bcard__menu-sep","data-id":"DockerCard-menu-sep",role:"separator","aria-hidden":!0}),lt==="darwin"&&c.jsx("button",{type:"button","data-id":"DockerCard-authorize-host-ssh",className:"bcard__menu-item",title:m("docker.authorizeHostHint","把容器公钥加到 Mac 的 authorized_keys,容器内 `ssh mac` 即可访问本机"),onClick:x,children:m("docker.authorizeHost","授权容器访问 Mac")}),c.jsxs("button",{type:"button","data-id":"DockerCard-chrome-proxy",className:"bcard__menu-item bcard__menu-item--switch",role:"menuitemcheckbox","aria-checked":!!(O!=null&&O.chromeProxy),title:m("docker.chromeProxyHint","在本机起一个 mihomo,给系统 Chrome 的分身代理(127.0.0.1:2000N)。配置从容器同步"),onClick:()=>q(!(O!=null&&O.chromeProxy)),children:[c.jsx("span",{children:m("docker.chromeProxy","Chrome 代理")}),c.jsx("span",{className:`bcard__switch${O!=null&&O.chromeProxy?" is-on":""}`,"data-id":"DockerCard-chrome-proxy-switch","aria-hidden":!0})]}),c.jsx("button",{type:"button","data-id":"DockerCard-docker-restart",className:"bcard__menu-item",onClick:()=>Gt("restart",()=>window.cicy.docker.appDockerRestart(),m("docker.dockerRestarted","已重启 Docker 容器")),children:m("docker.dockerRestart","重启 Docker")}),c.jsx("button",{type:"button","data-id":"DockerCard-recreate",className:"bcard__menu-item is-danger",onClick:k=>{k.stopPropagation(),Q(!1),at(!0)},children:m("docker.recreate","重建 Docker")})]}),document.body)]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:et?c.jsx("input",{"data-id":"DockerCard-rename-input",autoFocus:!0,value:$,onChange:k=>ot(k.target.value),onFocus:k=>k.target.select(),onBlur:rt,onClick:k=>k.stopPropagation(),onKeyDown:k=>{k.nativeEvent.isComposing||k.keyCode===229||(k.key==="Enter"?rt():k.key==="Escape"&&nt(!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"}}):c.jsxs("h3",{className:"bcard__name",title:r?m("localTeams.renameHint","点名字或 ✎ 改名"):At,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:r?dt:void 0,children:[c.jsx("span",{onClick:r?dt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:r?"text":"default"},children:At}),r&&c.jsx("button",{type:"button","data-id":"DockerCard-rename-btn",title:m("localTeams.rename","重命名"),onClick:dt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsxs("div",{className:"bcard__meta",children:[c.jsx("span",{className:"bcard__chip",children:"Docker"}),(O==null?void 0:O.version)&&c.jsxs("span",{className:"bcard__ver","data-id":"DockerCard-ver",style:{marginLeft:8,fontSize:11,opacity:.6},children:["v",O.version]})]})]}),c.jsxs("button",{type:"button",className:"bcard__cta","data-id":"DockerCard-cta",disabled:I,onClick:it,style:ft?void 0:{background:R,color:"white"},children:[I?c.jsx(je,{}):c.jsx(wu,{}),c.jsx("span",{children:M})]}),H&&sn.createPortal(c.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"},onClick:()=>at(!1),children:c.jsxs("div",{onClick:k=>k.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:[c.jsx("h3",{style:{margin:"0 0 8px",fontSize:16,color:"#e6edf3"},children:m("docker.recreate","重建 Docker")}),c.jsx("p",{style:{margin:"0 0 18px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:m("docker.recreateConfirm","会删除当前容器并重新创建(volume 数据保留),用于切换为独立 team 的网关 key。确定重建?")}),c.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[c.jsx("button",{type:"button","data-id":"DockerCard-recreate-cancel",onClick:()=>at(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:m("common.cancel","取消")}),c.jsx("button",{type:"button","data-id":"DockerCard-recreate-confirm",onClick:()=>{at(!1),Gt("restart",()=>window.cicy.docker.appRecreate(),m("docker.recreated","已重建 Docker 容器"))},style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#da3633",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:m("docker.recreateOk","确定重建")})]})]})}),document.body)]})}function hm({team:o,onOpen:S,onRename:w,onRefresh:r}){var Dt,Zt,le,J;const O=(pm[o.status]||pm.error).tone,[Z,U]=C.useState(!1),[T,v]=C.useState(o.name||""),[Q,H]=C.useState(null),[at,et]=C.useState(""),nt=Q??o.name;C.useEffect(()=>{Q!=null&&o.name===Q&&H(null)},[o.name,Q]);const $=K=>{var F;(F=K==null?void 0:K.stopPropagation)==null||F.call(K),v(nt||""),U(!0)},ot=async()=>{U(!1);const K=String(T||"").trim();if(!w||!K||K===nt)return;H(K),et("saving");let F;try{F=await w(o.id,K)}catch(Ut){F={ok:!1,error:Ut==null?void 0:Ut.message}}H(null),F&&F.ok?(et("saved"),setTimeout(()=>et(Ut=>Ut==="saved"?"":Ut),1500)):(et(""),te.show({message:m("localTeams.renameFailed","改名没保存,已恢复"),status:"error",ttl:4e3}))},dt=!!((Zt=(Dt=window.cicy)==null?void 0:Dt.sidecar)!=null&&Zt.restart)&&Ws(o.base_url),rt=o.status==="running",[xt,zt]=C.useState(""),[pt,G]=C.useState(!1),[Nt,R]=C.useState({running:void 0,latest:null,installed:null}),mt=Nt.latest,Lt=Nt.running,[Yt,Ft]=C.useState(!1),ce=C.useRef(null),Gt=C.useRef(null),x=C.useRef(null),[q,lt]=C.useState({top:0,left:0}),ft=184,wt=()=>{if(!pt&&Gt.current){const K=Gt.current.getBoundingClientRect(),F=Math.max(8,Math.min(K.right-ft,window.innerWidth-ft-8));lt({top:Math.round(K.bottom+4),left:Math.round(F)})}G(K=>!K)},d=C.useCallback(async(K=!1)=>{var F,Ut;if(!(!dt||!((Ut=(F=window.cicy)==null?void 0:F.sidecar)!=null&&Ut.versions))){K&&Ft(!0);try{const ht=await window.cicy.sidecar.versions();R({running:(ht==null?void 0:ht.running)??null,latest:(ht==null?void 0:ht.latest)??null,installed:(ht==null?void 0:ht.installed)??null}),K&&(ht!=null&&ht.running&&(ht!=null&&ht.latest)&&gm(ht.latest,ht.running)>0?te.show({message:`${m("sidecar.found","发现新版本")} v${ht.latest}`,status:"done",ttl:2500}):ht!=null&&ht.running?te.show({message:`${m("sidecar.upToDate","已是最新")} v${ht.running}`,status:"done",ttl:2500}):te.show({message:m("sidecar.notRunning","cicy-code 未运行"),status:"error",ttl:4e3}))}catch{K&&te.show({message:m("sidecar.checkFailed","检查更新失败"),status:"error",ttl:5e3})}finally{K&&Ft(!1)}}},[dt]);C.useEffect(()=>{d(!1)},[d]),C.useEffect(()=>{rt&&d(!1)},[rt,d]);const E=!!(dt&&mt&&Lt&&gm(mt,Lt)>0),B=!dt&&!!((J=(le=window.cicy)==null?void 0:le.localTeams)!=null&&J.remove),V=dt||B,[I,M]=C.useState(!1);C.useEffect(()=>{if(!pt)return;const K=F=>{var Ut,ht;(Ut=Gt.current)!=null&&Ut.contains(F.target)||(ht=x.current)!=null&&ht.contains(F.target)||G(!1)};return document.addEventListener("mousedown",K),()=>document.removeEventListener("mousedown",K)},[pt]),C.useEffect(()=>{pt||M(!1)},[pt]);const it=async()=>{var K,F,Ut;if(!I){M(!0);return}if(G(!1),M(!1),!xt){zt("remove");try{await((Ut=(F=(K=window.cicy)==null?void 0:K.localTeams)==null?void 0:F.remove)==null?void 0:Ut.call(F,o.id))}catch{}zt(""),r==null||r()}},Ct=`sidecar-op:${o.id}`,Tt=async(K,F,Ut)=>{var Re,ge,N,Y,L;if(G(!1),xt)return;zt(K);const ht=K==="update";let aa=null;ht?(Ee.open({teamId:o.id,fromVer:Lt,toVer:mt,onRetry:()=>Tt("update",F,Ut)}),(ge=(Re=window.cicy)==null?void 0:Re.sidecar)!=null&&ge.onOpProgress&&(aa=window.cicy.sidecar.onOpProgress(X=>{(X==null?void 0:X.op)==="update"&&Ee.push(X)}))):te.show({id:Ct,message:k[K]||`${K}…`,status:"running",progress:void 0});try{const X=await F(),P=!!(X!=null&&X.ok),Rt=X!=null&&X.warning?`${Ut}(${X.warning})`:Ut,gt=m("sidecar.failed","操作失败")+(X!=null&&X.error?`: ${X.error}`:"");if(ht){if(Ee.finish({ok:P,message:P?Rt:gt}),P)try{await((L=(Y=(N=window.cicy)==null?void 0:N.localTeams)==null?void 0:Y.reload)==null?void 0:L.call(Y,o.id,{ignoreCache:!0}))}catch{}}else te.show({id:Ct,message:P?Rt:gt,progress:void 0,status:P?"done":"error",ttl:P?4e3:8e3})}catch(X){const P=m("sidecar.failed","操作失败")+`: ${(X==null?void 0:X.message)||X}`;ht?Ee.finish({ok:!1,message:P}):te.show({id:Ct,message:P,progress:void 0,status:"error",ttl:8e3})}finally{try{aa&&aa()}catch{}zt(""),r==null||r(),(K==="update"||K==="restart"||K==="start")&&d(!1)}},k={start:m("busy.start","启动中…"),restart:m("busy.restart","重启中…"),update:m("busy.update","更新中…"),stop:m("busy.stop","停止中…")},st=async()=>{var Ut,ht,aa;zt("start"),Ee.open({teamId:o.id,title:m("sidecar.startTitle","启动 cicy-code"),onRetry:st}),Ee.push({phase:"download",status:"running",message:m("sidecar.starting","启动 cicy-code(首次需安装 Node + 依赖,日志见下)…")});const K=(aa=(ht=(Ut=window.cicy)==null?void 0:Ut.sidecar)==null?void 0:ht.onOpProgress)==null?void 0:aa.call(ht,Re=>Ee.push(Re));let F;try{F=await window.cicy.sidecar.start()}catch(Re){F={ok:!1,error:(Re==null?void 0:Re.message)||String(Re)}}try{K==null||K()}catch{}return zt(""),r==null||r(),!(F!=null&&F.ok)||F!=null&&F.warning?(Ee.finish({ok:!1,message:m("sidecar.startFailed","启动失败")+(F!=null&&F.error?`: ${F.error}`:F!=null&&F.warning?`: ${F.warning}`:"")}),!1):(Ee.finish({ok:!0,message:m("sidecar.startedOk","cicy-code 已就绪")}),!0)},bt=async()=>{var K,F;xt||!rt&&dt&&((F=(K=window.cicy)==null?void 0:K.sidecar)!=null&&F.start)&&!await st()||S()},St=rt?m("localTeams.open","打开"):dt?m("localTeams.startOpen","启动并打开"):m("localTeams.open","打开");return c.jsxs("div",{"data-id":"LocalTeamCard",className:`bcard ${dt?"bcard--local":"bcard--custom"}${O==="ok"?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent"}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":O}),c.jsx(dg,{})]}),V&&c.jsxs("div",{className:"bcard__menuwrap",ref:ce,onClick:K=>K.stopPropagation(),children:[c.jsx("button",{type:"button",ref:Gt,"data-id":"LocalTeamCard-menu-btn",className:`bcard__kebab${E?" has-dot":""}`,title:dt?m("localTeams.manage","管理本地 cicy-code"):m("localTeams.more","更多"),disabled:!!xt,onClick:wt,children:xt?c.jsx(je,{}):c.jsx(Is,{})}),pt&&sn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"LocalTeamCard-menu",role:"menu",ref:x,style:{position:"fixed",top:q.top,left:q.left,width:ft},onClick:K=>K.stopPropagation(),children:[dt&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-check-update",className:"bcard__menu-item",disabled:Yt,onClick:K=>{K.stopPropagation(),d(!0)},children:Yt?m("sidecar.checking2","检查中…"):m("sidecar.checkUpdate","检查更新")}),E&&c.jsxs("button",{type:"button","data-id":"LocalTeamCard-update",className:"bcard__menu-item is-accent",onClick:()=>Tt("update",()=>window.cicy.sidecar.update(),m("sidecar.updated","已更新到最新")),children:[m("sidecar.updateTo","更新到")," v",mt]}),o.base_url&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-reload",className:"bcard__menu-item",onClick:K=>{var F,Ut,ht;K.stopPropagation(),G(!1),(ht=(Ut=(F=window.cicy)==null?void 0:F.tabs)==null?void 0:Ut.reloadIfOpen)==null||ht.call(Ut,o.base_url,o.name)},children:m("localTeams.reloadWindow","刷新窗口")}),dt&&rt&&c.jsxs(c.Fragment,{children:[c.jsx("button",{type:"button","data-id":"LocalTeamCard-restart",className:"bcard__menu-item",onClick:()=>Tt("restart",()=>window.cicy.sidecar.restart(),m("sidecar.restarted","已重启")),children:m("sidecar.restart","重启")}),c.jsx("button",{type:"button","data-id":"LocalTeamCard-stop",className:"bcard__menu-item is-danger",onClick:()=>Tt("stop",()=>window.cicy.sidecar.stop(),m("sidecar.stoppedDone","已停止")),children:m("sidecar.stop","停止")})]}),o.cloud_team_id&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-billing",className:"bcard__menu-item",onClick:K=>{K.stopPropagation(),G(!1),ni(`?team=${encodeURIComponent(o.cloud_team_id)}`)},children:m("localTeams.billing","账单")}),B&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-remove",className:"bcard__menu-item is-danger",onClick:it,children:I?m("localTeams.removeConfirm","确认删除?"):m("localTeams.remove","删除")}),c.jsx("button",{type:"button","data-id":"LocalTeamCard-addr",className:"bcard__menu-item",title:m("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:K=>{K.stopPropagation(),G(!1);try{navigator.clipboard.writeText(o.base_url||"")}catch{}},children:o.base_url||"—"}),(Lt||o.version)&&c.jsxs("div",{"data-id":"LocalTeamCard-version",className:"bcard__menu-item",style:{cursor:"default",color:"#8b949e",fontSize:12},children:[m("localTeams.version","版本")," v",Lt||o.version]})]}),document.body)]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:Z?c.jsx("input",{"data-id":"LocalTeamCard-rename-input",autoFocus:!0,value:T,onChange:K=>v(K.target.value),onFocus:K=>K.target.select(),onBlur:ot,onClick:K=>K.stopPropagation(),onKeyDown:K=>{K.nativeEvent.isComposing||K.keyCode===229||(K.key==="Enter"?ot():K.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"}}):c.jsxs("h3",{className:"bcard__name",title:m("localTeams.renameHint","点名字或 ✎ 改名"),style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:$,children:[c.jsx("span",{"data-id":"LocalTeamCard-name-text",onClick:$,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"text"},children:nt}),at==="saving"&&c.jsx("span",{"data-id":"LocalTeamCard-save-state",title:m("localTeams.saving","保存中…"),style:{flex:"none",display:"inline-flex"},children:c.jsx(je,{})}),at==="saved"&&c.jsx("span",{"data-id":"LocalTeamCard-save-state",title:m("localTeams.saved","已保存"),style:{flex:"none",color:"#3fb950",fontSize:13,lineHeight:1},children:"✓"}),!at&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-rename-btn",title:m("localTeams.rename","重命名"),onClick:$,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsx("div",{className:"bcard__meta",children:c.jsx("span",{className:"bcard__chip","data-id":"LocalTeamCard-kind",children:dt?m("localTeams.kindLocal","本地"):m("localTeams.kindCustom","自定义")})})]}),c.jsxs("button",{type:"button",className:"bcard__cta","data-id":"LocalTeamCard-open",disabled:!!xt||!o.base_url,onClick:bt,children:[xt&&xt!=="stop"?c.jsx(je,{}):c.jsx(wu,{}),c.jsx("span",{children:xt&&k[xt]||St})]})]})}function Ws(o){try{const S=new URL(o);return(S.hostname==="127.0.0.1"||S.hostname==="localhost"||S.hostname==="::1")&&(S.port==="8008"||S.port==="")}catch{return!1}}function ym(o){try{const S=new URL(o);return(S.hostname==="127.0.0.1"||S.hostname==="localhost"||S.hostname==="::1")&&S.port==="8009"}catch{return!1}}function gm(o,S){const w=String(o).split("."),r=String(S).split(".");for(let j=0;j<Math.max(w.length,r.length);j++){const O=(parseInt(w[j],10)||0)-(parseInt(r[j],10)||0);if(O)return O>0?1:-1}return 0}const pm={running:{tone:"ok",label:"running",cta:m("localStatus.open","打开")},stopped:{tone:"off",label:"stopped",cta:m("localStatus.notRunning","未运行")},auth_error:{tone:"warn",label:"auth error",cta:m("localStatus.tokenInvalid","Token 失效")},misconfigured:{tone:"err",label:"bad config",cta:m("localStatus.badUrl","URL 错误")},error:{tone:"err",label:"error",cta:m("localStatus.error","异常")}};function fg({team:o,onOpen:S,onRename:w,onEditUrl:r}){const j=o.kind==="private",O=o.status==="active",Z=o.name||o.title||"—",[U,T]=C.useState(!1),[v,Q]=C.useState(""),[H,at]=C.useState(null),et=H??Z;C.useEffect(()=>{H!=null&&Z===H&&at(null)},[Z,H]);const nt=M=>{var it;(it=M==null?void 0:M.stopPropagation)==null||it.call(M),Q(et==="—"?"":et),T(!0)},$=async()=>{T(!1);const M=String(v||"").trim();if(!(!w||!M||M===et)){at(M);try{const it=await w(o.id,M);it!=null&&it.ok||at(null)}catch{at(null)}}},ot=o.host_url||"",[At,dt]=C.useState(!1),[rt,xt]=C.useState(""),[zt,pt]=C.useState(null),G=zt??ot;C.useEffect(()=>{zt!=null&&ot===zt&&pt(null)},[ot,zt]);const Nt=o.teamId||o.id,R=j?m("teamKind.private","私有云"):o.team_kind==="personal"?m("teamKind.personal","个人"):m("teamKind.shared","共享"),mt=j?G:o.workspace_url||o.workspace_direct_url,Lt=!!mt,[Yt,Ft]=C.useState(!1),[ce,Gt]=C.useState(!1),[x,q]=C.useState({top:0,left:0}),lt=C.useRef(null),ft=C.useRef(null),wt=C.useRef(null),d=184,E=()=>{if(!Yt&&ft.current){const M=ft.current.getBoundingClientRect(),it=Math.max(8,Math.min(M.right-d,window.innerWidth-d-8));q({top:Math.round(M.bottom+4),left:Math.round(it)})}Ft(M=>!M)};C.useEffect(()=>{if(!Yt)return;const M=it=>{var Ct,Tt;(Ct=ft.current)!=null&&Ct.contains(it.target)||(Tt=wt.current)!=null&&Tt.contains(it.target)||Ft(!1)};return document.addEventListener("mousedown",M),()=>document.removeEventListener("mousedown",M)},[Yt]);const B=M=>{var it,Ct,Tt,k;(it=M==null?void 0:M.stopPropagation)==null||it.call(M),Lt&&(Ft(!1),(k=(Tt=(Ct=window.cicy)==null?void 0:Ct.tabs)==null?void 0:Tt.reloadIfOpen)==null||k.call(Tt,mt,et))},V=()=>{xt(ot),dt(!0),Ft(!1)},I=async()=>{dt(!1);const M=String(rt||"").trim();if(!(!r||!M||M===ot)){pt(M);try{const it=await r(o.id,M);it!=null&&it.ok||pt(null)}catch{pt(null)}}};return c.jsxs("div",{"data-id":"TeamCard",className:`bcard bcard--cloud${O?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent"}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":O?"ok":"off"}),c.jsx(mg,{})]}),c.jsxs("div",{className:"bcard__top-right",children:[o.is_trial&&c.jsx("span",{className:"bcard__badge",children:"trial"}),(Lt||Nt!=null||j&&r)&&c.jsxs("div",{className:"bcard__menuwrap",ref:lt,onClick:M=>M.stopPropagation(),children:[c.jsx("button",{type:"button",ref:ft,"data-id":"TeamCard-menu-btn",className:"bcard__kebab",title:m("localTeams.more","更多"),disabled:ce,onClick:E,children:ce?c.jsx(je,{}):c.jsx(Is,{})}),Yt&&sn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"TeamCard-menu",role:"menu",ref:wt,style:{position:"fixed",top:x.top,left:x.left,width:d},onClick:M=>M.stopPropagation(),children:[Lt&&c.jsx("button",{type:"button","data-id":"TeamCard-reload",className:"bcard__menu-item",onClick:B,children:m("localTeams.reloadWindow","刷新窗口")}),Nt!=null&&c.jsx("button",{type:"button","data-id":"TeamCard-billing",className:"bcard__menu-item",onClick:M=>{M.stopPropagation(),Ft(!1),ni(`?team=${encodeURIComponent(Nt)}`)},children:m("localTeams.billing","账单")}),Lt&&c.jsx("button",{type:"button","data-id":"TeamCard-addr",className:"bcard__menu-item",title:m("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:M=>{M.stopPropagation(),Ft(!1);try{navigator.clipboard.writeText(mt||ot||"")}catch{}},children:j?G||mt:mt||o.runtime_region||o.region||"—"}),j&&r&&c.jsx("button",{type:"button","data-id":"TeamCard-edit-url",className:"bcard__menu-item",onClick:M=>{M.stopPropagation(),V()},children:ot?m("teamCard.editUrl","更改访问地址"):m("teamCard.setUrl","填写访问地址")})]}),document.body)]})]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:U?c.jsx("input",{"data-id":"TeamCard-rename-input",autoFocus:!0,value:v,onChange:M=>Q(M.target.value),onFocus:M=>M.target.select(),onBlur:$,onClick:M=>M.stopPropagation(),onKeyDown:M=>{M.nativeEvent.isComposing||M.keyCode===229||(M.key==="Enter"?$():M.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"}}):c.jsxs("h3",{className:"bcard__name",title:w?m("localTeams.renameHint","点名字或 ✎ 改名"):et,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:w?nt:void 0,children:[c.jsx("span",{onClick:w?nt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:w?"text":"default"},children:et}),w&&c.jsx("button",{type:"button","data-id":"TeamCard-rename-btn",title:m("localTeams.rename","重命名"),onClick:nt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),At&&c.jsx("input",{"data-id":"TeamCard-url-input",autoFocus:!0,value:rt,placeholder:"https://你的私有云地址:端口",onChange:M=>xt(M.target.value),onFocus:M=>M.target.select(),onClick:M=>M.stopPropagation(),onBlur:I,onKeyDown:M=>{M.nativeEvent.isComposing||M.keyCode===229||(M.key==="Enter"?I():M.key==="Escape"&&dt(!1))},style:{width:"100%",font:"inherit",fontSize:12,padding:"3px 6px",margin:"2px 0 4px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}),c.jsxs("div",{className:"bcard__meta",children:[c.jsx("span",{className:"bcard__chip",children:R}),!j&&o.membership_status&&o.membership_status!=="active"&&c.jsx("span",{className:"bcard__chip",children:o.membership_status})]})]}),c.jsxs("button",{type:"button",className:"bcard__cta",onClick:S,disabled:!Lt,children:[c.jsx(wu,{}),c.jsx("span",{children:Lt?m("localTeams.open","打开"):j?m("teamCard.noHost","未填访问地址"):m("teamCard.noUrl","无 URL")})]})]})}function Zs(){return c.jsxs("div",{className:"brand",children:[c.jsx("div",{className:"brand-mark",children:c.jsx(wm,{})}),c.jsxs("div",{className:"brand-text",children:[c.jsx("div",{className:"brand-name",children:"CiCy Desktop"}),c.jsx("div",{className:"brand-sub",children:m("app.brandSub","团队 AI 协作工作台")})]})]})}function wm(){return c.jsx("svg",{width:"22",height:"22",viewBox:"0 0 96 96",fill:"none",children:c.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 wu(){return c.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),c.jsx("polyline",{points:"12 5 19 12 12 19"})]})}function je(){return c.jsx("svg",{className:"spin",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.4",strokeLinecap:"round",children:c.jsx("path",{d:"M21 12a9 9 0 1 1-6.2-8.55"})})}function dg(){return c.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),c.jsx("line",{x1:"2",y1:"20",x2:"22",y2:"20"})]})}function Is(){return c.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[c.jsx("circle",{cx:"12",cy:"5",r:"1.7"}),c.jsx("circle",{cx:"12",cy:"12",r:"1.7"}),c.jsx("circle",{cx:"12",cy:"19",r:"1.7"})]})}function mg(){return c.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("circle",{cx:"12",cy:"12",r:"10"}),c.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),c.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 li(o){try{return localStorage.getItem(o)||null}catch{return null}}function Vs(o){return o?/timeout/i.test(o)?"登录超时,请重新点击 Login。":/state/i.test(o)?"校验失败,请重新登录。":/no token/i.test(o)?"登录未完成,请重试。":/bridge missing/i.test(o)?"无法连接到登录服务(preload 未就绪)。":o:""}var vm;const hg=((vm=window.cicy)==null?void 0:vm.platform)||(()=>{const o=navigator.userAgent||"";return/Mac/i.test(o)?"darwin":/Windows/i.test(o)?"win32":"linux"})();document.documentElement.dataset.platform=hg;document.documentElement.dataset.fullscreen="0";var bm,Sm;(Sm=(bm=window.cicy)==null?void 0:bm.window)!=null&&Sm.onFullscreen&&window.cicy.window.onFullscreen(o=>{document.documentElement.dataset.fullscreen=o?"1":"0"});$y.createRoot(document.getElementById("root")).render(c.jsx(ag,{}));
|
|
@@ -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-CGkWxlko.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="./assets/index-CyUwy5Um.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
package/src/sidecar/cicy-code.js
CHANGED
|
@@ -496,7 +496,9 @@ async function update({ logPath, port = DEFAULT_PORT, emit } = {}) {
|
|
|
496
496
|
|
|
497
497
|
// 3) 起:钉死 cicy-code@<latest>,绕开 npx 对裸 `cicy-code` 的缓存,确保拉到新版
|
|
498
498
|
e({ phase: "swap", status: "running", message: `启动 cicy-code@${latest}…` });
|
|
499
|
-
|
|
499
|
+
// 传 emit: 让 start→ensureEnv 的「检查网络是否为 CN → 选 registry(CN=npmmirror)」+ npx
|
|
500
|
+
// 下载进度都显示在更新抽屉里(主人: 更新没探测 CN 网络 → 其实探了,但没 emit 出来,看不见)。
|
|
501
|
+
const c = await start({ logPath, port, force: true, version: latest, emit: e });
|
|
500
502
|
|
|
501
503
|
// 4) 探活:等 TCP 监听起来。注意:cicy-code 启动会先恢复团队的 agent 面板
|
|
502
504
|
// (w-1xx,可能十几个),:8008 在这些 REPL 拉起之后才 bind —— 繁忙团队这一步
|
|
@@ -394,10 +394,12 @@ export default function App() {
|
|
|
394
394
|
if (!at || !window.cicy?.cloud?.fetch || !next) return { ok: false, error: "no session / empty" };
|
|
395
395
|
try { new URL(next); } catch { return { ok: false, error: "地址格式不对(需 http(s)://…)" }; }
|
|
396
396
|
try {
|
|
397
|
+
// 云端 PATCH 收的是 **hostUrl(驼峰)**,虽然 GET /api/teams 返回的是 host_url(下划线)——
|
|
398
|
+
// 实测过:host_url 会被忽略(400 nothing_to_update),hostUrl 才真正改(200)。
|
|
397
399
|
const r = await window.cicy.cloud.fetch(`${CLOUD_BASE}/api/teams/${id}`, {
|
|
398
400
|
method: "PATCH",
|
|
399
401
|
headers: { Authorization: `Bearer ${at}`, "Content-Type": "application/json" },
|
|
400
|
-
body: JSON.stringify({
|
|
402
|
+
body: JSON.stringify({ hostUrl: next }),
|
|
401
403
|
});
|
|
402
404
|
if (r?.ok) { await refreshCloudTeams(); return { ok: true }; }
|
|
403
405
|
return { ok: false, error: `${r?.status || "?"} ${r?.error || ""}` };
|