cicy-desktop 2.1.163 → 2.1.164
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/backends/homepage-react/assets/{index-Cuc3w0O-.css → index-BwoV_5tD.css} +1 -1
- package/src/backends/homepage-react/assets/{index-CpLVjdB4.js → index-DpB75035.js} +1 -1
- package/src/backends/homepage-react/index.html +2 -2
- package/src/i18n/locales/en.json +10 -2
- package/src/i18n/locales/fr.json +10 -2
- package/src/i18n/locales/ja.json +10 -2
- package/src/i18n/locales/zh-CN.json +10 -2
- package/workers/render/src/App.css +8 -0
- package/workers/render/src/App.jsx +17 -12
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@font-face{font-family:Noto Sans Mono CJK SC;src:url(./NotoMonoSC-Regular-CYHoGOBB.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}:root{--mono: "Noto Sans Mono CJK SC", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace}:root{--accent: #5b8df7;--accent-soft: rgba(91,141,247,.16);--accent-line: rgba(91,141,247,.32);--accent-text: #a5c4ff;--ok: #4ade80;--danger: #f7a3a3;--text: #e5e7eb;--text-dim: #9da7b3;--text-mute: #6b7280;--line: rgba(255,255,255,.08)}*{box-sizing:border-box}html,body,#root{margin:0;height:100%}html,body{overflow:hidden}body{font-family:-apple-system,BlinkMacSystemFont,PingFang SC,Segoe UI,Roboto,Helvetica Neue,sans-serif;background:#07080c;color:#e5e7eb;-webkit-font-smoothing:antialiased}.shell{position:relative;min-height:100vh;display:flex;align-items:center;justify-content:center;overflow:hidden;-webkit-app-region:drag}.shell--app{align-items:stretch;justify-content:stretch;flex-direction:row;background:linear-gradient(180deg,#0b0d13,#07080c);overflow:hidden;-webkit-app-region:no-drag}.shell__left{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;overflow:hidden}.helper-aside{flex:0 0 auto;position:relative;background:#0f1115;border-left:1px solid rgba(255,255,255,.06);display:flex;flex-direction:column;min-width:320px;z-index:1}.helper-aside,.helper-aside *,.shell--app .main{-webkit-app-region:no-drag}.shell--app .topbar{-webkit-app-region:drag}.shell--app .topbar .user-chip,.shell--app .topbar .user-chip *,.shell--app .topbar .btn-ghost{-webkit-app-region:no-drag}.glow{position:absolute;top:-40%;right:-40%;bottom:-40%;left:-40%;z-index:0;pointer-events:none;background:radial-gradient(closest-side,rgba(91,141,247,.2),transparent 60%),radial-gradient(closest-side at 30% 70%,rgba(167,139,250,.13),transparent 65%);filter:blur(30px)}.card{-webkit-app-region:no-drag;position:relative;z-index:1;width:380px;padding:36px 36px 28px;background:linear-gradient(180deg,#141820d9,#0d1016d9);border:1px solid rgba(255,255,255,.06);border-radius:16px;box-shadow:0 1px #ffffff0a inset,0 30px 60px #0006;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);display:flex;flex-direction:column;align-items:center;gap:18px}.brand{display:flex;align-items:center;gap:12px;align-self:stretch}.brand-mark{width:40px;height:40px;border-radius:12px;display:grid;place-items:center;background:linear-gradient(135deg,#5b8df7,#a78bfa);box-shadow:0 8px 20px #5b8df759}.brand-mark.sm{width:28px;height:28px;border-radius:8px;box-shadow:none}.brand-mark.sm svg{width:16px;height:16px}.brand-text{line-height:1.2}.brand-name{font-weight:600;font-size:15px}.brand-sub{font-size:12px;color:#9ca3af;margin-top:2px}.tagline{margin:4px 0 0;color:#c7cdd6;font-size:13.5px;text-align:center;line-height:1.55}.btn-primary{-webkit-app-region:no-drag;margin-top:4px;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:42px;display:inline-flex;align-items:center;justify-content:center;gap:8px;background:linear-gradient(180deg,#5b8df7,#4570d8);color:#fff;border:0;border-radius:10px;font-size:14px;font-weight:500;letter-spacing:.2px;cursor:pointer;box-shadow:0 1px #ffffff2e inset,0 -1px #0000002e inset,0 10px 22px #5b8df747;transition:transform 80ms ease,filter .12s ease}.btn-primary:hover{filter:brightness(1.08)}.btn-primary:active{transform:translateY(1px)}.btn-primary:disabled{filter:grayscale(.4) brightness(.7);cursor:default}.btn-ghost{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;color:#9ca3af;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:6px 14px;font-size:12.5px;cursor:pointer;transition:color .12s ease,border-color .12s ease,background .12s ease}.btn-ghost.sm{padding:4px 10px;font-size:11.5px}.btn-ghost:hover{color:#e5e7eb;background:#ffffff0a;border-color:#ffffff24}.btn-ghost:disabled{opacity:.4;cursor:default}.login-divider{display:flex;align-items:center;gap:10px;margin:4px 0;color:#6b7280;font-size:11.5px}.login-divider:before,.login-divider:after{content:"";flex:1;height:1px;background:#ffffff14}.login-email-input{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;box-sizing:border-box;background:#ffffff08;color:#e5e7eb;border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:8px 12px;font-size:13px;transition:border-color .12s ease,background .12s ease}.login-email-input::placeholder{color:#6b7280}.login-email-input:focus{outline:none;border-color:#6366f18c;background:#ffffff0d}.hint{margin:0;font-size:11.5px;color:#6b7280}.spinner-row{display:inline-flex;align-items:center;gap:8px;color:#c7cdd6;font-size:13px}.spin{animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.error{width:100%;font-size:12px;color:#fca5a5;background:#ef444414;border:1px solid rgba(239,68,68,.18);padding:8px 12px;border-radius:8px;text-align:center;line-height:1.5}.topbar{-webkit-app-region:drag;position:relative;flex:0 0 auto;z-index:10;display:flex;align-items:center;justify-content:space-between;padding:14px 24px 12px;background:#08090e99;border-bottom:1px solid rgba(255,255,255,.05);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}[data-platform=darwin][data-fullscreen="0"] .topbar{padding-top:34px}.brand-mini{display:inline-flex;align-items:center;gap:10px}.brand-mini .brand-name{font-size:14px}.user-chip{-webkit-app-region:no-drag;display:inline-flex;align-items:center;gap:10px}.welcome{font-size:12px;color:var(--text-dim);padding:4px 10px;border-radius:999px;background:#ffffff0d;border:1px solid var(--line);animation:fadein .2s ease}@keyframes fadein{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:none}}.avatar{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(135deg,#5b8df7,#a78bfa);font-size:12px;font-weight:600;color:#fff}.user-name{font-size:13px;color:#c7cdd6}.user-chip{position:relative}.user-chip__trigger{-webkit-app-region:no-drag;display:inline-flex;align-items:center;gap:8px;border:1px solid transparent;background:transparent;border-radius:999px;padding:3px 8px 3px 3px;cursor:pointer;transition:.12s}.user-chip__trigger:hover,.user-chip__trigger.is-open{background:#ffffff0f;border-color:#ffffff1f}.user-chip__caret{font-size:10px;color:#8a93a3;transition:transform .12s}.user-chip__trigger.is-open .user-chip__caret{transform:rotate(180deg)}.user-chip__menu{position:absolute;top:38px;right:0;z-index:30;min-width:200px;padding:6px;background:#1b2027;border:1px solid rgba(255,255,255,.12);border-radius:12px;box-shadow:0 12px 34px #00000080;display:flex;flex-direction:column;gap:2px;animation:fadein .14s ease}.user-chip__menu-item{text-align:left;width:100%;border:none;background:transparent;color:#d1d5db;border-radius:8px;padding:9px 11px;font-size:13px;cursor:pointer;transition:.12s}.user-chip__menu-item:hover{background:#ffffff12;color:#fff}.user-chip__menu-item.is-danger{color:#f7a3a3}.user-chip__menu-item.is-danger:hover{background:#ef444429;color:#fff}.user-chip__menu-sep{height:1px;margin:4px 2px;background:#ffffff14}.user-chip__menu-version{margin-top:4px;padding:8px 11px 4px;font-size:11px;color:#6b7280;text-align:center;font-variant-numeric:tabular-nums;-webkit-user-select:text;user-select:text;border-top:1px solid rgba(255,255,255,.06)}.user-chip__mitm-row{display:flex;align-items:center;justify-content:space-between;gap:10px;cursor:default}.user-chip__mitm-row:hover{background:transparent}.user-chip__mitm-label{font-size:13px;color:var(--text)}.mini-switch{-webkit-app-region:no-drag;position:relative;flex:0 0 auto;width:36px;height:20px;padding:0;border-radius:999px;border:1px solid var(--line);background:#ffffff14;cursor:pointer;transition:background .16s ease,border-color .16s ease}.mini-switch.is-on{background:var(--accent);border-color:var(--accent)}.mini-switch.is-busy{opacity:.6;cursor:default}.mini-switch:disabled{cursor:default}.mini-switch__knob{position:absolute;top:1px;left:1px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #00000073;transition:transform .16s ease}.mini-switch.is-on .mini-switch__knob{transform:translate(16px)}.mini-switch.is-busy .mini-switch__knob{animation:spin 1s linear infinite}.user-chip__mitm-note{margin:0 4px;padding:2px 4px 6px;font-size:11px;color:var(--text-mute)}.user-chip__mitm-err{margin:2px 4px 6px;padding:5px 8px;font-size:11px;color:var(--danger);background:#ef44441a;border-radius:6px;line-height:1.4}.bcard__top-right{display:inline-flex;align-items:center;gap:6px}.bcard__billing-btn{-webkit-app-region:no-drag;border:1px solid var(--line);background:transparent;color:var(--text-dim);border-radius:7px;padding:3px 9px;font-size:11px;cursor:pointer;transition:color .12s,border-color .12s,background .12s}.bcard__billing-btn:hover{color:var(--accent-text);border-color:var(--accent-line);background:var(--accent-soft)}.glow--app{inset:-10% -10% auto -10%;height:50vh;background:radial-gradient(closest-side at 75% 0%,rgba(91,141,247,.18),transparent 65%),radial-gradient(closest-side at 20% 10%,rgba(167,139,250,.1),transparent 60%);filter:blur(40px)}.main{position:relative;z-index:1;padding:22px 32px 48px;width:100%;display:flex;flex-direction:column;gap:16px;flex:1 1 auto;min-height:0;overflow-y:auto}.main::-webkit-scrollbar{width:8px}.main::-webkit-scrollbar-track{background:transparent}.main::-webkit-scrollbar-thumb{background:#7d87964d;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.main::-webkit-scrollbar-thumb:hover{background-color:#7d87968c}.app__tabs{display:inline-flex;align-items:center;gap:4px;padding:4px;background:#1418208c;border:1px solid rgba(255,255,255,.06);border-radius:10px;align-self:flex-start;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.app__tab{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;color:#9ca3af;border:0;border-radius:7px;padding:6px 14px;font-size:12.5px;font-weight:500;letter-spacing:.15px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:color .12s ease,background .12s ease}.app__tab:hover{color:#e5e7eb;background:#ffffff0a}.app__tab.is-active{color:#fff;background:#5b8df72e;box-shadow:0 0 0 1px #5b8df74d inset}.app__tab-count{font-size:10.5px;color:#9ca3af;background:#ffffff0f;padding:1px 6px;border-radius:999px;min-width:18px;text-align:center}.app__tab.is-active .app__tab-count{background:#5b8df74d;color:#fff}.app__tabsrow{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%}.app__add-team{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;flex:none;color:#5b8df7;font-weight:600;font-size:12.5px;background:#5b8df71a;border:1px solid rgba(91,141,247,.35);border-radius:9px;padding:7px 14px;transition:color .12s ease,background .12s ease,border-color .12s ease}.app__add-team:hover{color:#fff;background:#5b8df738;border-color:#5b8df7a6}.app__grid{display:grid;grid-template-columns:repeat(auto-fill,200px);gap:14px}.add-card{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:200px;height:200px;background:transparent;border:1.5px dashed rgba(255,255,255,.12);border-radius:14px;color:#9ca3af;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;transition:border-color .16s ease,color .16s ease,background .16s ease}.add-card:hover{border-color:#5b8df780;color:#e5e7eb;background:#5b8df70d}.add-card__plus{width:36px;height:36px;border-radius:50%;display:grid;place-items:center;background:#ffffff0a;font-size:22px;font-weight:300;color:inherit}.add-card__label{font-size:13px;font-weight:500}.bcard--helper{background:linear-gradient(160deg,#5b8df729,#a78bfa24 60%,#1418208c);border-color:#a78bfa40}.bcard--helper .bcard__accent{background:linear-gradient(90deg,#5b8df7,#a78bfa);opacity:1}.bcard--helper:hover{border-color:#a78bfa73}.bcard__pill--helper{background:#a78bfa2e;border-color:#a78bfa4d;color:#c4b5fd;font-size:11px;font-weight:600;letter-spacing:.2px}.bcard__helper-icon{font-size:12px;filter:grayscale(.2)}.bcard__badge--free{background:#34d39926;color:#34d399;border:1px solid rgba(52,211,153,.3)}.bcard__badge--trial{background:#ffffff0f;color:var(--text-dim);border:1px solid var(--line);font-size:9.5px;letter-spacing:.3px;padding:2px 7px}.bcard__badge--local{background:#5b8df72e;color:#a5c4ff;border:1px solid rgba(91,141,247,.35);font-size:9.5px;letter-spacing:.3px;padding:2px 7px}.bcard--helper .bcard__name{color:#f3f4f6}.bcard__desc{margin:4px 0 0;font-size:11.5px;line-height:1.5;color:#c7cdd6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.bcard__fineprint{margin:4px 0 0;font-size:10.5px;color:#9ca3af;opacity:.8}.bcard__cta--helper{background:#ffffff0d;box-shadow:none}.bcard__cta--helper:hover{background:var(--accent-soft)}.helper-aside__top{display:flex;align-items:center;justify-content:space-between;padding:12px 14px 10px;border-bottom:1px solid rgba(255,255,255,.05)}.helper-aside__title{font-size:12.5px;font-weight:600;color:#c7cdd6}.helper-aside__close{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:#6b7280;font-size:20px;line-height:1;width:26px;height:26px;border-radius:6px;cursor:pointer;transition:color .12s ease,background .12s ease}.helper-aside__close:hover{color:#e5e7eb;background:#ffffff0f}.helper-modal__backdrop{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:transparent;z-index:20;animation:fadein .14s ease;padding:16px;pointer-events:auto}.helper-modal{width:min(360px,100%);background:linear-gradient(180deg,#1f2733,#1a2029);border:1px solid rgba(255,255,255,.1);border-radius:12px;padding:20px 22px 16px;color:#e5e7eb;box-shadow:0 24px 48px -12px #0009,0 1px #ffffff14 inset;animation:fadein .18s ease}.helper-modal__title{font-size:14px;font-weight:600;color:#f3f4f6;margin-bottom:8px}.helper-modal__desc{font-size:12.5px;line-height:1.6;color:#b6bcc6;margin-bottom:18px}.helper-modal__desc code{font-family:var(--mono);font-size:11.5px;padding:1px 6px;background:#ffffff14;border:1px solid rgba(255,255,255,.08);border-radius:4px;color:#e7eaef}.helper-modal__actions{display:flex;align-items:center;justify-content:flex-end;gap:8px}.helper-modal__btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#ffffff0f;color:#d2d6dd;border:1px solid rgba(255,255,255,.1);border-radius:7px;padding:7px 14px;font-size:12.5px;font-weight:500;cursor:pointer;transition:background .12s ease,color .12s ease,transform 80ms ease}.helper-modal__btn:hover{background:#ffffff1a;color:#fff}.helper-modal__btn:active{transform:translateY(1px)}.helper-modal__btn--ghost{background:transparent;border-color:transparent;color:#ffffff8c;margin-right:auto;padding-left:4px;padding-right:4px}.helper-modal__btn--ghost:hover{background:transparent;color:#ffffffd9}.helper-modal__btn--primary{background:linear-gradient(180deg,#5b8df7,#4570d8);border-color:#ffffff2e;color:#fff}.helper-modal__btn--primary:hover{background:linear-gradient(180deg,#6c9af9,#5a82e0)}.helper-modal__btn:disabled{filter:grayscale(.4) brightness(.7);cursor:default}.helper-placeholder{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:32px 40px;text-align:center;color:#9ca3af}.helper-placeholder__mark{font-size:48px;line-height:1;filter:grayscale(.2);opacity:.85}.helper-placeholder__title{margin:0;font-size:16px;font-weight:600;color:#e5e7eb}.helper-placeholder__sub{margin:0;font-size:12.5px;line-height:1.6;color:#9ca3af;max-width:320px}.helper-placeholder__note{margin-top:8px;font-size:11px;color:#6b7280;padding:4px 10px;background:#ffffff08;border:1px solid rgba(255,255,255,.06);border-radius:999px}.helper-placeholder__note code{font-family:var(--mono);font-size:11px;color:#c7cdd6}.section{background:linear-gradient(180deg,#141820b8,#0d1016b8);border:1px solid rgba(255,255,255,.06);border-radius:14px;box-shadow:0 1px #ffffff0a inset,0 14px 30px #00000052;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);padding:18px 18px 16px}.section-head{display:flex;align-items:center;gap:8px;padding:0 4px 14px;border-bottom:1px solid rgba(255,255,255,.04);margin-bottom:14px}.section-icon{font-size:14px;opacity:.8}.section-head h2{margin:0;font-size:13.5px;font-weight:600;color:#e5e7eb;letter-spacing:.2px}.section-sub{font-size:12px;color:#6b7280}.section-body{display:flex;flex-direction:column;gap:10px}.grid{display:grid;grid-template-columns:repeat(auto-fill,200px);gap:14px}.bcard{position:relative;width:200px;height:200px;background:#1418208c;border:1px solid rgba(255,255,255,.07);border-radius:14px;padding:16px;display:flex;flex-direction:column;overflow:hidden;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease;--brand: #5b8df7;--accent-cloud: #f59e0b;--accent-custom: #8b5cf6}.bcard:hover{transform:translateY(-2px);border-color:#ffffff24;box-shadow:0 12px 32px -10px #00000073,0 1px #ffffff0a inset}.bcard__accent{position:absolute;top:0;left:0;right:0;height:3px;background:var(--brand);opacity:.9}.bcard--cloud .bcard__accent{background:var(--accent-cloud)}.bcard--custom .bcard__accent{background:var(--accent-custom)}.bcard--online:before{content:"";position:absolute;bottom:-40%;right:-20%;width:140%;height:100%;background:radial-gradient(circle at center,rgba(91,141,247,.22) 0%,transparent 60%);pointer-events:none;opacity:.55}.bcard--cloud.bcard--online:before{background:radial-gradient(circle at center,rgba(245,158,11,.22) 0%,transparent 60%)}.bcard--custom.bcard--online:before{background:radial-gradient(circle at center,rgba(139,92,246,.22) 0%,transparent 60%)}.bcard__top{display:flex;align-items:center;justify-content:space-between;position:relative;z-index:5}.bcard__pill{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;background:#08090eb3;border:1px solid rgba(255,255,255,.07);border-radius:999px;color:#9ca3af}.bcard__pill svg{display:block}.bcard__dot{width:7px;height:7px;border-radius:50%;background:#6b7280;flex-shrink:0}.bcard__dot[data-tone=ok]{background:#34d399;box-shadow:0 0 0 2px #34d39940}.bcard__dot[data-tone=off]{background:#6b7280}.bcard__dot[data-tone=warn]{background:#fbbf24;box-shadow:0 0 0 2px #fbbf2440}.bcard__dot[data-tone=err]{background:#f87171;box-shadow:0 0 0 2px #f8717140}.bcard__badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;background:var(--accent-soft);color:var(--accent-text);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.5px}.bcard__body{flex:1;display:flex;flex-direction:column;gap:4px;padding-top:12px;padding-bottom:12px;position:relative;z-index:1;min-width:0}.bcard__name{margin:0;font-size:17px;font-weight:700;color:#e5e7eb;letter-spacing:-.015em;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bcard__host{font-family:var(--mono);font-size:11px;color:#9ca3af;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bcard__meta{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.bcard__chip{font-size:10.5px;color:#9ca3af;background:#ffffff08;border:1px solid rgba(255,255,255,.06);padding:2px 7px;border-radius:999px}.bcard__cta{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;gap:8px;width:100%;height:38px;border:1px solid var(--line);border-radius:9px;background:#ffffff0d;color:var(--text);font-size:13px;font-weight:600;letter-spacing:.1px;cursor:pointer;transition:transform 80ms ease,background .14s ease,border-color .14s ease,color .14s ease;box-shadow:none}.bcard--cloud .bcard__cta,.bcard--custom .bcard__cta{background:#ffffff0d;box-shadow:none}.bcard__cta:hover{background:var(--accent-soft);border-color:var(--accent-line);color:var(--accent-text)}.bcard__cta:active{transform:translateY(1px)}.bcard__cta:disabled{background:#ffffff08;color:#6b7280;cursor:not-allowed;box-shadow:none;border:1px solid rgba(255,255,255,.06)}.empty{font-size:12.5px;color:#6b7280;padding:14px 16px;background:#ffffff05;border:1px dashed rgba(255,255,255,.08);border-radius:10px}.bcard__menuwrap{position:relative}.bcard__kebab{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid transparent;border-radius:8px;background:transparent;color:#8b949e;cursor:pointer;transition:.15s}.bcard__kebab:hover:not(:disabled){color:#e6edf3;background:#ffffff0f;border-color:#ffffff1f}.bcard__kebab:disabled{opacity:.5;cursor:default}.bcard__kebab.has-dot{color:#e6edf3}.bcard__kebab.has-dot:after{content:"";position:absolute;top:3px;right:3px;width:7px;height:7px;border-radius:50%;background:#f59e0b;box-shadow:0 0 0 2px #0f1115}.bcard__menu{position:absolute;top:32px;right:0;z-index:20;min-width:150px;padding:5px;background:#1b2027;border:1px solid rgba(255,255,255,.12);border-radius:10px;box-shadow:0 10px 30px #00000073;display:flex;flex-direction:column;gap:2px}.bcard__menu-item{text-align:left;width:100%;border:none;background:transparent;color:#d1d5db;border-radius:7px;padding:7px 10px;font-size:12.5px;cursor:pointer;transition:.12s}.bcard__menu-item:hover{background:#ffffff12;color:#fff}.bcard__menu-item.is-accent{color:var(--accent-text);font-weight:600}.bcard__menu-item.is-accent:hover{background:var(--accent-soft);color:#c7dbff}.bcard__menu-item.is-danger{color:#f7a3a3}.bcard__menu-item.is-danger:hover{background:#ef444429;color:#fff}.bcard__menu--portal{z-index:9990}.bcard__menu--portal .bcard__menu-item{white-space:normal;word-break:break-word}.docker-setup{margin-bottom:14px;padding:14px 16px;background:linear-gradient(180deg,#5b8df714,#14182080);border:1px solid rgba(91,141,247,.22);border-radius:12px}.docker-setup__head{display:flex;flex-direction:column;gap:3px;margin-bottom:12px}.docker-setup__title{font-size:13.5px;font-weight:600;color:#e6edf3}.docker-setup__sub{font-size:11.5px;color:#9ca3af;line-height:1.5}.docker-setup__steps{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}.docker-step{display:flex;align-items:center;gap:8px;font-size:12px;color:#9ca3af}.docker-step__dot{width:8px;height:8px;border-radius:50%;flex:none;background:#3a4150;transition:.2s}.docker-step__label{color:#c7cdd6;min-width:96px}.docker-step__msg{color:#8b949e;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docker-step__pct{margin-left:auto;font-variant-numeric:tabular-nums;color:#5b8df7;flex:none}.docker-step.is-running .docker-step__dot{background:#5b8df7;box-shadow:0 0 0 3px #5b8df72e;animation:dpulse 1.2s ease-in-out infinite}.docker-step.is-running .docker-step__label{color:#e6edf3}.docker-step.is-done .docker-step__dot,.docker-step.is-skip .docker-step__dot{background:#10b981}.docker-step.is-skip{opacity:.7}.docker-step.is-retry .docker-step__dot{background:#f59e0b}.docker-step.is-error .docker-step__dot{background:#ef4444;box-shadow:0 0 0 3px #ef444426}.docker-step.is-error .docker-step__msg{color:#f7a3a3}@keyframes dpulse{0%,to{opacity:1}50%{opacity:.45}}.docker-setup__actions{display:flex;gap:8px;align-items:center}.docker-setup__actions .btn-primary{width:auto;padding:7px 16px;font-size:12.5px}.bcard__ver{font-size:11px;color:#8b949e;font-variant-numeric:tabular-nums}.bcard__chip--new{color:var(--accent-text);background:var(--accent-soft);border-color:var(--accent-line)}.bcard__opmsg{display:flex;align-items:center;gap:6px;margin-top:9px;font-size:11.5px;color:#9ca3af;word-break:break-word}.toast-host{position:fixed;right:16px;bottom:16px;z-index:9999;display:flex;flex-direction:column;gap:8px;max-width:min(360px,calc(100vw - 32px));pointer-events:none}.toast{pointer-events:auto;position:relative;display:flex;flex-direction:column;gap:6px;padding:10px 30px 10px 12px;font-size:12.5px;line-height:1.4;color:var(--text, #e6eaf0);background:#161a21f5;border:1px solid rgba(125,135,150,.22);border-left:3px solid var(--accent, #3b82f6);border-radius:10px;box-shadow:0 8px 28px #0000006b;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:toast-in .18s ease}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.toast[data-status=error]{border-left-color:#f87171}.toast[data-status=error] .toast__msg{color:#f87171}.toast[data-status=done]{border-left-color:#4ade80}.toast[data-status=done] .toast__msg{color:#4ade80}.toast__msg{word-break:break-word}.toast__x{position:absolute;top:6px;right:8px;background:none;border:none;cursor:pointer;padding:0;font-size:15px;line-height:1;color:var(--text-dim, #9da7b3)}.toast__x:hover{color:var(--text, #e6eaf0)}.toast__bar{display:block;height:4px;border-radius:2px;background:#7d879640;overflow:hidden}.toast__bar>span{display:block;height:100%;border-radius:2px;background:var(--accent, #3b82f6);transition:width .25s ease}.drawer-scrim{position:fixed;top:0;right:0;bottom:0;left:0;z-index:10000;display:flex;align-items:flex-end;justify-content:center;background:#06080c80;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:drawer-fade .18s ease}@keyframes drawer-fade{0%{opacity:0}to{opacity:1}}.drawer{width:min(560px,calc(100vw - 24px));max-height:76vh;display:flex;flex-direction:column;margin-bottom:12px;background:#14181ffa;border:1px solid rgba(125,135,150,.2);border-radius:16px 16px 12px 12px;box-shadow:0 -10px 44px #00000080;overflow:hidden;animation:drawer-up .24s cubic-bezier(.22,1,.36,1)}@keyframes drawer-up{0%{opacity:0;transform:translateY(28px)}to{opacity:1;transform:none}}.drawer__head{display:flex;align-items:center;justify-content:space-between;padding:14px 14px 12px 16px;border-bottom:1px solid rgba(125,135,150,.14)}.drawer__title{display:flex;align-items:center;gap:11px}.drawer__spark{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;font-size:14px;font-weight:700;background:#5b8df729;color:var(--brand, #5b8df7)}.drawer__spark--done{background:#4ade8029;color:#4ade80}.drawer__spark--error{background:#f8717129;color:#f87171}.drawer__h{font-size:13.5px;font-weight:650;color:var(--text, #e6eaf0)}.drawer__sub{font-size:11.5px;color:var(--text-dim, #9da7b3);margin-top:1px}.drawer__x{background:none;border:none;cursor:pointer;padding:2px 6px;font-size:19px;line-height:1;color:var(--text-dim, #9da7b3);border-radius:6px}.drawer__x:hover:not(:disabled){color:var(--text, #e6eaf0);background:#7d87961f}.drawer__x:disabled{opacity:.35;cursor:default}.drawer__steps{display:flex;align-items:center;gap:0;padding:14px 18px 4px}.drawer__step{display:flex;align-items:center;gap:7px;color:var(--text-dim, #9da7b3);font-size:12px}.drawer__step-dot{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:11px;font-weight:700;border:1.5px solid rgba(125,135,150,.35);color:var(--text-dim, #9da7b3);background:transparent;flex:none}.drawer__step-bar{width:30px;height:1.5px;background:#7d879640;margin:0 8px}.drawer__step.is-active .drawer__step-dot{border-color:var(--brand, #5b8df7);color:var(--brand, #5b8df7);box-shadow:0 0 0 3px #5b8df72e}.drawer__step.is-active .drawer__step-label{color:var(--text, #e6eaf0)}.drawer__step.is-done .drawer__step-dot{border-color:#4ade80;color:#06210f;background:#4ade80}.drawer__step.is-done .drawer__step-bar{background:#4ade8080}.drawer__step.is-error .drawer__step-dot{border-color:#f87171;color:#f87171}.drawer__log{flex:1;min-height:96px;overflow-y:auto;margin:10px 14px;padding:10px 12px;background:#0a0c10b3;border:1px solid rgba(125,135,150,.12);border-radius:10px;font-family:var(--mono);font-size:11.5px;line-height:1.7}.drawer__log--scroll{max-height:168px;scrollbar-width:thin;scrollbar-color:rgba(125,135,150,.4) transparent}.drawer__log--scroll::-webkit-scrollbar{width:7px}.drawer__log--scroll::-webkit-scrollbar-track{background:transparent;margin:4px 0}.drawer__log--scroll::-webkit-scrollbar-thumb{background:#7d879652;border-radius:6px;border:1.5px solid transparent;background-clip:padding-box}.drawer__log--scroll::-webkit-scrollbar-thumb:hover{background:#7d87968c;background-clip:padding-box}.drawer__now{display:flex;align-items:center;gap:9px;margin:12px 14px 2px;padding:9px 12px;background:#5b8df714;border:1px solid rgba(91,141,247,.2);border-radius:10px;font-size:12.5px;color:var(--text, #e6eaf0)}.drawer__now span{flex:1;min-width:0}.drawer__dlbars{display:flex;flex-direction:column;gap:10px;margin:12px 14px 2px}.dlbar{padding:10px 12px;border-radius:10px;background:#0a0c108c;border:1px solid rgba(125,135,150,.14)}.dlbar__head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:7px}.dlbar__name{font-size:12.5px;font-weight:600;color:var(--text, #e6eaf0)}.dlbar__pct{font-size:11px;color:var(--text-dim, #9da7b3);font-variant-numeric:tabular-nums}.dlbar__track{height:6px;border-radius:4px;background:#7d879629;overflow:hidden}.dlbar__fill{height:100%;border-radius:4px;background:linear-gradient(90deg,#5b8df7,#2496ed);transition:width .2s ease}.dlbar__fill.is-done{background:#4ade80}.dlbar__url{margin-top:6px;font-size:10.5px;color:#6b7686;font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dlbar__urlk{display:inline-block;min-width:16px;text-align:center;margin-right:5px;padding:0 4px;border-radius:4px;font-family:inherit;font-size:9.5px;color:#8fb0f5;background:#5b8df729}.drawer__headbtns{display:flex;align-items:center;gap:2px}.drawer-min{position:fixed;right:20px;bottom:20px;z-index:2001;display:inline-flex;align-items:center;gap:9px;padding:10px 15px;border-radius:999px;cursor:pointer;background:#16181d;border:1px solid rgba(125,135,150,.22);box-shadow:0 10px 30px #00000080;color:var(--text, #e6eaf0);font-size:12.5px;font-weight:550;animation:drawer-min-in .18s cubic-bezier(.2,.8,.2,1)}.drawer-min:hover{border-color:#7d879666;background:#1b1e24}@keyframes drawer-min-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.drawer-min__spark{display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;font-weight:700}.drawer-min--done .drawer-min__spark{color:#4ade80}.drawer-min--error .drawer-min__spark{color:#f87171}.drawer-min__label{font-variant-numeric:tabular-nums}.drawer__log-empty{color:var(--text-dim, #9da7b3)}.drawer__line{display:flex;align-items:baseline;gap:8px;padding:1px 0}.drawer__t{color:#6b7686;flex:none;font-variant-numeric:tabular-nums}.drawer__badge{flex:none;padding:0 6px;border-radius:4px;font-size:10px;font-weight:600;background:#5b8df729;color:#8fb0f5}.drawer__badge--swap{background:#f59e0b29;color:#f5b342}.drawer__badge--done{background:#4ade8029;color:#6ee79b}.drawer__linemsg{color:var(--text, #e6eaf0);word-break:break-word}.drawer__line[data-status=error] .drawer__linemsg{color:#f87171}.drawer__line[data-status=done] .drawer__linemsg{color:#6ee79b}.drawer__line[data-status=skip] .drawer__linemsg{color:var(--text-dim, #9da7b3)}.drawer__hint{margin:0 14px 8px;padding:8px 12px;background:#f59e0b1a;border:1px solid rgba(245,158,11,.28);border-radius:8px;color:#f5b342;font-size:11.5px;line-height:1.5}.drawer__foot{display:flex;align-items:center;gap:8px;padding:12px 14px;border-top:1px solid rgba(125,135,150,.14)}.drawer__foot-status{font-size:12.5px;color:var(--text-dim, #9da7b3);margin-right:auto}.drawer__foot-status.is-error{color:#f87171}.drawer__foot-status.is-done{color:#4ade80}.drawer__foot-status.is-reboot,.drawer__spark--reboot,.drawer-min--reboot .drawer-min__spark{color:#f5b342}.drawer__btn{padding:7px 16px;border-radius:8px;cursor:pointer;font-size:12.5px;font-weight:550;background:#7d879624;border:1px solid rgba(125,135,150,.2);color:var(--text, #e6eaf0)}.drawer__btn:hover{background:#7d879638}.drawer__btn.is-accent{background:var(--brand, #5b8df7);border-color:var(--brand, #5b8df7);color:#fff}.drawer__btn.is-accent:hover{filter:brightness(1.08)}.mitm-card{border:1px solid rgba(125,135,150,.22);border-radius:12px;padding:14px 16px;margin-bottom:14px;background:#1e242e66}.mitm-card--on{border-color:#4ade8059;background:#16281e66}.mitm-pill{position:fixed;top:64px;right:16px;z-index:9998;-webkit-app-region:no-drag;display:inline-flex;align-items:center;gap:8px;padding:4px 6px 4px 11px;border-radius:999px;width:fit-content;max-width:calc(100vw - 32px);background:#141e18d9;border:1px solid rgba(74,222,128,.3);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 4px 14px #0000004d;font-size:12px;line-height:1}.mitm-pill__dot{width:7px;height:7px;border-radius:50%;flex:none;background:#4ade80;box-shadow:0 0 0 3px #4ade8029}.mitm-pill__dot[data-busy="1"]{background:#9da7b3;box-shadow:0 0 0 3px #9da7b329}.mitm-pill__text{color:var(--text-dim, #9da7b3);white-space:nowrap}.mitm-pill__off{background:none;border:none;cursor:pointer;color:#6b7686;font-size:11.5px;padding:3px 7px;border-radius:999px}.mitm-pill__off:hover{color:#f87171;background:#f871711a}.mitm-card__head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.mitm-card__dot{width:8px;height:8px;border-radius:50%;background:#9da7b3;flex:0 0 auto}.mitm-card__dot[data-state=on]{background:#4ade80;box-shadow:0 0 6px #4ade8099}.mitm-card__dot[data-state=warn]{background:#fbbf24}.mitm-card__dot[data-state=off]{background:#60a5fa}.mitm-card__title{font-size:14px;font-weight:600;color:var(--text, #e6edf3)}.mitm-card__desc{font-size:12.5px;line-height:1.5;color:var(--text-dim, #9da7b3);margin:0 0 10px}.mitm-card__note{color:#fbbf24}.mitm-card__error{font-size:12px;color:#f87171;margin-bottom:8px}.mitm-card__actions{display:flex;gap:8px}.mitm-card__btn{font-size:13px;padding:7px 16px;border-radius:8px;border:none;cursor:pointer;background:var(--accent, #3b82f6);color:#fff;font-weight:500}.mitm-card__btn:disabled{opacity:.6;cursor:default}.mitm-card__btn--ghost{background:transparent;border:1px solid rgba(125,135,150,.35);color:var(--text-dim, #9da7b3)}.mitm-card__sub{color:var(--text-dim, #9da7b3);opacity:.8;font-size:11.5px}.terms-gate{display:flex;align-items:center;justify-content:center;padding:24px}.terms-gate__panel,.terms-gate__panel *{-webkit-app-region:no-drag}.terms-gate__panel{position:relative;z-index:1;width:min(680px,94vw);max-height:90vh;display:flex;flex-direction:column;background:#141921eb;border:1px solid rgba(125,135,150,.22);border-radius:16px;padding:28px 30px;box-shadow:0 24px 60px #00000080}.terms-gate__title{font-size:20px;font-weight:700;margin:0 0 4px;color:var(--text, #e6edf3)}.terms-gate__subtitle{font-size:13px;color:var(--text-dim, #9da7b3);margin:0 0 16px}.terms-gate__body{overflow-y:auto;flex:1 1 auto;min-height:0;padding-right:10px;border-top:1px solid rgba(125,135,150,.15);border-bottom:1px solid rgba(125,135,150,.15);padding-top:14px;padding-bottom:14px;overscroll-behavior:contain}.terms-gate__body{scrollbar-width:thin;scrollbar-color:rgba(125,135,150,.35) transparent}.terms-gate__body::-webkit-scrollbar{width:8px}.terms-gate__body::-webkit-scrollbar-track{background:transparent}.terms-gate__body::-webkit-scrollbar-thumb{background:#7d87964d;border-radius:8px;border:2px solid transparent;background-clip:padding-box}.terms-gate__body::-webkit-scrollbar-thumb:hover{background:#7d87968c;background-clip:padding-box;border:2px solid transparent}.terms-gate--review{padding:24px}.terms-gate--review .glow{display:none}.terms-gate--review .terms-gate__panel{width:min(640px,92vw);max-height:min(82vh,760px);background:#12161efa;box-shadow:0 28px 80px #0009;animation:terms-pop .16s ease}@keyframes terms-pop{0%{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:none}}.terms-md{font-size:13px;line-height:1.65;color:var(--text-dim, #c2cbd6);word-break:break-word}.terms-md>:first-child{margin-top:0}.terms-md h1{font-size:17px;font-weight:700;color:var(--text, #e6edf3);margin:0 0 6px}.terms-md h2{font-size:15px;font-weight:700;color:var(--text, #e6edf3);margin:22px 0 8px;padding-top:14px;border-top:1px solid rgba(125,135,150,.12)}.terms-md h3{font-size:13.5px;font-weight:600;color:var(--text, #e6edf3);margin:16px 0 6px}.terms-md p{margin:8px 0}.terms-md strong{color:var(--text, #e6edf3);font-weight:600}.terms-md code{font-family:var(--mono);font-size:12px;background:#7d879629;padding:1px 5px;border-radius:4px;color:#d7dee8}.terms-md ul,.terms-md ol{margin:8px 0;padding-left:22px}.terms-md li{margin:4px 0}.terms-md hr{border:none;border-top:1px solid rgba(125,135,150,.14);margin:18px 0}.terms-md blockquote{margin:10px 0;padding:8px 14px;border-left:3px solid rgba(91,141,247,.55);background:#5b8df712;border-radius:0 8px 8px 0;color:var(--text-dim, #b9c2cf)}.terms-md table{width:100%;border-collapse:collapse;margin:10px 0;font-size:12px;display:block;overflow-x:auto}.terms-md th,.terms-md td{border:1px solid rgba(125,135,150,.18);padding:7px 10px;text-align:left;vertical-align:top}.terms-md th{background:#7d87961a;color:var(--text, #e6edf3);font-weight:600;white-space:nowrap}.terms-gate__scrollhint{font-size:12px;color:#fbbf24;text-align:center;margin:12px 0 0}.terms-gate__actions{display:flex;gap:12px;justify-content:flex-end;margin-top:18px}.terms-gate__btn{font-size:14px;padding:10px 22px;border-radius:9px;border:none;cursor:pointer;background:var(--accent, #3b82f6);color:#fff;font-weight:600}.terms-gate__btn:disabled{opacity:.45;cursor:not-allowed}.terms-gate__btn--ghost{background:transparent;border:1px solid rgba(125,135,150,.35);color:var(--text-dim, #9da7b3);font-weight:500}
|
|
1
|
+
@font-face{font-family:Noto Sans Mono CJK SC;src:url(./NotoMonoSC-Regular-CYHoGOBB.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}:root{--mono: "Noto Sans Mono CJK SC", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace}:root{--accent: #5b8df7;--accent-soft: rgba(91,141,247,.16);--accent-line: rgba(91,141,247,.32);--accent-text: #a5c4ff;--ok: #4ade80;--danger: #f7a3a3;--text: #e5e7eb;--text-dim: #9da7b3;--text-mute: #6b7280;--line: rgba(255,255,255,.08)}*{box-sizing:border-box}html,body,#root{margin:0;height:100%}html,body{overflow:hidden}body{font-family:-apple-system,BlinkMacSystemFont,PingFang SC,Segoe UI,Roboto,Helvetica Neue,sans-serif;background:#07080c;color:#e5e7eb;-webkit-font-smoothing:antialiased}.shell{position:relative;min-height:100vh;display:flex;align-items:center;justify-content:center;overflow:hidden;-webkit-app-region:drag}.shell--app{align-items:stretch;justify-content:stretch;flex-direction:row;background:linear-gradient(180deg,#0b0d13,#07080c);overflow:hidden;-webkit-app-region:no-drag}.shell__left{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;overflow:hidden}.helper-aside{flex:0 0 auto;position:relative;background:#0f1115;border-left:1px solid rgba(255,255,255,.06);display:flex;flex-direction:column;min-width:320px;z-index:1}.helper-aside,.helper-aside *,.shell--app .main{-webkit-app-region:no-drag}.shell--app .topbar{-webkit-app-region:drag}.shell--app .topbar .user-chip,.shell--app .topbar .user-chip *,.shell--app .topbar .btn-ghost{-webkit-app-region:no-drag}.glow{position:absolute;top:-40%;right:-40%;bottom:-40%;left:-40%;z-index:0;pointer-events:none;background:radial-gradient(closest-side,rgba(91,141,247,.2),transparent 60%),radial-gradient(closest-side at 30% 70%,rgba(167,139,250,.13),transparent 65%);filter:blur(30px)}.card{-webkit-app-region:no-drag;position:relative;z-index:1;width:380px;padding:36px 36px 28px;background:linear-gradient(180deg,#141820d9,#0d1016d9);border:1px solid rgba(255,255,255,.06);border-radius:16px;box-shadow:0 1px #ffffff0a inset,0 30px 60px #0006;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);display:flex;flex-direction:column;align-items:center;gap:18px}.brand{display:flex;align-items:center;gap:12px;align-self:stretch}.brand-mark{width:40px;height:40px;border-radius:12px;display:grid;place-items:center;background:linear-gradient(135deg,#5b8df7,#a78bfa);box-shadow:0 8px 20px #5b8df759}.brand-mark.sm{width:28px;height:28px;border-radius:8px;box-shadow:none}.brand-mark.sm svg{width:16px;height:16px}.brand-text{line-height:1.2}.brand-name{font-weight:600;font-size:15px}.brand-sub{font-size:12px;color:#9ca3af;margin-top:2px}.tagline{margin:4px 0 0;color:#c7cdd6;font-size:13.5px;text-align:center;line-height:1.55}.btn-primary{-webkit-app-region:no-drag;margin-top:4px;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:42px;display:inline-flex;align-items:center;justify-content:center;gap:8px;background:linear-gradient(180deg,#5b8df7,#4570d8);color:#fff;border:0;border-radius:10px;font-size:14px;font-weight:500;letter-spacing:.2px;cursor:pointer;box-shadow:0 1px #ffffff2e inset,0 -1px #0000002e inset,0 10px 22px #5b8df747;transition:transform 80ms ease,filter .12s ease}.btn-primary:hover{filter:brightness(1.08)}.btn-primary:active{transform:translateY(1px)}.btn-primary:disabled{filter:grayscale(.4) brightness(.7);cursor:default}.btn-ghost{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;color:#9ca3af;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:6px 14px;font-size:12.5px;cursor:pointer;transition:color .12s ease,border-color .12s ease,background .12s ease}.btn-ghost.sm{padding:4px 10px;font-size:11.5px}.btn-ghost:hover{color:#e5e7eb;background:#ffffff0a;border-color:#ffffff24}.btn-ghost:disabled{opacity:.4;cursor:default}.login-divider{display:flex;align-items:center;gap:10px;margin:4px 0;color:#6b7280;font-size:11.5px}.login-divider:before,.login-divider:after{content:"";flex:1;height:1px;background:#ffffff14}.login-email-input{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;box-sizing:border-box;background:#ffffff08;color:#e5e7eb;border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:8px 12px;font-size:13px;transition:border-color .12s ease,background .12s ease}.login-email-input::placeholder{color:#6b7280}.login-email-input:focus{outline:none;border-color:#6366f18c;background:#ffffff0d}.hint{margin:0;font-size:11.5px;color:#6b7280}.spinner-row{display:inline-flex;align-items:center;gap:8px;color:#c7cdd6;font-size:13px}.spin{animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.error{width:100%;font-size:12px;color:#fca5a5;background:#ef444414;border:1px solid rgba(239,68,68,.18);padding:8px 12px;border-radius:8px;text-align:center;line-height:1.5}.topbar{-webkit-app-region:drag;position:relative;flex:0 0 auto;z-index:10;display:flex;align-items:center;justify-content:space-between;padding:14px 24px 12px;background:#08090e99;border-bottom:1px solid rgba(255,255,255,.05);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}[data-platform=darwin][data-fullscreen="0"] .topbar{padding-top:34px}.brand-mini{display:inline-flex;align-items:center;gap:10px}.brand-mini .brand-name{font-size:14px}.user-chip{-webkit-app-region:no-drag;display:inline-flex;align-items:center;gap:10px}.welcome{font-size:12px;color:var(--text-dim);padding:4px 10px;border-radius:999px;background:#ffffff0d;border:1px solid var(--line);animation:fadein .2s ease}@keyframes fadein{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:none}}.avatar{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(135deg,#5b8df7,#a78bfa);font-size:12px;font-weight:600;color:#fff}.user-name{font-size:13px;color:#c7cdd6}.user-chip{position:relative}.user-chip__trigger{-webkit-app-region:no-drag;display:inline-flex;align-items:center;gap:8px;border:1px solid transparent;background:transparent;border-radius:999px;padding:3px 8px 3px 3px;cursor:pointer;transition:.12s}.user-chip__trigger:hover,.user-chip__trigger.is-open{background:#ffffff0f;border-color:#ffffff1f}.user-chip__caret{font-size:10px;color:#8a93a3;transition:transform .12s}.user-chip__trigger.is-open .user-chip__caret{transform:rotate(180deg)}.user-chip__menu{position:absolute;top:38px;right:0;z-index:30;min-width:200px;padding:6px;background:#1b2027;border:1px solid rgba(255,255,255,.12);border-radius:12px;box-shadow:0 12px 34px #00000080;display:flex;flex-direction:column;gap:2px;animation:fadein .14s ease}.user-chip__menu-item{text-align:left;width:100%;border:none;background:transparent;color:#d1d5db;border-radius:8px;padding:9px 11px;font-size:13px;cursor:pointer;transition:.12s}.user-chip__menu-item:hover{background:#ffffff12;color:#fff}.user-chip__menu-item.is-danger{color:#f7a3a3}.user-chip__menu-item.is-danger:hover{background:#ef444429;color:#fff}.user-chip__menu-sep{height:1px;margin:4px 2px;background:#ffffff14}.user-chip__menu-version{margin-top:4px;padding:8px 11px 4px;font-size:11px;color:#6b7280;text-align:center;font-variant-numeric:tabular-nums;-webkit-user-select:text;user-select:text;border-top:1px solid rgba(255,255,255,.06)}.user-chip__mitm-row{display:flex;align-items:center;justify-content:space-between;gap:10px;cursor:default}.user-chip__mitm-row:hover{background:transparent}.user-chip__mitm-label{font-size:13px;color:var(--text)}.mini-switch{-webkit-app-region:no-drag;position:relative;flex:0 0 auto;width:36px;height:20px;padding:0;border-radius:999px;border:1px solid var(--line);background:#ffffff14;cursor:pointer;transition:background .16s ease,border-color .16s ease}.mini-switch.is-on{background:var(--accent);border-color:var(--accent)}.mini-switch.is-busy{opacity:.6;cursor:default}.mini-switch:disabled{cursor:default}.mini-switch__knob{position:absolute;top:1px;left:1px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #00000073;transition:transform .16s ease}.mini-switch.is-on .mini-switch__knob{transform:translate(16px)}.mini-switch.is-busy .mini-switch__knob{animation:spin 1s linear infinite}.user-chip__mitm-note{margin:0 4px;padding:2px 4px 6px;font-size:11px;color:var(--text-mute)}.user-chip__mitm-err{margin:2px 4px 6px;padding:5px 8px;font-size:11px;color:var(--danger);background:#ef44441a;border-radius:6px;line-height:1.4}.bcard__top-right{display:inline-flex;align-items:center;gap:6px}.bcard__billing-btn{-webkit-app-region:no-drag;border:1px solid var(--line);background:transparent;color:var(--text-dim);border-radius:7px;padding:3px 9px;font-size:11px;cursor:pointer;transition:color .12s,border-color .12s,background .12s}.bcard__billing-btn:hover{color:var(--accent-text);border-color:var(--accent-line);background:var(--accent-soft)}.glow--app{inset:-10% -10% auto -10%;height:50vh;background:radial-gradient(closest-side at 75% 0%,rgba(91,141,247,.18),transparent 65%),radial-gradient(closest-side at 20% 10%,rgba(167,139,250,.1),transparent 60%);filter:blur(40px)}.main{position:relative;z-index:1;padding:22px 32px 48px;width:100%;display:flex;flex-direction:column;gap:16px;flex:1 1 auto;min-height:0;overflow-y:auto}.main::-webkit-scrollbar{width:8px}.main::-webkit-scrollbar-track{background:transparent}.main::-webkit-scrollbar-thumb{background:#7d87964d;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.main::-webkit-scrollbar-thumb:hover{background-color:#7d87968c}.app__tabs{display:inline-flex;align-items:center;gap:4px;padding:4px;background:#1418208c;border:1px solid rgba(255,255,255,.06);border-radius:10px;align-self:flex-start;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.app__tab{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;color:#9ca3af;border:0;border-radius:7px;padding:6px 14px;font-size:12.5px;font-weight:500;letter-spacing:.15px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:color .12s ease,background .12s ease}.app__tab:hover{color:#e5e7eb;background:#ffffff0a}.app__tab.is-active{color:#fff;background:#5b8df72e;box-shadow:0 0 0 1px #5b8df74d inset}.app__tab-count{font-size:10.5px;color:#9ca3af;background:#ffffff0f;padding:1px 6px;border-radius:999px;min-width:18px;text-align:center}.app__tab.is-active .app__tab-count{background:#5b8df74d;color:#fff}.app__tabsrow{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%}.app__add-team{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;flex:none;color:#5b8df7;font-weight:600;font-size:12.5px;background:#5b8df71a;border:1px solid rgba(91,141,247,.35);border-radius:9px;padding:7px 14px;transition:color .12s ease,background .12s ease,border-color .12s ease}.app__add-team:hover{color:#fff;background:#5b8df738;border-color:#5b8df7a6}.app__grid{display:grid;grid-template-columns:repeat(auto-fill,200px);gap:14px}.add-card{-webkit-app-region:no-drag;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:200px;height:200px;background:transparent;border:1.5px dashed rgba(255,255,255,.12);border-radius:14px;color:#9ca3af;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;transition:border-color .16s ease,color .16s ease,background .16s ease}.add-card:hover{border-color:#5b8df780;color:#e5e7eb;background:#5b8df70d}.add-card__plus{width:36px;height:36px;border-radius:50%;display:grid;place-items:center;background:#ffffff0a;font-size:22px;font-weight:300;color:inherit}.add-card__label{font-size:13px;font-weight:500}.bcard--helper{background:linear-gradient(160deg,#5b8df729,#a78bfa24 60%,#1418208c);border-color:#a78bfa40}.bcard--helper .bcard__accent{background:linear-gradient(90deg,#5b8df7,#a78bfa);opacity:1}.bcard--helper:hover{border-color:#a78bfa73}.bcard__pill--helper{background:#a78bfa2e;border-color:#a78bfa4d;color:#c4b5fd;font-size:11px;font-weight:600;letter-spacing:.2px}.bcard__helper-icon{font-size:12px;filter:grayscale(.2)}.bcard__badge--free{background:#34d39926;color:#34d399;border:1px solid rgba(52,211,153,.3)}.bcard__badge--trial{background:#ffffff0f;color:var(--text-dim);border:1px solid var(--line);font-size:9.5px;letter-spacing:.3px;padding:2px 7px}.bcard__badge--local{background:#5b8df72e;color:#a5c4ff;border:1px solid rgba(91,141,247,.35);font-size:9.5px;letter-spacing:.3px;padding:2px 7px}.bcard--helper .bcard__name{color:#f3f4f6}.bcard__desc{margin:4px 0 0;font-size:11.5px;line-height:1.5;color:#c7cdd6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.bcard__fineprint{margin:4px 0 0;font-size:10.5px;color:#9ca3af;opacity:.8}.bcard__cta--helper{background:#ffffff0d;box-shadow:none}.bcard__cta--helper:hover{background:var(--accent-soft)}.helper-aside__top{display:flex;align-items:center;justify-content:space-between;padding:12px 14px 10px;border-bottom:1px solid rgba(255,255,255,.05)}.helper-aside__title{font-size:12.5px;font-weight:600;color:#c7cdd6}.helper-aside__close{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:#6b7280;font-size:20px;line-height:1;width:26px;height:26px;border-radius:6px;cursor:pointer;transition:color .12s ease,background .12s ease}.helper-aside__close:hover{color:#e5e7eb;background:#ffffff0f}.helper-modal__backdrop{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:transparent;z-index:20;animation:fadein .14s ease;padding:16px;pointer-events:auto}.helper-modal{width:min(360px,100%);background:linear-gradient(180deg,#1f2733,#1a2029);border:1px solid rgba(255,255,255,.1);border-radius:12px;padding:20px 22px 16px;color:#e5e7eb;box-shadow:0 24px 48px -12px #0009,0 1px #ffffff14 inset;animation:fadein .18s ease}.helper-modal__title{font-size:14px;font-weight:600;color:#f3f4f6;margin-bottom:8px}.helper-modal__desc{font-size:12.5px;line-height:1.6;color:#b6bcc6;margin-bottom:18px}.helper-modal__desc code{font-family:var(--mono);font-size:11.5px;padding:1px 6px;background:#ffffff14;border:1px solid rgba(255,255,255,.08);border-radius:4px;color:#e7eaef}.helper-modal__actions{display:flex;align-items:center;justify-content:flex-end;gap:8px}.helper-modal__btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#ffffff0f;color:#d2d6dd;border:1px solid rgba(255,255,255,.1);border-radius:7px;padding:7px 14px;font-size:12.5px;font-weight:500;cursor:pointer;transition:background .12s ease,color .12s ease,transform 80ms ease}.helper-modal__btn:hover{background:#ffffff1a;color:#fff}.helper-modal__btn:active{transform:translateY(1px)}.helper-modal__btn--ghost{background:transparent;border-color:transparent;color:#ffffff8c;margin-right:auto;padding-left:4px;padding-right:4px}.helper-modal__btn--ghost:hover{background:transparent;color:#ffffffd9}.helper-modal__btn--primary{background:linear-gradient(180deg,#5b8df7,#4570d8);border-color:#ffffff2e;color:#fff}.helper-modal__btn--primary:hover{background:linear-gradient(180deg,#6c9af9,#5a82e0)}.helper-modal__btn:disabled{filter:grayscale(.4) brightness(.7);cursor:default}.helper-placeholder{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:32px 40px;text-align:center;color:#9ca3af}.helper-placeholder__mark{font-size:48px;line-height:1;filter:grayscale(.2);opacity:.85}.helper-placeholder__title{margin:0;font-size:16px;font-weight:600;color:#e5e7eb}.helper-placeholder__sub{margin:0;font-size:12.5px;line-height:1.6;color:#9ca3af;max-width:320px}.helper-placeholder__note{margin-top:8px;font-size:11px;color:#6b7280;padding:4px 10px;background:#ffffff08;border:1px solid rgba(255,255,255,.06);border-radius:999px}.helper-placeholder__note code{font-family:var(--mono);font-size:11px;color:#c7cdd6}.section{background:linear-gradient(180deg,#141820b8,#0d1016b8);border:1px solid rgba(255,255,255,.06);border-radius:14px;box-shadow:0 1px #ffffff0a inset,0 14px 30px #00000052;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);padding:18px 18px 16px}.section-head{display:flex;align-items:center;gap:8px;padding:0 4px 14px;border-bottom:1px solid rgba(255,255,255,.04);margin-bottom:14px}.section-icon{font-size:14px;opacity:.8}.section-head h2{margin:0;font-size:13.5px;font-weight:600;color:#e5e7eb;letter-spacing:.2px}.section-sub{font-size:12px;color:#6b7280}.section-body{display:flex;flex-direction:column;gap:10px}.grid{display:grid;grid-template-columns:repeat(auto-fill,200px);gap:14px}.bcard{position:relative;width:200px;height:200px;background:#1418208c;border:1px solid rgba(255,255,255,.07);border-radius:14px;padding:16px;display:flex;flex-direction:column;overflow:hidden;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease;--brand: #5b8df7;--accent-cloud: #f59e0b;--accent-custom: #8b5cf6}.bcard:hover{transform:translateY(-2px);border-color:#ffffff24;box-shadow:0 12px 32px -10px #00000073,0 1px #ffffff0a inset}.bcard__accent{position:absolute;top:0;left:0;right:0;height:3px;background:var(--brand);opacity:.9}.bcard--cloud .bcard__accent{background:var(--accent-cloud)}.bcard--custom .bcard__accent{background:var(--accent-custom)}.bcard--online:before{content:"";position:absolute;bottom:-40%;right:-20%;width:140%;height:100%;background:radial-gradient(circle at center,rgba(91,141,247,.22) 0%,transparent 60%);pointer-events:none;opacity:.55}.bcard--cloud.bcard--online:before{background:radial-gradient(circle at center,rgba(245,158,11,.22) 0%,transparent 60%)}.bcard--custom.bcard--online:before{background:radial-gradient(circle at center,rgba(139,92,246,.22) 0%,transparent 60%)}.bcard__top{display:flex;align-items:center;justify-content:space-between;position:relative;z-index:5}.bcard__pill{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;background:#08090eb3;border:1px solid rgba(255,255,255,.07);border-radius:999px;color:#9ca3af}.bcard__pill svg{display:block}.bcard__dot{width:7px;height:7px;border-radius:50%;background:#6b7280;flex-shrink:0}.bcard__dot[data-tone=ok]{background:#34d399;box-shadow:0 0 0 2px #34d39940}.bcard__dot[data-tone=off]{background:#6b7280}.bcard__dot[data-tone=warn]{background:#fbbf24;box-shadow:0 0 0 2px #fbbf2440}.bcard__dot[data-tone=err]{background:#f87171;box-shadow:0 0 0 2px #f8717140}.bcard__badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;background:var(--accent-soft);color:var(--accent-text);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.5px}.bcard__body{flex:1;display:flex;flex-direction:column;gap:4px;padding-top:12px;padding-bottom:12px;position:relative;z-index:1;min-width:0}.bcard__name{margin:0;font-size:17px;font-weight:700;color:#e5e7eb;letter-spacing:-.015em;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bcard__host{font-family:var(--mono);font-size:11px;color:#9ca3af;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bcard__meta{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.bcard__chip{font-size:10.5px;color:#9ca3af;background:#ffffff08;border:1px solid rgba(255,255,255,.06);padding:2px 7px;border-radius:999px}.bcard__cta{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;gap:8px;width:100%;height:38px;border:1px solid var(--line);border-radius:9px;background:#ffffff0d;color:var(--text);font-size:13px;font-weight:600;letter-spacing:.1px;cursor:pointer;transition:transform 80ms ease,background .14s ease,border-color .14s ease,color .14s ease;box-shadow:none}.bcard--cloud .bcard__cta,.bcard--custom .bcard__cta{background:#ffffff0d;box-shadow:none}.bcard__cta:hover{background:var(--accent-soft);border-color:var(--accent-line);color:var(--accent-text)}.bcard__cta:active{transform:translateY(1px)}.bcard__cta:disabled{background:#ffffff08;color:#6b7280;cursor:not-allowed;box-shadow:none;border:1px solid rgba(255,255,255,.06)}.empty{font-size:12.5px;color:#6b7280;padding:14px 16px;background:#ffffff05;border:1px dashed rgba(255,255,255,.08);border-radius:10px}.bcard__menuwrap{position:relative}.bcard__kebab{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid transparent;border-radius:8px;background:transparent;color:#8b949e;cursor:pointer;transition:.15s}.bcard__kebab:hover:not(:disabled){color:#e6edf3;background:#ffffff0f;border-color:#ffffff1f}.bcard__kebab:disabled{opacity:.5;cursor:default}.bcard__kebab.has-dot{color:#e6edf3}.bcard__kebab.has-dot:after{content:"";position:absolute;top:3px;right:3px;width:7px;height:7px;border-radius:50%;background:#f59e0b;box-shadow:0 0 0 2px #0f1115}.bcard__menu{position:absolute;top:32px;right:0;z-index:20;min-width:150px;padding:5px;background:#1b2027;border:1px solid rgba(255,255,255,.12);border-radius:10px;box-shadow:0 10px 30px #00000073;display:flex;flex-direction:column;gap:2px}.bcard__menu-item{text-align:left;width:100%;border:none;background:transparent;color:#d1d5db;border-radius:7px;padding:7px 10px;font-size:12.5px;cursor:pointer;transition:.12s}.bcard__menu-item:hover{background:#ffffff12;color:#fff}.bcard__menu-item.is-accent{color:var(--accent-text);font-weight:600}.bcard__menu-item.is-accent:hover{background:var(--accent-soft);color:#c7dbff}.bcard__menu-item.is-danger{color:#f7a3a3}.bcard__menu-item.is-danger:hover{background:#ef444429;color:#fff}.bcard__menu-sep{display:flex;align-items:center;gap:8px;margin:5px 0 2px;padding:0 12px;font-size:10.5px;letter-spacing:.04em;text-transform:uppercase;color:#6b7280;-webkit-user-select:none;user-select:none}.bcard__menu-sep:after{content:"";flex:1;height:1px;background:#ffffff14}.bcard__menu--portal{z-index:9990}.bcard__menu--portal .bcard__menu-item{white-space:normal;word-break:break-word}.docker-setup{margin-bottom:14px;padding:14px 16px;background:linear-gradient(180deg,#5b8df714,#14182080);border:1px solid rgba(91,141,247,.22);border-radius:12px}.docker-setup__head{display:flex;flex-direction:column;gap:3px;margin-bottom:12px}.docker-setup__title{font-size:13.5px;font-weight:600;color:#e6edf3}.docker-setup__sub{font-size:11.5px;color:#9ca3af;line-height:1.5}.docker-setup__steps{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}.docker-step{display:flex;align-items:center;gap:8px;font-size:12px;color:#9ca3af}.docker-step__dot{width:8px;height:8px;border-radius:50%;flex:none;background:#3a4150;transition:.2s}.docker-step__label{color:#c7cdd6;min-width:96px}.docker-step__msg{color:#8b949e;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docker-step__pct{margin-left:auto;font-variant-numeric:tabular-nums;color:#5b8df7;flex:none}.docker-step.is-running .docker-step__dot{background:#5b8df7;box-shadow:0 0 0 3px #5b8df72e;animation:dpulse 1.2s ease-in-out infinite}.docker-step.is-running .docker-step__label{color:#e6edf3}.docker-step.is-done .docker-step__dot,.docker-step.is-skip .docker-step__dot{background:#10b981}.docker-step.is-skip{opacity:.7}.docker-step.is-retry .docker-step__dot{background:#f59e0b}.docker-step.is-error .docker-step__dot{background:#ef4444;box-shadow:0 0 0 3px #ef444426}.docker-step.is-error .docker-step__msg{color:#f7a3a3}@keyframes dpulse{0%,to{opacity:1}50%{opacity:.45}}.docker-setup__actions{display:flex;gap:8px;align-items:center}.docker-setup__actions .btn-primary{width:auto;padding:7px 16px;font-size:12.5px}.bcard__ver{font-size:11px;color:#8b949e;font-variant-numeric:tabular-nums}.bcard__chip--new{color:var(--accent-text);background:var(--accent-soft);border-color:var(--accent-line)}.bcard__opmsg{display:flex;align-items:center;gap:6px;margin-top:9px;font-size:11.5px;color:#9ca3af;word-break:break-word}.toast-host{position:fixed;right:16px;bottom:16px;z-index:9999;display:flex;flex-direction:column;gap:8px;max-width:min(360px,calc(100vw - 32px));pointer-events:none}.toast{pointer-events:auto;position:relative;display:flex;flex-direction:column;gap:6px;padding:10px 30px 10px 12px;font-size:12.5px;line-height:1.4;color:var(--text, #e6eaf0);background:#161a21f5;border:1px solid rgba(125,135,150,.22);border-left:3px solid var(--accent, #3b82f6);border-radius:10px;box-shadow:0 8px 28px #0000006b;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:toast-in .18s ease}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.toast[data-status=error]{border-left-color:#f87171}.toast[data-status=error] .toast__msg{color:#f87171}.toast[data-status=done]{border-left-color:#4ade80}.toast[data-status=done] .toast__msg{color:#4ade80}.toast__msg{word-break:break-word}.toast__x{position:absolute;top:6px;right:8px;background:none;border:none;cursor:pointer;padding:0;font-size:15px;line-height:1;color:var(--text-dim, #9da7b3)}.toast__x:hover{color:var(--text, #e6eaf0)}.toast__bar{display:block;height:4px;border-radius:2px;background:#7d879640;overflow:hidden}.toast__bar>span{display:block;height:100%;border-radius:2px;background:var(--accent, #3b82f6);transition:width .25s ease}.drawer-scrim{position:fixed;top:0;right:0;bottom:0;left:0;z-index:10000;display:flex;align-items:flex-end;justify-content:center;background:#06080c80;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:drawer-fade .18s ease}@keyframes drawer-fade{0%{opacity:0}to{opacity:1}}.drawer{width:min(560px,calc(100vw - 24px));max-height:76vh;display:flex;flex-direction:column;margin-bottom:12px;background:#14181ffa;border:1px solid rgba(125,135,150,.2);border-radius:16px 16px 12px 12px;box-shadow:0 -10px 44px #00000080;overflow:hidden;animation:drawer-up .24s cubic-bezier(.22,1,.36,1)}@keyframes drawer-up{0%{opacity:0;transform:translateY(28px)}to{opacity:1;transform:none}}.drawer__head{display:flex;align-items:center;justify-content:space-between;padding:14px 14px 12px 16px;border-bottom:1px solid rgba(125,135,150,.14)}.drawer__title{display:flex;align-items:center;gap:11px}.drawer__spark{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;font-size:14px;font-weight:700;background:#5b8df729;color:var(--brand, #5b8df7)}.drawer__spark--done{background:#4ade8029;color:#4ade80}.drawer__spark--error{background:#f8717129;color:#f87171}.drawer__h{font-size:13.5px;font-weight:650;color:var(--text, #e6eaf0)}.drawer__sub{font-size:11.5px;color:var(--text-dim, #9da7b3);margin-top:1px}.drawer__x{background:none;border:none;cursor:pointer;padding:2px 6px;font-size:19px;line-height:1;color:var(--text-dim, #9da7b3);border-radius:6px}.drawer__x:hover:not(:disabled){color:var(--text, #e6eaf0);background:#7d87961f}.drawer__x:disabled{opacity:.35;cursor:default}.drawer__steps{display:flex;align-items:center;gap:0;padding:14px 18px 4px}.drawer__step{display:flex;align-items:center;gap:7px;color:var(--text-dim, #9da7b3);font-size:12px}.drawer__step-dot{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:11px;font-weight:700;border:1.5px solid rgba(125,135,150,.35);color:var(--text-dim, #9da7b3);background:transparent;flex:none}.drawer__step-bar{width:30px;height:1.5px;background:#7d879640;margin:0 8px}.drawer__step.is-active .drawer__step-dot{border-color:var(--brand, #5b8df7);color:var(--brand, #5b8df7);box-shadow:0 0 0 3px #5b8df72e}.drawer__step.is-active .drawer__step-label{color:var(--text, #e6eaf0)}.drawer__step.is-done .drawer__step-dot{border-color:#4ade80;color:#06210f;background:#4ade80}.drawer__step.is-done .drawer__step-bar{background:#4ade8080}.drawer__step.is-error .drawer__step-dot{border-color:#f87171;color:#f87171}.drawer__log{flex:1;min-height:96px;overflow-y:auto;margin:10px 14px;padding:10px 12px;background:#0a0c10b3;border:1px solid rgba(125,135,150,.12);border-radius:10px;font-family:var(--mono);font-size:11.5px;line-height:1.7}.drawer__log--scroll{max-height:168px;scrollbar-width:thin;scrollbar-color:rgba(125,135,150,.4) transparent}.drawer__log--scroll::-webkit-scrollbar{width:7px}.drawer__log--scroll::-webkit-scrollbar-track{background:transparent;margin:4px 0}.drawer__log--scroll::-webkit-scrollbar-thumb{background:#7d879652;border-radius:6px;border:1.5px solid transparent;background-clip:padding-box}.drawer__log--scroll::-webkit-scrollbar-thumb:hover{background:#7d87968c;background-clip:padding-box}.drawer__now{display:flex;align-items:center;gap:9px;margin:12px 14px 2px;padding:9px 12px;background:#5b8df714;border:1px solid rgba(91,141,247,.2);border-radius:10px;font-size:12.5px;color:var(--text, #e6eaf0)}.drawer__now span{flex:1;min-width:0}.drawer__dlbars{display:flex;flex-direction:column;gap:10px;margin:12px 14px 2px}.dlbar{padding:10px 12px;border-radius:10px;background:#0a0c108c;border:1px solid rgba(125,135,150,.14)}.dlbar__head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:7px}.dlbar__name{font-size:12.5px;font-weight:600;color:var(--text, #e6eaf0)}.dlbar__pct{font-size:11px;color:var(--text-dim, #9da7b3);font-variant-numeric:tabular-nums}.dlbar__track{height:6px;border-radius:4px;background:#7d879629;overflow:hidden}.dlbar__fill{height:100%;border-radius:4px;background:linear-gradient(90deg,#5b8df7,#2496ed);transition:width .2s ease}.dlbar__fill.is-done{background:#4ade80}.dlbar__url{margin-top:6px;font-size:10.5px;color:#6b7686;font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dlbar__urlk{display:inline-block;min-width:16px;text-align:center;margin-right:5px;padding:0 4px;border-radius:4px;font-family:inherit;font-size:9.5px;color:#8fb0f5;background:#5b8df729}.drawer__headbtns{display:flex;align-items:center;gap:2px}.drawer-min{position:fixed;right:20px;bottom:20px;z-index:2001;display:inline-flex;align-items:center;gap:9px;padding:10px 15px;border-radius:999px;cursor:pointer;background:#16181d;border:1px solid rgba(125,135,150,.22);box-shadow:0 10px 30px #00000080;color:var(--text, #e6eaf0);font-size:12.5px;font-weight:550;animation:drawer-min-in .18s cubic-bezier(.2,.8,.2,1)}.drawer-min:hover{border-color:#7d879666;background:#1b1e24}@keyframes drawer-min-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.drawer-min__spark{display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;font-weight:700}.drawer-min--done .drawer-min__spark{color:#4ade80}.drawer-min--error .drawer-min__spark{color:#f87171}.drawer-min__label{font-variant-numeric:tabular-nums}.drawer__log-empty{color:var(--text-dim, #9da7b3)}.drawer__line{display:flex;align-items:baseline;gap:8px;padding:1px 0}.drawer__t{color:#6b7686;flex:none;font-variant-numeric:tabular-nums}.drawer__badge{flex:none;padding:0 6px;border-radius:4px;font-size:10px;font-weight:600;background:#5b8df729;color:#8fb0f5}.drawer__badge--swap{background:#f59e0b29;color:#f5b342}.drawer__badge--done{background:#4ade8029;color:#6ee79b}.drawer__linemsg{color:var(--text, #e6eaf0);word-break:break-word}.drawer__line[data-status=error] .drawer__linemsg{color:#f87171}.drawer__line[data-status=done] .drawer__linemsg{color:#6ee79b}.drawer__line[data-status=skip] .drawer__linemsg{color:var(--text-dim, #9da7b3)}.drawer__hint{margin:0 14px 8px;padding:8px 12px;background:#f59e0b1a;border:1px solid rgba(245,158,11,.28);border-radius:8px;color:#f5b342;font-size:11.5px;line-height:1.5}.drawer__foot{display:flex;align-items:center;gap:8px;padding:12px 14px;border-top:1px solid rgba(125,135,150,.14)}.drawer__foot-status{font-size:12.5px;color:var(--text-dim, #9da7b3);margin-right:auto}.drawer__foot-status.is-error{color:#f87171}.drawer__foot-status.is-done{color:#4ade80}.drawer__foot-status.is-reboot,.drawer__spark--reboot,.drawer-min--reboot .drawer-min__spark{color:#f5b342}.drawer__btn{padding:7px 16px;border-radius:8px;cursor:pointer;font-size:12.5px;font-weight:550;background:#7d879624;border:1px solid rgba(125,135,150,.2);color:var(--text, #e6eaf0)}.drawer__btn:hover{background:#7d879638}.drawer__btn.is-accent{background:var(--brand, #5b8df7);border-color:var(--brand, #5b8df7);color:#fff}.drawer__btn.is-accent:hover{filter:brightness(1.08)}.mitm-card{border:1px solid rgba(125,135,150,.22);border-radius:12px;padding:14px 16px;margin-bottom:14px;background:#1e242e66}.mitm-card--on{border-color:#4ade8059;background:#16281e66}.mitm-pill{position:fixed;top:64px;right:16px;z-index:9998;-webkit-app-region:no-drag;display:inline-flex;align-items:center;gap:8px;padding:4px 6px 4px 11px;border-radius:999px;width:fit-content;max-width:calc(100vw - 32px);background:#141e18d9;border:1px solid rgba(74,222,128,.3);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 4px 14px #0000004d;font-size:12px;line-height:1}.mitm-pill__dot{width:7px;height:7px;border-radius:50%;flex:none;background:#4ade80;box-shadow:0 0 0 3px #4ade8029}.mitm-pill__dot[data-busy="1"]{background:#9da7b3;box-shadow:0 0 0 3px #9da7b329}.mitm-pill__text{color:var(--text-dim, #9da7b3);white-space:nowrap}.mitm-pill__off{background:none;border:none;cursor:pointer;color:#6b7686;font-size:11.5px;padding:3px 7px;border-radius:999px}.mitm-pill__off:hover{color:#f87171;background:#f871711a}.mitm-card__head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.mitm-card__dot{width:8px;height:8px;border-radius:50%;background:#9da7b3;flex:0 0 auto}.mitm-card__dot[data-state=on]{background:#4ade80;box-shadow:0 0 6px #4ade8099}.mitm-card__dot[data-state=warn]{background:#fbbf24}.mitm-card__dot[data-state=off]{background:#60a5fa}.mitm-card__title{font-size:14px;font-weight:600;color:var(--text, #e6edf3)}.mitm-card__desc{font-size:12.5px;line-height:1.5;color:var(--text-dim, #9da7b3);margin:0 0 10px}.mitm-card__note{color:#fbbf24}.mitm-card__error{font-size:12px;color:#f87171;margin-bottom:8px}.mitm-card__actions{display:flex;gap:8px}.mitm-card__btn{font-size:13px;padding:7px 16px;border-radius:8px;border:none;cursor:pointer;background:var(--accent, #3b82f6);color:#fff;font-weight:500}.mitm-card__btn:disabled{opacity:.6;cursor:default}.mitm-card__btn--ghost{background:transparent;border:1px solid rgba(125,135,150,.35);color:var(--text-dim, #9da7b3)}.mitm-card__sub{color:var(--text-dim, #9da7b3);opacity:.8;font-size:11.5px}.terms-gate{display:flex;align-items:center;justify-content:center;padding:24px}.terms-gate__panel,.terms-gate__panel *{-webkit-app-region:no-drag}.terms-gate__panel{position:relative;z-index:1;width:min(680px,94vw);max-height:90vh;display:flex;flex-direction:column;background:#141921eb;border:1px solid rgba(125,135,150,.22);border-radius:16px;padding:28px 30px;box-shadow:0 24px 60px #00000080}.terms-gate__title{font-size:20px;font-weight:700;margin:0 0 4px;color:var(--text, #e6edf3)}.terms-gate__subtitle{font-size:13px;color:var(--text-dim, #9da7b3);margin:0 0 16px}.terms-gate__body{overflow-y:auto;flex:1 1 auto;min-height:0;padding-right:10px;border-top:1px solid rgba(125,135,150,.15);border-bottom:1px solid rgba(125,135,150,.15);padding-top:14px;padding-bottom:14px;overscroll-behavior:contain}.terms-gate__body{scrollbar-width:thin;scrollbar-color:rgba(125,135,150,.35) transparent}.terms-gate__body::-webkit-scrollbar{width:8px}.terms-gate__body::-webkit-scrollbar-track{background:transparent}.terms-gate__body::-webkit-scrollbar-thumb{background:#7d87964d;border-radius:8px;border:2px solid transparent;background-clip:padding-box}.terms-gate__body::-webkit-scrollbar-thumb:hover{background:#7d87968c;background-clip:padding-box;border:2px solid transparent}.terms-gate--review{padding:24px}.terms-gate--review .glow{display:none}.terms-gate--review .terms-gate__panel{width:min(640px,92vw);max-height:min(82vh,760px);background:#12161efa;box-shadow:0 28px 80px #0009;animation:terms-pop .16s ease}@keyframes terms-pop{0%{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:none}}.terms-md{font-size:13px;line-height:1.65;color:var(--text-dim, #c2cbd6);word-break:break-word}.terms-md>:first-child{margin-top:0}.terms-md h1{font-size:17px;font-weight:700;color:var(--text, #e6edf3);margin:0 0 6px}.terms-md h2{font-size:15px;font-weight:700;color:var(--text, #e6edf3);margin:22px 0 8px;padding-top:14px;border-top:1px solid rgba(125,135,150,.12)}.terms-md h3{font-size:13.5px;font-weight:600;color:var(--text, #e6edf3);margin:16px 0 6px}.terms-md p{margin:8px 0}.terms-md strong{color:var(--text, #e6edf3);font-weight:600}.terms-md code{font-family:var(--mono);font-size:12px;background:#7d879629;padding:1px 5px;border-radius:4px;color:#d7dee8}.terms-md ul,.terms-md ol{margin:8px 0;padding-left:22px}.terms-md li{margin:4px 0}.terms-md hr{border:none;border-top:1px solid rgba(125,135,150,.14);margin:18px 0}.terms-md blockquote{margin:10px 0;padding:8px 14px;border-left:3px solid rgba(91,141,247,.55);background:#5b8df712;border-radius:0 8px 8px 0;color:var(--text-dim, #b9c2cf)}.terms-md table{width:100%;border-collapse:collapse;margin:10px 0;font-size:12px;display:block;overflow-x:auto}.terms-md th,.terms-md td{border:1px solid rgba(125,135,150,.18);padding:7px 10px;text-align:left;vertical-align:top}.terms-md th{background:#7d87961a;color:var(--text, #e6edf3);font-weight:600;white-space:nowrap}.terms-gate__scrollhint{font-size:12px;color:#fbbf24;text-align:center;margin:12px 0 0}.terms-gate__actions{display:flex;gap:12px;justify-content:flex-end;margin-top:18px}.terms-gate__btn{font-size:14px;padding:10px 22px;border-radius:9px;border:none;cursor:pointer;background:var(--accent, #3b82f6);color:#fff;font-weight:600}.terms-gate__btn:disabled{opacity:.45;cursor:not-allowed}.terms-gate__btn--ghost{background:transparent;border:1px solid rgba(125,135,150,.35);color:var(--text-dim, #9da7b3);font-weight:500}
|
|
@@ -374,4 +374,4 @@ Error generating stack: `+l.message+`
|
|
|
374
374
|
`};function Fy(o){return o.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function vl(o){return Fy(o).replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>").replace(/`([^`]+)`/g,"<code>$1</code>")}function om(o){return o.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(S=>S.trim())}function Iy(o){const S=String(o||"").replace(/\r\n/g,`
|
|
375
375
|
`).split(`
|
|
376
376
|
`),T=[];let r=0;for(;r<S.length;){const D=S[r];if(!D.trim()){r++;continue}if(/^---+\s*$/.test(D)){T.push("<hr/>"),r++;continue}const R=/^(#{1,6})\s+(.*)$/.exec(D);if(R){const X=Math.min(R[1].length,6);T.push(`<h${X}>${vl(R[2])}</h${X}>`),r++;continue}if(D.trim().startsWith("|")&&r+1<S.length&&/^\s*\|?[\s:|-]+\|?\s*$/.test(S[r+1])&&S[r+1].includes("-")){const X=om(D);r+=2;const H=[];for(;r<S.length&&S[r].trim().startsWith("|");)H.push(om(S[r])),r++;let j="<table><thead><tr>";j+=X.map(_=>`<th>${vl(_)}</th>`).join(""),j+="</tr></thead><tbody>";for(const _ of H)j+="<tr>"+_.map(Y=>`<td>${vl(Y)}</td>`).join("")+"</tr>";j+="</tbody></table>",T.push(j);continue}if(D.trim().startsWith(">")){const X=[];for(;r<S.length&&S[r].trim().startsWith(">");)X.push(S[r].replace(/^\s*>\s?/,"")),r++;T.push(`<blockquote>${X.map(vl).join("<br/>")}</blockquote>`);continue}if(/^\s*-\s+/.test(D)){const X=[];for(;r<S.length&&/^\s*-\s+/.test(S[r]);)X.push(`<li>${vl(S[r].replace(/^\s*-\s+/,""))}</li>`),r++;T.push(`<ul>${X.join("")}</ul>`);continue}if(/^\s*\d+\.\s+/.test(D)){const X=[];for(;r<S.length&&/^\s*\d+\.\s+/.test(S[r]);)X.push(`<li>${vl(S[r].replace(/^\s*\d+\.\s+/,""))}</li>`),r++;T.push(`<ol>${X.join("")}</ol>`);continue}T.push(`<p>${vl(D)}</p>`),r++}return T.join(`
|
|
377
|
-
`)}const v=(o,S)=>{var T,r;try{const D=(r=(T=window.cicyI18n)==null?void 0:T.t)==null?void 0:r.call(T,o);return D&&D!==o?D:S}catch{return S}},ln="cicy_token",_u="cicy_access_token",xu="cicy_user_id",li="https://cicy-ai.com";async function ni(o){var S,T,r;try{(r=(T=(S=window.cicy)==null?void 0:S.shell)==null?void 0:T.openExternal)==null||r.call(T,`${li}/dash${o}`)}catch{}}const Js=new Set;let Py=0,Ia=[];const ei=new Map;function rm(){Js.forEach(o=>o(Ia))}const de={show(o={}){const S=o.id||`t${++Py}`,T=Ia.find(R=>R.id===S),r={id:S,status:"running",...T,...o};Ia=T?Ia.map(R=>R.id===S?r:R):[...Ia,r],rm();const D=ei.get(S);return D&&(clearTimeout(D),ei.delete(S)),o.ttl&&ei.set(S,setTimeout(()=>de.dismiss(S),o.ttl)),S},dismiss(o){Ia=Ia.filter(T=>T.id!==o);const S=ei.get(o);S&&(clearTimeout(S),ei.delete(o)),rm()}};function tg(){const[o,S]=E.useState(Ia);return E.useEffect(()=>(Js.add(S),()=>{Js.delete(S)}),[]),o.length?c.jsx("div",{className:"toast-host","data-id":"ToastHost",children:o.map(T=>c.jsxs("div",{className:"toast","data-id":`Toast-${T.id}`,"data-status":T.status||"running",children:[c.jsx("button",{type:"button",className:"toast__x","data-id":"Toast-dismiss",onClick:()=>de.dismiss(T.id),"aria-label":"dismiss",children:"×"}),c.jsxs("span",{className:"toast__msg",children:[T.message,Number.isFinite(T.progress)?` ${T.progress}%`:""]}),Number.isFinite(T.progress)&&c.jsx("span",{className:"toast__bar",children:c.jsx("span",{style:{width:`${Math.min(100,T.progress)}%`}})})]},T.id))}):null}const Ws=new Set;let fm=0,ie=null;function nn(){Ws.forEach(o=>o(ie))}function Tu(){return new Date().toTimeString().slice(0,8)}const ca={open({teamId:o,fromVer:S,toVer:T,onRetry:r}={}){ie={teamId:o,fromVer:S||null,toVer:T||null,status:"running",phase:"download",logs:[],onRetry:r||null,lastAt:Date.now()},nn()},push(o={}){if(!ie)return;const S={id:++fm,t:Tu(),phase:o.phase||ie.phase,status:o.status||"running",message:o.message||""};ie={...ie,phase:o.phase||ie.phase,toVer:o.toVer||ie.toVer,logs:[...ie.logs,S],lastAt:Date.now()},nn()},minimize(){ie&&(ie={...ie,minimized:!0},nn())},restore(){ie&&(ie={...ie,minimized:!1},nn())},finish({ok:o,message:S}={}){if(!ie)return;const T=o?"done":"error",r={id:++fm,t:Tu(),phase:"done",status:T,message:S||(o?"更新完成":"更新失败")};ie={...ie,status:T,phase:"done",minimized:!1,logs:[...ie.logs,r],lastAt:Date.now()},nn()},close(){ie=null,nn()}},Qs=[["download","下载"],["swap","切换"],["done","完成"]];function eg(){var H;const[o,S]=E.useState(ie);E.useEffect(()=>(Ws.add(S),()=>{Ws.delete(S)}),[]);const T=E.useRef(null);E.useEffect(()=>{const j=T.current;j&&(j.scrollTop=j.scrollHeight)},[(H=o==null?void 0:o.logs)==null?void 0:H.length]);const[r,D]=E.useState(!1);if(E.useEffect(()=>{if(!o||o.status!=="running"){D(!1);return}const j=setInterval(()=>D(Date.now()-(o.lastAt||0)>25e3),3e3);return()=>clearInterval(j)},[o==null?void 0:o.lastAt,o==null?void 0:o.status]),!o)return null;const R=o.status==="running",X=Qs.findIndex(([j])=>j===o.phase);return o.minimized?c.jsxs("button",{type:"button",className:`drawer-min drawer-min--${o.status}`,"data-id":"UpdateDrawer-restore",onClick:()=>ca.restore(),children:[c.jsx("span",{className:"drawer-min__spark",children:R?c.jsx(Ce,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("span",{className:"drawer-min__label",children:["更新 cicy-code",o.toVer?` · v${o.toVer}`:""]})]}):c.jsx("div",{className:"drawer-scrim","data-id":"UpdateDrawer-scrim",onClick:()=>R?ca.minimize():ca.close(),children:c.jsxs("div",{className:"drawer","data-id":"UpdateDrawer","data-status":o.status,onClick:j=>j.stopPropagation(),children:[c.jsxs("div",{className:"drawer__head",children:[c.jsxs("div",{className:"drawer__title",children:[c.jsx("span",{className:`drawer__spark drawer__spark--${o.status}`,children:R?c.jsx(Ce,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("div",{children:[c.jsx("div",{className:"drawer__h",children:"更新 cicy-code"}),c.jsxs("div",{className:"drawer__sub",children:[o.fromVer?`v${o.fromVer}`:"当前"," → ",o.toVer?`v${o.toVer}`:"最新版"]})]})]}),c.jsx("div",{className:"drawer__headbtns",children:c.jsx("button",{type:"button",className:"drawer__x","data-id":"UpdateDrawer-min",title:"最小化",onClick:()=>ca.minimize(),"aria-label":"minimize",children:"‒"})})]}),c.jsx("div",{className:"drawer__steps","data-id":"UpdateDrawer-steps",children:Qs.map(([j,_],Y)=>{const L=o.status==="done"||Y<X,I=Y===X&&R,tt=o.status==="error"&&Y===X;return c.jsxs("div",{className:`drawer__step${I?" is-active":""}${L?" is-done":""}${tt?" is-error":""}`,children:[c.jsx("span",{className:"drawer__step-dot",children:L?"✓":tt?"!":Y+1}),c.jsx("span",{className:"drawer__step-label",children:_}),Y<Qs.length-1&&c.jsx("span",{className:"drawer__step-bar"})]},j)})}),c.jsx("div",{className:"drawer__log","data-id":"UpdateDrawer-log",ref:T,children:o.logs.length===0?c.jsx("div",{className:"drawer__log-empty",children:"准备中…"}):o.logs.map(j=>c.jsxs("div",{className:"drawer__line","data-status":j.status,children:[c.jsx("span",{className:"drawer__t",children:j.t}),c.jsx("span",{className:`drawer__badge drawer__badge--${j.phase}`,children:{download:"下载",swap:"切换",done:"完成"}[j.phase]||j.phase}),c.jsx("span",{className:"drawer__linemsg",children:j.message})]},j.id))}),r&&R&&c.jsx("div",{className:"drawer__hint","data-id":"UpdateDrawer-stuck",children:"正在等待新版本就绪,耗时比平常久。可以放到后台继续,完成或失败都会提示。"}),c.jsx("div",{className:"drawer__foot",children:R?c.jsx(c.Fragment,{children:c.jsx("span",{className:"drawer__foot-status",children:"更新进行中…"})}):o.status==="error"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-error",children:"更新失败"}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-retry",onClick:()=>o.onRetry(),children:"重试"}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-dismiss",onClick:()=>ca.close(),children:"关闭"})]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-done",children:"已更新到最新"}),c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-finish",onClick:()=>ca.close(),children:"完成"})]})})]})})}function ag(){const[o,S]=E.useState(void 0);E.useEffect(()=>{var w,M;if(!((M=(w=window.cicy)==null?void 0:w.terms)!=null&&M.status)){S(!0);return}window.cicy.terms.status(_m).then(k=>S(!!(k!=null&&k.accepted))).catch(()=>S(!0))},[]),E.useEffect(()=>{var k,lt,nt,Zt;const w=document.documentElement;try{w.setAttribute("data-platform",((k=window.cicy)==null?void 0:k.platform)||"linux")}catch{}w.setAttribute("data-fullscreen","0");let M;try{M=(Zt=(nt=(lt=window.cicy)==null?void 0:lt.window)==null?void 0:nt.onFullscreen)==null?void 0:Zt.call(nt,Bt=>w.setAttribute("data-fullscreen",Bt?"1":"0"))}catch{}return()=>{try{M&&M()}catch{}}},[]);const[T,r]=E.useState(()=>ai(ln)),[D,R]=E.useState(()=>ai(_u)),[X,H]=E.useState(()=>ai(xu)),[j,_]=E.useState(()=>!ai(ln)),[Y,L]=E.useState(!1),[I,tt]=E.useState(""),[et,V]=E.useState(""),[ft,Tt]=E.useState(!1),[st,ht]=E.useState("");E.useEffect(()=>{var w,M,k;(k=(M=(w=window.cicy)==null?void 0:w.app)==null?void 0:M.getVersion)==null||k.call(M).then(lt=>ht(lt&<.desktop||"")).catch(()=>{})},[]);const[yt,gt]=E.useState(""),[St,G]=E.useState(""),[Nt,B]=E.useState(null),[xt,Ut]=E.useState(null),[Kt,me]=E.useState(!1),[ue,Rt]=E.useState(""),y=E.useRef(!1),[O,$]=E.useState(null),[ot,_t]=E.useState(!1),[d,C]=E.useState(!1),[q,K]=E.useState("all"),it=E.useCallback(async(w,M)=>{var lt,nt,Zt,Bt;if(!w)return;if(!((nt=(lt=window.cicy)==null?void 0:lt.cloud)!=null&&nt.fetch)){Rt("cloud fetch bridge missing");return}me(!0),Rt("");const k={Authorization:`Bearer ${w}`};try{const[je,Vt]=await Promise.all([window.cicy.cloud.fetch(`${li}/api/user/self`,{headers:k}),window.cicy.cloud.fetch(`${li}/api/teams`,{headers:k})]);if((Vt==null?void 0:Vt.status)===401){if(!y.current&&((Bt=(Zt=window.cicy)==null?void 0:Zt.auth)!=null&&Bt.loginStart)){y.current=!0,Rt("会话已过期,正在重新登录…");try{await window.cicy.auth.loginStart()}catch{}}return}if(Vt!=null&&Vt.ok){const Ft=JSON.parse(Vt.body||"{}");Ut(Array.isArray(Ft==null?void 0:Ft.teams)?Ft.teams:[])}if(je!=null&&je.ok)try{const Ft=JSON.parse(je.body||"{}");B((Ft==null?void 0:Ft.success)===!1?null:(Ft==null?void 0:Ft.data)||null)}catch{B(null)}else B(null)}catch{Rt("")}finally{me(!1)}},[]),ct=E.useRef("");E.useEffect(()=>{ct.current=T||D||""},[T,D]);const U=E.useCallback(async()=>{var M,k;const w=ct.current;if(!(!w||!((k=(M=window.cicy)==null?void 0:M.cloud)!=null&&k.fetch)))try{const lt=await window.cicy.cloud.fetch(`${li}/api/teams`,{headers:{Authorization:`Bearer ${w}`}});if(lt!=null&<.ok){const nt=JSON.parse(lt.body||"{}");Array.isArray(nt==null?void 0:nt.teams)&&Ut(nt.teams)}}catch{}},[]),P=E.useCallback(async(w,M)=>{var nt,Zt;const k=ct.current,lt=String(M||"").trim();if(!k||!((Zt=(nt=window.cicy)==null?void 0:nt.cloud)!=null&&Zt.fetch)||!lt)return{ok:!1,error:"no session / empty"};try{const Bt=await window.cicy.cloud.fetch(`${li}/api/teams/${w}`,{method:"PATCH",headers:{Authorization:`Bearer ${k}`,"Content-Type":"application/json"},body:JSON.stringify({title:lt})});return Bt!=null&&Bt.ok?(await U(),{ok:!0}):{ok:!1,error:`${(Bt==null?void 0:Bt.status)||"?"} ${(Bt==null?void 0:Bt.error)||""}`}}catch(Bt){return{ok:!1,error:Bt.message}}},[U]);E.useEffect(()=>{const w=T||D;w&&it(w,X)},[T,D,X,it]);const Z=E.useCallback(async()=>{var w,M;if((M=(w=window.cicy)==null?void 0:w.localTeams)!=null&&M.list){_t(!0);try{const k=await window.cicy.localTeams.list({refresh:!0});$(Array.isArray(k)?k:[])}catch{$([])}finally{_t(!1),C(!0)}}},[]),vt=E.useCallback(async(w,M)=>{var lt,nt;if(!((nt=(lt=window.cicy)==null?void 0:lt.localTeams)!=null&&nt.update))return{ok:!1,error:"no_bridge"};let k;try{k=await window.cicy.localTeams.update(w,{name:String(M||"").trim()||v("localTeams.unnamed","未命名")})}catch(Zt){k={ok:!1,error:(Zt==null?void 0:Zt.message)||String(Zt)}}return await Z(),k||{ok:!1,error:"no_result"}},[Z]);E.useEffect(()=>{let w,M=!1;const k=3e3,lt=3e4,nt=async()=>{var je,Vt,Ft;try{await((Ft=(Vt=(je=window.cicy)==null?void 0:je.localTeams)==null?void 0:Vt.syncCloud)==null?void 0:Ft.call(Vt))}catch{}await Promise.all([Z(),U()])},Zt=()=>{if(M)return;const je=document.visibilityState==="visible";w=setTimeout(async()=>{document.visibilityState==="visible"?await nt():await Z(),Zt()},je?k:lt)};nt(),Zt();const Bt=()=>{document.visibilityState==="visible"&&nt()};return document.addEventListener("visibilitychange",Bt),window.addEventListener("focus",Bt),()=>{M=!0,clearTimeout(w),document.removeEventListener("visibilitychange",Bt),window.removeEventListener("focus",Bt)}},[Z,U]),E.useEffect(()=>{var M,k;if(!((k=(M=window.cicy)==null?void 0:M.localTeams)!=null&&k.onWebviewRelay))return;const w=window.cicy.localTeams.onWebviewRelay(async({reqId:lt,msg:nt})=>{let Zt={ok:!1,error:"unknown relay type"};try{(nt==null?void 0:nt.type)==="localTeams:add"?Zt=await window.cicy.localTeams.add(nt.spec||{}):(nt==null?void 0:nt.type)==="localTeams:remove"?Zt=await window.cicy.localTeams.remove(nt.id):(nt==null?void 0:nt.type)==="localTeams:update"?Zt=await window.cicy.localTeams.update(nt.id,nt.patch||{}):(nt==null?void 0:nt.type)==="localTeams:upgrade"?Zt=await window.cicy.localTeams.upgrade(nt.id):(nt==null?void 0:nt.type)==="localTeams:list"&&(Zt={ok:!0,teams:await window.cicy.localTeams.list({refresh:!0})}),Z()}catch(Bt){Zt={ok:!1,error:(Bt==null?void 0:Bt.message)||String(Bt)}}try{window.cicy.localTeams.replyWebviewRelay(lt,Zt)}catch{}});return()=>{try{w==null||w()}catch{}}},[Z]);const Qt=E.useCallback(async w=>{var M,k;if((k=(M=window.cicy)==null?void 0:M.localTeams)!=null&&k.open)try{await window.cicy.localTeams.open(w)}catch{}},[]);E.useEffect(()=>{var M,k;if(ai(ln)){_(!1);return}if(!((k=(M=window.cicy)==null?void 0:M.auth)!=null&&k.getSaved)){_(!1);return}let w=!1;return(async()=>{try{const lt=await window.cicy.auth.getSaved();if(w)return;if(lt!=null&<.token){try{localStorage.setItem(ln,lt.token)}catch{}if(r(lt.token),lt.accessToken){try{localStorage.setItem(_u,lt.accessToken)}catch{}R(lt.accessToken)}if(lt.userId){try{localStorage.setItem(xu,String(lt.userId))}catch{}H(String(lt.userId))}}}catch{}finally{w||_(!1)}})(),()=>{w=!0}},[]),E.useEffect(()=>{var w,M;if((M=(w=window.cicy)==null?void 0:w.auth)!=null&&M.onComplete)return window.cicy.auth.onComplete(k=>{if(L(!1),Tt(!1),k!=null&&k.error){gt(Ks(k.error));return}if(k!=null&&k.token){y.current=!1,Rt("");try{localStorage.setItem(ln,k.token)}catch{}if(r(k.token),k.accessToken){try{localStorage.setItem(_u,k.accessToken)}catch{}R(k.accessToken)}if(k.userId){try{localStorage.setItem(xu,String(k.userId))}catch{}H(String(k.userId))}gt(""),G(k.reused?"已恢复你之前的登录":"登录成功"),setTimeout(()=>G(""),3e3)}})},[]);async function Xt(){var M,k;if(!((k=(M=window.cicy)==null?void 0:M.auth)!=null&&k.loginStart)){gt("auth bridge missing");return}gt(""),L(!0);const w=await window.cicy.auth.loginStart();if(!(w!=null&&w.ok)){L(!1),gt(Ks((w==null?void 0:w.error)||"login start failed"));return}tt(w.url||"")}async function ce(){var k,lt;if(!((lt=(k=window.cicy)==null?void 0:k.auth)!=null&<.emailLoginStart)){gt("auth bridge missing");return}const w=et.trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(w)){gt(v("auth.badEmail","请输入有效的邮箱地址"));return}gt("");const M=await window.cicy.auth.emailLoginStart(w);if(!(M!=null&&M.ok)){gt(Ks((M==null?void 0:M.error)||"email login failed"));return}Tt(!0)}function Q(){var w,M,k;try{localStorage.removeItem(ln),localStorage.removeItem(_u),localStorage.removeItem(xu)}catch{}try{(k=(M=(w=window.cicy)==null?void 0:w.auth)==null?void 0:M.logout)==null||k.call(M)}catch{}r(null),R(null),H(null),B(null),Ut(null),gt(""),Rt("")}if(o===void 0)return c.jsxs("div",{className:"shell","data-id":"TermsCheckingSplash",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Vs,{}),c.jsx("div",{className:"spinner-row",children:c.jsx(Ce,{})})]})]});if(!o)return c.jsx(xm,{onAgree:()=>S(!0)});if(!T&&j)return c.jsxs("div",{className:"shell","data-id":"AuthRestoringSplash",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Vs,{}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(Ce,{}),c.jsx("span",{children:v("auth.restoring","正在恢复登录…")})]})]})]});if(!T)return c.jsxs("div",{className:"shell",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Vs,{}),!Y&&!ft&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline",children:v("auth.tagline","登录以同步你的团队、配置与 AI 助手")}),c.jsx("label",{className:"login-label","data-id":"EmailLoginLabel",htmlFor:"cicy-email-login",children:v("auth.emailLabel","输入邮箱,用邮件链接登录")}),c.jsx("input",{id:"cicy-email-login",type:"email",className:"login-email-input","data-id":"EmailLoginInput",value:et,onChange:w=>V(w.target.value),onKeyDown:w=>{w.key==="Enter"&&ce()},placeholder:v("auth.emailPlaceholder","you@example.com"),autoComplete:"email",spellCheck:!1,autoFocus:!0}),c.jsxs("button",{className:"btn-primary","data-id":"EmailLoginSubmit",onClick:ce,children:[c.jsx("span",{children:v("auth.emailLogin","发送登录链接")}),c.jsx(ju,{})]}),c.jsx("p",{className:"hint",children:v("auth.emailHint","手机上点邮件里的链接,也能登录这台电脑")}),c.jsx("div",{className:"login-divider","data-id":"LoginDivider",children:c.jsx("span",{children:v("auth.or","或")})}),c.jsx("button",{className:"btn-ghost","data-id":"BrowserLoginBtn",onClick:Xt,children:v("auth.browserLogin","用浏览器登录(Google / SSO,仅同一台电脑)")})]}),ft&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline","data-id":"EmailSentTagline",children:v("auth.emailSentTagline","登录邮件已发送")}),c.jsxs("p",{className:"hint","data-id":"EmailSentHint",style:{textAlign:"center"},children:[v("auth.emailSentHint","到邮箱打开链接即可(手机、电脑都行),这里会自动登录。"),c.jsx("br",{}),et]}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(Ce,{}),c.jsx("span",{children:v("auth.emailWaiting","等待确认…")})]}),c.jsx("button",{className:"btn-ghost","data-id":"EmailSentCancel",onClick:()=>{var w,M,k;(k=(M=(w=window.cicy)==null?void 0:w.auth)==null?void 0:M.emailLoginCancel)==null||k.call(M),Tt(!1)},children:v("auth.cancel","取消")})]}),Y&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline",children:v("auth.waitingTagline","已在浏览器打开登录页,等待你完成…")}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(Ce,{}),c.jsx("span",{children:v("auth.waitingCallback","等待回调")})]}),I&&c.jsxs("div",{className:"login-fallback","data-id":"LoginUrlFallback",style:{marginTop:10,textAlign:"center"},children:[c.jsx("p",{className:"hint",style:{marginBottom:6},children:v("auth.browserNotOpened","浏览器没自动打开?")}),c.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-open",onClick:()=>{var w,M,k;try{(k=(M=(w=window.cicy)==null?void 0:w.shell)==null?void 0:M.openExternal)==null||k.call(M,I)}catch{}},children:v("auth.openManually","手动打开登录页")}),c.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-copy",onClick:()=>{var w;try{(w=navigator.clipboard)==null||w.writeText(I),G(v("auth.linkCopied","链接已复制,粘到浏览器打开")),setTimeout(()=>G(""),2500)}catch{}},children:v("auth.copyLink","复制链接")}),c.jsx("p",{className:"hint","data-id":"LoginUrlFallback-url",style:{wordBreak:"break-all",marginTop:6,fontSize:11,opacity:.7,userSelect:"text"},children:I})]}),c.jsx("button",{className:"btn-ghost",onClick:()=>{var w,M,k;(k=(M=(w=window.cicy)==null?void 0:w.auth)==null?void 0:M.loginCancel)==null||k.call(M),L(!1),tt("")},children:v("auth.cancel","取消")})]}),yt&&c.jsx("div",{className:"error",children:yt})]})]});const ye=(O||[]).find(w=>Zs(w.base_url))||null,ae=ye&&ye.cloud_team_id?(xt||[]).find(w=>String(w.teamId||w.id)===String(ye.cloud_team_id)):null,J=(O||[]).filter(w=>Fs(w.base_url)),wt=(O||[]).filter(w=>!Fs(w.base_url)&&!Zs(w.base_url)),rt=J.length,dt=wt.length,aa=(xt||[]).filter(w=>!w.is_local&&w.kind!=="local"&&(w.kind==="private"||w.team_kind==="personal")),Pa=aa.length,Ca=q==="all"||q==="local",ge=q==="all"||q==="custom",Ea=q==="all"||q==="cloud";return c.jsxs("div",{className:"shell shell--app",children:[c.jsx("div",{className:"glow glow--app","aria-hidden":!0}),st&&c.jsxs("div",{"data-id":"VersionBadge",title:`CiCy Desktop v${st}`,style:{position:"fixed",bottom:8,right:12,fontSize:11,lineHeight:1,color:"rgba(255,255,255,0.4)",userSelect:"text",zIndex:60,pointerEvents:"none"},children:["v",st]}),c.jsxs("div",{className:"shell__left",children:[c.jsx(ig,{me:Nt,welcome:St,onLogout:Q,mitmTeam:J.length>0?J[0]:null}),c.jsxs("main",{className:"main",children:[c.jsxs("div",{className:"app__tabsrow",children:[c.jsx("div",{className:"app__tabs",children:[{k:"all",label:"全部",n:rt+dt+Pa},{k:"local",label:"本地",n:rt},{k:"cloud",label:"私有云",n:Pa},{k:"custom",label:"自定义",n:dt}].map(({k:w,label:M,n:k})=>c.jsxs("button",{type:"button",className:`app__tab ${q===w?"is-active":""}`,onClick:()=>K(w),children:[M,c.jsx("span",{className:"app__tab-count",children:k})]},w))}),c.jsxs("button",{type:"button","data-id":"AddTeamButton",className:"app__add-team",title:v("teams.addHint","在云端新建私有云团队"),onClick:()=>ni("?tab=private"),children:["+ ",v("teams.add","新加团队")]})]}),ue&&c.jsxs("div",{className:"error",style:{marginBottom:12},children:["云端: ",ue,c.jsx("button",{className:"btn-ghost",style:{marginLeft:8},onClick:()=>it(T||D,X),children:"重试"})]}),c.jsxs("div",{className:"app__grid",children:[Ca&&J.filter(w=>!Zs(w.base_url)).map(w=>c.jsx(hm,{team:w,onOpen:()=>Qt(w.id),onRename:vt,onRefresh:Z},"local:"+w.id)),Ca&&J.length===0&&c.jsxs("div",{"data-id":"LocalTeamPlaceholder",className:"bcard bcard--local",children:[c.jsx("div",{className:"bcard__accent"}),c.jsx("div",{className:"bcard__top",children:c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":"warn"}),c.jsx(jm,{})]})}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("h3",{className:"bcard__name",children:"本地团队"}),c.jsx("div",{className:"bcard__host",children:"http://127.0.0.1:8008"}),c.jsx("div",{className:"bcard__meta"})]}),c.jsxs("button",{type:"button",className:"bcard__cta",disabled:!0,children:[c.jsx(Ce,{}),c.jsx("span",{children:d?"正在启动,就绪后自动加入…":"检测中…"})]})]}),Ca&&c.jsx(rg,{dockerTeam:ye,onOpen:async()=>{var w,M,k;try{const lt=await((k=(M=(w=window.cicy)==null?void 0:w.docker)==null?void 0:M.appOpen)==null?void 0:k.call(M));lt!=null&<.ok||de.show({id:"docker-open",status:"error",ttl:6e3,message:v("docker.openNoToken","服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。")})}catch(lt){console.warn("[DockerCard] open",lt)}},cloudTitle:ae==null?void 0:ae.title,onRename:ye!=null&&ye.cloud_team_id?(w=>P(ye.cloud_team_id,w)):void 0,onRefresh:Z}),ge&&wt.map(w=>c.jsx(hm,{team:w,onOpen:()=>Qt(w.id),onRename:vt,onRefresh:Z},"custom:"+w.id)),Ea&&aa.map(w=>c.jsx(fg,{team:w,onOpen:()=>{var k,lt,nt;const M=w.kind==="private"?w.host_url:w.workspace_url||w.workspace_direct_url;M&&((nt=(lt=(k=window.cicy)==null?void 0:k.tabs)==null?void 0:lt.open)==null||nt.call(lt,M,w.name||w.title||""))},onRename:P},"cloud:"+w.id))]}),!Kt&&!ue&&xt&&xt.length===0&&!(O!=null&&O.length)&&c.jsx("div",{className:"empty",style:{marginTop:14},children:"还没有团队 — 安装本地 cicy-code 起一个本地 team,或在云端创建。"})]})]}),c.jsx(tg,{}),c.jsx(eg,{}),c.jsx(og,{})]})}function lg({onClose:o}){const[S,T]=E.useState(null),[r,D]=E.useState(""),[R,X]=E.useState(!1),[H,j]=E.useState(""),_=typeof window<"u"&&window.cicy&&window.cicy.trustedOrigins||null,Y=E.useCallback(async()=>{try{T(_&&await _.list()||[])}catch{T([])}},[_]);E.useEffect(()=>{Y()},[Y]);const L=async()=>{const et=r.trim();if(!(!et||R||!_)){X(!0),j("");try{const V=await _.add(et);V&&V.ok===!1?j(V.error||v("trustedSites.addFailed","添加失败")):(D(""),T(V&&V.origins||await _.list()))}catch(V){j(String(V&&V.message||V))}finally{X(!1)}}},I=async et=>{if(!(R||!_)){X(!0),j("");try{const V=await _.remove(et);V&&V.ok===!1?j(V.error||v("trustedSites.removeFailed","删除失败")):T(V&&V.origins||await _.list())}catch(V){j(String(V&&V.message||V))}finally{X(!1)}}},tt={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 cn.createPortal(c.jsx("div",{style:tt.overlay,onClick:o,"data-id":"TrustedSitesModal",children:c.jsxs("div",{style:tt.card,onClick:et=>et.stopPropagation(),children:[c.jsxs("div",{style:tt.head,children:[c.jsx("h2",{style:tt.title,children:v("trustedSites.title","受信任站点")}),c.jsx("button",{type:"button",style:tt.x,onClick:o,"aria-label":"close",children:"✕"})]}),c.jsx("div",{style:tt.warn,children:v("trustedSites.warn","⚠ 列表中的站点可以在你的电脑上执行命令(exec)。只添加你完全信任的地址。")}),c.jsxs("div",{style:tt.addRow,children:[c.jsx("input",{"data-id":"trusted-sites-input",style:tt.input,value:r,onChange:et=>D(et.target.value),onKeyDown:et=>{et.key==="Enter"&&L()},placeholder:v("trustedSites.placeholder","添加站点,如 app.cicy-ai.com 或 my-cloud.example.org")}),c.jsx("button",{type:"button","data-id":"trusted-sites-add",style:{...tt.addBtn,opacity:R||!r.trim()?.5:1},onClick:L,disabled:R||!r.trim(),children:v("trustedSites.add","添加")})]}),H&&c.jsx("div",{style:tt.err,children:H}),c.jsx("div",{style:tt.listWrap,children:S===null?c.jsx("div",{style:tt.muted,children:v("trustedSites.loading","加载中…")}):S.length===0?c.jsx("div",{style:tt.muted,children:v("trustedSites.empty","暂无")}):S.map(et=>c.jsxs("div",{style:tt.row,"data-id":"trusted-sites-row",children:[c.jsx("span",{style:tt.host(et.builtin),children:et.host}),et.builtin?c.jsx("span",{style:tt.tag,children:v("trustedSites.builtin","系统")}):c.jsx("button",{type:"button",style:tt.rm,onClick:()=>I(et.host),disabled:R,children:v("trustedSites.remove","删除")})]},et.host))})]})}),document.body)}function ng({onClose:o}){const[S,T]=E.useState(null),[r,D]=E.useState(""),[R,X]=E.useState(""),[H,j]=E.useState(!1),_=typeof window<"u"&&window.cicy&&window.cicy.rpcAudit||null,Y=E.useCallback(async()=>{j(!0),D("");try{const B=_&&await _.tail(400);!B||B.ok===!1?(D(B&&B.error||v("audit.loadFailed","读取失败")),T([])):(T(B.entries||[]),X(B.path||""))}catch(B){D(String(B&&B.message||B)),T([])}finally{j(!1)}},[_]);E.useEffect(()=>{Y()},[Y]);const[L,I]=E.useState("all"),[tt,et]=E.useState(""),V=B=>{try{return new Date(B).toLocaleString()}catch{return B||""}},ft=B=>{if(B.kind==="auth"){const xt=/deny/.test(B.decision||"");return{text:B.decision||"auth",color:xt?"#fca5a5":"#86efac",bg:xt?"rgba(239,68,68,.14)":"rgba(34,197,94,.14)"}}if(B.kind==="rpc"){const xt=B.ok!==!1&&!B.error;return{text:xt?"ok":"err",color:xt?"#86efac":"#fca5a5",bg:xt?"rgba(34,197,94,.14)":"rgba(239,68,68,.14)"}}return{text:B.kind||"log",color:"#a1a1aa",bg:"rgba(255,255,255,.06)"}},Tt=B=>B.kind==="auth"?`${B.gate||""}${B.decision?" · "+B.decision:""}`:B.kind==="rpc"?`${B.tool||""}${B.dangerous?" ⚠":""}`:B.kind||"",st=B=>B.error||B.args||(B.kind==="rpc"?B.channel:"")||"",ht=S||[],yt=tt.trim().toLowerCase(),gt=ht.filter(B=>L!=="all"&&B.kind!==L?!1:yt?[B.origin,B.host,B.tool,B.gate,B.decision,B.channel,B.args,B.error,B.kind].filter(Boolean).join(" ").toLowerCase().includes(yt):!0),St="186px 104px minmax(160px,1.1fr) minmax(150px,1.1fr) minmax(220px,1.8fr)",G={overlay:{position:"fixed",inset:0,zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.66)",backdropFilter:"blur(4px)"},card:{width:"96vw",height:"92vh",maxWidth:1480,display:"flex",flexDirection:"column",background:"#0d0d0f",border:"1px solid rgba(255,255,255,.09)",borderRadius:18,boxShadow:"0 32px 80px rgba(0,0,0,.6)",overflow:"hidden",color:"#e4e4e7"},head:{display:"flex",alignItems:"center",gap:14,padding:"20px 24px",borderBottom:"1px solid rgba(255,255,255,.07)"},titleWrap:{flex:1,minWidth:0},title:{margin:0,fontSize:21,fontWeight:650,letterSpacing:.2},subtitle:{margin:"3px 0 0",fontSize:12.5,color:"#71717a",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",wordBreak:"break-all"},count:{fontSize:12.5,color:"#a1a1aa",whiteSpace:"nowrap"},refresh:{background:"rgba(255,255,255,.1)",border:"none",borderRadius:9,padding:"9px 16px",color:"#fff",fontSize:13,fontWeight:500,cursor:"pointer"},x:{background:"transparent",border:"none",color:"#a1a1aa",fontSize:20,cursor:"pointer",lineHeight:1,padding:6},toolbar:{display:"flex",alignItems:"center",gap:10,padding:"14px 24px",borderBottom:"1px solid rgba(255,255,255,.05)"},chips:{display:"flex",gap:6},chip:B=>({background:B?"rgba(255,255,255,.14)":"transparent",border:"1px solid rgba(255,255,255,.12)",borderRadius:999,padding:"6px 16px",color:B?"#fff":"#a1a1aa",fontSize:13,cursor:"pointer"}),search:{flex:1,minWidth:0,background:"#161618",border:"1px solid rgba(255,255,255,.1)",borderRadius:10,padding:"10px 14px",color:"#e4e4e7",fontSize:13.5,outline:"none"},err:{margin:"10px 24px 0",fontSize:12.5,color:"#fca5a5"},tableWrap:{flex:1,overflow:"auto",margin:"0"},theadRow:{position:"sticky",top:0,zIndex:1,display:"grid",gridTemplateColumns:St,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:St,gap:16,padding:"13px 24px",borderBottom:"1px solid rgba(255,255,255,.045)",alignItems:"center"},time:{fontSize:12.5,color:"#a1a1aa",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",whiteSpace:"nowrap"},badge:B=>({justifySelf:"start",fontSize:11.5,color:B.color,background:B.bg,borderRadius:7,padding:"3px 10px",whiteSpace:"nowrap",fontWeight:500}),cell:{fontSize:13,color:"#d4d4d8",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",wordBreak:"break-all"},detail:{fontSize:12.5,color:"#8b8b93",wordBreak:"break-all"},muted:{padding:"60px 24px",textAlign:"center",color:"#71717a",fontSize:14}},Nt=B=>c.jsx("div",{children:B});return cn.createPortal(c.jsx("div",{style:G.overlay,onClick:o,"data-id":"AuditLogModal",children:c.jsxs("div",{style:G.card,onClick:B=>B.stopPropagation(),children:[c.jsxs("div",{style:G.head,children:[c.jsxs("div",{style:G.titleWrap,children:[c.jsx("h2",{style:G.title,children:v("audit.title","审计日志")}),R&&c.jsx("p",{style:G.subtitle,children:R})]}),c.jsxs("span",{style:G.count,children:[v("audit.count","共")," ",gt.length,L!=="all"||yt?` / ${ht.length}`:""]}),c.jsx("button",{type:"button","data-id":"audit-refresh",style:{...G.refresh,opacity:H?.5:1},onClick:Y,disabled:H,children:v("audit.refresh","刷新")}),c.jsx("button",{type:"button",style:G.x,onClick:o,"aria-label":"close",children:"✕"})]}),c.jsxs("div",{style:G.toolbar,children:[c.jsxs("div",{style:G.chips,children:[c.jsx("button",{type:"button",style:G.chip(L==="all"),onClick:()=>I("all"),children:v("audit.all","全部")}),c.jsx("button",{type:"button",style:G.chip(L==="rpc"),onClick:()=>I("rpc"),children:v("audit.rpc","RPC 调用")}),c.jsx("button",{type:"button",style:G.chip(L==="auth"),onClick:()=>I("auth"),children:v("audit.auth","授权决定")})]}),c.jsx("input",{"data-id":"audit-search",style:G.search,value:tt,onChange:B=>et(B.target.value),placeholder:v("audit.search","搜索来源 / 工具 / 命令…")})]}),r&&c.jsx("div",{style:G.err,children:r}),c.jsxs("div",{style:G.tableWrap,children:[c.jsxs("div",{style:G.theadRow,children:[Nt(v("audit.colTime","时间")),Nt(v("audit.colType","类型")),Nt(v("audit.colSource","来源")),Nt(v("audit.colOp","操作")),Nt(v("audit.colDetail","详情"))]}),S===null?c.jsx("div",{style:G.muted,children:v("audit.loading","加载中…")}):gt.length===0?c.jsx("div",{style:G.muted,children:ht.length===0?v("audit.empty","暂无审计记录"):v("audit.noMatch","无匹配记录")}):gt.map((B,xt)=>{const Ut=ft(B);return c.jsxs("div",{style:G.row,"data-id":"audit-row",children:[c.jsx("span",{style:G.time,children:V(B.ts)}),c.jsx("span",{style:G.badge(Ut),children:Ut.text}),c.jsx("span",{style:G.cell,children:B.origin||B.host||"—"}),c.jsx("span",{style:G.cell,children:Tt(B)||"—"}),c.jsx("span",{style:G.detail,children:st(B)||"—"})]},xt)})]})]})}),document.body)}function ig({me:o,welcome:S,onLogout:T,mitmTeam:r}){const D=(o==null?void 0:o.display_name)||(o==null?void 0:o.username)||"…",R=D.slice(0,1).toUpperCase(),[X,H]=E.useState(!1),[j,_]=E.useState(!1),[Y,L]=E.useState(!1),[I,tt]=E.useState(!1),[et,V]=E.useState(""),ft=E.useRef(null);E.useEffect(()=>{var ht,yt,gt;let st=!0;return(gt=(yt=(ht=window.cicy)==null?void 0:ht.app)==null?void 0:yt.getVersion)==null||gt.call(yt).then(St=>{st&&V(typeof St=="string"?St:String((St==null?void 0:St.desktop)||""))}).catch(()=>{}),()=>{st=!1}},[]),E.useEffect(()=>{if(!X)return;const st=ht=>{ft.current&&!ft.current.contains(ht.target)&&H(!1)};return document.addEventListener("mousedown",st),()=>document.removeEventListener("mousedown",st)},[X]);const Tt=st=>{ni(st),H(!1)};return c.jsxs(c.Fragment,{children:[c.jsxs("header",{className:"topbar",children:[c.jsxs("div",{className:"brand-mini",children:[c.jsx("div",{className:"brand-mark sm",children:c.jsx(Tm,{})}),c.jsx("span",{className:"brand-name",children:"CiCy Desktop"})]}),c.jsxs("div",{className:"user-chip","data-id":"UserChip",ref:ft,children:[S&&c.jsx("span",{className:"welcome",children:S}),c.jsxs("button",{type:"button","data-id":"UserChip-trigger",className:`user-chip__trigger${X?" is-open":""}`,onClick:()=>H(st=>!st),children:[c.jsx("div",{className:"avatar",children:R}),c.jsx("span",{className:"user-name",children:D}),c.jsx("span",{className:"user-chip__caret","aria-hidden":!0,children:"▾"})]}),X&&c.jsxs("div",{className:"user-chip__menu","data-id":"UserChip-menu",role:"menu",children:[c.jsx("button",{type:"button","data-id":"UserChip-wallet",className:"user-chip__menu-item",onClick:()=>Tt("?view=wallet"),children:"我的钱包"}),c.jsx("button",{type:"button","data-id":"UserChip-billing",className:"user-chip__menu-item",onClick:()=>Tt("?view=usage"),children:"我的账单"}),c.jsx("button",{type:"button","data-id":"UserChip-trusted-sites",className:"user-chip__menu-item",onClick:()=>{H(!1),_(!0)},children:v("trustedSites.menu","受信任站点")}),c.jsx("button",{type:"button","data-id":"UserChip-audit-log",className:"user-chip__menu-item",onClick:()=>{H(!1),L(!0)},children:v("audit.menu","审计日志")}),c.jsx("button",{type:"button","data-id":"UserChip-terms",className:"user-chip__menu-item",onClick:()=>{H(!1),tt(!0)},children:v("firstRunTerms.menu","用户协议")}),!1,c.jsx("div",{className:"user-chip__menu-sep","aria-hidden":!0}),c.jsx("button",{type:"button","data-id":"UserChip-logout",className:"user-chip__menu-item is-danger",onClick:()=>{H(!1),T()},children:"退出"}),c.jsxs("div",{className:"user-chip__menu-version","data-id":"UserChip-version",children:["CiCy Desktop ",et?`v${et}`:"…"]})]})]})]}),j&&c.jsx(lg,{onClose:()=>_(!1)}),Y&&c.jsx(ng,{onClose:()=>L(!1)}),I&&c.jsx(xm,{onClose:()=>tt(!1)})]})}function xm({onAgree:o,onClose:S}){var et;const[T,r]=E.useState(!1),[D,R]=E.useState(!1),X=(((et=window.cicyI18n)==null?void 0:et.locale)||"en").startsWith("zh")?"zh-CN":"en",H=(V,ft)=>v(`firstRunTerms.${V}`,ft),j=!!S,_=E.useMemo(()=>Iy($y(X)),[X]),Y=V=>{const ft=V.currentTarget;ft.scrollHeight-ft.scrollTop-ft.clientHeight<24&&r(!0)},L=E.useRef(null);E.useEffect(()=>{const V=L.current;V&&V.scrollHeight<=V.clientHeight+24&&r(!0)},[]);const I=async()=>{var V,ft,Tt;if(!(D||!T)){R(!0);try{await((Tt=(ft=(V=window.cicy)==null?void 0:V.terms)==null?void 0:ft.agree)==null?void 0:Tt.call(ft,_m)),o==null||o()}catch{o==null||o()}}},tt=()=>{var V,ft,Tt;try{(Tt=(ft=(V=window.cicy)==null?void 0:V.terms)==null?void 0:ft.decline)==null||Tt.call(ft)}catch{}};return c.jsxs("div",{className:j?"terms-gate terms-gate--review":"shell terms-gate","data-id":"FirstRunTermsGate",style:j?{position:"fixed",inset:0,zIndex:1e3,background:"rgba(8,9,14,.72)",backdropFilter:"blur(4px)"}:void 0,onClick:j?V=>{V.target===V.currentTarget&&S()}:void 0,children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"terms-gate__panel",children:[c.jsx("h1",{className:"terms-gate__title","data-id":"FirstRunTermsGate-title",children:H("title","用户协议与授权说明")}),c.jsx("p",{className:"terms-gate__subtitle",children:H("subtitle","使用 CiCy Desktop 前,请阅读并同意以下条款")}),c.jsx("div",{className:"terms-gate__body",ref:L,onScroll:Y,"data-id":"FirstRunTermsGate-body",children:c.jsx("div",{className:"terms-md","data-id":"FirstRunTermsGate-md",dangerouslySetInnerHTML:{__html:_}})}),j?c.jsx("div",{className:"terms-gate__actions",children:c.jsx("button",{"data-id":"FirstRunTermsGate-close",className:"terms-gate__btn",onClick:S,children:H("close","关闭")})}):c.jsxs(c.Fragment,{children:[!T&&c.jsx("div",{className:"terms-gate__scrollhint","data-id":"FirstRunTermsGate-scrollhint",children:H("scrollHint","请阅读至底部以继续")}),c.jsxs("div",{className:"terms-gate__actions",children:[c.jsx("button",{"data-id":"FirstRunTermsGate-decline",className:"terms-gate__btn terms-gate__btn--ghost",onClick:tt,children:H("decline","不同意并退出")}),c.jsx("button",{"data-id":"FirstRunTermsGate-agree",className:"terms-gate__btn",disabled:!T||D,title:T?"":H("mustAgree","未同意则无法使用本软件。"),onClick:I,children:H("agree","同意并继续")})]})]})]})]})}const $s=new Set;let dm=0,te=null;function un(){$s.forEach(o=>o(te))}const ee={open({onRetry:o}={}){te={status:"running",phase:"install-docker",logs:[],bars:{},minimized:!1,onRetry:o||null,lastAt:Date.now()},un()},minimize(){te&&(te={...te,minimized:!0},un())},restore(){te&&(te={...te,minimized:!1},un())},push(o={}){var X;if(!te)return;const S=o.phase==="health"?"container":o.phase||te.phase,T={...te,phase:S,lastAt:Date.now()},r=Number.isFinite(o.progress),D=S==="install-docker"||S==="image";if(D&&(r||o.dest||o.url)){const H=((X=te.bars)==null?void 0:X[S])||{},j=r?o.progress:o.status==="skip"||o.status==="done"?100:H.progress;T.bars={...te.bars,[S]:{progress:j,received:o.received??H.received,total:o.total??H.total,url:o.url||H.url,dest:o.dest||H.dest}}}if(!(o.status==="running"&&r&&D)){const H={id:++dm,t:Tu(),phase:S,status:o.status||"running",message:o.message||""};T.logs=[...te.logs,H]}te=T,un()},finish({ok:o,message:S,status:T}={}){if(!te)return;const r=T||(o?"done":"error"),D=r==="error"?te.phase:"done",R={id:++dm,t:Tu(),phase:D,status:r,message:S||(o?"完成":"失败")};te={...te,status:r,phase:D,minimized:!1,logs:[...te.logs,R],lastAt:Date.now()},un()},close(){te=null,un()}},Xs=[["install-docker","准备环境"],["image","下载运行环境"],["container","启动服务"],["done","完成"]],ug={"install-docker":"准备",image:"下载",container:"启动",health:"启动",done:"完成"},cg={"install-docker":"Docker Desktop",image:"基础镜像"};function mm(o){return Number.isFinite(o)?o<1024?o+" B":o<1048576?(o/1024).toFixed(0)+" KB":o<1073741824?(o/1048576).toFixed(1)+" MB":(o/1073741824).toFixed(2)+" GB":"?"}function sg({phaseKey:o,bar:S}){const T=Number.isFinite(S==null?void 0:S.progress)?Math.max(0,Math.min(100,S.progress)):0,r=T>=100;return c.jsxs("div",{className:"dlbar","data-id":`DockerDrawer-dlbar-${o}`,children:[c.jsxs("div",{className:"dlbar__head",children:[c.jsx("span",{className:"dlbar__name",children:cg[o]||o}),c.jsxs("span",{className:"dlbar__pct",children:[T,"%",S!=null&&S.total?` · ${mm(S.received)} / ${mm(S.total)}`:""]})]}),c.jsx("div",{className:"dlbar__track",children:c.jsx("div",{className:`dlbar__fill${r?" is-done":""}`,style:{width:`${T}%`}})}),(S==null?void 0:S.url)&&c.jsxs("div",{className:"dlbar__url",title:S.url,children:[c.jsx("span",{className:"dlbar__urlk",children:"源"})," ",S.url]}),(S==null?void 0:S.dest)&&c.jsxs("div",{className:"dlbar__url",title:S.dest,children:[c.jsx("span",{className:"dlbar__urlk",children:"存"})," ",S.dest]})]})}function og(){var X;const[o,S]=E.useState(te);E.useEffect(()=>($s.add(S),()=>{$s.delete(S)}),[]);const T=E.useRef(null);if(E.useEffect(()=>{const H=T.current;H&&(H.scrollTop=H.scrollHeight)},[(X=o==null?void 0:o.logs)==null?void 0:X.length]),!o)return null;const r=o.status==="running",D=Xs.findIndex(([H])=>H===o.phase),R=["install-docker","image"].filter(H=>{var j;return(j=o.bars)==null?void 0:j[H]});if(o.minimized){const H=R.map(_=>{var Y;return(Y=o.bars[_])==null?void 0:Y.progress}).filter(Number.isFinite),j=H.length?Math.round(H.reduce((_,Y)=>_+Y,0)/H.length):null;return c.jsxs("button",{type:"button",className:`drawer-min drawer-min--${o.status}`,"data-id":"DockerDrawer-restore",onClick:()=>ee.restore(),children:[c.jsx("span",{className:"drawer-min__spark",children:r?c.jsx(Ce,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("span",{className:"drawer-min__label",children:[v("docker.setupTitle","安装 Docker cicy-code"),j!=null?` · ${j}%`:""]})]})}return c.jsx("div",{className:"drawer-scrim","data-id":"DockerDrawer-scrim",onClick:()=>r?ee.minimize():ee.close(),children:c.jsxs("div",{className:"drawer","data-id":"DockerDrawer","data-status":o.status,onClick:H=>H.stopPropagation(),children:[c.jsxs("div",{className:"drawer__head",children:[c.jsxs("div",{className:"drawer__title",children:[c.jsx("span",{className:`drawer__spark drawer__spark--${o.status}`,children:r?c.jsx(Ce,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("div",{children:[c.jsx("div",{className:"drawer__h",children:v("docker.setupTitle","安装 Docker cicy-code")}),c.jsx("div",{className:"drawer__sub",children:"127.0.0.1:8008"})]})]}),c.jsx("div",{className:"drawer__headbtns",children:c.jsx("button",{type:"button",className:"drawer__x","data-id":"DockerDrawer-min",title:v("common.minimize","最小化"),onClick:()=>ee.minimize(),"aria-label":"minimize",children:"‒"})})]}),c.jsx("div",{className:"drawer__steps","data-id":"DockerDrawer-steps",children:Xs.map(([H,j],_)=>{const Y=o.status==="done"||D>=0&&_<D,L=_===D&&r,I=o.status==="error"&&_===D;return c.jsxs("div",{className:`drawer__step${L?" is-active":""}${Y?" is-done":""}${I?" is-error":""}`,children:[c.jsx("span",{className:"drawer__step-dot",children:Y?"✓":I?"!":_+1}),c.jsx("span",{className:"drawer__step-label",children:j}),_<Xs.length-1&&c.jsx("span",{className:"drawer__step-bar"})]},H)})}),R.length>0&&c.jsx("div",{className:"drawer__dlbars","data-id":"DockerDrawer-dlbars",children:R.map(H=>c.jsx(sg,{phaseKey:H,bar:o.bars[H]},H))}),r&&o.logs.length>0&&c.jsxs("div",{className:"drawer__now","data-id":"DockerDrawer-now",children:[c.jsx(Ce,{}),c.jsx("span",{children:o.logs[o.logs.length-1].message})]}),c.jsx("div",{className:"drawer__log drawer__log--scroll","data-id":"DockerDrawer-log",ref:T,children:o.logs.length===0?c.jsx("div",{className:"drawer__log-empty",children:v("docker.preparing","准备中…")}):o.logs.map(H=>c.jsxs("div",{className:"drawer__line","data-status":H.status,children:[c.jsx("span",{className:"drawer__t",children:H.t}),c.jsx("span",{className:`drawer__badge drawer__badge--${H.phase}`,children:ug[H.phase]||H.phase}),c.jsx("span",{className:"drawer__linemsg",children:H.message})]},H.id))}),c.jsx("div",{className:"drawer__foot",children:r?c.jsx(c.Fragment,{children:c.jsx("span",{className:"drawer__foot-status",children:v("docker.installing2","安装进行中…")})}):o.status==="reboot"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-reboot",children:v("docker.rebootShort","需重启 Windows")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>o.onRetry(),children:v("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>ee.close(),children:v("common.close","关闭")})]}):o.status==="error"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-error",children:v("docker.failed","安装失败")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>o.onRetry(),children:v("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>ee.close(),children:v("common.close","关闭")})]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-done",children:v("docker.ready","已就绪")}),c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-finish",onClick:()=>ee.close(),children:v("common.done","完成")})]})})]})})}function rg({dockerTeam:o,cloudTitle:S,onOpen:T,onRename:r,onRefresh:D}){var ct;const[R,X]=E.useState(null),[H,j]=E.useState(""),[_,Y]=E.useState(!1),[L,I]=E.useState(!1),[tt,et]=E.useState(!1),[V,ft]=E.useState(""),Tt=S||"本地团队",st=U=>{var P;(P=U==null?void 0:U.stopPropagation)==null||P.call(U),ft(Tt),et(!0)},ht=async()=>{et(!1);const U=String(V||"").trim();if(!(!U||U===Tt||!r))try{await r(U),D==null||D()}catch{}},[yt,gt]=E.useState({top:0,left:0}),St=E.useRef(null),G=E.useRef(null),Nt=184,B="#2496ed",xt=E.useCallback(async()=>{var U,P,Z;try{X(await((Z=(P=(U=window.cicy)==null?void 0:U.docker)==null?void 0:P.appStatus)==null?void 0:Z.call(P)))}catch(vt){console.warn("[DockerCard]",vt)}},[]);E.useEffect(()=>{xt();const U=setInterval(()=>{H||xt()},12e3);return()=>clearInterval(U)},[xt,H]),E.useEffect(()=>{if(!_)return;const U=Z=>{var vt,Qt;(vt=St.current)!=null&&vt.contains(Z.target)||(Qt=G.current)!=null&&Qt.contains(Z.target)||Y(!1)},P=Z=>{Z.key==="Escape"&&Y(!1)};return document.addEventListener("mousedown",U),document.addEventListener("keydown",P),()=>{document.removeEventListener("mousedown",U),document.removeEventListener("keydown",P)}},[_]);const Ut=()=>{if(!_&&St.current){const U=St.current.getBoundingClientRect(),P=Math.max(8,Math.min(U.right-Nt,window.innerWidth-Nt-8));gt({top:Math.round(U.bottom+4),left:Math.round(P)})}Y(U=>!U)},Kt=E.useCallback(async()=>{var P,Z,vt,Qt,Xt,ce;j("bootstrap"),ee.open({onRetry:Kt});const U=(vt=(Z=(P=window.cicy)==null?void 0:P.docker)==null?void 0:Z.onAppProgress)==null?void 0:vt.call(Z,Q=>ee.push(Q));try{const Q=await((ce=(Xt=(Qt=window.cicy)==null?void 0:Qt.docker)==null?void 0:Xt.appBootstrap)==null?void 0:ce.call(Xt));(Q==null?void 0:Q.reason)==="installer_launched"?ee.finish({status:"reboot",message:v("docker.installerLaunched","已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」")}):(Q==null?void 0:Q.reason)==="wsl_reboot_required"?ee.finish({status:"reboot",message:v("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):ee.finish({ok:!!(Q!=null&&Q.ok),message:Q!=null&&Q.ok?v("docker.ready","Docker cicy-code 已就绪"):(Q==null?void 0:Q.error)||v("docker.failed","安装失败")}),Q!=null&&Q.ok&&(D==null||D())}catch(Q){ee.finish({ok:!1,message:Q.message})}finally{try{U&&U()}catch{}j(""),xt()}},[xt,D]),me=E.useCallback(async()=>{var P,Z,vt,Qt,Xt,ce;Y(!1),j("upgrade"),ee.open({onRetry:me});const U=(vt=(Z=(P=window.cicy)==null?void 0:P.docker)==null?void 0:Z.onAppProgress)==null?void 0:vt.call(Z,Q=>ee.push(Q));try{const Q=await((ce=(Xt=(Qt=window.cicy)==null?void 0:Qt.docker)==null?void 0:Xt.appUpgrade)==null?void 0:ce.call(Xt));(Q==null?void 0:Q.reason)==="wsl_reboot_required"?ee.finish({status:"reboot",message:v("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):ee.finish({ok:!!(Q!=null&&Q.ok),message:Q!=null&&Q.ok?v("docker.upgraded","已升级到最新"):(Q==null?void 0:Q.error)||v("docker.upgradeFailed","升级失败")}),Q!=null&&Q.ok&&(D==null||D())}catch(Q){ee.finish({ok:!1,message:Q.message})}finally{try{U&&U()}catch{}j(""),xt()}},[xt,D]),ue=E.useCallback(async()=>{var P,Z,vt,Qt,Xt,ce;Y(!1),j("update"),ee.open({onRetry:ue});const U=(vt=(Z=(P=window.cicy)==null?void 0:P.docker)==null?void 0:Z.onAppProgress)==null?void 0:vt.call(Z,Q=>ee.push(Q));try{const Q=await((ce=(Xt=(Qt=window.cicy)==null?void 0:Qt.docker)==null?void 0:Xt.appUpdate)==null?void 0:ce.call(Xt));ee.finish({ok:!!(Q!=null&&Q.ok),message:Q!=null&&Q.ok?v("docker.updated","cicy-code 已更新到最新"):(Q==null?void 0:Q.error)||v("docker.updateFailed","更新失败")}),Q!=null&&Q.ok&&(D==null||D())}catch(Q){ee.finish({ok:!1,message:Q.message})}finally{try{U&&U()}catch{}j(""),xt()}},[xt,D]),Rt=E.useCallback(async(U,P,Z)=>{Y(!1),j(U),de.show({id:"docker-op",message:v(`docker.${U}ing`,U==="restart"?"重启中…":U==="reload"?"刷新中…":"停止中…"),status:"running"});try{const vt=await P();vt!=null&&vt.ok?de.show({id:"docker-op",message:Z,status:"done",ttl:2500}):de.show({id:"docker-op",message:(vt==null?void 0:vt.error)||v("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(vt){de.show({id:"docker-op",message:vt.message,status:"error",ttl:6e3})}finally{j(""),xt()}},[xt]),y=((ct=window.cicy)==null?void 0:ct.platform)||(R==null?void 0:R.platform);if(y!=="win32"&&y!=="darwin")return null;const O=!!(R!=null&&R.running)||(o==null?void 0:o.status)==="running",$=!!(R!=null&&R.dockerRunning),ot=!!(R!=null&&R.installed),_t=!!(R!=null&&R.unknown)&&!O&&!$&&!ot,d=O?"ok":$||ot||_t?"warn":"off",C=!!H;O?v("docker.running","运行中"):$?v("docker.notRunning","未启动 · 点「启动」"):ot?v("docker.engineDown","Docker 未运行 · 点启动"):_t?v("docker.wslUnresponsive","WSL 未响应 · 点「重试检测」"):v("docker.notInstalled","Docker Desktop 未安装");const q=H==="open"?v("docker.opening","打开中…"):H==="probe"?v("docker.probing","检测中…"):C?v("docker.working","处理中…"):O?v("localTeams.open","打开"):$?v("docker.start","启动"):ot?v("docker.startDocker","启动 Docker"):_t?v("docker.retryProbe","重试检测"):v("docker.install","下载安装"),K=async()=>{var U,P,Z,vt,Qt,Xt,ce,Q,ye;if(!C){if(O){try{const ae=await((Z=(P=(U=window.cicy)==null?void 0:U.tabs)==null?void 0:P.activateIfOpen)==null?void 0:Z.call(P,"http://127.0.0.1:8008"));if(ae!=null&&ae.active)return}catch{}j("open");try{await(T==null?void 0:T(o==null?void 0:o.id))}finally{j("")}return}if(_t){j("probe");try{const ae=await(((Xt=(Qt=(vt=window.cicy)==null?void 0:vt.docker)==null?void 0:Qt.appRedetect)==null?void 0:Xt.call(Qt))??((ye=(Q=(ce=window.cicy)==null?void 0:ce.docker)==null?void 0:Q.appStatus)==null?void 0:ye.call(Q)));ae&&X(ae),ae!=null&&ae.unknown&&de.show({id:"docker-probe",status:"error",message:v("docker.wslStillStuck","WSL 仍无响应 —— 多半要重启 Windows 后再试"),ttl:6e3})}catch{de.show({id:"docker-probe",status:"error",message:v("docker.probeFailed","检测失败,请重试"),ttl:5e3})}finally{j("")}return}Kt()}},it=O;return c.jsxs("div",{"data-id":"DockerCard",className:`bcard bcard--docker${O?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent",style:{background:B}}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",style:{color:B},children:[c.jsx("span",{className:"bcard__dot","data-tone":d}),c.jsx("svg",{style:{width:18,height:18},viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:c.jsx("path",{d:"M21.81 10.25c-.06-.05-.67-.51-1.95-.51-.34 0-.68.03-1.01.09-.25-1.69-1.64-2.51-1.7-2.55l-.34-.2-.22.32a4.5 4.5 0 0 0-.59 1.4c-.23.94-.09 1.83.39 2.59-.58.32-1.51.4-1.7.41H2.62a.61.61 0 0 0-.61.61 9.32 9.32 0 0 0 .57 3.35 4.9 4.9 0 0 0 1.95 2.53c.92.52 2.42.82 4.12.82.77 0 1.54-.07 2.3-.21a9.6 9.6 0 0 0 3-1.09 8.3 8.3 0 0 0 2.05-1.68c.98-1.11 1.56-2.35 1.99-3.45h.17c1.36 0 2.2-.55 2.66-1l.13-.16zM4.7 11.33h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H4.7a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.46 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16M7.16 9.06h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16"})})]}),it&&c.jsxs("div",{className:"bcard__menuwrap",onClick:U=>U.stopPropagation(),children:[c.jsx("button",{type:"button",ref:St,"data-id":"DockerCard-menu-btn",className:"bcard__kebab",title:v("docker.manage","管理 Docker cicy-code"),disabled:C,onClick:Ut,children:C?c.jsx(Ce,{}):c.jsx(Ps,{})}),_&&cn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"DockerCard-menu",role:"menu",ref:G,style:{position:"fixed",top:yt.top,left:yt.left,width:Nt},onClick:U=>U.stopPropagation(),children:[c.jsx("button",{type:"button","data-id":"DockerCard-update",className:"bcard__menu-item is-accent",onClick:ue,children:v("docker.update","更新")}),c.jsx("button",{type:"button","data-id":"DockerCard-reload",className:"bcard__menu-item",onClick:U=>{var P,Z,vt;U.stopPropagation(),Y(!1),(vt=(Z=(P=window.cicy)==null?void 0:P.tabs)==null?void 0:Z.reloadIfOpen)==null||vt.call(Z,"http://127.0.0.1:8008",Tt)},children:v("docker.reloadWindow","刷新窗口")}),c.jsx("button",{type:"button","data-id":"DockerCard-restart",className:"bcard__menu-item",onClick:()=>Rt("restart",()=>window.cicy.docker.appRestart(),v("docker.restarted","已重启 cicy-code")),children:v("docker.restart","重启 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-docker-restart",className:"bcard__menu-item",onClick:()=>Rt("restart",()=>window.cicy.docker.appDockerRestart(),v("docker.dockerRestarted","已重启 Docker 容器")),children:v("docker.dockerRestart","重启 Docker")}),c.jsx("button",{type:"button","data-id":"DockerCard-recreate",className:"bcard__menu-item is-danger",onClick:U=>{U.stopPropagation(),Y(!1),I(!0)},children:v("docker.recreate","重建 Docker")}),c.jsx("button",{type:"button","data-id":"DockerCard-stop",className:"bcard__menu-item is-danger",onClick:()=>Rt("stop",()=>window.cicy.docker.appStop(),v("docker.stopped","已停止 cicy-code")),children:v("docker.stop","停止")}),c.jsx("button",{type:"button","data-id":"DockerCard-billing",className:"bcard__menu-item",onClick:()=>{Y(!1),ni(o!=null&&o.cloud_team_id?`?team=${encodeURIComponent(o.cloud_team_id)}`:"?view=usage")},children:v("docker.billing","帐单")}),c.jsx("button",{type:"button","data-id":"DockerCard-addr",className:"bcard__menu-item",title:v("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:U=>{U.stopPropagation(),Y(!1);try{navigator.clipboard.writeText("http://127.0.0.1:8008")}catch{}},children:"http://127.0.0.1:8008"})]}),document.body)]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:tt?c.jsx("input",{"data-id":"DockerCard-rename-input",autoFocus:!0,value:V,onChange:U=>ft(U.target.value),onFocus:U=>U.target.select(),onBlur:ht,onClick:U=>U.stopPropagation(),onKeyDown:U=>{U.nativeEvent.isComposing||U.keyCode===229||(U.key==="Enter"?ht():U.key==="Escape"&&et(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):c.jsxs("h3",{className:"bcard__name",title:r?v("localTeams.renameHint","点名字或 ✎ 改名"):Tt,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:r?st:void 0,children:[c.jsx("span",{onClick:r?st:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:r?"text":"default"},children:Tt}),r&&c.jsx("button",{type:"button","data-id":"DockerCard-rename-btn",title:v("localTeams.rename","重命名"),onClick:st,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsx("div",{className:"bcard__meta",children:c.jsx("span",{className:"bcard__chip",children:"Docker"})})]}),c.jsxs("button",{type:"button",className:"bcard__cta","data-id":"DockerCard-cta",disabled:C,onClick:K,style:O?void 0:{background:B,color:"white"},children:[C?c.jsx(Ce,{}):c.jsx(ju,{}),c.jsx("span",{children:q})]}),L&&cn.createPortal(c.jsx("div",{"data-id":"DockerCard-recreate-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onClick:()=>I(!1),children:c.jsxs("div",{onClick:U=>U.stopPropagation(),style:{width:360,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[c.jsx("h3",{style:{margin:"0 0 8px",fontSize:16,color:"#e6edf3"},children:v("docker.recreate","重建 Docker")}),c.jsx("p",{style:{margin:"0 0 18px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:v("docker.recreateConfirm","会删除当前容器并重新创建(volume 数据保留),用于切换为独立 team 的网关 key。确定重建?")}),c.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[c.jsx("button",{type:"button","data-id":"DockerCard-recreate-cancel",onClick:()=>I(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:v("common.cancel","取消")}),c.jsx("button",{type:"button","data-id":"DockerCard-recreate-confirm",onClick:()=>{I(!1),Rt("restart",()=>window.cicy.docker.appRecreate(),v("docker.recreated","已重建 Docker 容器"))},style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#da3633",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:v("docker.recreateOk","确定重建")})]})]})}),document.body)]})}function hm({team:o,onOpen:S,onRename:T,onRefresh:r}){var ce,Q,ye,ae;const R=(gm[o.status]||gm.error).tone,[X,H]=E.useState(!1),[j,_]=E.useState(o.name||""),[Y,L]=E.useState(null),[I,tt]=E.useState(""),et=Y??o.name;E.useEffect(()=>{Y!=null&&o.name===Y&&L(null)},[o.name,Y]);const V=J=>{var wt;(wt=J==null?void 0:J.stopPropagation)==null||wt.call(J),_(et||""),H(!0)},ft=async()=>{H(!1);const J=String(j||"").trim();if(!T||!J||J===et)return;L(J),tt("saving");let wt;try{wt=await T(o.id,J)}catch(rt){wt={ok:!1,error:rt==null?void 0:rt.message}}L(null),wt&&wt.ok?(tt("saved"),setTimeout(()=>tt(rt=>rt==="saved"?"":rt),1500)):(tt(""),de.show({message:v("localTeams.renameFailed","改名没保存,已恢复"),status:"error",ttl:4e3}))},st=!!((Q=(ce=window.cicy)==null?void 0:ce.sidecar)!=null&&Q.restart)&&Fs(o.base_url),ht=o.status==="running",[yt,gt]=E.useState(""),[St,G]=E.useState(!1),[Nt,B]=E.useState({running:void 0,latest:null,installed:null}),xt=Nt.latest,Ut=Nt.running,[Kt,me]=E.useState(!1),ue=E.useRef(null),Rt=E.useRef(null),y=E.useRef(null),[O,$]=E.useState({top:0,left:0}),ot=184,_t=()=>{if(!St&&Rt.current){const J=Rt.current.getBoundingClientRect(),wt=Math.max(8,Math.min(J.right-ot,window.innerWidth-ot-8));$({top:Math.round(J.bottom+4),left:Math.round(wt)})}G(J=>!J)},d=E.useCallback(async(J=!1)=>{var wt,rt;if(!(!st||!((rt=(wt=window.cicy)==null?void 0:wt.sidecar)!=null&&rt.versions))){J&&me(!0);try{const dt=await window.cicy.sidecar.versions();B({running:(dt==null?void 0:dt.running)??null,latest:(dt==null?void 0:dt.latest)??null,installed:(dt==null?void 0:dt.installed)??null}),J&&(dt!=null&&dt.running&&(dt!=null&&dt.latest)&&ym(dt.latest,dt.running)>0?de.show({message:`${v("sidecar.found","发现新版本")} v${dt.latest}`,status:"done",ttl:2500}):dt!=null&&dt.running?de.show({message:`${v("sidecar.upToDate","已是最新")} v${dt.running}`,status:"done",ttl:2500}):de.show({message:v("sidecar.notRunning","cicy-code 未运行"),status:"error",ttl:4e3}))}catch{J&&de.show({message:v("sidecar.checkFailed","检查更新失败"),status:"error",ttl:5e3})}finally{J&&me(!1)}}},[st]);E.useEffect(()=>{d(!1)},[d]),E.useEffect(()=>{ht&&d(!1)},[ht,d]);const C=!!(st&&xt&&Ut&&ym(xt,Ut)>0),q=!st&&!!((ae=(ye=window.cicy)==null?void 0:ye.localTeams)!=null&&ae.remove),K=st||q,[it,ct]=E.useState(!1);E.useEffect(()=>{if(!St)return;const J=wt=>{var rt,dt;(rt=Rt.current)!=null&&rt.contains(wt.target)||(dt=y.current)!=null&&dt.contains(wt.target)||G(!1)};return document.addEventListener("mousedown",J),()=>document.removeEventListener("mousedown",J)},[St]),E.useEffect(()=>{St||ct(!1)},[St]);const U=async()=>{var J,wt,rt;if(!it){ct(!0);return}if(G(!1),ct(!1),!yt){gt("remove");try{await((rt=(wt=(J=window.cicy)==null?void 0:J.localTeams)==null?void 0:wt.remove)==null?void 0:rt.call(wt,o.id))}catch{}gt(""),r==null||r()}},P=`sidecar-op:${o.id}`,Z=async(J,wt,rt)=>{var Pa,Ca,ge,Ea,w;if(G(!1),yt)return;gt(J);const dt=J==="update";let aa=null;dt?(ca.open({teamId:o.id,fromVer:Ut,toVer:xt,onRetry:()=>Z("update",wt,rt)}),(Ca=(Pa=window.cicy)==null?void 0:Pa.sidecar)!=null&&Ca.onOpProgress&&(aa=window.cicy.sidecar.onOpProgress(M=>{(M==null?void 0:M.op)==="update"&&ca.push(M)}))):de.show({id:P,message:vt[J]||`${J}…`,status:"running",progress:void 0});try{const M=await wt(),k=!!(M!=null&&M.ok),lt=M!=null&&M.warning?`${rt}(${M.warning})`:rt,nt=v("sidecar.failed","操作失败")+(M!=null&&M.error?`: ${M.error}`:"");if(dt){if(ca.finish({ok:k,message:k?lt:nt}),k)try{await((w=(Ea=(ge=window.cicy)==null?void 0:ge.localTeams)==null?void 0:Ea.reload)==null?void 0:w.call(Ea,o.id,{ignoreCache:!0}))}catch{}}else de.show({id:P,message:k?lt:nt,progress:void 0,status:k?"done":"error",ttl:k?4e3:8e3})}catch(M){const k=v("sidecar.failed","操作失败")+`: ${(M==null?void 0:M.message)||M}`;dt?ca.finish({ok:!1,message:k}):de.show({id:P,message:k,progress:void 0,status:"error",ttl:8e3})}finally{try{aa&&aa()}catch{}gt(""),r==null||r(),(J==="update"||J==="restart"||J==="start")&&d(!1)}},vt={start:"启动中…",restart:"重启中…",update:"更新中…",stop:"停止中…"},Qt=async()=>{var J,wt;if(!yt){if(!ht&&st&&((wt=(J=window.cicy)==null?void 0:J.sidecar)!=null&&wt.start)){gt("start"),de.show({id:P,message:vt.start,status:"running",progress:void 0});const rt=await window.cicy.sidecar.start().catch(dt=>({ok:!1,error:(dt==null?void 0:dt.message)||String(dt)}));if(gt(""),r==null||r(),!(rt!=null&&rt.ok)||rt!=null&&rt.warning){de.show({id:P,message:v("sidecar.startFailed","启动失败")+(rt!=null&&rt.error?`: ${rt.error}`:rt!=null&&rt.warning?`: ${rt.warning}`:""),status:"error",ttl:8e3});return}de.dismiss(P)}S()}},Xt=ht?v("localTeams.open","打开"):st?v("localTeams.startOpen","启动并打开"):v("localTeams.open","打开");return c.jsxs("div",{"data-id":"LocalTeamCard",className:`bcard ${st?"bcard--local":"bcard--custom"}${R==="ok"?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent"}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":R}),c.jsx(jm,{})]}),K&&c.jsxs("div",{className:"bcard__menuwrap",ref:ue,onClick:J=>J.stopPropagation(),children:[c.jsx("button",{type:"button",ref:Rt,"data-id":"LocalTeamCard-menu-btn",className:`bcard__kebab${C?" has-dot":""}`,title:st?v("localTeams.manage","管理本地 cicy-code"):v("localTeams.more","更多"),disabled:!!yt,onClick:_t,children:yt?c.jsx(Ce,{}):c.jsx(Ps,{})}),St&&cn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"LocalTeamCard-menu",role:"menu",ref:y,style:{position:"fixed",top:O.top,left:O.left,width:ot},onClick:J=>J.stopPropagation(),children:[st&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-check-update",className:"bcard__menu-item",disabled:Kt,onClick:J=>{J.stopPropagation(),d(!0)},children:Kt?v("sidecar.checking2","检查中…"):v("sidecar.checkUpdate","检查更新")}),C&&c.jsxs("button",{type:"button","data-id":"LocalTeamCard-update",className:"bcard__menu-item is-accent",onClick:()=>Z("update",()=>window.cicy.sidecar.update(),v("sidecar.updated","已更新到最新")),children:[v("sidecar.updateTo","更新到")," v",xt]}),o.base_url&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-reload",className:"bcard__menu-item",onClick:J=>{var wt,rt,dt;J.stopPropagation(),G(!1),(dt=(rt=(wt=window.cicy)==null?void 0:wt.tabs)==null?void 0:rt.reloadIfOpen)==null||dt.call(rt,o.base_url,o.name)},children:v("localTeams.reloadWindow","刷新窗口")}),st&&ht&&c.jsxs(c.Fragment,{children:[c.jsx("button",{type:"button","data-id":"LocalTeamCard-restart",className:"bcard__menu-item",onClick:()=>Z("restart",()=>window.cicy.sidecar.restart(),v("sidecar.restarted","已重启")),children:v("sidecar.restart","重启")}),c.jsx("button",{type:"button","data-id":"LocalTeamCard-stop",className:"bcard__menu-item is-danger",onClick:()=>Z("stop",()=>window.cicy.sidecar.stop(),v("sidecar.stoppedDone","已停止")),children:v("sidecar.stop","停止")})]}),o.cloud_team_id&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-billing",className:"bcard__menu-item",onClick:J=>{J.stopPropagation(),G(!1),ni(`?team=${encodeURIComponent(o.cloud_team_id)}`)},children:v("localTeams.billing","账单")}),q&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-remove",className:"bcard__menu-item is-danger",onClick:U,children:it?v("localTeams.removeConfirm","确认删除?"):v("localTeams.remove","删除")}),c.jsx("button",{type:"button","data-id":"LocalTeamCard-addr",className:"bcard__menu-item",title:v("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:J=>{J.stopPropagation(),G(!1);try{navigator.clipboard.writeText(o.base_url||"")}catch{}},children:o.base_url||"—"}),(Ut||o.version)&&c.jsxs("div",{"data-id":"LocalTeamCard-version",className:"bcard__menu-item",style:{cursor:"default",color:"#8b949e",fontSize:12},children:[v("localTeams.version","版本")," v",Ut||o.version]})]}),document.body)]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:X?c.jsx("input",{"data-id":"LocalTeamCard-rename-input",autoFocus:!0,value:j,onChange:J=>_(J.target.value),onFocus:J=>J.target.select(),onBlur:ft,onClick:J=>J.stopPropagation(),onKeyDown:J=>{J.nativeEvent.isComposing||J.keyCode===229||(J.key==="Enter"?ft():J.key==="Escape"&&H(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):c.jsxs("h3",{className:"bcard__name",title:v("localTeams.renameHint","点名字或 ✎ 改名"),style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:V,children:[c.jsx("span",{"data-id":"LocalTeamCard-name-text",onClick:V,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"text"},children:et}),I==="saving"&&c.jsx("span",{"data-id":"LocalTeamCard-save-state",title:v("localTeams.saving","保存中…"),style:{flex:"none",display:"inline-flex"},children:c.jsx(Ce,{})}),I==="saved"&&c.jsx("span",{"data-id":"LocalTeamCard-save-state",title:v("localTeams.saved","已保存"),style:{flex:"none",color:"#3fb950",fontSize:13,lineHeight:1},children:"✓"}),!I&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-rename-btn",title:v("localTeams.rename","重命名"),onClick:V,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsx("div",{className:"bcard__meta",children:c.jsx("span",{className:"bcard__chip","data-id":"LocalTeamCard-kind",children:st?v("localTeams.kindLocal","本地"):v("localTeams.kindCustom","自定义")})})]}),c.jsxs("button",{type:"button",className:"bcard__cta","data-id":"LocalTeamCard-open",disabled:!!yt||!o.base_url,onClick:Qt,children:[yt&&yt!=="stop"?c.jsx(Ce,{}):c.jsx(ju,{}),c.jsx("span",{children:yt&&vt[yt]||Xt})]})]})}function Fs(o){try{const S=new URL(o);return(S.hostname==="127.0.0.1"||S.hostname==="localhost"||S.hostname==="::1")&&(S.port==="8008"||S.port==="")}catch{return!1}}function Zs(o){try{const S=new URL(o);return(S.hostname==="127.0.0.1"||S.hostname==="localhost"||S.hostname==="::1")&&S.port==="8008"}catch{return!1}}function ym(o,S){const T=String(o).split("."),r=String(S).split(".");for(let D=0;D<Math.max(T.length,r.length);D++){const R=(parseInt(T[D],10)||0)-(parseInt(r[D],10)||0);if(R)return R>0?1:-1}return 0}const gm={running:{tone:"ok",label:"running",cta:"打开"},stopped:{tone:"off",label:"stopped",cta:"未运行"},auth_error:{tone:"warn",label:"auth error",cta:"Token 失效"},misconfigured:{tone:"err",label:"bad config",cta:"URL 错误"},error:{tone:"err",label:"error",cta:"异常"}};function fg({team:o,onOpen:S,onRename:T}){const r=o.kind==="private",D=o.status==="active",R=o.name||o.title||"—",[X,H]=E.useState(!1),[j,_]=E.useState(""),[Y,L]=E.useState(null),I=Y??R;E.useEffect(()=>{Y!=null&&R===Y&&L(null)},[R,Y]);const tt=y=>{var O;(O=y==null?void 0:y.stopPropagation)==null||O.call(y),_(I==="—"?"":I),H(!0)},et=async()=>{H(!1);const y=String(j||"").trim();if(!(!T||!y||y===I)){L(y);try{const O=await T(o.id,y);O!=null&&O.ok||L(null)}catch{L(null)}}},V=o.host_url||"",ft=o.teamId||o.id,Tt=r?"私有云":o.team_kind==="personal"?"个人":"共享",st=r?V:o.workspace_url||o.workspace_direct_url,ht=!!st,[yt,gt]=E.useState(!1),[St,G]=E.useState(!1),[Nt,B]=E.useState({top:0,left:0}),xt=E.useRef(null),Ut=E.useRef(null),Kt=E.useRef(null),me=184,ue=()=>{if(!yt&&Ut.current){const y=Ut.current.getBoundingClientRect(),O=Math.max(8,Math.min(y.right-me,window.innerWidth-me-8));B({top:Math.round(y.bottom+4),left:Math.round(O)})}gt(y=>!y)};E.useEffect(()=>{if(!yt)return;const y=O=>{var $,ot;($=Ut.current)!=null&&$.contains(O.target)||(ot=Kt.current)!=null&&ot.contains(O.target)||gt(!1)};return document.addEventListener("mousedown",y),()=>document.removeEventListener("mousedown",y)},[yt]);const Rt=y=>{var O,$,ot,_t;(O=y==null?void 0:y.stopPropagation)==null||O.call(y),ht&&(gt(!1),(_t=(ot=($=window.cicy)==null?void 0:$.tabs)==null?void 0:ot.reloadIfOpen)==null||_t.call(ot,st,I))};return c.jsxs("div",{"data-id":"TeamCard",className:`bcard bcard--cloud${D?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent"}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":D?"ok":"off"}),c.jsx(dg,{})]}),c.jsxs("div",{className:"bcard__top-right",children:[o.is_trial&&c.jsx("span",{className:"bcard__badge",children:"trial"}),(ht||ft!=null)&&c.jsxs("div",{className:"bcard__menuwrap",ref:xt,onClick:y=>y.stopPropagation(),children:[c.jsx("button",{type:"button",ref:Ut,"data-id":"TeamCard-menu-btn",className:"bcard__kebab",title:v("localTeams.more","更多"),disabled:St,onClick:ue,children:St?c.jsx(Ce,{}):c.jsx(Ps,{})}),yt&&cn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"TeamCard-menu",role:"menu",ref:Kt,style:{position:"fixed",top:Nt.top,left:Nt.left,width:me},onClick:y=>y.stopPropagation(),children:[ht&&c.jsx("button",{type:"button","data-id":"TeamCard-reload",className:"bcard__menu-item",onClick:Rt,children:v("localTeams.reloadWindow","刷新窗口")}),ft!=null&&c.jsx("button",{type:"button","data-id":"TeamCard-billing",className:"bcard__menu-item",onClick:y=>{y.stopPropagation(),gt(!1),ni(`?team=${encodeURIComponent(ft)}`)},children:v("localTeams.billing","账单")}),ht&&c.jsx("button",{type:"button","data-id":"TeamCard-addr",className:"bcard__menu-item",title:v("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:y=>{y.stopPropagation(),gt(!1);try{navigator.clipboard.writeText(st||V||"")}catch{}},children:r?V||st:st||o.runtime_region||o.region||"—"})]}),document.body)]})]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:X?c.jsx("input",{"data-id":"TeamCard-rename-input",autoFocus:!0,value:j,onChange:y=>_(y.target.value),onFocus:y=>y.target.select(),onBlur:et,onClick:y=>y.stopPropagation(),onKeyDown:y=>{y.nativeEvent.isComposing||y.keyCode===229||(y.key==="Enter"?et():y.key==="Escape"&&H(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):c.jsxs("h3",{className:"bcard__name",title:T?v("localTeams.renameHint","点名字或 ✎ 改名"):I,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:T?tt:void 0,children:[c.jsx("span",{onClick:T?tt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:T?"text":"default"},children:I}),T&&c.jsx("button",{type:"button","data-id":"TeamCard-rename-btn",title:v("localTeams.rename","重命名"),onClick:tt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsxs("div",{className:"bcard__meta",children:[c.jsx("span",{className:"bcard__chip",children:Tt}),!r&&o.membership_status&&o.membership_status!=="active"&&c.jsx("span",{className:"bcard__chip",children:o.membership_status})]})]}),c.jsxs("button",{type:"button",className:"bcard__cta",onClick:S,disabled:!ht,children:[c.jsx(ju,{}),c.jsx("span",{children:ht?v("localTeams.open","打开"):r?v("teamCard.noHost","未填访问地址"):v("teamCard.noUrl","无 URL")})]})]})}function Vs(){return c.jsxs("div",{className:"brand",children:[c.jsx("div",{className:"brand-mark",children:c.jsx(Tm,{})}),c.jsxs("div",{className:"brand-text",children:[c.jsx("div",{className:"brand-name",children:"CiCy Desktop"}),c.jsx("div",{className:"brand-sub",children:"团队 AI 协作工作台"})]})]})}function Tm(){return c.jsx("svg",{width:"22",height:"22",viewBox:"0 0 96 96",fill:"none",children:c.jsx("path",{d:"M48 11L39.5 33.3L16 29.5L31 48L16 66.5L39.5 62.7L48 85L56.5 62.7L80 66.5L65 48L80 29.5L56.5 33.3Z",fill:"white",stroke:"white",strokeWidth:"8",strokeLinejoin:"round",strokeLinecap:"round"})})}function ju(){return c.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),c.jsx("polyline",{points:"12 5 19 12 12 19"})]})}function Ce(){return c.jsx("svg",{className:"spin",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.4",strokeLinecap:"round",children:c.jsx("path",{d:"M21 12a9 9 0 1 1-6.2-8.55"})})}function jm(){return c.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),c.jsx("line",{x1:"2",y1:"20",x2:"22",y2:"20"})]})}function Ps(){return c.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[c.jsx("circle",{cx:"12",cy:"5",r:"1.7"}),c.jsx("circle",{cx:"12",cy:"12",r:"1.7"}),c.jsx("circle",{cx:"12",cy:"19",r:"1.7"})]})}function dg(){return c.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("circle",{cx:"12",cy:"12",r:"10"}),c.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),c.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}function ai(o){try{return localStorage.getItem(o)||null}catch{return null}}function Ks(o){return o?/timeout/i.test(o)?"登录超时,请重新点击 Login。":/state/i.test(o)?"校验失败,请重新登录。":/no token/i.test(o)?"登录未完成,请重试。":/bridge missing/i.test(o)?"无法连接到登录服务(preload 未就绪)。":o:""}var pm;const mg=((pm=window.cicy)==null?void 0:pm.platform)||(()=>{const o=navigator.userAgent||"";return/Mac/i.test(o)?"darwin":/Windows/i.test(o)?"win32":"linux"})();document.documentElement.dataset.platform=mg;document.documentElement.dataset.fullscreen="0";var vm,bm;(bm=(vm=window.cicy)==null?void 0:vm.window)!=null&&bm.onFullscreen&&window.cicy.window.onFullscreen(o=>{document.documentElement.dataset.fullscreen=o?"1":"0"});Wy.createRoot(document.getElementById("root")).render(c.jsx(ag,{}));
|
|
377
|
+
`)}const v=(o,S)=>{var T,r;try{const D=(r=(T=window.cicyI18n)==null?void 0:T.t)==null?void 0:r.call(T,o);return D&&D!==o?D:S}catch{return S}},ln="cicy_token",_u="cicy_access_token",xu="cicy_user_id",li="https://cicy-ai.com";async function ni(o){var S,T,r;try{(r=(T=(S=window.cicy)==null?void 0:S.shell)==null?void 0:T.openExternal)==null||r.call(T,`${li}/dash${o}`)}catch{}}const Js=new Set;let Py=0,Ia=[];const ei=new Map;function rm(){Js.forEach(o=>o(Ia))}const de={show(o={}){const S=o.id||`t${++Py}`,T=Ia.find(R=>R.id===S),r={id:S,status:"running",...T,...o};Ia=T?Ia.map(R=>R.id===S?r:R):[...Ia,r],rm();const D=ei.get(S);return D&&(clearTimeout(D),ei.delete(S)),o.ttl&&ei.set(S,setTimeout(()=>de.dismiss(S),o.ttl)),S},dismiss(o){Ia=Ia.filter(T=>T.id!==o);const S=ei.get(o);S&&(clearTimeout(S),ei.delete(o)),rm()}};function tg(){const[o,S]=E.useState(Ia);return E.useEffect(()=>(Js.add(S),()=>{Js.delete(S)}),[]),o.length?c.jsx("div",{className:"toast-host","data-id":"ToastHost",children:o.map(T=>c.jsxs("div",{className:"toast","data-id":`Toast-${T.id}`,"data-status":T.status||"running",children:[c.jsx("button",{type:"button",className:"toast__x","data-id":"Toast-dismiss",onClick:()=>de.dismiss(T.id),"aria-label":"dismiss",children:"×"}),c.jsxs("span",{className:"toast__msg",children:[T.message,Number.isFinite(T.progress)?` ${T.progress}%`:""]}),Number.isFinite(T.progress)&&c.jsx("span",{className:"toast__bar",children:c.jsx("span",{style:{width:`${Math.min(100,T.progress)}%`}})})]},T.id))}):null}const Ws=new Set;let fm=0,ie=null;function nn(){Ws.forEach(o=>o(ie))}function Tu(){return new Date().toTimeString().slice(0,8)}const ca={open({teamId:o,fromVer:S,toVer:T,onRetry:r}={}){ie={teamId:o,fromVer:S||null,toVer:T||null,status:"running",phase:"download",logs:[],onRetry:r||null,lastAt:Date.now()},nn()},push(o={}){if(!ie)return;const S={id:++fm,t:Tu(),phase:o.phase||ie.phase,status:o.status||"running",message:o.message||""};ie={...ie,phase:o.phase||ie.phase,toVer:o.toVer||ie.toVer,logs:[...ie.logs,S],lastAt:Date.now()},nn()},minimize(){ie&&(ie={...ie,minimized:!0},nn())},restore(){ie&&(ie={...ie,minimized:!1},nn())},finish({ok:o,message:S}={}){if(!ie)return;const T=o?"done":"error",r={id:++fm,t:Tu(),phase:"done",status:T,message:S||(o?"更新完成":"更新失败")};ie={...ie,status:T,phase:"done",minimized:!1,logs:[...ie.logs,r],lastAt:Date.now()},nn()},close(){ie=null,nn()}},Qs=[["download","下载"],["swap","切换"],["done","完成"]];function eg(){var H;const[o,S]=E.useState(ie);E.useEffect(()=>(Ws.add(S),()=>{Ws.delete(S)}),[]);const T=E.useRef(null);E.useEffect(()=>{const j=T.current;j&&(j.scrollTop=j.scrollHeight)},[(H=o==null?void 0:o.logs)==null?void 0:H.length]);const[r,D]=E.useState(!1);if(E.useEffect(()=>{if(!o||o.status!=="running"){D(!1);return}const j=setInterval(()=>D(Date.now()-(o.lastAt||0)>25e3),3e3);return()=>clearInterval(j)},[o==null?void 0:o.lastAt,o==null?void 0:o.status]),!o)return null;const R=o.status==="running",X=Qs.findIndex(([j])=>j===o.phase);return o.minimized?c.jsxs("button",{type:"button",className:`drawer-min drawer-min--${o.status}`,"data-id":"UpdateDrawer-restore",onClick:()=>ca.restore(),children:[c.jsx("span",{className:"drawer-min__spark",children:R?c.jsx(Ce,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("span",{className:"drawer-min__label",children:["更新 cicy-code",o.toVer?` · v${o.toVer}`:""]})]}):c.jsx("div",{className:"drawer-scrim","data-id":"UpdateDrawer-scrim",onClick:()=>R?ca.minimize():ca.close(),children:c.jsxs("div",{className:"drawer","data-id":"UpdateDrawer","data-status":o.status,onClick:j=>j.stopPropagation(),children:[c.jsxs("div",{className:"drawer__head",children:[c.jsxs("div",{className:"drawer__title",children:[c.jsx("span",{className:`drawer__spark drawer__spark--${o.status}`,children:R?c.jsx(Ce,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("div",{children:[c.jsx("div",{className:"drawer__h",children:"更新 cicy-code"}),c.jsxs("div",{className:"drawer__sub",children:[o.fromVer?`v${o.fromVer}`:"当前"," → ",o.toVer?`v${o.toVer}`:"最新版"]})]})]}),c.jsx("div",{className:"drawer__headbtns",children:c.jsx("button",{type:"button",className:"drawer__x","data-id":"UpdateDrawer-min",title:"最小化",onClick:()=>ca.minimize(),"aria-label":"minimize",children:"‒"})})]}),c.jsx("div",{className:"drawer__steps","data-id":"UpdateDrawer-steps",children:Qs.map(([j,_],Y)=>{const L=o.status==="done"||Y<X,I=Y===X&&R,tt=o.status==="error"&&Y===X;return c.jsxs("div",{className:`drawer__step${I?" is-active":""}${L?" is-done":""}${tt?" is-error":""}`,children:[c.jsx("span",{className:"drawer__step-dot",children:L?"✓":tt?"!":Y+1}),c.jsx("span",{className:"drawer__step-label",children:_}),Y<Qs.length-1&&c.jsx("span",{className:"drawer__step-bar"})]},j)})}),c.jsx("div",{className:"drawer__log","data-id":"UpdateDrawer-log",ref:T,children:o.logs.length===0?c.jsx("div",{className:"drawer__log-empty",children:"准备中…"}):o.logs.map(j=>c.jsxs("div",{className:"drawer__line","data-status":j.status,children:[c.jsx("span",{className:"drawer__t",children:j.t}),c.jsx("span",{className:`drawer__badge drawer__badge--${j.phase}`,children:{download:"下载",swap:"切换",done:"完成"}[j.phase]||j.phase}),c.jsx("span",{className:"drawer__linemsg",children:j.message})]},j.id))}),r&&R&&c.jsx("div",{className:"drawer__hint","data-id":"UpdateDrawer-stuck",children:"正在等待新版本就绪,耗时比平常久。可以放到后台继续,完成或失败都会提示。"}),c.jsx("div",{className:"drawer__foot",children:R?c.jsx(c.Fragment,{children:c.jsx("span",{className:"drawer__foot-status",children:"更新进行中…"})}):o.status==="error"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-error",children:"更新失败"}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-retry",onClick:()=>o.onRetry(),children:"重试"}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"UpdateDrawer-dismiss",onClick:()=>ca.close(),children:"关闭"})]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-done",children:"已更新到最新"}),c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"UpdateDrawer-finish",onClick:()=>ca.close(),children:"完成"})]})})]})})}function ag(){const[o,S]=E.useState(void 0);E.useEffect(()=>{var w,M;if(!((M=(w=window.cicy)==null?void 0:w.terms)!=null&&M.status)){S(!0);return}window.cicy.terms.status(_m).then(k=>S(!!(k!=null&&k.accepted))).catch(()=>S(!0))},[]),E.useEffect(()=>{var k,lt,nt,Zt;const w=document.documentElement;try{w.setAttribute("data-platform",((k=window.cicy)==null?void 0:k.platform)||"linux")}catch{}w.setAttribute("data-fullscreen","0");let M;try{M=(Zt=(nt=(lt=window.cicy)==null?void 0:lt.window)==null?void 0:nt.onFullscreen)==null?void 0:Zt.call(nt,Bt=>w.setAttribute("data-fullscreen",Bt?"1":"0"))}catch{}return()=>{try{M&&M()}catch{}}},[]);const[T,r]=E.useState(()=>ai(ln)),[D,R]=E.useState(()=>ai(_u)),[X,H]=E.useState(()=>ai(xu)),[j,_]=E.useState(()=>!ai(ln)),[Y,L]=E.useState(!1),[I,tt]=E.useState(""),[et,V]=E.useState(""),[ft,Tt]=E.useState(!1),[st,ht]=E.useState("");E.useEffect(()=>{var w,M,k;(k=(M=(w=window.cicy)==null?void 0:w.app)==null?void 0:M.getVersion)==null||k.call(M).then(lt=>ht(lt&<.desktop||"")).catch(()=>{})},[]);const[yt,gt]=E.useState(""),[St,G]=E.useState(""),[Nt,B]=E.useState(null),[xt,Ut]=E.useState(null),[Kt,me]=E.useState(!1),[ue,Rt]=E.useState(""),y=E.useRef(!1),[O,$]=E.useState(null),[ot,_t]=E.useState(!1),[d,C]=E.useState(!1),[q,K]=E.useState("all"),it=E.useCallback(async(w,M)=>{var lt,nt,Zt,Bt;if(!w)return;if(!((nt=(lt=window.cicy)==null?void 0:lt.cloud)!=null&&nt.fetch)){Rt("cloud fetch bridge missing");return}me(!0),Rt("");const k={Authorization:`Bearer ${w}`};try{const[je,Vt]=await Promise.all([window.cicy.cloud.fetch(`${li}/api/user/self`,{headers:k}),window.cicy.cloud.fetch(`${li}/api/teams`,{headers:k})]);if((Vt==null?void 0:Vt.status)===401){if(!y.current&&((Bt=(Zt=window.cicy)==null?void 0:Zt.auth)!=null&&Bt.loginStart)){y.current=!0,Rt("会话已过期,正在重新登录…");try{await window.cicy.auth.loginStart()}catch{}}return}if(Vt!=null&&Vt.ok){const Ft=JSON.parse(Vt.body||"{}");Ut(Array.isArray(Ft==null?void 0:Ft.teams)?Ft.teams:[])}if(je!=null&&je.ok)try{const Ft=JSON.parse(je.body||"{}");B((Ft==null?void 0:Ft.success)===!1?null:(Ft==null?void 0:Ft.data)||null)}catch{B(null)}else B(null)}catch{Rt("")}finally{me(!1)}},[]),ct=E.useRef("");E.useEffect(()=>{ct.current=T||D||""},[T,D]);const U=E.useCallback(async()=>{var M,k;const w=ct.current;if(!(!w||!((k=(M=window.cicy)==null?void 0:M.cloud)!=null&&k.fetch)))try{const lt=await window.cicy.cloud.fetch(`${li}/api/teams`,{headers:{Authorization:`Bearer ${w}`}});if(lt!=null&<.ok){const nt=JSON.parse(lt.body||"{}");Array.isArray(nt==null?void 0:nt.teams)&&Ut(nt.teams)}}catch{}},[]),P=E.useCallback(async(w,M)=>{var nt,Zt;const k=ct.current,lt=String(M||"").trim();if(!k||!((Zt=(nt=window.cicy)==null?void 0:nt.cloud)!=null&&Zt.fetch)||!lt)return{ok:!1,error:"no session / empty"};try{const Bt=await window.cicy.cloud.fetch(`${li}/api/teams/${w}`,{method:"PATCH",headers:{Authorization:`Bearer ${k}`,"Content-Type":"application/json"},body:JSON.stringify({title:lt})});return Bt!=null&&Bt.ok?(await U(),{ok:!0}):{ok:!1,error:`${(Bt==null?void 0:Bt.status)||"?"} ${(Bt==null?void 0:Bt.error)||""}`}}catch(Bt){return{ok:!1,error:Bt.message}}},[U]);E.useEffect(()=>{const w=T||D;w&&it(w,X)},[T,D,X,it]);const Z=E.useCallback(async()=>{var w,M;if((M=(w=window.cicy)==null?void 0:w.localTeams)!=null&&M.list){_t(!0);try{const k=await window.cicy.localTeams.list({refresh:!0});$(Array.isArray(k)?k:[])}catch{$([])}finally{_t(!1),C(!0)}}},[]),vt=E.useCallback(async(w,M)=>{var lt,nt;if(!((nt=(lt=window.cicy)==null?void 0:lt.localTeams)!=null&&nt.update))return{ok:!1,error:"no_bridge"};let k;try{k=await window.cicy.localTeams.update(w,{name:String(M||"").trim()||v("localTeams.unnamed","未命名")})}catch(Zt){k={ok:!1,error:(Zt==null?void 0:Zt.message)||String(Zt)}}return await Z(),k||{ok:!1,error:"no_result"}},[Z]);E.useEffect(()=>{let w,M=!1;const k=3e3,lt=3e4,nt=async()=>{var je,Vt,Ft;try{await((Ft=(Vt=(je=window.cicy)==null?void 0:je.localTeams)==null?void 0:Vt.syncCloud)==null?void 0:Ft.call(Vt))}catch{}await Promise.all([Z(),U()])},Zt=()=>{if(M)return;const je=document.visibilityState==="visible";w=setTimeout(async()=>{document.visibilityState==="visible"?await nt():await Z(),Zt()},je?k:lt)};nt(),Zt();const Bt=()=>{document.visibilityState==="visible"&&nt()};return document.addEventListener("visibilitychange",Bt),window.addEventListener("focus",Bt),()=>{M=!0,clearTimeout(w),document.removeEventListener("visibilitychange",Bt),window.removeEventListener("focus",Bt)}},[Z,U]),E.useEffect(()=>{var M,k;if(!((k=(M=window.cicy)==null?void 0:M.localTeams)!=null&&k.onWebviewRelay))return;const w=window.cicy.localTeams.onWebviewRelay(async({reqId:lt,msg:nt})=>{let Zt={ok:!1,error:"unknown relay type"};try{(nt==null?void 0:nt.type)==="localTeams:add"?Zt=await window.cicy.localTeams.add(nt.spec||{}):(nt==null?void 0:nt.type)==="localTeams:remove"?Zt=await window.cicy.localTeams.remove(nt.id):(nt==null?void 0:nt.type)==="localTeams:update"?Zt=await window.cicy.localTeams.update(nt.id,nt.patch||{}):(nt==null?void 0:nt.type)==="localTeams:upgrade"?Zt=await window.cicy.localTeams.upgrade(nt.id):(nt==null?void 0:nt.type)==="localTeams:list"&&(Zt={ok:!0,teams:await window.cicy.localTeams.list({refresh:!0})}),Z()}catch(Bt){Zt={ok:!1,error:(Bt==null?void 0:Bt.message)||String(Bt)}}try{window.cicy.localTeams.replyWebviewRelay(lt,Zt)}catch{}});return()=>{try{w==null||w()}catch{}}},[Z]);const Qt=E.useCallback(async w=>{var M,k;if((k=(M=window.cicy)==null?void 0:M.localTeams)!=null&&k.open)try{await window.cicy.localTeams.open(w)}catch{}},[]);E.useEffect(()=>{var M,k;if(ai(ln)){_(!1);return}if(!((k=(M=window.cicy)==null?void 0:M.auth)!=null&&k.getSaved)){_(!1);return}let w=!1;return(async()=>{try{const lt=await window.cicy.auth.getSaved();if(w)return;if(lt!=null&<.token){try{localStorage.setItem(ln,lt.token)}catch{}if(r(lt.token),lt.accessToken){try{localStorage.setItem(_u,lt.accessToken)}catch{}R(lt.accessToken)}if(lt.userId){try{localStorage.setItem(xu,String(lt.userId))}catch{}H(String(lt.userId))}}}catch{}finally{w||_(!1)}})(),()=>{w=!0}},[]),E.useEffect(()=>{var w,M;if((M=(w=window.cicy)==null?void 0:w.auth)!=null&&M.onComplete)return window.cicy.auth.onComplete(k=>{if(L(!1),Tt(!1),k!=null&&k.error){gt(Ks(k.error));return}if(k!=null&&k.token){y.current=!1,Rt("");try{localStorage.setItem(ln,k.token)}catch{}if(r(k.token),k.accessToken){try{localStorage.setItem(_u,k.accessToken)}catch{}R(k.accessToken)}if(k.userId){try{localStorage.setItem(xu,String(k.userId))}catch{}H(String(k.userId))}gt(""),G(k.reused?"已恢复你之前的登录":"登录成功"),setTimeout(()=>G(""),3e3)}})},[]);async function Xt(){var M,k;if(!((k=(M=window.cicy)==null?void 0:M.auth)!=null&&k.loginStart)){gt("auth bridge missing");return}gt(""),L(!0);const w=await window.cicy.auth.loginStart();if(!(w!=null&&w.ok)){L(!1),gt(Ks((w==null?void 0:w.error)||"login start failed"));return}tt(w.url||"")}async function ce(){var k,lt;if(!((lt=(k=window.cicy)==null?void 0:k.auth)!=null&<.emailLoginStart)){gt("auth bridge missing");return}const w=et.trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(w)){gt(v("auth.badEmail","请输入有效的邮箱地址"));return}gt("");const M=await window.cicy.auth.emailLoginStart(w);if(!(M!=null&&M.ok)){gt(Ks((M==null?void 0:M.error)||"email login failed"));return}Tt(!0)}function Q(){var w,M,k;try{localStorage.removeItem(ln),localStorage.removeItem(_u),localStorage.removeItem(xu)}catch{}try{(k=(M=(w=window.cicy)==null?void 0:w.auth)==null?void 0:M.logout)==null||k.call(M)}catch{}r(null),R(null),H(null),B(null),Ut(null),gt(""),Rt("")}if(o===void 0)return c.jsxs("div",{className:"shell","data-id":"TermsCheckingSplash",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Vs,{}),c.jsx("div",{className:"spinner-row",children:c.jsx(Ce,{})})]})]});if(!o)return c.jsx(xm,{onAgree:()=>S(!0)});if(!T&&j)return c.jsxs("div",{className:"shell","data-id":"AuthRestoringSplash",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Vs,{}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(Ce,{}),c.jsx("span",{children:v("auth.restoring","正在恢复登录…")})]})]})]});if(!T)return c.jsxs("div",{className:"shell",children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"card",children:[c.jsx(Vs,{}),!Y&&!ft&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline",children:v("auth.tagline","登录以同步你的团队、配置与 AI 助手")}),c.jsx("label",{className:"login-label","data-id":"EmailLoginLabel",htmlFor:"cicy-email-login",children:v("auth.emailLabel","输入邮箱,用邮件链接登录")}),c.jsx("input",{id:"cicy-email-login",type:"email",className:"login-email-input","data-id":"EmailLoginInput",value:et,onChange:w=>V(w.target.value),onKeyDown:w=>{w.key==="Enter"&&ce()},placeholder:v("auth.emailPlaceholder","you@example.com"),autoComplete:"email",spellCheck:!1,autoFocus:!0}),c.jsxs("button",{className:"btn-primary","data-id":"EmailLoginSubmit",onClick:ce,children:[c.jsx("span",{children:v("auth.emailLogin","发送登录链接")}),c.jsx(ju,{})]}),c.jsx("p",{className:"hint",children:v("auth.emailHint","手机上点邮件里的链接,也能登录这台电脑")}),c.jsx("div",{className:"login-divider","data-id":"LoginDivider",children:c.jsx("span",{children:v("auth.or","或")})}),c.jsx("button",{className:"btn-ghost","data-id":"BrowserLoginBtn",onClick:Xt,children:v("auth.browserLogin","用浏览器登录(Google / SSO,仅同一台电脑)")})]}),ft&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline","data-id":"EmailSentTagline",children:v("auth.emailSentTagline","登录邮件已发送")}),c.jsxs("p",{className:"hint","data-id":"EmailSentHint",style:{textAlign:"center"},children:[v("auth.emailSentHint","到邮箱打开链接即可(手机、电脑都行),这里会自动登录。"),c.jsx("br",{}),et]}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(Ce,{}),c.jsx("span",{children:v("auth.emailWaiting","等待确认…")})]}),c.jsx("button",{className:"btn-ghost","data-id":"EmailSentCancel",onClick:()=>{var w,M,k;(k=(M=(w=window.cicy)==null?void 0:w.auth)==null?void 0:M.emailLoginCancel)==null||k.call(M),Tt(!1)},children:v("auth.cancel","取消")})]}),Y&&c.jsxs(c.Fragment,{children:[c.jsx("p",{className:"tagline",children:v("auth.waitingTagline","已在浏览器打开登录页,等待你完成…")}),c.jsxs("div",{className:"spinner-row",children:[c.jsx(Ce,{}),c.jsx("span",{children:v("auth.waitingCallback","等待回调")})]}),I&&c.jsxs("div",{className:"login-fallback","data-id":"LoginUrlFallback",style:{marginTop:10,textAlign:"center"},children:[c.jsx("p",{className:"hint",style:{marginBottom:6},children:v("auth.browserNotOpened","浏览器没自动打开?")}),c.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-open",onClick:()=>{var w,M,k;try{(k=(M=(w=window.cicy)==null?void 0:w.shell)==null?void 0:M.openExternal)==null||k.call(M,I)}catch{}},children:v("auth.openManually","手动打开登录页")}),c.jsx("button",{className:"btn-ghost","data-id":"LoginUrlFallback-copy",onClick:()=>{var w;try{(w=navigator.clipboard)==null||w.writeText(I),G(v("auth.linkCopied","链接已复制,粘到浏览器打开")),setTimeout(()=>G(""),2500)}catch{}},children:v("auth.copyLink","复制链接")}),c.jsx("p",{className:"hint","data-id":"LoginUrlFallback-url",style:{wordBreak:"break-all",marginTop:6,fontSize:11,opacity:.7,userSelect:"text"},children:I})]}),c.jsx("button",{className:"btn-ghost",onClick:()=>{var w,M,k;(k=(M=(w=window.cicy)==null?void 0:w.auth)==null?void 0:M.loginCancel)==null||k.call(M),L(!1),tt("")},children:v("auth.cancel","取消")})]}),yt&&c.jsx("div",{className:"error",children:yt})]})]});const ye=(O||[]).find(w=>Zs(w.base_url))||null,ae=ye&&ye.cloud_team_id?(xt||[]).find(w=>String(w.teamId||w.id)===String(ye.cloud_team_id)):null,J=(O||[]).filter(w=>Fs(w.base_url)),wt=(O||[]).filter(w=>!Fs(w.base_url)&&!Zs(w.base_url)),rt=J.length,dt=wt.length,aa=(xt||[]).filter(w=>!w.is_local&&w.kind!=="local"&&(w.kind==="private"||w.team_kind==="personal")),Pa=aa.length,Ca=q==="all"||q==="local",ge=q==="all"||q==="custom",Ea=q==="all"||q==="cloud";return c.jsxs("div",{className:"shell shell--app",children:[c.jsx("div",{className:"glow glow--app","aria-hidden":!0}),st&&c.jsxs("div",{"data-id":"VersionBadge",title:`CiCy Desktop v${st}`,style:{position:"fixed",bottom:8,right:12,fontSize:11,lineHeight:1,color:"rgba(255,255,255,0.4)",userSelect:"text",zIndex:60,pointerEvents:"none"},children:["v",st]}),c.jsxs("div",{className:"shell__left",children:[c.jsx(ig,{me:Nt,welcome:St,onLogout:Q,mitmTeam:J.length>0?J[0]:null}),c.jsxs("main",{className:"main",children:[c.jsxs("div",{className:"app__tabsrow",children:[c.jsx("div",{className:"app__tabs",children:[{k:"all",label:"全部",n:rt+dt+Pa},{k:"local",label:"本地",n:rt},{k:"cloud",label:"私有云",n:Pa},{k:"custom",label:"自定义",n:dt}].map(({k:w,label:M,n:k})=>c.jsxs("button",{type:"button",className:`app__tab ${q===w?"is-active":""}`,onClick:()=>K(w),children:[M,c.jsx("span",{className:"app__tab-count",children:k})]},w))}),c.jsxs("button",{type:"button","data-id":"AddTeamButton",className:"app__add-team",title:v("teams.addHint","在云端新建私有云团队"),onClick:()=>ni("?tab=private"),children:["+ ",v("teams.add","新加团队")]})]}),ue&&c.jsxs("div",{className:"error",style:{marginBottom:12},children:["云端: ",ue,c.jsx("button",{className:"btn-ghost",style:{marginLeft:8},onClick:()=>it(T||D,X),children:"重试"})]}),c.jsxs("div",{className:"app__grid",children:[Ca&&J.filter(w=>!Zs(w.base_url)).map(w=>c.jsx(hm,{team:w,onOpen:()=>Qt(w.id),onRename:vt,onRefresh:Z},"local:"+w.id)),Ca&&J.length===0&&c.jsxs("div",{"data-id":"LocalTeamPlaceholder",className:"bcard bcard--local",children:[c.jsx("div",{className:"bcard__accent"}),c.jsx("div",{className:"bcard__top",children:c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":"warn"}),c.jsx(jm,{})]})}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("h3",{className:"bcard__name",children:"本地团队"}),c.jsx("div",{className:"bcard__host",children:"http://127.0.0.1:8008"}),c.jsx("div",{className:"bcard__meta"})]}),c.jsxs("button",{type:"button",className:"bcard__cta",disabled:!0,children:[c.jsx(Ce,{}),c.jsx("span",{children:d?"正在启动,就绪后自动加入…":"检测中…"})]})]}),Ca&&c.jsx(rg,{dockerTeam:ye,onOpen:async()=>{var w,M,k;try{const lt=await((k=(M=(w=window.cicy)==null?void 0:w.docker)==null?void 0:M.appOpen)==null?void 0:k.call(M));lt!=null&<.ok||de.show({id:"docker-open",status:"error",ttl:6e3,message:v("docker.openNoToken","服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。")})}catch(lt){console.warn("[DockerCard] open",lt)}},cloudTitle:ae==null?void 0:ae.title,onRename:ye!=null&&ye.cloud_team_id?(w=>P(ye.cloud_team_id,w)):void 0,onRefresh:Z}),ge&&wt.map(w=>c.jsx(hm,{team:w,onOpen:()=>Qt(w.id),onRename:vt,onRefresh:Z},"custom:"+w.id)),Ea&&aa.map(w=>c.jsx(fg,{team:w,onOpen:()=>{var k,lt,nt;const M=w.kind==="private"?w.host_url:w.workspace_url||w.workspace_direct_url;M&&((nt=(lt=(k=window.cicy)==null?void 0:k.tabs)==null?void 0:lt.open)==null||nt.call(lt,M,w.name||w.title||""))},onRename:P},"cloud:"+w.id))]}),!Kt&&!ue&&xt&&xt.length===0&&!(O!=null&&O.length)&&c.jsx("div",{className:"empty",style:{marginTop:14},children:"还没有团队 — 安装本地 cicy-code 起一个本地 team,或在云端创建。"})]})]}),c.jsx(tg,{}),c.jsx(eg,{}),c.jsx(og,{})]})}function lg({onClose:o}){const[S,T]=E.useState(null),[r,D]=E.useState(""),[R,X]=E.useState(!1),[H,j]=E.useState(""),_=typeof window<"u"&&window.cicy&&window.cicy.trustedOrigins||null,Y=E.useCallback(async()=>{try{T(_&&await _.list()||[])}catch{T([])}},[_]);E.useEffect(()=>{Y()},[Y]);const L=async()=>{const et=r.trim();if(!(!et||R||!_)){X(!0),j("");try{const V=await _.add(et);V&&V.ok===!1?j(V.error||v("trustedSites.addFailed","添加失败")):(D(""),T(V&&V.origins||await _.list()))}catch(V){j(String(V&&V.message||V))}finally{X(!1)}}},I=async et=>{if(!(R||!_)){X(!0),j("");try{const V=await _.remove(et);V&&V.ok===!1?j(V.error||v("trustedSites.removeFailed","删除失败")):T(V&&V.origins||await _.list())}catch(V){j(String(V&&V.message||V))}finally{X(!1)}}},tt={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 cn.createPortal(c.jsx("div",{style:tt.overlay,onClick:o,"data-id":"TrustedSitesModal",children:c.jsxs("div",{style:tt.card,onClick:et=>et.stopPropagation(),children:[c.jsxs("div",{style:tt.head,children:[c.jsx("h2",{style:tt.title,children:v("trustedSites.title","受信任站点")}),c.jsx("button",{type:"button",style:tt.x,onClick:o,"aria-label":"close",children:"✕"})]}),c.jsx("div",{style:tt.warn,children:v("trustedSites.warn","⚠ 列表中的站点可以在你的电脑上执行命令(exec)。只添加你完全信任的地址。")}),c.jsxs("div",{style:tt.addRow,children:[c.jsx("input",{"data-id":"trusted-sites-input",style:tt.input,value:r,onChange:et=>D(et.target.value),onKeyDown:et=>{et.key==="Enter"&&L()},placeholder:v("trustedSites.placeholder","添加站点,如 app.cicy-ai.com 或 my-cloud.example.org")}),c.jsx("button",{type:"button","data-id":"trusted-sites-add",style:{...tt.addBtn,opacity:R||!r.trim()?.5:1},onClick:L,disabled:R||!r.trim(),children:v("trustedSites.add","添加")})]}),H&&c.jsx("div",{style:tt.err,children:H}),c.jsx("div",{style:tt.listWrap,children:S===null?c.jsx("div",{style:tt.muted,children:v("trustedSites.loading","加载中…")}):S.length===0?c.jsx("div",{style:tt.muted,children:v("trustedSites.empty","暂无")}):S.map(et=>c.jsxs("div",{style:tt.row,"data-id":"trusted-sites-row",children:[c.jsx("span",{style:tt.host(et.builtin),children:et.host}),et.builtin?c.jsx("span",{style:tt.tag,children:v("trustedSites.builtin","系统")}):c.jsx("button",{type:"button",style:tt.rm,onClick:()=>I(et.host),disabled:R,children:v("trustedSites.remove","删除")})]},et.host))})]})}),document.body)}function ng({onClose:o}){const[S,T]=E.useState(null),[r,D]=E.useState(""),[R,X]=E.useState(""),[H,j]=E.useState(!1),_=typeof window<"u"&&window.cicy&&window.cicy.rpcAudit||null,Y=E.useCallback(async()=>{j(!0),D("");try{const B=_&&await _.tail(400);!B||B.ok===!1?(D(B&&B.error||v("audit.loadFailed","读取失败")),T([])):(T(B.entries||[]),X(B.path||""))}catch(B){D(String(B&&B.message||B)),T([])}finally{j(!1)}},[_]);E.useEffect(()=>{Y()},[Y]);const[L,I]=E.useState("all"),[tt,et]=E.useState(""),V=B=>{try{return new Date(B).toLocaleString()}catch{return B||""}},ft=B=>{if(B.kind==="auth"){const xt=/deny/.test(B.decision||"");return{text:B.decision||"auth",color:xt?"#fca5a5":"#86efac",bg:xt?"rgba(239,68,68,.14)":"rgba(34,197,94,.14)"}}if(B.kind==="rpc"){const xt=B.ok!==!1&&!B.error;return{text:xt?"ok":"err",color:xt?"#86efac":"#fca5a5",bg:xt?"rgba(34,197,94,.14)":"rgba(239,68,68,.14)"}}return{text:B.kind||"log",color:"#a1a1aa",bg:"rgba(255,255,255,.06)"}},Tt=B=>B.kind==="auth"?`${B.gate||""}${B.decision?" · "+B.decision:""}`:B.kind==="rpc"?`${B.tool||""}${B.dangerous?" ⚠":""}`:B.kind||"",st=B=>B.error||B.args||(B.kind==="rpc"?B.channel:"")||"",ht=S||[],yt=tt.trim().toLowerCase(),gt=ht.filter(B=>L!=="all"&&B.kind!==L?!1:yt?[B.origin,B.host,B.tool,B.gate,B.decision,B.channel,B.args,B.error,B.kind].filter(Boolean).join(" ").toLowerCase().includes(yt):!0),St="186px 104px minmax(160px,1.1fr) minmax(150px,1.1fr) minmax(220px,1.8fr)",G={overlay:{position:"fixed",inset:0,zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,.66)",backdropFilter:"blur(4px)"},card:{width:"96vw",height:"92vh",maxWidth:1480,display:"flex",flexDirection:"column",background:"#0d0d0f",border:"1px solid rgba(255,255,255,.09)",borderRadius:18,boxShadow:"0 32px 80px rgba(0,0,0,.6)",overflow:"hidden",color:"#e4e4e7"},head:{display:"flex",alignItems:"center",gap:14,padding:"20px 24px",borderBottom:"1px solid rgba(255,255,255,.07)"},titleWrap:{flex:1,minWidth:0},title:{margin:0,fontSize:21,fontWeight:650,letterSpacing:.2},subtitle:{margin:"3px 0 0",fontSize:12.5,color:"#71717a",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",wordBreak:"break-all"},count:{fontSize:12.5,color:"#a1a1aa",whiteSpace:"nowrap"},refresh:{background:"rgba(255,255,255,.1)",border:"none",borderRadius:9,padding:"9px 16px",color:"#fff",fontSize:13,fontWeight:500,cursor:"pointer"},x:{background:"transparent",border:"none",color:"#a1a1aa",fontSize:20,cursor:"pointer",lineHeight:1,padding:6},toolbar:{display:"flex",alignItems:"center",gap:10,padding:"14px 24px",borderBottom:"1px solid rgba(255,255,255,.05)"},chips:{display:"flex",gap:6},chip:B=>({background:B?"rgba(255,255,255,.14)":"transparent",border:"1px solid rgba(255,255,255,.12)",borderRadius:999,padding:"6px 16px",color:B?"#fff":"#a1a1aa",fontSize:13,cursor:"pointer"}),search:{flex:1,minWidth:0,background:"#161618",border:"1px solid rgba(255,255,255,.1)",borderRadius:10,padding:"10px 14px",color:"#e4e4e7",fontSize:13.5,outline:"none"},err:{margin:"10px 24px 0",fontSize:12.5,color:"#fca5a5"},tableWrap:{flex:1,overflow:"auto",margin:"0"},theadRow:{position:"sticky",top:0,zIndex:1,display:"grid",gridTemplateColumns:St,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:St,gap:16,padding:"13px 24px",borderBottom:"1px solid rgba(255,255,255,.045)",alignItems:"center"},time:{fontSize:12.5,color:"#a1a1aa",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",whiteSpace:"nowrap"},badge:B=>({justifySelf:"start",fontSize:11.5,color:B.color,background:B.bg,borderRadius:7,padding:"3px 10px",whiteSpace:"nowrap",fontWeight:500}),cell:{fontSize:13,color:"#d4d4d8",fontFamily:"ui-monospace,SFMono-Regular,Menlo,monospace",wordBreak:"break-all"},detail:{fontSize:12.5,color:"#8b8b93",wordBreak:"break-all"},muted:{padding:"60px 24px",textAlign:"center",color:"#71717a",fontSize:14}},Nt=B=>c.jsx("div",{children:B});return cn.createPortal(c.jsx("div",{style:G.overlay,onClick:o,"data-id":"AuditLogModal",children:c.jsxs("div",{style:G.card,onClick:B=>B.stopPropagation(),children:[c.jsxs("div",{style:G.head,children:[c.jsxs("div",{style:G.titleWrap,children:[c.jsx("h2",{style:G.title,children:v("audit.title","审计日志")}),R&&c.jsx("p",{style:G.subtitle,children:R})]}),c.jsxs("span",{style:G.count,children:[v("audit.count","共")," ",gt.length,L!=="all"||yt?` / ${ht.length}`:""]}),c.jsx("button",{type:"button","data-id":"audit-refresh",style:{...G.refresh,opacity:H?.5:1},onClick:Y,disabled:H,children:v("audit.refresh","刷新")}),c.jsx("button",{type:"button",style:G.x,onClick:o,"aria-label":"close",children:"✕"})]}),c.jsxs("div",{style:G.toolbar,children:[c.jsxs("div",{style:G.chips,children:[c.jsx("button",{type:"button",style:G.chip(L==="all"),onClick:()=>I("all"),children:v("audit.all","全部")}),c.jsx("button",{type:"button",style:G.chip(L==="rpc"),onClick:()=>I("rpc"),children:v("audit.rpc","RPC 调用")}),c.jsx("button",{type:"button",style:G.chip(L==="auth"),onClick:()=>I("auth"),children:v("audit.auth","授权决定")})]}),c.jsx("input",{"data-id":"audit-search",style:G.search,value:tt,onChange:B=>et(B.target.value),placeholder:v("audit.search","搜索来源 / 工具 / 命令…")})]}),r&&c.jsx("div",{style:G.err,children:r}),c.jsxs("div",{style:G.tableWrap,children:[c.jsxs("div",{style:G.theadRow,children:[Nt(v("audit.colTime","时间")),Nt(v("audit.colType","类型")),Nt(v("audit.colSource","来源")),Nt(v("audit.colOp","操作")),Nt(v("audit.colDetail","详情"))]}),S===null?c.jsx("div",{style:G.muted,children:v("audit.loading","加载中…")}):gt.length===0?c.jsx("div",{style:G.muted,children:ht.length===0?v("audit.empty","暂无审计记录"):v("audit.noMatch","无匹配记录")}):gt.map((B,xt)=>{const Ut=ft(B);return c.jsxs("div",{style:G.row,"data-id":"audit-row",children:[c.jsx("span",{style:G.time,children:V(B.ts)}),c.jsx("span",{style:G.badge(Ut),children:Ut.text}),c.jsx("span",{style:G.cell,children:B.origin||B.host||"—"}),c.jsx("span",{style:G.cell,children:Tt(B)||"—"}),c.jsx("span",{style:G.detail,children:st(B)||"—"})]},xt)})]})]})}),document.body)}function ig({me:o,welcome:S,onLogout:T,mitmTeam:r}){const D=(o==null?void 0:o.display_name)||(o==null?void 0:o.username)||"…",R=D.slice(0,1).toUpperCase(),[X,H]=E.useState(!1),[j,_]=E.useState(!1),[Y,L]=E.useState(!1),[I,tt]=E.useState(!1),[et,V]=E.useState(""),ft=E.useRef(null);E.useEffect(()=>{var ht,yt,gt;let st=!0;return(gt=(yt=(ht=window.cicy)==null?void 0:ht.app)==null?void 0:yt.getVersion)==null||gt.call(yt).then(St=>{st&&V(typeof St=="string"?St:String((St==null?void 0:St.desktop)||""))}).catch(()=>{}),()=>{st=!1}},[]),E.useEffect(()=>{if(!X)return;const st=ht=>{ft.current&&!ft.current.contains(ht.target)&&H(!1)};return document.addEventListener("mousedown",st),()=>document.removeEventListener("mousedown",st)},[X]);const Tt=st=>{ni(st),H(!1)};return c.jsxs(c.Fragment,{children:[c.jsxs("header",{className:"topbar",children:[c.jsxs("div",{className:"brand-mini",children:[c.jsx("div",{className:"brand-mark sm",children:c.jsx(Tm,{})}),c.jsx("span",{className:"brand-name",children:"CiCy Desktop"})]}),c.jsxs("div",{className:"user-chip","data-id":"UserChip",ref:ft,children:[S&&c.jsx("span",{className:"welcome",children:S}),c.jsxs("button",{type:"button","data-id":"UserChip-trigger",className:`user-chip__trigger${X?" is-open":""}`,onClick:()=>H(st=>!st),children:[c.jsx("div",{className:"avatar",children:R}),c.jsx("span",{className:"user-name",children:D}),c.jsx("span",{className:"user-chip__caret","aria-hidden":!0,children:"▾"})]}),X&&c.jsxs("div",{className:"user-chip__menu","data-id":"UserChip-menu",role:"menu",children:[c.jsx("button",{type:"button","data-id":"UserChip-wallet",className:"user-chip__menu-item",onClick:()=>Tt("?view=wallet"),children:"我的钱包"}),c.jsx("button",{type:"button","data-id":"UserChip-billing",className:"user-chip__menu-item",onClick:()=>Tt("?view=usage"),children:"我的账单"}),c.jsx("button",{type:"button","data-id":"UserChip-trusted-sites",className:"user-chip__menu-item",onClick:()=>{H(!1),_(!0)},children:v("trustedSites.menu","受信任站点")}),c.jsx("button",{type:"button","data-id":"UserChip-audit-log",className:"user-chip__menu-item",onClick:()=>{H(!1),L(!0)},children:v("audit.menu","审计日志")}),c.jsx("button",{type:"button","data-id":"UserChip-terms",className:"user-chip__menu-item",onClick:()=>{H(!1),tt(!0)},children:v("firstRunTerms.menu","用户协议")}),!1,c.jsx("div",{className:"user-chip__menu-sep","aria-hidden":!0}),c.jsx("button",{type:"button","data-id":"UserChip-logout",className:"user-chip__menu-item is-danger",onClick:()=>{H(!1),T()},children:"退出"}),c.jsxs("div",{className:"user-chip__menu-version","data-id":"UserChip-version",children:["CiCy Desktop ",et?`v${et}`:"…"]})]})]})]}),j&&c.jsx(lg,{onClose:()=>_(!1)}),Y&&c.jsx(ng,{onClose:()=>L(!1)}),I&&c.jsx(xm,{onClose:()=>tt(!1)})]})}function xm({onAgree:o,onClose:S}){var et;const[T,r]=E.useState(!1),[D,R]=E.useState(!1),X=(((et=window.cicyI18n)==null?void 0:et.locale)||"en").startsWith("zh")?"zh-CN":"en",H=(V,ft)=>v(`firstRunTerms.${V}`,ft),j=!!S,_=E.useMemo(()=>Iy($y(X)),[X]),Y=V=>{const ft=V.currentTarget;ft.scrollHeight-ft.scrollTop-ft.clientHeight<24&&r(!0)},L=E.useRef(null);E.useEffect(()=>{const V=L.current;V&&V.scrollHeight<=V.clientHeight+24&&r(!0)},[]);const I=async()=>{var V,ft,Tt;if(!(D||!T)){R(!0);try{await((Tt=(ft=(V=window.cicy)==null?void 0:V.terms)==null?void 0:ft.agree)==null?void 0:Tt.call(ft,_m)),o==null||o()}catch{o==null||o()}}},tt=()=>{var V,ft,Tt;try{(Tt=(ft=(V=window.cicy)==null?void 0:V.terms)==null?void 0:ft.decline)==null||Tt.call(ft)}catch{}};return c.jsxs("div",{className:j?"terms-gate terms-gate--review":"shell terms-gate","data-id":"FirstRunTermsGate",style:j?{position:"fixed",inset:0,zIndex:1e3,background:"rgba(8,9,14,.72)",backdropFilter:"blur(4px)"}:void 0,onClick:j?V=>{V.target===V.currentTarget&&S()}:void 0,children:[c.jsx("div",{className:"glow","aria-hidden":!0}),c.jsxs("div",{className:"terms-gate__panel",children:[c.jsx("h1",{className:"terms-gate__title","data-id":"FirstRunTermsGate-title",children:H("title","用户协议与授权说明")}),c.jsx("p",{className:"terms-gate__subtitle",children:H("subtitle","使用 CiCy Desktop 前,请阅读并同意以下条款")}),c.jsx("div",{className:"terms-gate__body",ref:L,onScroll:Y,"data-id":"FirstRunTermsGate-body",children:c.jsx("div",{className:"terms-md","data-id":"FirstRunTermsGate-md",dangerouslySetInnerHTML:{__html:_}})}),j?c.jsx("div",{className:"terms-gate__actions",children:c.jsx("button",{"data-id":"FirstRunTermsGate-close",className:"terms-gate__btn",onClick:S,children:H("close","关闭")})}):c.jsxs(c.Fragment,{children:[!T&&c.jsx("div",{className:"terms-gate__scrollhint","data-id":"FirstRunTermsGate-scrollhint",children:H("scrollHint","请阅读至底部以继续")}),c.jsxs("div",{className:"terms-gate__actions",children:[c.jsx("button",{"data-id":"FirstRunTermsGate-decline",className:"terms-gate__btn terms-gate__btn--ghost",onClick:tt,children:H("decline","不同意并退出")}),c.jsx("button",{"data-id":"FirstRunTermsGate-agree",className:"terms-gate__btn",disabled:!T||D,title:T?"":H("mustAgree","未同意则无法使用本软件。"),onClick:I,children:H("agree","同意并继续")})]})]})]})]})}const $s=new Set;let dm=0,te=null;function un(){$s.forEach(o=>o(te))}const ee={open({onRetry:o}={}){te={status:"running",phase:"install-docker",logs:[],bars:{},minimized:!1,onRetry:o||null,lastAt:Date.now()},un()},minimize(){te&&(te={...te,minimized:!0},un())},restore(){te&&(te={...te,minimized:!1},un())},push(o={}){var X;if(!te)return;const S=o.phase==="health"?"container":o.phase||te.phase,T={...te,phase:S,lastAt:Date.now()},r=Number.isFinite(o.progress),D=S==="install-docker"||S==="image";if(D&&(r||o.dest||o.url)){const H=((X=te.bars)==null?void 0:X[S])||{},j=r?o.progress:o.status==="skip"||o.status==="done"?100:H.progress;T.bars={...te.bars,[S]:{progress:j,received:o.received??H.received,total:o.total??H.total,url:o.url||H.url,dest:o.dest||H.dest}}}if(!(o.status==="running"&&r&&D)){const H={id:++dm,t:Tu(),phase:S,status:o.status||"running",message:o.message||""};T.logs=[...te.logs,H]}te=T,un()},finish({ok:o,message:S,status:T}={}){if(!te)return;const r=T||(o?"done":"error"),D=r==="error"?te.phase:"done",R={id:++dm,t:Tu(),phase:D,status:r,message:S||(o?"完成":"失败")};te={...te,status:r,phase:D,minimized:!1,logs:[...te.logs,R],lastAt:Date.now()},un()},close(){te=null,un()}},Xs=[["install-docker","准备环境"],["image","下载运行环境"],["container","启动服务"],["done","完成"]],ug={"install-docker":"准备",image:"下载",container:"启动",health:"启动",done:"完成"},cg={"install-docker":"Docker Desktop",image:"基础镜像"};function mm(o){return Number.isFinite(o)?o<1024?o+" B":o<1048576?(o/1024).toFixed(0)+" KB":o<1073741824?(o/1048576).toFixed(1)+" MB":(o/1073741824).toFixed(2)+" GB":"?"}function sg({phaseKey:o,bar:S}){const T=Number.isFinite(S==null?void 0:S.progress)?Math.max(0,Math.min(100,S.progress)):0,r=T>=100;return c.jsxs("div",{className:"dlbar","data-id":`DockerDrawer-dlbar-${o}`,children:[c.jsxs("div",{className:"dlbar__head",children:[c.jsx("span",{className:"dlbar__name",children:cg[o]||o}),c.jsxs("span",{className:"dlbar__pct",children:[T,"%",S!=null&&S.total?` · ${mm(S.received)} / ${mm(S.total)}`:""]})]}),c.jsx("div",{className:"dlbar__track",children:c.jsx("div",{className:`dlbar__fill${r?" is-done":""}`,style:{width:`${T}%`}})}),(S==null?void 0:S.url)&&c.jsxs("div",{className:"dlbar__url",title:S.url,children:[c.jsx("span",{className:"dlbar__urlk",children:"源"})," ",S.url]}),(S==null?void 0:S.dest)&&c.jsxs("div",{className:"dlbar__url",title:S.dest,children:[c.jsx("span",{className:"dlbar__urlk",children:"存"})," ",S.dest]})]})}function og(){var X;const[o,S]=E.useState(te);E.useEffect(()=>($s.add(S),()=>{$s.delete(S)}),[]);const T=E.useRef(null);if(E.useEffect(()=>{const H=T.current;H&&(H.scrollTop=H.scrollHeight)},[(X=o==null?void 0:o.logs)==null?void 0:X.length]),!o)return null;const r=o.status==="running",D=Xs.findIndex(([H])=>H===o.phase),R=["install-docker","image"].filter(H=>{var j;return(j=o.bars)==null?void 0:j[H]});if(o.minimized){const H=R.map(_=>{var Y;return(Y=o.bars[_])==null?void 0:Y.progress}).filter(Number.isFinite),j=H.length?Math.round(H.reduce((_,Y)=>_+Y,0)/H.length):null;return c.jsxs("button",{type:"button",className:`drawer-min drawer-min--${o.status}`,"data-id":"DockerDrawer-restore",onClick:()=>ee.restore(),children:[c.jsx("span",{className:"drawer-min__spark",children:r?c.jsx(Ce,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("span",{className:"drawer-min__label",children:[v("docker.setupTitle","安装 Docker cicy-code"),j!=null?` · ${j}%`:""]})]})}return c.jsx("div",{className:"drawer-scrim","data-id":"DockerDrawer-scrim",onClick:()=>r?ee.minimize():ee.close(),children:c.jsxs("div",{className:"drawer","data-id":"DockerDrawer","data-status":o.status,onClick:H=>H.stopPropagation(),children:[c.jsxs("div",{className:"drawer__head",children:[c.jsxs("div",{className:"drawer__title",children:[c.jsx("span",{className:`drawer__spark drawer__spark--${o.status}`,children:r?c.jsx(Ce,{}):o.status==="done"?"✓":o.status==="reboot"?"⟳":"!"}),c.jsxs("div",{children:[c.jsx("div",{className:"drawer__h",children:v("docker.setupTitle","安装 Docker cicy-code")}),c.jsx("div",{className:"drawer__sub",children:"127.0.0.1:8008"})]})]}),c.jsx("div",{className:"drawer__headbtns",children:c.jsx("button",{type:"button",className:"drawer__x","data-id":"DockerDrawer-min",title:v("common.minimize","最小化"),onClick:()=>ee.minimize(),"aria-label":"minimize",children:"‒"})})]}),c.jsx("div",{className:"drawer__steps","data-id":"DockerDrawer-steps",children:Xs.map(([H,j],_)=>{const Y=o.status==="done"||D>=0&&_<D,L=_===D&&r,I=o.status==="error"&&_===D;return c.jsxs("div",{className:`drawer__step${L?" is-active":""}${Y?" is-done":""}${I?" is-error":""}`,children:[c.jsx("span",{className:"drawer__step-dot",children:Y?"✓":I?"!":_+1}),c.jsx("span",{className:"drawer__step-label",children:j}),_<Xs.length-1&&c.jsx("span",{className:"drawer__step-bar"})]},H)})}),R.length>0&&c.jsx("div",{className:"drawer__dlbars","data-id":"DockerDrawer-dlbars",children:R.map(H=>c.jsx(sg,{phaseKey:H,bar:o.bars[H]},H))}),r&&o.logs.length>0&&c.jsxs("div",{className:"drawer__now","data-id":"DockerDrawer-now",children:[c.jsx(Ce,{}),c.jsx("span",{children:o.logs[o.logs.length-1].message})]}),c.jsx("div",{className:"drawer__log drawer__log--scroll","data-id":"DockerDrawer-log",ref:T,children:o.logs.length===0?c.jsx("div",{className:"drawer__log-empty",children:v("docker.preparing","准备中…")}):o.logs.map(H=>c.jsxs("div",{className:"drawer__line","data-status":H.status,children:[c.jsx("span",{className:"drawer__t",children:H.t}),c.jsx("span",{className:`drawer__badge drawer__badge--${H.phase}`,children:ug[H.phase]||H.phase}),c.jsx("span",{className:"drawer__linemsg",children:H.message})]},H.id))}),c.jsx("div",{className:"drawer__foot",children:r?c.jsx(c.Fragment,{children:c.jsx("span",{className:"drawer__foot-status",children:v("docker.installing2","安装进行中…")})}):o.status==="reboot"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-reboot",children:v("docker.rebootShort","需重启 Windows")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>o.onRetry(),children:v("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>ee.close(),children:v("common.close","关闭")})]}):o.status==="error"?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-error",children:v("docker.failed","安装失败")}),o.onRetry&&c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-retry",onClick:()=>o.onRetry(),children:v("common.retry","重试")}),c.jsx("button",{type:"button",className:"drawer__btn","data-id":"DockerDrawer-dismiss",onClick:()=>ee.close(),children:v("common.close","关闭")})]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"drawer__foot-status is-done",children:v("docker.ready","已就绪")}),c.jsx("button",{type:"button",className:"drawer__btn is-accent","data-id":"DockerDrawer-finish",onClick:()=>ee.close(),children:v("common.done","完成")})]})})]})})}function rg({dockerTeam:o,cloudTitle:S,onOpen:T,onRename:r,onRefresh:D}){var ct;const[R,X]=E.useState(null),[H,j]=E.useState(""),[_,Y]=E.useState(!1),[L,I]=E.useState(!1),[tt,et]=E.useState(!1),[V,ft]=E.useState(""),Tt=S||"本地团队",st=U=>{var P;(P=U==null?void 0:U.stopPropagation)==null||P.call(U),ft(Tt),et(!0)},ht=async()=>{et(!1);const U=String(V||"").trim();if(!(!U||U===Tt||!r))try{await r(U),D==null||D()}catch{}},[yt,gt]=E.useState({top:0,left:0}),St=E.useRef(null),G=E.useRef(null),Nt=184,B="#2496ed",xt=E.useCallback(async()=>{var U,P,Z;try{X(await((Z=(P=(U=window.cicy)==null?void 0:U.docker)==null?void 0:P.appStatus)==null?void 0:Z.call(P)))}catch(vt){console.warn("[DockerCard]",vt)}},[]);E.useEffect(()=>{xt();const U=setInterval(()=>{H||xt()},12e3);return()=>clearInterval(U)},[xt,H]),E.useEffect(()=>{if(!_)return;const U=Z=>{var vt,Qt;(vt=St.current)!=null&&vt.contains(Z.target)||(Qt=G.current)!=null&&Qt.contains(Z.target)||Y(!1)},P=Z=>{Z.key==="Escape"&&Y(!1)};return document.addEventListener("mousedown",U),document.addEventListener("keydown",P),()=>{document.removeEventListener("mousedown",U),document.removeEventListener("keydown",P)}},[_]);const Ut=()=>{if(!_&&St.current){const U=St.current.getBoundingClientRect(),P=Math.max(8,Math.min(U.right-Nt,window.innerWidth-Nt-8));gt({top:Math.round(U.bottom+4),left:Math.round(P)})}Y(U=>!U)},Kt=E.useCallback(async()=>{var P,Z,vt,Qt,Xt,ce;j("bootstrap"),ee.open({onRetry:Kt});const U=(vt=(Z=(P=window.cicy)==null?void 0:P.docker)==null?void 0:Z.onAppProgress)==null?void 0:vt.call(Z,Q=>ee.push(Q));try{const Q=await((ce=(Xt=(Qt=window.cicy)==null?void 0:Qt.docker)==null?void 0:Xt.appBootstrap)==null?void 0:ce.call(Xt));(Q==null?void 0:Q.reason)==="installer_launched"?ee.finish({status:"reboot",message:v("docker.installerLaunched","已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」")}):(Q==null?void 0:Q.reason)==="wsl_reboot_required"?ee.finish({status:"reboot",message:v("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):ee.finish({ok:!!(Q!=null&&Q.ok),message:Q!=null&&Q.ok?v("docker.ready","Docker cicy-code 已就绪"):(Q==null?void 0:Q.error)||v("docker.failed","安装失败")}),Q!=null&&Q.ok&&(D==null||D())}catch(Q){ee.finish({ok:!1,message:Q.message})}finally{try{U&&U()}catch{}j(""),xt()}},[xt,D]),me=E.useCallback(async()=>{var P,Z,vt,Qt,Xt,ce;Y(!1),j("upgrade"),ee.open({onRetry:me});const U=(vt=(Z=(P=window.cicy)==null?void 0:P.docker)==null?void 0:Z.onAppProgress)==null?void 0:vt.call(Z,Q=>ee.push(Q));try{const Q=await((ce=(Xt=(Qt=window.cicy)==null?void 0:Qt.docker)==null?void 0:Xt.appUpgrade)==null?void 0:ce.call(Xt));(Q==null?void 0:Q.reason)==="wsl_reboot_required"?ee.finish({status:"reboot",message:v("docker.rebootNeeded","WSL2 已安装,请【重启 Windows】后回来点「重试」继续")}):ee.finish({ok:!!(Q!=null&&Q.ok),message:Q!=null&&Q.ok?v("docker.upgraded","已升级到最新"):(Q==null?void 0:Q.error)||v("docker.upgradeFailed","升级失败")}),Q!=null&&Q.ok&&(D==null||D())}catch(Q){ee.finish({ok:!1,message:Q.message})}finally{try{U&&U()}catch{}j(""),xt()}},[xt,D]),ue=E.useCallback(async()=>{var P,Z,vt,Qt,Xt,ce;Y(!1),j("update"),ee.open({onRetry:ue});const U=(vt=(Z=(P=window.cicy)==null?void 0:P.docker)==null?void 0:Z.onAppProgress)==null?void 0:vt.call(Z,Q=>ee.push(Q));try{const Q=await((ce=(Xt=(Qt=window.cicy)==null?void 0:Qt.docker)==null?void 0:Xt.appUpdate)==null?void 0:ce.call(Xt));ee.finish({ok:!!(Q!=null&&Q.ok),message:Q!=null&&Q.ok?v("docker.updated","cicy-code 已更新到最新"):(Q==null?void 0:Q.error)||v("docker.updateFailed","更新失败")}),Q!=null&&Q.ok&&(D==null||D())}catch(Q){ee.finish({ok:!1,message:Q.message})}finally{try{U&&U()}catch{}j(""),xt()}},[xt,D]),Rt=E.useCallback(async(U,P,Z)=>{Y(!1),j(U),de.show({id:"docker-op",message:v(`docker.${U}ing`,U==="restart"?"重启中…":U==="reload"?"刷新中…":"停止中…"),status:"running"});try{const vt=await P();vt!=null&&vt.ok?de.show({id:"docker-op",message:Z,status:"done",ttl:2500}):de.show({id:"docker-op",message:(vt==null?void 0:vt.error)||v("docker.opFailed","操作失败"),status:"error",ttl:6e3})}catch(vt){de.show({id:"docker-op",message:vt.message,status:"error",ttl:6e3})}finally{j(""),xt()}},[xt]),y=((ct=window.cicy)==null?void 0:ct.platform)||(R==null?void 0:R.platform);if(y!=="win32"&&y!=="darwin")return null;const O=!!(R!=null&&R.running)||(o==null?void 0:o.status)==="running",$=!!(R!=null&&R.dockerRunning),ot=!!(R!=null&&R.installed),_t=!!(R!=null&&R.unknown)&&!O&&!$&&!ot,d=O?"ok":$||ot||_t?"warn":"off",C=!!H;O?v("docker.running","运行中"):$?v("docker.notRunning","未启动 · 点「启动」"):ot?v("docker.engineDown","Docker 未运行 · 点启动"):_t?v("docker.wslUnresponsive","WSL 未响应 · 点「重试检测」"):v("docker.notInstalled","Docker Desktop 未安装");const q=H==="open"?v("docker.opening","打开中…"):H==="probe"?v("docker.probing","检测中…"):C?v("docker.working","处理中…"):O?v("localTeams.open","打开"):$?v("docker.start","启动"):ot?v("docker.startDocker","启动 Docker"):_t?v("docker.retryProbe","重试检测"):v("docker.install","下载安装"),K=async()=>{var U,P,Z,vt,Qt,Xt,ce,Q,ye;if(!C){if(O){try{const ae=await((Z=(P=(U=window.cicy)==null?void 0:U.tabs)==null?void 0:P.activateIfOpen)==null?void 0:Z.call(P,"http://127.0.0.1:8008"));if(ae!=null&&ae.active)return}catch{}j("open");try{await(T==null?void 0:T(o==null?void 0:o.id))}finally{j("")}return}if(_t){j("probe");try{const ae=await(((Xt=(Qt=(vt=window.cicy)==null?void 0:vt.docker)==null?void 0:Qt.appRedetect)==null?void 0:Xt.call(Qt))??((ye=(Q=(ce=window.cicy)==null?void 0:ce.docker)==null?void 0:Q.appStatus)==null?void 0:ye.call(Q)));ae&&X(ae),ae!=null&&ae.unknown&&de.show({id:"docker-probe",status:"error",message:v("docker.wslStillStuck","WSL 仍无响应 —— 多半要重启 Windows 后再试"),ttl:6e3})}catch{de.show({id:"docker-probe",status:"error",message:v("docker.probeFailed","检测失败,请重试"),ttl:5e3})}finally{j("")}return}Kt()}},it=O;return c.jsxs("div",{"data-id":"DockerCard",className:`bcard bcard--docker${O?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent",style:{background:B}}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",style:{color:B},children:[c.jsx("span",{className:"bcard__dot","data-tone":d}),c.jsx("svg",{style:{width:18,height:18},viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:c.jsx("path",{d:"M21.81 10.25c-.06-.05-.67-.51-1.95-.51-.34 0-.68.03-1.01.09-.25-1.69-1.64-2.51-1.7-2.55l-.34-.2-.22.32a4.5 4.5 0 0 0-.59 1.4c-.23.94-.09 1.83.39 2.59-.58.32-1.51.4-1.7.41H2.62a.61.61 0 0 0-.61.61 9.32 9.32 0 0 0 .57 3.35 4.9 4.9 0 0 0 1.95 2.53c.92.52 2.42.82 4.12.82.77 0 1.54-.07 2.3-.21a9.6 9.6 0 0 0 3-1.09 8.3 8.3 0 0 0 2.05-1.68c.98-1.11 1.56-2.35 1.99-3.45h.17c1.36 0 2.2-.55 2.66-1l.13-.16zM4.7 11.33h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H4.7a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.46 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V9.58a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16M7.16 9.06h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H7.16a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.5 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16H9.66a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16m2.47 0h1.78a.16.16 0 0 0 .16-.16V7.31a.16.16 0 0 0-.16-.16h-1.78a.16.16 0 0 0-.16.16v1.59c0 .09.07.16.16.16"})})]}),it&&c.jsxs("div",{className:"bcard__menuwrap",onClick:U=>U.stopPropagation(),children:[c.jsx("button",{type:"button",ref:St,"data-id":"DockerCard-menu-btn",className:"bcard__kebab",title:v("docker.manage","管理 Docker cicy-code"),disabled:C,onClick:Ut,children:C?c.jsx(Ce,{}):c.jsx(Ps,{})}),_&&cn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"DockerCard-menu",role:"menu",ref:G,style:{position:"fixed",top:yt.top,left:yt.left,width:Nt},onClick:U=>U.stopPropagation(),children:[c.jsx("button",{type:"button","data-id":"DockerCard-update",className:"bcard__menu-item is-accent",onClick:ue,children:v("docker.update","更新 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-reload",className:"bcard__menu-item",onClick:U=>{var P,Z,vt;U.stopPropagation(),Y(!1),(vt=(Z=(P=window.cicy)==null?void 0:P.tabs)==null?void 0:Z.reloadIfOpen)==null||vt.call(Z,"http://127.0.0.1:8008",Tt)},children:v("docker.reloadWindow","刷新窗口")}),c.jsx("button",{type:"button","data-id":"DockerCard-billing",className:"bcard__menu-item",onClick:()=>{Y(!1),ni(o!=null&&o.cloud_team_id?`?team=${encodeURIComponent(o.cloud_team_id)}`:"?view=usage")},children:v("docker.billing","帐单")}),c.jsx("button",{type:"button","data-id":"DockerCard-addr",className:"bcard__menu-item",title:v("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:U=>{U.stopPropagation(),Y(!1);try{navigator.clipboard.writeText("http://127.0.0.1:8008")}catch{}},children:"http://127.0.0.1:8008"}),c.jsx("div",{className:"bcard__menu-sep","data-id":"DockerCard-menu-sep",role:"separator",children:c.jsx("span",{children:v("docker.opsGroup","Docker 容器")})}),c.jsx("button",{type:"button","data-id":"DockerCard-restart",className:"bcard__menu-item",onClick:()=>Rt("restart",()=>window.cicy.docker.appRestart(),v("docker.restarted","已重启 cicy-code")),children:v("docker.restart","重启 cicy-code")}),c.jsx("button",{type:"button","data-id":"DockerCard-docker-restart",className:"bcard__menu-item",onClick:()=>Rt("restart",()=>window.cicy.docker.appDockerRestart(),v("docker.dockerRestarted","已重启 Docker 容器")),children:v("docker.dockerRestart","重启 Docker")}),c.jsx("button",{type:"button","data-id":"DockerCard-recreate",className:"bcard__menu-item is-danger",onClick:U=>{U.stopPropagation(),Y(!1),I(!0)},children:v("docker.recreate","重建 Docker")}),c.jsx("button",{type:"button","data-id":"DockerCard-stop",className:"bcard__menu-item is-danger",onClick:()=>Rt("stop",()=>window.cicy.docker.appStop(),v("docker.stop","停止 cicy-code")),children:v("docker.stop","停止")})]}),document.body)]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:tt?c.jsx("input",{"data-id":"DockerCard-rename-input",autoFocus:!0,value:V,onChange:U=>ft(U.target.value),onFocus:U=>U.target.select(),onBlur:ht,onClick:U=>U.stopPropagation(),onKeyDown:U=>{U.nativeEvent.isComposing||U.keyCode===229||(U.key==="Enter"?ht():U.key==="Escape"&&et(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):c.jsxs("h3",{className:"bcard__name",title:r?v("localTeams.renameHint","点名字或 ✎ 改名"):Tt,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:r?st:void 0,children:[c.jsx("span",{onClick:r?st:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:r?"text":"default"},children:Tt}),r&&c.jsx("button",{type:"button","data-id":"DockerCard-rename-btn",title:v("localTeams.rename","重命名"),onClick:st,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsx("div",{className:"bcard__meta",children:c.jsx("span",{className:"bcard__chip",children:"Docker"})})]}),c.jsxs("button",{type:"button",className:"bcard__cta","data-id":"DockerCard-cta",disabled:C,onClick:K,style:O?void 0:{background:B,color:"white"},children:[C?c.jsx(Ce,{}):c.jsx(ju,{}),c.jsx("span",{children:q})]}),L&&cn.createPortal(c.jsx("div",{"data-id":"DockerCard-recreate-modal",style:{position:"fixed",inset:0,zIndex:9999,background:"rgba(0,0,0,0.55)",display:"flex",alignItems:"center",justifyContent:"center"},onClick:()=>I(!1),children:c.jsxs("div",{onClick:U=>U.stopPropagation(),style:{width:360,maxWidth:"90vw",background:"#161b22",border:"1px solid #30363d",borderRadius:12,padding:"20px 22px",boxShadow:"0 12px 40px rgba(0,0,0,0.5)"},children:[c.jsx("h3",{style:{margin:"0 0 8px",fontSize:16,color:"#e6edf3"},children:v("docker.recreate","重建 Docker")}),c.jsx("p",{style:{margin:"0 0 18px",fontSize:13,lineHeight:1.6,color:"#9aa4b2"},children:v("docker.recreateConfirm","会删除当前容器并重新创建(volume 数据保留),用于切换为独立 team 的网关 key。确定重建?")}),c.jsxs("div",{style:{display:"flex",justifyContent:"flex-end",gap:10},children:[c.jsx("button",{type:"button","data-id":"DockerCard-recreate-cancel",onClick:()=>I(!1),style:{padding:"7px 16px",borderRadius:8,border:"1px solid #30363d",background:"transparent",color:"#c9d1d9",cursor:"pointer",fontSize:13},children:v("common.cancel","取消")}),c.jsx("button",{type:"button","data-id":"DockerCard-recreate-confirm",onClick:()=>{I(!1),Rt("restart",()=>window.cicy.docker.appRecreate(),v("docker.recreated","已重建 Docker 容器"))},style:{padding:"7px 16px",borderRadius:8,border:"none",background:"#da3633",color:"white",cursor:"pointer",fontSize:13,fontWeight:600},children:v("docker.recreateOk","确定重建")})]})]})}),document.body)]})}function hm({team:o,onOpen:S,onRename:T,onRefresh:r}){var ce,Q,ye,ae;const R=(gm[o.status]||gm.error).tone,[X,H]=E.useState(!1),[j,_]=E.useState(o.name||""),[Y,L]=E.useState(null),[I,tt]=E.useState(""),et=Y??o.name;E.useEffect(()=>{Y!=null&&o.name===Y&&L(null)},[o.name,Y]);const V=J=>{var wt;(wt=J==null?void 0:J.stopPropagation)==null||wt.call(J),_(et||""),H(!0)},ft=async()=>{H(!1);const J=String(j||"").trim();if(!T||!J||J===et)return;L(J),tt("saving");let wt;try{wt=await T(o.id,J)}catch(rt){wt={ok:!1,error:rt==null?void 0:rt.message}}L(null),wt&&wt.ok?(tt("saved"),setTimeout(()=>tt(rt=>rt==="saved"?"":rt),1500)):(tt(""),de.show({message:v("localTeams.renameFailed","改名没保存,已恢复"),status:"error",ttl:4e3}))},st=!!((Q=(ce=window.cicy)==null?void 0:ce.sidecar)!=null&&Q.restart)&&Fs(o.base_url),ht=o.status==="running",[yt,gt]=E.useState(""),[St,G]=E.useState(!1),[Nt,B]=E.useState({running:void 0,latest:null,installed:null}),xt=Nt.latest,Ut=Nt.running,[Kt,me]=E.useState(!1),ue=E.useRef(null),Rt=E.useRef(null),y=E.useRef(null),[O,$]=E.useState({top:0,left:0}),ot=184,_t=()=>{if(!St&&Rt.current){const J=Rt.current.getBoundingClientRect(),wt=Math.max(8,Math.min(J.right-ot,window.innerWidth-ot-8));$({top:Math.round(J.bottom+4),left:Math.round(wt)})}G(J=>!J)},d=E.useCallback(async(J=!1)=>{var wt,rt;if(!(!st||!((rt=(wt=window.cicy)==null?void 0:wt.sidecar)!=null&&rt.versions))){J&&me(!0);try{const dt=await window.cicy.sidecar.versions();B({running:(dt==null?void 0:dt.running)??null,latest:(dt==null?void 0:dt.latest)??null,installed:(dt==null?void 0:dt.installed)??null}),J&&(dt!=null&&dt.running&&(dt!=null&&dt.latest)&&ym(dt.latest,dt.running)>0?de.show({message:`${v("sidecar.found","发现新版本")} v${dt.latest}`,status:"done",ttl:2500}):dt!=null&&dt.running?de.show({message:`${v("sidecar.upToDate","已是最新")} v${dt.running}`,status:"done",ttl:2500}):de.show({message:v("sidecar.notRunning","cicy-code 未运行"),status:"error",ttl:4e3}))}catch{J&&de.show({message:v("sidecar.checkFailed","检查更新失败"),status:"error",ttl:5e3})}finally{J&&me(!1)}}},[st]);E.useEffect(()=>{d(!1)},[d]),E.useEffect(()=>{ht&&d(!1)},[ht,d]);const C=!!(st&&xt&&Ut&&ym(xt,Ut)>0),q=!st&&!!((ae=(ye=window.cicy)==null?void 0:ye.localTeams)!=null&&ae.remove),K=st||q,[it,ct]=E.useState(!1);E.useEffect(()=>{if(!St)return;const J=wt=>{var rt,dt;(rt=Rt.current)!=null&&rt.contains(wt.target)||(dt=y.current)!=null&&dt.contains(wt.target)||G(!1)};return document.addEventListener("mousedown",J),()=>document.removeEventListener("mousedown",J)},[St]),E.useEffect(()=>{St||ct(!1)},[St]);const U=async()=>{var J,wt,rt;if(!it){ct(!0);return}if(G(!1),ct(!1),!yt){gt("remove");try{await((rt=(wt=(J=window.cicy)==null?void 0:J.localTeams)==null?void 0:wt.remove)==null?void 0:rt.call(wt,o.id))}catch{}gt(""),r==null||r()}},P=`sidecar-op:${o.id}`,Z=async(J,wt,rt)=>{var Pa,Ca,ge,Ea,w;if(G(!1),yt)return;gt(J);const dt=J==="update";let aa=null;dt?(ca.open({teamId:o.id,fromVer:Ut,toVer:xt,onRetry:()=>Z("update",wt,rt)}),(Ca=(Pa=window.cicy)==null?void 0:Pa.sidecar)!=null&&Ca.onOpProgress&&(aa=window.cicy.sidecar.onOpProgress(M=>{(M==null?void 0:M.op)==="update"&&ca.push(M)}))):de.show({id:P,message:vt[J]||`${J}…`,status:"running",progress:void 0});try{const M=await wt(),k=!!(M!=null&&M.ok),lt=M!=null&&M.warning?`${rt}(${M.warning})`:rt,nt=v("sidecar.failed","操作失败")+(M!=null&&M.error?`: ${M.error}`:"");if(dt){if(ca.finish({ok:k,message:k?lt:nt}),k)try{await((w=(Ea=(ge=window.cicy)==null?void 0:ge.localTeams)==null?void 0:Ea.reload)==null?void 0:w.call(Ea,o.id,{ignoreCache:!0}))}catch{}}else de.show({id:P,message:k?lt:nt,progress:void 0,status:k?"done":"error",ttl:k?4e3:8e3})}catch(M){const k=v("sidecar.failed","操作失败")+`: ${(M==null?void 0:M.message)||M}`;dt?ca.finish({ok:!1,message:k}):de.show({id:P,message:k,progress:void 0,status:"error",ttl:8e3})}finally{try{aa&&aa()}catch{}gt(""),r==null||r(),(J==="update"||J==="restart"||J==="start")&&d(!1)}},vt={start:"启动中…",restart:"重启中…",update:"更新中…",stop:"停止中…"},Qt=async()=>{var J,wt;if(!yt){if(!ht&&st&&((wt=(J=window.cicy)==null?void 0:J.sidecar)!=null&&wt.start)){gt("start"),de.show({id:P,message:vt.start,status:"running",progress:void 0});const rt=await window.cicy.sidecar.start().catch(dt=>({ok:!1,error:(dt==null?void 0:dt.message)||String(dt)}));if(gt(""),r==null||r(),!(rt!=null&&rt.ok)||rt!=null&&rt.warning){de.show({id:P,message:v("sidecar.startFailed","启动失败")+(rt!=null&&rt.error?`: ${rt.error}`:rt!=null&&rt.warning?`: ${rt.warning}`:""),status:"error",ttl:8e3});return}de.dismiss(P)}S()}},Xt=ht?v("localTeams.open","打开"):st?v("localTeams.startOpen","启动并打开"):v("localTeams.open","打开");return c.jsxs("div",{"data-id":"LocalTeamCard",className:`bcard ${st?"bcard--local":"bcard--custom"}${R==="ok"?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent"}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":R}),c.jsx(jm,{})]}),K&&c.jsxs("div",{className:"bcard__menuwrap",ref:ue,onClick:J=>J.stopPropagation(),children:[c.jsx("button",{type:"button",ref:Rt,"data-id":"LocalTeamCard-menu-btn",className:`bcard__kebab${C?" has-dot":""}`,title:st?v("localTeams.manage","管理本地 cicy-code"):v("localTeams.more","更多"),disabled:!!yt,onClick:_t,children:yt?c.jsx(Ce,{}):c.jsx(Ps,{})}),St&&cn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"LocalTeamCard-menu",role:"menu",ref:y,style:{position:"fixed",top:O.top,left:O.left,width:ot},onClick:J=>J.stopPropagation(),children:[st&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-check-update",className:"bcard__menu-item",disabled:Kt,onClick:J=>{J.stopPropagation(),d(!0)},children:Kt?v("sidecar.checking2","检查中…"):v("sidecar.checkUpdate","检查更新")}),C&&c.jsxs("button",{type:"button","data-id":"LocalTeamCard-update",className:"bcard__menu-item is-accent",onClick:()=>Z("update",()=>window.cicy.sidecar.update(),v("sidecar.updated","已更新到最新")),children:[v("sidecar.updateTo","更新到")," v",xt]}),o.base_url&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-reload",className:"bcard__menu-item",onClick:J=>{var wt,rt,dt;J.stopPropagation(),G(!1),(dt=(rt=(wt=window.cicy)==null?void 0:wt.tabs)==null?void 0:rt.reloadIfOpen)==null||dt.call(rt,o.base_url,o.name)},children:v("localTeams.reloadWindow","刷新窗口")}),st&&ht&&c.jsxs(c.Fragment,{children:[c.jsx("button",{type:"button","data-id":"LocalTeamCard-restart",className:"bcard__menu-item",onClick:()=>Z("restart",()=>window.cicy.sidecar.restart(),v("sidecar.restarted","已重启")),children:v("sidecar.restart","重启")}),c.jsx("button",{type:"button","data-id":"LocalTeamCard-stop",className:"bcard__menu-item is-danger",onClick:()=>Z("stop",()=>window.cicy.sidecar.stop(),v("sidecar.stoppedDone","已停止")),children:v("sidecar.stop","停止")})]}),o.cloud_team_id&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-billing",className:"bcard__menu-item",onClick:J=>{J.stopPropagation(),G(!1),ni(`?team=${encodeURIComponent(o.cloud_team_id)}`)},children:v("localTeams.billing","账单")}),q&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-remove",className:"bcard__menu-item is-danger",onClick:U,children:it?v("localTeams.removeConfirm","确认删除?"):v("localTeams.remove","删除")}),c.jsx("button",{type:"button","data-id":"LocalTeamCard-addr",className:"bcard__menu-item",title:v("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:J=>{J.stopPropagation(),G(!1);try{navigator.clipboard.writeText(o.base_url||"")}catch{}},children:o.base_url||"—"}),(Ut||o.version)&&c.jsxs("div",{"data-id":"LocalTeamCard-version",className:"bcard__menu-item",style:{cursor:"default",color:"#8b949e",fontSize:12},children:[v("localTeams.version","版本")," v",Ut||o.version]})]}),document.body)]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:X?c.jsx("input",{"data-id":"LocalTeamCard-rename-input",autoFocus:!0,value:j,onChange:J=>_(J.target.value),onFocus:J=>J.target.select(),onBlur:ft,onClick:J=>J.stopPropagation(),onKeyDown:J=>{J.nativeEvent.isComposing||J.keyCode===229||(J.key==="Enter"?ft():J.key==="Escape"&&H(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):c.jsxs("h3",{className:"bcard__name",title:v("localTeams.renameHint","点名字或 ✎ 改名"),style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:V,children:[c.jsx("span",{"data-id":"LocalTeamCard-name-text",onClick:V,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:"text"},children:et}),I==="saving"&&c.jsx("span",{"data-id":"LocalTeamCard-save-state",title:v("localTeams.saving","保存中…"),style:{flex:"none",display:"inline-flex"},children:c.jsx(Ce,{})}),I==="saved"&&c.jsx("span",{"data-id":"LocalTeamCard-save-state",title:v("localTeams.saved","已保存"),style:{flex:"none",color:"#3fb950",fontSize:13,lineHeight:1},children:"✓"}),!I&&c.jsx("button",{type:"button","data-id":"LocalTeamCard-rename-btn",title:v("localTeams.rename","重命名"),onClick:V,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsx("div",{className:"bcard__meta",children:c.jsx("span",{className:"bcard__chip","data-id":"LocalTeamCard-kind",children:st?v("localTeams.kindLocal","本地"):v("localTeams.kindCustom","自定义")})})]}),c.jsxs("button",{type:"button",className:"bcard__cta","data-id":"LocalTeamCard-open",disabled:!!yt||!o.base_url,onClick:Qt,children:[yt&&yt!=="stop"?c.jsx(Ce,{}):c.jsx(ju,{}),c.jsx("span",{children:yt&&vt[yt]||Xt})]})]})}function Fs(o){try{const S=new URL(o);return(S.hostname==="127.0.0.1"||S.hostname==="localhost"||S.hostname==="::1")&&(S.port==="8008"||S.port==="")}catch{return!1}}function Zs(o){try{const S=new URL(o);return(S.hostname==="127.0.0.1"||S.hostname==="localhost"||S.hostname==="::1")&&S.port==="8008"}catch{return!1}}function ym(o,S){const T=String(o).split("."),r=String(S).split(".");for(let D=0;D<Math.max(T.length,r.length);D++){const R=(parseInt(T[D],10)||0)-(parseInt(r[D],10)||0);if(R)return R>0?1:-1}return 0}const gm={running:{tone:"ok",label:"running",cta:"打开"},stopped:{tone:"off",label:"stopped",cta:"未运行"},auth_error:{tone:"warn",label:"auth error",cta:"Token 失效"},misconfigured:{tone:"err",label:"bad config",cta:"URL 错误"},error:{tone:"err",label:"error",cta:"异常"}};function fg({team:o,onOpen:S,onRename:T}){const r=o.kind==="private",D=o.status==="active",R=o.name||o.title||"—",[X,H]=E.useState(!1),[j,_]=E.useState(""),[Y,L]=E.useState(null),I=Y??R;E.useEffect(()=>{Y!=null&&R===Y&&L(null)},[R,Y]);const tt=y=>{var O;(O=y==null?void 0:y.stopPropagation)==null||O.call(y),_(I==="—"?"":I),H(!0)},et=async()=>{H(!1);const y=String(j||"").trim();if(!(!T||!y||y===I)){L(y);try{const O=await T(o.id,y);O!=null&&O.ok||L(null)}catch{L(null)}}},V=o.host_url||"",ft=o.teamId||o.id,Tt=r?"私有云":o.team_kind==="personal"?"个人":"共享",st=r?V:o.workspace_url||o.workspace_direct_url,ht=!!st,[yt,gt]=E.useState(!1),[St,G]=E.useState(!1),[Nt,B]=E.useState({top:0,left:0}),xt=E.useRef(null),Ut=E.useRef(null),Kt=E.useRef(null),me=184,ue=()=>{if(!yt&&Ut.current){const y=Ut.current.getBoundingClientRect(),O=Math.max(8,Math.min(y.right-me,window.innerWidth-me-8));B({top:Math.round(y.bottom+4),left:Math.round(O)})}gt(y=>!y)};E.useEffect(()=>{if(!yt)return;const y=O=>{var $,ot;($=Ut.current)!=null&&$.contains(O.target)||(ot=Kt.current)!=null&&ot.contains(O.target)||gt(!1)};return document.addEventListener("mousedown",y),()=>document.removeEventListener("mousedown",y)},[yt]);const Rt=y=>{var O,$,ot,_t;(O=y==null?void 0:y.stopPropagation)==null||O.call(y),ht&&(gt(!1),(_t=(ot=($=window.cicy)==null?void 0:$.tabs)==null?void 0:ot.reloadIfOpen)==null||_t.call(ot,st,I))};return c.jsxs("div",{"data-id":"TeamCard",className:`bcard bcard--cloud${D?" bcard--online":""}`,children:[c.jsx("div",{className:"bcard__accent"}),c.jsxs("div",{className:"bcard__top",children:[c.jsxs("div",{className:"bcard__pill",children:[c.jsx("span",{className:"bcard__dot","data-tone":D?"ok":"off"}),c.jsx(dg,{})]}),c.jsxs("div",{className:"bcard__top-right",children:[o.is_trial&&c.jsx("span",{className:"bcard__badge",children:"trial"}),(ht||ft!=null)&&c.jsxs("div",{className:"bcard__menuwrap",ref:xt,onClick:y=>y.stopPropagation(),children:[c.jsx("button",{type:"button",ref:Ut,"data-id":"TeamCard-menu-btn",className:"bcard__kebab",title:v("localTeams.more","更多"),disabled:St,onClick:ue,children:St?c.jsx(Ce,{}):c.jsx(Ps,{})}),yt&&cn.createPortal(c.jsxs("div",{className:"bcard__menu bcard__menu--portal","data-id":"TeamCard-menu",role:"menu",ref:Kt,style:{position:"fixed",top:Nt.top,left:Nt.left,width:me},onClick:y=>y.stopPropagation(),children:[ht&&c.jsx("button",{type:"button","data-id":"TeamCard-reload",className:"bcard__menu-item",onClick:Rt,children:v("localTeams.reloadWindow","刷新窗口")}),ft!=null&&c.jsx("button",{type:"button","data-id":"TeamCard-billing",className:"bcard__menu-item",onClick:y=>{y.stopPropagation(),gt(!1),ni(`?team=${encodeURIComponent(ft)}`)},children:v("localTeams.billing","账单")}),ht&&c.jsx("button",{type:"button","data-id":"TeamCard-addr",className:"bcard__menu-item",title:v("localTeams.copyAddr","点击复制地址"),style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},onClick:y=>{y.stopPropagation(),gt(!1);try{navigator.clipboard.writeText(st||V||"")}catch{}},children:r?V||st:st||o.runtime_region||o.region||"—"})]}),document.body)]})]})]}),c.jsxs("div",{className:"bcard__body",children:[c.jsx("div",{style:{height:28,display:"flex",alignItems:"center"},children:X?c.jsx("input",{"data-id":"TeamCard-rename-input",autoFocus:!0,value:j,onChange:y=>_(y.target.value),onFocus:y=>y.target.select(),onBlur:et,onClick:y=>y.stopPropagation(),onKeyDown:y=>{y.nativeEvent.isComposing||y.keyCode===229||(y.key==="Enter"?et():y.key==="Escape"&&H(!1))},style:{flex:1,width:"100%",font:"inherit",fontWeight:600,padding:"2px 6px",border:"1px solid #3b82f6",borderRadius:6,background:"#0d1117",color:"#e6edf3",boxSizing:"border-box"}}):c.jsxs("h3",{className:"bcard__name",title:T?v("localTeams.renameHint","点名字或 ✎ 改名"):I,style:{display:"flex",alignItems:"center",gap:6,flex:1,minWidth:0,margin:0},onDoubleClick:T?tt:void 0,children:[c.jsx("span",{onClick:T?tt:void 0,style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",cursor:T?"text":"default"},children:I}),T&&c.jsx("button",{type:"button","data-id":"TeamCard-rename-btn",title:v("localTeams.rename","重命名"),onClick:tt,style:{flex:"none",cursor:"pointer",border:"none",background:"transparent",color:"#8b949e",fontSize:13,padding:0,lineHeight:1},children:"✎"})]})}),c.jsxs("div",{className:"bcard__meta",children:[c.jsx("span",{className:"bcard__chip",children:Tt}),!r&&o.membership_status&&o.membership_status!=="active"&&c.jsx("span",{className:"bcard__chip",children:o.membership_status})]})]}),c.jsxs("button",{type:"button",className:"bcard__cta",onClick:S,disabled:!ht,children:[c.jsx(ju,{}),c.jsx("span",{children:ht?v("localTeams.open","打开"):r?v("teamCard.noHost","未填访问地址"):v("teamCard.noUrl","无 URL")})]})]})}function Vs(){return c.jsxs("div",{className:"brand",children:[c.jsx("div",{className:"brand-mark",children:c.jsx(Tm,{})}),c.jsxs("div",{className:"brand-text",children:[c.jsx("div",{className:"brand-name",children:"CiCy Desktop"}),c.jsx("div",{className:"brand-sub",children:"团队 AI 协作工作台"})]})]})}function Tm(){return c.jsx("svg",{width:"22",height:"22",viewBox:"0 0 96 96",fill:"none",children:c.jsx("path",{d:"M48 11L39.5 33.3L16 29.5L31 48L16 66.5L39.5 62.7L48 85L56.5 62.7L80 66.5L65 48L80 29.5L56.5 33.3Z",fill:"white",stroke:"white",strokeWidth:"8",strokeLinejoin:"round",strokeLinecap:"round"})})}function ju(){return c.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),c.jsx("polyline",{points:"12 5 19 12 12 19"})]})}function Ce(){return c.jsx("svg",{className:"spin",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.4",strokeLinecap:"round",children:c.jsx("path",{d:"M21 12a9 9 0 1 1-6.2-8.55"})})}function jm(){return c.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),c.jsx("line",{x1:"2",y1:"20",x2:"22",y2:"20"})]})}function Ps(){return c.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[c.jsx("circle",{cx:"12",cy:"5",r:"1.7"}),c.jsx("circle",{cx:"12",cy:"12",r:"1.7"}),c.jsx("circle",{cx:"12",cy:"19",r:"1.7"})]})}function dg(){return c.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[c.jsx("circle",{cx:"12",cy:"12",r:"10"}),c.jsx("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),c.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}function ai(o){try{return localStorage.getItem(o)||null}catch{return null}}function Ks(o){return o?/timeout/i.test(o)?"登录超时,请重新点击 Login。":/state/i.test(o)?"校验失败,请重新登录。":/no token/i.test(o)?"登录未完成,请重试。":/bridge missing/i.test(o)?"无法连接到登录服务(preload 未就绪)。":o:""}var pm;const mg=((pm=window.cicy)==null?void 0:pm.platform)||(()=>{const o=navigator.userAgent||"";return/Mac/i.test(o)?"darwin":/Windows/i.test(o)?"win32":"linux"})();document.documentElement.dataset.platform=mg;document.documentElement.dataset.fullscreen="0";var vm,bm;(bm=(vm=window.cicy)==null?void 0:vm.window)!=null&&bm.onFullscreen&&window.cicy.window.onFullscreen(o=>{document.documentElement.dataset.fullscreen=o?"1":"0"});Wy.createRoot(document.getElementById("root")).render(c.jsx(ag,{}));
|
|
@@ -6,8 +6,8 @@
|
|
|
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-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
9
|
+
<script type="module" crossorigin src="./assets/index-DpB75035.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BwoV_5tD.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<div id="root"></div>
|
package/src/i18n/locales/en.json
CHANGED
|
@@ -152,7 +152,15 @@
|
|
|
152
152
|
"rebootShort": "Restart Windows",
|
|
153
153
|
"installerLaunched": "Docker installer opened — finish it (installs WSL2, may reboot), then click Retry",
|
|
154
154
|
"engineDown": "Docker engine down · Start",
|
|
155
|
-
"startDocker": "Start Docker"
|
|
155
|
+
"startDocker": "Start Docker",
|
|
156
|
+
"update": "Update cicy-code",
|
|
157
|
+
"reloadWindow": "Reload window",
|
|
158
|
+
"dockerRestart": "Restart Docker",
|
|
159
|
+
"dockerRestarted": "Docker container restarted",
|
|
160
|
+
"recreate": "Rebuild Docker",
|
|
161
|
+
"billing": "Billing",
|
|
162
|
+
"opsGroup": "Docker container",
|
|
163
|
+
"openNoToken": "Service not ready yet — wait a few seconds and click Open again (or menu → Restart)."
|
|
156
164
|
},
|
|
157
165
|
"common": {
|
|
158
166
|
"close": "Close",
|
|
@@ -173,4 +181,4 @@
|
|
|
173
181
|
"copyLink": "Copy link",
|
|
174
182
|
"linkCopied": "Link copied — paste it into your browser"
|
|
175
183
|
}
|
|
176
|
-
}
|
|
184
|
+
}
|
package/src/i18n/locales/fr.json
CHANGED
|
@@ -151,7 +151,15 @@
|
|
|
151
151
|
"rebootShort": "Redémarrer Windows",
|
|
152
152
|
"installerLaunched": "Programme d installation Docker ouvert — terminez-le (WSL2/redemarrage), puis Reessayer",
|
|
153
153
|
"engineDown": "Moteur Docker arrete · Demarrer",
|
|
154
|
-
"startDocker": "Demarrer Docker"
|
|
154
|
+
"startDocker": "Demarrer Docker",
|
|
155
|
+
"update": "Mettre à jour cicy-code",
|
|
156
|
+
"reloadWindow": "Recharger la fenêtre",
|
|
157
|
+
"dockerRestart": "Redémarrer Docker",
|
|
158
|
+
"dockerRestarted": "Conteneur Docker redémarré",
|
|
159
|
+
"recreate": "Reconstruire Docker",
|
|
160
|
+
"billing": "Facturation",
|
|
161
|
+
"opsGroup": "Conteneur Docker",
|
|
162
|
+
"openNoToken": "Service pas encore prêt — patientez puis recliquez sur Ouvrir (ou menu → Redémarrer)."
|
|
155
163
|
},
|
|
156
164
|
"common": {
|
|
157
165
|
"close": "Fermer",
|
|
@@ -172,4 +180,4 @@
|
|
|
172
180
|
"copyLink": "Copier le lien",
|
|
173
181
|
"linkCopied": "Lien copié — collez-le dans le navigateur"
|
|
174
182
|
}
|
|
175
|
-
}
|
|
183
|
+
}
|
package/src/i18n/locales/ja.json
CHANGED
|
@@ -151,7 +151,15 @@
|
|
|
151
151
|
"rebootShort": "Windows 再起動",
|
|
152
152
|
"installerLaunched": "Docker インストーラーを開きました。完了後(WSL2/再起動あり)「再試行」を押してください",
|
|
153
153
|
"engineDown": "Docker エンジン停止 · 起動",
|
|
154
|
-
"startDocker": "Docker を起動"
|
|
154
|
+
"startDocker": "Docker を起動",
|
|
155
|
+
"update": "cicy-code を更新",
|
|
156
|
+
"reloadWindow": "ウィンドウを再読み込み",
|
|
157
|
+
"dockerRestart": "Docker を再起動",
|
|
158
|
+
"dockerRestarted": "Docker コンテナを再起動しました",
|
|
159
|
+
"recreate": "Docker を再構築",
|
|
160
|
+
"billing": "請求",
|
|
161
|
+
"opsGroup": "Docker コンテナ",
|
|
162
|
+
"openNoToken": "サービスがまだ準備できていません。数秒待ってから「開く」を再度クリック(またはメニュー→再起動)。"
|
|
155
163
|
},
|
|
156
164
|
"common": {
|
|
157
165
|
"close": "閉じる",
|
|
@@ -172,4 +180,4 @@
|
|
|
172
180
|
"copyLink": "リンクをコピー",
|
|
173
181
|
"linkCopied": "リンクをコピーしました。ブラウザに貼り付けてください"
|
|
174
182
|
}
|
|
175
|
-
}
|
|
183
|
+
}
|
|
@@ -152,7 +152,15 @@
|
|
|
152
152
|
"rebootShort": "需重启 Windows",
|
|
153
153
|
"installerLaunched": "已打开 Docker 安装程序——请完成安装(会装 WSL2、可能需重启),装好后点「重试」",
|
|
154
154
|
"engineDown": "Docker 未运行 · 点启动",
|
|
155
|
-
"startDocker": "启动 Docker"
|
|
155
|
+
"startDocker": "启动 Docker",
|
|
156
|
+
"update": "更新 cicy-code",
|
|
157
|
+
"reloadWindow": "刷新窗口",
|
|
158
|
+
"dockerRestart": "重启 Docker",
|
|
159
|
+
"dockerRestarted": "已重启 Docker 容器",
|
|
160
|
+
"recreate": "重建 Docker",
|
|
161
|
+
"billing": "帐单",
|
|
162
|
+
"opsGroup": "Docker 容器",
|
|
163
|
+
"openNoToken": "服务还没就绪,稍等几秒再点「打开」(或用卡片菜单「重启」)。"
|
|
156
164
|
},
|
|
157
165
|
"common": {
|
|
158
166
|
"close": "关闭",
|
|
@@ -173,4 +181,4 @@
|
|
|
173
181
|
"copyLink": "复制链接",
|
|
174
182
|
"linkCopied": "链接已复制,粘到浏览器打开"
|
|
175
183
|
}
|
|
176
|
-
}
|
|
184
|
+
}
|
|
@@ -839,6 +839,14 @@ body {
|
|
|
839
839
|
.bcard__menu-item.is-accent:hover { background: var(--accent-soft); color: #c7dbff; }
|
|
840
840
|
.bcard__menu-item.is-danger { color: #f7a3a3; }
|
|
841
841
|
.bcard__menu-item.is-danger:hover { background: rgba(239,68,68,.16); color: #fff; }
|
|
842
|
+
/* Labeled divider grouping the Docker container ops below it (主人: docker 操作放一起 + divider). */
|
|
843
|
+
.bcard__menu-sep {
|
|
844
|
+
display: flex; align-items: center; gap: 8px;
|
|
845
|
+
margin: 5px 0 2px; padding: 0 12px;
|
|
846
|
+
font-size: 10.5px; letter-spacing: .04em; text-transform: uppercase;
|
|
847
|
+
color: #6b7280; user-select: none;
|
|
848
|
+
}
|
|
849
|
+
.bcard__menu-sep::after { content: ""; flex: 1; height: 1px; background: rgba(255,255,255,.08); }
|
|
842
850
|
/* Portaled to document.body to escape .bcard's overflow:hidden (which clipped the
|
|
843
851
|
dropdown). Inline top/left position it under the kebab; here just a high
|
|
844
852
|
stacking order (below toast/drawer) + word-wrapping items so nothing overflows. */
|
|
@@ -2021,13 +2021,28 @@ function DockerCard({ dockerTeam, cloudTitle, onOpen, onRename, onRefresh }) {
|
|
|
2021
2021
|
ref={menuRef}
|
|
2022
2022
|
style={{ position: "fixed", top: menuPos.top, left: menuPos.left, width: MENU_W }}
|
|
2023
2023
|
onClick={(e) => e.stopPropagation()}>
|
|
2024
|
+
{/* 常用:更新 / 刷新窗口 / 帐单 / 地址 */}
|
|
2024
2025
|
<button type="button" data-id="DockerCard-update" className="bcard__menu-item is-accent" onClick={runUpdate}>
|
|
2025
|
-
{tr("docker.update", "更新")}
|
|
2026
|
+
{tr("docker.update", "更新 cicy-code")}
|
|
2026
2027
|
</button>
|
|
2027
2028
|
<button type="button" data-id="DockerCard-reload" className="bcard__menu-item"
|
|
2028
2029
|
onClick={(e) => { e.stopPropagation(); setMenuOpen(false); window.cicy?.tabs?.reloadIfOpen?.("http://127.0.0.1:8008", displayName); }}>
|
|
2029
2030
|
{tr("docker.reloadWindow", "刷新窗口")}
|
|
2030
2031
|
</button>
|
|
2032
|
+
<button type="button" data-id="DockerCard-billing" className="bcard__menu-item"
|
|
2033
|
+
onClick={() => { setMenuOpen(false); openCloudPage(dockerTeam?.cloud_team_id ? `?team=${encodeURIComponent(dockerTeam.cloud_team_id)}` : "?view=usage"); }}>
|
|
2034
|
+
{tr("docker.billing", "帐单")}
|
|
2035
|
+
</button>
|
|
2036
|
+
<button type="button" data-id="DockerCard-addr" className="bcard__menu-item"
|
|
2037
|
+
title={tr("localTeams.copyAddr", "点击复制地址")}
|
|
2038
|
+
style={{ whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }}
|
|
2039
|
+
onClick={(e) => { e.stopPropagation(); setMenuOpen(false); try { navigator.clipboard.writeText("http://127.0.0.1:8008"); } catch {} }}>
|
|
2040
|
+
http://127.0.0.1:8008
|
|
2041
|
+
</button>
|
|
2042
|
+
{/* ── Docker 容器操作(归到一起,divider 分隔)── */}
|
|
2043
|
+
<div className="bcard__menu-sep" data-id="DockerCard-menu-sep" role="separator">
|
|
2044
|
+
<span>{tr("docker.opsGroup", "Docker 容器")}</span>
|
|
2045
|
+
</div>
|
|
2031
2046
|
<button type="button" data-id="DockerCard-restart" className="bcard__menu-item"
|
|
2032
2047
|
onClick={() => runOp("restart", () => window.cicy.docker.appRestart(), tr("docker.restarted", "已重启 cicy-code"))}>
|
|
2033
2048
|
{tr("docker.restart", "重启 cicy-code")}
|
|
@@ -2041,19 +2056,9 @@ function DockerCard({ dockerTeam, cloudTitle, onOpen, onRename, onRefresh }) {
|
|
|
2041
2056
|
{tr("docker.recreate", "重建 Docker")}
|
|
2042
2057
|
</button>
|
|
2043
2058
|
<button type="button" data-id="DockerCard-stop" className="bcard__menu-item is-danger"
|
|
2044
|
-
onClick={() => runOp("stop", () => window.cicy.docker.appStop(), tr("docker.
|
|
2059
|
+
onClick={() => runOp("stop", () => window.cicy.docker.appStop(), tr("docker.stop", "停止 cicy-code"))}>
|
|
2045
2060
|
{tr("docker.stop", "停止")}
|
|
2046
2061
|
</button>
|
|
2047
|
-
<button type="button" data-id="DockerCard-billing" className="bcard__menu-item"
|
|
2048
|
-
onClick={() => { setMenuOpen(false); openCloudPage(dockerTeam?.cloud_team_id ? `?team=${encodeURIComponent(dockerTeam.cloud_team_id)}` : "?view=usage"); }}>
|
|
2049
|
-
{tr("docker.billing", "帐单")}
|
|
2050
|
-
</button>
|
|
2051
|
-
<button type="button" data-id="DockerCard-addr" className="bcard__menu-item"
|
|
2052
|
-
title={tr("localTeams.copyAddr", "点击复制地址")}
|
|
2053
|
-
style={{ whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }}
|
|
2054
|
-
onClick={(e) => { e.stopPropagation(); setMenuOpen(false); try { navigator.clipboard.writeText("http://127.0.0.1:8008"); } catch {} }}>
|
|
2055
|
-
http://127.0.0.1:8008
|
|
2056
|
-
</button>
|
|
2057
2062
|
</div>,
|
|
2058
2063
|
document.body
|
|
2059
2064
|
)}
|