cicy-desktop 2.1.266 → 2.1.267

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/build/icon.icns CHANGED
Binary file
package/build/icon.ico CHANGED
Binary file
package/build/icon.png CHANGED
Binary file
package/build/icon.svg CHANGED
@@ -1,12 +1,36 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" fill="none">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
2
2
  <defs>
3
- <linearGradient id="cicyMark" x1="16" y1="12" x2="80" y2="84" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#60A5FA"/>
5
- <stop offset="0.55" stop-color="#2563EB"/>
6
- <stop offset="1" stop-color="#1E3A8A"/>
3
+ <linearGradient id="orbit" x1="118" y1="104" x2="397" y2="407" gradientUnits="userSpaceOnUse">
4
+ <stop stop-color="#7772D8"/>
5
+ <stop offset="1" stop-color="#3F82B8"/>
7
6
  </linearGradient>
7
+ <filter id="shadow" x="8" y="12" width="496" height="500" filterUnits="userSpaceOnUse">
8
+ <feDropShadow dx="0" dy="10" stdDeviation="12" flood-color="#111827" flood-opacity="0.18"/>
9
+ </filter>
8
10
  </defs>
9
- <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"
10
- fill="url(#cicyMark)" stroke="url(#cicyMark)" stroke-width="8"
11
- stroke-linejoin="round" stroke-linecap="round"/>
11
+
12
+ <!-- White rounded application tile; transparent corners preserve the native
13
+ macOS/Windows icon silhouette. -->
14
+ <rect x="32" y="26" width="448" height="448" rx="104" fill="#FFFFFF"
15
+ stroke="#E5E7EB" stroke-width="4" filter="url(#shadow)"/>
16
+
17
+ <!-- CiCy mark from the supplied logo.svg, kept geometrically unchanged. -->
18
+ <path d="M256 68
19
+ 311 161
20
+ 419 162
21
+ 366 256
22
+ 419 350
23
+ 311 351
24
+ 256 444
25
+ 201 351
26
+ 93 350
27
+ 146 256
28
+ 93 162
29
+ 201 161
30
+ 256 68Z"
31
+ stroke="url(#orbit)"
32
+ stroke-width="52"
33
+ stroke-linecap="round"
34
+ stroke-linejoin="round"/>
35
+ <circle cx="256" cy="256" r="30" fill="url(#orbit)"/>
12
36
  </svg>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,27 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
2
+ <defs>
3
+ <linearGradient id="orbit" x1="118" y1="104" x2="397" y2="407" gradientUnits="userSpaceOnUse">
4
+ <stop stop-color="#7772D8"/>
5
+ <stop offset="1" stop-color="#3F82B8"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <!-- Colored transparent tray variant for Windows/Linux. -->
9
+ <path d="M256 68
10
+ 311 161
11
+ 419 162
12
+ 366 256
13
+ 419 350
14
+ 311 351
15
+ 256 444
16
+ 201 351
17
+ 93 350
18
+ 146 256
19
+ 93 162
20
+ 201 161
21
+ 256 68Z"
22
+ stroke="url(#orbit)"
23
+ stroke-width="52"
24
+ stroke-linecap="round"
25
+ stroke-linejoin="round"/>
26
+ <circle cx="256" cy="256" r="30" fill="url(#orbit)"/>
27
+ </svg>
Binary file
@@ -1,12 +1,23 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" fill="none">
2
- <defs>
3
- <linearGradient id="cicyMark" x1="16" y1="12" x2="80" y2="84" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#60A5FA"/>
5
- <stop offset="0.55" stop-color="#2563EB"/>
6
- <stop offset="1" stop-color="#1E3A8A"/>
7
- </linearGradient>
8
- </defs>
9
- <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"
10
- fill="#000000" stroke="#000000" stroke-width="8"
11
- stroke-linejoin="round" stroke-linecap="round"/>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
2
+ <!-- Monochrome transparent tray variant of the supplied CiCy logo.
3
+ Electron marks this as a macOS Template image, so black is recolored by
4
+ the system for light/dark menu bars. Never add a background here. -->
5
+ <path d="M256 68
6
+ 311 161
7
+ 419 162
8
+ 366 256
9
+ 419 350
10
+ 311 351
11
+ 256 444
12
+ 201 351
13
+ 93 350
14
+ 146 256
15
+ 93 162
16
+ 201 161
17
+ 256 68Z"
18
+ stroke="#000000"
19
+ stroke-width="52"
20
+ stroke-linecap="round"
21
+ stroke-linejoin="round"/>
22
+ <circle cx="256" cy="256" r="30" fill="#000000"/>
12
23
  </svg>
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cicy-desktop",
3
- "version": "2.1.266",
3
+ "version": "2.1.267",
4
4
  "description": "CiCy - AI-powered operating system browser",
5
5
  "main": "src/main.js",
6
6
  "bin": {
@@ -58,6 +58,10 @@
58
58
  "from": "build/trayTemplate@2x.png",
59
59
  "to": "build/trayTemplate@2x.png"
60
60
  },
61
+ {
62
+ "from": "build/trayIcon.png",
63
+ "to": "build/trayIcon.png"
64
+ },
61
65
  {
62
66
  "from": "build/icon.ico",
63
67
  "to": "build/icon.ico"
@@ -139,10 +143,10 @@
139
143
  "//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 着无害。",
140
144
  "optionalDependencies": {
141
145
  "electron": "41.0.3",
142
- "cicy-code-darwin-x64": "2.3.393",
143
- "cicy-code-darwin-arm64": "2.3.393",
144
- "cicy-code-linux-x64": "2.3.393",
145
- "cicy-code-linux-arm64": "2.3.393",
146
+ "cicy-code-darwin-x64": "2.3.394",
147
+ "cicy-code-darwin-arm64": "2.3.394",
148
+ "cicy-code-linux-x64": "2.3.394",
149
+ "cicy-code-linux-arm64": "2.3.394",
146
150
  "cicy-code-windows-x64": "2.3.193",
147
151
  "cicy-mihomo-darwin-x64": "1.10.4",
148
152
  "cicy-mihomo-darwin-arm64": "1.10.4",
@@ -376,4 +376,4 @@ Error generating stack: `+n.message+`
376
376
  `};function xp(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function tl(s){return xp(s).replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>").replace(/`([^`]+)`/g,"<code>$1</code>")}function Nh(s){return s.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(v=>v.trim())}function Sp(s){const v=String(s||"").replace(/\r\n/g,`
377
377
  `).split(`
378
378
  `),b=[];let o=0;for(;o<v.length;){const g=v[o];if(!g.trim()){o++;continue}if(/^---+\s*$/.test(g)){b.push("<hr/>"),o++;continue}const _=/^(#{1,6})\s+(.*)$/.exec(g);if(_){const m=Math.min(_[1].length,6);b.push(`<h${m}>${tl(_[2])}</h${m}>`),o++;continue}if(g.trim().startsWith("|")&&o+1<v.length&&/^\s*\|?[\s:|-]+\|?\s*$/.test(v[o+1])&&v[o+1].includes("-")){const m=Nh(g);o+=2;const f=[];for(;o<v.length&&v[o].trim().startsWith("|");)f.push(Nh(v[o])),o++;let y="<table><thead><tr>";y+=m.map(h=>`<th>${tl(h)}</th>`).join(""),y+="</tr></thead><tbody>";for(const h of f)y+="<tr>"+h.map(q=>`<td>${tl(q)}</td>`).join("")+"</tr>";y+="</tbody></table>",b.push(y);continue}if(g.trim().startsWith(">")){const m=[];for(;o<v.length&&v[o].trim().startsWith(">");)m.push(v[o].replace(/^\s*>\s?/,"")),o++;b.push(`<blockquote>${m.map(tl).join("<br/>")}</blockquote>`);continue}if(/^\s*-\s+/.test(g)){const m=[];for(;o<v.length&&/^\s*-\s+/.test(v[o]);)m.push(`<li>${tl(v[o].replace(/^\s*-\s+/,""))}</li>`),o++;b.push(`<ul>${m.join("")}</ul>`);continue}if(/^\s*\d+\.\s+/.test(g)){const m=[];for(;o<v.length&&/^\s*\d+\.\s+/.test(v[o]);)m.push(`<li>${tl(v[o].replace(/^\s*\d+\.\s+/,""))}</li>`),o++;b.push(`<ol>${m.join("")}</ol>`);continue}b.push(`<p>${tl(g)}</p>`),o++}return b.join(`
379
- `)}const r=(s,v,b)=>{var g,_;const o=m=>b&&typeof m=="string"?m.replace(/\{\{\s*(\w+)\s*\}\}/g,(f,y)=>b[y]!=null?String(b[y]):f):m;try{const m=(_=(g=window.cicyI18n)==null?void 0:g.t)==null?void 0:_.call(g,s,b);return o(m&&m!==s?m:v)}catch{return o(v)}},Rl="cicy_token",lc="cicy_access_token",Hi="cicy_user_id",el="https://cicy-ai.com",Vh=1;async function Qi(s){var b,o,g,_,m,f,y,h;const v=`${el}/dash${s}`;try{if((o=(b=window.cicy)==null?void 0:b.tabs)!=null&&o.openIn){await window.cicy.tabs.openIn(Vh,v,"cicy-ai");return}(m=(_=(g=window.cicy)==null?void 0:g.shell)==null?void 0:_.openExternal)==null||m.call(_,v)}catch{try{(h=(y=(f=window.cicy)==null?void 0:f.shell)==null?void 0:y.openExternal)==null||h.call(y,v)}catch{}}}const Co=new Set;let wp=0,Rn=[];const Li=new Map;function Dh(){Co.forEach(s=>s(Rn))}const Nt={show(s={}){const v=s.id||`t${++wp}`,b=Rn.find(_=>_.id===v),o={id:v,status:"running",...b,...s};Rn=b?Rn.map(_=>_.id===v?o:_):[...Rn,o],Dh();const g=Li.get(v);return g&&(clearTimeout(g),Li.delete(v)),s.ttl&&Li.set(v,setTimeout(()=>Nt.dismiss(v),s.ttl)),v},dismiss(s){Rn=Rn.filter(b=>b.id!==s);const v=Li.get(s);v&&(clearTimeout(v),Li.delete(s)),Dh()}};function _p(){const[s,v]=A.useState(Rn);return A.useEffect(()=>(Co.add(v),()=>{Co.delete(v)}),[]),s.length?u.jsx("div",{className:"toast-host","data-id":"ToastHost",children:s.map(b=>u.jsxs("div",{className:"toast","data-id":`Toast-${b.id}`,"data-status":b.status||"running",children:[u.jsx("button",{type:"button",className:"toast__x","data-id":"Toast-dismiss",onClick:()=>Nt.dismiss(b.id),"aria-label":"dismiss",children:"×"}),u.jsxs("span",{className:"toast__msg",children:[b.message,Number.isFinite(b.progress)?` ${b.progress}%`:""]}),Number.isFinite(b.progress)&&u.jsx("span",{className:"toast__bar",children:u.jsx("span",{style:{width:`${Math.min(100,b.progress)}%`}})})]},b.id))}):null}const jo=new Set;let So=0,ae=null;function Un(){jo.forEach(s=>s(ae))}function Yi(){return new Date().toTimeString().slice(0,8)}const ve={open({teamId:s,fromVer:v,toVer:b,onRetry:o,title:g,kind:_}={}){ae={teamId:s,title:g||null,fromVer:v||null,toVer:b||null,kind:_||"sidecar",status:"running",phase:"download",progress:null,onInstall:null,logs:[],onRetry:o||null,lastAt:Date.now()},Un()},setProgress(s){ae&&(ae={...ae,status:"running",progress:s||ae.progress,lastAt:Date.now()},Un())},ready({onInstall:s,message:v}={}){if(!ae)return;const b={id:++So,t:Yi(),phase:"done",status:"done",message:v||r("updateBanner.readyDrawer","下载完成,点「安装」重启更新")};ae={...ae,status:"ready",phase:"done",progress:{...ae.progress||{},percent:100},onInstall:s||null,minimized:!1,logs:[...ae.logs,b],lastAt:Date.now()},Un()},push(s={}){if(!ae)return;const v={id:++So,t:Yi(),phase:s.phase||ae.phase,status:s.status||"running",message:s.message||""};ae={...ae,phase:s.phase||ae.phase,toVer:s.toVer||ae.toVer,logs:[...ae.logs,v],lastAt:Date.now()},Un()},minimize(){ae&&(ae={...ae,minimized:!0},Un())},restore(){ae&&(ae={...ae,minimized:!1},Un())},finish({ok:s,message:v}={}){if(!ae)return;const b=s?"done":"error",o={id:++So,t:Yi(),phase:"done",status:b,message:v||(s?r("updateDrawer.done","更新完成"):r("updateDrawer.failed","更新失败"))};ae={...ae,status:b,phase:"done",minimized:!1,logs:[...ae.logs,o],lastAt:Date.now()},Un()},close(){ae=null,Un()}},wo=["download","swap","done"],kh=s=>({download:r("updateDrawer.phaseDownload","下载"),swap:r("updateDrawer.phaseSwap","切换"),done:r("updateDrawer.phaseDone","完成")})[s]||s;function Tp(){var f;const[s,v]=A.useState(ae);A.useEffect(()=>(jo.add(v),()=>{jo.delete(v)}),[]);const b=A.useRef(null);A.useEffect(()=>{const y=b.current;y&&(y.scrollTop=y.scrollHeight)},[(f=s==null?void 0:s.logs)==null?void 0:f.length]);const[o,g]=A.useState(!1);if(A.useEffect(()=>{if(!s||s.status!=="running"){g(!1);return}const y=setInterval(()=>g(Date.now()-(s.lastAt||0)>25e3),3e3);return()=>clearInterval(y)},[s==null?void 0:s.lastAt,s==null?void 0:s.status]),!s)return null;const _=s.status==="running",m=wo.findIndex(y=>y===s.phase);return s.minimized?u.jsxs("button",{type:"button",className:`drawer-min drawer-min--${s.status}`,"data-id":"UpdateDrawer-restore",onClick:()=>ve.restore(),children:[u.jsx("span",{className:"drawer-min__spark",children:_?u.jsx(Xe,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("span",{className:"drawer-min__label",children:[s.title||r("updateDrawer.title","更新 cicy-code"),s.toVer?` · v${s.toVer}`:""]})]}):u.jsx("div",{className:"drawer-scrim","data-id":"UpdateDrawer-scrim",onClick:()=>_?ve.minimize():ve.close(),children:u.jsxs("div",{className:"drawer","data-id":"UpdateDrawer","data-status":s.status,onClick:y=>y.stopPropagation(),children:[u.jsxs("div",{className:"drawer__head",children:[u.jsxs("div",{className:"drawer__title",children:[u.jsx("span",{className:`drawer__spark drawer__spark--${s.status}`,children:_?u.jsx(Xe,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("div",{children:[u.jsx("div",{className:"drawer__h",children:s.title||r("updateDrawer.title","更新 cicy-code")}),u.jsxs("div",{className:"drawer__sub",children:[s.fromVer?`v${s.fromVer}`:r("updateDrawer.current","当前")," → ",s.toVer?`v${s.toVer}`:r("updateDrawer.latest","最新版")]})]})]}),u.jsx("div",{className:"drawer__headbtns",children:u.jsx("button",{type:"button",className:"drawer__x","data-id":"UpdateDrawer-min",title:r("updateDrawer.minimize","最小化"),onClick:()=>ve.minimize(),"aria-label":"minimize",children:"‒"})})]}),s.kind!=="app"&&u.jsx("div",{className:"drawer__steps","data-id":"UpdateDrawer-steps",children:wo.map((y,h)=>{const q=kh(y),j=s.status==="done"||h<m,B=h===m&&_,Y=s.status==="error"&&h===m;return u.jsxs("div",{className:`drawer__step${B?" is-active":""}${j?" is-done":""}${Y?" is-error":""}`,children:[u.jsx("span",{className:"drawer__step-dot",children:j?"✓":Y?"!":h+1}),u.jsx("span",{className:"drawer__step-label",children:q}),h<wo.length-1&&u.jsx("span",{className:"drawer__step-bar"})]},y)})}),s.progress&&(()=>{const y=s.progress,h=q=>q?(q/1048576).toFixed(1):"0";return u.jsxs("div",{className:"drawer__dl","data-id":"UpdateDrawer-dl",children:[u.jsxs("div",{className:"drawer__dl-head",children:[u.jsxs("span",{className:"drawer__dl-pct",children:[y.percent||0,"%"]}),u.jsxs("span",{className:"drawer__dl-stats",children:[y.total?`${h(y.transferred)} / ${h(y.total)} MB`:`${h(y.transferred)} MB`,y.bytesPerSec?` · ${h(y.bytesPerSec)} MB/s`:"",y.etaSec?` · ${r("updateBanner.eta","剩 {{s}}s",{s:y.etaSec})}`:""]})]}),u.jsx("div",{className:"drawer__dl-track",children:u.jsx("span",{className:"drawer__dl-fill",style:{width:`${y.percent||0}%`}})})]})})(),u.jsx("div",{className:"drawer__log","data-id":"UpdateDrawer-log",ref:b,children:s.logs.length===0?u.jsx("div",{className:"drawer__log-empty",children:r("updateDrawer.preparing","准备中…")}):s.logs.map(y=>u.jsxs("div",{className:"drawer__line","data-status":y.status,children:[u.jsx("span",{className:"drawer__t",children:y.t}),u.jsx("span",{className:`drawer__badge drawer__badge--${y.phase}`,children:kh(y.phase)}),u.jsx("span",{className:"drawer__linemsg",children:y.message})]},y.id))}),o&&_&&u.jsx("div",{className:"drawer__hint","data-id":"UpdateDrawer-stuck",children:r("updateDrawer.stuckHint","正在等待新版本就绪,耗时比平常久。可以放到后台继续,完成或失败都会提示。")}),u.jsx("div",{className:"drawer__foot",children:_?u.jsx(u.Fragment,{children:u.jsx("span",{className:"drawer__foot-status",children:s.kind==="app"?r("updateBanner.downloading","正在下载更新")+"…":r("updateDrawer.inProgress","更新进行中…")})}):s.status==="ready"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("updateBanner.readyShort","下载完成")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-install",onClick:()=>s.onInstall&&s.onInstall(),children:r("updateBanner.installBtn","立即安装")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-later",onClick:()=>ve.close(),children:r("updateBanner.later","稍后")})]}):s.status==="error"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-error",children:r("updateDrawer.failed","更新失败")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-dismiss",onClick:()=>ve.close(),children:r("common.close","关闭")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("updateDrawer.updatedLatest","已更新到最新")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-finish",onClick:()=>ve.close(),children:r("common.done","完成")})]})})]})})}function Cp(){var La;const[s,v]=A.useState(void 0);A.useEffect(()=>{var w,O;if(!((O=(w=window.cicy)==null?void 0:w.terms)!=null&&O.status)){v(!0);return}window.cicy.terms.status(Zh).then(G=>v(!!(G!=null&&G.accepted))).catch(()=>v(!0))},[]),A.useEffect(()=>{var G,I,at,At;const w=document.documentElement;try{w.setAttribute("data-platform",((G=window.cicy)==null?void 0:G.platform)||"linux")}catch{}w.setAttribute("data-fullscreen","0");let O;try{O=(At=(at=(I=window.cicy)==null?void 0:I.window)==null?void 0:at.onFullscreen)==null?void 0:At.call(at,St=>w.setAttribute("data-fullscreen",St?"1":"0"))}catch{}return()=>{try{O&&O()}catch{}}},[]),A.useEffect(()=>{var O,G;if(!((G=(O=window.cicy)==null?void 0:O.docker)!=null&&G.onAppProgress))return;const w=window.cicy.docker.onAppProgress(I=>{!I||I.phase==="open"||(Jt||Ut.open({source:"auto"}),(Jt==null?void 0:Jt.source)==="auto"&&(I.phase==="done"&&(I.status==="done"||I.status==="reboot")?Ut.finish({ok:I.status==="done",status:I.status==="reboot"?"reboot":void 0,message:I.message}):I.status==="error"?Ut.finish({ok:!1,message:I.message}):Ut.push(I)))});return()=>{try{w&&w()}catch{}}},[]);const[b,o]=A.useState(()=>Ll(Rl)),[g,_]=A.useState(()=>Ll(lc)),[m,f]=A.useState(()=>Ll(Hi)),[y,h]=A.useState(()=>!Ll(Rl)),[q,j]=A.useState(!1),[B,Y]=A.useState(!1),[et,$]=A.useState(""),[st,wt]=A.useState(""),[Bt,gt]=A.useState(!1),[Rt,yt]=A.useState(""),[Ht,C]=A.useState(""),[L,p]=A.useState(null),[M,U]=A.useState(null),[K,lt]=A.useState(!1),[rt,pt]=A.useState(""),N=A.useRef(!1),[H,nt]=A.useState(null),[_t,Dt]=A.useState(!1),[S,X]=A.useState(!1),[P,ut]=A.useState({}),xt=A.useCallback(async()=>{var w,O,G;try{const I=await((G=(O=(w=window.cicy)==null?void 0:w.localTeams)==null?void 0:O.avatars)==null?void 0:G.call(O));ut(I&&typeof I=="object"?I:{})}catch{}},[]),[Ct,Mt]=A.useState(!1),[re,qt]=A.useState(!1),[Ze,it]=A.useState(""),[Vt,Ee]=A.useState(""),[Wt,Ue]=A.useState(!1),[Ve,ze]=A.useState(""),[Be,Oa]=A.useState("all"),[$t,aa]=A.useState(()=>{try{return JSON.parse(localStorage.getItem("cicy_hubs")||"[]")}catch{return[]}}),[ge,Sa]=A.useState(null),[de,F]=A.useState({}),[ht,ct]=A.useState(!1),[ot,Lt]=A.useState(null),[Q,tt]=A.useState(""),[J,ft]=A.useState(""),[bt,Qt]=A.useState(""),[ne,jt]=A.useState(null),[kt,Me]=A.useState(""),[te,Ne]=A.useState(null),wa=w=>{aa(w);try{localStorage.setItem("cicy_hubs",JSON.stringify(w))}catch{}},Je=(w,O)=>wa($t.map(G=>G.id===w?{...G,...Object.fromEntries(Object.entries(O).filter(([,I])=>I!==void 0))}:G)),al=w=>{wa($t.filter(O=>O.id!==w)),F(O=>{const G={...O};return delete G[w],G}),ge===w&&Sa(null)},ln=w=>{const O=String(w||"").trim();if(!O)return null;try{const G=JSON.parse(O);if(G&&G.url){try{new URL(G.url)}catch{return null}return{url:String(G.url).replace(/\/$/,""),token:String(G.token||"")}}}catch{try{return new URL(O),{url:O.replace(/\/$/,""),token:""}}catch{return null}}return null},uc=()=>{Lt(null),tt(""),ft(""),Qt(""),ct(!0)},Zi=w=>{Lt(w.id),tt(JSON.stringify({v:1,type:"hub",url:w.url,token:w.token||""})),ft(w.name||""),Qt(""),ct(!0)},Yl=()=>{const w=ln(Q);if(!w){Qt(r("hub.badPaste","无法解析,请粘贴 Hub 的 JSON(需含 url)"));return}if(ot)Je(ot,{url:w.url,token:w.token,name:J.trim()||void 0}),F(O=>({...O,[ot]:void 0}));else{const O=`hub-${Date.now()}`,G=J.trim()||`Hub${$t.length+1}`;wa([...$t,{id:O,name:G,url:w.url,token:w.token}]),Sa(O)}ct(!1)};A.useEffect(()=>{!ge&&$t.length&&Sa($t[0].id)},[$t,ge]);const un=A.useCallback(async w=>{var O,G;if(!(!w||!((G=(O=window.cicy)==null?void 0:O.cloud)!=null&&G.fetch))){F(I=>({...I,[w.id]:null}));try{const I=String(w.url||"").replace(/\/$/,"");let at="";try{at=new URL(I).host}catch{}const At=await window.cicy.cloud.fetch(`${I}/_agents`,{headers:w.token?{Authorization:`Bearer ${w.token}`}:{}});let St=[];if(At!=null&&At.ok){const ee=JSON.parse(At.body||"{}");St=(Array.isArray(ee==null?void 0:ee.teams)?ee.teams:[]).map(fe=>({id:String(fe.team),name:String(fe.team),org:fe.org||"",host_url:`https://${fe.team}.${at}`,agents:Array.isArray(fe.agents)?fe.agents:[]}))}F(ee=>({...ee,[w.id]:St}))}catch{F(I=>({...I,[w.id]:[]}))}}},[]);A.useEffect(()=>{if(!ge)return;const w=$t.find(O=>O.id===ge);w&&de[ge]===void 0&&un(w)},[ge,$t,de,un]);const Gl=A.useCallback(async(w,O)=>{var I,at,At,St;if(!w)return;if(!((at=(I=window.cicy)==null?void 0:I.cloud)!=null&&at.fetch)){pt("cloud fetch bridge missing");return}lt(!0),pt("");const G={Authorization:`Bearer ${w}`};try{const[ee,fe]=await Promise.all([window.cicy.cloud.fetch(`${el}/api/user/self`,{headers:G}),window.cicy.cloud.fetch(`${el}/api/teams`,{headers:G})]);if((fe==null?void 0:fe.status)===401){if(!N.current&&((St=(At=window.cicy)==null?void 0:At.auth)!=null&&St.loginStart)){N.current=!0,pt(r("auth.sessionExpired","会话已过期,正在重新登录…"));try{await window.cicy.auth.loginStart()}catch{}}return}if(fe!=null&&fe.ok){const De=JSON.parse(fe.body||"{}");U(Array.isArray(De==null?void 0:De.teams)?De.teams:[])}else U(De=>De===null?[]:De);if(ee!=null&&ee.ok)try{const De=JSON.parse(ee.body||"{}");p((De==null?void 0:De.success)===!1?null:(De==null?void 0:De.data)||null)}catch{p(null)}else p(null)}catch{pt(""),U(fe=>fe===null?[]:fe)}finally{lt(!1)}},[]),cn=A.useRef("");A.useEffect(()=>{cn.current=b||g||""},[b,g]);const _a=A.useCallback(async()=>{var O,G;const w=cn.current;if(!(!w||!((G=(O=window.cicy)==null?void 0:O.cloud)!=null&&G.fetch)))try{const I=await window.cicy.cloud.fetch(`${el}/api/teams`,{headers:{Authorization:`Bearer ${w}`}});if(I!=null&&I.ok){const at=JSON.parse(I.body||"{}");Array.isArray(at==null?void 0:at.teams)&&U(at.teams)}}catch{}},[]),Ql=A.useCallback(async(w,O)=>{var at,At;const G=cn.current,I=String(O||"").trim();if(!G||!((At=(at=window.cicy)==null?void 0:at.cloud)!=null&&At.fetch)||!I)return{ok:!1,error:"no session / empty"};try{const St=await window.cicy.cloud.fetch(`${el}/api/teams/${w}`,{method:"PATCH",headers:{Authorization:`Bearer ${G}`,"Content-Type":"application/json"},body:JSON.stringify({title:I})});return St!=null&&St.ok?(await _a(),{ok:!0}):{ok:!1,error:`${(St==null?void 0:St.status)||"?"} ${(St==null?void 0:St.error)||""}`}}catch(St){return{ok:!1,error:St.message}}},[_a]),Xl=A.useCallback(async(w,O)=>{var at,At;const G=cn.current,I=String(O||"").trim();if(!G||!((At=(at=window.cicy)==null?void 0:at.cloud)!=null&&At.fetch)||!I)return{ok:!1,error:"no session / empty"};try{new URL(I)}catch{return{ok:!1,error:"地址格式不对(需 http(s)://…)"}}try{const St=await window.cicy.cloud.fetch(`${el}/api/teams/${w}`,{method:"PATCH",headers:{Authorization:`Bearer ${G}`,"Content-Type":"application/json"},body:JSON.stringify({hostUrl:I})});return St!=null&&St.ok?(await _a(),{ok:!0}):{ok:!1,error:`${(St==null?void 0:St.status)||"?"} ${(St==null?void 0:St.error)||""}`}}catch(St){return{ok:!1,error:St.message}}},[_a]),Zl=A.useCallback(async w=>{var G,I;const O=cn.current;if(!O||!((I=(G=window.cicy)==null?void 0:G.cloud)!=null&&I.fetch)){Nt.show({message:r("common.noAuth","未登录"),status:"error",ttl:5e3});return}try{const at=await window.cicy.cloud.fetch(`${el}/api/teams/${w.id}`,{method:"DELETE",headers:{Authorization:`Bearer ${O}`}});at!=null&&at.ok||(at==null?void 0:at.status)===200||(at==null?void 0:at.status)===204?(Nt.show({message:r("teamCard.deleted","团队已删除"),status:"done",ttl:3e3}),await _a()):Nt.show({message:`${r("teamCard.deleteFailed","删除失败")}: ${(at==null?void 0:at.status)||"?"} ${(at==null?void 0:at.error)||""}`,status:"error",ttl:7e3})}catch(at){Nt.show({message:`${r("teamCard.deleteFailed","删除失败")}: ${at.message}`,status:"error",ttl:7e3})}},[_a]);A.useEffect(()=>{const w=b||g;w?Gl(w,m):U(O=>O===null?[]:O)},[b,g,m,Gl]);const We=A.useCallback(async()=>{var w,O;if((O=(w=window.cicy)==null?void 0:w.localTeams)!=null&&O.list){Dt(!0);try{const G=await window.cicy.localTeams.list({refresh:!0,uid:Ll(Hi)||""});nt(Array.isArray(G)?G:[])}catch{nt([])}finally{Dt(!1),X(!0)}}},[]);async function Vl(){if(Wt)return;const w=Vt.trim();if(!w){ze(r("teams.urlRequired","请输入地址 URL"));return}try{new URL(w)}catch{ze(r("teams.badUrl","URL 无效(需含 http(s)://)"));return}ze(""),Ue(!0);try{const O=await window.cicy.localTeams.add({base_url:w,name:Ze.trim(),failIfExists:!0});if(!O||O.ok===!1){ze((O==null?void 0:O.error)==="exists"?r("teams.urlExists","该地址已存在"):nn((O==null?void 0:O.error)||"add failed"));return}await We(),it(""),Ee(""),qt(!1)}catch(O){ze(nn((O==null?void 0:O.message)||String(O)))}finally{Ue(!1)}}const Ta=A.useCallback(async(w,O)=>{var I,at;if(!((at=(I=window.cicy)==null?void 0:I.localTeams)!=null&&at.update))return{ok:!1,error:"no_bridge"};let G;try{G=await window.cicy.localTeams.update(w,{name:String(O||"").trim()||r("localTeams.unnamed","未命名")})}catch(At){G={ok:!1,error:(At==null?void 0:At.message)||String(At)}}return await We(),G||{ok:!1,error:"no_result"}},[We]);A.useEffect(()=>{let w,O=!1;const G=3e3,I=3e4,at=async()=>{var ee,fe,De;try{await((De=(fe=(ee=window.cicy)==null?void 0:ee.localTeams)==null?void 0:fe.syncCloud)==null?void 0:De.call(fe))}catch{}await Promise.all([We(),_a(),xt()])},At=()=>{if(O)return;const ee=document.visibilityState==="visible";w=setTimeout(async()=>{document.visibilityState==="visible"?await at():await We(),At()},ee?G:I)};at(),At();const St=()=>{document.visibilityState==="visible"&&at()};return document.addEventListener("visibilitychange",St),window.addEventListener("focus",St),()=>{O=!0,clearTimeout(w),document.removeEventListener("visibilitychange",St),window.removeEventListener("focus",St)}},[We,_a]),A.useEffect(()=>{var O,G;if(!((G=(O=window.cicy)==null?void 0:O.localTeams)!=null&&G.onWebviewRelay))return;const w=window.cicy.localTeams.onWebviewRelay(async({reqId:I,msg:at})=>{let At={ok:!1,error:"unknown relay type"};try{(at==null?void 0:at.type)==="localTeams:add"?At=await window.cicy.localTeams.add(at.spec||{}):(at==null?void 0:at.type)==="localTeams:remove"?At=await window.cicy.localTeams.remove(at.id):(at==null?void 0:at.type)==="localTeams:update"?At=await window.cicy.localTeams.update(at.id,at.patch||{}):(at==null?void 0:at.type)==="localTeams:upgrade"?At=await window.cicy.localTeams.upgrade(at.id):(at==null?void 0:at.type)==="localTeams:list"&&(At={ok:!0,teams:await window.cicy.localTeams.list({refresh:!0})}),We()}catch(St){At={ok:!1,error:(St==null?void 0:St.message)||String(St)}}try{window.cicy.localTeams.replyWebviewRelay(I,At)}catch{}});return()=>{try{w==null||w()}catch{}}},[We]);const _e=A.useCallback(async w=>{var O,G;if((G=(O=window.cicy)==null?void 0:O.localTeams)!=null&&G.open)try{await window.cicy.localTeams.open(w)}catch{}},[]);A.useEffect(()=>{var O,G;if(Ll(Rl)){h(!1);return}if(!((G=(O=window.cicy)==null?void 0:O.auth)!=null&&G.getSaved)){h(!1);return}let w=!1;return(async()=>{try{const I=await window.cicy.auth.getSaved();if(w)return;if(I!=null&&I.token){try{localStorage.setItem(Rl,I.token)}catch{}if(o(I.token),I.accessToken){try{localStorage.setItem(lc,I.accessToken)}catch{}_(I.accessToken)}if(I.userId){try{localStorage.setItem(Hi,String(I.userId))}catch{}f(String(I.userId))}}}catch{}finally{w||h(!1)}})(),()=>{w=!0}},[]),A.useEffect(()=>{var w,O;if((O=(w=window.cicy)==null?void 0:w.auth)!=null&&O.onComplete)return window.cicy.auth.onComplete(G=>{if(j(!1),gt(!1),G!=null&&G.error){yt(nn(G.error));return}if(G!=null&&G.token){N.current=!1,pt("");try{localStorage.setItem(Rl,G.token)}catch{}if(o(G.token),G.accessToken){try{localStorage.setItem(lc,G.accessToken)}catch{}_(G.accessToken)}if(G.userId){try{localStorage.setItem(Hi,String(G.userId))}catch{}f(String(G.userId))}yt(""),C(G.reused?r("auth.welcomeBack","已恢复你之前的登录"):r("auth.loginSuccess","登录成功")),setTimeout(()=>C(""),3e3)}})},[]);async function Ye(){var w,O;if(!(B||q)){if(!((O=(w=window.cicy)==null?void 0:w.auth)!=null&&O.loginStart)){yt("auth bridge missing");return}yt(""),Y(!0);try{const G=await window.cicy.auth.loginStart();if(!(G!=null&&G.ok)){yt(nn((G==null?void 0:G.error)||"login start failed"));return}$(G.url||""),j(!0)}catch(G){yt(nn((G==null?void 0:G.message)||String(G)))}finally{Y(!1)}}}async function Ua(){var O,G;if(B)return;if(!((G=(O=window.cicy)==null?void 0:O.auth)!=null&&G.emailLoginStart)){yt("auth bridge missing");return}const w=st.trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(w)){yt(r("auth.badEmail","请输入有效的邮箱地址"));return}yt(""),Y(!0);try{const I=await window.cicy.auth.emailLoginStart(w);if(!(I!=null&&I.ok)){yt(nn((I==null?void 0:I.error)||"email login failed"));return}gt(!0)}catch(I){yt(nn((I==null?void 0:I.message)||String(I)))}finally{Y(!1)}}function Kl(){var w,O,G;try{localStorage.removeItem(Rl),localStorage.removeItem(lc),localStorage.removeItem(Hi)}catch{}try{(G=(O=(w=window.cicy)==null?void 0:w.auth)==null?void 0:O.logout)==null||G.call(O)}catch{}o(null),_(null),f(null),p(null),U(null),yt(""),pt("")}if(s===void 0)return u.jsxs("div",{className:"shell","data-id":"TermsCheckingSplash",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(To,{}),u.jsx("div",{className:"spinner-row",children:u.jsx(Xe,{})})]})]});if(!s)return u.jsx(Kh,{onAgree:()=>v(!0)});if(!b&&y)return u.jsxs("div",{className:"shell","data-id":"AuthRestoringSplash",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(To,{}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Xe,{}),u.jsx("span",{children:r("auth.restoring","正在恢复登录…")})]})]})]});if(!b)return u.jsxs("div",{className:"shell",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(To,{}),!q&&!Bt&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline",children:r("auth.tagline","登录以同步你的团队、配置与 AI 助手")}),u.jsx("label",{className:"login-label","data-id":"EmailLoginLabel",htmlFor:"cicy-email-login",children:r("auth.emailLabel","输入邮箱,用邮件链接登录")}),u.jsx("input",{id:"cicy-email-login",type:"email",className:"login-email-input","data-id":"EmailLoginInput",value:st,onChange:w=>wt(w.target.value),onKeyDown:w=>{w.key==="Enter"&&Ua()},placeholder:r("auth.emailPlaceholder","you@example.com"),autoComplete:"email",spellCheck:!1,autoFocus:!0}),u.jsx("button",{className:"btn-primary","data-id":"EmailLoginSubmit",onClick:Ua,disabled:B,children:B?u.jsxs(u.Fragment,{children:[u.jsx(Xe,{}),u.jsx("span",{children:r("auth.sending","发送中…")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{children:r("auth.emailLogin","发送登录链接")}),u.jsx(Xi,{})]})}),u.jsx("p",{className:"hint",children:r("auth.emailHint","手机上点邮件里的链接,也能登录这台电脑")}),u.jsx("div",{className:"login-divider","data-id":"LoginDivider",children:u.jsx("span",{children:r("auth.or","或")})}),u.jsx("button",{className:"btn-ghost","data-id":"BrowserLoginBtn",onClick:Ye,disabled:B,children:B?r("auth.opening","打开中…"):r("auth.browserLogin","用浏览器登录(Google / SSO,仅同一台电脑)")})]}),Bt&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline","data-id":"EmailSentTagline",children:r("auth.emailSentTagline","登录邮件已发送")}),u.jsxs("p",{className:"hint","data-id":"EmailSentHint",style:{textAlign:"center"},children:[r("auth.emailSentHint","到邮箱打开链接即可(手机、电脑都行),这里会自动登录。"),u.jsx("br",{}),st]}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Xe,{}),u.jsx("span",{children:r("auth.emailWaiting","等待确认…")})]}),u.jsx("button",{className:"btn-ghost","data-id":"EmailSentCancel",onClick:()=>{var w,O,G;(G=(O=(w=window.cicy)==null?void 0:w.auth)==null?void 0:O.emailLoginCancel)==null||G.call(O),gt(!1)},children:r("auth.cancel","取消")})]}),q&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline",children:r("auth.waitingTagline","已在浏览器打开登录页,等待你完成…")}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Xe,{}),u.jsx("span",{children:r("auth.waitingCallback","等待回调")})]}),et&&u.jsxs("div",{className:"login-fallback","data-id":"LoginUrlFallback",style:{marginTop:10,textAlign:"center"},children:[u.jsx("p",{className:"hint",style:{marginBottom:6},children:r("auth.browserNotOpened","浏览器没自动打开?")}),u.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-open",onClick:()=>{var w,O,G;try{(G=(O=(w=window.cicy)==null?void 0:w.shell)==null?void 0:O.openExternal)==null||G.call(O,et)}catch{}},children:r("auth.openManually","手动打开登录页")}),u.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-copy",onClick:()=>{var w;try{(w=navigator.clipboard)==null||w.writeText(et),C(r("auth.linkCopied","链接已复制,粘到浏览器打开")),setTimeout(()=>C(""),2500)}catch{}},children:r("auth.copyLink","复制链接")}),u.jsx("p",{className:"hint","data-id":"LoginUrlFallback-url",style:{wordBreak:"break-all",marginTop:6,fontSize:11,opacity:.7,userSelect:"text"},children:et})]}),u.jsx("button",{className:"btn-ghost",onClick:()=>{var w,O,G;(G=(O=(w=window.cicy)==null?void 0:w.auth)==null?void 0:O.loginCancel)==null||G.call(O),j(!1),$("")},children:r("auth.cancel","取消")})]}),Rt&&u.jsx("div",{className:"error",children:Rt})]})]});const Ca=(H||[]).find(w=>Uh(w.base_url))||null,sn=Ca&&Ca.cloud_team_id?(M||[]).find(w=>String(w.teamId||w.id)===String(Ca.cloud_team_id)):null,Jl=w=>{if(!w)return null;const O=(M||[]).find(G=>String(G.teamId||G.id)===String(w));return O&&O.code||null},Na=(H||[]).filter(w=>Eo(w.base_url)),nl=(H||[]).filter(w=>!Eo(w.base_url)&&!Uh(w.base_url)),Ba=Na.length+(Ca?1:0),Ra=nl.length,on=(M||[]).filter(w=>!w.is_local&&w.kind!=="local"&&(w.kind==="private"||w.team_kind==="personal")),Ha=on.length,xe=Be==="all"||Be==="local",Vi=Be==="all"||Be==="custom",Ki=Be==="all"||Be==="cloud",na=H===null||M===null;return u.jsxs("div",{className:"shell shell--app",children:[u.jsx("div",{className:"glow glow--app","aria-hidden":!0}),u.jsxs("div",{className:"shell__left",children:[u.jsx(Ep,{me:L,welcome:Ht,onLogout:Kl,mitmTeam:Na.length>0?Na[0]:null}),u.jsx(Up,{}),u.jsxs("main",{className:"main",children:[u.jsxs("div",{className:"app__tabsrow",children:[u.jsx("div",{className:"app__tabs",children:[{k:"all",label:r("teamFilter.all","全部"),n:Ba+Ra+Ha},{k:"local",label:r("teamFilter.local","本地"),n:Ba},{k:"cloud",label:r("teamFilter.cloud","私有云"),n:Ha},{k:"custom",label:r("teamFilter.custom","自定义"),n:Ra}].map(({k:w,label:O,n:G})=>u.jsxs("button",{type:"button",className:`app__tab ${Be===w?"is-active":""}`,onClick:()=>Oa(w),children:[O,u.jsx("span",{className:"app__tab-count",children:G})]},w))}),u.jsxs("div",{"data-id":"AddTeamWrap",style:{position:"relative"},children:[u.jsxs("button",{type:"button","data-id":"AddTeamButton",className:"app__add-team",title:r("teams.addHint","添加团队"),onClick:()=>Mt(w=>!w),children:["+ ",r("teams.add","新加团队")]}),Ct&&u.jsxs(u.Fragment,{children:[u.jsx("div",{onClick:()=>Mt(!1),style:{position:"fixed",inset:0,zIndex:40}}),u.jsxs("div",{"data-id":"AddTeamMenu",role:"menu",style:{position:"absolute",top:"calc(100% + 6px)",right:0,zIndex:41,minWidth:240,background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:10,boxShadow:"0 10px 30px rgba(0,0,0,.45)",overflow:"hidden"},children:[u.jsxs("button",{type:"button","data-id":"AddTeamMenu-custom",className:"bcard__menu-item",style:{display:"block",width:"100%",textAlign:"left",padding:"11px 14px",border:"none",background:"transparent",cursor:"pointer",color:"inherit"},onClick:()=>{Mt(!1),ze(""),qt(!0)},children:[u.jsx("div",{style:{fontSize:13,fontWeight:600},children:r("teams.addCustom","自定义团队")}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:2},children:r("teams.addCustomSub","手动输入地址和名称(只存本地)")})]}),u.jsxs("button",{type:"button","data-id":"AddTeamMenu-private",className:"bcard__menu-item",style:{display:"block",width:"100%",textAlign:"left",padding:"11px 14px",border:"none",borderTop:"1px solid var(--border, #2c2f36)",background:"transparent",cursor:"pointer",color:"inherit"},onClick:()=>{Mt(!1),Qi("?tab=private")},children:[u.jsx("div",{style:{fontSize:13,fontWeight:600},children:r("teams.addPrivate","私有云团队")}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:2},children:r("teams.addPrivateSub","去云端团队中心添加")})]})]})]})]})]}),re&&u.jsx("div",{"data-id":"CustomTeamModal",style:{position:"fixed",inset:0,zIndex:60,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:w=>{!Wt&&w.target===w.currentTarget&&qt(!1)},children:u.jsxs("div",{onClick:w=>w.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("teams.customTitle","添加自定义团队")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:r("teams.customSub","连接到一个已有的 cicy-code 地址")}),u.jsx("label",{style:{display:"block",fontSize:12,opacity:.75,marginBottom:6},children:r("teams.customNameLabel","名称")}),u.jsx("input",{"data-id":"CustomTeamModal-title",className:"login-email-input",style:{width:"100%",marginBottom:14},value:Ze,onChange:w=>it(w.target.value),placeholder:r("teams.customNamePlaceholder","我的团队"),spellCheck:!1,autoFocus:!0}),u.jsx("label",{style:{display:"block",fontSize:12,opacity:.75,marginBottom:6},children:r("teams.customUrlLabel","地址 URL")}),u.jsx("input",{"data-id":"CustomTeamModal-url",className:"login-email-input",style:{width:"100%",marginBottom:6},value:Vt,onChange:w=>Ee(w.target.value),placeholder:"https://example.com:8008",spellCheck:!1,onKeyDown:w=>{w.key==="Enter"&&Vl()}}),Ve&&u.jsx("div",{className:"error",style:{marginTop:10},children:Ve}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost","data-id":"CustomTeamModal-cancel",disabled:Wt,onClick:()=>qt(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"CustomTeamModal-submit",disabled:Wt,onClick:Vl,children:Wt?r("teams.adding","添加中…"):r("teams.addAction","添加")})]})]})}),rt&&u.jsxs("div",{className:"error",style:{marginBottom:12},children:[r("common.cloud","云端"),": ",rt,u.jsx("button",{className:"btn-ghost",style:{marginLeft:8},onClick:()=>Gl(b||g,m),children:r("common.retry","重试")})]}),u.jsxs("div",{className:"app__grid",children:[na&&[0,1,2].map(w=>u.jsx(Hh,{},"skc"+w)),!na&&xe&&Na.map(w=>u.jsx(Oh,{team:w,cloudCode:Jl(w.cloud_team_id),onOpen:()=>_e(w.id),onRename:Ta,onRefresh:We},"local:"+w.id)),!na&&xe&&u.jsx(Mp,{dockerTeam:Ca,onOpen:async()=>{var w,O,G;try{const I=await((G=(O=(w=window.cicy)==null?void 0:w.docker)==null?void 0:O.appOpen)==null?void 0:G.call(O));I!=null&&I.ok||Nt.show({id:"docker-open",status:"error",ttl:6e3,message:r("docker.openNoToken","服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。")})}catch(I){console.warn("[DockerCard] open",I)}},cloudTitle:sn==null?void 0:sn.title,cloudCode:sn==null?void 0:sn.code,onRename:Ca!=null&&Ca.cloud_team_id?(w=>Ql(Ca.cloud_team_id,w)):void 0,onRefresh:We}),!na&&Vi&&nl.map(w=>u.jsx(Oh,{team:w,cloudCode:Jl(w.cloud_team_id),onOpen:()=>_e(w.id),onRename:Ta,onRefresh:We},"custom:"+w.id)),!na&&Ki&&on.map(w=>u.jsx(Op,{team:w,onOpen:()=>{var G,I,at;const O=w.kind==="private"?w.host_url:w.workspace_url||w.workspace_direct_url;O&&((at=(I=(G=window.cicy)==null?void 0:G.tabs)==null?void 0:I.open)==null||at.call(I,O,w.name||w.title||"",P[w.id]||"",!0,w.id))},avatar:P[w.id]||"",onAvatar:xt,onRename:Ql,onEditUrl:Xl,onDelete:Zl},"cloud:"+w.id))]}),!K&&!rt&&M&&M.length===0&&!(H!=null&&H.length)&&u.jsx("div",{className:"empty",style:{marginTop:14},children:r("teams.emptyHint","还没有团队 — 安装本地 cicy-code 起一个本地 team,或在云端创建。")}),u.jsx("div",{"data-id":"SectionHead-hub",className:"app__tabsrow",style:{marginTop:26},children:u.jsxs("div",{className:"app__tabs","data-id":"HubTabs",children:[$t.map(w=>ne===w.id?u.jsx("input",{"data-id":"HubTab-rename",autoFocus:!0,className:"app__tab hubtab",value:kt,onChange:O=>Me(O.target.value),onBlur:()=>{const O=kt.trim();O&&Je(w.id,{name:O}),jt(null)},onKeyDown:O=>{if(O.key==="Enter"){const G=kt.trim();G&&Je(w.id,{name:G}),jt(null)}else O.key==="Escape"&&jt(null)},style:{font:"inherit",padding:"4px 10px",border:"1px solid #3b82f6",borderRadius:999,background:"#0d1117",color:"#e6edf3"}},w.id):u.jsxs("div",{"data-id":"HubTab",className:`app__tab hubtab ${ge===w.id?"is-active":""}`,onClick:()=>Sa(w.id),title:w.url,children:[u.jsx("span",{className:"hubtab__name",onDoubleClick:O=>{O.stopPropagation(),Me(w.name),jt(w.id)},children:w.name}),u.jsxs("span",{className:"hubtab__actions",children:[u.jsx("button",{type:"button","data-id":"HubTab-edit-btn",title:r("hub.editAddr","编辑地址"),onClick:O=>{O.stopPropagation(),Zi(w)},children:"⚙"}),u.jsx("button",{type:"button","data-id":"HubTab-del-btn",className:"is-danger",title:r("common.delete","删除"),onClick:O=>{O.stopPropagation(),Ne(w.id)},children:"✕"})]})]},w.id)),u.jsxs("button",{type:"button","data-id":"HubTab-add",className:"app__tab",style:{opacity:.75},onClick:uc,children:["+ ",r("hub.add","添加 Hub")]})]})}),u.jsx("div",{className:"app__grid","data-id":"HubTeamsGrid",children:$t.length?de[ge]===void 0||de[ge]===null?[0,1,2].map(w=>u.jsx(Hh,{},"hubteamskel"+w)):de[ge].length?de[ge].map(w=>{const O=$t.find(at=>at.id===ge),G=(O==null?void 0:O.token)||"",I=G?`${w.host_url}?token=${encodeURIComponent(G)}`:w.host_url;return u.jsx(Lp,{team:w,onOpen:()=>{var at,At,St;return(St=(At=(at=window.cicy)==null?void 0:at.tabs)==null?void 0:At.open)==null?void 0:St.call(At,I,w.name,"",!0,`${ge}:${w.id}`)}},w.id)}):u.jsx("div",{className:"empty",style:{gridColumn:"1/-1"},children:r("hub.noTeams","该 Hub 暂无在线 team")}):u.jsx("div",{className:"empty",style:{gridColumn:"1/-1"},children:r("hub.empty","还没有 Hub —— 点「添加 Hub」粘贴 Hub 的 JSON")})}),ht&&(()=>{const w=ot?$t.find(I=>I.id===ot):null,O=w?{url:w.url,token:w.token||""}:ln(Q),G=O&&O.url?JSON.stringify({v:1,type:"hub",url:O.url,token:O.token||""}):"";return u.jsx("div",{"data-id":"HubModal",style:{position:"fixed",inset:0,zIndex:60,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:I=>{I.target===I.currentTarget&&ct(!1)},children:u.jsxs("div",{onClick:I=>I.stopPropagation(),style:{width:G?600:460,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:ot?r("hub.editTitle","编辑 Hub"):r("hub.addTitle","添加 Hub")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:r("hub.pasteSub","粘贴 Hub 的 JSON(含 url、token),只存在本地(不上云)。")}),u.jsxs("div",{style:{display:"flex",gap:20,alignItems:"flex-start"},children:[u.jsxs("div",{style:{flex:1,minWidth:0},children:[u.jsx("div",{style:{fontSize:12,opacity:.7,marginBottom:6},children:r("hub.name","名称(可选)")}),u.jsx("input",{"data-id":"HubModal-name",className:"login-email-input",style:{width:"100%"},value:J,placeholder:"Hub1",onChange:I=>ft(I.target.value)}),u.jsx("div",{style:{fontSize:12,opacity:.7,margin:"12px 0 6px"},children:r("hub.paste","Hub JSON")}),u.jsx("textarea",{"data-id":"HubModal-paste",className:"login-email-input",style:{width:"100%",minHeight:120,fontFamily:"var(--mono)",fontSize:11,resize:"vertical"},spellCheck:!1,value:Q,placeholder:'{"v":1,"type":"hub","url":"https://hub.cicy-ai.com","token":"…"}',onChange:I=>{tt(I.target.value),Qt("")}}),bt&&u.jsx("div",{className:"error",style:{marginTop:8,fontSize:12},children:bt})]}),G&&u.jsxs("div",{"data-id":"HubModal-qr",style:{flex:"none",width:172,textAlign:"center"},children:[u.jsx(qp,{text:G,size:172}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:8,lineHeight:1.5},children:r("hub.scan","用 CiCy Mobile 扫码添加此 Hub")})]})]}),u.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginTop:18,gap:12},children:[u.jsxs("button",{type:"button","data-id":"HubModal-repo",title:"https://github.com/cicy-ai/cicy-hub",onClick:()=>{var I,at,At;return(At=(at=(I=window.cicy)==null?void 0:I.tabs)==null?void 0:at.openIn)==null?void 0:At.call(at,Vh,"https://github.com/cicy-ai/cicy-hub","cicy-hub")},style:{flex:"1 1 auto",minWidth:0,display:"inline-flex",alignItems:"center",gap:6,border:"none",background:"transparent",cursor:"pointer",color:"var(--muted, #8b949e)",fontSize:12,fontFamily:"var(--mono)",padding:0,overflow:"hidden"},children:[u.jsx(Yp,{}),u.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:"cicy-ai/cicy-hub"})]}),u.jsxs("div",{style:{flex:"none",display:"flex",gap:8},children:[u.jsx("button",{type:"button",className:"btn-ghost","data-id":"HubModal-cancel",style:{whiteSpace:"nowrap"},onClick:()=>ct(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"HubModal-save",style:{whiteSpace:"nowrap"},disabled:!Q.trim(),onClick:Yl,children:r("common.save","保存")})]})]})]})})})(),te&&da.createPortal(u.jsx("div",{"data-id":"HubDelModal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:w=>{w.target===w.currentTarget&&Ne(null)},children:u.jsxs("div",{onClick:w=>w.stopPropagation(),style:{width:360,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("hub.deleteTitle","删除 Hub")}),u.jsxs("div",{style:{fontSize:13,opacity:.7,marginBottom:16},children:[r("hub.deleteConfirm","确定删除")," “",((La=$t.find(w=>w.id===te))==null?void 0:La.name)||"","”?"]}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:()=>Ne(null),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary",style:{background:"#b42318"},onClick:()=>{al(te),Ne(null)},children:r("common.delete","删除")})]})]})}),document.body)]})]}),u.jsx(_p,{}),u.jsx(Tp,{}),u.jsx(zp,{})]})}function jp({onClose:s}){const[v,b]=A.useState(null),[o,g]=A.useState(""),[_,m]=A.useState(!1),[f,y]=A.useState(""),h=typeof window<"u"&&window.cicy&&window.cicy.trustedOrigins||null,q=A.useCallback(async()=>{try{b(h&&await h.list()||[])}catch{b([])}},[h]);A.useEffect(()=>{q()},[q]);const j=async()=>{const et=o.trim();if(!(!et||_||!h)){m(!0),y("");try{const $=await h.add(et);$&&$.ok===!1?y($.error||r("trustedSites.addFailed","添加失败")):(g(""),b($&&$.origins||await h.list()))}catch($){y(String($&&$.message||$))}finally{m(!1)}}},B=async et=>{if(!(_||!h)){m(!0),y("");try{const $=await h.remove(et);$&&$.ok===!1?y($.error||r("trustedSites.removeFailed","删除失败")):b($&&$.origins||await h.list())}catch($){y(String($&&$.message||$))}finally{m(!1)}}},Y={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:et=>({flex:1,fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:13,color:et?"#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 da.createPortal(u.jsx("div",{style:Y.overlay,onMouseDown:et=>{et.target===et.currentTarget&&s()},"data-id":"TrustedSitesModal",children:u.jsxs("div",{style:Y.card,onClick:et=>et.stopPropagation(),children:[u.jsxs("div",{style:Y.head,children:[u.jsx("h2",{style:Y.title,children:r("trustedSites.title","受信任站点")}),u.jsx("button",{type:"button",style:Y.x,onClick:s,"aria-label":"close",children:"✕"})]}),u.jsx("div",{style:Y.warn,children:r("trustedSites.warn","⚠ 列表中的站点可以在你的电脑上执行命令(exec)。只添加你完全信任的地址。")}),u.jsxs("div",{style:Y.addRow,children:[u.jsx("input",{"data-id":"trusted-sites-input",style:Y.input,value:o,onChange:et=>g(et.target.value),onKeyDown:et=>{et.key==="Enter"&&j()},placeholder:r("trustedSites.placeholder","添加站点,如 app.cicy-ai.com 或 my-cloud.example.org")}),u.jsx("button",{type:"button","data-id":"trusted-sites-add",style:{...Y.addBtn,opacity:_||!o.trim()?.5:1},onClick:j,disabled:_||!o.trim(),children:r("trustedSites.add","添加")})]}),f&&u.jsx("div",{style:Y.err,children:f}),u.jsx("div",{style:Y.listWrap,children:v===null?u.jsx("div",{style:Y.muted,children:r("trustedSites.loading","加载中…")}):v.length===0?u.jsx("div",{style:Y.muted,children:r("trustedSites.empty","暂无")}):v.map(et=>u.jsxs("div",{style:Y.row,"data-id":"trusted-sites-row",children:[u.jsx("span",{style:Y.host(et.builtin),children:et.host}),et.builtin?u.jsx("span",{style:Y.tag,children:r("trustedSites.builtin","系统")}):u.jsx("button",{type:"button",style:Y.rm,onClick:()=>B(et.host),disabled:_,children:r("trustedSites.remove","删除")})]},et.host))})]})}),document.body)}function Ap({onClose:s}){const[v,b]=A.useState(null),[o,g]=A.useState(""),[_,m]=A.useState(""),[f,y]=A.useState(!1),h=typeof window<"u"&&window.cicy&&window.cicy.rpcAudit||null,q=A.useCallback(async()=>{y(!0),g("");try{const p=h&&await h.tail(400);!p||p.ok===!1?(g(p&&p.error||r("audit.loadFailed","读取失败")),b([])):(b(p.entries||[]),m(p.path||""))}catch(p){g(String(p&&p.message||p)),b([])}finally{y(!1)}},[h]);A.useEffect(()=>{q()},[q]);const[j,B]=A.useState("all"),[Y,et]=A.useState(""),$=p=>{try{return new Date(p).toLocaleString()}catch{return p||""}},st=p=>{if(p.kind==="auth"){const M=/deny/.test(p.decision||"");return{text:p.decision||"auth",color:M?"#fca5a5":"#86efac",bg:M?"rgba(239,68,68,.14)":"rgba(34,197,94,.14)"}}if(p.kind==="rpc"){const M=p.ok!==!1&&!p.error;return{text:M?"ok":"err",color:M?"#86efac":"#fca5a5",bg:M?"rgba(34,197,94,.14)":"rgba(239,68,68,.14)"}}return{text:p.kind||"log",color:"#a1a1aa",bg:"rgba(255,255,255,.06)"}},wt=p=>p.kind==="auth"?`${p.gate||""}${p.decision?" · "+p.decision:""}`:p.kind==="rpc"?`${p.tool||""}${p.dangerous?" ⚠":""}`:p.kind||"",Bt=p=>p.error||p.args||(p.kind==="rpc"?p.channel:"")||"",gt=v||[],Rt=Y.trim().toLowerCase(),yt=gt.filter(p=>j!=="all"&&p.kind!==j?!1:Rt?[p.origin,p.host,p.tool,p.gate,p.decision,p.channel,p.args,p.error,p.kind].filter(Boolean).join(" ").toLowerCase().includes(Rt):!0),Ht="186px 104px minmax(160px,1.1fr) minmax(150px,1.1fr) minmax(220px,1.8fr)",C={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:p=>({background:p?"rgba(255,255,255,.14)":"transparent",border:"1px solid rgba(255,255,255,.12)",borderRadius:999,padding:"6px 16px",color:p?"#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:Ht,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:Ht,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:p=>({justifySelf:"start",fontSize:11.5,color:p.color,background:p.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}},L=p=>u.jsx("div",{children:p});return da.createPortal(u.jsx("div",{style:C.overlay,onMouseDown:p=>{p.target===p.currentTarget&&s()},"data-id":"AuditLogModal",children:u.jsxs("div",{style:C.card,onClick:p=>p.stopPropagation(),children:[u.jsxs("div",{style:C.head,children:[u.jsxs("div",{style:C.titleWrap,children:[u.jsx("h2",{style:C.title,children:r("audit.title","审计日志")}),_&&u.jsx("p",{style:C.subtitle,children:_})]}),u.jsxs("span",{style:C.count,children:[r("audit.count","共")," ",yt.length,j!=="all"||Rt?` / ${gt.length}`:""]}),u.jsx("button",{type:"button","data-id":"audit-refresh",style:{...C.refresh,opacity:f?.5:1},onClick:q,disabled:f,children:r("audit.refresh","刷新")}),u.jsx("button",{type:"button",style:C.x,onClick:s,"aria-label":"close",children:"✕"})]}),u.jsxs("div",{style:C.toolbar,children:[u.jsxs("div",{style:C.chips,children:[u.jsx("button",{type:"button",style:C.chip(j==="all"),onClick:()=>B("all"),children:r("audit.all","全部")}),u.jsx("button",{type:"button",style:C.chip(j==="rpc"),onClick:()=>B("rpc"),children:r("audit.rpc","RPC 调用")}),u.jsx("button",{type:"button",style:C.chip(j==="auth"),onClick:()=>B("auth"),children:r("audit.auth","授权决定")})]}),u.jsx("input",{"data-id":"audit-search",style:C.search,value:Y,onChange:p=>et(p.target.value),placeholder:r("audit.search","搜索来源 / 工具 / 命令…")})]}),o&&u.jsx("div",{style:C.err,children:o}),u.jsxs("div",{style:C.tableWrap,children:[u.jsxs("div",{style:C.theadRow,children:[L(r("audit.colTime","时间")),L(r("audit.colType","类型")),L(r("audit.colSource","来源")),L(r("audit.colOp","操作")),L(r("audit.colDetail","详情"))]}),v===null?u.jsx("div",{style:C.muted,children:r("audit.loading","加载中…")}):yt.length===0?u.jsx("div",{style:C.muted,children:gt.length===0?r("audit.empty","暂无审计记录"):r("audit.noMatch","无匹配记录")}):yt.map((p,M)=>{const U=st(p);return u.jsxs("div",{style:C.row,"data-id":"audit-row",children:[u.jsx("span",{style:C.time,children:$(p.ts)}),u.jsx("span",{style:C.badge(U),children:U.text}),u.jsx("span",{style:C.cell,children:p.origin||p.host||"—"}),u.jsx("span",{style:C.cell,children:wt(p)||"—"}),u.jsx("span",{style:C.detail,children:Bt(p)||"—"})]},M)})]})]})}),document.body)}function Ep({me:s,welcome:v,onLogout:b,mitmTeam:o}){const g=(s==null?void 0:s.display_name)||(s==null?void 0:s.username)||"…",_=g.slice(0,1).toUpperCase(),[m,f]=A.useState(!1),[y,h]=A.useState("");A.useEffect(()=>{var K,lt;if(!((lt=(K=window.cicy)==null?void 0:K.sidecar)!=null&&lt.tunnelStatus))return;let p=!1;const M=()=>window.cicy.sidecar.tunnelStatus().then(rt=>{if(p||!(rt!=null&&rt.ok))return;let pt=rt.tier;if(!pt){const N=Number(rt.tunnelLimit??rt.tunnel_limit);Number.isFinite(N)&&(pt=N<0?"enterprise":N>0?"team":"personal")}pt&&h(String(pt))}).catch(()=>{});M();const U=setInterval(M,6e4);return()=>{p=!0,clearInterval(U)}},[]);const[q,j]=A.useState(!1),[B,Y]=A.useState(!1),[et,$]=A.useState(!1),[st,wt]=A.useState(!1),[Bt,gt]=A.useState(""),Rt=A.useRef(null);A.useEffect(()=>{var M,U,K;let p=!0;return(K=(U=(M=window.cicy)==null?void 0:M.app)==null?void 0:U.getVersion)==null||K.call(U).then(lt=>{p&&gt(typeof lt=="string"?lt:String((lt==null?void 0:lt.desktop)||""))}).catch(()=>{}),()=>{p=!1}},[]),A.useEffect(()=>{if(!m)return;const p=M=>{Rt.current&&!Rt.current.contains(M.target)&&f(!1)};return document.addEventListener("mousedown",p),()=>document.removeEventListener("mousedown",p)},[m]);const yt=p=>{Qi(p),f(!1)},Ht=async()=>{var M,U;const p=String((s==null?void 0:s.email)||"").trim();if(p)try{(U=(M=window.cicy)==null?void 0:M.clipboard)!=null&&U.write?await window.cicy.clipboard.write(p):await navigator.clipboard.writeText(p),f(!1),Nt.show({message:r("userMenu.emailCopied","邮箱已复制"),status:"done",ttl:2500})}catch{Nt.show({message:r("userMenu.emailCopyFailed","邮箱复制失败"),status:"error",ttl:3500})}},C=async()=>{var p,M,U;f(!1),wt(!0),Nt.show({id:"app-update",message:r("updateBanner.checking","正在检查更新…"),status:"running"});try{const K=await((U=(M=(p=window.cicy)==null?void 0:p.app)==null?void 0:M.checkUpdate)==null?void 0:U.call(M));(K==null?void 0:K.status)==="available"?Nt.show({id:"app-update",message:r("updateBanner.available","发现新版本 v{{v}}",{v:K.version}),status:"done",ttl:4e3}):(K==null?void 0:K.status)==="up-to-date"?Nt.show({id:"app-update",message:r("updateBanner.upToDate","已是最新版本 v{{v}}",{v:K.version||K.current}),status:"done",ttl:3e3}):Nt.show({id:"app-update",message:r("updateBanner.error","更新失败")+(K!=null&&K.error?`:${K.error}`:""),status:"error",ttl:5e3})}catch(K){Nt.show({id:"app-update",message:K.message,status:"error",ttl:5e3})}finally{wt(!1)}},L=(()=>{const p=String(y||"").toLowerCase().trim();return p?{personal:r("plan.personal","个人版"),team:r("plan.team","团队版"),enterprise:r("plan.enterprise","企业版")}[p]||p:""})();return u.jsxs(u.Fragment,{children:[u.jsx("header",{className:"topbar",children:u.jsxs("div",{className:"user-chip","data-id":"UserChip",ref:Rt,children:[v&&u.jsx("span",{className:"welcome",children:v}),L&&u.jsx("span",{"data-id":"UserChip-plan",className:"plan-badge",title:r("plan.hint","当前账号版本"),style:{fontSize:11,fontWeight:600,lineHeight:1.6,padding:"2px 9px",borderRadius:999,whiteSpace:"nowrap",background:"var(--accent-soft, rgba(120,140,255,.16))",color:"var(--accent, #9db0ff)"},children:L}),s?u.jsxs("button",{type:"button","data-id":"UserChip-trigger",className:`user-chip__trigger${m?" is-open":""}`,onClick:()=>f(p=>!p),children:[u.jsx("div",{className:"avatar",children:_}),u.jsx("span",{className:"user-name",children:g}),u.jsx("span",{className:"user-chip__caret","aria-hidden":!0,children:"▾"})]}):u.jsxs("div",{className:"user-chip__trigger user-chip__trigger--skel","data-id":"UserChip-skeleton","aria-hidden":!0,children:[u.jsx("div",{className:"skel skel--avatar"}),u.jsx("div",{className:"skel skel--name"})]}),m&&u.jsxs("div",{className:"user-chip__menu","data-id":"UserChip-menu",role:"menu",children:[(s==null?void 0:s.email)&&u.jsx("button",{type:"button","data-id":"UserChip-email-copy",className:"user-chip__menu-item",title:r("userMenu.copyEmail","点击复制邮箱"),onClick:Ht,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.email}),u.jsx("button",{type:"button","data-id":"UserChip-wallet",className:"user-chip__menu-item",onClick:()=>yt("/wallet"),children:r("userMenu.wallet","我的钱包")}),u.jsx("button",{type:"button","data-id":"UserChip-trusted-sites",className:"user-chip__menu-item",onClick:()=>{f(!1),j(!0)},children:r("trustedSites.menu","受信任站点")}),u.jsx("button",{type:"button","data-id":"UserChip-audit-log",className:"user-chip__menu-item",onClick:()=>{f(!1),Y(!0)},children:r("audit.menu","审计日志")}),u.jsx("button",{type:"button","data-id":"UserChip-terms",className:"user-chip__menu-item",onClick:()=>{f(!1),$(!0)},children:r("firstRunTerms.menu","用户协议")}),u.jsx("button",{type:"button","data-id":"UserChip-check-update",className:"user-chip__menu-item",disabled:st,onClick:C,children:st?r("updateBanner.checkingShort","检查中…"):r("updateBanner.checkBtn","检查更新")}),!1,u.jsx("div",{className:"user-chip__menu-sep","aria-hidden":!0}),u.jsx("button",{type:"button","data-id":"UserChip-logout",className:"user-chip__menu-item is-danger",onClick:()=>{f(!1),b()},children:r("userMenu.logout","退出")}),u.jsxs("div",{className:"user-chip__menu-version","data-id":"UserChip-version",children:["CiCy Desktop ",Bt?`v${Bt}`:"…"]})]})]})}),q&&u.jsx(jp,{onClose:()=>j(!1)}),B&&u.jsx(Ap,{onClose:()=>Y(!1)}),et&&u.jsx(Kh,{onClose:()=>$(!1)})]})}function Kh({onAgree:s,onClose:v}){var et;const[b,o]=A.useState(!1),[g,_]=A.useState(!1),m=(((et=window.cicyI18n)==null?void 0:et.locale)||"en").startsWith("zh")?"zh-CN":"en",f=($,st)=>r(`firstRunTerms.${$}`,st),y=!!v,h=A.useMemo(()=>Sp(vp(m)),[m]),q=$=>{const st=$.currentTarget;st.scrollHeight-st.scrollTop-st.clientHeight<24&&o(!0)},j=A.useRef(null);A.useEffect(()=>{const $=j.current;$&&$.scrollHeight<=$.clientHeight+24&&o(!0)},[]);const B=async()=>{var $,st,wt;if(!(g||!b)){_(!0);try{await((wt=(st=($=window.cicy)==null?void 0:$.terms)==null?void 0:st.agree)==null?void 0:wt.call(st,Zh)),s==null||s()}catch{s==null||s()}}},Y=()=>{var $,st,wt;try{(wt=(st=($=window.cicy)==null?void 0:$.terms)==null?void 0:st.decline)==null||wt.call(st)}catch{}};return u.jsxs("div",{className:y?"terms-gate terms-gate--review":"shell terms-gate","data-id":"FirstRunTermsGate",style:y?{position:"fixed",inset:0,zIndex:1e3,background:"rgba(8,9,14,.72)",backdropFilter:"blur(4px)"}:void 0,onClick:y?$=>{$.target===$.currentTarget&&v()}:void 0,children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"terms-gate__panel",children:[u.jsx("h1",{className:"terms-gate__title","data-id":"FirstRunTermsGate-title",children:f("title","用户协议与授权说明")}),u.jsx("p",{className:"terms-gate__subtitle",children:f("subtitle","使用 CiCy Desktop 前,请阅读并同意以下条款")}),u.jsx("div",{className:"terms-gate__body",ref:j,onScroll:q,"data-id":"FirstRunTermsGate-body",children:u.jsx("div",{className:"terms-md","data-id":"FirstRunTermsGate-md",dangerouslySetInnerHTML:{__html:h}})}),y?u.jsx("div",{className:"terms-gate__actions",children:u.jsx("button",{"data-id":"FirstRunTermsGate-close",className:"terms-gate__btn",onClick:v,children:f("close","关闭")})}):u.jsxs(u.Fragment,{children:[!b&&u.jsx("div",{className:"terms-gate__scrollhint","data-id":"FirstRunTermsGate-scrollhint",children:f("scrollHint","请阅读至底部以继续")}),u.jsxs("div",{className:"terms-gate__actions",children:[u.jsx("button",{"data-id":"FirstRunTermsGate-decline",className:"terms-gate__btn terms-gate__btn--ghost",onClick:Y,children:f("decline","不同意并退出")}),u.jsx("button",{"data-id":"FirstRunTermsGate-agree",className:"terms-gate__btn",disabled:!b||g,title:b?"":f("mustAgree","未同意则无法使用本软件。"),onClick:B,children:f("agree","同意并继续")})]})]})]})]})}const Ao=new Set;let zh=0,Jt=null;function Hl(){Ao.forEach(s=>s(Jt))}const Ut={open({onRetry:s,kind:v,source:b}={}){Jt={status:"running",phase:"install-docker",kind:v||"install",source:b||"op",logs:[],bars:{},minimized:!1,onRetry:s||null,lastAt:Date.now()},Hl()},minimize(){Jt&&(Jt={...Jt,minimized:!0},Hl())},restore(){Jt&&(Jt={...Jt,minimized:!1},Hl())},push(s={}){var m;if(!Jt)return;const v=s.phase==="health"?"container":s.phase||Jt.phase,b={...Jt,phase:v,lastAt:Date.now()},o=Number.isFinite(s.progress),g=v==="install-docker"||v==="image";if(g&&(o||s.dest||s.url)){const f=((m=Jt.bars)==null?void 0:m[v])||{},y=o?s.progress:s.status==="skip"||s.status==="done"?100:f.progress;b.bars={...Jt.bars,[v]:{progress:y,received:s.received??f.received,total:s.total??f.total,url:s.url||f.url,dest:s.dest||f.dest}}}if(!(s.status==="running"&&o&&g)){const f=Jt.logs[Jt.logs.length-1],y=s.status||"running",h=s.message||"";if(!(f&&f.phase===v&&f.status===y&&f.message===h)){const q={id:++zh,t:Yi(),phase:v,status:y,message:h};b.logs=[...Jt.logs,q]}}Jt=b,Hl()},finish({ok:s,message:v,status:b}={}){if(!Jt||Jt.status!=="running")return;const o=b||(s?"done":"error"),g=o==="error"?Jt.phase:"done",_={id:++zh,t:Yi(),phase:g,status:o,message:v||(s?"完成":"失败")};Jt={...Jt,status:o,phase:g,minimized:!1,logs:[...Jt.logs,_],lastAt:Date.now()},Hl()},close(){Jt=null,Hl()}},_o=[["install-docker","准备环境"],["image","下载运行环境"],["container","启动服务"],["done","完成"]],Np={"install-docker":"准备",image:"下载",container:"启动",health:"启动",done:"完成",open:"打开"},Dp={"install-docker":"Docker Desktop",image:"基础镜像"};function Mh(s){return Number.isFinite(s)?s<1024?s+" B":s<1048576?(s/1024).toFixed(0)+" KB":s<1073741824?(s/1048576).toFixed(1)+" MB":(s/1073741824).toFixed(2)+" GB":"?"}function kp({phaseKey:s,bar:v}){const b=Number.isFinite(v==null?void 0:v.progress)?Math.max(0,Math.min(100,v.progress)):0,o=b>=100;return u.jsxs("div",{className:"dlbar","data-id":`DockerDrawer-dlbar-${s}`,children:[u.jsxs("div",{className:"dlbar__head",children:[u.jsx("span",{className:"dlbar__name",children:Dp[s]||s}),u.jsxs("span",{className:"dlbar__pct",children:[b,"%",v!=null&&v.total?` · ${Mh(v.received)} / ${Mh(v.total)}`:""]})]}),u.jsx("div",{className:"dlbar__track",children:u.jsx("div",{className:`dlbar__fill${o?" is-done":""}`,style:{width:`${b}%`}})}),(v==null?void 0:v.url)&&u.jsxs("div",{className:"dlbar__url",title:v.url,children:[u.jsx("span",{className:"dlbar__urlk",children:"源"})," ",v.url]}),(v==null?void 0:v.dest)&&u.jsxs("div",{className:"dlbar__url",title:v.dest,children:[u.jsx("span",{className:"dlbar__urlk",children:"存"})," ",v.dest]})]})}function zp(){var y;const[s,v]=A.useState(Jt);A.useEffect(()=>(Ao.add(v),()=>{Ao.delete(v)}),[]);const b=A.useRef(null);if(A.useEffect(()=>{const h=b.current;h&&(h.scrollTop=h.scrollHeight)},[(y=s==null?void 0:s.logs)==null?void 0:y.length]),!s)return null;const o=s.status==="running",g=s.kind==="open",_=_o.findIndex(([h])=>h===s.phase),m=g?[]:["install-docker","image"].filter(h=>{var q;return(q=s.bars)==null?void 0:q[h]}),f=g?r("docker.openTitle","打开 Docker 团队"):r("docker.setupTitle","安装 Docker cicy-code");if(s.minimized){const h=m.map(j=>{var B;return(B=s.bars[j])==null?void 0:B.progress}).filter(Number.isFinite),q=h.length?Math.round(h.reduce((j,B)=>j+B,0)/h.length):null;return u.jsxs("button",{type:"button",className:`drawer-min drawer-min--${s.status}`,"data-id":"DockerDrawer-restore",onClick:()=>Ut.restore(),children:[u.jsx("span",{className:"drawer-min__spark",children:o?u.jsx(Xe,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("span",{className:"drawer-min__label",children:[f,q!=null?` · ${q}%`:""]})]})}return u.jsx("div",{className:"drawer-scrim","data-id":"DockerDrawer-scrim",onClick:()=>o?Ut.minimize():Ut.close(),children:u.jsxs("div",{className:"drawer","data-id":"DockerDrawer","data-status":s.status,onClick:h=>h.stopPropagation(),children:[u.jsxs("div",{className:"drawer__head",children:[u.jsxs("div",{className:"drawer__title",children:[u.jsx("span",{className:`drawer__spark drawer__spark--${s.status}`,children:o?u.jsx(Xe,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("div",{children:[u.jsx("div",{className:"drawer__h",children:f}),u.jsx("div",{className:"drawer__sub",children:"127.0.0.1:8008"})]})]}),u.jsx("div",{className:"drawer__headbtns",children:u.jsx("button",{type:"button",className:"drawer__x","data-id":"DockerDrawer-min",title:r("common.minimize","最小化"),onClick:()=>Ut.minimize(),"aria-label":"minimize",children:"‒"})})]}),!g&&u.jsx("div",{className:"drawer__steps","data-id":"DockerDrawer-steps",children:_o.map(([h,q],j)=>{const B=s.status==="done"||_>=0&&j<_,Y=j===_&&o,et=s.status==="error"&&j===_;return u.jsxs("div",{className:`drawer__step${Y?" is-active":""}${B?" is-done":""}${et?" is-error":""}`,children:[u.jsx("span",{className:"drawer__step-dot",children:B?"✓":et?"!":j+1}),u.jsx("span",{className:"drawer__step-label",children:q}),j<_o.length-1&&u.jsx("span",{className:"drawer__step-bar"})]},h)})}),m.length>0&&u.jsx("div",{className:"drawer__dlbars","data-id":"DockerDrawer-dlbars",children:m.map(h=>u.jsx(kp,{phaseKey:h,bar:s.bars[h]},h))}),o&&s.logs.length>0&&u.jsxs("div",{className:"drawer__now","data-id":"DockerDrawer-now",children:[u.jsx(Xe,{}),u.jsx("span",{children:s.logs[s.logs.length-1].message})]}),u.jsx("div",{className:"drawer__log drawer__log--scroll","data-id":"DockerDrawer-log",ref:b,children:s.logs.length===0?u.jsx("div",{className:"drawer__log-empty",children:r("docker.preparing","准备中…")}):s.logs.map(h=>u.jsxs("div",{className:"drawer__line","data-status":h.status,children:[u.jsx("span",{className:"drawer__t",children:h.t}),u.jsx("span",{className:`drawer__badge drawer__badge--${h.phase}`,children:r(`dockerBadge.${h.phase}`,Np[h.phase]||h.phase)}),u.jsx("span",{className:"drawer__linemsg",children:h.message})]},h.id))}),u.jsx("div",{className:"drawer__foot",children:o?u.jsx(u.Fragment,{children:u.jsx("span",{className:"drawer__foot-status",children:g?r("docker.opening","打开中…"):r("docker.installing2","安装进行中…")})}):s.status==="reboot"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-reboot",children:r("docker.rebootShort","需重启 Windows")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>Ut.close(),children:r("common.close","关闭")})]}):s.status==="error"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-error",children:g?r("docker.openFailed","打开失败"):r("docker.failed","安装失败")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>Ut.close(),children:r("common.close","关闭")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("docker.ready","已就绪")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-finish",onClick:()=>Ut.close(),children:r("common.done","完成")})]})})]})})}function Mp({dockerTeam:s,cloudTitle:v,cloudCode:b,onOpen:o,onRename:g,onRefresh:_}){var de;const[m,f]=A.useState(null),[y,h]=A.useState(""),[q,j]=A.useState(!1),[B,Y]=A.useState(!1),[et,$]=A.useState(!1),[st,wt]=A.useState(!1),[Bt,gt]=A.useState([]),[Rt,yt]=A.useState(!1),[Ht,C]=A.useState(""),[L,p]=A.useState(!1),[M,U]=A.useState(""),K=v||"Docker 团队",lt=F=>{var ht;(ht=F==null?void 0:F.stopPropagation)==null||ht.call(F),U(K),p(!0)},rt=async()=>{p(!1);const F=String(M||"").trim();if(!(!F||F===K||!g))try{await g(F),_==null||_()}catch{}},[pt,N]=A.useState({top:0,left:0}),H=A.useRef(null),nt=A.useRef(null),_t=184,Dt="#2496ed",S=A.useCallback(async()=>{var F,ht,ct;try{const ot=await((ct=(ht=(F=window.cicy)==null?void 0:F.docker)==null?void 0:ht.appStatus)==null?void 0:ct.call(ht));f(ot);const Lt=Date.now()-((Jt==null?void 0:Jt.lastAt)||0)>3e4;ot!=null&&ot.running&&Jt&&Jt.status==="running"&&Jt.kind!=="open"&&Lt&&Ut.finish({ok:!0,message:"Docker cicy-code 已就绪"})}catch(ot){console.warn("[DockerCard]",ot)}},[]);A.useEffect(()=>{S();const F=setInterval(()=>{y||S()},12e3);return()=>clearInterval(F)},[S,y]);const X=A.useCallback(async()=>{var F,ht,ct;j(!1),C("");try{const ot=await((ct=(ht=(F=window.cicy)==null?void 0:F.docker)==null?void 0:ht.getPorts)==null?void 0:ct.call(ht));gt(((ot==null?void 0:ot.ports)||[]).map(String))}catch{gt([])}wt(!0)},[]),P=A.useCallback(async()=>{var ot,Lt,Q,tt,J,ft,bt,Qt,ne;const F=new Set,ht=[];for(const jt of Bt){const kt=String(jt).trim();if(!kt)continue;const Me=Number(kt);if(!Number.isInteger(Me)||Me<1||Me>65535||Me===8008||F.has(Me)){C(r("docker.ports.invalid","有端口无效(1-65535,不能是 8008,不能重复)"));return}F.add(Me),ht.push(Me)}C(""),yt(!0),wt(!1),h("recreate"),Ut.open({onRetry:P});const ct=(Q=(Lt=(ot=window.cicy)==null?void 0:ot.docker)==null?void 0:Lt.onAppProgress)==null?void 0:Q.call(Lt,jt=>Ut.push(jt));try{const jt=await((ft=(J=(tt=window.cicy)==null?void 0:tt.docker)==null?void 0:J.setPorts)==null?void 0:ft.call(J,ht));if(Ut.finish({ok:!!(jt!=null&&jt.ok),message:jt!=null&&jt.ok?r("docker.ports.save","保存并重建")+" ✅":(jt==null?void 0:jt.error)||r("docker.opFailed","操作失败")}),jt!=null&&jt.ok)try{const kt=await((ne=(Qt=(bt=window.cicy)==null?void 0:bt.docker)==null?void 0:Qt.appRedetect)==null?void 0:ne.call(Qt));kt&&f(kt)}catch{}}catch(jt){Ut.finish({ok:!1,message:jt.message})}finally{try{ct&&ct()}catch{}yt(!1),h(""),S()}},[Bt,S]);A.useEffect(()=>{if(!q)return;const F=ct=>{var ot,Lt;(ot=H.current)!=null&&ot.contains(ct.target)||(Lt=nt.current)!=null&&Lt.contains(ct.target)||j(!1)},ht=ct=>{ct.key==="Escape"&&j(!1)};return document.addEventListener("mousedown",F),document.addEventListener("keydown",ht),()=>{document.removeEventListener("mousedown",F),document.removeEventListener("keydown",ht)}},[q]);const ut=()=>{if(!q&&H.current){const F=H.current.getBoundingClientRect(),ht=Math.max(8,Math.min(F.right-_t,window.innerWidth-_t-8));N({top:Math.round(F.bottom+4),left:Math.round(ht)})}j(F=>!F)},xt=A.useCallback(async()=>{var ht,ct,ot,Lt,Q,tt;h("bootstrap"),Ut.open({onRetry:xt});const F=(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.onAppProgress)==null?void 0:ot.call(ct,J=>Ut.push(J));try{const J=await((tt=(Q=(Lt=window.cicy)==null?void 0:Lt.docker)==null?void 0:Q.appBootstrap)==null?void 0:tt.call(Q));(J==null?void 0:J.reason)==="installer_launched"?Ut.finish({status:"reboot",message:r("docker.installerLaunched","已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」")}):(J==null?void 0:J.reason)==="wsl_reboot_required"?Ut.finish({status:"reboot",message:r("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):Ut.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?r("docker.ready","Docker cicy-code 已就绪"):(J==null?void 0:J.error)||r("docker.failed","安装失败")}),J!=null&&J.ok&&(_==null||_())}catch(J){Ut.finish({ok:!1,message:J.message})}finally{try{F&&F()}catch{}h(""),S()}},[S,_]),Ct=A.useCallback(async()=>{var ht,ct,ot,Lt,Q,tt;h("repair"),Ut.open({onRetry:Ct});const F=(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.onAppProgress)==null?void 0:ot.call(ct,J=>Ut.push(J));try{const J=await((tt=(Q=(Lt=window.cicy)==null?void 0:Lt.docker)==null?void 0:Q.appRepairWsl)==null?void 0:tt.call(Q));J!=null&&J.needsReboot?Ut.finish({status:"reboot",message:r("docker.wslNeedReboot","WSL 服务卡死,请【重启 Windows】;重启后打开 CiCy 会自动修复(旧数据已改名备份,不删)。")}):J!=null&&J.ok?(Ut.finish({ok:!0,message:r("docker.wslRepaired","WSL 已修复 ✅")}),_==null||_()):Ut.finish({ok:!1,message:(J==null?void 0:J.error)||r("docker.repairFailed","修复失败")})}catch(J){Ut.finish({ok:!1,message:J.message})}finally{try{F&&F()}catch{}h(""),S()}},[S,_]),Mt=A.useCallback(async()=>{var ht,ct,ot,Lt,Q,tt;j(!1),h("upgrade"),Ut.open({onRetry:Mt});const F=(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.onAppProgress)==null?void 0:ot.call(ct,J=>Ut.push(J));try{const J=await((tt=(Q=(Lt=window.cicy)==null?void 0:Lt.docker)==null?void 0:Q.appUpgrade)==null?void 0:tt.call(Q));(J==null?void 0:J.reason)==="wsl_reboot_required"?Ut.finish({status:"reboot",message:r("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):Ut.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?r("docker.upgraded","已升级到最新"):(J==null?void 0:J.error)||r("docker.upgradeFailed","升级失败")}),J!=null&&J.ok&&(_==null||_())}catch(J){Ut.finish({ok:!1,message:J.message})}finally{try{F&&F()}catch{}h(""),S()}},[S,_]),re=A.useCallback(async()=>{var ht,ct,ot,Lt,Q,tt,J,ft,bt,Qt,ne,jt;j(!1),h("update"),Ut.open({onRetry:re});const F=(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.onAppProgress)==null?void 0:ot.call(ct,kt=>Ut.push(kt));try{const kt=await((tt=(Q=(Lt=window.cicy)==null?void 0:Lt.docker)==null?void 0:Q.appUpdate)==null?void 0:tt.call(Q));if(Ut.finish({ok:!!(kt!=null&&kt.ok),message:kt!=null&&kt.ok?r("docker.updated","cicy-code 已更新到最新"):(kt==null?void 0:kt.error)||r("docker.updateFailed","更新失败")}),kt!=null&&kt.ok){_==null||_();try{(bt=(ft=(J=window.cicy)==null?void 0:J.tabs)==null?void 0:ft.reloadIfOpen)==null||bt.call(ft,"http://127.0.0.1:8008",r("docker.teamTab","Docker 团队"))}catch{}try{const Me=await((jt=(ne=(Qt=window.cicy)==null?void 0:Qt.docker)==null?void 0:ne.appRedetect)==null?void 0:jt.call(ne));Me&&f(Me)}catch{}}}catch(kt){Ut.finish({ok:!1,message:kt.message})}finally{try{F&&F()}catch{}h(""),S()}},[S,_]),qt=A.useCallback(async(F,ht,ct)=>{j(!1),h(F),Nt.show({id:"docker-op",message:r(`docker.${F}ing`,F==="restart"?"重启中…":F==="reload"?"刷新中…":"停止中…"),status:"running"});try{const ot=await ht();ot!=null&&ot.ok?Nt.show({id:"docker-op",message:ct,status:"done",ttl:2500}):Nt.show({id:"docker-op",message:(ot==null?void 0:ot.error)||r("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(ot){Nt.show({id:"docker-op",message:ot.message,status:"error",ttl:6e3})}finally{h(""),S()}},[S]),Ze=A.useCallback(async()=>{j(!1),h("authssh"),Nt.show({id:"docker-op",message:r("docker.authorizingHost","授权容器访问 Mac(配置 SSH)…"),status:"running"});try{const F=await window.cicy.docker.appAuthorizeHostSsh();F!=null&&F.ok?Nt.show({id:"docker-op",message:F.verified?r("docker.authorizedHostOk","已授权:容器内 `ssh mac` 可访问 Mac ✅"):r("docker.authorizedHostPartial","公钥已写入 Mac(未验证成功,可在容器内手动 `ssh mac` 试)"),status:F.verified?"done":"error",ttl:5e3}):Nt.show({id:"docker-op",message:(F==null?void 0:F.error)||r("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(F){Nt.show({id:"docker-op",message:F.message,status:"error",ttl:6e3})}finally{h(""),S()}},[S]),it=((de=window.cicy)==null?void 0:de.platform)||(m==null?void 0:m.platform);if(it!=="win32")return null;const Vt=m?!!m.running:(s==null?void 0:s.status)==="running",Ee=!!(m!=null&&m.dockerRunning),Wt=!!(m!=null&&m.installed),Ue=!!(m!=null&&m.unknown)&&!Vt&&!Ee&&!Wt,Ve=!!(m!=null&&m.wslUnmanaged),ze=!!(m!=null&&m.wslWedged),Be=Vt&&!Ve,Oa=Be?"ok":ze||Ve||Ee||Wt||Ue?"warn":"off",$t=!!y;ze?r("docker.wslWedged","WSL 卡死 · 点「修复 WSL」"):Ve?r("docker.wslBrokenRepair","WSL 管理异常 · 点「修复 WSL」重装"):Vt?r("docker.running","运行中"):Ee?r("docker.notRunning","未启动 · 点「启动」"):Wt?r("docker.engineDown","Docker 未运行 · 点启动"):Ue?r("docker.wslUnresponsive","WSL 未响应 · 点「重试检测」"):r("docker.notInstalled","Docker Desktop 未安装");const aa=y==="open"?r("docker.opening","打开中…"):y==="probe"?r("docker.probing","检测中…"):$t?r("docker.working","处理中…"):Be?r("localTeams.open","打开"):ze||Ve?r("docker.repairWsl","修复 WSL"):Ee?r("docker.start","启动"):Wt?r("docker.startDocker","启动 Docker"):Ue?r("docker.retryProbe","重试检测"):r("docker.install","下载安装"),ge=async()=>{var F,ht,ct,ot,Lt,Q,tt,J,ft,bt,Qt,ne;if(!$t){if(ze){Ct();return}if(Ve){xt();return}if(Be){try{const kt=await((ct=(ht=(F=window.cicy)==null?void 0:F.tabs)==null?void 0:ht.activateIfOpen)==null?void 0:ct.call(ht,"http://127.0.0.1:8008"));if(kt!=null&&kt.active)return}catch{}h("open");let jt=null;try{jt=await((Q=(Lt=(ot=window.cicy)==null?void 0:ot.docker)==null?void 0:Lt.appOpen)==null?void 0:Q.call(Lt))}catch(kt){jt={ok:!1,hint:(kt==null?void 0:kt.message)||r("docker.openFailed","打开失败"),log:[]}}h(""),jt&&jt.ok===!1&&(Ut.open({onRetry:ge,kind:"open"}),(jt.log||[]).forEach(kt=>Ut.push(kt)),Ut.finish({ok:!1,message:jt.hint||jt.error||r("docker.openFailed","打开失败")}));return}if(Ue){h("probe");try{const jt=await(((ft=(J=(tt=window.cicy)==null?void 0:tt.docker)==null?void 0:J.appRedetect)==null?void 0:ft.call(J))??((ne=(Qt=(bt=window.cicy)==null?void 0:bt.docker)==null?void 0:Qt.appStatus)==null?void 0:ne.call(Qt)));jt&&f(jt),jt!=null&&jt.unknown&&Nt.show({id:"docker-probe",status:"error",message:r("docker.wslStillStuck","WSL 仍无响应 —— 多半要重启 Windows 后再试"),ttl:6e3})}catch{Nt.show({id:"docker-probe",status:"error",message:r("docker.probeFailed","检测失败,请重试"),ttl:5e3})}finally{h("")}return}xt()}},Sa=Vt;return u.jsxs("div",{"data-id":"DockerCard",className:`bcard bcard--docker${Vt?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent",style:{background:Dt}}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",style:{color:Dt},children:[u.jsx("span",{className:"bcard__dot","data-tone":Oa}),u.jsx("svg",{style:{width:18,height:18},viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:u.jsx("path",{d:"M21.81 10.25c-.06-.05-.67-.51-1.95-.51-.34 0-.68.03-1.01.09-.25-1.69-1.64-2.51-1.7-2.55l-.34-.2-.22.32a4.5 4.5 0 0 0-.59 1.4c-.23.94-.09 1.83.39 2.59-.58.32-1.51.4-1.7.41H2.62a.61.61 0 0 0-.61.61 9.32 9.32 0 0 0 .57 3.35 4.9 4.9 0 0 0 1.95 2.53c.92.52 2.42.82 4.12.82.77 0 1.54-.07 2.3-.21a9.6 9.6 0 0 0 3-1.09 8.3 8.3 0 0 0 2.05-1.68c.98-1.11 1.56-2.35 1.99-3.45h.17c1.36 0 2.2-.55 2.66-1l.13-.16zM4.7 11.33h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H4.7a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.46 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16M7.16 9.06h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16"})})]}),Sa&&u.jsxs("div",{className:"bcard__menuwrap",onClick:F=>F.stopPropagation(),children:[u.jsx("button",{type:"button",ref:H,"data-id":"DockerCard-menu-btn",className:"bcard__kebab",title:r("docker.manage","管理 Docker cicy-code"),disabled:$t,onClick:ut,children:$t?u.jsx(Xe,{}):u.jsx(Do,{})}),q&&da.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"DockerCard-menu",role:"menu",ref:nt,style:{position:"fixed",top:pt.top,left:pt.left,width:_t},onClick:F=>F.stopPropagation(),children:[u.jsx("button",{type:"button","data-id":"DockerCard-update",className:"bcard__menu-item is-accent",onClick:re,children:r("docker.update","更新 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-restart",className:"bcard__menu-item",onClick:()=>qt("restart",()=>window.cicy.docker.appRestart(),r("docker.restarted","已重启 cicy-code")),children:r("docker.restart","重启 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-stop",className:"bcard__menu-item is-danger",onClick:()=>qt("stop",()=>window.cicy.docker.appStop(),r("docker.stopped","已停止 cicy-code")),children:r("docker.stop","停止 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-reload",className:"bcard__menu-item",onClick:F=>{var ht,ct,ot;F.stopPropagation(),j(!1),(ot=(ct=(ht=window.cicy)==null?void 0:ht.tabs)==null?void 0:ct.reloadIfOpen)==null||ot.call(ct,"http://127.0.0.1:8008","Docker 团队")},children:r("docker.reloadWindow","刷新窗口")}),u.jsx("button",{type:"button","data-id":"DockerCard-open-dir",className:"bcard__menu-item",onClick:F=>{var ht,ct,ot;F.stopPropagation(),j(!1),(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.openDir)==null||ot.call(ct)},children:r("docker.openWslDir","打开 WSL 目录")}),u.jsx("button",{type:"button","data-id":"DockerCard-open-projects",className:"bcard__menu-item",onClick:F=>{var ht,ct,ot;F.stopPropagation(),j(!1),(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.openDir)==null||ot.call(ct,"projects")},children:r("docker.openProjectsDir","打开项目目录")}),u.jsx("button",{type:"button","data-id":"DockerCard-dood",className:"bcard__menu-item",title:r("dood.hint","把宿主 Docker + docker 客户端挂进容器,容器内 agent 能直接跑 docker(切换会重建容器,秒生效、无需下载)"),onClick:F=>{F.stopPropagation(),j(!1),Y(!0)},children:r("dood.menu","容器内使用 Docker")}),u.jsx("button",{type:"button","data-id":"DockerCard-billing",className:"bcard__menu-item",onClick:()=>{j(!1),Qi(b||s!=null&&s.cloud_team_id?`?team=${encodeURIComponent(b||s.cloud_team_id)}`:"?view=usage")},children:r("docker.billing","帐单")}),u.jsx("div",{className:"bcard__menu-sep","data-id":"DockerCard-menu-sep",role:"separator","aria-hidden":!0}),it==="darwin"&&u.jsx("button",{type:"button","data-id":"DockerCard-authorize-host-ssh",className:"bcard__menu-item",title:r("docker.authorizeHostHint","把容器公钥加到 Mac 的 authorized_keys,容器内 `ssh mac` 即可访问本机"),onClick:Ze,children:r("docker.authorizeHost","授权容器访问 Mac")}),u.jsx("button",{type:"button","data-id":"DockerCard-docker-restart",className:"bcard__menu-item",onClick:()=>qt("restart",()=>window.cicy.docker.appDockerRestart(),r("docker.dockerRestarted","已重启 Docker 容器")),children:r("docker.dockerRestart","重启 Docker")}),u.jsx("button",{type:"button","data-id":"DockerCard-ports",className:"bcard__menu-item",onClick:F=>{F.stopPropagation(),X()},children:r("docker.ports.menu","端口设置")}),u.jsx("button",{type:"button","data-id":"DockerCard-recreate",className:"bcard__menu-item is-danger",onClick:F=>{F.stopPropagation(),j(!1),$(!0)},children:r("docker.recreate","重建 Docker")})]}),document.body)]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(ic,{size:24,avatar:s==null?void 0:s.avatar,name:K,teamId:s==null?void 0:s.id,onChanged:_}),L?u.jsx("input",{"data-id":"DockerCard-rename-input",autoFocus:!0,value:M,onChange:F=>U(F.target.value),onFocus:F=>F.target.select(),onBlur:rt,onClick:F=>F.stopPropagation(),onKeyDown:F=>{F.nativeEvent.isComposing||F.keyCode===229||(F.key==="Enter"?rt():F.key==="Escape"&&p(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:g?r("localTeams.renameHint","点名字或 ✎ 改名"):K,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:g?lt:void 0,children:[u.jsx("span",{onClick:g?lt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:g?"text":"default"},children:K}),g&&u.jsx("button",{type:"button","data-id":"DockerCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:lt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsxs("div",{className:"bcard__meta",children:[u.jsx("span",{className:"bcard__chip",children:"Docker"}),(m==null?void 0:m.version)&&u.jsxs("span",{className:"bcard__ver","data-id":"DockerCard-ver",style:{marginLeft:8,fontSize:11,opacity:.6},children:["v",m.version]})]})]}),u.jsxs("button",{type:"button",className:"bcard__cta","data-id":"DockerCard-cta",disabled:$t,onClick:ge,style:Vt?void 0:{background:Dt,color:"white"},children:[$t?u.jsx(Xe,{}):u.jsx(Xi,{}),u.jsx("span",{children:aa})]}),u.jsx(Hp,{open:B,onClose:()=>Y(!1),toastId:"docker-op"}),et&&da.createPortal(u.jsx("div",{"data-id":"DockerCard-recreate-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:F=>{F.target===F.currentTarget&&$(!1)},children:u.jsxs("div",{onClick:F=>F.stopPropagation(),style:{width:360,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[u.jsx("h3",{style:{margin:"0 0 8px",fontSize:16,color:"#e6edf3"},children:r("docker.recreate","重建 Docker")}),u.jsx("p",{style:{margin:"0 0 18px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:r("docker.recreateConfirm","会删除当前容器并重新创建(volume 数据保留),用于切换为独立 team 的网关 key。确定重建?")}),u.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[u.jsx("button",{type:"button","data-id":"DockerCard-recreate-cancel",onClick:()=>$(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:r("common.cancel","取消")}),u.jsx("button",{type:"button","data-id":"DockerCard-recreate-confirm",onClick:()=>{$(!1),qt("restart",()=>window.cicy.docker.appRecreate(),r("docker.recreated","已重建 Docker 容器"))},style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#da3633",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:r("docker.recreateOk","确定重建")})]})]})}),document.body),st&&da.createPortal(u.jsx("div",{"data-id":"DockerCard-ports-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:F=>{F.target===F.currentTarget&&wt(!1)},children:u.jsxs("div",{onClick:F=>F.stopPropagation(),style:{width:420,maxWidth:"92vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[u.jsx("h3",{style:{margin:"0 0 6px",fontSize:16,color:"#e6edf3"},children:r("docker.ports.title","端口设置")}),u.jsx("p",{style:{margin:"0 0 14px",fontSize:12.5,lineHeight:1.6,color:"#9aa4b2"},children:r("docker.ports.sub","除 :8008 外,额外发布、可从 Windows 直达容器内服务的端口")}),u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"8px 10px",marginBottom:10,borderRadius:8,background:"#0d1117",border:"1px solid #21262d",color:"#7d8590",fontSize:13},children:["🔒 ",r("docker.ports.mainFixed",":8008 · cicy-code(固定)")]}),u.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8,maxHeight:220,overflowY:"auto"},children:[Bt.length===0&&u.jsx("div",{style:{fontSize:12.5,color:"#6e7681",padding:"4px 2px"},children:r("docker.ports.none","暂无额外端口")}),Bt.map((F,ht)=>u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[u.jsx("input",{"data-id":`DockerCard-port-input-${ht}`,type:"text",inputMode:"numeric",value:F,placeholder:r("docker.ports.ph","端口号 1-65535"),onChange:ct=>{const ot=ct.target.value.replace(/[^0-9]/g,"");gt(Lt=>Lt.map((Q,tt)=>tt===ht?ot:Q)),C("")},style:{flex:1,padding:"7px 10px",borderRadius:8,border:"1px solid #30363d",background:"#0d1117",color:"#e6edf3",fontSize:13,fontFamily:"var(--mono)"}}),u.jsx("button",{type:"button","data-id":`DockerCard-port-remove-${ht}`,title:r("docker.ports.remove","移除"),onClick:()=>{gt(ct=>ct.filter((ot,Lt)=>Lt!==ht)),C("")},style:{padding:"6px 10px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#da3633",cursor:"pointer",fontSize:14},children:"✕"})]},ht))]}),u.jsx("button",{type:"button","data-id":"DockerCard-port-add",onClick:()=>gt(F=>[...F,""]),style:{marginTop:10,padding:"7px 12px",borderRadius:8,border:"1px dashed #30363d",background:"transparent",color:"#58a6ff",cursor:"pointer",fontSize:13,width:"100%"},children:r("docker.ports.add","+ 添加端口")}),Ht&&u.jsx("div",{style:{marginTop:10,fontSize:12.5,color:"#f85149"},children:Ht}),u.jsx("p",{style:{margin:"12px 0 16px",fontSize:11.5,lineHeight:1.5,color:"#6e7681"},children:r("docker.ports.hint","保存会重建容器(volume 数据保留),会有短暂中断")}),u.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[u.jsx("button",{type:"button","data-id":"DockerCard-ports-cancel",disabled:Rt,onClick:()=>wt(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:r("docker.ports.cancel","取消")}),u.jsx("button",{type:"button","data-id":"DockerCard-ports-save",disabled:Rt,onClick:P,style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#238636",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:Rt?r("docker.ports.saving","保存中…"):r("docker.ports.save","保存并重建")})]})]})}),document.body)]})}function Oh({team:s,cloudCode:v,onOpen:b,onRename:o,onRefresh:g}){var ht,ct,ot,Lt;const m=(Rh[s.status]||Rh.error).tone,[f,y]=A.useState(!1),[h,q]=A.useState(s.name||""),[j,B]=A.useState(null),[Y,et]=A.useState(""),$=j??s.name;A.useEffect(()=>{j!=null&&s.name===j&&B(null)},[s.name,j]);const st=Q=>{var tt;(tt=Q==null?void 0:Q.stopPropagation)==null||tt.call(Q),q($||""),y(!0)},wt=async()=>{y(!1);const Q=String(h||"").trim();if(!o||!Q||Q===$)return;B(Q),et("saving");let tt;try{tt=await o(s.id,Q)}catch(J){tt={ok:!1,error:J==null?void 0:J.message}}B(null),tt&&tt.ok?(et("saved"),setTimeout(()=>et(J=>J==="saved"?"":J),1500)):(et(""),Nt.show({message:r("localTeams.renameFailed","改名没保存,已恢复"),status:"error",ttl:4e3}))},gt=!!((ct=(ht=window.cicy)==null?void 0:ht.sidecar)!=null&&ct.restart)&&Eo(s.base_url),Rt=s.status==="running",[yt,Ht]=A.useState(""),[C,L]=A.useState(!1),[p,M]=A.useState(!1);A.useEffect(()=>{var Q,tt;!gt||!((tt=(Q=window.cicy)==null?void 0:Q.sidecar)!=null&&tt.getPublic)||window.cicy.sidecar.getPublic().then(J=>M(!!(J!=null&&J.public))).catch(()=>{})},[gt]);const[U,K]=A.useState({running:void 0,latest:null,installed:null}),lt=U.latest,rt=U.running,[pt,N]=A.useState(!1),H=A.useRef(null),nt=A.useRef(null),_t=A.useRef(null),[Dt,S]=A.useState({top:0,left:0}),X=184,P=()=>{if(!C&&nt.current){const Q=nt.current.getBoundingClientRect(),tt=Math.max(8,Math.min(Q.right-X,window.innerWidth-X-8));S({top:Math.round(Q.bottom+4),left:Math.round(tt)})}L(Q=>!Q)},ut=A.useCallback(async(Q=!1)=>{var tt,J;if(!(!gt||!((J=(tt=window.cicy)==null?void 0:tt.sidecar)!=null&&J.versions))){Q&&N(!0);try{const ft=await window.cicy.sidecar.versions();K({running:(ft==null?void 0:ft.running)??null,latest:(ft==null?void 0:ft.latest)??null,installed:(ft==null?void 0:ft.installed)??null}),Q&&(ft!=null&&ft.running&&(ft!=null&&ft.latest)&&Bh(ft.latest,ft.running)>0?Nt.show({message:`${r("sidecar.found","发现新版本")} v${ft.latest}`,status:"done",ttl:2500}):ft!=null&&ft.running?Nt.show({message:`${r("sidecar.upToDate","已是最新")} v${ft.running}`,status:"done",ttl:2500}):Nt.show({message:r("sidecar.notRunning","cicy-code 未运行"),status:"error",ttl:4e3}))}catch{Q&&Nt.show({message:r("sidecar.checkFailed","检查更新失败"),status:"error",ttl:5e3})}finally{Q&&N(!1)}}},[gt]);A.useEffect(()=>{ut(!1)},[ut]),A.useEffect(()=>{Rt&&ut(!1)},[Rt,ut]);const xt=!!(gt&&lt&&rt&&Bh(lt,rt)>0),Ct=!gt&&!!((Lt=(ot=window.cicy)==null?void 0:ot.localTeams)!=null&&Lt.remove),Mt=gt||Ct,[re,qt]=A.useState(!1),[Ze,it]=A.useState(!1),[Vt,Ee]=A.useState(""),[Wt,Ue]=A.useState(!1),[Ve,ze]=A.useState("");A.useEffect(()=>{if(!C)return;const Q=tt=>{var J,ft;(J=nt.current)!=null&&J.contains(tt.target)||(ft=_t.current)!=null&&ft.contains(tt.target)||L(!1)};return document.addEventListener("mousedown",Q),()=>document.removeEventListener("mousedown",Q)},[C]);const Be=async()=>{var tt,J,ft;if(Wt)return;const Q=String(Vt||"").trim();if(!Q||Q===(s.base_url||"")){it(!1);return}try{new URL(Q)}catch{ze(r("teams.badUrl","URL 无效(需含 http(s)://)"));return}ze(""),Ue(!0);try{const bt=await((ft=(J=(tt=window.cicy)==null?void 0:tt.localTeams)==null?void 0:J.update)==null?void 0:ft.call(J,s.id,{base_url:Q}));bt!=null&&bt.ok?(it(!1),g==null||g()):ze(nn((bt==null?void 0:bt.error)||"update failed"))}catch(bt){ze(nn((bt==null?void 0:bt.message)||String(bt)))}Ue(!1)},Oa=async()=>{var tt,J,ft;if(yt)return;qt(!1),Ht("remove");const Q="op-"+Date.now();Nt.show({id:Q,message:r("localTeams.removing","删除中…"),status:"running"});try{const bt=await((ft=(J=(tt=window.cicy)==null?void 0:tt.localTeams)==null?void 0:J.remove)==null?void 0:ft.call(J,s.id));bt!=null&&bt.ok?Nt.show({id:Q,message:r("localTeams.removed","已删除"),status:"done",ttl:3e3}):Nt.show({id:Q,message:r("localTeams.removeFailed","删除失败")+(bt!=null&&bt.error?": "+bt.error:""),status:"error",ttl:7e3})}catch(bt){Nt.show({id:Q,message:r("localTeams.removeFailed","删除失败")+": "+((bt==null?void 0:bt.message)||bt),status:"error",ttl:7e3})}Ht(""),g==null||g()},$t=`sidecar-op:${s.id}`,aa=async(Q,tt,J)=>{var Qt,ne,jt,kt,Me;if(L(!1),yt)return;Ht(Q);const ft=Q==="update";let bt=null;ft?(ve.open({teamId:s.id,fromVer:rt,toVer:lt,onRetry:()=>aa("update",tt,J)}),(ne=(Qt=window.cicy)==null?void 0:Qt.sidecar)!=null&&ne.onOpProgress&&(bt=window.cicy.sidecar.onOpProgress(te=>{(te==null?void 0:te.op)==="update"&&ve.push(te)}))):Nt.show({id:$t,message:ge[Q]||`${Q}…`,status:"running",progress:void 0});try{const te=await tt(),Ne=!!(te!=null&&te.ok),wa=te!=null&&te.warning?`${J}(${te.warning})`:J,Je=r("sidecar.failed","操作失败")+(te!=null&&te.error?`: ${te.error}`:"");if(ft){if(ve.finish({ok:Ne,message:Ne?wa:Je}),Ne)try{await((Me=(kt=(jt=window.cicy)==null?void 0:jt.localTeams)==null?void 0:kt.reload)==null?void 0:Me.call(kt,s.id,{ignoreCache:!0}))}catch{}}else Nt.show({id:$t,message:Ne?wa:Je,progress:void 0,status:Ne?"done":"error",ttl:Ne?4e3:8e3})}catch(te){const Ne=r("sidecar.failed","操作失败")+`: ${(te==null?void 0:te.message)||te}`;ft?ve.finish({ok:!1,message:Ne}):Nt.show({id:$t,message:Ne,progress:void 0,status:"error",ttl:8e3})}finally{try{bt&&bt()}catch{}Ht(""),g==null||g(),(Q==="update"||Q==="restart"||Q==="start")&&ut(!1)}},ge={start:r("busy.start","启动中…"),restart:r("busy.restart","重启中…"),update:r("busy.update","更新中…"),stop:r("busy.stop","停止中…")},Sa=async()=>{var J,ft,bt;Ht("start"),ve.open({teamId:s.id,title:r("sidecar.startTitle","启动 cicy-code"),onRetry:Sa}),ve.push({phase:"download",status:"running",message:r("sidecar.starting","启动 cicy-code(首次需安装 Node + 依赖,日志见下)…")});const Q=(bt=(ft=(J=window.cicy)==null?void 0:J.sidecar)==null?void 0:ft.onOpProgress)==null?void 0:bt.call(ft,Qt=>ve.push(Qt));let tt;try{tt=await window.cicy.sidecar.start()}catch(Qt){tt={ok:!1,error:(Qt==null?void 0:Qt.message)||String(Qt)}}try{Q==null||Q()}catch{}return Ht(""),g==null||g(),!(tt!=null&&tt.ok)||tt!=null&&tt.warning?(ve.finish({ok:!1,message:r("sidecar.startFailed","启动失败")+(tt!=null&&tt.error?`: ${tt.error}`:tt!=null&&tt.warning?`: ${tt.warning}`:"")}),!1):(ve.finish({ok:!0,message:r("sidecar.startedOk","cicy-code 已就绪")}),!0)},de=async()=>{var Q,tt;yt||!Rt&&gt&&((tt=(Q=window.cicy)==null?void 0:Q.sidecar)!=null&&tt.start)&&!await Sa()||b()},F=Rt?r("localTeams.open","打开"):gt?r("localTeams.startOpen","启动并打开"):r("localTeams.open","打开");return u.jsxs(u.Fragment,{children:[u.jsxs("div",{"data-id":"LocalTeamCard",className:`bcard ${gt?"bcard--local":"bcard--custom"}${m==="ok"?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent"}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":m}),u.jsx(Qp,{})]}),Mt&&u.jsxs("div",{className:"bcard__menuwrap",ref:H,onClick:Q=>Q.stopPropagation(),children:[u.jsx("button",{type:"button",ref:nt,"data-id":"LocalTeamCard-menu-btn",className:`bcard__kebab${xt?" has-dot":""}`,title:gt?r("localTeams.manage","管理本地 cicy-code"):r("localTeams.more","更多"),disabled:!!yt,onClick:P,children:yt?u.jsx(Xe,{}):u.jsx(Do,{})}),C&&da.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"LocalTeamCard-menu",role:"menu",ref:_t,style:{position:"fixed",top:Dt.top,left:Dt.left,width:X},onClick:Q=>Q.stopPropagation(),children:[gt&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-check-update",className:"bcard__menu-item",disabled:pt,onClick:Q=>{Q.stopPropagation(),ut(!0)},children:pt?r("sidecar.checking2","检查中…"):r("sidecar.checkUpdate","检查更新")}),xt&&u.jsxs("button",{type:"button","data-id":"LocalTeamCard-update",className:"bcard__menu-item is-accent",onClick:()=>aa("update",()=>window.cicy.sidecar.update(),r("sidecar.updated","已更新到最新")),children:[r("sidecar.updateTo","更新到")," v",lt]}),s.base_url&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-reload",className:"bcard__menu-item",onClick:Q=>{var tt,J,ft;Q.stopPropagation(),L(!1),(ft=(J=(tt=window.cicy)==null?void 0:tt.tabs)==null?void 0:J.reloadIfOpen)==null||ft.call(J,s.base_url,s.name)},children:r("localTeams.reloadWindow","刷新窗口")}),gt&&!Rt&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-start",className:"bcard__menu-item is-accent",onClick:()=>aa("start",()=>window.cicy.sidecar.start(),r("sidecar.started","已启动")),children:r("sidecar.start","启动")}),gt&&Rt&&u.jsxs(u.Fragment,{children:[u.jsx("button",{type:"button","data-id":"LocalTeamCard-restart",className:"bcard__menu-item",onClick:()=>aa("restart",()=>window.cicy.sidecar.restart(),r("sidecar.restarted","已重启")),children:r("sidecar.restart","重启")}),u.jsx("button",{type:"button","data-id":"LocalTeamCard-stop",className:"bcard__menu-item is-danger",onClick:()=>aa("stop",()=>window.cicy.sidecar.stop(),r("sidecar.stoppedDone","已停止")),children:r("sidecar.stop","停止")}),u.jsxs("button",{type:"button","data-id":"LocalTeamCard-lan",className:"bcard__menu-item",title:r("sidecar.lanHint","开启后同局域网设备可用本机 IP 访问(api_token 仍校验);切换会自动重启 cicy-code"),disabled:yt==="lan",onClick:async()=>{if(yt)return;const Q=!p;L(!1),Ht("lan"),M(Q),Nt.show({id:$t,message:Q?r("sidecar.lanEnabling","开启局域网访问,重启中…"):r("sidecar.lanDisabling","关闭局域网访问,重启中…"),status:"running",progress:void 0});try{const tt=await window.cicy.sidecar.setPublic(Q);tt!=null&&tt.ok?Nt.show({id:$t,message:Q?r("sidecar.lanOn","已开启局域网访问"):r("sidecar.lanOff","已关闭局域网访问"),status:"done",ttl:3e3}):Nt.show({id:$t,message:r("sidecar.lanFailed","设置失败")+(tt!=null&&tt.error?`: ${tt.error}`:""),status:"error",ttl:7e3})}catch(tt){Nt.show({id:$t,message:r("sidecar.lanFailed","设置失败")+`: ${(tt==null?void 0:tt.message)||tt}`,status:"error",ttl:7e3})}try{const tt=await window.cicy.sidecar.getPublic();M(!!(tt!=null&&tt.public))}catch{}Ht(""),g==null||g()},children:[r("sidecar.lanAccess","局域网访问")," · ",p?r("common.on","开"):r("common.off","关")]})]}),s.cloud_team_id&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-billing",className:"bcard__menu-item",onClick:Q=>{Q.stopPropagation(),L(!1),Qi(`?team=${encodeURIComponent(v||s.cloud_team_id)}`)},children:r("localTeams.billing","账单")}),Ct&&u.jsxs(u.Fragment,{children:[u.jsx("button",{type:"button","data-id":"LocalTeamCard-edit-url",className:"bcard__menu-item",onClick:Q=>{Q.stopPropagation(),L(!1),it(!0),Ee(s.base_url||"")},children:r("teamCard.editUrl","更改访问地址")}),u.jsx("button",{type:"button","data-id":"LocalTeamCard-remove",className:"bcard__menu-item is-danger",onClick:()=>{L(!1),qt(!0)},children:r("localTeams.remove","删除")})]}),(rt||s.version)&&u.jsxs("div",{"data-id":"LocalTeamCard-version",className:"bcard__menu-item",style:{cursor:"default",color:"#8b949e",fontSize:12},children:[r("localTeams.version","版本")," v",rt||s.version]})]}),document.body)]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(ic,{size:24,avatar:s==null?void 0:s.avatar,name:s==null?void 0:s.name,teamId:s==null?void 0:s.id,onChanged:g}),f?u.jsx("input",{"data-id":"LocalTeamCard-rename-input",autoFocus:!0,value:h,onChange:Q=>q(Q.target.value),onFocus:Q=>Q.target.select(),onBlur:wt,onClick:Q=>Q.stopPropagation(),onKeyDown:Q=>{Q.nativeEvent.isComposing||Q.keyCode===229||(Q.key==="Enter"?wt():Q.key==="Escape"&&y(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:r("localTeams.renameHint","点名字或 ✎ 改名"),style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:st,children:[u.jsx("span",{"data-id":"LocalTeamCard-name-text",onClick:st,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"text"},children:$}),Y==="saving"&&u.jsx("span",{"data-id":"LocalTeamCard-save-state",title:r("localTeams.saving","保存中…"),style:{flex:"none",display:"inline-flex"},children:u.jsx(Xe,{})}),Y==="saved"&&u.jsx("span",{"data-id":"LocalTeamCard-save-state",title:r("localTeams.saved","已保存"),style:{flex:"none",color:"#3fb950",fontSize:13,lineHeight:1},children:"✓"}),!Y&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:st,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsx("div",{className:"bcard__meta",children:u.jsx("span",{className:"bcard__chip","data-id":"LocalTeamCard-kind",children:gt?r("localTeams.kindLocal","本地"):r("localTeams.kindCustom","自定义")})})]}),u.jsxs("button",{type:"button",className:"bcard__cta","data-id":"LocalTeamCard-open",disabled:!!yt||!s.base_url,onClick:de,children:[yt&&yt!=="stop"?u.jsx(Xe,{}):u.jsx(Xi,{}),u.jsx("span",{children:yt&&ge[yt]||F})]})]}),Ze&&da.createPortal(u.jsx("div",{"data-id":"LocalTeamCard-url-modal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:Q=>{!Wt&&Q.target===Q.currentTarget&&it(!1)},children:u.jsxs("div",{onClick:Q=>Q.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("teamCard.editUrl","更改访问地址")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:s.name}),u.jsx("textarea",{"data-id":"LocalTeamCard-url-input",autoFocus:!0,rows:3,className:"login-email-input",style:{width:"100%",resize:"vertical",lineHeight:1.5,fontFamily:"var(--mono)"},value:Vt,placeholder:"https://example.com:8008",spellCheck:!1,disabled:Wt,onChange:Q=>Ee(Q.target.value.replace(/[\r\n]+/g,"")),onKeyDown:Q=>{Q.nativeEvent.isComposing||Q.keyCode===229||(Q.key==="Enter"?(Q.preventDefault(),Be()):Q.key==="Escape"&&it(!1))}}),Ve&&u.jsx("div",{className:"error",style:{marginTop:8,fontSize:12},children:Ve}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",disabled:Wt,onClick:()=>it(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"LocalTeamCard-url-save",disabled:Wt,onClick:Be,children:Wt?r("common.saving","保存中…"):r("common.save","保存")})]})]})}),document.body),u.jsx(Jh,{open:re,title:r("localTeams.deleteTitle","删除团队"),message:r("localTeams.deleteMsg","确定删除「{{name}}」?此操作不可撤销。",{name:s.name}),confirmLabel:r("common.delete","删除"),danger:!0,onConfirm:Oa,onCancel:()=>qt(!1)})]})}function Eo(s){var v;try{if(((v=window.cicy)==null?void 0:v.platform)==="win32")return!1;const b=new URL(s);return(b.hostname==="127.0.0.1"||b.hostname==="localhost"||b.hostname==="::1")&&(b.port==="8008"||b.port==="")}catch{return!1}}function Uh(s){var v;try{if(((v=window.cicy)==null?void 0:v.platform)!=="win32")return!1;const b=new URL(s);return(b.hostname==="127.0.0.1"||b.hostname==="localhost"||b.hostname==="::1")&&b.port==="8008"}catch{return!1}}function Bh(s,v){const b=String(s).split("."),o=String(v).split(".");for(let g=0;g<Math.max(b.length,o.length);g++){const _=(parseInt(b[g],10)||0)-(parseInt(o[g],10)||0);if(_)return _>0?1:-1}return 0}const Rh={running:{tone:"ok",label:"running",cta:r("localStatus.open","打开")},stopped:{tone:"off",label:"stopped",cta:r("localStatus.notRunning","未运行")},auth_error:{tone:"warn",label:"auth error",cta:r("localStatus.tokenInvalid","Token 失效")},misconfigured:{tone:"err",label:"bad config",cta:r("localStatus.badUrl","URL 错误")},error:{tone:"err",label:"error",cta:r("localStatus.error","异常")}};function Jh({open:s,title:v,message:b,confirmLabel:o,danger:g,onConfirm:_,onCancel:m}){return s?da.createPortal(u.jsx("div",{"data-id":"ConfirmModal",style:{position:"fixed",inset:0,zIndex:70,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:f=>{f.target===f.currentTarget&&(m==null||m())},children:u.jsxs("div",{onClick:f=>f.stopPropagation(),style:{width:360,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:6},children:v}),b&&u.jsx("div",{style:{fontSize:13,opacity:.7,marginBottom:16},children:b}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:m,children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"ConfirmModal-ok",style:g?{background:"#dc2626",borderColor:"#dc2626"}:{},onClick:_,children:o||r("common.confirm","确认")})]})]})}),document.body):null}function Op({team:s,onOpen:v,onRename:b,onEditUrl:o,onDelete:g,avatar:_,onAvatar:m}){const f=s.kind==="private",y=s.status==="active",h=s.name||s.title||"—",[q,j]=A.useState(!1),[B,Y]=A.useState(""),[et,$]=A.useState(null),st=et??h;A.useEffect(()=>{et!=null&&h===et&&$(null)},[h,et]);const wt=it=>{var Vt;(Vt=it==null?void 0:it.stopPropagation)==null||Vt.call(it),Y(st==="—"?"":st),j(!0)},Bt=async()=>{j(!1);const it=String(B||"").trim();if(!(!b||!it||it===st)){$(it);try{const Vt=await b(s.id,it);Vt!=null&&Vt.ok||$(null)}catch{$(null)}}},gt=s.host_url||"",[Rt,yt]=A.useState(!1),[Ht,C]=A.useState(""),[L,p]=A.useState(null),M=L??gt;A.useEffect(()=>{L!=null&&gt===L&&p(null)},[gt,L]);const U=s.teamId||s.id,K=f?r("teamKind.private","私有云"):s.team_kind==="personal"?r("teamKind.personal","个人"):r("teamKind.shared","共享"),lt=f?M:s.workspace_url||s.workspace_direct_url,rt=!!lt,[pt,N]=A.useState(!1),[H,nt]=A.useState(!1),[_t,Dt]=A.useState({top:0,left:0}),S=A.useRef(null),X=A.useRef(null),P=A.useRef(null),ut=184,xt=()=>{if(!pt&&X.current){const it=X.current.getBoundingClientRect(),Vt=Math.max(8,Math.min(it.right-ut,window.innerWidth-ut-8));Dt({top:Math.round(it.bottom+4),left:Math.round(Vt)})}N(it=>!it)};A.useEffect(()=>{if(!pt)return;const it=Vt=>{var Ee,Wt;(Ee=X.current)!=null&&Ee.contains(Vt.target)||(Wt=P.current)!=null&&Wt.contains(Vt.target)||N(!1)};return document.addEventListener("mousedown",it),()=>document.removeEventListener("mousedown",it)},[pt]);const Ct=it=>{var Vt,Ee,Wt,Ue;(Vt=it==null?void 0:it.stopPropagation)==null||Vt.call(it),rt&&(N(!1),(Ue=(Wt=(Ee=window.cicy)==null?void 0:Ee.tabs)==null?void 0:Wt.reloadIfOpen)==null||Ue.call(Wt,lt,st))},[Mt,re]=A.useState(!1),qt=()=>{C(gt),yt(!0),N(!1)},Ze=async()=>{yt(!1);const it=String(Ht||"").trim();if(!(!o||!it||it===gt)){p(it);try{const Vt=await o(s.id,it);Vt!=null&&Vt.ok||p(null)}catch{p(null)}}};return u.jsxs(u.Fragment,{children:[u.jsxs("div",{"data-id":"TeamCard",className:`bcard bcard--cloud${y?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent"}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":y?"ok":"off"}),u.jsx(Wh,{})]}),u.jsxs("div",{className:"bcard__top-right",children:[s.is_trial&&u.jsx("span",{className:"bcard__badge",children:"trial"}),(rt||U!=null||f&&o)&&u.jsxs("div",{className:"bcard__menuwrap",ref:S,onClick:it=>it.stopPropagation(),children:[u.jsx("button",{type:"button",ref:X,"data-id":"TeamCard-menu-btn",className:"bcard__kebab",title:r("localTeams.more","更多"),disabled:H,onClick:xt,children:H?u.jsx(Xe,{}):u.jsx(Do,{})}),pt&&da.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"TeamCard-menu",role:"menu",ref:P,style:{position:"fixed",top:_t.top,left:_t.left,width:ut},onClick:it=>it.stopPropagation(),children:[rt&&u.jsx("button",{type:"button","data-id":"TeamCard-reload",className:"bcard__menu-item",onClick:Ct,children:r("localTeams.reloadWindow","刷新窗口")}),U!=null&&u.jsx("button",{type:"button","data-id":"TeamCard-billing",className:"bcard__menu-item",onClick:it=>{it.stopPropagation(),N(!1),Qi(`?team=${encodeURIComponent(U)}`)},children:r("localTeams.billing","账单")}),f&&o&&u.jsx("button",{type:"button","data-id":"TeamCard-edit-url",className:"bcard__menu-item",onClick:it=>{it.stopPropagation(),qt()},children:gt?r("teamCard.editUrl","更改访问地址"):r("teamCard.setUrl","填写访问地址")}),f&&g&&u.jsx("button",{type:"button","data-id":"TeamCard-delete",className:"bcard__menu-item is-danger",onClick:it=>{it.stopPropagation(),N(!1),re(!0)},children:r("teamCard.delete","删除")})]}),document.body)]})]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(ic,{size:24,avatar:_,name:(s==null?void 0:s.name)||(s==null?void 0:s.title),teamId:s==null?void 0:s.id,onChanged:m}),q?u.jsx("input",{"data-id":"TeamCard-rename-input",autoFocus:!0,value:B,onChange:it=>Y(it.target.value),onFocus:it=>it.target.select(),onBlur:Bt,onClick:it=>it.stopPropagation(),onKeyDown:it=>{it.nativeEvent.isComposing||it.keyCode===229||(it.key==="Enter"?Bt():it.key==="Escape"&&j(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:b?r("localTeams.renameHint","点名字或 ✎ 改名"):st,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:b?wt:void 0,children:[u.jsx("span",{onClick:b?wt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:b?"text":"default"},children:st}),b&&u.jsx("button",{type:"button","data-id":"TeamCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:wt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsxs("div",{className:"bcard__meta",children:[u.jsx("span",{className:"bcard__chip",children:K}),!f&&s.membership_status&&s.membership_status!=="active"&&u.jsx("span",{className:"bcard__chip",children:s.membership_status})]})]}),u.jsxs("button",{type:"button",className:"bcard__cta",onClick:v,disabled:!rt,children:[u.jsx(Xi,{}),u.jsx("span",{children:rt?r("localTeams.open","打开"):f?r("teamCard.noHost","未填访问地址"):r("teamCard.noUrl","无 URL")})]})]}),Rt&&da.createPortal(u.jsx("div",{"data-id":"TeamCard-url-modal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:it=>{it.target===it.currentTarget&&yt(!1)},children:u.jsxs("div",{onClick:it=>it.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:gt?r("teamCard.editUrl","更改访问地址"):r("teamCard.setUrl","填写访问地址")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:st}),u.jsx("textarea",{"data-id":"TeamCard-url-input",autoFocus:!0,rows:3,className:"login-email-input",style:{width:"100%",resize:"vertical",lineHeight:1.5,fontFamily:"var(--mono)"},value:Ht,placeholder:"https://你的私有云地址:端口",spellCheck:!1,onChange:it=>C(it.target.value.replace(/[\r\n]+/g,"")),onKeyDown:it=>{it.nativeEvent.isComposing||it.keyCode===229||(it.key==="Enter"?(it.preventDefault(),Ze()):it.key==="Escape"&&yt(!1))}}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:()=>yt(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"TeamCard-url-save",onClick:Ze,children:r("common.save","保存")})]})]})}),document.body),u.jsx(Jh,{open:Mt,title:r("localTeams.deleteTitle","删除团队"),message:r("localTeams.deleteMsg","确定删除「{{name}}」?此操作不可撤销。",{name:st}),confirmLabel:r("common.delete","删除"),danger:!0,onConfirm:async()=>{re(!1),g&&await g(s)},onCancel:()=>re(!1)})]})}function To(){return u.jsxs("div",{className:"brand",children:[u.jsx("div",{className:"brand-mark",children:u.jsx(Gp,{})}),u.jsxs("div",{className:"brand-text",children:[u.jsx("div",{className:"brand-name",children:"CiCy Desktop"}),u.jsx("div",{className:"brand-sub",children:r("app.brandSub","团队 AI 协作工作台")})]})]})}function Up(){const[s,v]=A.useState(null),[b,o]=A.useState(!1),g=A.useRef(!1);A.useEffect(()=>{var h,q,j,B,Y,et;let f=!0;(j=(q=(h=window.cicy)==null?void 0:h.app)==null?void 0:q.updateState)==null||j.call(q).then($=>{f&&v($)}).catch(()=>{});const y=(et=(Y=(B=window.cicy)==null?void 0:B.app)==null?void 0:Y.onUpdateState)==null?void 0:et.call(Y,$=>{v($),g.current&&($.status==="downloading"?ve.setProgress($.progress||{}):$.status==="ready"?ve.ready({onInstall:()=>{var st,wt,Bt;return(Bt=(wt=(st=window.cicy)==null?void 0:st.app)==null?void 0:wt.installUpdate)==null?void 0:Bt.call(wt)}}):$.status==="error"&&(ve.finish({ok:!1,message:$.error||r("updateBanner.error","更新失败")}),g.current=!1))});return()=>{f=!1;try{y&&y()}catch{}}},[]);const _=s==null?void 0:s.status;A.useEffect(()=>{o(!1)},[_]);const m=()=>{var f,y,h;g.current=!0,o(!0),ve.open({kind:"app",title:r("updateBanner.drawerTitle","应用更新"),fromVer:s==null?void 0:s.current,toVer:s==null?void 0:s.version,onRetry:m}),ve.push({phase:"download",status:"running",message:r("updateBanner.startDl","开始下载安装包…")}),ve.setProgress({percent:0}),(h=(y=(f=window.cicy)==null?void 0:f.app)==null?void 0:y.downloadUpdate)==null||h.call(y)};return _!=="available"||b?null:da.createPortal(u.jsx("div",{"data-id":"UpdateBanner",style:{position:"fixed",inset:0,zIndex:1e4,background:"rgba(0,0,0,0.6)",backdropFilter:"blur(3px)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:f=>{f.target===f.currentTarget&&o(!0)},children:u.jsxs("div",{onClick:f=>f.stopPropagation(),style:{width:380,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:14,padding:"24px 24px 20px",boxShadow:"0 20px 60px rgba(0,0,0,0.55)",textAlign:"center"},children:[u.jsx("div",{style:{fontSize:34,lineHeight:1,marginBottom:12},"aria-hidden":!0,children:"🚀"}),u.jsx("h3",{style:{margin:"0 0 8px",fontSize:17,color:"#e6edf3"},"data-id":"UpdateBanner-text",children:r("updateBanner.available","发现新版本 v{{v}}",{v:s.version})}),u.jsx("p",{style:{margin:"0 0 20px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:r("updateBanner.modalSub","建议尽快更新到最新版本")}),u.jsxs("div",{style:{display:"flex",gap:10,justifyContent:"center"},children:[u.jsx("button",{type:"button","data-id":"UpdateBanner-later",onClick:()=>o(!0),style:{flex:1,padding:"9px 16px",borderRadius:9,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:14},children:r("updateBanner.later","稍后")}),u.jsx("button",{type:"button","data-id":"UpdateBanner-download",onClick:m,style:{flex:1,padding:"9px 16px",borderRadius:9,border:"none",background:"#238636",color:"white",cursor:"pointer",fontSize:14,fontWeight:600},children:r("updateBanner.updateNow","立即更新")})]})]})}),document.body)}function Hh(){return u.jsxs("div",{className:"bcard bcard--skeleton","data-id":"SkeletonCard","aria-hidden":!0,children:[u.jsx("div",{className:"bcard__accent",style:{background:"rgba(255,255,255,.08)",opacity:1}}),u.jsxs("div",{className:"bcard__top",children:[u.jsx("div",{className:"skel",style:{width:84,height:26,borderRadius:999}}),u.jsx("div",{className:"skel",style:{width:22,height:22,borderRadius:6}})]}),u.jsxs("div",{style:{flex:1,minHeight:0,marginTop:14},children:[u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[u.jsx("div",{className:"skel",style:{width:24,height:24,borderRadius:6,flex:"0 0 auto"}}),u.jsx("div",{className:"skel skel--line",style:{width:"55%"}})]}),u.jsx("div",{className:"skel",style:{width:60,height:18,borderRadius:6,marginTop:12}})]}),u.jsx("div",{className:"skel skel--cta",style:{marginTop:0}})]})}const Lh=["hsl(2 68% 48%)","hsl(26 72% 46%)","hsl(45 70% 42%)","hsl(96 55% 38%)","hsl(140 58% 40%)","hsl(168 62% 36%)","hsl(192 70% 42%)","hsl(210 72% 50%)","hsl(232 62% 56%)","hsl(266 55% 55%)","hsl(292 58% 50%)","hsl(324 66% 50%)"];function Bp(s){s=String(s??"");let v=0;for(let b=0;b<s.length;b++)v=(v*31+s.charCodeAt(b))%100003;return v}function Rp(s){return Lh[Bp(s)%Lh.length]}function Hp({open:s,onClose:v,toastId:b="dood-op"}){const[o,g]=A.useState(!1),[_,m]=A.useState(""),[f,y]=A.useState(!1),[h,q]=A.useState("");A.useEffect(()=>{var Y,et;!s||!((et=(Y=window.cicy)==null?void 0:Y.sidecar)!=null&&et.getDood)||(m(""),q(""),window.cicy.sidecar.getDood().then($=>y(!!($!=null&&$.dood))).catch(()=>{}))},[s]),A.useEffect(()=>{var Y,et;if(!(!s||!o||!((et=(Y=window.cicy)==null?void 0:Y.sidecar)!=null&&et.onOpProgress)))return window.cicy.sidecar.onOpProgress($=>{$!=null&&$.message&&q(String($.message))})},[s,o]);const j=async()=>{if(!o){g(!0),m(""),q(""),Nt.show({id:b,message:f?r("dood.applying","开启容器 Docker 访问,重建容器中…"):r("dood.disabling","关闭中…"),status:"running",progress:void 0});try{const Y=await window.cicy.sidecar.setDood(f);Y!=null&&Y.ok?(v&&v(),Nt.show({id:b,message:f?r("dood.onDone","容器 Docker 访问已开启"):r("dood.offDone","容器 Docker 访问已关闭"),status:"done",ttl:4e3})):(m((Y==null?void 0:Y.error)||r("dood.failed","设置失败")),Nt.show({id:b,message:r("dood.failed","设置失败")+(Y!=null&&Y.error?`: ${Y.error}`:""),status:"error",ttl:6e3}))}catch(Y){m((Y==null?void 0:Y.message)||String(Y)),Nt.show({id:b,message:r("dood.failed","设置失败")+`: ${(Y==null?void 0:Y.message)||Y}`,status:"error",ttl:6e3})}finally{g(!1)}}},B=Y=>{v&&v()};return s?u.jsx(u.Fragment,{children:da.createPortal(u.jsx("div",{"data-id":"dood-modal",style:{position:"fixed",inset:0,zIndex:66,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:Y=>{!o&&Y.target===Y.currentTarget&&B()},children:u.jsxs("div",{onClick:Y=>Y.stopPropagation(),style:{width:440,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("dood.title","容器内使用 Docker")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:r("dood.subtitle","把宿主 Docker + docker 客户端挂进容器,容器内 agent 就能直接跑 docker(秒生效,无需下载)")}),u.jsxs("label",{"data-id":"dood-toggle-row",style:{display:"flex",alignItems:"center",gap:10,cursor:o?"default":"pointer",marginBottom:12},children:[u.jsx("input",{type:"checkbox","data-id":"dood-toggle",checked:f,disabled:o,onChange:Y=>y(Y.target.checked)}),u.jsx("span",{style:{fontSize:14,fontWeight:600},children:r("dood.enable","允许容器内使用 Docker")})]}),o&&h&&u.jsx("div",{"data-id":"dood-progress",style:{fontSize:11,opacity:.7,fontFamily:"var(--mono)",wordBreak:"break-all",margin:"0 0 8px",maxHeight:60,overflow:"hidden"},children:h}),_&&u.jsx("div",{className:"error",style:{marginTop:8,fontSize:12},children:_}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",disabled:o,onClick:()=>B(),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"dood-save",disabled:o,onClick:j,children:o?r("common.saving","保存中…"):r("common.save","保存")})]})]})}),document.body)}):null}function ic({avatar:s,name:v,teamId:b,onChanged:o,size:g=34}){const _=A.useRef(null),m=((v||"?").trim()[0]||"?").toUpperCase(),f=Rp(b||v||""),y=h=>{const q=h.target.files&&h.target.files[0];if(h.target.value="",!q)return;const j=new FileReader;j.onload=async()=>{var B,Y,et;try{await((et=(Y=(B=window.cicy)==null?void 0:B.localTeams)==null?void 0:Y.setAvatar)==null?void 0:et.call(Y,b,j.result)),o&&o()}catch{}},j.readAsDataURL(q)};return u.jsxs("div",{"data-id":"TeamAvatar",className:"team-avatar",title:b?r("teamCard.changeAvatar","点击更换头像"):"",onClick:b?h=>{h.stopPropagation(),_.current&&_.current.click()}:void 0,style:{width:g,height:g,borderRadius:9,flex:"none",overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"center",cursor:b?"pointer":"default",background:s?"#0d1117":f,color:"#fff",fontWeight:700,fontSize:Math.round(g*.42),userSelect:"none"},children:[s?u.jsx("img",{src:s,alt:"",style:{width:"100%",height:"100%",objectFit:"cover"}}):m,b&&u.jsx("input",{ref:_,type:"file",accept:"image/*",style:{display:"none"},onChange:y})]})}function Lp({team:s,onOpen:v}){const b=s.name||s.id||"team",o=Array.isArray(s.agents)?s.agents:[],g=o.filter(_=>_&&_.status==="working").length;return u.jsxs("div",{"data-id":"HubTeamCard",className:"bcard bcard--cloud bcard--online",children:[u.jsx("div",{className:"bcard__accent"}),u.jsx("div",{className:"bcard__top",children:u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":"ok"}),u.jsx(Wh,{})]})}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(ic,{size:24,avatar:"",name:b}),u.jsx("h3",{className:"bcard__name",title:b,style:{margin:0,flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:b})]}),u.jsxs("div",{className:"bcard__meta",children:[s.org?u.jsx("span",{className:"bcard__chip",children:s.org}):null,u.jsx("span",{className:"bcard__chip",children:r("hub.agents","{n} agent").replace("{n}",String(o.length))}),g>0?u.jsxs("span",{className:"bcard__chip",children:[g," working"]}):null]})]}),u.jsxs("button",{type:"button",className:"bcard__cta",onClick:v,children:[u.jsx(Xi,{}),u.jsx("span",{children:r("localTeams.open","打开")})]})]})}function qp({text:s,size:v=172}){const b=A.useMemo(()=>{try{const o=ql(0,"L");return o.addData(String(s||"")),o.make(),o.createSvgTag({cellSize:4,margin:2,scalable:!0})}catch{return""}},[s]);return b?u.jsx("div",{"data-id":"HubQR",style:{width:v,height:v,background:"#fff",borderRadius:10,padding:8,boxSizing:"border-box"},dangerouslySetInnerHTML:{__html:b}}):null}function Yp({size:s=14}){return u.jsx("svg",{width:s,height:s,viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":!0,children:u.jsx("path",{d:"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0016 8c0-4.42-3.58-8-8-8z"})})}function Gp(){return u.jsx("svg",{width:"22",height:"22",viewBox:"0 0 96 96",fill:"none",children:u.jsx("path",{d:"M48 11L39.5 33.3L16 29.5L31 48L16 66.5L39.5 62.7L48 85L56.5 62.7L80 66.5L65 48L80 29.5L56.5 33.3Z",fill:"white",stroke:"white",strokeWidth:"8",strokeLinejoin:"round",strokeLinecap:"round"})})}function Xi(){return u.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),u.jsx("polyline",{points:"12 5 19 12 12 19"})]})}function Xe(){return u.jsx("svg",{className:"spin",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.4",strokeLinecap:"round",children:u.jsx("path",{d:"M21 12a9 9 0 1 1-6.2-8.55"})})}function Qp(){return u.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),u.jsx("line",{x1:"2",y1:"20",x2:"22",y2:"20"})]})}function Do(){return u.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[u.jsx("circle",{cx:"12",cy:"5",r:"1.7"}),u.jsx("circle",{cx:"12",cy:"12",r:"1.7"}),u.jsx("circle",{cx:"12",cy:"19",r:"1.7"})]})}function Wh(){return u.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("circle",{cx:"12",cy:"12",r:"10"}),u.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),u.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}function Ll(s){try{return localStorage.getItem(s)||null}catch{return null}}function nn(s){return s?/timeout/i.test(s)?"登录超时,请重新点击 Login。":/state/i.test(s)?"校验失败,请重新登录。":/no token/i.test(s)?"登录未完成,请重试。":/bridge missing/i.test(s)?"无法连接到登录服务(preload 未就绪)。":s:""}var qh;const Xp=((qh=window.cicy)==null?void 0:qh.platform)||(()=>{const s=navigator.userAgent||"";return/Mac/i.test(s)?"darwin":/Windows/i.test(s)?"win32":"linux"})();document.documentElement.dataset.platform=Xp;document.documentElement.dataset.fullscreen="0";var Yh,Gh;(Gh=(Yh=window.cicy)==null?void 0:Yh.window)!=null&&Gh.onFullscreen&&window.cicy.window.onFullscreen(s=>{document.documentElement.dataset.fullscreen=s?"1":"0"});rp.createRoot(document.getElementById("root")).render(u.jsx(Cp,{}));
379
+ `)}const r=(s,v,b)=>{var g,_;const o=m=>b&&typeof m=="string"?m.replace(/\{\{\s*(\w+)\s*\}\}/g,(f,y)=>b[y]!=null?String(b[y]):f):m;try{const m=(_=(g=window.cicyI18n)==null?void 0:g.t)==null?void 0:_.call(g,s,b);return o(m&&m!==s?m:v)}catch{return o(v)}},Rl="cicy_token",lc="cicy_access_token",Hi="cicy_user_id",el="https://cicy-ai.com",Vh=1;async function Qi(s){var b,o,g,_,m,f,y,h;const v=`${el}/dash${s}`;try{if((o=(b=window.cicy)==null?void 0:b.tabs)!=null&&o.openIn){await window.cicy.tabs.openIn(Vh,v,"cicy-ai");return}(m=(_=(g=window.cicy)==null?void 0:g.shell)==null?void 0:_.openExternal)==null||m.call(_,v)}catch{try{(h=(y=(f=window.cicy)==null?void 0:f.shell)==null?void 0:y.openExternal)==null||h.call(y,v)}catch{}}}const Co=new Set;let wp=0,Rn=[];const Li=new Map;function Dh(){Co.forEach(s=>s(Rn))}const Nt={show(s={}){const v=s.id||`t${++wp}`,b=Rn.find(_=>_.id===v),o={id:v,status:"running",...b,...s};Rn=b?Rn.map(_=>_.id===v?o:_):[...Rn,o],Dh();const g=Li.get(v);return g&&(clearTimeout(g),Li.delete(v)),s.ttl&&Li.set(v,setTimeout(()=>Nt.dismiss(v),s.ttl)),v},dismiss(s){Rn=Rn.filter(b=>b.id!==s);const v=Li.get(s);v&&(clearTimeout(v),Li.delete(s)),Dh()}};function _p(){const[s,v]=A.useState(Rn);return A.useEffect(()=>(Co.add(v),()=>{Co.delete(v)}),[]),s.length?u.jsx("div",{className:"toast-host","data-id":"ToastHost",children:s.map(b=>u.jsxs("div",{className:"toast","data-id":`Toast-${b.id}`,"data-status":b.status||"running",children:[u.jsx("button",{type:"button",className:"toast__x","data-id":"Toast-dismiss",onClick:()=>Nt.dismiss(b.id),"aria-label":"dismiss",children:"×"}),u.jsxs("span",{className:"toast__msg",children:[b.message,Number.isFinite(b.progress)?` ${b.progress}%`:""]}),Number.isFinite(b.progress)&&u.jsx("span",{className:"toast__bar",children:u.jsx("span",{style:{width:`${Math.min(100,b.progress)}%`}})})]},b.id))}):null}const jo=new Set;let So=0,ae=null;function Un(){jo.forEach(s=>s(ae))}function Yi(){return new Date().toTimeString().slice(0,8)}const ve={open({teamId:s,fromVer:v,toVer:b,onRetry:o,title:g,kind:_}={}){ae={teamId:s,title:g||null,fromVer:v||null,toVer:b||null,kind:_||"sidecar",status:"running",phase:"download",progress:null,onInstall:null,logs:[],onRetry:o||null,lastAt:Date.now()},Un()},setProgress(s){ae&&(ae={...ae,status:"running",progress:s||ae.progress,lastAt:Date.now()},Un())},ready({onInstall:s,message:v}={}){if(!ae)return;const b={id:++So,t:Yi(),phase:"done",status:"done",message:v||r("updateBanner.readyDrawer","下载完成,点「安装」重启更新")};ae={...ae,status:"ready",phase:"done",progress:{...ae.progress||{},percent:100},onInstall:s||null,minimized:!1,logs:[...ae.logs,b],lastAt:Date.now()},Un()},push(s={}){if(!ae)return;const v={id:++So,t:Yi(),phase:s.phase||ae.phase,status:s.status||"running",message:s.message||""};ae={...ae,phase:s.phase||ae.phase,toVer:s.toVer||ae.toVer,logs:[...ae.logs,v],lastAt:Date.now()},Un()},minimize(){ae&&(ae={...ae,minimized:!0},Un())},restore(){ae&&(ae={...ae,minimized:!1},Un())},finish({ok:s,message:v}={}){if(!ae)return;const b=s?"done":"error",o={id:++So,t:Yi(),phase:"done",status:b,message:v||(s?r("updateDrawer.done","更新完成"):r("updateDrawer.failed","更新失败"))};ae={...ae,status:b,phase:"done",minimized:!1,logs:[...ae.logs,o],lastAt:Date.now()},Un()},close(){ae=null,Un()}},wo=["download","swap","done"],kh=s=>({download:r("updateDrawer.phaseDownload","下载"),swap:r("updateDrawer.phaseSwap","切换"),done:r("updateDrawer.phaseDone","完成")})[s]||s;function Tp(){var f;const[s,v]=A.useState(ae);A.useEffect(()=>(jo.add(v),()=>{jo.delete(v)}),[]);const b=A.useRef(null);A.useEffect(()=>{const y=b.current;y&&(y.scrollTop=y.scrollHeight)},[(f=s==null?void 0:s.logs)==null?void 0:f.length]);const[o,g]=A.useState(!1);if(A.useEffect(()=>{if(!s||s.status!=="running"){g(!1);return}const y=setInterval(()=>g(Date.now()-(s.lastAt||0)>25e3),3e3);return()=>clearInterval(y)},[s==null?void 0:s.lastAt,s==null?void 0:s.status]),!s)return null;const _=s.status==="running",m=wo.findIndex(y=>y===s.phase);return s.minimized?u.jsxs("button",{type:"button",className:`drawer-min drawer-min--${s.status}`,"data-id":"UpdateDrawer-restore",onClick:()=>ve.restore(),children:[u.jsx("span",{className:"drawer-min__spark",children:_?u.jsx(Xe,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("span",{className:"drawer-min__label",children:[s.title||r("updateDrawer.title","更新 cicy-code"),s.toVer?` · v${s.toVer}`:""]})]}):u.jsx("div",{className:"drawer-scrim","data-id":"UpdateDrawer-scrim",onClick:()=>_?ve.minimize():ve.close(),children:u.jsxs("div",{className:"drawer","data-id":"UpdateDrawer","data-status":s.status,onClick:y=>y.stopPropagation(),children:[u.jsxs("div",{className:"drawer__head",children:[u.jsxs("div",{className:"drawer__title",children:[u.jsx("span",{className:`drawer__spark drawer__spark--${s.status}`,children:_?u.jsx(Xe,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("div",{children:[u.jsx("div",{className:"drawer__h",children:s.title||r("updateDrawer.title","更新 cicy-code")}),u.jsxs("div",{className:"drawer__sub",children:[s.fromVer?`v${s.fromVer}`:r("updateDrawer.current","当前")," → ",s.toVer?`v${s.toVer}`:r("updateDrawer.latest","最新版")]})]})]}),u.jsx("div",{className:"drawer__headbtns",children:u.jsx("button",{type:"button",className:"drawer__x","data-id":"UpdateDrawer-min",title:r("updateDrawer.minimize","最小化"),onClick:()=>ve.minimize(),"aria-label":"minimize",children:"‒"})})]}),s.kind!=="app"&&u.jsx("div",{className:"drawer__steps","data-id":"UpdateDrawer-steps",children:wo.map((y,h)=>{const q=kh(y),j=s.status==="done"||h<m,B=h===m&&_,Y=s.status==="error"&&h===m;return u.jsxs("div",{className:`drawer__step${B?" is-active":""}${j?" is-done":""}${Y?" is-error":""}`,children:[u.jsx("span",{className:"drawer__step-dot",children:j?"✓":Y?"!":h+1}),u.jsx("span",{className:"drawer__step-label",children:q}),h<wo.length-1&&u.jsx("span",{className:"drawer__step-bar"})]},y)})}),s.progress&&(()=>{const y=s.progress,h=q=>q?(q/1048576).toFixed(1):"0";return u.jsxs("div",{className:"drawer__dl","data-id":"UpdateDrawer-dl",children:[u.jsxs("div",{className:"drawer__dl-head",children:[u.jsxs("span",{className:"drawer__dl-pct",children:[y.percent||0,"%"]}),u.jsxs("span",{className:"drawer__dl-stats",children:[y.total?`${h(y.transferred)} / ${h(y.total)} MB`:`${h(y.transferred)} MB`,y.bytesPerSec?` · ${h(y.bytesPerSec)} MB/s`:"",y.etaSec?` · ${r("updateBanner.eta","剩 {{s}}s",{s:y.etaSec})}`:""]})]}),u.jsx("div",{className:"drawer__dl-track",children:u.jsx("span",{className:"drawer__dl-fill",style:{width:`${y.percent||0}%`}})})]})})(),u.jsx("div",{className:"drawer__log","data-id":"UpdateDrawer-log",ref:b,children:s.logs.length===0?u.jsx("div",{className:"drawer__log-empty",children:r("updateDrawer.preparing","准备中…")}):s.logs.map(y=>u.jsxs("div",{className:"drawer__line","data-status":y.status,children:[u.jsx("span",{className:"drawer__t",children:y.t}),u.jsx("span",{className:`drawer__badge drawer__badge--${y.phase}`,children:kh(y.phase)}),u.jsx("span",{className:"drawer__linemsg",children:y.message})]},y.id))}),o&&_&&u.jsx("div",{className:"drawer__hint","data-id":"UpdateDrawer-stuck",children:r("updateDrawer.stuckHint","正在等待新版本就绪,耗时比平常久。可以放到后台继续,完成或失败都会提示。")}),u.jsx("div",{className:"drawer__foot",children:_?u.jsx(u.Fragment,{children:u.jsx("span",{className:"drawer__foot-status",children:s.kind==="app"?r("updateBanner.downloading","正在下载更新")+"…":r("updateDrawer.inProgress","更新进行中…")})}):s.status==="ready"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("updateBanner.readyShort","下载完成")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-install",onClick:()=>s.onInstall&&s.onInstall(),children:r("updateBanner.installBtn","立即安装")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-later",onClick:()=>ve.close(),children:r("updateBanner.later","稍后")})]}):s.status==="error"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-error",children:r("updateDrawer.failed","更新失败")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-dismiss",onClick:()=>ve.close(),children:r("common.close","关闭")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("updateDrawer.updatedLatest","已更新到最新")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-finish",onClick:()=>ve.close(),children:r("common.done","完成")})]})})]})})}function Cp(){var La;const[s,v]=A.useState(void 0);A.useEffect(()=>{var w,O;if(!((O=(w=window.cicy)==null?void 0:w.terms)!=null&&O.status)){v(!0);return}window.cicy.terms.status(Zh).then(G=>v(!!(G!=null&&G.accepted))).catch(()=>v(!0))},[]),A.useEffect(()=>{var G,I,at,At;const w=document.documentElement;try{w.setAttribute("data-platform",((G=window.cicy)==null?void 0:G.platform)||"linux")}catch{}w.setAttribute("data-fullscreen","0");let O;try{O=(At=(at=(I=window.cicy)==null?void 0:I.window)==null?void 0:at.onFullscreen)==null?void 0:At.call(at,St=>w.setAttribute("data-fullscreen",St?"1":"0"))}catch{}return()=>{try{O&&O()}catch{}}},[]),A.useEffect(()=>{var O,G;if(!((G=(O=window.cicy)==null?void 0:O.docker)!=null&&G.onAppProgress))return;const w=window.cicy.docker.onAppProgress(I=>{!I||I.phase==="open"||(Jt||Ut.open({source:"auto"}),(Jt==null?void 0:Jt.source)==="auto"&&(I.phase==="done"&&(I.status==="done"||I.status==="reboot")?Ut.finish({ok:I.status==="done",status:I.status==="reboot"?"reboot":void 0,message:I.message}):I.status==="error"?Ut.finish({ok:!1,message:I.message}):Ut.push(I)))});return()=>{try{w&&w()}catch{}}},[]);const[b,o]=A.useState(()=>Ll(Rl)),[g,_]=A.useState(()=>Ll(lc)),[m,f]=A.useState(()=>Ll(Hi)),[y,h]=A.useState(()=>!Ll(Rl)),[q,j]=A.useState(!1),[B,Y]=A.useState(!1),[et,$]=A.useState(""),[st,wt]=A.useState(""),[Bt,gt]=A.useState(!1),[Rt,yt]=A.useState(""),[Ht,C]=A.useState(""),[L,p]=A.useState(null),[M,U]=A.useState(null),[K,lt]=A.useState(!1),[rt,pt]=A.useState(""),N=A.useRef(!1),[H,nt]=A.useState(null),[_t,Dt]=A.useState(!1),[S,X]=A.useState(!1),[P,ut]=A.useState({}),xt=A.useCallback(async()=>{var w,O,G;try{const I=await((G=(O=(w=window.cicy)==null?void 0:w.localTeams)==null?void 0:O.avatars)==null?void 0:G.call(O));ut(I&&typeof I=="object"?I:{})}catch{}},[]),[Ct,Mt]=A.useState(!1),[re,qt]=A.useState(!1),[Ze,it]=A.useState(""),[Vt,Ee]=A.useState(""),[Wt,Ue]=A.useState(!1),[Ve,ze]=A.useState(""),[Be,Oa]=A.useState("all"),[$t,aa]=A.useState(()=>{try{return JSON.parse(localStorage.getItem("cicy_hubs")||"[]")}catch{return[]}}),[ge,Sa]=A.useState(null),[de,F]=A.useState({}),[ht,ct]=A.useState(!1),[ot,Lt]=A.useState(null),[Q,tt]=A.useState(""),[J,ft]=A.useState(""),[bt,Qt]=A.useState(""),[ne,jt]=A.useState(null),[kt,Me]=A.useState(""),[te,Ne]=A.useState(null),wa=w=>{aa(w);try{localStorage.setItem("cicy_hubs",JSON.stringify(w))}catch{}},Je=(w,O)=>wa($t.map(G=>G.id===w?{...G,...Object.fromEntries(Object.entries(O).filter(([,I])=>I!==void 0))}:G)),al=w=>{wa($t.filter(O=>O.id!==w)),F(O=>{const G={...O};return delete G[w],G}),ge===w&&Sa(null)},ln=w=>{const O=String(w||"").trim();if(!O)return null;try{const G=JSON.parse(O);if(G&&G.url){try{new URL(G.url)}catch{return null}return{url:String(G.url).replace(/\/$/,""),token:String(G.token||"")}}}catch{try{return new URL(O),{url:O.replace(/\/$/,""),token:""}}catch{return null}}return null},uc=()=>{Lt(null),tt(""),ft(""),Qt(""),ct(!0)},Zi=w=>{Lt(w.id),tt(JSON.stringify({v:1,type:"hub",url:w.url,token:w.token||""})),ft(w.name||""),Qt(""),ct(!0)},Yl=()=>{const w=ln(Q);if(!w){Qt(r("hub.badPaste","无法解析,请粘贴 Hub 的 JSON(需含 url)"));return}if(ot)Je(ot,{url:w.url,token:w.token,name:J.trim()||void 0}),F(O=>({...O,[ot]:void 0}));else{const O=`hub-${Date.now()}`,G=J.trim()||`Hub${$t.length+1}`;wa([...$t,{id:O,name:G,url:w.url,token:w.token}]),Sa(O)}ct(!1)};A.useEffect(()=>{!ge&&$t.length&&Sa($t[0].id)},[$t,ge]);const un=A.useCallback(async w=>{var O,G;if(!(!w||!((G=(O=window.cicy)==null?void 0:O.cloud)!=null&&G.fetch))){F(I=>({...I,[w.id]:null}));try{const I=String(w.url||"").replace(/\/$/,"");let at="";try{at=new URL(I).host}catch{}const At=await window.cicy.cloud.fetch(`${I}/_agents`,{headers:w.token?{Authorization:`Bearer ${w.token}`}:{}});let St=[];if(At!=null&&At.ok){const ee=JSON.parse(At.body||"{}");St=(Array.isArray(ee==null?void 0:ee.teams)?ee.teams:[]).map(fe=>({id:String(fe.team),name:String(fe.team),org:fe.org||"",host_url:`https://${fe.team}.${at}`,agents:Array.isArray(fe.agents)?fe.agents:[]}))}F(ee=>({...ee,[w.id]:St}))}catch{F(I=>({...I,[w.id]:[]}))}}},[]);A.useEffect(()=>{if(!ge)return;const w=$t.find(O=>O.id===ge);w&&de[ge]===void 0&&un(w)},[ge,$t,de,un]);const Gl=A.useCallback(async(w,O)=>{var I,at,At,St;if(!w)return;if(!((at=(I=window.cicy)==null?void 0:I.cloud)!=null&&at.fetch)){pt("cloud fetch bridge missing");return}lt(!0),pt("");const G={Authorization:`Bearer ${w}`};try{const[ee,fe]=await Promise.all([window.cicy.cloud.fetch(`${el}/api/user/self`,{headers:G}),window.cicy.cloud.fetch(`${el}/api/teams`,{headers:G})]);if((fe==null?void 0:fe.status)===401){if(!N.current&&((St=(At=window.cicy)==null?void 0:At.auth)!=null&&St.loginStart)){N.current=!0,pt(r("auth.sessionExpired","会话已过期,正在重新登录…"));try{await window.cicy.auth.loginStart()}catch{}}return}if(fe!=null&&fe.ok){const De=JSON.parse(fe.body||"{}");U(Array.isArray(De==null?void 0:De.teams)?De.teams:[])}else U(De=>De===null?[]:De);if(ee!=null&&ee.ok)try{const De=JSON.parse(ee.body||"{}");p((De==null?void 0:De.success)===!1?null:(De==null?void 0:De.data)||null)}catch{p(null)}else p(null)}catch{pt(""),U(fe=>fe===null?[]:fe)}finally{lt(!1)}},[]),cn=A.useRef("");A.useEffect(()=>{cn.current=b||g||""},[b,g]);const _a=A.useCallback(async()=>{var O,G;const w=cn.current;if(!(!w||!((G=(O=window.cicy)==null?void 0:O.cloud)!=null&&G.fetch)))try{const I=await window.cicy.cloud.fetch(`${el}/api/teams`,{headers:{Authorization:`Bearer ${w}`}});if(I!=null&&I.ok){const at=JSON.parse(I.body||"{}");Array.isArray(at==null?void 0:at.teams)&&U(at.teams)}}catch{}},[]),Ql=A.useCallback(async(w,O)=>{var at,At;const G=cn.current,I=String(O||"").trim();if(!G||!((At=(at=window.cicy)==null?void 0:at.cloud)!=null&&At.fetch)||!I)return{ok:!1,error:"no session / empty"};try{const St=await window.cicy.cloud.fetch(`${el}/api/teams/${w}`,{method:"PATCH",headers:{Authorization:`Bearer ${G}`,"Content-Type":"application/json"},body:JSON.stringify({title:I})});return St!=null&&St.ok?(await _a(),{ok:!0}):{ok:!1,error:`${(St==null?void 0:St.status)||"?"} ${(St==null?void 0:St.error)||""}`}}catch(St){return{ok:!1,error:St.message}}},[_a]),Xl=A.useCallback(async(w,O)=>{var at,At;const G=cn.current,I=String(O||"").trim();if(!G||!((At=(at=window.cicy)==null?void 0:at.cloud)!=null&&At.fetch)||!I)return{ok:!1,error:"no session / empty"};try{new URL(I)}catch{return{ok:!1,error:"地址格式不对(需 http(s)://…)"}}try{const St=await window.cicy.cloud.fetch(`${el}/api/teams/${w}`,{method:"PATCH",headers:{Authorization:`Bearer ${G}`,"Content-Type":"application/json"},body:JSON.stringify({hostUrl:I})});return St!=null&&St.ok?(await _a(),{ok:!0}):{ok:!1,error:`${(St==null?void 0:St.status)||"?"} ${(St==null?void 0:St.error)||""}`}}catch(St){return{ok:!1,error:St.message}}},[_a]),Zl=A.useCallback(async w=>{var G,I;const O=cn.current;if(!O||!((I=(G=window.cicy)==null?void 0:G.cloud)!=null&&I.fetch)){Nt.show({message:r("common.noAuth","未登录"),status:"error",ttl:5e3});return}try{const at=await window.cicy.cloud.fetch(`${el}/api/teams/${w.id}`,{method:"DELETE",headers:{Authorization:`Bearer ${O}`}});at!=null&&at.ok||(at==null?void 0:at.status)===200||(at==null?void 0:at.status)===204?(Nt.show({message:r("teamCard.deleted","团队已删除"),status:"done",ttl:3e3}),await _a()):Nt.show({message:`${r("teamCard.deleteFailed","删除失败")}: ${(at==null?void 0:at.status)||"?"} ${(at==null?void 0:at.error)||""}`,status:"error",ttl:7e3})}catch(at){Nt.show({message:`${r("teamCard.deleteFailed","删除失败")}: ${at.message}`,status:"error",ttl:7e3})}},[_a]);A.useEffect(()=>{const w=b||g;w?Gl(w,m):U(O=>O===null?[]:O)},[b,g,m,Gl]);const We=A.useCallback(async()=>{var w,O;if((O=(w=window.cicy)==null?void 0:w.localTeams)!=null&&O.list){Dt(!0);try{const G=await window.cicy.localTeams.list({refresh:!0,uid:Ll(Hi)||""});nt(Array.isArray(G)?G:[])}catch{nt([])}finally{Dt(!1),X(!0)}}},[]);async function Vl(){if(Wt)return;const w=Vt.trim();if(!w){ze(r("teams.urlRequired","请输入地址 URL"));return}try{new URL(w)}catch{ze(r("teams.badUrl","URL 无效(需含 http(s)://)"));return}ze(""),Ue(!0);try{const O=await window.cicy.localTeams.add({base_url:w,name:Ze.trim(),failIfExists:!0});if(!O||O.ok===!1){ze((O==null?void 0:O.error)==="exists"?r("teams.urlExists","该地址已存在"):nn((O==null?void 0:O.error)||"add failed"));return}await We(),it(""),Ee(""),qt(!1)}catch(O){ze(nn((O==null?void 0:O.message)||String(O)))}finally{Ue(!1)}}const Ta=A.useCallback(async(w,O)=>{var I,at;if(!((at=(I=window.cicy)==null?void 0:I.localTeams)!=null&&at.update))return{ok:!1,error:"no_bridge"};let G;try{G=await window.cicy.localTeams.update(w,{name:String(O||"").trim()||r("localTeams.unnamed","未命名")})}catch(At){G={ok:!1,error:(At==null?void 0:At.message)||String(At)}}return await We(),G||{ok:!1,error:"no_result"}},[We]);A.useEffect(()=>{let w,O=!1;const G=3e3,I=3e4,at=async()=>{var ee,fe,De;try{await((De=(fe=(ee=window.cicy)==null?void 0:ee.localTeams)==null?void 0:fe.syncCloud)==null?void 0:De.call(fe))}catch{}await Promise.all([We(),_a(),xt()])},At=()=>{if(O)return;const ee=document.visibilityState==="visible";w=setTimeout(async()=>{document.visibilityState==="visible"?await at():await We(),At()},ee?G:I)};at(),At();const St=()=>{document.visibilityState==="visible"&&at()};return document.addEventListener("visibilitychange",St),window.addEventListener("focus",St),()=>{O=!0,clearTimeout(w),document.removeEventListener("visibilitychange",St),window.removeEventListener("focus",St)}},[We,_a]),A.useEffect(()=>{var O,G;if(!((G=(O=window.cicy)==null?void 0:O.localTeams)!=null&&G.onWebviewRelay))return;const w=window.cicy.localTeams.onWebviewRelay(async({reqId:I,msg:at})=>{let At={ok:!1,error:"unknown relay type"};try{(at==null?void 0:at.type)==="localTeams:add"?At=await window.cicy.localTeams.add(at.spec||{}):(at==null?void 0:at.type)==="localTeams:remove"?At=await window.cicy.localTeams.remove(at.id):(at==null?void 0:at.type)==="localTeams:update"?At=await window.cicy.localTeams.update(at.id,at.patch||{}):(at==null?void 0:at.type)==="localTeams:upgrade"?At=await window.cicy.localTeams.upgrade(at.id):(at==null?void 0:at.type)==="localTeams:list"&&(At={ok:!0,teams:await window.cicy.localTeams.list({refresh:!0})}),We()}catch(St){At={ok:!1,error:(St==null?void 0:St.message)||String(St)}}try{window.cicy.localTeams.replyWebviewRelay(I,At)}catch{}});return()=>{try{w==null||w()}catch{}}},[We]);const _e=A.useCallback(async w=>{var O,G;if((G=(O=window.cicy)==null?void 0:O.localTeams)!=null&&G.open)try{await window.cicy.localTeams.open(w)}catch{}},[]);A.useEffect(()=>{var O,G;if(Ll(Rl)){h(!1);return}if(!((G=(O=window.cicy)==null?void 0:O.auth)!=null&&G.getSaved)){h(!1);return}let w=!1;return(async()=>{try{const I=await window.cicy.auth.getSaved();if(w)return;if(I!=null&&I.token){try{localStorage.setItem(Rl,I.token)}catch{}if(o(I.token),I.accessToken){try{localStorage.setItem(lc,I.accessToken)}catch{}_(I.accessToken)}if(I.userId){try{localStorage.setItem(Hi,String(I.userId))}catch{}f(String(I.userId))}}}catch{}finally{w||h(!1)}})(),()=>{w=!0}},[]),A.useEffect(()=>{var w,O;if((O=(w=window.cicy)==null?void 0:w.auth)!=null&&O.onComplete)return window.cicy.auth.onComplete(G=>{if(j(!1),gt(!1),G!=null&&G.error){yt(nn(G.error));return}if(G!=null&&G.token){N.current=!1,pt("");try{localStorage.setItem(Rl,G.token)}catch{}if(o(G.token),G.accessToken){try{localStorage.setItem(lc,G.accessToken)}catch{}_(G.accessToken)}if(G.userId){try{localStorage.setItem(Hi,String(G.userId))}catch{}f(String(G.userId))}yt(""),C(G.reused?r("auth.welcomeBack","已恢复你之前的登录"):r("auth.loginSuccess","登录成功")),setTimeout(()=>C(""),3e3)}})},[]);async function Ye(){var w,O;if(!(B||q)){if(!((O=(w=window.cicy)==null?void 0:w.auth)!=null&&O.loginStart)){yt("auth bridge missing");return}yt(""),Y(!0);try{const G=await window.cicy.auth.loginStart();if(!(G!=null&&G.ok)){yt(nn((G==null?void 0:G.error)||"login start failed"));return}$(G.url||""),j(!0)}catch(G){yt(nn((G==null?void 0:G.message)||String(G)))}finally{Y(!1)}}}async function Ua(){var O,G;if(B)return;if(!((G=(O=window.cicy)==null?void 0:O.auth)!=null&&G.emailLoginStart)){yt("auth bridge missing");return}const w=st.trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(w)){yt(r("auth.badEmail","请输入有效的邮箱地址"));return}yt(""),Y(!0);try{const I=await window.cicy.auth.emailLoginStart(w);if(!(I!=null&&I.ok)){yt(nn((I==null?void 0:I.error)||"email login failed"));return}gt(!0)}catch(I){yt(nn((I==null?void 0:I.message)||String(I)))}finally{Y(!1)}}function Kl(){var w,O,G;try{localStorage.removeItem(Rl),localStorage.removeItem(lc),localStorage.removeItem(Hi)}catch{}try{(G=(O=(w=window.cicy)==null?void 0:w.auth)==null?void 0:O.logout)==null||G.call(O)}catch{}o(null),_(null),f(null),p(null),U(null),yt(""),pt("")}if(s===void 0)return u.jsxs("div",{className:"shell","data-id":"TermsCheckingSplash",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(To,{}),u.jsx("div",{className:"spinner-row",children:u.jsx(Xe,{})})]})]});if(!s)return u.jsx(Kh,{onAgree:()=>v(!0)});if(!b&&y)return u.jsxs("div",{className:"shell","data-id":"AuthRestoringSplash",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(To,{}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Xe,{}),u.jsx("span",{children:r("auth.restoring","正在恢复登录…")})]})]})]});if(!b)return u.jsxs("div",{className:"shell",children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"card",children:[u.jsx(To,{}),!q&&!Bt&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline",children:r("auth.tagline","登录以同步你的团队、配置与 AI 助手")}),u.jsx("label",{className:"login-label","data-id":"EmailLoginLabel",htmlFor:"cicy-email-login",children:r("auth.emailLabel","输入邮箱,用邮件链接登录")}),u.jsx("input",{id:"cicy-email-login",type:"email",className:"login-email-input","data-id":"EmailLoginInput",value:st,onChange:w=>wt(w.target.value),onKeyDown:w=>{w.key==="Enter"&&Ua()},placeholder:r("auth.emailPlaceholder","you@example.com"),autoComplete:"email",spellCheck:!1,autoFocus:!0}),u.jsx("button",{className:"btn-primary","data-id":"EmailLoginSubmit",onClick:Ua,disabled:B,children:B?u.jsxs(u.Fragment,{children:[u.jsx(Xe,{}),u.jsx("span",{children:r("auth.sending","发送中…")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{children:r("auth.emailLogin","发送登录链接")}),u.jsx(Xi,{})]})}),u.jsx("p",{className:"hint",children:r("auth.emailHint","手机上点邮件里的链接,也能登录这台电脑")}),u.jsx("div",{className:"login-divider","data-id":"LoginDivider",children:u.jsx("span",{children:r("auth.or","或")})}),u.jsx("button",{className:"btn-ghost","data-id":"BrowserLoginBtn",onClick:Ye,disabled:B,children:B?r("auth.opening","打开中…"):r("auth.browserLogin","用浏览器登录(Google / SSO,仅同一台电脑)")})]}),Bt&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline","data-id":"EmailSentTagline",children:r("auth.emailSentTagline","登录邮件已发送")}),u.jsxs("p",{className:"hint","data-id":"EmailSentHint",style:{textAlign:"center"},children:[r("auth.emailSentHint","到邮箱打开链接即可(手机、电脑都行),这里会自动登录。"),u.jsx("br",{}),st]}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Xe,{}),u.jsx("span",{children:r("auth.emailWaiting","等待确认…")})]}),u.jsx("button",{className:"btn-ghost","data-id":"EmailSentCancel",onClick:()=>{var w,O,G;(G=(O=(w=window.cicy)==null?void 0:w.auth)==null?void 0:O.emailLoginCancel)==null||G.call(O),gt(!1)},children:r("auth.cancel","取消")})]}),q&&u.jsxs(u.Fragment,{children:[u.jsx("p",{className:"tagline",children:r("auth.waitingTagline","已在浏览器打开登录页,等待你完成…")}),u.jsxs("div",{className:"spinner-row",children:[u.jsx(Xe,{}),u.jsx("span",{children:r("auth.waitingCallback","等待回调")})]}),et&&u.jsxs("div",{className:"login-fallback","data-id":"LoginUrlFallback",style:{marginTop:10,textAlign:"center"},children:[u.jsx("p",{className:"hint",style:{marginBottom:6},children:r("auth.browserNotOpened","浏览器没自动打开?")}),u.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-open",onClick:()=>{var w,O,G;try{(G=(O=(w=window.cicy)==null?void 0:w.shell)==null?void 0:O.openExternal)==null||G.call(O,et)}catch{}},children:r("auth.openManually","手动打开登录页")}),u.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-copy",onClick:()=>{var w;try{(w=navigator.clipboard)==null||w.writeText(et),C(r("auth.linkCopied","链接已复制,粘到浏览器打开")),setTimeout(()=>C(""),2500)}catch{}},children:r("auth.copyLink","复制链接")}),u.jsx("p",{className:"hint","data-id":"LoginUrlFallback-url",style:{wordBreak:"break-all",marginTop:6,fontSize:11,opacity:.7,userSelect:"text"},children:et})]}),u.jsx("button",{className:"btn-ghost",onClick:()=>{var w,O,G;(G=(O=(w=window.cicy)==null?void 0:w.auth)==null?void 0:O.loginCancel)==null||G.call(O),j(!1),$("")},children:r("auth.cancel","取消")})]}),Rt&&u.jsx("div",{className:"error",children:Rt})]})]});const Ca=(H||[]).find(w=>Uh(w.base_url))||null,sn=Ca&&Ca.cloud_team_id?(M||[]).find(w=>String(w.teamId||w.id)===String(Ca.cloud_team_id)):null,Jl=w=>{if(!w)return null;const O=(M||[]).find(G=>String(G.teamId||G.id)===String(w));return O&&O.code||null},Na=(H||[]).filter(w=>Eo(w.base_url)),nl=(H||[]).filter(w=>!Eo(w.base_url)&&!Uh(w.base_url)),Ba=Na.length+(Ca?1:0),Ra=nl.length,on=(M||[]).filter(w=>!w.is_local&&w.kind!=="local"&&(w.kind==="private"||w.team_kind==="personal")),Ha=on.length,xe=Be==="all"||Be==="local",Vi=Be==="all"||Be==="custom",Ki=Be==="all"||Be==="cloud",na=H===null||M===null;return u.jsxs("div",{className:"shell shell--app",children:[u.jsx("div",{className:"glow glow--app","aria-hidden":!0}),u.jsxs("div",{className:"shell__left",children:[u.jsx(Ep,{me:L,welcome:Ht,onLogout:Kl,mitmTeam:Na.length>0?Na[0]:null}),u.jsx(Up,{}),u.jsxs("main",{className:"main",children:[u.jsxs("div",{className:"app__tabsrow",children:[u.jsx("div",{className:"app__tabs",children:[{k:"all",label:r("teamFilter.all","全部"),n:Ba+Ra+Ha},{k:"local",label:r("teamFilter.local","本地"),n:Ba},{k:"cloud",label:r("teamFilter.cloud","私有云"),n:Ha},{k:"custom",label:r("teamFilter.custom","自定义"),n:Ra}].map(({k:w,label:O,n:G})=>u.jsxs("button",{type:"button",className:`app__tab ${Be===w?"is-active":""}`,onClick:()=>Oa(w),children:[O,u.jsx("span",{className:"app__tab-count",children:G})]},w))}),u.jsxs("div",{"data-id":"AddTeamWrap",style:{position:"relative"},children:[u.jsxs("button",{type:"button","data-id":"AddTeamButton",className:"app__add-team",title:r("teams.addHint","添加团队"),onClick:()=>Mt(w=>!w),children:["+ ",r("teams.add","新加团队")]}),Ct&&u.jsxs(u.Fragment,{children:[u.jsx("div",{onClick:()=>Mt(!1),style:{position:"fixed",inset:0,zIndex:40}}),u.jsxs("div",{"data-id":"AddTeamMenu",role:"menu",style:{position:"absolute",top:"calc(100% + 6px)",right:0,zIndex:41,minWidth:240,background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:10,boxShadow:"0 10px 30px rgba(0,0,0,.45)",overflow:"hidden"},children:[u.jsxs("button",{type:"button","data-id":"AddTeamMenu-custom",className:"bcard__menu-item",style:{display:"block",width:"100%",textAlign:"left",padding:"11px 14px",border:"none",background:"transparent",cursor:"pointer",color:"inherit"},onClick:()=>{Mt(!1),ze(""),qt(!0)},children:[u.jsx("div",{style:{fontSize:13,fontWeight:600},children:r("teams.addCustom","自定义团队")}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:2},children:r("teams.addCustomSub","手动输入地址和名称(只存本地)")})]}),u.jsxs("button",{type:"button","data-id":"AddTeamMenu-private",className:"bcard__menu-item",style:{display:"block",width:"100%",textAlign:"left",padding:"11px 14px",border:"none",borderTop:"1px solid var(--border, #2c2f36)",background:"transparent",cursor:"pointer",color:"inherit"},onClick:()=>{Mt(!1),Qi("?tab=private")},children:[u.jsx("div",{style:{fontSize:13,fontWeight:600},children:r("teams.addPrivate","私有云团队")}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:2},children:r("teams.addPrivateSub","去云端团队中心添加")})]})]})]})]})]}),re&&u.jsx("div",{"data-id":"CustomTeamModal",style:{position:"fixed",inset:0,zIndex:60,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:w=>{!Wt&&w.target===w.currentTarget&&qt(!1)},children:u.jsxs("div",{onClick:w=>w.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("teams.customTitle","添加自定义团队")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:r("teams.customSub","连接到一个已有的 cicy-code 地址")}),u.jsx("label",{style:{display:"block",fontSize:12,opacity:.75,marginBottom:6},children:r("teams.customNameLabel","名称")}),u.jsx("input",{"data-id":"CustomTeamModal-title",className:"login-email-input",style:{width:"100%",marginBottom:14},value:Ze,onChange:w=>it(w.target.value),placeholder:r("teams.customNamePlaceholder","我的团队"),spellCheck:!1,autoFocus:!0}),u.jsx("label",{style:{display:"block",fontSize:12,opacity:.75,marginBottom:6},children:r("teams.customUrlLabel","地址 URL")}),u.jsx("input",{"data-id":"CustomTeamModal-url",className:"login-email-input",style:{width:"100%",marginBottom:6},value:Vt,onChange:w=>Ee(w.target.value),placeholder:"https://example.com:8008",spellCheck:!1,onKeyDown:w=>{w.key==="Enter"&&Vl()}}),Ve&&u.jsx("div",{className:"error",style:{marginTop:10},children:Ve}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost","data-id":"CustomTeamModal-cancel",disabled:Wt,onClick:()=>qt(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"CustomTeamModal-submit",disabled:Wt,onClick:Vl,children:Wt?r("teams.adding","添加中…"):r("teams.addAction","添加")})]})]})}),rt&&u.jsxs("div",{className:"error",style:{marginBottom:12},children:[r("common.cloud","云端"),": ",rt,u.jsx("button",{className:"btn-ghost",style:{marginLeft:8},onClick:()=>Gl(b||g,m),children:r("common.retry","重试")})]}),u.jsxs("div",{className:"app__grid",children:[na&&[0,1,2].map(w=>u.jsx(Hh,{},"skc"+w)),!na&&xe&&Na.map(w=>u.jsx(Oh,{team:w,cloudCode:Jl(w.cloud_team_id),onOpen:()=>_e(w.id),onRename:Ta,onRefresh:We},"local:"+w.id)),!na&&xe&&u.jsx(Mp,{dockerTeam:Ca,onOpen:async()=>{var w,O,G;try{const I=await((G=(O=(w=window.cicy)==null?void 0:w.docker)==null?void 0:O.appOpen)==null?void 0:G.call(O));I!=null&&I.ok||Nt.show({id:"docker-open",status:"error",ttl:6e3,message:r("docker.openNoToken","服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。")})}catch(I){console.warn("[DockerCard] open",I)}},cloudTitle:sn==null?void 0:sn.title,cloudCode:sn==null?void 0:sn.code,onRename:Ca!=null&&Ca.cloud_team_id?(w=>Ql(Ca.cloud_team_id,w)):void 0,onRefresh:We}),!na&&Vi&&nl.map(w=>u.jsx(Oh,{team:w,cloudCode:Jl(w.cloud_team_id),onOpen:()=>_e(w.id),onRename:Ta,onRefresh:We},"custom:"+w.id)),!na&&Ki&&on.map(w=>u.jsx(Op,{team:w,onOpen:()=>{var G,I,at;const O=w.kind==="private"?w.host_url:w.workspace_url||w.workspace_direct_url;O&&((at=(I=(G=window.cicy)==null?void 0:G.tabs)==null?void 0:I.open)==null||at.call(I,O,w.name||w.title||"",P[w.id]||"",!0,w.id))},avatar:P[w.id]||"",onAvatar:xt,onRename:Ql,onEditUrl:Xl,onDelete:Zl},"cloud:"+w.id))]}),!K&&!rt&&M&&M.length===0&&!(H!=null&&H.length)&&u.jsx("div",{className:"empty",style:{marginTop:14},children:r("teams.emptyHint","还没有团队 — 安装本地 cicy-code 起一个本地 team,或在云端创建。")}),u.jsx("div",{"data-id":"SectionHead-hub",className:"app__tabsrow",style:{marginTop:26},children:u.jsxs("div",{className:"app__tabs","data-id":"HubTabs",children:[$t.map(w=>ne===w.id?u.jsx("input",{"data-id":"HubTab-rename",autoFocus:!0,className:"app__tab hubtab",value:kt,onChange:O=>Me(O.target.value),onBlur:()=>{const O=kt.trim();O&&Je(w.id,{name:O}),jt(null)},onKeyDown:O=>{if(O.key==="Enter"){const G=kt.trim();G&&Je(w.id,{name:G}),jt(null)}else O.key==="Escape"&&jt(null)},style:{font:"inherit",padding:"4px 10px",border:"1px solid #3b82f6",borderRadius:999,background:"#0d1117",color:"#e6edf3"}},w.id):u.jsxs("div",{"data-id":"HubTab",className:`app__tab hubtab ${ge===w.id?"is-active":""}`,onClick:()=>Sa(w.id),title:w.url,children:[u.jsx("span",{className:"hubtab__name",onDoubleClick:O=>{O.stopPropagation(),Me(w.name),jt(w.id)},children:w.name}),u.jsxs("span",{className:"hubtab__actions",children:[u.jsx("button",{type:"button","data-id":"HubTab-edit-btn",title:r("hub.editAddr","编辑地址"),onClick:O=>{O.stopPropagation(),Zi(w)},children:"⚙"}),u.jsx("button",{type:"button","data-id":"HubTab-del-btn",className:"is-danger",title:r("common.delete","删除"),onClick:O=>{O.stopPropagation(),Ne(w.id)},children:"✕"})]})]},w.id)),u.jsxs("button",{type:"button","data-id":"HubTab-add",className:"app__tab",style:{opacity:.75},onClick:uc,children:["+ ",r("hub.add","添加 Hub")]})]})}),u.jsx("div",{className:"app__grid","data-id":"HubTeamsGrid",children:$t.length?de[ge]===void 0||de[ge]===null?[0,1,2].map(w=>u.jsx(Hh,{},"hubteamskel"+w)):de[ge].length?de[ge].map(w=>{const O=$t.find(at=>at.id===ge),G=(O==null?void 0:O.token)||"",I=G?`${w.host_url}?token=${encodeURIComponent(G)}`:w.host_url;return u.jsx(Lp,{team:w,onOpen:()=>{var at,At,St;return(St=(At=(at=window.cicy)==null?void 0:at.tabs)==null?void 0:At.open)==null?void 0:St.call(At,I,w.name,"",!0,`${ge}:${w.id}`)}},w.id)}):u.jsx("div",{className:"empty",style:{gridColumn:"1/-1"},children:r("hub.noTeams","该 Hub 暂无在线 team")}):u.jsx("div",{className:"empty",style:{gridColumn:"1/-1"},children:r("hub.empty","还没有 Hub —— 点「添加 Hub」粘贴 Hub 的 JSON")})}),ht&&(()=>{const w=ot?$t.find(I=>I.id===ot):null,O=w?{url:w.url,token:w.token||""}:ln(Q),G=O&&O.url?JSON.stringify({v:1,type:"hub",url:O.url,token:O.token||""}):"";return u.jsx("div",{"data-id":"HubModal",style:{position:"fixed",inset:0,zIndex:60,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:I=>{I.target===I.currentTarget&&ct(!1)},children:u.jsxs("div",{onClick:I=>I.stopPropagation(),style:{width:G?600:460,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:ot?r("hub.editTitle","编辑 Hub"):r("hub.addTitle","添加 Hub")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:r("hub.pasteSub","粘贴 Hub 的 JSON(含 url、token),只存在本地(不上云)。")}),u.jsxs("div",{style:{display:"flex",gap:20,alignItems:"flex-start"},children:[u.jsxs("div",{style:{flex:1,minWidth:0},children:[u.jsx("div",{style:{fontSize:12,opacity:.7,marginBottom:6},children:r("hub.name","名称(可选)")}),u.jsx("input",{"data-id":"HubModal-name",className:"login-email-input",style:{width:"100%"},value:J,placeholder:"Hub1",onChange:I=>ft(I.target.value)}),u.jsx("div",{style:{fontSize:12,opacity:.7,margin:"12px 0 6px"},children:r("hub.paste","Hub JSON")}),u.jsx("textarea",{"data-id":"HubModal-paste",className:"login-email-input",style:{width:"100%",minHeight:120,fontFamily:"var(--mono)",fontSize:11,resize:"vertical"},spellCheck:!1,value:Q,placeholder:'{"v":1,"type":"hub","url":"https://hub.cicy-ai.com","token":"…"}',onChange:I=>{tt(I.target.value),Qt("")}}),bt&&u.jsx("div",{className:"error",style:{marginTop:8,fontSize:12},children:bt})]}),G&&u.jsxs("div",{"data-id":"HubModal-qr",style:{flex:"none",width:172,textAlign:"center"},children:[u.jsx(qp,{text:G,size:172}),u.jsx("div",{style:{fontSize:11,opacity:.6,marginTop:8,lineHeight:1.5},children:r("hub.scan","用 CiCy Mobile 扫码添加此 Hub")})]})]}),u.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginTop:18,gap:12},children:[u.jsxs("button",{type:"button","data-id":"HubModal-repo",title:"https://github.com/cicy-ai/cicy-hub",onClick:()=>{var I,at,At;return(At=(at=(I=window.cicy)==null?void 0:I.tabs)==null?void 0:at.openIn)==null?void 0:At.call(at,Vh,"https://github.com/cicy-ai/cicy-hub","cicy-hub")},style:{flex:"1 1 auto",minWidth:0,display:"inline-flex",alignItems:"center",gap:6,border:"none",background:"transparent",cursor:"pointer",color:"var(--muted, #8b949e)",fontSize:12,fontFamily:"var(--mono)",padding:0,overflow:"hidden"},children:[u.jsx(Yp,{}),u.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:"cicy-ai/cicy-hub"})]}),u.jsxs("div",{style:{flex:"none",display:"flex",gap:8},children:[u.jsx("button",{type:"button",className:"btn-ghost","data-id":"HubModal-cancel",style:{whiteSpace:"nowrap"},onClick:()=>ct(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"HubModal-save",style:{whiteSpace:"nowrap"},disabled:!Q.trim(),onClick:Yl,children:r("common.save","保存")})]})]})]})})})(),te&&da.createPortal(u.jsx("div",{"data-id":"HubDelModal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:w=>{w.target===w.currentTarget&&Ne(null)},children:u.jsxs("div",{onClick:w=>w.stopPropagation(),style:{width:360,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("hub.deleteTitle","删除 Hub")}),u.jsxs("div",{style:{fontSize:13,opacity:.7,marginBottom:16},children:[r("hub.deleteConfirm","确定删除")," “",((La=$t.find(w=>w.id===te))==null?void 0:La.name)||"","”?"]}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:()=>Ne(null),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary",style:{background:"#b42318"},onClick:()=>{al(te),Ne(null)},children:r("common.delete","删除")})]})]})}),document.body)]})]}),u.jsx(_p,{}),u.jsx(Tp,{}),u.jsx(zp,{})]})}function jp({onClose:s}){const[v,b]=A.useState(null),[o,g]=A.useState(""),[_,m]=A.useState(!1),[f,y]=A.useState(""),h=typeof window<"u"&&window.cicy&&window.cicy.trustedOrigins||null,q=A.useCallback(async()=>{try{b(h&&await h.list()||[])}catch{b([])}},[h]);A.useEffect(()=>{q()},[q]);const j=async()=>{const et=o.trim();if(!(!et||_||!h)){m(!0),y("");try{const $=await h.add(et);$&&$.ok===!1?y($.error||r("trustedSites.addFailed","添加失败")):(g(""),b($&&$.origins||await h.list()))}catch($){y(String($&&$.message||$))}finally{m(!1)}}},B=async et=>{if(!(_||!h)){m(!0),y("");try{const $=await h.remove(et);$&&$.ok===!1?y($.error||r("trustedSites.removeFailed","删除失败")):b($&&$.origins||await h.list())}catch($){y(String($&&$.message||$))}finally{m(!1)}}},Y={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:et=>({flex:1,fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",fontSize:13,color:et?"#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 da.createPortal(u.jsx("div",{style:Y.overlay,onMouseDown:et=>{et.target===et.currentTarget&&s()},"data-id":"TrustedSitesModal",children:u.jsxs("div",{style:Y.card,onClick:et=>et.stopPropagation(),children:[u.jsxs("div",{style:Y.head,children:[u.jsx("h2",{style:Y.title,children:r("trustedSites.title","受信任站点")}),u.jsx("button",{type:"button",style:Y.x,onClick:s,"aria-label":"close",children:"✕"})]}),u.jsx("div",{style:Y.warn,children:r("trustedSites.warn","⚠ 列表中的站点可以在你的电脑上执行命令(exec)。只添加你完全信任的地址。")}),u.jsxs("div",{style:Y.addRow,children:[u.jsx("input",{"data-id":"trusted-sites-input",style:Y.input,value:o,onChange:et=>g(et.target.value),onKeyDown:et=>{et.key==="Enter"&&j()},placeholder:r("trustedSites.placeholder","添加站点,如 app.cicy-ai.com 或 my-cloud.example.org")}),u.jsx("button",{type:"button","data-id":"trusted-sites-add",style:{...Y.addBtn,opacity:_||!o.trim()?.5:1},onClick:j,disabled:_||!o.trim(),children:r("trustedSites.add","添加")})]}),f&&u.jsx("div",{style:Y.err,children:f}),u.jsx("div",{style:Y.listWrap,children:v===null?u.jsx("div",{style:Y.muted,children:r("trustedSites.loading","加载中…")}):v.length===0?u.jsx("div",{style:Y.muted,children:r("trustedSites.empty","暂无")}):v.map(et=>u.jsxs("div",{style:Y.row,"data-id":"trusted-sites-row",children:[u.jsx("span",{style:Y.host(et.builtin),children:et.host}),et.builtin?u.jsx("span",{style:Y.tag,children:r("trustedSites.builtin","系统")}):u.jsx("button",{type:"button",style:Y.rm,onClick:()=>B(et.host),disabled:_,children:r("trustedSites.remove","删除")})]},et.host))})]})}),document.body)}function Ap({onClose:s}){const[v,b]=A.useState(null),[o,g]=A.useState(""),[_,m]=A.useState(""),[f,y]=A.useState(!1),h=typeof window<"u"&&window.cicy&&window.cicy.rpcAudit||null,q=A.useCallback(async()=>{y(!0),g("");try{const p=h&&await h.tail(400);!p||p.ok===!1?(g(p&&p.error||r("audit.loadFailed","读取失败")),b([])):(b(p.entries||[]),m(p.path||""))}catch(p){g(String(p&&p.message||p)),b([])}finally{y(!1)}},[h]);A.useEffect(()=>{q()},[q]);const[j,B]=A.useState("all"),[Y,et]=A.useState(""),$=p=>{try{return new Date(p).toLocaleString()}catch{return p||""}},st=p=>{if(p.kind==="auth"){const M=/deny/.test(p.decision||"");return{text:p.decision||"auth",color:M?"#fca5a5":"#86efac",bg:M?"rgba(239,68,68,.14)":"rgba(34,197,94,.14)"}}if(p.kind==="rpc"){const M=p.ok!==!1&&!p.error;return{text:M?"ok":"err",color:M?"#86efac":"#fca5a5",bg:M?"rgba(34,197,94,.14)":"rgba(239,68,68,.14)"}}return{text:p.kind||"log",color:"#a1a1aa",bg:"rgba(255,255,255,.06)"}},wt=p=>p.kind==="auth"?`${p.gate||""}${p.decision?" · "+p.decision:""}`:p.kind==="rpc"?`${p.tool||""}${p.dangerous?" ⚠":""}`:p.kind||"",Bt=p=>p.error||p.args||(p.kind==="rpc"?p.channel:"")||"",gt=v||[],Rt=Y.trim().toLowerCase(),yt=gt.filter(p=>j!=="all"&&p.kind!==j?!1:Rt?[p.origin,p.host,p.tool,p.gate,p.decision,p.channel,p.args,p.error,p.kind].filter(Boolean).join(" ").toLowerCase().includes(Rt):!0),Ht="186px 104px minmax(160px,1.1fr) minmax(150px,1.1fr) minmax(220px,1.8fr)",C={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:p=>({background:p?"rgba(255,255,255,.14)":"transparent",border:"1px solid rgba(255,255,255,.12)",borderRadius:999,padding:"6px 16px",color:p?"#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:Ht,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:Ht,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:p=>({justifySelf:"start",fontSize:11.5,color:p.color,background:p.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}},L=p=>u.jsx("div",{children:p});return da.createPortal(u.jsx("div",{style:C.overlay,onMouseDown:p=>{p.target===p.currentTarget&&s()},"data-id":"AuditLogModal",children:u.jsxs("div",{style:C.card,onClick:p=>p.stopPropagation(),children:[u.jsxs("div",{style:C.head,children:[u.jsxs("div",{style:C.titleWrap,children:[u.jsx("h2",{style:C.title,children:r("audit.title","审计日志")}),_&&u.jsx("p",{style:C.subtitle,children:_})]}),u.jsxs("span",{style:C.count,children:[r("audit.count","共")," ",yt.length,j!=="all"||Rt?` / ${gt.length}`:""]}),u.jsx("button",{type:"button","data-id":"audit-refresh",style:{...C.refresh,opacity:f?.5:1},onClick:q,disabled:f,children:r("audit.refresh","刷新")}),u.jsx("button",{type:"button",style:C.x,onClick:s,"aria-label":"close",children:"✕"})]}),u.jsxs("div",{style:C.toolbar,children:[u.jsxs("div",{style:C.chips,children:[u.jsx("button",{type:"button",style:C.chip(j==="all"),onClick:()=>B("all"),children:r("audit.all","全部")}),u.jsx("button",{type:"button",style:C.chip(j==="rpc"),onClick:()=>B("rpc"),children:r("audit.rpc","RPC 调用")}),u.jsx("button",{type:"button",style:C.chip(j==="auth"),onClick:()=>B("auth"),children:r("audit.auth","授权决定")})]}),u.jsx("input",{"data-id":"audit-search",style:C.search,value:Y,onChange:p=>et(p.target.value),placeholder:r("audit.search","搜索来源 / 工具 / 命令…")})]}),o&&u.jsx("div",{style:C.err,children:o}),u.jsxs("div",{style:C.tableWrap,children:[u.jsxs("div",{style:C.theadRow,children:[L(r("audit.colTime","时间")),L(r("audit.colType","类型")),L(r("audit.colSource","来源")),L(r("audit.colOp","操作")),L(r("audit.colDetail","详情"))]}),v===null?u.jsx("div",{style:C.muted,children:r("audit.loading","加载中…")}):yt.length===0?u.jsx("div",{style:C.muted,children:gt.length===0?r("audit.empty","暂无审计记录"):r("audit.noMatch","无匹配记录")}):yt.map((p,M)=>{const U=st(p);return u.jsxs("div",{style:C.row,"data-id":"audit-row",children:[u.jsx("span",{style:C.time,children:$(p.ts)}),u.jsx("span",{style:C.badge(U),children:U.text}),u.jsx("span",{style:C.cell,children:p.origin||p.host||"—"}),u.jsx("span",{style:C.cell,children:wt(p)||"—"}),u.jsx("span",{style:C.detail,children:Bt(p)||"—"})]},M)})]})]})}),document.body)}function Ep({me:s,welcome:v,onLogout:b,mitmTeam:o}){const g=(s==null?void 0:s.display_name)||(s==null?void 0:s.username)||"…",_=g.slice(0,1).toUpperCase(),[m,f]=A.useState(!1),[y,h]=A.useState("");A.useEffect(()=>{var K,lt;if(!((lt=(K=window.cicy)==null?void 0:K.sidecar)!=null&&lt.tunnelStatus))return;let p=!1;const M=()=>window.cicy.sidecar.tunnelStatus().then(rt=>{if(p||!(rt!=null&&rt.ok))return;let pt=rt.tier;if(!pt){const N=Number(rt.tunnelLimit??rt.tunnel_limit);Number.isFinite(N)&&(pt=N<0?"enterprise":N>0?"team":"personal")}pt&&h(String(pt))}).catch(()=>{});M();const U=setInterval(M,6e4);return()=>{p=!0,clearInterval(U)}},[]);const[q,j]=A.useState(!1),[B,Y]=A.useState(!1),[et,$]=A.useState(!1),[st,wt]=A.useState(!1),[Bt,gt]=A.useState(""),Rt=A.useRef(null);A.useEffect(()=>{var M,U,K;let p=!0;return(K=(U=(M=window.cicy)==null?void 0:M.app)==null?void 0:U.getVersion)==null||K.call(U).then(lt=>{p&&gt(typeof lt=="string"?lt:String((lt==null?void 0:lt.desktop)||""))}).catch(()=>{}),()=>{p=!1}},[]),A.useEffect(()=>{if(!m)return;const p=M=>{Rt.current&&!Rt.current.contains(M.target)&&f(!1)};return document.addEventListener("mousedown",p),()=>document.removeEventListener("mousedown",p)},[m]);const yt=p=>{Qi(p),f(!1)},Ht=async()=>{var M,U;const p=String((s==null?void 0:s.email)||"").trim();if(p)try{(U=(M=window.cicy)==null?void 0:M.clipboard)!=null&&U.write?await window.cicy.clipboard.write(p):await navigator.clipboard.writeText(p),f(!1),Nt.show({message:r("userMenu.emailCopied","邮箱已复制"),status:"done",ttl:2500})}catch{Nt.show({message:r("userMenu.emailCopyFailed","邮箱复制失败"),status:"error",ttl:3500})}},C=async()=>{var p,M,U;f(!1),wt(!0),Nt.show({id:"app-update",message:r("updateBanner.checking","正在检查更新…"),status:"running"});try{const K=await((U=(M=(p=window.cicy)==null?void 0:p.app)==null?void 0:M.checkUpdate)==null?void 0:U.call(M));(K==null?void 0:K.status)==="available"?Nt.show({id:"app-update",message:r("updateBanner.available","发现新版本 v{{v}}",{v:K.version}),status:"done",ttl:4e3}):(K==null?void 0:K.status)==="up-to-date"?Nt.show({id:"app-update",message:r("updateBanner.upToDate","已是最新版本 v{{v}}",{v:K.version||K.current}),status:"done",ttl:3e3}):Nt.show({id:"app-update",message:r("updateBanner.error","更新失败")+(K!=null&&K.error?`:${K.error}`:""),status:"error",ttl:5e3})}catch(K){Nt.show({id:"app-update",message:K.message,status:"error",ttl:5e3})}finally{wt(!1)}},L=(()=>{const p=String(y||"").toLowerCase().trim();return p?{personal:r("plan.personal","个人版"),team:r("plan.team","团队版"),enterprise:r("plan.enterprise","企业版")}[p]||p:""})();return u.jsxs(u.Fragment,{children:[u.jsx("header",{className:"topbar",children:u.jsxs("div",{className:"user-chip","data-id":"UserChip",ref:Rt,children:[v&&u.jsx("span",{className:"welcome",children:v}),L&&u.jsx("span",{"data-id":"UserChip-plan",className:"plan-badge",title:r("plan.hint","当前账号版本"),style:{fontSize:11,fontWeight:600,lineHeight:1.6,padding:"2px 9px",borderRadius:999,whiteSpace:"nowrap",background:"var(--accent-soft, rgba(120,140,255,.16))",color:"var(--accent, #9db0ff)"},children:L}),s?u.jsxs("button",{type:"button","data-id":"UserChip-trigger",className:`user-chip__trigger${m?" is-open":""}`,onClick:()=>f(p=>!p),children:[u.jsx("div",{className:"avatar",children:_}),u.jsx("span",{className:"user-name",children:g}),u.jsx("span",{className:"user-chip__caret","aria-hidden":!0,children:"▾"})]}):u.jsxs("div",{className:"user-chip__trigger user-chip__trigger--skel","data-id":"UserChip-skeleton","aria-hidden":!0,children:[u.jsx("div",{className:"skel skel--avatar"}),u.jsx("div",{className:"skel skel--name"})]}),m&&u.jsxs("div",{className:"user-chip__menu","data-id":"UserChip-menu",role:"menu",children:[(s==null?void 0:s.email)&&u.jsx("button",{type:"button","data-id":"UserChip-email-copy",className:"user-chip__menu-item",title:r("userMenu.copyEmail","点击复制邮箱"),onClick:Ht,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.email}),u.jsx("button",{type:"button","data-id":"UserChip-wallet",className:"user-chip__menu-item",onClick:()=>yt("/wallet"),children:r("userMenu.wallet","我的钱包")}),u.jsx("button",{type:"button","data-id":"UserChip-trusted-sites",className:"user-chip__menu-item",onClick:()=>{f(!1),j(!0)},children:r("trustedSites.menu","受信任站点")}),u.jsx("button",{type:"button","data-id":"UserChip-audit-log",className:"user-chip__menu-item",onClick:()=>{f(!1),Y(!0)},children:r("audit.menu","审计日志")}),u.jsx("button",{type:"button","data-id":"UserChip-terms",className:"user-chip__menu-item",onClick:()=>{f(!1),$(!0)},children:r("firstRunTerms.menu","用户协议")}),u.jsx("button",{type:"button","data-id":"UserChip-check-update",className:"user-chip__menu-item",disabled:st,onClick:C,children:st?r("updateBanner.checkingShort","检查中…"):r("updateBanner.checkBtn","检查更新")}),!1,u.jsx("div",{className:"user-chip__menu-sep","aria-hidden":!0}),u.jsx("button",{type:"button","data-id":"UserChip-logout",className:"user-chip__menu-item is-danger",onClick:()=>{f(!1),b()},children:r("userMenu.logout","退出")}),u.jsxs("div",{className:"user-chip__menu-version","data-id":"UserChip-version",children:["CiCy Desktop ",Bt?`v${Bt}`:"…"]})]})]})}),q&&u.jsx(jp,{onClose:()=>j(!1)}),B&&u.jsx(Ap,{onClose:()=>Y(!1)}),et&&u.jsx(Kh,{onClose:()=>$(!1)})]})}function Kh({onAgree:s,onClose:v}){var et;const[b,o]=A.useState(!1),[g,_]=A.useState(!1),m=(((et=window.cicyI18n)==null?void 0:et.locale)||"en").startsWith("zh")?"zh-CN":"en",f=($,st)=>r(`firstRunTerms.${$}`,st),y=!!v,h=A.useMemo(()=>Sp(vp(m)),[m]),q=$=>{const st=$.currentTarget;st.scrollHeight-st.scrollTop-st.clientHeight<24&&o(!0)},j=A.useRef(null);A.useEffect(()=>{const $=j.current;$&&$.scrollHeight<=$.clientHeight+24&&o(!0)},[]);const B=async()=>{var $,st,wt;if(!(g||!b)){_(!0);try{await((wt=(st=($=window.cicy)==null?void 0:$.terms)==null?void 0:st.agree)==null?void 0:wt.call(st,Zh)),s==null||s()}catch{s==null||s()}}},Y=()=>{var $,st,wt;try{(wt=(st=($=window.cicy)==null?void 0:$.terms)==null?void 0:st.decline)==null||wt.call(st)}catch{}};return u.jsxs("div",{className:y?"terms-gate terms-gate--review":"shell terms-gate","data-id":"FirstRunTermsGate",style:y?{position:"fixed",inset:0,zIndex:1e3,background:"rgba(8,9,14,.72)",backdropFilter:"blur(4px)"}:void 0,onClick:y?$=>{$.target===$.currentTarget&&v()}:void 0,children:[u.jsx("div",{className:"glow","aria-hidden":!0}),u.jsxs("div",{className:"terms-gate__panel",children:[u.jsx("h1",{className:"terms-gate__title","data-id":"FirstRunTermsGate-title",children:f("title","用户协议与授权说明")}),u.jsx("p",{className:"terms-gate__subtitle",children:f("subtitle","使用 CiCy Desktop 前,请阅读并同意以下条款")}),u.jsx("div",{className:"terms-gate__body",ref:j,onScroll:q,"data-id":"FirstRunTermsGate-body",children:u.jsx("div",{className:"terms-md","data-id":"FirstRunTermsGate-md",dangerouslySetInnerHTML:{__html:h}})}),y?u.jsx("div",{className:"terms-gate__actions",children:u.jsx("button",{"data-id":"FirstRunTermsGate-close",className:"terms-gate__btn",onClick:v,children:f("close","关闭")})}):u.jsxs(u.Fragment,{children:[!b&&u.jsx("div",{className:"terms-gate__scrollhint","data-id":"FirstRunTermsGate-scrollhint",children:f("scrollHint","请阅读至底部以继续")}),u.jsxs("div",{className:"terms-gate__actions",children:[u.jsx("button",{"data-id":"FirstRunTermsGate-decline",className:"terms-gate__btn terms-gate__btn--ghost",onClick:Y,children:f("decline","不同意并退出")}),u.jsx("button",{"data-id":"FirstRunTermsGate-agree",className:"terms-gate__btn",disabled:!b||g,title:b?"":f("mustAgree","未同意则无法使用本软件。"),onClick:B,children:f("agree","同意并继续")})]})]})]})]})}const Ao=new Set;let zh=0,Jt=null;function Hl(){Ao.forEach(s=>s(Jt))}const Ut={open({onRetry:s,kind:v,source:b}={}){Jt={status:"running",phase:"install-docker",kind:v||"install",source:b||"op",logs:[],bars:{},minimized:!1,onRetry:s||null,lastAt:Date.now()},Hl()},minimize(){Jt&&(Jt={...Jt,minimized:!0},Hl())},restore(){Jt&&(Jt={...Jt,minimized:!1},Hl())},push(s={}){var m;if(!Jt)return;const v=s.phase==="health"?"container":s.phase||Jt.phase,b={...Jt,phase:v,lastAt:Date.now()},o=Number.isFinite(s.progress),g=v==="install-docker"||v==="image";if(g&&(o||s.dest||s.url)){const f=((m=Jt.bars)==null?void 0:m[v])||{},y=o?s.progress:s.status==="skip"||s.status==="done"?100:f.progress;b.bars={...Jt.bars,[v]:{progress:y,received:s.received??f.received,total:s.total??f.total,url:s.url||f.url,dest:s.dest||f.dest}}}if(!(s.status==="running"&&o&&g)){const f=Jt.logs[Jt.logs.length-1],y=s.status||"running",h=s.message||"";if(!(f&&f.phase===v&&f.status===y&&f.message===h)){const q={id:++zh,t:Yi(),phase:v,status:y,message:h};b.logs=[...Jt.logs,q]}}Jt=b,Hl()},finish({ok:s,message:v,status:b}={}){if(!Jt||Jt.status!=="running")return;const o=b||(s?"done":"error"),g=o==="error"?Jt.phase:"done",_={id:++zh,t:Yi(),phase:g,status:o,message:v||(s?"完成":"失败")};Jt={...Jt,status:o,phase:g,minimized:!1,logs:[...Jt.logs,_],lastAt:Date.now()},Hl()},close(){Jt=null,Hl()}},_o=[["install-docker","准备环境"],["image","下载运行环境"],["container","启动服务"],["done","完成"]],Np={"install-docker":"准备",image:"下载",container:"启动",health:"启动",done:"完成",open:"打开"},Dp={"install-docker":"Docker Desktop",image:"基础镜像"};function Mh(s){return Number.isFinite(s)?s<1024?s+" B":s<1048576?(s/1024).toFixed(0)+" KB":s<1073741824?(s/1048576).toFixed(1)+" MB":(s/1073741824).toFixed(2)+" GB":"?"}function kp({phaseKey:s,bar:v}){const b=Number.isFinite(v==null?void 0:v.progress)?Math.max(0,Math.min(100,v.progress)):0,o=b>=100;return u.jsxs("div",{className:"dlbar","data-id":`DockerDrawer-dlbar-${s}`,children:[u.jsxs("div",{className:"dlbar__head",children:[u.jsx("span",{className:"dlbar__name",children:Dp[s]||s}),u.jsxs("span",{className:"dlbar__pct",children:[b,"%",v!=null&&v.total?` · ${Mh(v.received)} / ${Mh(v.total)}`:""]})]}),u.jsx("div",{className:"dlbar__track",children:u.jsx("div",{className:`dlbar__fill${o?" is-done":""}`,style:{width:`${b}%`}})}),(v==null?void 0:v.url)&&u.jsxs("div",{className:"dlbar__url",title:v.url,children:[u.jsx("span",{className:"dlbar__urlk",children:"源"})," ",v.url]}),(v==null?void 0:v.dest)&&u.jsxs("div",{className:"dlbar__url",title:v.dest,children:[u.jsx("span",{className:"dlbar__urlk",children:"存"})," ",v.dest]})]})}function zp(){var y;const[s,v]=A.useState(Jt);A.useEffect(()=>(Ao.add(v),()=>{Ao.delete(v)}),[]);const b=A.useRef(null);if(A.useEffect(()=>{const h=b.current;h&&(h.scrollTop=h.scrollHeight)},[(y=s==null?void 0:s.logs)==null?void 0:y.length]),!s)return null;const o=s.status==="running",g=s.kind==="open",_=_o.findIndex(([h])=>h===s.phase),m=g?[]:["install-docker","image"].filter(h=>{var q;return(q=s.bars)==null?void 0:q[h]}),f=g?r("docker.openTitle","打开 Docker 团队"):r("docker.setupTitle","安装 Docker cicy-code");if(s.minimized){const h=m.map(j=>{var B;return(B=s.bars[j])==null?void 0:B.progress}).filter(Number.isFinite),q=h.length?Math.round(h.reduce((j,B)=>j+B,0)/h.length):null;return u.jsxs("button",{type:"button",className:`drawer-min drawer-min--${s.status}`,"data-id":"DockerDrawer-restore",onClick:()=>Ut.restore(),children:[u.jsx("span",{className:"drawer-min__spark",children:o?u.jsx(Xe,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("span",{className:"drawer-min__label",children:[f,q!=null?` · ${q}%`:""]})]})}return u.jsx("div",{className:"drawer-scrim","data-id":"DockerDrawer-scrim",onClick:()=>o?Ut.minimize():Ut.close(),children:u.jsxs("div",{className:"drawer","data-id":"DockerDrawer","data-status":s.status,onClick:h=>h.stopPropagation(),children:[u.jsxs("div",{className:"drawer__head",children:[u.jsxs("div",{className:"drawer__title",children:[u.jsx("span",{className:`drawer__spark drawer__spark--${s.status}`,children:o?u.jsx(Xe,{}):s.status==="done"?"✓":s.status==="reboot"?"⟳":"!"}),u.jsxs("div",{children:[u.jsx("div",{className:"drawer__h",children:f}),u.jsx("div",{className:"drawer__sub",children:"127.0.0.1:8008"})]})]}),u.jsx("div",{className:"drawer__headbtns",children:u.jsx("button",{type:"button",className:"drawer__x","data-id":"DockerDrawer-min",title:r("common.minimize","最小化"),onClick:()=>Ut.minimize(),"aria-label":"minimize",children:"‒"})})]}),!g&&u.jsx("div",{className:"drawer__steps","data-id":"DockerDrawer-steps",children:_o.map(([h,q],j)=>{const B=s.status==="done"||_>=0&&j<_,Y=j===_&&o,et=s.status==="error"&&j===_;return u.jsxs("div",{className:`drawer__step${Y?" is-active":""}${B?" is-done":""}${et?" is-error":""}`,children:[u.jsx("span",{className:"drawer__step-dot",children:B?"✓":et?"!":j+1}),u.jsx("span",{className:"drawer__step-label",children:q}),j<_o.length-1&&u.jsx("span",{className:"drawer__step-bar"})]},h)})}),m.length>0&&u.jsx("div",{className:"drawer__dlbars","data-id":"DockerDrawer-dlbars",children:m.map(h=>u.jsx(kp,{phaseKey:h,bar:s.bars[h]},h))}),o&&s.logs.length>0&&u.jsxs("div",{className:"drawer__now","data-id":"DockerDrawer-now",children:[u.jsx(Xe,{}),u.jsx("span",{children:s.logs[s.logs.length-1].message})]}),u.jsx("div",{className:"drawer__log drawer__log--scroll","data-id":"DockerDrawer-log",ref:b,children:s.logs.length===0?u.jsx("div",{className:"drawer__log-empty",children:r("docker.preparing","准备中…")}):s.logs.map(h=>u.jsxs("div",{className:"drawer__line","data-status":h.status,children:[u.jsx("span",{className:"drawer__t",children:h.t}),u.jsx("span",{className:`drawer__badge drawer__badge--${h.phase}`,children:r(`dockerBadge.${h.phase}`,Np[h.phase]||h.phase)}),u.jsx("span",{className:"drawer__linemsg",children:h.message})]},h.id))}),u.jsx("div",{className:"drawer__foot",children:o?u.jsx(u.Fragment,{children:u.jsx("span",{className:"drawer__foot-status",children:g?r("docker.opening","打开中…"):r("docker.installing2","安装进行中…")})}):s.status==="reboot"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-reboot",children:r("docker.rebootShort","需重启 Windows")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>Ut.close(),children:r("common.close","关闭")})]}):s.status==="error"?u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-error",children:g?r("docker.openFailed","打开失败"):r("docker.failed","安装失败")}),s.onRetry&&u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>s.onRetry(),children:r("common.retry","重试")}),u.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>Ut.close(),children:r("common.close","关闭")})]}):u.jsxs(u.Fragment,{children:[u.jsx("span",{className:"drawer__foot-status is-done",children:r("docker.ready","已就绪")}),u.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-finish",onClick:()=>Ut.close(),children:r("common.done","完成")})]})})]})})}function Mp({dockerTeam:s,cloudTitle:v,cloudCode:b,onOpen:o,onRename:g,onRefresh:_}){var de;const[m,f]=A.useState(null),[y,h]=A.useState(""),[q,j]=A.useState(!1),[B,Y]=A.useState(!1),[et,$]=A.useState(!1),[st,wt]=A.useState(!1),[Bt,gt]=A.useState([]),[Rt,yt]=A.useState(!1),[Ht,C]=A.useState(""),[L,p]=A.useState(!1),[M,U]=A.useState(""),K=v||"Docker 团队",lt=F=>{var ht;(ht=F==null?void 0:F.stopPropagation)==null||ht.call(F),U(K),p(!0)},rt=async()=>{p(!1);const F=String(M||"").trim();if(!(!F||F===K||!g))try{await g(F),_==null||_()}catch{}},[pt,N]=A.useState({top:0,left:0}),H=A.useRef(null),nt=A.useRef(null),_t=184,Dt="#2496ed",S=A.useCallback(async()=>{var F,ht,ct;try{const ot=await((ct=(ht=(F=window.cicy)==null?void 0:F.docker)==null?void 0:ht.appStatus)==null?void 0:ct.call(ht));f(ot);const Lt=Date.now()-((Jt==null?void 0:Jt.lastAt)||0)>3e4;ot!=null&&ot.running&&Jt&&Jt.status==="running"&&Jt.kind!=="open"&&Lt&&Ut.finish({ok:!0,message:"Docker cicy-code 已就绪"})}catch(ot){console.warn("[DockerCard]",ot)}},[]);A.useEffect(()=>{S();const F=setInterval(()=>{y||S()},12e3);return()=>clearInterval(F)},[S,y]);const X=A.useCallback(async()=>{var F,ht,ct;j(!1),C("");try{const ot=await((ct=(ht=(F=window.cicy)==null?void 0:F.docker)==null?void 0:ht.getPorts)==null?void 0:ct.call(ht));gt(((ot==null?void 0:ot.ports)||[]).map(String))}catch{gt([])}wt(!0)},[]),P=A.useCallback(async()=>{var ot,Lt,Q,tt,J,ft,bt,Qt,ne;const F=new Set,ht=[];for(const jt of Bt){const kt=String(jt).trim();if(!kt)continue;const Me=Number(kt);if(!Number.isInteger(Me)||Me<1||Me>65535||Me===8008||F.has(Me)){C(r("docker.ports.invalid","有端口无效(1-65535,不能是 8008,不能重复)"));return}F.add(Me),ht.push(Me)}C(""),yt(!0),wt(!1),h("recreate"),Ut.open({onRetry:P});const ct=(Q=(Lt=(ot=window.cicy)==null?void 0:ot.docker)==null?void 0:Lt.onAppProgress)==null?void 0:Q.call(Lt,jt=>Ut.push(jt));try{const jt=await((ft=(J=(tt=window.cicy)==null?void 0:tt.docker)==null?void 0:J.setPorts)==null?void 0:ft.call(J,ht));if(Ut.finish({ok:!!(jt!=null&&jt.ok),message:jt!=null&&jt.ok?r("docker.ports.save","保存并重建")+" ✅":(jt==null?void 0:jt.error)||r("docker.opFailed","操作失败")}),jt!=null&&jt.ok)try{const kt=await((ne=(Qt=(bt=window.cicy)==null?void 0:bt.docker)==null?void 0:Qt.appRedetect)==null?void 0:ne.call(Qt));kt&&f(kt)}catch{}}catch(jt){Ut.finish({ok:!1,message:jt.message})}finally{try{ct&&ct()}catch{}yt(!1),h(""),S()}},[Bt,S]);A.useEffect(()=>{if(!q)return;const F=ct=>{var ot,Lt;(ot=H.current)!=null&&ot.contains(ct.target)||(Lt=nt.current)!=null&&Lt.contains(ct.target)||j(!1)},ht=ct=>{ct.key==="Escape"&&j(!1)};return document.addEventListener("mousedown",F),document.addEventListener("keydown",ht),()=>{document.removeEventListener("mousedown",F),document.removeEventListener("keydown",ht)}},[q]);const ut=()=>{if(!q&&H.current){const F=H.current.getBoundingClientRect(),ht=Math.max(8,Math.min(F.right-_t,window.innerWidth-_t-8));N({top:Math.round(F.bottom+4),left:Math.round(ht)})}j(F=>!F)},xt=A.useCallback(async()=>{var ht,ct,ot,Lt,Q,tt;h("bootstrap"),Ut.open({onRetry:xt});const F=(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.onAppProgress)==null?void 0:ot.call(ct,J=>Ut.push(J));try{const J=await((tt=(Q=(Lt=window.cicy)==null?void 0:Lt.docker)==null?void 0:Q.appBootstrap)==null?void 0:tt.call(Q));(J==null?void 0:J.reason)==="installer_launched"?Ut.finish({status:"reboot",message:r("docker.installerLaunched","已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」")}):(J==null?void 0:J.reason)==="wsl_reboot_required"?Ut.finish({status:"reboot",message:r("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):Ut.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?r("docker.ready","Docker cicy-code 已就绪"):(J==null?void 0:J.error)||r("docker.failed","安装失败")}),J!=null&&J.ok&&(_==null||_())}catch(J){Ut.finish({ok:!1,message:J.message})}finally{try{F&&F()}catch{}h(""),S()}},[S,_]),Ct=A.useCallback(async()=>{var ht,ct,ot,Lt,Q,tt;h("repair"),Ut.open({onRetry:Ct});const F=(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.onAppProgress)==null?void 0:ot.call(ct,J=>Ut.push(J));try{const J=await((tt=(Q=(Lt=window.cicy)==null?void 0:Lt.docker)==null?void 0:Q.appRepairWsl)==null?void 0:tt.call(Q));J!=null&&J.needsReboot?Ut.finish({status:"reboot",message:r("docker.wslNeedReboot","WSL 服务卡死,请【重启 Windows】;重启后打开 CiCy 会自动修复(旧数据已改名备份,不删)。")}):J!=null&&J.ok?(Ut.finish({ok:!0,message:r("docker.wslRepaired","WSL 已修复 ✅")}),_==null||_()):Ut.finish({ok:!1,message:(J==null?void 0:J.error)||r("docker.repairFailed","修复失败")})}catch(J){Ut.finish({ok:!1,message:J.message})}finally{try{F&&F()}catch{}h(""),S()}},[S,_]),Mt=A.useCallback(async()=>{var ht,ct,ot,Lt,Q,tt;j(!1),h("upgrade"),Ut.open({onRetry:Mt});const F=(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.onAppProgress)==null?void 0:ot.call(ct,J=>Ut.push(J));try{const J=await((tt=(Q=(Lt=window.cicy)==null?void 0:Lt.docker)==null?void 0:Q.appUpgrade)==null?void 0:tt.call(Q));(J==null?void 0:J.reason)==="wsl_reboot_required"?Ut.finish({status:"reboot",message:r("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):Ut.finish({ok:!!(J!=null&&J.ok),message:J!=null&&J.ok?r("docker.upgraded","已升级到最新"):(J==null?void 0:J.error)||r("docker.upgradeFailed","升级失败")}),J!=null&&J.ok&&(_==null||_())}catch(J){Ut.finish({ok:!1,message:J.message})}finally{try{F&&F()}catch{}h(""),S()}},[S,_]),re=A.useCallback(async()=>{var ht,ct,ot,Lt,Q,tt,J,ft,bt,Qt,ne,jt;j(!1),h("update"),Ut.open({onRetry:re});const F=(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.onAppProgress)==null?void 0:ot.call(ct,kt=>Ut.push(kt));try{const kt=await((tt=(Q=(Lt=window.cicy)==null?void 0:Lt.docker)==null?void 0:Q.appUpdate)==null?void 0:tt.call(Q));if(Ut.finish({ok:!!(kt!=null&&kt.ok),message:kt!=null&&kt.ok?r("docker.updated","cicy-code 已更新到最新"):(kt==null?void 0:kt.error)||r("docker.updateFailed","更新失败")}),kt!=null&&kt.ok){_==null||_();try{(bt=(ft=(J=window.cicy)==null?void 0:J.tabs)==null?void 0:ft.reloadIfOpen)==null||bt.call(ft,"http://127.0.0.1:8008",r("docker.teamTab","Docker 团队"))}catch{}try{const Me=await((jt=(ne=(Qt=window.cicy)==null?void 0:Qt.docker)==null?void 0:ne.appRedetect)==null?void 0:jt.call(ne));Me&&f(Me)}catch{}}}catch(kt){Ut.finish({ok:!1,message:kt.message})}finally{try{F&&F()}catch{}h(""),S()}},[S,_]),qt=A.useCallback(async(F,ht,ct)=>{j(!1),h(F),Nt.show({id:"docker-op",message:r(`docker.${F}ing`,F==="restart"?"重启中…":F==="reload"?"刷新中…":"停止中…"),status:"running"});try{const ot=await ht();ot!=null&&ot.ok?Nt.show({id:"docker-op",message:ct,status:"done",ttl:2500}):Nt.show({id:"docker-op",message:(ot==null?void 0:ot.error)||r("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(ot){Nt.show({id:"docker-op",message:ot.message,status:"error",ttl:6e3})}finally{h(""),S()}},[S]),Ze=A.useCallback(async()=>{j(!1),h("authssh"),Nt.show({id:"docker-op",message:r("docker.authorizingHost","授权容器访问 Mac(配置 SSH)…"),status:"running"});try{const F=await window.cicy.docker.appAuthorizeHostSsh();F!=null&&F.ok?Nt.show({id:"docker-op",message:F.verified?r("docker.authorizedHostOk","已授权:容器内 `ssh mac` 可访问 Mac ✅"):r("docker.authorizedHostPartial","公钥已写入 Mac(未验证成功,可在容器内手动 `ssh mac` 试)"),status:F.verified?"done":"error",ttl:5e3}):Nt.show({id:"docker-op",message:(F==null?void 0:F.error)||r("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(F){Nt.show({id:"docker-op",message:F.message,status:"error",ttl:6e3})}finally{h(""),S()}},[S]),it=((de=window.cicy)==null?void 0:de.platform)||(m==null?void 0:m.platform);if(it!=="win32")return null;const Vt=m?!!m.running:(s==null?void 0:s.status)==="running",Ee=!!(m!=null&&m.dockerRunning),Wt=!!(m!=null&&m.installed),Ue=!!(m!=null&&m.unknown)&&!Vt&&!Ee&&!Wt,Ve=!!(m!=null&&m.wslUnmanaged),ze=!!(m!=null&&m.wslWedged),Be=Vt&&!Ve,Oa=Be?"ok":ze||Ve||Ee||Wt||Ue?"warn":"off",$t=!!y;ze?r("docker.wslWedged","WSL 卡死 · 点「修复 WSL」"):Ve?r("docker.wslBrokenRepair","WSL 管理异常 · 点「修复 WSL」重装"):Vt?r("docker.running","运行中"):Ee?r("docker.notRunning","未启动 · 点「启动」"):Wt?r("docker.engineDown","Docker 未运行 · 点启动"):Ue?r("docker.wslUnresponsive","WSL 未响应 · 点「重试检测」"):r("docker.notInstalled","Docker Desktop 未安装");const aa=y==="open"?r("docker.opening","打开中…"):y==="probe"?r("docker.probing","检测中…"):$t?r("docker.working","处理中…"):Be?r("localTeams.open","打开"):ze||Ve?r("docker.repairWsl","修复 WSL"):Ee?r("docker.start","启动"):Wt?r("docker.startDocker","启动 Docker"):Ue?r("docker.retryProbe","重试检测"):r("docker.install","下载安装"),ge=async()=>{var F,ht,ct,ot,Lt,Q,tt,J,ft,bt,Qt,ne;if(!$t){if(ze){Ct();return}if(Ve){xt();return}if(Be){try{const kt=await((ct=(ht=(F=window.cicy)==null?void 0:F.tabs)==null?void 0:ht.activateIfOpen)==null?void 0:ct.call(ht,"http://127.0.0.1:8008"));if(kt!=null&&kt.active)return}catch{}h("open");let jt=null;try{jt=await((Q=(Lt=(ot=window.cicy)==null?void 0:ot.docker)==null?void 0:Lt.appOpen)==null?void 0:Q.call(Lt))}catch(kt){jt={ok:!1,hint:(kt==null?void 0:kt.message)||r("docker.openFailed","打开失败"),log:[]}}h(""),jt&&jt.ok===!1&&(Ut.open({onRetry:ge,kind:"open"}),(jt.log||[]).forEach(kt=>Ut.push(kt)),Ut.finish({ok:!1,message:jt.hint||jt.error||r("docker.openFailed","打开失败")}));return}if(Ue){h("probe");try{const jt=await(((ft=(J=(tt=window.cicy)==null?void 0:tt.docker)==null?void 0:J.appRedetect)==null?void 0:ft.call(J))??((ne=(Qt=(bt=window.cicy)==null?void 0:bt.docker)==null?void 0:Qt.appStatus)==null?void 0:ne.call(Qt)));jt&&f(jt),jt!=null&&jt.unknown&&Nt.show({id:"docker-probe",status:"error",message:r("docker.wslStillStuck","WSL 仍无响应 —— 多半要重启 Windows 后再试"),ttl:6e3})}catch{Nt.show({id:"docker-probe",status:"error",message:r("docker.probeFailed","检测失败,请重试"),ttl:5e3})}finally{h("")}return}xt()}},Sa=Vt;return u.jsxs("div",{"data-id":"DockerCard",className:`bcard bcard--docker${Vt?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent",style:{background:Dt}}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",style:{color:Dt},children:[u.jsx("span",{className:"bcard__dot","data-tone":Oa}),u.jsx("svg",{style:{width:18,height:18},viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:u.jsx("path",{d:"M21.81 10.25c-.06-.05-.67-.51-1.95-.51-.34 0-.68.03-1.01.09-.25-1.69-1.64-2.51-1.7-2.55l-.34-.2-.22.32a4.5 4.5 0 0 0-.59 1.4c-.23.94-.09 1.83.39 2.59-.58.32-1.51.4-1.7.41H2.62a.61.61 0 0 0-.61.61 9.32 9.32 0 0 0 .57 3.35 4.9 4.9 0 0 0 1.95 2.53c.92.52 2.42.82 4.12.82.77 0 1.54-.07 2.3-.21a9.6 9.6 0 0 0 3-1.09 8.3 8.3 0 0 0 2.05-1.68c.98-1.11 1.56-2.35 1.99-3.45h.17c1.36 0 2.2-.55 2.66-1l.13-.16zM4.7 11.33h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H4.7a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.46 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16M7.16 9.06h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16"})})]}),Sa&&u.jsxs("div",{className:"bcard__menuwrap",onClick:F=>F.stopPropagation(),children:[u.jsx("button",{type:"button",ref:H,"data-id":"DockerCard-menu-btn",className:"bcard__kebab",title:r("docker.manage","管理 Docker cicy-code"),disabled:$t,onClick:ut,children:$t?u.jsx(Xe,{}):u.jsx(Do,{})}),q&&da.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"DockerCard-menu",role:"menu",ref:nt,style:{position:"fixed",top:pt.top,left:pt.left,width:_t},onClick:F=>F.stopPropagation(),children:[u.jsx("button",{type:"button","data-id":"DockerCard-update",className:"bcard__menu-item is-accent",onClick:re,children:r("docker.update","更新 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-restart",className:"bcard__menu-item",onClick:()=>qt("restart",()=>window.cicy.docker.appRestart(),r("docker.restarted","已重启 cicy-code")),children:r("docker.restart","重启 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-stop",className:"bcard__menu-item is-danger",onClick:()=>qt("stop",()=>window.cicy.docker.appStop(),r("docker.stopped","已停止 cicy-code")),children:r("docker.stop","停止 cicy-code")}),u.jsx("button",{type:"button","data-id":"DockerCard-reload",className:"bcard__menu-item",onClick:F=>{var ht,ct,ot;F.stopPropagation(),j(!1),(ot=(ct=(ht=window.cicy)==null?void 0:ht.tabs)==null?void 0:ct.reloadIfOpen)==null||ot.call(ct,"http://127.0.0.1:8008","Docker 团队")},children:r("docker.reloadWindow","刷新窗口")}),u.jsx("button",{type:"button","data-id":"DockerCard-open-dir",className:"bcard__menu-item",onClick:F=>{var ht,ct,ot;F.stopPropagation(),j(!1),(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.openDir)==null||ot.call(ct)},children:r("docker.openWslDir","打开 WSL 目录")}),u.jsx("button",{type:"button","data-id":"DockerCard-open-projects",className:"bcard__menu-item",onClick:F=>{var ht,ct,ot;F.stopPropagation(),j(!1),(ot=(ct=(ht=window.cicy)==null?void 0:ht.docker)==null?void 0:ct.openDir)==null||ot.call(ct,"projects")},children:r("docker.openProjectsDir","打开项目目录")}),u.jsx("button",{type:"button","data-id":"DockerCard-dood",className:"bcard__menu-item",title:r("dood.hint","把宿主 Docker + docker 客户端挂进容器,容器内 agent 能直接跑 docker(切换会重建容器,秒生效、无需下载)"),onClick:F=>{F.stopPropagation(),j(!1),Y(!0)},children:r("dood.menu","容器内使用 Docker")}),u.jsx("button",{type:"button","data-id":"DockerCard-billing",className:"bcard__menu-item",onClick:()=>{j(!1),Qi(b||s!=null&&s.cloud_team_id?`?team=${encodeURIComponent(b||s.cloud_team_id)}`:"?view=usage")},children:r("docker.billing","帐单")}),u.jsx("div",{className:"bcard__menu-sep","data-id":"DockerCard-menu-sep",role:"separator","aria-hidden":!0}),it==="darwin"&&u.jsx("button",{type:"button","data-id":"DockerCard-authorize-host-ssh",className:"bcard__menu-item",title:r("docker.authorizeHostHint","把容器公钥加到 Mac 的 authorized_keys,容器内 `ssh mac` 即可访问本机"),onClick:Ze,children:r("docker.authorizeHost","授权容器访问 Mac")}),u.jsx("button",{type:"button","data-id":"DockerCard-docker-restart",className:"bcard__menu-item",onClick:()=>qt("restart",()=>window.cicy.docker.appDockerRestart(),r("docker.dockerRestarted","已重启 Docker 容器")),children:r("docker.dockerRestart","重启 Docker")}),u.jsx("button",{type:"button","data-id":"DockerCard-ports",className:"bcard__menu-item",onClick:F=>{F.stopPropagation(),X()},children:r("docker.ports.menu","端口设置")}),u.jsx("button",{type:"button","data-id":"DockerCard-recreate",className:"bcard__menu-item is-danger",onClick:F=>{F.stopPropagation(),j(!1),$(!0)},children:r("docker.recreate","重建 Docker")})]}),document.body)]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(ic,{size:24,avatar:s==null?void 0:s.avatar,name:K,teamId:s==null?void 0:s.id,onChanged:_}),L?u.jsx("input",{"data-id":"DockerCard-rename-input",autoFocus:!0,value:M,onChange:F=>U(F.target.value),onFocus:F=>F.target.select(),onBlur:rt,onClick:F=>F.stopPropagation(),onKeyDown:F=>{F.nativeEvent.isComposing||F.keyCode===229||(F.key==="Enter"?rt():F.key==="Escape"&&p(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:g?r("localTeams.renameHint","点名字或 ✎ 改名"):K,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:g?lt:void 0,children:[u.jsx("span",{onClick:g?lt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:g?"text":"default"},children:K}),g&&u.jsx("button",{type:"button","data-id":"DockerCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:lt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsxs("div",{className:"bcard__meta",children:[u.jsx("span",{className:"bcard__chip",children:"Docker"}),(m==null?void 0:m.version)&&u.jsxs("span",{className:"bcard__ver","data-id":"DockerCard-ver",style:{marginLeft:8,fontSize:11,opacity:.6},children:["v",m.version]})]})]}),u.jsxs("button",{type:"button",className:"bcard__cta","data-id":"DockerCard-cta",disabled:$t,onClick:ge,style:Vt?void 0:{background:Dt,color:"white"},children:[$t?u.jsx(Xe,{}):u.jsx(Xi,{}),u.jsx("span",{children:aa})]}),u.jsx(Hp,{open:B,onClose:()=>Y(!1),toastId:"docker-op"}),et&&da.createPortal(u.jsx("div",{"data-id":"DockerCard-recreate-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:F=>{F.target===F.currentTarget&&$(!1)},children:u.jsxs("div",{onClick:F=>F.stopPropagation(),style:{width:360,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[u.jsx("h3",{style:{margin:"0 0 8px",fontSize:16,color:"#e6edf3"},children:r("docker.recreate","重建 Docker")}),u.jsx("p",{style:{margin:"0 0 18px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:r("docker.recreateConfirm","会删除当前容器并重新创建(volume 数据保留),用于切换为独立 team 的网关 key。确定重建?")}),u.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[u.jsx("button",{type:"button","data-id":"DockerCard-recreate-cancel",onClick:()=>$(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:r("common.cancel","取消")}),u.jsx("button",{type:"button","data-id":"DockerCard-recreate-confirm",onClick:()=>{$(!1),qt("restart",()=>window.cicy.docker.appRecreate(),r("docker.recreated","已重建 Docker 容器"))},style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#da3633",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:r("docker.recreateOk","确定重建")})]})]})}),document.body),st&&da.createPortal(u.jsx("div",{"data-id":"DockerCard-ports-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:F=>{F.target===F.currentTarget&&wt(!1)},children:u.jsxs("div",{onClick:F=>F.stopPropagation(),style:{width:420,maxWidth:"92vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[u.jsx("h3",{style:{margin:"0 0 6px",fontSize:16,color:"#e6edf3"},children:r("docker.ports.title","端口设置")}),u.jsx("p",{style:{margin:"0 0 14px",fontSize:12.5,lineHeight:1.6,color:"#9aa4b2"},children:r("docker.ports.sub","除 :8008 外,额外发布、可从 Windows 直达容器内服务的端口")}),u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"8px 10px",marginBottom:10,borderRadius:8,background:"#0d1117",border:"1px solid #21262d",color:"#7d8590",fontSize:13},children:["🔒 ",r("docker.ports.mainFixed",":8008 · cicy-code(固定)")]}),u.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8,maxHeight:220,overflowY:"auto"},children:[Bt.length===0&&u.jsx("div",{style:{fontSize:12.5,color:"#6e7681",padding:"4px 2px"},children:r("docker.ports.none","暂无额外端口")}),Bt.map((F,ht)=>u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[u.jsx("input",{"data-id":`DockerCard-port-input-${ht}`,type:"text",inputMode:"numeric",value:F,placeholder:r("docker.ports.ph","端口号 1-65535"),onChange:ct=>{const ot=ct.target.value.replace(/[^0-9]/g,"");gt(Lt=>Lt.map((Q,tt)=>tt===ht?ot:Q)),C("")},style:{flex:1,padding:"7px 10px",borderRadius:8,border:"1px solid #30363d",background:"#0d1117",color:"#e6edf3",fontSize:13,fontFamily:"var(--mono)"}}),u.jsx("button",{type:"button","data-id":`DockerCard-port-remove-${ht}`,title:r("docker.ports.remove","移除"),onClick:()=>{gt(ct=>ct.filter((ot,Lt)=>Lt!==ht)),C("")},style:{padding:"6px 10px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#da3633",cursor:"pointer",fontSize:14},children:"✕"})]},ht))]}),u.jsx("button",{type:"button","data-id":"DockerCard-port-add",onClick:()=>gt(F=>[...F,""]),style:{marginTop:10,padding:"7px 12px",borderRadius:8,border:"1px dashed #30363d",background:"transparent",color:"#58a6ff",cursor:"pointer",fontSize:13,width:"100%"},children:r("docker.ports.add","+ 添加端口")}),Ht&&u.jsx("div",{style:{marginTop:10,fontSize:12.5,color:"#f85149"},children:Ht}),u.jsx("p",{style:{margin:"12px 0 16px",fontSize:11.5,lineHeight:1.5,color:"#6e7681"},children:r("docker.ports.hint","保存会重建容器(volume 数据保留),会有短暂中断")}),u.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[u.jsx("button",{type:"button","data-id":"DockerCard-ports-cancel",disabled:Rt,onClick:()=>wt(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:r("docker.ports.cancel","取消")}),u.jsx("button",{type:"button","data-id":"DockerCard-ports-save",disabled:Rt,onClick:P,style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#238636",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:Rt?r("docker.ports.saving","保存中…"):r("docker.ports.save","保存并重建")})]})]})}),document.body)]})}function Oh({team:s,cloudCode:v,onOpen:b,onRename:o,onRefresh:g}){var ht,ct,ot,Lt;const m=(Rh[s.status]||Rh.error).tone,[f,y]=A.useState(!1),[h,q]=A.useState(s.name||""),[j,B]=A.useState(null),[Y,et]=A.useState(""),$=j??s.name;A.useEffect(()=>{j!=null&&s.name===j&&B(null)},[s.name,j]);const st=Q=>{var tt;(tt=Q==null?void 0:Q.stopPropagation)==null||tt.call(Q),q($||""),y(!0)},wt=async()=>{y(!1);const Q=String(h||"").trim();if(!o||!Q||Q===$)return;B(Q),et("saving");let tt;try{tt=await o(s.id,Q)}catch(J){tt={ok:!1,error:J==null?void 0:J.message}}B(null),tt&&tt.ok?(et("saved"),setTimeout(()=>et(J=>J==="saved"?"":J),1500)):(et(""),Nt.show({message:r("localTeams.renameFailed","改名没保存,已恢复"),status:"error",ttl:4e3}))},gt=!!((ct=(ht=window.cicy)==null?void 0:ht.sidecar)!=null&&ct.restart)&&Eo(s.base_url),Rt=s.status==="running",[yt,Ht]=A.useState(""),[C,L]=A.useState(!1),[p,M]=A.useState(!1);A.useEffect(()=>{var Q,tt;!gt||!((tt=(Q=window.cicy)==null?void 0:Q.sidecar)!=null&&tt.getPublic)||window.cicy.sidecar.getPublic().then(J=>M(!!(J!=null&&J.public))).catch(()=>{})},[gt]);const[U,K]=A.useState({running:void 0,latest:null,installed:null}),lt=U.latest,rt=U.running,[pt,N]=A.useState(!1),H=A.useRef(null),nt=A.useRef(null),_t=A.useRef(null),[Dt,S]=A.useState({top:0,left:0}),X=184,P=()=>{if(!C&&nt.current){const Q=nt.current.getBoundingClientRect(),tt=Math.max(8,Math.min(Q.right-X,window.innerWidth-X-8));S({top:Math.round(Q.bottom+4),left:Math.round(tt)})}L(Q=>!Q)},ut=A.useCallback(async(Q=!1)=>{var tt,J;if(!(!gt||!((J=(tt=window.cicy)==null?void 0:tt.sidecar)!=null&&J.versions))){Q&&N(!0);try{const ft=await window.cicy.sidecar.versions();K({running:(ft==null?void 0:ft.running)??null,latest:(ft==null?void 0:ft.latest)??null,installed:(ft==null?void 0:ft.installed)??null}),Q&&(ft!=null&&ft.running&&(ft!=null&&ft.latest)&&Bh(ft.latest,ft.running)>0?Nt.show({message:`${r("sidecar.found","发现新版本")} v${ft.latest}`,status:"done",ttl:2500}):ft!=null&&ft.running?Nt.show({message:`${r("sidecar.upToDate","已是最新")} v${ft.running}`,status:"done",ttl:2500}):Nt.show({message:r("sidecar.notRunning","cicy-code 未运行"),status:"error",ttl:4e3}))}catch{Q&&Nt.show({message:r("sidecar.checkFailed","检查更新失败"),status:"error",ttl:5e3})}finally{Q&&N(!1)}}},[gt]);A.useEffect(()=>{ut(!1)},[ut]),A.useEffect(()=>{Rt&&ut(!1)},[Rt,ut]);const xt=!!(gt&&lt&&rt&&Bh(lt,rt)>0),Ct=!gt&&!!((Lt=(ot=window.cicy)==null?void 0:ot.localTeams)!=null&&Lt.remove),Mt=gt||Ct,[re,qt]=A.useState(!1),[Ze,it]=A.useState(!1),[Vt,Ee]=A.useState(""),[Wt,Ue]=A.useState(!1),[Ve,ze]=A.useState("");A.useEffect(()=>{if(!C)return;const Q=tt=>{var J,ft;(J=nt.current)!=null&&J.contains(tt.target)||(ft=_t.current)!=null&&ft.contains(tt.target)||L(!1)};return document.addEventListener("mousedown",Q),()=>document.removeEventListener("mousedown",Q)},[C]);const Be=async()=>{var tt,J,ft;if(Wt)return;const Q=String(Vt||"").trim();if(!Q||Q===(s.base_url||"")){it(!1);return}try{new URL(Q)}catch{ze(r("teams.badUrl","URL 无效(需含 http(s)://)"));return}ze(""),Ue(!0);try{const bt=await((ft=(J=(tt=window.cicy)==null?void 0:tt.localTeams)==null?void 0:J.update)==null?void 0:ft.call(J,s.id,{base_url:Q}));bt!=null&&bt.ok?(it(!1),g==null||g()):ze(nn((bt==null?void 0:bt.error)||"update failed"))}catch(bt){ze(nn((bt==null?void 0:bt.message)||String(bt)))}Ue(!1)},Oa=async()=>{var tt,J,ft;if(yt)return;qt(!1),Ht("remove");const Q="op-"+Date.now();Nt.show({id:Q,message:r("localTeams.removing","删除中…"),status:"running"});try{const bt=await((ft=(J=(tt=window.cicy)==null?void 0:tt.localTeams)==null?void 0:J.remove)==null?void 0:ft.call(J,s.id));bt!=null&&bt.ok?Nt.show({id:Q,message:r("localTeams.removed","已删除"),status:"done",ttl:3e3}):Nt.show({id:Q,message:r("localTeams.removeFailed","删除失败")+(bt!=null&&bt.error?": "+bt.error:""),status:"error",ttl:7e3})}catch(bt){Nt.show({id:Q,message:r("localTeams.removeFailed","删除失败")+": "+((bt==null?void 0:bt.message)||bt),status:"error",ttl:7e3})}Ht(""),g==null||g()},$t=`sidecar-op:${s.id}`,aa=async(Q,tt,J)=>{var Qt,ne,jt,kt,Me;if(L(!1),yt)return;Ht(Q);const ft=Q==="update";let bt=null;ft?(ve.open({teamId:s.id,fromVer:rt,toVer:lt,onRetry:()=>aa("update",tt,J)}),(ne=(Qt=window.cicy)==null?void 0:Qt.sidecar)!=null&&ne.onOpProgress&&(bt=window.cicy.sidecar.onOpProgress(te=>{(te==null?void 0:te.op)==="update"&&ve.push(te)}))):Nt.show({id:$t,message:ge[Q]||`${Q}…`,status:"running",progress:void 0});try{const te=await tt(),Ne=!!(te!=null&&te.ok),wa=te!=null&&te.warning?`${J}(${te.warning})`:J,Je=r("sidecar.failed","操作失败")+(te!=null&&te.error?`: ${te.error}`:"");if(ft){if(ve.finish({ok:Ne,message:Ne?wa:Je}),Ne)try{await((Me=(kt=(jt=window.cicy)==null?void 0:jt.localTeams)==null?void 0:kt.reload)==null?void 0:Me.call(kt,s.id,{ignoreCache:!0}))}catch{}}else Nt.show({id:$t,message:Ne?wa:Je,progress:void 0,status:Ne?"done":"error",ttl:Ne?4e3:8e3})}catch(te){const Ne=r("sidecar.failed","操作失败")+`: ${(te==null?void 0:te.message)||te}`;ft?ve.finish({ok:!1,message:Ne}):Nt.show({id:$t,message:Ne,progress:void 0,status:"error",ttl:8e3})}finally{try{bt&&bt()}catch{}Ht(""),g==null||g(),(Q==="update"||Q==="restart"||Q==="start")&&ut(!1)}},ge={start:r("busy.start","启动中…"),restart:r("busy.restart","重启中…"),update:r("busy.update","更新中…"),stop:r("busy.stop","停止中…")},Sa=async()=>{var J,ft,bt;Ht("start"),ve.open({teamId:s.id,title:r("sidecar.startTitle","启动 cicy-code"),onRetry:Sa}),ve.push({phase:"download",status:"running",message:r("sidecar.starting","启动 cicy-code(首次需安装 Node + 依赖,日志见下)…")});const Q=(bt=(ft=(J=window.cicy)==null?void 0:J.sidecar)==null?void 0:ft.onOpProgress)==null?void 0:bt.call(ft,Qt=>ve.push(Qt));let tt;try{tt=await window.cicy.sidecar.start()}catch(Qt){tt={ok:!1,error:(Qt==null?void 0:Qt.message)||String(Qt)}}try{Q==null||Q()}catch{}return Ht(""),g==null||g(),!(tt!=null&&tt.ok)||tt!=null&&tt.warning?(ve.finish({ok:!1,message:r("sidecar.startFailed","启动失败")+(tt!=null&&tt.error?`: ${tt.error}`:tt!=null&&tt.warning?`: ${tt.warning}`:"")}),!1):(ve.finish({ok:!0,message:r("sidecar.startedOk","cicy-code 已就绪")}),!0)},de=async()=>{var Q,tt;yt||!Rt&&gt&&((tt=(Q=window.cicy)==null?void 0:Q.sidecar)!=null&&tt.start)&&!await Sa()||b()},F=Rt?r("localTeams.open","打开"):gt?r("localTeams.startOpen","启动并打开"):r("localTeams.open","打开");return u.jsxs(u.Fragment,{children:[u.jsxs("div",{"data-id":"LocalTeamCard",className:`bcard ${gt?"bcard--local":"bcard--custom"}${m==="ok"?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent"}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":m}),u.jsx(Qp,{})]}),Mt&&u.jsxs("div",{className:"bcard__menuwrap",ref:H,onClick:Q=>Q.stopPropagation(),children:[u.jsx("button",{type:"button",ref:nt,"data-id":"LocalTeamCard-menu-btn",className:`bcard__kebab${xt?" has-dot":""}`,title:gt?r("localTeams.manage","管理本地 cicy-code"):r("localTeams.more","更多"),disabled:!!yt,onClick:P,children:yt?u.jsx(Xe,{}):u.jsx(Do,{})}),C&&da.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"LocalTeamCard-menu",role:"menu",ref:_t,style:{position:"fixed",top:Dt.top,left:Dt.left,width:X},onClick:Q=>Q.stopPropagation(),children:[gt&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-check-update",className:"bcard__menu-item",disabled:pt,onClick:Q=>{Q.stopPropagation(),ut(!0)},children:pt?r("sidecar.checking2","检查中…"):r("sidecar.checkUpdate","检查更新")}),xt&&u.jsxs("button",{type:"button","data-id":"LocalTeamCard-update",className:"bcard__menu-item is-accent",onClick:()=>aa("update",()=>window.cicy.sidecar.update(),r("sidecar.updated","已更新到最新")),children:[r("sidecar.updateTo","更新到")," v",lt]}),s.base_url&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-reload",className:"bcard__menu-item",onClick:Q=>{var tt,J,ft;Q.stopPropagation(),L(!1),(ft=(J=(tt=window.cicy)==null?void 0:tt.tabs)==null?void 0:J.reloadIfOpen)==null||ft.call(J,s.base_url,s.name)},children:r("localTeams.reloadWindow","刷新窗口")}),gt&&!Rt&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-start",className:"bcard__menu-item is-accent",onClick:()=>aa("start",()=>window.cicy.sidecar.start(),r("sidecar.started","已启动")),children:r("sidecar.start","启动")}),gt&&Rt&&u.jsxs(u.Fragment,{children:[u.jsx("button",{type:"button","data-id":"LocalTeamCard-restart",className:"bcard__menu-item",onClick:()=>aa("restart",()=>window.cicy.sidecar.restart(),r("sidecar.restarted","已重启")),children:r("sidecar.restart","重启")}),u.jsx("button",{type:"button","data-id":"LocalTeamCard-stop",className:"bcard__menu-item is-danger",onClick:()=>aa("stop",()=>window.cicy.sidecar.stop(),r("sidecar.stoppedDone","已停止")),children:r("sidecar.stop","停止")}),u.jsxs("button",{type:"button","data-id":"LocalTeamCard-lan",className:"bcard__menu-item",title:r("sidecar.lanHint","开启后同局域网设备可用本机 IP 访问(api_token 仍校验);切换会自动重启 cicy-code"),disabled:yt==="lan",onClick:async()=>{if(yt)return;const Q=!p;L(!1),Ht("lan"),M(Q),Nt.show({id:$t,message:Q?r("sidecar.lanEnabling","开启局域网访问,重启中…"):r("sidecar.lanDisabling","关闭局域网访问,重启中…"),status:"running",progress:void 0});try{const tt=await window.cicy.sidecar.setPublic(Q);tt!=null&&tt.ok?Nt.show({id:$t,message:Q?r("sidecar.lanOn","已开启局域网访问"):r("sidecar.lanOff","已关闭局域网访问"),status:"done",ttl:3e3}):Nt.show({id:$t,message:r("sidecar.lanFailed","设置失败")+(tt!=null&&tt.error?`: ${tt.error}`:""),status:"error",ttl:7e3})}catch(tt){Nt.show({id:$t,message:r("sidecar.lanFailed","设置失败")+`: ${(tt==null?void 0:tt.message)||tt}`,status:"error",ttl:7e3})}try{const tt=await window.cicy.sidecar.getPublic();M(!!(tt!=null&&tt.public))}catch{}Ht(""),g==null||g()},children:[r("sidecar.lanAccess","局域网访问")," · ",p?r("common.on","开"):r("common.off","关")]})]}),s.cloud_team_id&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-billing",className:"bcard__menu-item",onClick:Q=>{Q.stopPropagation(),L(!1),Qi(`?team=${encodeURIComponent(v||s.cloud_team_id)}`)},children:r("localTeams.billing","账单")}),Ct&&u.jsxs(u.Fragment,{children:[u.jsx("button",{type:"button","data-id":"LocalTeamCard-edit-url",className:"bcard__menu-item",onClick:Q=>{Q.stopPropagation(),L(!1),it(!0),Ee(s.base_url||"")},children:r("teamCard.editUrl","更改访问地址")}),u.jsx("button",{type:"button","data-id":"LocalTeamCard-remove",className:"bcard__menu-item is-danger",onClick:()=>{L(!1),qt(!0)},children:r("localTeams.remove","删除")})]}),(rt||s.version)&&u.jsxs("div",{"data-id":"LocalTeamCard-version",className:"bcard__menu-item",style:{cursor:"default",color:"#8b949e",fontSize:12},children:[r("localTeams.version","版本")," v",rt||s.version]})]}),document.body)]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(ic,{size:24,avatar:s==null?void 0:s.avatar,name:s==null?void 0:s.name,teamId:s==null?void 0:s.id,onChanged:g}),f?u.jsx("input",{"data-id":"LocalTeamCard-rename-input",autoFocus:!0,value:h,onChange:Q=>q(Q.target.value),onFocus:Q=>Q.target.select(),onBlur:wt,onClick:Q=>Q.stopPropagation(),onKeyDown:Q=>{Q.nativeEvent.isComposing||Q.keyCode===229||(Q.key==="Enter"?wt():Q.key==="Escape"&&y(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:r("localTeams.renameHint","点名字或 ✎ 改名"),style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:st,children:[u.jsx("span",{"data-id":"LocalTeamCard-name-text",onClick:st,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"text"},children:$}),Y==="saving"&&u.jsx("span",{"data-id":"LocalTeamCard-save-state",title:r("localTeams.saving","保存中…"),style:{flex:"none",display:"inline-flex"},children:u.jsx(Xe,{})}),Y==="saved"&&u.jsx("span",{"data-id":"LocalTeamCard-save-state",title:r("localTeams.saved","已保存"),style:{flex:"none",color:"#3fb950",fontSize:13,lineHeight:1},children:"✓"}),!Y&&u.jsx("button",{type:"button","data-id":"LocalTeamCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:st,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsx("div",{className:"bcard__meta",children:u.jsx("span",{className:"bcard__chip","data-id":"LocalTeamCard-kind",children:gt?r("localTeams.kindLocal","本地"):r("localTeams.kindCustom","自定义")})})]}),u.jsxs("button",{type:"button",className:"bcard__cta","data-id":"LocalTeamCard-open",disabled:!!yt||!s.base_url,onClick:de,children:[yt&&yt!=="stop"?u.jsx(Xe,{}):u.jsx(Xi,{}),u.jsx("span",{children:yt&&ge[yt]||F})]})]}),Ze&&da.createPortal(u.jsx("div",{"data-id":"LocalTeamCard-url-modal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:Q=>{!Wt&&Q.target===Q.currentTarget&&it(!1)},children:u.jsxs("div",{onClick:Q=>Q.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("teamCard.editUrl","更改访问地址")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:s.name}),u.jsx("textarea",{"data-id":"LocalTeamCard-url-input",autoFocus:!0,rows:3,className:"login-email-input",style:{width:"100%",resize:"vertical",lineHeight:1.5,fontFamily:"var(--mono)"},value:Vt,placeholder:"https://example.com:8008",spellCheck:!1,disabled:Wt,onChange:Q=>Ee(Q.target.value.replace(/[\r\n]+/g,"")),onKeyDown:Q=>{Q.nativeEvent.isComposing||Q.keyCode===229||(Q.key==="Enter"?(Q.preventDefault(),Be()):Q.key==="Escape"&&it(!1))}}),Ve&&u.jsx("div",{className:"error",style:{marginTop:8,fontSize:12},children:Ve}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",disabled:Wt,onClick:()=>it(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"LocalTeamCard-url-save",disabled:Wt,onClick:Be,children:Wt?r("common.saving","保存中…"):r("common.save","保存")})]})]})}),document.body),u.jsx(Jh,{open:re,title:r("localTeams.deleteTitle","删除团队"),message:r("localTeams.deleteMsg","确定删除「{{name}}」?此操作不可撤销。",{name:s.name}),confirmLabel:r("common.delete","删除"),danger:!0,onConfirm:Oa,onCancel:()=>qt(!1)})]})}function Eo(s){var v;try{if(((v=window.cicy)==null?void 0:v.platform)==="win32")return!1;const b=new URL(s);return(b.hostname==="127.0.0.1"||b.hostname==="localhost"||b.hostname==="::1")&&(b.port==="8008"||b.port==="")}catch{return!1}}function Uh(s){var v;try{if(((v=window.cicy)==null?void 0:v.platform)!=="win32")return!1;const b=new URL(s);return(b.hostname==="127.0.0.1"||b.hostname==="localhost"||b.hostname==="::1")&&b.port==="8008"}catch{return!1}}function Bh(s,v){const b=String(s).split("."),o=String(v).split(".");for(let g=0;g<Math.max(b.length,o.length);g++){const _=(parseInt(b[g],10)||0)-(parseInt(o[g],10)||0);if(_)return _>0?1:-1}return 0}const Rh={running:{tone:"ok",label:"running",cta:r("localStatus.open","打开")},stopped:{tone:"off",label:"stopped",cta:r("localStatus.notRunning","未运行")},auth_error:{tone:"warn",label:"auth error",cta:r("localStatus.tokenInvalid","Token 失效")},misconfigured:{tone:"err",label:"bad config",cta:r("localStatus.badUrl","URL 错误")},error:{tone:"err",label:"error",cta:r("localStatus.error","异常")}};function Jh({open:s,title:v,message:b,confirmLabel:o,danger:g,onConfirm:_,onCancel:m}){return s?da.createPortal(u.jsx("div",{"data-id":"ConfirmModal",style:{position:"fixed",inset:0,zIndex:70,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:f=>{f.target===f.currentTarget&&(m==null||m())},children:u.jsxs("div",{onClick:f=>f.stopPropagation(),style:{width:360,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:6},children:v}),b&&u.jsx("div",{style:{fontSize:13,opacity:.7,marginBottom:16},children:b}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:m,children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"ConfirmModal-ok",style:g?{background:"#dc2626",borderColor:"#dc2626"}:{},onClick:_,children:o||r("common.confirm","确认")})]})]})}),document.body):null}function Op({team:s,onOpen:v,onRename:b,onEditUrl:o,onDelete:g,avatar:_,onAvatar:m}){const f=s.kind==="private",y=s.status==="active",h=s.name||s.title||"—",[q,j]=A.useState(!1),[B,Y]=A.useState(""),[et,$]=A.useState(null),st=et??h;A.useEffect(()=>{et!=null&&h===et&&$(null)},[h,et]);const wt=it=>{var Vt;(Vt=it==null?void 0:it.stopPropagation)==null||Vt.call(it),Y(st==="—"?"":st),j(!0)},Bt=async()=>{j(!1);const it=String(B||"").trim();if(!(!b||!it||it===st)){$(it);try{const Vt=await b(s.id,it);Vt!=null&&Vt.ok||$(null)}catch{$(null)}}},gt=s.host_url||"",[Rt,yt]=A.useState(!1),[Ht,C]=A.useState(""),[L,p]=A.useState(null),M=L??gt;A.useEffect(()=>{L!=null&&gt===L&&p(null)},[gt,L]);const U=s.teamId||s.id,K=f?r("teamKind.private","私有云"):s.team_kind==="personal"?r("teamKind.personal","个人"):r("teamKind.shared","共享"),lt=f?M:s.workspace_url||s.workspace_direct_url,rt=!!lt,[pt,N]=A.useState(!1),[H,nt]=A.useState(!1),[_t,Dt]=A.useState({top:0,left:0}),S=A.useRef(null),X=A.useRef(null),P=A.useRef(null),ut=184,xt=()=>{if(!pt&&X.current){const it=X.current.getBoundingClientRect(),Vt=Math.max(8,Math.min(it.right-ut,window.innerWidth-ut-8));Dt({top:Math.round(it.bottom+4),left:Math.round(Vt)})}N(it=>!it)};A.useEffect(()=>{if(!pt)return;const it=Vt=>{var Ee,Wt;(Ee=X.current)!=null&&Ee.contains(Vt.target)||(Wt=P.current)!=null&&Wt.contains(Vt.target)||N(!1)};return document.addEventListener("mousedown",it),()=>document.removeEventListener("mousedown",it)},[pt]);const Ct=it=>{var Vt,Ee,Wt,Ue;(Vt=it==null?void 0:it.stopPropagation)==null||Vt.call(it),rt&&(N(!1),(Ue=(Wt=(Ee=window.cicy)==null?void 0:Ee.tabs)==null?void 0:Wt.reloadIfOpen)==null||Ue.call(Wt,lt,st))},[Mt,re]=A.useState(!1),qt=()=>{C(gt),yt(!0),N(!1)},Ze=async()=>{yt(!1);const it=String(Ht||"").trim();if(!(!o||!it||it===gt)){p(it);try{const Vt=await o(s.id,it);Vt!=null&&Vt.ok||p(null)}catch{p(null)}}};return u.jsxs(u.Fragment,{children:[u.jsxs("div",{"data-id":"TeamCard",className:`bcard bcard--cloud${y?" bcard--online":""}`,children:[u.jsx("div",{className:"bcard__accent"}),u.jsxs("div",{className:"bcard__top",children:[u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":y?"ok":"off"}),u.jsx(Wh,{})]}),u.jsxs("div",{className:"bcard__top-right",children:[s.is_trial&&u.jsx("span",{className:"bcard__badge",children:"trial"}),(rt||U!=null||f&&o)&&u.jsxs("div",{className:"bcard__menuwrap",ref:S,onClick:it=>it.stopPropagation(),children:[u.jsx("button",{type:"button",ref:X,"data-id":"TeamCard-menu-btn",className:"bcard__kebab",title:r("localTeams.more","更多"),disabled:H,onClick:xt,children:H?u.jsx(Xe,{}):u.jsx(Do,{})}),pt&&da.createPortal(u.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"TeamCard-menu",role:"menu",ref:P,style:{position:"fixed",top:_t.top,left:_t.left,width:ut},onClick:it=>it.stopPropagation(),children:[rt&&u.jsx("button",{type:"button","data-id":"TeamCard-reload",className:"bcard__menu-item",onClick:Ct,children:r("localTeams.reloadWindow","刷新窗口")}),U!=null&&u.jsx("button",{type:"button","data-id":"TeamCard-billing",className:"bcard__menu-item",onClick:it=>{it.stopPropagation(),N(!1),Qi(`?team=${encodeURIComponent(U)}`)},children:r("localTeams.billing","账单")}),f&&o&&u.jsx("button",{type:"button","data-id":"TeamCard-edit-url",className:"bcard__menu-item",onClick:it=>{it.stopPropagation(),qt()},children:gt?r("teamCard.editUrl","更改访问地址"):r("teamCard.setUrl","填写访问地址")}),f&&g&&u.jsx("button",{type:"button","data-id":"TeamCard-delete",className:"bcard__menu-item is-danger",onClick:it=>{it.stopPropagation(),N(!1),re(!0)},children:r("teamCard.delete","删除")})]}),document.body)]})]})]}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(ic,{size:24,avatar:_,name:(s==null?void 0:s.name)||(s==null?void 0:s.title),teamId:s==null?void 0:s.id,onChanged:m}),q?u.jsx("input",{"data-id":"TeamCard-rename-input",autoFocus:!0,value:B,onChange:it=>Y(it.target.value),onFocus:it=>it.target.select(),onBlur:Bt,onClick:it=>it.stopPropagation(),onKeyDown:it=>{it.nativeEvent.isComposing||it.keyCode===229||(it.key==="Enter"?Bt():it.key==="Escape"&&j(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):u.jsxs("h3",{className:"bcard__name",title:b?r("localTeams.renameHint","点名字或 ✎ 改名"):st,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:b?wt:void 0,children:[u.jsx("span",{onClick:b?wt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:b?"text":"default"},children:st}),b&&u.jsx("button",{type:"button","data-id":"TeamCard-rename-btn",title:r("localTeams.rename","重命名"),onClick:wt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})]}),u.jsxs("div",{className:"bcard__meta",children:[u.jsx("span",{className:"bcard__chip",children:K}),!f&&s.membership_status&&s.membership_status!=="active"&&u.jsx("span",{className:"bcard__chip",children:s.membership_status})]})]}),u.jsxs("button",{type:"button",className:"bcard__cta",onClick:v,disabled:!rt,children:[u.jsx(Xi,{}),u.jsx("span",{children:rt?r("localTeams.open","打开"):f?r("teamCard.noHost","未填访问地址"):r("teamCard.noUrl","无 URL")})]})]}),Rt&&da.createPortal(u.jsx("div",{"data-id":"TeamCard-url-modal",style:{position:"fixed",inset:0,zIndex:65,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:it=>{it.target===it.currentTarget&&yt(!1)},children:u.jsxs("div",{onClick:it=>it.stopPropagation(),style:{width:400,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:gt?r("teamCard.editUrl","更改访问地址"):r("teamCard.setUrl","填写访问地址")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:st}),u.jsx("textarea",{"data-id":"TeamCard-url-input",autoFocus:!0,rows:3,className:"login-email-input",style:{width:"100%",resize:"vertical",lineHeight:1.5,fontFamily:"var(--mono)"},value:Ht,placeholder:"https://你的私有云地址:端口",spellCheck:!1,onChange:it=>C(it.target.value.replace(/[\r\n]+/g,"")),onKeyDown:it=>{it.nativeEvent.isComposing||it.keyCode===229||(it.key==="Enter"?(it.preventDefault(),Ze()):it.key==="Escape"&&yt(!1))}}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",onClick:()=>yt(!1),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"TeamCard-url-save",onClick:Ze,children:r("common.save","保存")})]})]})}),document.body),u.jsx(Jh,{open:Mt,title:r("localTeams.deleteTitle","删除团队"),message:r("localTeams.deleteMsg","确定删除「{{name}}」?此操作不可撤销。",{name:st}),confirmLabel:r("common.delete","删除"),danger:!0,onConfirm:async()=>{re(!1),g&&await g(s)},onCancel:()=>re(!1)})]})}function To(){return u.jsxs("div",{className:"brand",children:[u.jsx("div",{className:"brand-mark",children:u.jsx(Gp,{})}),u.jsxs("div",{className:"brand-text",children:[u.jsx("div",{className:"brand-name",children:"CiCy Desktop"}),u.jsx("div",{className:"brand-sub",children:r("app.brandSub","团队 AI 协作工作台")})]})]})}function Up(){const[s,v]=A.useState(null),[b,o]=A.useState(!1),g=A.useRef(!1);A.useEffect(()=>{var h,q,j,B,Y,et;let f=!0;(j=(q=(h=window.cicy)==null?void 0:h.app)==null?void 0:q.updateState)==null||j.call(q).then($=>{f&&v($)}).catch(()=>{});const y=(et=(Y=(B=window.cicy)==null?void 0:B.app)==null?void 0:Y.onUpdateState)==null?void 0:et.call(Y,$=>{v($),g.current&&($.status==="downloading"?ve.setProgress($.progress||{}):$.status==="ready"?ve.ready({onInstall:()=>{var st,wt,Bt;return(Bt=(wt=(st=window.cicy)==null?void 0:st.app)==null?void 0:wt.installUpdate)==null?void 0:Bt.call(wt)}}):$.status==="error"&&(ve.finish({ok:!1,message:$.error||r("updateBanner.error","更新失败")}),g.current=!1))});return()=>{f=!1;try{y&&y()}catch{}}},[]);const _=s==null?void 0:s.status;A.useEffect(()=>{o(!1)},[_]);const m=()=>{var f,y,h;g.current=!0,o(!0),ve.open({kind:"app",title:r("updateBanner.drawerTitle","应用更新"),fromVer:s==null?void 0:s.current,toVer:s==null?void 0:s.version,onRetry:m}),ve.push({phase:"download",status:"running",message:r("updateBanner.startDl","开始下载安装包…")}),ve.setProgress({percent:0}),(h=(y=(f=window.cicy)==null?void 0:f.app)==null?void 0:y.downloadUpdate)==null||h.call(y)};return _!=="available"||b?null:da.createPortal(u.jsx("div",{"data-id":"UpdateBanner",style:{position:"fixed",inset:0,zIndex:1e4,background:"rgba(0,0,0,0.6)",backdropFilter:"blur(3px)",display:"flex",alignItems:"center",justifyContent:"center"},onMouseDown:f=>{f.target===f.currentTarget&&o(!0)},children:u.jsxs("div",{onClick:f=>f.stopPropagation(),style:{width:380,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:14,padding:"24px 24px 20px",boxShadow:"0 20px 60px rgba(0,0,0,0.55)",textAlign:"center"},children:[u.jsx("div",{style:{fontSize:34,lineHeight:1,marginBottom:12},"aria-hidden":!0,children:"🚀"}),u.jsx("h3",{style:{margin:"0 0 8px",fontSize:17,color:"#e6edf3"},"data-id":"UpdateBanner-text",children:r("updateBanner.available","发现新版本 v{{v}}",{v:s.version})}),u.jsx("p",{style:{margin:"0 0 20px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:r("updateBanner.modalSub","建议尽快更新到最新版本")}),u.jsxs("div",{style:{display:"flex",gap:10,justifyContent:"center"},children:[u.jsx("button",{type:"button","data-id":"UpdateBanner-later",onClick:()=>o(!0),style:{flex:1,padding:"9px 16px",borderRadius:9,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:14},children:r("updateBanner.later","稍后")}),u.jsx("button",{type:"button","data-id":"UpdateBanner-download",onClick:m,style:{flex:1,padding:"9px 16px",borderRadius:9,border:"none",background:"#238636",color:"white",cursor:"pointer",fontSize:14,fontWeight:600},children:r("updateBanner.updateNow","立即更新")})]})]})}),document.body)}function Hh(){return u.jsxs("div",{className:"bcard bcard--skeleton","data-id":"SkeletonCard","aria-hidden":!0,children:[u.jsx("div",{className:"bcard__accent",style:{background:"rgba(255,255,255,.08)",opacity:1}}),u.jsxs("div",{className:"bcard__top",children:[u.jsx("div",{className:"skel",style:{width:84,height:26,borderRadius:999}}),u.jsx("div",{className:"skel",style:{width:22,height:22,borderRadius:6}})]}),u.jsxs("div",{style:{flex:1,minHeight:0,marginTop:14},children:[u.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[u.jsx("div",{className:"skel",style:{width:24,height:24,borderRadius:6,flex:"0 0 auto"}}),u.jsx("div",{className:"skel skel--line",style:{width:"55%"}})]}),u.jsx("div",{className:"skel",style:{width:60,height:18,borderRadius:6,marginTop:12}})]}),u.jsx("div",{className:"skel skel--cta",style:{marginTop:0}})]})}const Lh=["hsl(2 68% 48%)","hsl(26 72% 46%)","hsl(45 70% 42%)","hsl(96 55% 38%)","hsl(140 58% 40%)","hsl(168 62% 36%)","hsl(192 70% 42%)","hsl(210 72% 50%)","hsl(232 62% 56%)","hsl(266 55% 55%)","hsl(292 58% 50%)","hsl(324 66% 50%)"];function Bp(s){s=String(s??"");let v=0;for(let b=0;b<s.length;b++)v=(v*31+s.charCodeAt(b))%100003;return v}function Rp(s){return Lh[Bp(s)%Lh.length]}function Hp({open:s,onClose:v,toastId:b="dood-op"}){const[o,g]=A.useState(!1),[_,m]=A.useState(""),[f,y]=A.useState(!1),[h,q]=A.useState("");A.useEffect(()=>{var Y,et;!s||!((et=(Y=window.cicy)==null?void 0:Y.sidecar)!=null&&et.getDood)||(m(""),q(""),window.cicy.sidecar.getDood().then($=>y(!!($!=null&&$.dood))).catch(()=>{}))},[s]),A.useEffect(()=>{var Y,et;if(!(!s||!o||!((et=(Y=window.cicy)==null?void 0:Y.sidecar)!=null&&et.onOpProgress)))return window.cicy.sidecar.onOpProgress($=>{$!=null&&$.message&&q(String($.message))})},[s,o]);const j=async()=>{if(!o){g(!0),m(""),q(""),Nt.show({id:b,message:f?r("dood.applying","开启容器 Docker 访问,重建容器中…"):r("dood.disabling","关闭中…"),status:"running",progress:void 0});try{const Y=await window.cicy.sidecar.setDood(f);Y!=null&&Y.ok?(v&&v(),Nt.show({id:b,message:f?r("dood.onDone","容器 Docker 访问已开启"):r("dood.offDone","容器 Docker 访问已关闭"),status:"done",ttl:4e3})):(m((Y==null?void 0:Y.error)||r("dood.failed","设置失败")),Nt.show({id:b,message:r("dood.failed","设置失败")+(Y!=null&&Y.error?`: ${Y.error}`:""),status:"error",ttl:6e3}))}catch(Y){m((Y==null?void 0:Y.message)||String(Y)),Nt.show({id:b,message:r("dood.failed","设置失败")+`: ${(Y==null?void 0:Y.message)||Y}`,status:"error",ttl:6e3})}finally{g(!1)}}},B=Y=>{v&&v()};return s?u.jsx(u.Fragment,{children:da.createPortal(u.jsx("div",{"data-id":"dood-modal",style:{position:"fixed",inset:0,zIndex:66,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.5)"},onMouseDown:Y=>{!o&&Y.target===Y.currentTarget&&B()},children:u.jsxs("div",{onClick:Y=>Y.stopPropagation(),style:{width:440,maxWidth:"92vw",background:"var(--card, #1b1d22)",border:"1px solid var(--border, #2c2f36)",borderRadius:14,padding:22,boxShadow:"0 20px 60px rgba(0,0,0,.5)"},children:[u.jsx("div",{style:{fontSize:16,fontWeight:700,marginBottom:4},children:r("dood.title","容器内使用 Docker")}),u.jsx("div",{style:{fontSize:12,opacity:.6,marginBottom:16},children:r("dood.subtitle","把宿主 Docker + docker 客户端挂进容器,容器内 agent 就能直接跑 docker(秒生效,无需下载)")}),u.jsxs("label",{"data-id":"dood-toggle-row",style:{display:"flex",alignItems:"center",gap:10,cursor:o?"default":"pointer",marginBottom:12},children:[u.jsx("input",{type:"checkbox","data-id":"dood-toggle",checked:f,disabled:o,onChange:Y=>y(Y.target.checked)}),u.jsx("span",{style:{fontSize:14,fontWeight:600},children:r("dood.enable","允许容器内使用 Docker")})]}),o&&h&&u.jsx("div",{"data-id":"dood-progress",style:{fontSize:11,opacity:.7,fontFamily:"var(--mono)",wordBreak:"break-all",margin:"0 0 8px",maxHeight:60,overflow:"hidden"},children:h}),_&&u.jsx("div",{className:"error",style:{marginTop:8,fontSize:12},children:_}),u.jsxs("div",{className:"modal-actions",children:[u.jsx("button",{type:"button",className:"btn-ghost",disabled:o,onClick:()=>B(),children:r("common.cancel","取消")}),u.jsx("button",{type:"button",className:"btn-primary","data-id":"dood-save",disabled:o,onClick:j,children:o?r("common.saving","保存中…"):r("common.save","保存")})]})]})}),document.body)}):null}function ic({avatar:s,name:v,teamId:b,onChanged:o,size:g=34}){const _=A.useRef(null),m=((v||"?").trim()[0]||"?").toUpperCase(),f=Rp(b||v||""),y=h=>{const q=h.target.files&&h.target.files[0];if(h.target.value="",!q)return;const j=new FileReader;j.onload=async()=>{var B,Y,et;try{await((et=(Y=(B=window.cicy)==null?void 0:B.localTeams)==null?void 0:Y.setAvatar)==null?void 0:et.call(Y,b,j.result)),o&&o()}catch{}},j.readAsDataURL(q)};return u.jsxs("div",{"data-id":"TeamAvatar",className:"team-avatar",title:b?r("teamCard.changeAvatar","点击更换头像"):"",onClick:b?h=>{h.stopPropagation(),_.current&&_.current.click()}:void 0,style:{width:g,height:g,borderRadius:9,flex:"none",overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"center",cursor:b?"pointer":"default",background:s?"#0d1117":f,color:"#fff",fontWeight:700,fontSize:Math.round(g*.42),userSelect:"none"},children:[s?u.jsx("img",{src:s,alt:"",style:{width:"100%",height:"100%",objectFit:"cover"}}):m,b&&u.jsx("input",{ref:_,type:"file",accept:"image/*",style:{display:"none"},onChange:y})]})}function Lp({team:s,onOpen:v}){const b=s.name||s.id||"team",o=Array.isArray(s.agents)?s.agents:[],g=o.filter(_=>_&&_.status==="working").length;return u.jsxs("div",{"data-id":"HubTeamCard",className:"bcard bcard--cloud bcard--online",children:[u.jsx("div",{className:"bcard__accent"}),u.jsx("div",{className:"bcard__top",children:u.jsxs("div",{className:"bcard__pill",children:[u.jsx("span",{className:"bcard__dot","data-tone":"ok"}),u.jsx(Wh,{})]})}),u.jsxs("div",{className:"bcard__body",children:[u.jsxs("div",{style:{height:28,display:"flex",alignItems:"center",gap:8},children:[u.jsx(ic,{size:24,avatar:"",name:b}),u.jsx("h3",{className:"bcard__name",title:b,style:{margin:0,flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:b})]}),u.jsxs("div",{className:"bcard__meta",children:[s.org?u.jsx("span",{className:"bcard__chip",children:s.org}):null,u.jsx("span",{className:"bcard__chip",children:r("hub.agents","{n} agent").replace("{n}",String(o.length))}),g>0?u.jsxs("span",{className:"bcard__chip",children:[g," working"]}):null]})]}),u.jsxs("button",{type:"button",className:"bcard__cta",onClick:v,children:[u.jsx(Xi,{}),u.jsx("span",{children:r("localTeams.open","打开")})]})]})}function qp({text:s,size:v=172}){const b=A.useMemo(()=>{try{const o=ql(0,"L");return o.addData(String(s||"")),o.make(),o.createSvgTag({cellSize:4,margin:2,scalable:!0})}catch{return""}},[s]);return b?u.jsx("div",{"data-id":"HubQR",style:{width:v,height:v,background:"#fff",borderRadius:10,padding:8,boxSizing:"border-box"},dangerouslySetInnerHTML:{__html:b}}):null}function Yp({size:s=14}){return u.jsx("svg",{width:s,height:s,viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":!0,children:u.jsx("path",{d:"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0016 8c0-4.42-3.58-8-8-8z"})})}function Gp(){return u.jsxs("svg",{width:"22",height:"22",viewBox:"0 0 96 96",fill:"none",children:[u.jsx("path",{d:"M48 11L39.5 33.3L16 29.5L31 48L16 66.5L39.5 62.7L48 85L56.5 62.7L80 66.5L65 48L80 29.5L56.5 33.3Z",stroke:"white",strokeWidth:"10",strokeLinejoin:"round",strokeLinecap:"round"}),u.jsx("circle",{cx:"48",cy:"48",r:"6",fill:"white"})]})}function Xi(){return u.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),u.jsx("polyline",{points:"12 5 19 12 12 19"})]})}function Xe(){return u.jsx("svg",{className:"spin",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.4",strokeLinecap:"round",children:u.jsx("path",{d:"M21 12a9 9 0 1 1-6.2-8.55"})})}function Qp(){return u.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),u.jsx("line",{x1:"2",y1:"20",x2:"22",y2:"20"})]})}function Do(){return u.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[u.jsx("circle",{cx:"12",cy:"5",r:"1.7"}),u.jsx("circle",{cx:"12",cy:"12",r:"1.7"}),u.jsx("circle",{cx:"12",cy:"19",r:"1.7"})]})}function Wh(){return u.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[u.jsx("circle",{cx:"12",cy:"12",r:"10"}),u.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),u.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}function Ll(s){try{return localStorage.getItem(s)||null}catch{return null}}function nn(s){return s?/timeout/i.test(s)?"登录超时,请重新点击 Login。":/state/i.test(s)?"校验失败,请重新登录。":/no token/i.test(s)?"登录未完成,请重试。":/bridge missing/i.test(s)?"无法连接到登录服务(preload 未就绪)。":s:""}var qh;const Xp=((qh=window.cicy)==null?void 0:qh.platform)||(()=>{const s=navigator.userAgent||"";return/Mac/i.test(s)?"darwin":/Windows/i.test(s)?"win32":"linux"})();document.documentElement.dataset.platform=Xp;document.documentElement.dataset.fullscreen="0";var Yh,Gh;(Gh=(Yh=window.cicy)==null?void 0:Yh.window)!=null&&Gh.onFullscreen&&window.cicy.window.onFullscreen(s=>{document.documentElement.dataset.fullscreen=s?"1":"0"});rp.createRoot(document.getElementById("root")).render(u.jsx(Cp,{}));
@@ -1,12 +1,11 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" fill="none">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
2
2
  <defs>
3
- <linearGradient id="cicyMark" x1="16" y1="12" x2="80" y2="84" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#60A5FA"/>
5
- <stop offset="0.55" stop-color="#2563EB"/>
6
- <stop offset="1" stop-color="#1E3A8A"/>
3
+ <linearGradient id="orbit" x1="118" y1="104" x2="397" y2="407" gradientUnits="userSpaceOnUse">
4
+ <stop stop-color="#7772D8"/>
5
+ <stop offset="1" stop-color="#3F82B8"/>
7
6
  </linearGradient>
8
7
  </defs>
9
- <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"
10
- fill="url(#cicyMark)" stroke="url(#cicyMark)" stroke-width="8"
11
- stroke-linejoin="round" stroke-linecap="round"/>
8
+ <path d="M256 68 311 161 419 162 366 256 419 350 311 351 256 444 201 351 93 350 146 256 93 162 201 161 256 68Z"
9
+ stroke="url(#orbit)" stroke-width="52" stroke-linecap="round" stroke-linejoin="round"/>
10
+ <circle cx="256" cy="256" r="30" fill="url(#orbit)"/>
12
11
  </svg>
@@ -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-B59LMpHi.js"></script>
9
+ <script type="module" crossorigin src="./assets/index-phbKLx1E.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="./assets/index-CJVu2wMT.css">
11
11
  </head>
12
12
  <body>
package/src/tray.js CHANGED
@@ -177,9 +177,11 @@ function setupTray() {
177
177
  // macOS: template image (auto-adapts to light/dark menu bar)
178
178
  iconPath = resolveAsset("trayTemplate.png");
179
179
  } else if (process.platform === "win32") {
180
- iconPath = resolveAsset("icon.ico");
180
+ // Keep the white app/window tile out of the notification area: Windows
181
+ // tray uses the colored transparent logo instead.
182
+ iconPath = resolveAsset("trayIcon.png");
181
183
  } else {
182
- iconPath = resolveAsset("icons/icon-32.png");
184
+ iconPath = resolveAsset("trayIcon.png");
183
185
  }
184
186
 
185
187
  const img = nativeImage.createFromPath(iconPath);
@@ -1,12 +1,11 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" fill="none">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="none">
2
2
  <defs>
3
- <linearGradient id="cicyMark" x1="16" y1="12" x2="80" y2="84" gradientUnits="userSpaceOnUse">
4
- <stop stop-color="#60A5FA"/>
5
- <stop offset="0.55" stop-color="#2563EB"/>
6
- <stop offset="1" stop-color="#1E3A8A"/>
3
+ <linearGradient id="orbit" x1="118" y1="104" x2="397" y2="407" gradientUnits="userSpaceOnUse">
4
+ <stop stop-color="#7772D8"/>
5
+ <stop offset="1" stop-color="#3F82B8"/>
7
6
  </linearGradient>
8
7
  </defs>
9
- <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"
10
- fill="url(#cicyMark)" stroke="url(#cicyMark)" stroke-width="8"
11
- stroke-linejoin="round" stroke-linecap="round"/>
8
+ <path d="M256 68 311 161 419 162 366 256 419 350 311 351 256 444 201 351 93 350 146 256 93 162 201 161 256 68Z"
9
+ stroke="url(#orbit)" stroke-width="52" stroke-linecap="round" stroke-linejoin="round"/>
10
+ <circle cx="256" cy="256" r="30" fill="url(#orbit)"/>
12
11
  </svg>
@@ -3835,13 +3835,13 @@ function GithubMark({ size = 14 }) {
3835
3835
  );
3836
3836
  }
3837
3837
  function BrandGlyph() {
3838
- // New CiCy mark (六芒星). Rendered white here because it sits on the brand
3839
- // chip's blue→violet gradient square; the full-color gradient version is the
3840
- // app/favicon icon. Path matches build/icon.svg (viewBox 0 0 96 96).
3838
+ // CiCy outline mark. Rendered white because it sits on the brand chip's
3839
+ // blue→violet gradient square.
3841
3840
  return (
3842
3841
  <svg width="22" height="22" viewBox="0 0 96 96" fill="none">
3843
3842
  <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"
3844
- fill="white" stroke="white" strokeWidth="8" strokeLinejoin="round" strokeLinecap="round" />
3843
+ stroke="white" strokeWidth="10" strokeLinejoin="round" strokeLinecap="round" />
3844
+ <circle cx="48" cy="48" r="6" fill="white" />
3845
3845
  </svg>
3846
3846
  );
3847
3847
  }