diff --git a/src/autoteam/api.py b/src/autoteam/api.py index d3dfb7aa..e582ceda 100644 --- a/src/autoteam/api.py +++ b/src/autoteam/api.py @@ -180,6 +180,7 @@ class SourceConfig(BaseModel): "AUTO_CHECK_MIN_LOW", "AUTO_CHECK_RETRY_ADD_PHONE", "AUTO_CHECK_ADD_PHONE_MAX_RETRIES", + "AUTO_CHECK_SKIP_STANDBY_REUSE", "PLAYWRIGHT_PROXY_URL", "PLAYWRIGHT_PROXY_SERVER", "PLAYWRIGHT_PROXY_USERNAME", @@ -668,6 +669,7 @@ def _sync_runtime_globals(): AUTO_CHECK_INTERVAL, AUTO_CHECK_MIN_LOW, AUTO_CHECK_RETRY_ADD_PHONE, + AUTO_CHECK_SKIP_STANDBY_REUSE, AUTO_CHECK_TARGET_SEATS, AUTO_CHECK_THRESHOLD, ) @@ -678,6 +680,7 @@ def _sync_runtime_globals(): auto_check_config["min_low"] = AUTO_CHECK_MIN_LOW auto_check_config["retry_add_phone"] = AUTO_CHECK_RETRY_ADD_PHONE auto_check_config["add_phone_max_retries"] = AUTO_CHECK_ADD_PHONE_MAX_RETRIES + auto_check_config["skip_standby_reuse"] = AUTO_CHECK_SKIP_STANDBY_REUSE if auto_check_restart is not None: auto_check_restart.set() except Exception: @@ -2281,16 +2284,17 @@ def _run(): from autoteam.accounts import STATUS_ACTIVE, update_account from autoteam.codex_auth import ( check_codex_quota, - login_codex_via_browser, quota_result_quota_info, quota_result_resets_at, save_auth_file, ) from autoteam.mail_provider import get_mail_client_for_account + from autoteam.manager import _login_codex_with_result mail_client = get_mail_client_for_account(acc) mail_client.login() - bundle = login_codex_via_browser(email, acc.get("password", ""), mail_client=mail_client) + login_result = _login_codex_with_result(email, acc.get("password", ""), mail_client=mail_client) + bundle = login_result.get("bundle") if login_result.get("ok") else None if bundle: plan_type = str(bundle.get("plan_type") or "").lower() if plan_type != "team": @@ -2321,7 +2325,8 @@ def _run(): sync_to_cpa() return {"email": email, "plan": bundle.get("plan_type"), "auth_file": auth_file} - raise RuntimeError(f"Codex 登录失败: {email}") + detail = login_result.get("error_detail") or login_result.get("error_type") or "登录失败" + raise RuntimeError(f"Codex 登录失败({detail}): {email}") task = _start_task(f"login:{email}", _run, {"email": email}) return task @@ -2742,6 +2747,9 @@ def cancel_task(task_id: str): from autoteam.config import ( AUTO_CHECK_RETRY_ADD_PHONE as _DEFAULT_RETRY_ADD_PHONE, ) +from autoteam.config import ( + AUTO_CHECK_SKIP_STANDBY_REUSE as _DEFAULT_SKIP_STANDBY_REUSE, +) from autoteam.config import ( AUTO_CHECK_TARGET_SEATS as _DEFAULT_TARGET_SEATS, ) @@ -2757,6 +2765,7 @@ def cancel_task(task_id: str): "min_low": _DEFAULT_MIN_LOW, "retry_add_phone": _DEFAULT_RETRY_ADD_PHONE, "add_phone_max_retries": _DEFAULT_ADD_PHONE_MAX_RETRIES, + "skip_standby_reuse": _DEFAULT_SKIP_STANDBY_REUSE, } _auto_check_stop = threading.Event() _auto_check_restart = threading.Event() # 配置变更时通知线程重启 @@ -3257,6 +3266,7 @@ class AutoCheckConfig(BaseModel): min_low: int = 2 # 触发轮转的最少账号数 retry_add_phone: bool = True # 是否自动重试 add_phone add_phone_max_retries: int = 3 # add_phone 最大自动重试次数 + skip_standby_reuse: bool = False # 跳过旧账号复用,直接注册新账号 def _normalized_auto_check_config(cfg: AutoCheckConfig | dict[str, object]) -> dict[str, int | bool]: @@ -3267,6 +3277,7 @@ def _normalized_auto_check_config(cfg: AutoCheckConfig | dict[str, object]) -> d min_low = cfg.min_low retry_add_phone = cfg.retry_add_phone add_phone_max_retries = cfg.add_phone_max_retries + skip_standby_reuse = cfg.skip_standby_reuse else: interval = cfg.get("interval", _auto_check_config.get("interval", _DEFAULT_INTERVAL)) target_seats = cfg.get("target_seats", _auto_check_config.get("target_seats", _DEFAULT_TARGET_SEATS)) @@ -3279,6 +3290,10 @@ def _normalized_auto_check_config(cfg: AutoCheckConfig | dict[str, object]) -> d "add_phone_max_retries", _auto_check_config.get("add_phone_max_retries", _DEFAULT_ADD_PHONE_MAX_RETRIES), ) + skip_standby_reuse = cfg.get( + "skip_standby_reuse", + _auto_check_config.get("skip_standby_reuse", _DEFAULT_SKIP_STANDBY_REUSE), + ) return { "interval": max(60, int(interval)), @@ -3287,6 +3302,7 @@ def _normalized_auto_check_config(cfg: AutoCheckConfig | dict[str, object]) -> d "min_low": max(1, int(min_low)), "retry_add_phone": bool(retry_add_phone), "add_phone_max_retries": max(1, int(add_phone_max_retries)), + "skip_standby_reuse": bool(skip_standby_reuse), } @@ -3295,6 +3311,7 @@ def get_auto_check_config(): """获取巡检配置""" cfg = _auto_check_config.copy() cfg.setdefault("target_seats", _DEFAULT_TARGET_SEATS) + cfg.setdefault("skip_standby_reuse", _DEFAULT_SKIP_STANDBY_REUSE) return cfg @@ -3313,6 +3330,7 @@ def set_auto_check_config(cfg: AutoCheckConfig): "AUTO_CHECK_MIN_LOW": str(normalized["min_low"]), "AUTO_CHECK_RETRY_ADD_PHONE": "true" if normalized["retry_add_phone"] else "false", "AUTO_CHECK_ADD_PHONE_MAX_RETRIES": str(normalized["add_phone_max_retries"]), + "AUTO_CHECK_SKIP_STANDBY_REUSE": "true" if normalized["skip_standby_reuse"] else "false", } for key, value in persisted.items(): os.environ[key] = value @@ -3321,13 +3339,14 @@ def set_auto_check_config(cfg: AutoCheckConfig): _sync_runtime_env_reload_state() _auto_check_restart.set() # 唤醒巡检线程,立即应用新配置 logger.info( - "[巡检] 配置已更新并持久化: 间隔=%ds 目标seat=%d 阈值=%d%% 触发=%d个 add_phone自动重试=%s 最大重试=%d", + "[巡检] 配置已更新并持久化: 间隔=%ds 目标seat=%d 阈值=%d%% 触发=%d个 add_phone自动重试=%s 最大重试=%d 跳过复用=%s", _auto_check_config["interval"], _auto_check_config["target_seats"], _auto_check_config["threshold"], _auto_check_config["min_low"], "开" if _auto_check_config["retry_add_phone"] else "关", _auto_check_config["add_phone_max_retries"], + "开" if _auto_check_config["skip_standby_reuse"] else "关", ) return _auto_check_config.copy() diff --git a/src/autoteam/codex_auth.py b/src/autoteam/codex_auth.py index 16bf3dff..cf87d21f 100644 --- a/src/autoteam/codex_auth.py +++ b/src/autoteam/codex_auth.py @@ -77,6 +77,8 @@ def _classify_oauth_failure(url, body_excerpt=""): url = (url or "").lower() body = (body_excerpt or "").lower() + if "no_valid_organizations" in url or "no_valid_organizations" in body: + return "no_valid_organizations", "账号暂无有效 organization(可能 provisioning 未完成)", True if "add-phone" in url: return "add_phone", "需要手机号验证", False if "choose-an-account" in url: @@ -931,17 +933,25 @@ def login_codex_via_browser( logger.info("[Codex] 先登录 ChatGPT 选择 Team workspace...") _page = context.new_page() _page.goto("https://chatgpt.com/auth/login", wait_until="domcontentloaded", timeout=60000) + logger.info("[Codex] ChatGPT 登录页已加载: %s", _page.url) time.sleep(5) # Cloudflare + cf_hit = False for _i in range(12): if "verify you are human" not in _page.content()[:2000].lower(): + if cf_hit: + logger.info("[Codex] Cloudflare 已通过") break + if not cf_hit: + logger.info("[Codex] 检测到 Cloudflare 人机验证,等待...") + cf_hit = True time.sleep(5) # 点击登录 try: _page.locator('button:has-text("登录"), button:has-text("Log in")').first.click() + logger.info("[Codex] 已点击登录按钮") time.sleep(3) except Exception: pass @@ -953,6 +963,7 @@ def login_codex_via_browser( ei.fill(email) time.sleep(0.5) _click_primary_auth_button(_page, ei, ["Continue", "继续"]) + logger.info("[Codex] 邮箱已提交,等待密码/验证码页...") time.sleep(3) except Exception: pass @@ -965,6 +976,7 @@ def login_codex_via_browser( pi.fill(password) time.sleep(0.5) _click_primary_auth_button(_page, pi, ["Continue", "继续", "Log in"]) + logger.info("[Codex] 密码已提交") else: # 没有密码,点击"使用一次性验证码登录" otp_btn = _page.locator( diff --git a/src/autoteam/config.py b/src/autoteam/config.py index 84a318c3..9208c2f6 100644 --- a/src/autoteam/config.py +++ b/src/autoteam/config.py @@ -105,6 +105,9 @@ def _normalize_chatgpt_api_transport(value: str) -> str: AUTO_CHECK_MIN_LOW = _get_int_env("AUTO_CHECK_MIN_LOW", 2) # 至少几个账号低于阈值才触发,默认 2 AUTO_CHECK_RETRY_ADD_PHONE = _get_bool_env("AUTO_CHECK_RETRY_ADD_PHONE", True) # 是否自动重试 add_phone AUTO_CHECK_ADD_PHONE_MAX_RETRIES = _get_int_env("AUTO_CHECK_ADD_PHONE_MAX_RETRIES", 3) # add_phone 最大自动重试次数 +AUTO_CHECK_SKIP_STANDBY_REUSE = _get_bool_env( + "AUTO_CHECK_SKIP_STANDBY_REUSE", False +) # 轮转时跳过复用旧账号,直接注册新账号 # Playwright 代理配置 PLAYWRIGHT_PROXY_URL = os.environ.get("PLAYWRIGHT_PROXY_URL", "").strip() diff --git a/src/autoteam/manager.py b/src/autoteam/manager.py index 328b7794..ae3df5ab 100644 --- a/src/autoteam/manager.py +++ b/src/autoteam/manager.py @@ -319,6 +319,7 @@ def _auth_repair_error_label(error_type: str | None) -> str: "token_exchange_failed": "token 交换失败", "non_team_plan": "未进入 Team workspace", "auth_code_missing": "未获取到 auth code", + "no_valid_organizations": "账号暂无有效 organization", "login_failed": "登录失败", "exception": "登录异常", } @@ -575,6 +576,13 @@ def _reject_non_team(bundle: dict | None) -> dict | None: max_attempts, ) + if error_type == "no_valid_organizations": + logger.info( + "[Codex] %s 等待 5s 后重新登录...", + email, + ) + time.sleep(5) + return last_result or { "ok": False, "bundle": None, @@ -1467,7 +1475,11 @@ def _is_email_in_team(email): 'input[placeholder*="email" i], input[placeholder*="Email" i]' ) _DIRECT_PASSWORD_SELECTORS = 'input[name="password"], input[type="password"]' -_DIRECT_CODE_SELECTORS = 'input[name="code"], input[placeholder*="验证码"], input[placeholder*="code" i]' +_DIRECT_CODE_SELECTORS = ( + 'input[name="code"], input[inputmode="numeric"], input[autocomplete="one-time-code"], ' + 'input[placeholder*="验证码"], input[placeholder*="code" i]' +) +_DIRECT_CODE_SLOT_SELECTORS = 'input[maxlength="1"], input[data-input-otp], input[aria-label*="digit" i]' def _safe_invite_screenshot(page, name): @@ -2096,14 +2108,46 @@ def _register_direct_once( return False code_input = None - try: - code_input = page.locator(_DIRECT_CODE_SELECTORS).first - if not code_input.is_visible(timeout=5000): - code_input = None - except Exception: - code_input = None + slot_inputs = [] + expect_code = current_step == "code" + wait_deadline = time.time() + (15 if expect_code else 5) + while time.time() < wait_deadline: + try: + candidate = page.locator(_DIRECT_CODE_SELECTORS).first + if candidate.is_visible(timeout=300): + code_input = candidate + break + except Exception: + pass + try: + candidates = page.locator(_DIRECT_CODE_SLOT_SELECTORS).all() + visible_slots = [] + for loc in candidates: + try: + if loc.is_visible(timeout=150): + visible_slots.append(loc) + except Exception: + continue + if len(visible_slots) >= 4: + slot_inputs = visible_slots + break + except Exception: + pass + if not expect_code: + break + time.sleep(0.4) + + if expect_code and not code_input and not slot_inputs: + logger.warning( + "[直接注册] 验证码页未识别到输入框 | URL: %s | body=%s", + page.url, + _page_excerpt(page), + ) + _safe_invite_screenshot(page, "direct_04b_code_not_found.png") + browser.close() + return False - if code_input: + if code_input or slot_inputs: logger.info("[直接注册] 等待验证码...") verification_code = None start_t = time.time() @@ -2119,17 +2163,47 @@ def _register_direct_once( print(f"\r 等待验证码... ({elapsed}s)", end="", flush=True) time.sleep(3) - if verification_code: - logger.info("[直接注册] 输入验证码: %s", verification_code) - code_input.fill(verification_code) - time.sleep(0.5) - _click_primary_auth_button(page, code_input, ["Continue", "继续"]) - time.sleep(8) - else: + if not verification_code: logger.error("[直接注册] 未收到验证码") browser.close() return False + logger.info("[直接注册] 输入验证码: %s", verification_code) + code_value = str(verification_code).strip() + if slot_inputs: + logger.info("[直接注册] 检测到 %d 个分格验证码输入框", len(slot_inputs)) + for index, char in enumerate(code_value): + if index >= len(slot_inputs): + break + loc = slot_inputs[index] + try: + loc.click(force=True) + except Exception: + pass + try: + loc.fill("") + except Exception: + pass + try: + loc.fill(char) + except Exception: + try: + loc.type(char, delay=50) + except Exception: + try: + page.keyboard.type(char, delay=50) + except Exception: + pass + time.sleep(0.1) + submit_anchor = slot_inputs[-1] + else: + code_input.fill(code_value) + submit_anchor = code_input + + time.sleep(0.5) + _click_primary_auth_button(page, submit_anchor, ["Continue", "继续", "Verify", "验证"]) + time.sleep(8) + _safe_invite_screenshot(page, "direct_05_after_code.png") logger.info("[直接注册] 当前 URL: %s", page.url) @@ -2334,14 +2408,16 @@ def cmd_rotate(target_seats=5, force_auth_repair=False): TARGET = target_seats ACTIVE_TARGET = _pool_active_target(TARGET) - from autoteam.config import AUTO_CHECK_THRESHOLD + from autoteam.config import AUTO_CHECK_SKIP_STANDBY_REUSE, AUTO_CHECK_THRESHOLD try: from autoteam.api import _auto_check_config threshold = _auto_check_config.get("threshold", AUTO_CHECK_THRESHOLD) + skip_standby_reuse = bool(_auto_check_config.get("skip_standby_reuse", AUTO_CHECK_SKIP_STANDBY_REUSE)) except ImportError: threshold = AUTO_CHECK_THRESHOLD + skip_standby_reuse = AUTO_CHECK_SKIP_STANDBY_REUSE chatgpt = None mail_client = None @@ -2475,13 +2551,17 @@ def attempt_seat2_preswitch(low_candidates, current_count): old_email = candidate["email"] logger.info("[4/5] seat=2 且检测到需要切换的子号,尝试先预切换再移除旧号: %s", old_email) - standby_list = [ - a - for a in get_standby_accounts() - if not _is_main_account_email(a.get("email")) - and not is_account_disabled(a) - and _normalized_email(a.get("email")) != _normalized_email(old_email) - ] + if skip_standby_reuse: + standby_list = [] + logger.info("[4/5] seat=2 预切换:已开启“跳过复用旧账号”,直接创建新账号") + else: + standby_list = [ + a + for a in get_standby_accounts() + if not _is_main_account_email(a.get("email")) + and not is_account_disabled(a) + and _normalized_email(a.get("email")) != _normalized_email(old_email) + ] replacement_email = None for acc in standby_list: @@ -2731,11 +2811,15 @@ def attempt_seat2_preswitch(low_candidates, current_count): # 优先复用旧账号(先验证额度是否真的恢复了) filled = 0 - standby_list = [ - a - for a in get_standby_accounts() - if not _is_main_account_email(a.get("email")) and not is_account_disabled(a) - ] + if skip_standby_reuse: + standby_list = [] + logger.info("[4/5] 已开启“跳过复用旧账号”,跳过 standby 复用阶段,直接进入新账号注册") + else: + standby_list = [ + a + for a in get_standby_accounts() + if not _is_main_account_email(a.get("email")) and not is_account_disabled(a) + ] quota_skipped = [] auto_reuse_skipped = [] retry_throttled = [] diff --git a/src/autoteam/web/dist/assets/index-DOORK78j.js b/src/autoteam/web/dist/assets/index-DOORK78j.js deleted file mode 100644 index cf71a64e..00000000 --- a/src/autoteam/web/dist/assets/index-DOORK78j.js +++ /dev/null @@ -1,26 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))n(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function s(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(l){if(l.ep)return;l.ep=!0;const o=s(l);fetch(l.href,o)}})();/** -* @vue/shared v3.5.32 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function hn(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const be={},Wt=[],ct=()=>{},vl=()=>!1,Ls=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ds=e=>e.startsWith("onUpdate:"),Le=Object.assign,xn=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},Eo=Object.prototype.hasOwnProperty,pe=(e,t)=>Eo.call(e,t),Y=Array.isArray,Gt=e=>bs(e)==="[object Map]",Zt=e=>bs(e)==="[object Set]",Ln=e=>bs(e)==="[object Date]",ne=e=>typeof e=="function",Te=e=>typeof e=="string",ft=e=>typeof e=="symbol",me=e=>e!==null&&typeof e=="object",yl=e=>(me(e)||ne(e))&&ne(e.then)&&ne(e.catch),_l=Object.prototype.toString,bs=e=>_l.call(e),Oo=e=>bs(e).slice(8,-1),wl=e=>bs(e)==="[object Object]",vn=e=>Te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ls=hn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Ns=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},Ro=/-\w/g,nt=Ns(e=>e.replace(Ro,t=>t.slice(1).toUpperCase())),Mo=/\B([A-Z])/g,Ot=Ns(e=>e.replace(Mo,"-$1").toLowerCase()),Sl=Ns(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ys=Ns(e=>e?`on${Sl(e)}`:""),dt=(e,t)=>!Object.is(e,t),ks=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},js=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Dn;const Bs=()=>Dn||(Dn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function yn(e){if(Y(e)){const t={};for(let s=0;s{if(s){const n=s.split(Lo);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Q(e){let t="";if(Te(e))t=e;else if(Y(e))for(let s=0;sPt(s,t))}const Cl=e=>!!(e&&e.__v_isRef===!0),y=e=>Te(e)?e:e==null?"":Y(e)||me(e)&&(e.toString===_l||!ne(e.toString))?Cl(e)?y(e.value):JSON.stringify(e,$l,2):String(e),$l=(e,t)=>Cl(t)?$l(e,t.value):Gt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,l],o)=>(s[Js(n,o)+" =>"]=l,s),{})}:Zt(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>Js(s))}:ft(t)?Js(t):me(t)&&!Y(t)&&!wl(t)?String(t):t,Js=(e,t="")=>{var s;return ft(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};/** -* @vue/reactivity v3.5.32 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let We;class Vo{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=We,!t&&We&&(this.index=(We.scopes||(We.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t0&&--this._on===0&&(We=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s0)return;if(rs){let t=rs;for(rs=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;os;){let t=os;for(os=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function El(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ol(e){let t,s=e.depsTail,n=s;for(;n;){const l=n.prevDep;n.version===-1?(n===s&&(s=l),kn(n),Ko(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=l}e.deps=t,e.depsTail=s}function on(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Rl(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Rl(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===cs)||(e.globalVersion=cs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!on(e))))return;e.flags|=2;const t=e.dep,s=xe,n=lt;xe=e,lt=!0;try{El(e);const l=e.fn(e._value);(t.version===0||dt(l,e._value))&&(e.flags|=128,e._value=l,t.version++)}catch(l){throw t.version++,l}finally{xe=s,lt=n,Ol(e),e.flags&=-3}}function kn(e,t=!1){const{dep:s,prevSub:n,nextSub:l}=e;if(n&&(n.nextSub=l,e.prevSub=void 0),l&&(l.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let o=s.computed.deps;o;o=o.nextDep)kn(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function Ko(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let lt=!0;const Ml=[];function _t(){Ml.push(lt),lt=!1}function wt(){const e=Ml.pop();lt=e===void 0?!0:e}function Nn(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=xe;xe=void 0;try{t()}finally{xe=s}}}let cs=0;class Wo{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class An{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!xe||!lt||xe===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==xe)s=this.activeLink=new Wo(xe,this),xe.deps?(s.prevDep=xe.depsTail,xe.depsTail.nextDep=s,xe.depsTail=s):xe.deps=xe.depsTail=s,Ul(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=xe.depsTail,s.nextDep=void 0,xe.depsTail.nextDep=s,xe.depsTail=s,xe.deps===s&&(xe.deps=n)}return s}trigger(t){this.version++,cs++,this.notify(t)}notify(t){wn();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Sn()}}}function Ul(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Ul(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const rn=new WeakMap,jt=Symbol(""),an=Symbol(""),fs=Symbol("");function Me(e,t,s){if(lt&&xe){let n=rn.get(e);n||rn.set(e,n=new Map);let l=n.get(s);l||(n.set(s,l=new An),l.map=n,l.key=s),l.track()}}function xt(e,t,s,n,l,o){const a=rn.get(e);if(!a){cs++;return}const u=d=>{d&&d.trigger()};if(wn(),t==="clear")a.forEach(u);else{const d=Y(e),p=d&&vn(s);if(d&&s==="length"){const c=Number(n);a.forEach((m,v)=>{(v==="length"||v===fs||!ft(v)&&v>=c)&&u(m)})}else switch((s!==void 0||a.has(void 0))&&u(a.get(s)),p&&u(a.get(fs)),t){case"add":d?p&&u(a.get("length")):(u(a.get(jt)),Gt(e)&&u(a.get(an)));break;case"delete":d||(u(a.get(jt)),Gt(e)&&u(a.get(an)));break;case"set":Gt(e)&&u(a.get(jt));break}}Sn()}function Ht(e){const t=fe(e);return t===e?t:(Me(t,"iterate",fs),Ze(e)?t:t.map(ot))}function Fs(e){return Me(e=fe(e),"iterate",fs),e}function it(e,t){return St(e)?zt(Bt(e)?ot(t):t):ot(t)}const Go={__proto__:null,[Symbol.iterator](){return Xs(this,Symbol.iterator,e=>it(this,e))},concat(...e){return Ht(this).concat(...e.map(t=>Y(t)?Ht(t):t))},entries(){return Xs(this,"entries",e=>(e[1]=it(this,e[1]),e))},every(e,t){return mt(this,"every",e,t,void 0,arguments)},filter(e,t){return mt(this,"filter",e,t,s=>s.map(n=>it(this,n)),arguments)},find(e,t){return mt(this,"find",e,t,s=>it(this,s),arguments)},findIndex(e,t){return mt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return mt(this,"findLast",e,t,s=>it(this,s),arguments)},findLastIndex(e,t){return mt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return mt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Qs(this,"includes",e)},indexOf(...e){return Qs(this,"indexOf",e)},join(e){return Ht(this).join(e)},lastIndexOf(...e){return Qs(this,"lastIndexOf",e)},map(e,t){return mt(this,"map",e,t,void 0,arguments)},pop(){return ts(this,"pop")},push(...e){return ts(this,"push",e)},reduce(e,...t){return jn(this,"reduce",e,t)},reduceRight(e,...t){return jn(this,"reduceRight",e,t)},shift(){return ts(this,"shift")},some(e,t){return mt(this,"some",e,t,void 0,arguments)},splice(...e){return ts(this,"splice",e)},toReversed(){return Ht(this).toReversed()},toSorted(e){return Ht(this).toSorted(e)},toSpliced(...e){return Ht(this).toSpliced(...e)},unshift(...e){return ts(this,"unshift",e)},values(){return Xs(this,"values",e=>it(this,e))}};function Xs(e,t,s){const n=Fs(e),l=n[t]();return n!==e&&!Ze(e)&&(l._next=l.next,l.next=()=>{const o=l._next();return o.done||(o.value=s(o.value)),o}),l}const qo=Array.prototype;function mt(e,t,s,n,l,o){const a=Fs(e),u=a!==e&&!Ze(e),d=a[t];if(d!==qo[t]){const m=d.apply(e,o);return u?ot(m):m}let p=s;a!==e&&(u?p=function(m,v){return s.call(this,it(e,m),v,e)}:s.length>2&&(p=function(m,v){return s.call(this,m,v,e)}));const c=d.call(a,p,n);return u&&l?l(c):c}function jn(e,t,s,n){const l=Fs(e),o=l!==e&&!Ze(e);let a=s,u=!1;l!==e&&(o?(u=n.length===0,a=function(p,c,m){return u&&(u=!1,p=it(e,p)),s.call(this,p,it(e,c),m,e)}):s.length>3&&(a=function(p,c,m){return s.call(this,p,c,m,e)}));const d=l[t](a,...n);return u?it(e,d):d}function Qs(e,t,s){const n=fe(e);Me(n,"iterate",fs);const l=n[t](...s);return(l===-1||l===!1)&&Tn(s[0])?(s[0]=fe(s[0]),n[t](...s)):l}function ts(e,t,s=[]){_t(),wn();const n=fe(e)[t].apply(e,s);return Sn(),wt(),n}const Yo=hn("__proto__,__v_isRef,__isVue"),Ll=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ft));function Jo(e){ft(e)||(e=String(e));const t=fe(this);return Me(t,"has",e),t.hasOwnProperty(e)}class Dl{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const l=this._isReadonly,o=this._isShallow;if(s==="__v_isReactive")return!l;if(s==="__v_isReadonly")return l;if(s==="__v_isShallow")return o;if(s==="__v_raw")return n===(l?o?or:Fl:o?Bl:jl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const a=Y(t);if(!l){let d;if(a&&(d=Go[s]))return d;if(s==="hasOwnProperty")return Jo}const u=Reflect.get(t,s,Ue(t)?t:n);if((ft(s)?Ll.has(s):Yo(s))||(l||Me(t,"get",s),o))return u;if(Ue(u)){const d=a&&vn(s)?u:u.value;return l&&me(d)?dn(d):d}return me(u)?l?dn(u):hs(u):u}}class Nl extends Dl{constructor(t=!1){super(!1,t)}set(t,s,n,l){let o=t[s];const a=Y(t)&&vn(s);if(!this._isShallow){const p=St(o);if(!Ze(n)&&!St(n)&&(o=fe(o),n=fe(n)),!a&&Ue(o)&&!Ue(n))return p||(o.value=n),!0}const u=a?Number(s)e,ys=e=>Reflect.getPrototypeOf(e);function er(e,t,s){return function(...n){const l=this.__v_raw,o=fe(l),a=Gt(o),u=e==="entries"||e===Symbol.iterator&&a,d=e==="keys"&&a,p=l[e](...n),c=s?un:t?zt:ot;return!t&&Me(o,"iterate",d?an:jt),Le(Object.create(p),{next(){const{value:m,done:v}=p.next();return v?{value:m,done:v}:{value:u?[c(m[0]),c(m[1])]:c(m),done:v}}})}}function _s(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function tr(e,t){const s={get(l){const o=this.__v_raw,a=fe(o),u=fe(l);e||(dt(l,u)&&Me(a,"get",l),Me(a,"get",u));const{has:d}=ys(a),p=t?un:e?zt:ot;if(d.call(a,l))return p(o.get(l));if(d.call(a,u))return p(o.get(u));o!==a&&o.get(l)},get size(){const l=this.__v_raw;return!e&&Me(fe(l),"iterate",jt),l.size},has(l){const o=this.__v_raw,a=fe(o),u=fe(l);return e||(dt(l,u)&&Me(a,"has",l),Me(a,"has",u)),l===u?o.has(l):o.has(l)||o.has(u)},forEach(l,o){const a=this,u=a.__v_raw,d=fe(u),p=t?un:e?zt:ot;return!e&&Me(d,"iterate",jt),u.forEach((c,m)=>l.call(o,p(c),p(m),a))}};return Le(s,e?{add:_s("add"),set:_s("set"),delete:_s("delete"),clear:_s("clear")}:{add(l){const o=fe(this),a=ys(o),u=fe(l),d=!t&&!Ze(l)&&!St(l)?u:l;return a.has.call(o,d)||dt(l,d)&&a.has.call(o,l)||dt(u,d)&&a.has.call(o,u)||(o.add(d),xt(o,"add",d,d)),this},set(l,o){!t&&!Ze(o)&&!St(o)&&(o=fe(o));const a=fe(this),{has:u,get:d}=ys(a);let p=u.call(a,l);p||(l=fe(l),p=u.call(a,l));const c=d.call(a,l);return a.set(l,o),p?dt(o,c)&&xt(a,"set",l,o):xt(a,"add",l,o),this},delete(l){const o=fe(this),{has:a,get:u}=ys(o);let d=a.call(o,l);d||(l=fe(l),d=a.call(o,l)),u&&u.call(o,l);const p=o.delete(l);return d&&xt(o,"delete",l,void 0),p},clear(){const l=fe(this),o=l.size!==0,a=l.clear();return o&&xt(l,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(l=>{s[l]=er(l,e,t)}),s}function Cn(e,t){const s=tr(e,t);return(n,l,o)=>l==="__v_isReactive"?!e:l==="__v_isReadonly"?e:l==="__v_raw"?n:Reflect.get(pe(s,l)&&l in n?s:n,l,o)}const sr={get:Cn(!1,!1)},nr={get:Cn(!1,!0)},lr={get:Cn(!0,!1)};const jl=new WeakMap,Bl=new WeakMap,Fl=new WeakMap,or=new WeakMap;function rr(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ar(e){return e.__v_skip||!Object.isExtensible(e)?0:rr(Oo(e))}function hs(e){return St(e)?e:$n(e,!1,Xo,sr,jl)}function ir(e){return $n(e,!1,Zo,nr,Bl)}function dn(e){return $n(e,!0,Qo,lr,Fl)}function $n(e,t,s,n,l){if(!me(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=ar(e);if(o===0)return e;const a=l.get(e);if(a)return a;const u=new Proxy(e,o===2?n:s);return l.set(e,u),u}function Bt(e){return St(e)?Bt(e.__v_raw):!!(e&&e.__v_isReactive)}function St(e){return!!(e&&e.__v_isReadonly)}function Ze(e){return!!(e&&e.__v_isShallow)}function Tn(e){return e?!!e.__v_raw:!1}function fe(e){const t=e&&e.__v_raw;return t?fe(t):e}function ur(e){return!pe(e,"__v_skip")&&Object.isExtensible(e)&&kl(e,"__v_skip",!0),e}const ot=e=>me(e)?hs(e):e,zt=e=>me(e)?dn(e):e;function Ue(e){return e?e.__v_isRef===!0:!1}function M(e){return dr(e,!1)}function dr(e,t){return Ue(e)?e:new cr(e,t)}class cr{constructor(t,s){this.dep=new An,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:fe(t),this._value=s?t:ot(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||Ze(t)||St(t);t=n?t:fe(t),dt(t,s)&&(this._rawValue=t,this._value=n?t:ot(t),this.dep.trigger())}}function Lt(e){return Ue(e)?e.value:e}const fr={get:(e,t,s)=>t==="__v_raw"?e:Lt(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const l=e[t];return Ue(l)&&!Ue(s)?(l.value=s,!0):Reflect.set(e,t,s,n)}};function Vl(e){return Bt(e)?e:new Proxy(e,fr)}class pr{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new An(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=cs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&xe!==this)return Il(this,!0),!0}get value(){const t=this.dep.track();return Rl(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function gr(e,t,s=!1){let n,l;return ne(e)?n=e:(n=e.get,l=e.set),new pr(n,l,s)}const ws={},Ps=new WeakMap;let Dt;function mr(e,t=!1,s=Dt){if(s){let n=Ps.get(s);n||Ps.set(s,n=[]),n.push(e)}}function br(e,t,s=be){const{immediate:n,deep:l,once:o,scheduler:a,augmentJob:u,call:d}=s,p=P=>l?P:Ze(P)||l===!1||l===0?vt(P,1):vt(P);let c,m,v,C,j=!1,I=!1;if(Ue(e)?(m=()=>e.value,j=Ze(e)):Bt(e)?(m=()=>p(e),j=!0):Y(e)?(I=!0,j=e.some(P=>Bt(P)||Ze(P)),m=()=>e.map(P=>{if(Ue(P))return P.value;if(Bt(P))return p(P);if(ne(P))return d?d(P,2):P()})):ne(e)?t?m=d?()=>d(e,2):e:m=()=>{if(v){_t();try{v()}finally{wt()}}const P=Dt;Dt=c;try{return d?d(e,3,[C]):e(C)}finally{Dt=P}}:m=ct,t&&l){const P=m,Z=l===!0?1/0:l;m=()=>vt(P(),Z)}const D=Ho(),F=()=>{c.stop(),D&&D.active&&xn(D.effects,c)};if(o&&t){const P=t;t=(...Z)=>{P(...Z),F()}}let V=I?new Array(e.length).fill(ws):ws;const G=P=>{if(!(!(c.flags&1)||!c.dirty&&!P))if(t){const Z=c.run();if(l||j||(I?Z.some((W,le)=>dt(W,V[le])):dt(Z,V))){v&&v();const W=Dt;Dt=c;try{const le=[Z,V===ws?void 0:I&&V[0]===ws?[]:V,C];V=Z,d?d(t,3,le):t(...le)}finally{Dt=W}}}else c.run()};return u&&u(G),c=new Tl(m),c.scheduler=a?()=>a(G,!1):G,C=P=>mr(P,!1,c),v=c.onStop=()=>{const P=Ps.get(c);if(P){if(d)d(P,4);else for(const Z of P)Z();Ps.delete(c)}},t?n?G(!0):V=c.run():a?a(G.bind(null,!0),!0):c.run(),F.pause=c.pause.bind(c),F.resume=c.resume.bind(c),F.stop=F,F}function vt(e,t=1/0,s){if(t<=0||!me(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Ue(e))vt(e.value,t,s);else if(Y(e))for(let n=0;n{vt(n,t,s)});else if(wl(e)){for(const n in e)vt(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&vt(e[n],t,s)}return e}/** -* @vue/runtime-core v3.5.32 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function xs(e,t,s,n){try{return n?e(...n):e()}catch(l){Vs(l,t,s)}}function pt(e,t,s,n){if(ne(e)){const l=xs(e,t,s,n);return l&&yl(l)&&l.catch(o=>{Vs(o,t,s)}),l}if(Y(e)){const l=[];for(let o=0;o>>1,l=Be[n],o=ps(l);o=ps(s)?Be.push(e):Be.splice(xr(t),0,e),e.flags|=1,Kl()}}function Kl(){Is||(Is=Hl.then(Gl))}function vr(e){Y(e)?qt.push(...e):Ct&&e.id===-1?Ct.splice(Kt+1,0,e):e.flags&1||(qt.push(e),e.flags|=1),Kl()}function Bn(e,t,s=at+1){for(;sps(s)-ps(n));if(qt.length=0,Ct){Ct.push(...t);return}for(Ct=t,Kt=0;Kte.id==null?e.flags&2?-1:1/0:e.id;function Gl(e){try{for(at=0;at{n._d&&Xn(-1);const o=Es(t);let a;try{a=e(...l)}finally{Es(o),n._d&&Xn(1)}return a};return n._n=!0,n._c=!0,n._d=!0,n}function ue(e,t){if(Qe===null)return e;const s=qs(Qe),n=e.dirs||(e.dirs=[]);for(let l=0;l1)return s&&ne(t)?t.call(n&&n.proxy):t}}const wr=Symbol.for("v-scx"),Sr=()=>As(wr);function $t(e,t,s){return Yl(e,t,s)}function Yl(e,t,s=be){const{immediate:n,deep:l,flush:o,once:a}=s,u=Le({},s),d=t&&n||!t&&o!=="post";let p;if(ms){if(o==="sync"){const C=Sr();p=C.__watcherHandles||(C.__watcherHandles=[])}else if(!d){const C=()=>{};return C.stop=ct,C.resume=ct,C.pause=ct,C}}const c=Fe;u.call=(C,j,I)=>pt(C,c,j,I);let m=!1;o==="post"?u.scheduler=C=>{Ke(C,c&&c.suspense)}:o!=="sync"&&(m=!0,u.scheduler=(C,j)=>{j?C():In(C)}),u.augmentJob=C=>{t&&(C.flags|=4),m&&(C.flags|=2,c&&(C.id=c.uid,C.i=c))};const v=br(e,t,u);return ms&&(p?p.push(v):d&&v()),v}function kr(e,t,s){const n=this.proxy,l=Te(e)?e.includes(".")?Jl(n,e):()=>n[e]:e.bind(n,n);let o;ne(t)?o=t:(o=t.handler,s=t);const a=vs(this),u=Yl(l,o.bind(n),s);return a(),u}function Jl(e,t){const s=t.split(".");return()=>{let n=e;for(let l=0;le.__isTeleport,$r=Symbol("_leaveCb");function En(e,t){e.shapeFlag&6&&e.component?(e.transition=t,En(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function zl(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Fn(e,t){let s;return!!((s=Object.getOwnPropertyDescriptor(e,t))&&!s.configurable)}const Os=new WeakMap;function as(e,t,s,n,l=!1){if(Y(e)){e.forEach((I,D)=>as(I,t&&(Y(t)?t[D]:t),s,n,l));return}if(is(n)&&!l){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&as(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?qs(n.component):n.el,a=l?null:o,{i:u,r:d}=e,p=t&&t.r,c=u.refs===be?u.refs={}:u.refs,m=u.setupState,v=fe(m),C=m===be?vl:I=>Fn(c,I)?!1:pe(v,I),j=(I,D)=>!(D&&Fn(c,D));if(p!=null&&p!==d){if(Vn(t),Te(p))c[p]=null,C(p)&&(m[p]=null);else if(Ue(p)){const I=t;j(p,I.k)&&(p.value=null),I.k&&(c[I.k]=null)}}if(ne(d))xs(d,u,12,[a,c]);else{const I=Te(d),D=Ue(d);if(I||D){const F=()=>{if(e.f){const V=I?C(d)?m[d]:c[d]:j()||!e.k?d.value:c[e.k];if(l)Y(V)&&xn(V,o);else if(Y(V))V.includes(o)||V.push(o);else if(I)c[d]=[o],C(d)&&(m[d]=c[d]);else{const G=[o];j(d,e.k)&&(d.value=G),e.k&&(c[e.k]=G)}}else I?(c[d]=a,C(d)&&(m[d]=a)):D&&(j(d,e.k)&&(d.value=a),e.k&&(c[e.k]=a))};if(a){const V=()=>{F(),Os.delete(e)};V.id=-1,Os.set(e,V),Ke(V,s)}else Vn(e),F()}}}function Vn(e){const t=Os.get(e);t&&(t.flags|=8,Os.delete(e))}Bs().requestIdleCallback;Bs().cancelIdleCallback;const is=e=>!!e.type.__asyncLoader,Xl=e=>e.type.__isKeepAlive;function Tr(e,t){Ql(e,"a",t)}function Pr(e,t){Ql(e,"da",t)}function Ql(e,t,s=Fe){const n=e.__wdc||(e.__wdc=()=>{let l=s;for(;l;){if(l.isDeactivated)return;l=l.parent}return e()});if(Hs(t,n,s),s){let l=s.parent;for(;l&&l.parent;)Xl(l.parent.vnode)&&Ir(n,t,s,l),l=l.parent}}function Ir(e,t,s,n){const l=Hs(t,e,n,!0);Ks(()=>{xn(n[t],l)},s)}function Hs(e,t,s=Fe,n=!1){if(s){const l=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...a)=>{_t();const u=vs(s),d=pt(t,s,e,a);return u(),wt(),d});return n?l.unshift(o):l.push(o),o}}const kt=e=>(t,s=Fe)=>{(!ms||e==="sp")&&Hs(e,(...n)=>t(...n),s)},Er=kt("bm"),Vt=kt("m"),Or=kt("bu"),Rr=kt("u"),Mr=kt("bum"),Ks=kt("um"),Ur=kt("sp"),Lr=kt("rtg"),Dr=kt("rtc");function Nr(e,t=Fe){Hs("ec",e,t)}const jr=Symbol.for("v-ndc");function $e(e,t,s,n){let l;const o=s,a=Y(e);if(a||Te(e)){const u=a&&Bt(e);let d=!1,p=!1;u&&(d=!Ze(e),p=St(e),e=Fs(e)),l=new Array(e.length);for(let c=0,m=e.length;ct(u,d,void 0,o));else{const u=Object.keys(e);l=new Array(u.length);for(let d=0,p=u.length;de?yo(e)?qs(e):cn(e.parent):null,us=Le(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>cn(e.parent),$root:e=>cn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>eo(e),$forceUpdate:e=>e.f||(e.f=()=>{In(e.update)}),$nextTick:e=>e.n||(e.n=Pn.bind(e.proxy)),$watch:e=>kr.bind(e)}),Zs=(e,t)=>e!==be&&!e.__isScriptSetup&&pe(e,t),Br={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:l,props:o,accessCache:a,type:u,appContext:d}=e;if(t[0]!=="$"){const v=a[t];if(v!==void 0)switch(v){case 1:return n[t];case 2:return l[t];case 4:return s[t];case 3:return o[t]}else{if(Zs(n,t))return a[t]=1,n[t];if(l!==be&&pe(l,t))return a[t]=2,l[t];if(pe(o,t))return a[t]=3,o[t];if(s!==be&&pe(s,t))return a[t]=4,s[t];fn&&(a[t]=0)}}const p=us[t];let c,m;if(p)return t==="$attrs"&&Me(e.attrs,"get",""),p(e);if((c=u.__cssModules)&&(c=c[t]))return c;if(s!==be&&pe(s,t))return a[t]=4,s[t];if(m=d.config.globalProperties,pe(m,t))return m[t]},set({_:e},t,s){const{data:n,setupState:l,ctx:o}=e;return Zs(l,t)?(l[t]=s,!0):n!==be&&pe(n,t)?(n[t]=s,!0):pe(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:l,props:o,type:a}},u){let d;return!!(s[u]||e!==be&&u[0]!=="$"&&pe(e,u)||Zs(t,u)||pe(o,u)||pe(n,u)||pe(us,u)||pe(l.config.globalProperties,u)||(d=a.__cssModules)&&d[u])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:pe(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Hn(e){return Y(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let fn=!0;function Fr(e){const t=eo(e),s=e.proxy,n=e.ctx;fn=!1,t.beforeCreate&&Kn(t.beforeCreate,e,"bc");const{data:l,computed:o,methods:a,watch:u,provide:d,inject:p,created:c,beforeMount:m,mounted:v,beforeUpdate:C,updated:j,activated:I,deactivated:D,beforeDestroy:F,beforeUnmount:V,destroyed:G,unmounted:P,render:Z,renderTracked:W,renderTriggered:le,errorCaptured:ve,serverPrefetch:Pe,expose:Se,inheritAttrs:J,components:X,directives:Ee,filters:ee}=t;if(p&&Vr(p,n,null),a)for(const ie in a){const ae=a[ie];ne(ae)&&(n[ie]=ae.bind(s))}if(l){const ie=l.call(s,s);me(ie)&&(e.data=hs(ie))}if(fn=!0,o)for(const ie in o){const ae=o[ie],Re=ne(ae)?ae.bind(s,s):ne(ae.get)?ae.get.bind(s,s):ct,Ie=!ne(ae)&&ne(ae.set)?ae.set.bind(s):ct,ke=se({get:Re,set:Ie});Object.defineProperty(n,ie,{enumerable:!0,configurable:!0,get:()=>ke.value,set:Oe=>ke.value=Oe})}if(u)for(const ie in u)Zl(u[ie],n,s,ie);if(d){const ie=ne(d)?d.call(s):d;Reflect.ownKeys(ie).forEach(ae=>{_r(ae,ie[ae])})}c&&Kn(c,e,"c");function he(ie,ae){Y(ae)?ae.forEach(Re=>ie(Re.bind(s))):ae&&ie(ae.bind(s))}if(he(Er,m),he(Vt,v),he(Or,C),he(Rr,j),he(Tr,I),he(Pr,D),he(Nr,ve),he(Dr,W),he(Lr,le),he(Mr,V),he(Ks,P),he(Ur,Pe),Y(Se))if(Se.length){const ie=e.exposed||(e.exposed={});Se.forEach(ae=>{Object.defineProperty(ie,ae,{get:()=>s[ae],set:Re=>s[ae]=Re,enumerable:!0})})}else e.exposed||(e.exposed={});Z&&e.render===ct&&(e.render=Z),J!=null&&(e.inheritAttrs=J),X&&(e.components=X),Ee&&(e.directives=Ee),Pe&&zl(e)}function Vr(e,t,s=ct){Y(e)&&(e=pn(e));for(const n in e){const l=e[n];let o;me(l)?"default"in l?o=As(l.from||n,l.default,!0):o=As(l.from||n):o=As(l),Ue(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:a=>o.value=a}):t[n]=o}}function Kn(e,t,s){pt(Y(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function Zl(e,t,s,n){let l=n.includes(".")?Jl(s,n):()=>s[n];if(Te(e)){const o=t[e];ne(o)&&$t(l,o)}else if(ne(e))$t(l,e.bind(s));else if(me(e))if(Y(e))e.forEach(o=>Zl(o,t,s,n));else{const o=ne(e.handler)?e.handler.bind(s):t[e.handler];ne(o)&&$t(l,o,e)}}function eo(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:l,optionsCache:o,config:{optionMergeStrategies:a}}=e.appContext,u=o.get(t);let d;return u?d=u:!l.length&&!s&&!n?d=t:(d={},l.length&&l.forEach(p=>Rs(d,p,a,!0)),Rs(d,t,a)),me(t)&&o.set(t,d),d}function Rs(e,t,s,n=!1){const{mixins:l,extends:o}=t;o&&Rs(e,o,s,!0),l&&l.forEach(a=>Rs(e,a,s,!0));for(const a in t)if(!(n&&a==="expose")){const u=Hr[a]||s&&s[a];e[a]=u?u(e[a],t[a]):t[a]}return e}const Hr={data:Wn,props:Gn,emits:Gn,methods:ns,computed:ns,beforeCreate:je,created:je,beforeMount:je,mounted:je,beforeUpdate:je,updated:je,beforeDestroy:je,beforeUnmount:je,destroyed:je,unmounted:je,activated:je,deactivated:je,errorCaptured:je,serverPrefetch:je,components:ns,directives:ns,watch:Wr,provide:Wn,inject:Kr};function Wn(e,t){return t?e?function(){return Le(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function Kr(e,t){return ns(pn(e),pn(t))}function pn(e){if(Y(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${nt(t)}Modifiers`]||e[`${Ot(t)}Modifiers`];function Jr(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||be;let l=s;const o=t.startsWith("update:"),a=o&&Yr(n,t.slice(7));a&&(a.trim&&(l=s.map(c=>Te(c)?c.trim():c)),a.number&&(l=s.map(js)));let u,d=n[u=Ys(t)]||n[u=Ys(nt(t))];!d&&o&&(d=n[u=Ys(Ot(t))]),d&&pt(d,e,6,l);const p=n[u+"Once"];if(p){if(!e.emitted)e.emitted={};else if(e.emitted[u])return;e.emitted[u]=!0,pt(p,e,6,l)}}const zr=new WeakMap;function so(e,t,s=!1){const n=s?zr:t.emitsCache,l=n.get(e);if(l!==void 0)return l;const o=e.emits;let a={},u=!1;if(!ne(e)){const d=p=>{const c=so(p,t,!0);c&&(u=!0,Le(a,c))};!s&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}return!o&&!u?(me(e)&&n.set(e,null),null):(Y(o)?o.forEach(d=>a[d]=null):Le(a,o),me(e)&&n.set(e,a),a)}function Ws(e,t){return!e||!Ls(t)?!1:(t=t.slice(2).replace(/Once$/,""),pe(e,t[0].toLowerCase()+t.slice(1))||pe(e,Ot(t))||pe(e,t))}function qn(e){const{type:t,vnode:s,proxy:n,withProxy:l,propsOptions:[o],slots:a,attrs:u,emit:d,render:p,renderCache:c,props:m,data:v,setupState:C,ctx:j,inheritAttrs:I}=e,D=Es(e);let F,V;try{if(s.shapeFlag&4){const P=l||n,Z=P;F=ut(p.call(Z,P,c,m,C,v,j)),V=u}else{const P=t;F=ut(P.length>1?P(m,{attrs:u,slots:a,emit:d}):P(m,null)),V=t.props?u:Xr(u)}}catch(P){ds.length=0,Vs(P,e,1),F=Ve(It)}let G=F;if(V&&I!==!1){const P=Object.keys(V),{shapeFlag:Z}=G;P.length&&Z&7&&(o&&P.some(Ds)&&(V=Qr(V,o)),G=Xt(G,V,!1,!0))}return s.dirs&&(G=Xt(G,null,!1,!0),G.dirs=G.dirs?G.dirs.concat(s.dirs):s.dirs),s.transition&&En(G,s.transition),F=G,Es(D),F}const Xr=e=>{let t;for(const s in e)(s==="class"||s==="style"||Ls(s))&&((t||(t={}))[s]=e[s]);return t},Qr=(e,t)=>{const s={};for(const n in e)(!Ds(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Zr(e,t,s){const{props:n,children:l,component:o}=e,{props:a,children:u,patchFlag:d}=t,p=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&d>=0){if(d&1024)return!0;if(d&16)return n?Yn(n,a,p):!!a;if(d&8){const c=t.dynamicProps;for(let m=0;mObject.create(lo),ro=e=>Object.getPrototypeOf(e)===lo;function ta(e,t,s,n=!1){const l={},o=oo();e.propsDefaults=Object.create(null),ao(e,t,l,o);for(const a in e.propsOptions[0])a in l||(l[a]=void 0);s?e.props=n?l:ir(l):e.type.props?e.props=l:e.props=o,e.attrs=o}function sa(e,t,s,n){const{props:l,attrs:o,vnode:{patchFlag:a}}=e,u=fe(l),[d]=e.propsOptions;let p=!1;if((n||a>0)&&!(a&16)){if(a&8){const c=e.vnode.dynamicProps;for(let m=0;m{d=!0;const[v,C]=io(m,t,!0);Le(a,v),C&&u.push(...C)};!s&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!o&&!d)return me(e)&&n.set(e,Wt),Wt;if(Y(o))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",Rn=e=>Y(e)?e.map(ut):[ut(e)],la=(e,t,s)=>{if(t._n)return t;const n=yr((...l)=>Rn(t(...l)),s);return n._c=!1,n},uo=(e,t,s)=>{const n=e._ctx;for(const l in e){if(On(l))continue;const o=e[l];if(ne(o))t[l]=la(l,o,n);else if(o!=null){const a=Rn(o);t[l]=()=>a}}},co=(e,t)=>{const s=Rn(t);e.slots.default=()=>s},fo=(e,t,s)=>{for(const n in t)(s||!On(n))&&(e[n]=t[n])},oa=(e,t,s)=>{const n=e.slots=oo();if(e.vnode.shapeFlag&32){const l=t._;l?(fo(n,t,s),s&&kl(n,"_",l,!0)):uo(t,n)}else t&&co(e,t)},ra=(e,t,s)=>{const{vnode:n,slots:l}=e;let o=!0,a=be;if(n.shapeFlag&32){const u=t._;u?s&&u===1?o=!1:fo(l,t,s):(o=!t.$stable,uo(t,l)),a=t}else t&&(co(e,t),a={default:1});if(o)for(const u in l)!On(u)&&a[u]==null&&delete l[u]},Ke=ca;function aa(e){return ia(e)}function ia(e,t){const s=Bs();s.__VUE__=!0;const{insert:n,remove:l,patchProp:o,createElement:a,createText:u,createComment:d,setText:p,setElementText:c,parentNode:m,nextSibling:v,setScopeId:C=ct,insertStaticContent:j}=e,I=(i,f,g,S=null,_=null,k=null,U=void 0,L=null,O=!!f.dynamicChildren)=>{if(i===f)return;i&&!ss(i,f)&&(S=st(i),Oe(i,_,k,!0),i=null),f.patchFlag===-2&&(O=!1,f.dynamicChildren=null);const{type:A,ref:H,shapeFlag:N}=f;switch(A){case Gs:D(i,f,g,S);break;case It:F(i,f,g,S);break;case Cs:i==null&&V(f,g,S,U);break;case de:X(i,f,g,S,_,k,U,L,O);break;default:N&1?Z(i,f,g,S,_,k,U,L,O):N&6?Ee(i,f,g,S,_,k,U,L,O):(N&64||N&128)&&A.process(i,f,g,S,_,k,U,L,O,w)}H!=null&&_?as(H,i&&i.ref,k,f||i,!f):H==null&&i&&i.ref!=null&&as(i.ref,null,k,i,!0)},D=(i,f,g,S)=>{if(i==null)n(f.el=u(f.children),g,S);else{const _=f.el=i.el;f.children!==i.children&&p(_,f.children)}},F=(i,f,g,S)=>{i==null?n(f.el=d(f.children||""),g,S):f.el=i.el},V=(i,f,g,S)=>{[i.el,i.anchor]=j(i.children,f,g,S,i.el,i.anchor)},G=({el:i,anchor:f},g,S)=>{let _;for(;i&&i!==f;)_=v(i),n(i,g,S),i=_;n(f,g,S)},P=({el:i,anchor:f})=>{let g;for(;i&&i!==f;)g=v(i),l(i),i=g;l(f)},Z=(i,f,g,S,_,k,U,L,O)=>{if(f.type==="svg"?U="svg":f.type==="math"&&(U="mathml"),i==null)W(f,g,S,_,k,U,L,O);else{const A=i.el&&i.el._isVueCE?i.el:null;try{A&&A._beginPatch(),Pe(i,f,_,k,U,L,O)}finally{A&&A._endPatch()}}},W=(i,f,g,S,_,k,U,L)=>{let O,A;const{props:H,shapeFlag:N,transition:E,dirs:q}=i;if(O=i.el=a(i.type,k,H&&H.is,H),N&8?c(O,i.children):N&16&&ve(i.children,O,null,S,_,en(i,k),U,L),q&&Mt(i,null,S,"created"),le(O,i,i.scopeId,U,S),H){for(const oe in H)oe!=="value"&&!ls(oe)&&o(O,oe,null,H[oe],k,S);"value"in H&&o(O,"value",null,H.value,k),(A=H.onVnodeBeforeMount)&&rt(A,S,i)}q&&Mt(i,null,S,"beforeMount");const re=ua(_,E);re&&E.beforeEnter(O),n(O,f,g),((A=H&&H.onVnodeMounted)||re||q)&&Ke(()=>{try{A&&rt(A,S,i),re&&E.enter(O),q&&Mt(i,null,S,"mounted")}finally{}},_)},le=(i,f,g,S,_)=>{if(g&&C(i,g),S)for(let k=0;k{for(let A=O;A{const L=f.el=i.el;let{patchFlag:O,dynamicChildren:A,dirs:H}=f;O|=i.patchFlag&16;const N=i.props||be,E=f.props||be;let q;if(g&&Ut(g,!1),(q=E.onVnodeBeforeUpdate)&&rt(q,g,f,i),H&&Mt(f,i,g,"beforeUpdate"),g&&Ut(g,!0),(N.innerHTML&&E.innerHTML==null||N.textContent&&E.textContent==null)&&c(L,""),A?Se(i.dynamicChildren,A,L,g,S,en(f,_),k):U||ae(i,f,L,null,g,S,en(f,_),k,!1),O>0){if(O&16)J(L,N,E,g,_);else if(O&2&&N.class!==E.class&&o(L,"class",null,E.class,_),O&4&&o(L,"style",N.style,E.style,_),O&8){const re=f.dynamicProps;for(let oe=0;oe{q&&rt(q,g,f,i),H&&Mt(f,i,g,"updated")},S)},Se=(i,f,g,S,_,k,U)=>{for(let L=0;L{if(f!==g){if(f!==be)for(const k in f)!ls(k)&&!(k in g)&&o(i,k,f[k],null,_,S);for(const k in g){if(ls(k))continue;const U=g[k],L=f[k];U!==L&&k!=="value"&&o(i,k,L,U,_,S)}"value"in g&&o(i,"value",f.value,g.value,_)}},X=(i,f,g,S,_,k,U,L,O)=>{const A=f.el=i?i.el:u(""),H=f.anchor=i?i.anchor:u("");let{patchFlag:N,dynamicChildren:E,slotScopeIds:q}=f;q&&(L=L?L.concat(q):q),i==null?(n(A,g,S),n(H,g,S),ve(f.children||[],g,H,_,k,U,L,O)):N>0&&N&64&&E&&i.dynamicChildren&&i.dynamicChildren.length===E.length?(Se(i.dynamicChildren,E,g,_,k,U,L),(f.key!=null||_&&f===_.subTree)&&po(i,f,!0)):ae(i,f,g,H,_,k,U,L,O)},Ee=(i,f,g,S,_,k,U,L,O)=>{f.slotScopeIds=L,i==null?f.shapeFlag&512?_.ctx.activate(f,g,S,U,O):ee(f,g,S,_,k,U,O):De(i,f,O)},ee=(i,f,g,S,_,k,U)=>{const L=i.component=xa(i,S,_);if(Xl(i)&&(L.ctx.renderer=w),ya(L,!1,U),L.asyncDep){if(_&&_.registerDep(L,he,U),!i.el){const O=L.subTree=Ve(It);F(null,O,f,g),i.placeholder=O.el}}else he(L,i,f,g,_,k,U)},De=(i,f,g)=>{const S=f.component=i.component;if(Zr(i,f,g))if(S.asyncDep&&!S.asyncResolved){ie(S,f,g);return}else S.next=f,S.update();else f.el=i.el,S.vnode=f},he=(i,f,g,S,_,k,U)=>{const L=()=>{if(i.isMounted){let{next:N,bu:E,u:q,parent:re,vnode:oe}=i;{const ze=go(i);if(ze){N&&(N.el=oe.el,ie(i,N,U)),ze.asyncDep.then(()=>{Ke(()=>{i.isUnmounted||A()},_)});return}}let ge=N,ye;Ut(i,!1),N?(N.el=oe.el,ie(i,N,U)):N=oe,E&&ks(E),(ye=N.props&&N.props.onVnodeBeforeUpdate)&&rt(ye,re,N,oe),Ut(i,!0);const we=qn(i),He=i.subTree;i.subTree=we,I(He,we,m(He.el),st(He),i,_,k),N.el=we.el,ge===null&&ea(i,we.el),q&&Ke(q,_),(ye=N.props&&N.props.onVnodeUpdated)&&Ke(()=>rt(ye,re,N,oe),_)}else{let N;const{el:E,props:q}=f,{bm:re,m:oe,parent:ge,root:ye,type:we}=i,He=is(f);Ut(i,!1),re&&ks(re),!He&&(N=q&&q.onVnodeBeforeMount)&&rt(N,ge,f),Ut(i,!0);{ye.ce&&ye.ce._hasShadowRoot()&&ye.ce._injectChildStyle(we,i.parent?i.parent.type:void 0);const ze=i.subTree=qn(i);I(null,ze,g,S,i,_,k),f.el=ze.el}if(oe&&Ke(oe,_),!He&&(N=q&&q.onVnodeMounted)){const ze=f;Ke(()=>rt(N,ge,ze),_)}(f.shapeFlag&256||ge&&is(ge.vnode)&&ge.vnode.shapeFlag&256)&&i.a&&Ke(i.a,_),i.isMounted=!0,f=g=S=null}};i.scope.on();const O=i.effect=new Tl(L);i.scope.off();const A=i.update=O.run.bind(O),H=i.job=O.runIfDirty.bind(O);H.i=i,H.id=i.uid,O.scheduler=()=>In(H),Ut(i,!0),A()},ie=(i,f,g)=>{f.component=i;const S=i.vnode.props;i.vnode=f,i.next=null,sa(i,f.props,S,g),ra(i,f.children,g),_t(),Bn(i),wt()},ae=(i,f,g,S,_,k,U,L,O=!1)=>{const A=i&&i.children,H=i?i.shapeFlag:0,N=f.children,{patchFlag:E,shapeFlag:q}=f;if(E>0){if(E&128){Ie(A,N,g,S,_,k,U,L,O);return}else if(E&256){Re(A,N,g,S,_,k,U,L,O);return}}q&8?(H&16&&tt(A,_,k),N!==A&&c(g,N)):H&16?q&16?Ie(A,N,g,S,_,k,U,L,O):tt(A,_,k,!0):(H&8&&c(g,""),q&16&&ve(N,g,S,_,k,U,L,O))},Re=(i,f,g,S,_,k,U,L,O)=>{i=i||Wt,f=f||Wt;const A=i.length,H=f.length,N=Math.min(A,H);let E;for(E=0;EH?tt(i,_,k,!0,!1,N):ve(f,g,S,_,k,U,L,O,N)},Ie=(i,f,g,S,_,k,U,L,O)=>{let A=0;const H=f.length;let N=i.length-1,E=H-1;for(;A<=N&&A<=E;){const q=i[A],re=f[A]=O?ht(f[A]):ut(f[A]);if(ss(q,re))I(q,re,g,null,_,k,U,L,O);else break;A++}for(;A<=N&&A<=E;){const q=i[N],re=f[E]=O?ht(f[E]):ut(f[E]);if(ss(q,re))I(q,re,g,null,_,k,U,L,O);else break;N--,E--}if(A>N){if(A<=E){const q=E+1,re=qE)for(;A<=N;)Oe(i[A],_,k,!0),A++;else{const q=A,re=A,oe=new Map;for(A=re;A<=E;A++){const te=f[A]=O?ht(f[A]):ut(f[A]);te.key!=null&&oe.set(te.key,A)}let ge,ye=0;const we=E-re+1;let He=!1,ze=0;const h=new Array(we);for(A=0;A=we){Oe(te,_,k,!0);continue}let Ae;if(te.key!=null)Ae=oe.get(te.key);else for(ge=re;ge<=E;ge++)if(h[ge-re]===0&&ss(te,f[ge])){Ae=ge;break}Ae===void 0?Oe(te,_,k,!0):(h[Ae-re]=A+1,Ae>=ze?ze=Ae:He=!0,I(te,f[Ae],g,null,_,k,U,L,O),ye++)}const $=He?da(h):Wt;for(ge=$.length-1,A=we-1;A>=0;A--){const te=re+A,Ae=f[te],Ne=f[te+1],Xe=te+1{const{el:k,type:U,transition:L,children:O,shapeFlag:A}=i;if(A&6){ke(i.component.subTree,f,g,S);return}if(A&128){i.suspense.move(f,g,S);return}if(A&64){U.move(i,f,g,w);return}if(U===de){n(k,f,g);for(let N=0;NL.enter(k),_);else{const{leave:N,delayLeave:E,afterLeave:q}=L,re=()=>{i.ctx.isUnmounted?l(k):n(k,f,g)},oe=()=>{k._isLeaving&&k[$r](!0),N(k,()=>{re(),q&&q()})};E?E(k,re,oe):oe()}else n(k,f,g)},Oe=(i,f,g,S=!1,_=!1)=>{const{type:k,props:U,ref:L,children:O,dynamicChildren:A,shapeFlag:H,patchFlag:N,dirs:E,cacheIndex:q,memo:re}=i;if(N===-2&&(_=!1),L!=null&&(_t(),as(L,null,g,i,!0),wt()),q!=null&&(f.renderCache[q]=void 0),H&256){f.ctx.deactivate(i);return}const oe=H&1&&E,ge=!is(i);let ye;if(ge&&(ye=U&&U.onVnodeBeforeUnmount)&&rt(ye,f,i),H&6)At(i.component,g,S);else{if(H&128){i.suspense.unmount(g,S);return}oe&&Mt(i,null,f,"beforeUnmount"),H&64?i.type.remove(i,f,g,w,S):A&&!A.hasOnce&&(k!==de||N>0&&N&64)?tt(A,f,g,!1,!0):(k===de&&N&384||!_&&H&16)&&tt(O,f,g),S&>(i)}const we=re!=null&&q==null;(ge&&(ye=U&&U.onVnodeUnmounted)||oe||we)&&Ke(()=>{ye&&rt(ye,f,i),oe&&Mt(i,null,f,"unmounted"),we&&(i.el=null)},g)},gt=i=>{const{type:f,el:g,anchor:S,transition:_}=i;if(f===de){Rt(g,S);return}if(f===Cs){P(i);return}const k=()=>{l(g),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(i.shapeFlag&1&&_&&!_.persisted){const{leave:U,delayLeave:L}=_,O=()=>U(g,k);L?L(i.el,k,O):O()}else k()},Rt=(i,f)=>{let g;for(;i!==f;)g=v(i),l(i),i=g;l(f)},At=(i,f,g)=>{const{bum:S,scope:_,job:k,subTree:U,um:L,m:O,a:A}=i;zn(O),zn(A),S&&ks(S),_.stop(),k&&(k.flags|=8,Oe(U,i,f,g)),L&&Ke(L,f),Ke(()=>{i.isUnmounted=!0},f)},tt=(i,f,g,S=!1,_=!1,k=0)=>{for(let U=k;U{if(i.shapeFlag&6)return st(i.component.subTree);if(i.shapeFlag&128)return i.suspense.next();const f=v(i.anchor||i.el),g=f&&f[Ar];return g?v(g):f};let Ge=!1;const Je=(i,f,g)=>{let S;i==null?f._vnode&&(Oe(f._vnode,null,null,!0),S=f._vnode.component):I(f._vnode||null,i,f,null,null,null,g),f._vnode=i,Ge||(Ge=!0,Bn(S),Wl(),Ge=!1)},w={p:I,um:Oe,m:ke,r:gt,mt:ee,mc:ve,pc:ae,pbc:Se,n:st,o:e};return{render:Je,hydrate:void 0,createApp:qr(Je)}}function en({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function Ut({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ua(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function po(e,t,s=!1){const n=e.children,l=t.children;if(Y(n)&&Y(l))for(let o=0;o>1,e[s[u]]0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,a=s[o-1];o-- >0;)s[o]=a,a=t[a];return s}function go(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:go(t)}function zn(e){if(e)for(let t=0;te.__isSuspense;function ca(e,t){t&&t.pendingBranch?Y(e)?t.effects.push(...e):t.effects.push(e):vr(e)}const de=Symbol.for("v-fgt"),Gs=Symbol.for("v-txt"),It=Symbol.for("v-cmt"),Cs=Symbol.for("v-stc"),ds=[];let Ye=null;function b(e=!1){ds.push(Ye=e?null:[])}function fa(){ds.pop(),Ye=ds[ds.length-1]||null}let gs=1;function Xn(e,t=!1){gs+=e,e<0&&Ye&&t&&(Ye.hasOnce=!0)}function ho(e){return e.dynamicChildren=gs>0?Ye||Wt:null,fa(),gs>0&&Ye&&Ye.push(e),e}function x(e,t,s,n,l,o){return ho(r(e,t,s,n,l,o,!0))}function qe(e,t,s,n,l){return ho(Ve(e,t,s,n,l,!0))}function xo(e){return e?e.__v_isVNode===!0:!1}function ss(e,t){return e.type===t.type&&e.key===t.key}const vo=({key:e})=>e??null,$s=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||Ue(e)||ne(e)?{i:Qe,r:e,k:t,f:!!s}:e:null);function r(e,t=null,s=null,n=0,l=null,o=e===de?0:1,a=!1,u=!1){const d={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&vo(t),ref:t&&$s(t),scopeId:ql,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:n,dynamicProps:l,dynamicChildren:null,appContext:null,ctx:Qe};return u?(Mn(d,s),o&128&&e.normalize(d)):s&&(d.shapeFlag|=Te(s)?8:16),gs>0&&!a&&Ye&&(d.patchFlag>0||o&6)&&d.patchFlag!==32&&Ye.push(d),d}const Ve=pa;function pa(e,t=null,s=null,n=0,l=null,o=!1){if((!e||e===jr)&&(e=It),xo(e)){const u=Xt(e,t,!0);return s&&Mn(u,s),gs>0&&!o&&Ye&&(u.shapeFlag&6?Ye[Ye.indexOf(e)]=u:Ye.push(u)),u.patchFlag=-2,u}if(ka(e)&&(e=e.__vccOpts),t){t=ga(t);let{class:u,style:d}=t;u&&!Te(u)&&(t.class=Q(u)),me(d)&&(Tn(d)&&!Y(d)&&(d=Le({},d)),t.style=yn(d))}const a=Te(e)?1:bo(e)?128:Cr(e)?64:me(e)?4:ne(e)?2:0;return r(e,t,s,n,l,a,o,!0)}function ga(e){return e?Tn(e)||ro(e)?Le({},e):e:null}function Xt(e,t,s=!1,n=!1){const{props:l,ref:o,patchFlag:a,children:u,transition:d}=e,p=t?ma(l||{},t):l,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:p,key:p&&vo(p),ref:t&&t.ref?s&&o?Y(o)?o.concat($s(t)):[o,$s(t)]:$s(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:u,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:d,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xt(e.ssContent),ssFallback:e.ssFallback&&Xt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return d&&n&&En(c,d.clone(c)),c}function _e(e=" ",t=0){return Ve(Gs,null,e,t)}function Ft(e,t){const s=Ve(Cs,null,e);return s.staticCount=t,s}function B(e="",t=!1){return t?(b(),qe(It,null,e)):Ve(It,null,e)}function ut(e){return e==null||typeof e=="boolean"?Ve(It):Y(e)?Ve(de,null,e.slice()):xo(e)?ht(e):Ve(Gs,null,String(e))}function ht(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Xt(e)}function Mn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(Y(t))s=16;else if(typeof t=="object")if(n&65){const l=t.default;l&&(l._c&&(l._d=!1),Mn(e,l()),l._c&&(l._d=!0));return}else{s=32;const l=t._;!l&&!ro(t)?t._ctx=Qe:l===3&&Qe&&(Qe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:Qe},s=32):(t=String(t),n&64?(s=16,t=[_e(t)]):s=8);e.children=t,e.shapeFlag|=s}function ma(...e){const t={};for(let s=0;sFe||Qe;let Ms,mn;{const e=Bs(),t=(s,n)=>{let l;return(l=e[s])||(l=e[s]=[]),l.push(n),o=>{l.length>1?l.forEach(a=>a(o)):l[0](o)}};Ms=t("__VUE_INSTANCE_SETTERS__",s=>Fe=s),mn=t("__VUE_SSR_SETTERS__",s=>ms=s)}const vs=e=>{const t=Fe;return Ms(e),e.scope.on(),()=>{e.scope.off(),Ms(t)}},Qn=()=>{Fe&&Fe.scope.off(),Ms(null)};function yo(e){return e.vnode.shapeFlag&4}let ms=!1;function ya(e,t=!1,s=!1){t&&mn(t);const{props:n,children:l}=e.vnode,o=yo(e);ta(e,n,o,t),oa(e,l,s||t);const a=o?_a(e,t):void 0;return t&&mn(!1),a}function _a(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Br);const{setup:n}=s;if(n){_t();const l=e.setupContext=n.length>1?Sa(e):null,o=vs(e),a=xs(n,e,0,[e.props,l]),u=yl(a);if(wt(),o(),(u||e.sp)&&!is(e)&&zl(e),u){if(a.then(Qn,Qn),t)return a.then(d=>{Zn(e,d)}).catch(d=>{Vs(d,e,0)});e.asyncDep=a}else Zn(e,a)}else _o(e)}function Zn(e,t,s){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:me(t)&&(e.setupState=Vl(t)),_o(e)}function _o(e,t,s){const n=e.type;e.render||(e.render=n.render||ct);{const l=vs(e);_t();try{Fr(e)}finally{wt(),l()}}}const wa={get(e,t){return Me(e,"get",""),e[t]}};function Sa(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,wa),slots:e.slots,emit:e.emit,expose:t}}function qs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Vl(ur(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in us)return us[s](e)},has(t,s){return s in t||s in us}})):e.proxy}function ka(e){return ne(e)&&"__vccOpts"in e}const se=(e,t)=>gr(e,t,ms),Aa="3.5.32";/** -* @vue/runtime-dom v3.5.32 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let bn;const el=typeof window<"u"&&window.trustedTypes;if(el)try{bn=el.createPolicy("vue",{createHTML:e=>e})}catch{}const wo=bn?e=>bn.createHTML(e):e=>e,Ca="http://www.w3.org/2000/svg",$a="http://www.w3.org/1998/Math/MathML",bt=typeof document<"u"?document:null,tl=bt&&bt.createElement("template"),Ta={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const l=t==="svg"?bt.createElementNS(Ca,e):t==="mathml"?bt.createElementNS($a,e):s?bt.createElement(e,{is:s}):bt.createElement(e);return e==="select"&&n&&n.multiple!=null&&l.setAttribute("multiple",n.multiple),l},createText:e=>bt.createTextNode(e),createComment:e=>bt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>bt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,l,o){const a=s?s.previousSibling:t.lastChild;if(l&&(l===o||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),s),!(l===o||!(l=l.nextSibling)););else{tl.innerHTML=wo(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const u=tl.content;if(n==="svg"||n==="mathml"){const d=u.firstChild;for(;d.firstChild;)u.appendChild(d.firstChild);u.removeChild(d)}t.insertBefore(u,s)}return[a?a.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Pa=Symbol("_vtc");function Ia(e,t,s){const n=e[Pa];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const sl=Symbol("_vod"),Ea=Symbol("_vsh"),Oa=Symbol(""),Ra=/(?:^|;)\s*display\s*:/;function Ma(e,t,s){const n=e.style,l=Te(s);let o=!1;if(s&&!l){if(t)if(Te(t))for(const a of t.split(";")){const u=a.slice(0,a.indexOf(":")).trim();s[u]==null&&Ts(n,u,"")}else for(const a in t)s[a]==null&&Ts(n,a,"");for(const a in s)a==="display"&&(o=!0),Ts(n,a,s[a])}else if(l){if(t!==s){const a=n[Oa];a&&(s+=";"+a),n.cssText=s,o=Ra.test(s)}}else t&&e.removeAttribute("style");sl in e&&(e[sl]=o?n.display:"",e[Ea]&&(n.display="none"))}const nl=/\s*!important$/;function Ts(e,t,s){if(Y(s))s.forEach(n=>Ts(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=Ua(e,t);nl.test(s)?e.setProperty(Ot(n),s.replace(nl,""),"important"):e[n]=s}}const ll=["Webkit","Moz","ms"],tn={};function Ua(e,t){const s=tn[t];if(s)return s;let n=nt(t);if(n!=="filter"&&n in e)return tn[t]=n;n=Sl(n);for(let l=0;lsn||(ja.then(()=>sn=0),sn=Date.now());function Fa(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;pt(Va(n,s.value),t,5,[n])};return s.value=e,s.attached=Ba(),s}function Va(e,t){if(Y(t)){const s=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{s.call(e),e._stopped=!0},t.map(n=>l=>!l._stopped&&n&&n(l))}else return t}const dl=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ha=(e,t,s,n,l,o)=>{const a=l==="svg";t==="class"?Ia(e,n,a):t==="style"?Ma(e,s,n):Ls(t)?Ds(t)||Da(e,t,s,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ka(e,t,n,a))?(al(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&rl(e,t,n,a,o,t!=="value")):e._isVueCE&&(Wa(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Te(n)))?al(e,nt(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),rl(e,t,n,a))};function Ka(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&dl(t)&&ne(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const l=e.tagName;if(l==="IMG"||l==="VIDEO"||l==="CANVAS"||l==="SOURCE")return!1}return dl(t)&&Te(s)?!1:t in e}function Wa(e,t){const s=e._def.props;if(!s)return!1;const n=nt(t);return Array.isArray(s)?s.some(l=>nt(l)===n):Object.keys(s).some(l=>nt(l)===n)}const Et=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Y(t)?s=>ks(t,s):t};function Ga(e){e.target.composing=!0}function cl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const et=Symbol("_assign");function fl(e,t,s){return t&&(e=e.trim()),s&&(e=js(e)),e}const Ce={created(e,{modifiers:{lazy:t,trim:s,number:n}},l){e[et]=Et(l);const o=n||l.props&&l.props.type==="number";yt(e,t?"change":"input",a=>{a.target.composing||e[et](fl(e.value,s,o))}),(s||o)&&yt(e,"change",()=>{e.value=fl(e.value,s,o)}),t||(yt(e,"compositionstart",Ga),yt(e,"compositionend",cl),yt(e,"change",cl))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:l,number:o}},a){if(e[et]=Et(a),e.composing)return;const u=(o||e.type==="number")&&!/^0\d/.test(e.value)?js(e.value):e.value,d=t??"";if(u===d)return;const p=e.getRootNode();(p instanceof Document||p instanceof ShadowRoot)&&p.activeElement===e&&e.type!=="range"&&(n&&t===s||l&&e.value.trim()===d)||(e.value=d)}},So={deep:!0,created(e,t,s){e[et]=Et(s),yt(e,"change",()=>{const n=e._modelValue,l=Qt(e),o=e.checked,a=e[et];if(Y(n)){const u=_n(n,l),d=u!==-1;if(o&&!d)a(n.concat(l));else if(!o&&d){const p=[...n];p.splice(u,1),a(p)}}else if(Zt(n)){const u=new Set(n);o?u.add(l):u.delete(l),a(u)}else a(ko(e,o))})},mounted:pl,beforeUpdate(e,t,s){e[et]=Et(s),pl(e,t,s)}};function pl(e,{value:t,oldValue:s},n){e._modelValue=t;let l;if(Y(t))l=_n(t,n.props.value)>-1;else if(Zt(t))l=t.has(n.props.value);else{if(t===s)return;l=Pt(t,ko(e,!0))}e.checked!==l&&(e.checked=l)}const qa={created(e,{value:t},s){e.checked=Pt(t,s.props.value),e[et]=Et(s),yt(e,"change",()=>{e[et](Qt(e))})},beforeUpdate(e,{value:t,oldValue:s},n){e[et]=Et(n),t!==s&&(e.checked=Pt(t,n.props.value))}},Jt={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const l=Zt(t);yt(e,"change",()=>{const o=Array.prototype.filter.call(e.options,a=>a.selected).map(a=>s?js(Qt(a)):Qt(a));e[et](e.multiple?l?new Set(o):o:o[0]),e._assigning=!0,Pn(()=>{e._assigning=!1})}),e[et]=Et(n)},mounted(e,{value:t}){gl(e,t)},beforeUpdate(e,t,s){e[et]=Et(s)},updated(e,{value:t}){e._assigning||gl(e,t)}};function gl(e,t){const s=e.multiple,n=Y(t);if(!(s&&!n&&!Zt(t))){for(let l=0,o=e.options.length;lString(p)===String(u)):a.selected=_n(t,u)>-1}else a.selected=t.has(u);else if(Pt(Qt(a),t)){e.selectedIndex!==l&&(e.selectedIndex=l);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Qt(e){return"_value"in e?e._value:e.value}function ko(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const Nt={created(e,t,s){Ss(e,t,s,null,"created")},mounted(e,t,s){Ss(e,t,s,null,"mounted")},beforeUpdate(e,t,s,n){Ss(e,t,s,n,"beforeUpdate")},updated(e,t,s,n){Ss(e,t,s,n,"updated")}};function Ya(e,t){switch(e){case"SELECT":return Jt;case"TEXTAREA":return Ce;default:switch(t){case"checkbox":return So;case"radio":return qa;default:return Ce}}}function Ss(e,t,s,n,l){const a=Ya(e.tagName,s.props&&s.props.type)[l];a&&a(e,t,s,n)}const Ja=["ctrl","shift","alt","meta"],za={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ja.some(s=>e[`${s}Key`]&&!t.includes(s))},Xa=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((l,...o)=>{for(let a=0;a{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=(l=>{if(!("key"in l))return;const o=Ot(l.key);if(t.some(a=>a===o||Qa[a]===o))return e(l)}))},ei=Le({patchProp:Ha},Ta);let ml;function ti(){return ml||(ml=aa(ei))}const si=((...e)=>{const t=ti().createApp(...e),{mount:s}=t;return t.mount=n=>{const l=li(n);if(!l)return;const o=t._component;!ne(o)&&!o.render&&!o.template&&(o.template=l.innerHTML),l.nodeType===1&&(l.textContent="");const a=s(l,!1,ni(l));return l instanceof Element&&(l.removeAttribute("v-cloak"),l.setAttribute("data-v-app","")),a},t});function ni(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function li(e){return Te(e)?document.querySelector(e):e}const oi="/api";function ri(){return localStorage.getItem("autoteam_api_key")||""}function Us(e){localStorage.setItem("autoteam_api_key",e)}function nn(){localStorage.removeItem("autoteam_api_key")}async function K(e,t,s=null){var d;const n={"Content-Type":"application/json"},l=ri();l&&(n.Authorization=`Bearer ${l}`);const o={method:e,headers:n};s&&(o.body=JSON.stringify(s));const a=await fetch(`${oi}${t}`,o);let u;try{u=await a.json()}catch{const p=new Error(`HTTP ${a.status}: 服务器返回了非 JSON 响应`);throw p.status=a.status,p}if(!a.ok){const p=(u==null?void 0:u.message)||((d=u==null?void 0:u.detail)==null?void 0:d.message)||(u==null?void 0:u.detail)||`HTTP ${a.status}`,c=new Error(p);throw c.status=a.status,c}return u}const z={checkAuth:()=>K("GET","/auth/check"),getSetupStatus:()=>K("GET","/setup/status"),saveSetup:e=>K("POST","/setup/save",e),getRuntimeConfig:()=>K("GET","/config/runtime"),saveRuntimeConfig:e=>K("PUT","/config/runtime",e),getRuntimeConfigSource:()=>K("GET","/config/source"),saveRuntimeConfigSource:e=>K("PUT","/config/source",e),getStatus:()=>K("GET","/status"),getAdminStatus:()=>K("GET","/admin/status"),getMainCodexStatus:()=>K("GET","/main-codex/status"),getManualAccountStatus:()=>K("GET","/manual-account/status"),getAccounts:()=>K("GET","/accounts"),getActiveAccounts:()=>K("GET","/accounts/active"),getStandbyAccounts:()=>K("GET","/accounts/standby"),bulkDisableAccounts:e=>K("POST","/accounts/bulk/disable",{emails:e}),bulkEnableAccounts:e=>K("POST","/accounts/bulk/enable",{emails:e}),disableAccount:e=>K("POST",`/accounts/${encodeURIComponent(e)}/disable`),enableAccount:e=>K("POST",`/accounts/${encodeURIComponent(e)}/enable`),deleteAccount:e=>K("DELETE",`/accounts/${encodeURIComponent(e)}`),loginAccount:e=>K("POST","/accounts/login",{email:e}),getCodexAuth:e=>K("GET",`/accounts/${encodeURIComponent(e)}/codex-auth`),kickAccount:e=>K("POST",`/accounts/${encodeURIComponent(e)}/kick`),getCpaFiles:()=>K("GET","/cpa/files"),startAdminLogin:e=>K("POST","/admin/login/start",{email:e}),submitAdminSession:(e,t)=>K("POST","/admin/login/session",{email:e,session_token:t}),submitAdminPassword:e=>K("POST","/admin/login/password",{password:e}),submitAdminCode:e=>K("POST","/admin/login/code",{code:e}),submitAdminWorkspace:e=>K("POST","/admin/login/workspace",{option_id:e}),cancelAdminLogin:()=>K("POST","/admin/login/cancel"),logoutAdmin:()=>K("POST","/admin/logout"),startMainCodexLogin:()=>K("POST","/main-codex/login"),startMainCodexSync:()=>K("POST","/main-codex/start"),submitMainCodexPassword:e=>K("POST","/main-codex/password",{password:e}),submitMainCodexCode:e=>K("POST","/main-codex/code",{code:e}),cancelMainCodexSync:()=>K("POST","/main-codex/cancel"),deleteMainCodexFromRemoteFiles:()=>K("POST","/main-codex/delete-remote-files"),startManualAccount:()=>K("POST","/manual-account/start"),submitManualAccountCallback:e=>K("POST","/manual-account/callback",{redirect_url:e}),cancelManualAccount:()=>K("POST","/manual-account/cancel"),postSync:()=>K("POST","/sync"),postSyncFromCpa:()=>K("POST","/sync/from-cpa"),postSyncAccounts:()=>K("POST","/sync/accounts"),postSyncMainCodex:()=>K("POST","/sync/main-codex"),startRotate:(e=5)=>K("POST","/tasks/rotate",{target:e}),startCheck:()=>K("POST","/tasks/check"),startAdd:()=>K("POST","/tasks/add"),startFill:(e=5)=>K("POST","/tasks/fill",{target:e}),startCleanup:(e=null)=>K("POST","/tasks/cleanup",{max_seats:e}),startResetQuota:()=>K("POST","/tasks/reset-quota"),getTasks:()=>K("GET","/tasks"),getTask:e=>K("GET",`/tasks/${e}`),cancelTask:e=>K("POST",`/tasks/${e}/cancel`),getAutoCheckConfig:()=>K("GET","/config/auto-check"),setAutoCheckConfig:e=>K("PUT","/config/auto-check",e),getTeamMembers:()=>K("GET","/team/members"),removeTeamMember:e=>K("POST","/team/members/remove",e),getLogs:(e=100,t=0)=>K("GET",`/logs?limit=${e}&since=${t}`)},ai={class:"relative min-h-screen overflow-hidden"},ii={class:"relative mx-auto flex min-h-screen max-w-6xl items-center px-4 py-10"},ui={class:"grid w-full items-center gap-8 lg:grid-cols-[1.05fr_0.95fr]"},di={class:"glass-card w-full p-7 sm:p-8"},ci={class:"space-y-4"},fi={class:"mb-2 block text-sm font-medium text-slate-300"},pi={key:0,class:"text-red-400"},gi={key:1,class:"ml-1 text-xs text-slate-500"},mi=["onUpdate:modelValue","type","placeholder"],bi=["disabled"],hi={__name:"SetupPage",emits:["configured"],setup(e,{emit:t}){const s=t,n=M([]),l=hs({}),o=M(!1),a=M(""),u=M("");Vt(async()=>{try{const p=await z.getSetupStatus();n.value=p.fields;for(const c of p.fields)l[c.key]=c.default||""}catch(p){a.value="获取配置状态失败: "+p.message,u.value="bg-red-500/10 text-red-400 border-red-500/20"}});async function d(){o.value=!0,a.value="";try{const p=await z.saveSetup({...l});p.api_key&&Us(p.api_key),a.value=p.message,u.value="bg-green-500/10 text-green-400 border-green-500/20",setTimeout(()=>s("configured"),1e3)}catch(p){a.value=p.message,u.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{o.value=!1}}return(p,c)=>(b(),x("div",ai,[c[3]||(c[3]=r("div",{class:"pointer-events-none absolute inset-0"},[r("div",{class:"absolute left-[-6rem] top-[-6rem] h-72 w-72 rounded-full bg-blue-500/20 blur-3xl"}),r("div",{class:"absolute bottom-[-8rem] right-[-4rem] h-80 w-80 rounded-full bg-cyan-500/15 blur-3xl"})],-1)),r("div",ii,[r("div",ui,[c[2]||(c[2]=Ft('',1)),r("div",di,[c[0]||(c[0]=r("div",{class:"mb-6 flex items-center gap-3"},[r("div",{class:"flex h-12 w-12 items-center justify-center rounded-2xl bg-gradient-to-br from-blue-500/30 to-cyan-500/20 text-2xl shadow-inner shadow-white/10"}," 🔑 "),r("div",null,[r("h2",{class:"text-2xl font-semibold text-white"},"AutoTeam 初始配置"),r("p",{class:"mt-1 text-sm text-slate-400"},"完成这一项后即可进入控制面板")])],-1)),a.value?(b(),x("div",{key:0,class:Q(["mb-4 rounded-2xl px-4 py-3 text-sm border",u.value])},y(a.value),3)):B("",!0),r("div",ci,[(b(!0),x(de,null,$e(n.value,m=>(b(),x("div",{key:m.key,class:"rounded-2xl border border-white/10 bg-white/5 p-4"},[r("label",fi,[_e(y(m.prompt)+" ",1),m.optional?B("",!0):(b(),x("span",pi,"*")),m.key==="API_KEY"?(b(),x("span",gi,"(留空自动生成)")):B("",!0)]),ue(r("input",{"onUpdate:modelValue":v=>l[m.key]=v,type:m.key.includes("PASSWORD")||m.key.includes("KEY")?"password":"text",placeholder:m.default||"",class:"input-dark"},null,8,mi),[[Nt,l[m.key]]])]))),128))]),r("button",{onClick:d,disabled:o.value,class:"btn-primary mt-6 w-full py-3"},y(o.value?"保存中...":"保存并进入面板"),9,bi),c[1]||(c[1]=r("div",{class:"mt-4 rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-xs leading-6 text-slate-400"}," 保存后你可以继续去配置面板补充 CloudMail、CPA / Sub2API、代理以及巡检参数。 ",-1))])])])]))}},xi={class:"sticky top-0 hidden min-h-screen w-72 shrink-0 flex-col border-r border-white/10 bg-slate-950/65 p-5 backdrop-blur-2xl md:flex"},vi={class:"flex-1 space-y-2"},yi=["onClick"],_i={class:"min-w-0 flex-1"},wi={class:"block text-sm font-medium"},Si={class:"mt-0.5 block text-xs text-slate-500 group-hover:text-slate-400"},ki={class:"space-y-2 border-t border-white/10 pt-5"},Ai=["disabled"],Ci={class:"fixed bottom-3 left-3 right-3 z-50 flex rounded-3xl border border-white/10 bg-slate-950/80 p-1.5 shadow-[0_20px_40px_-20px_rgba(15,23,42,0.9)] backdrop-blur-2xl md:hidden"},$i=["onClick"],Ti={class:"flex flex-col items-center"},Pi={class:"text-lg"},Ii={class:"mt-0.5"},Ei={__name:"Sidebar",props:{active:String,loading:Boolean,authRequired:Boolean},emits:["navigate","refresh","logout"],setup(e){const t=[{key:"dashboard",icon:"📊",label:"仪表盘",mobileLabel:"仪表盘",hint:"概览账号池与状态"},{key:"config",icon:"🧩",label:"配置面板",mobileLabel:"配置",hint:"统一编辑系统配置"},{key:"team",icon:"👥",label:"Team 成员",mobileLabel:"成员",hint:"查看与管理成员"},{key:"pool",icon:"🔁",label:"账号池操作",mobileLabel:"账号池",hint:"轮转、补位与清理"},{key:"sync",icon:"🔄",label:"同步中心",mobileLabel:"同步",hint:"同步本地、远端与状态"},{key:"oauth",icon:"🔐",label:"OAuth 登录",mobileLabel:"OAuth",hint:"手动接管 OAuth 流程"},{key:"tasks",icon:"📜",label:"任务历史",mobileLabel:"任务",hint:"追踪任务执行结果"},{key:"logs",icon:"📋",label:"日志",mobileLabel:"日志",hint:"查看实时运行日志"}];return(s,n)=>(b(),x(de,null,[r("nav",xi,[n[4]||(n[4]=Ft('

AutoTeam

账号轮转管理中心

面板在线

统一查看仪表盘、配置、同步、OAuth 和日志。

',1)),r("div",vi,[(b(),x(de,null,$e(t,l=>r("button",{key:l.key,onClick:o=>s.$emit("navigate",l.key),class:Q(["group flex w-full items-center gap-3 rounded-2xl px-3 py-3 text-left transition",e.active===l.key?"bg-blue-500/15 text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.05)] ring-1 ring-blue-400/20":"text-slate-400 hover:bg-white/5 hover:text-white"])},[r("span",{class:Q(["flex h-11 w-11 items-center justify-center rounded-2xl border text-lg transition",e.active===l.key?"border-blue-400/20 bg-blue-500/15 text-blue-200":"border-white/10 bg-white/5 text-slate-300 group-hover:border-white/20 group-hover:bg-white/10"])},y(l.icon),3),r("span",_i,[r("span",wi,y(l.label),1),r("span",Si,y(l.hint),1)]),r("span",{class:Q(["h-2.5 w-2.5 rounded-full transition",e.active===l.key?"bg-cyan-300 shadow-[0_0_14px_rgba(103,232,249,0.9)]":"bg-slate-700 group-hover:bg-slate-500"])},null,2)],10,yi)),64))]),r("div",ki,[r("button",{onClick:n[0]||(n[0]=l=>s.$emit("refresh")),disabled:e.loading,class:"btn-secondary w-full justify-start gap-3 rounded-2xl px-3 py-3 text-left disabled:opacity-50"},[n[2]||(n[2]=r("span",{class:"text-base"},"🔄",-1)),_e(" "+y(e.loading?"刷新中...":"刷新数据"),1)],8,Ai),e.authRequired?(b(),x("button",{key:0,onClick:n[1]||(n[1]=l=>s.$emit("logout")),class:"btn-danger w-full justify-start gap-3 rounded-2xl px-3 py-3 text-left"},[...n[3]||(n[3]=[r("span",{class:"text-base"},"🚪",-1),_e(" 登出 ",-1)])])):B("",!0)])]),r("nav",Ci,[(b(),x(de,null,$e(t,l=>r("button",{key:l.key,onClick:o=>s.$emit("navigate",l.key),class:Q(["flex-1 rounded-2xl px-1 py-2 text-xs transition",e.active===l.key?"bg-blue-500/15 text-blue-300":"text-slate-500"])},[r("div",Ti,[r("span",Pi,y(l.icon),1),r("span",Ii,y(l.mobileLabel||l.label),1)])],10,$i)),64))])],64))}},Oi={key:0},Ri={class:"grid grid-cols-2 sm:grid-cols-3 xl:grid-cols-6 gap-4 mb-6"},Mi={class:"text-sm text-gray-400"},Ui={class:"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},Li={class:"px-4 py-3 border-b border-gray-800 flex items-center justify-between"},Di={class:"flex items-center gap-2"},Ni={key:0,class:"text-xs text-fuchsia-300"},ji=["disabled"],Bi=["disabled"],Fi=["disabled"],Vi=["disabled"],Hi={key:1,class:"mx-4 mt-4 px-4 py-3 rounded-lg text-sm border bg-amber-500/10 text-amber-300 border-amber-500/20"},Ki={class:"overflow-x-auto"},Wi={class:"w-full text-sm"},Gi={class:"text-gray-400 text-left border-b border-gray-800"},qi={class:"px-4 py-3 font-medium w-10"},Yi=["checked","disabled"],Ji={class:"px-4 py-3"},zi=["checked","disabled","onChange"],Xi={class:"px-4 py-3 text-gray-500"},Qi={class:"px-4 py-3 font-mono text-xs text-slate-200"},Zi={class:"px-4 py-3"},eu={class:"px-4 py-3 text-gray-400 text-xs"},tu={class:"px-4 py-3 text-gray-400 text-xs"},su={class:"px-4 py-3 text-right space-x-2"},nu=["onClick","disabled"],lu=["onClick","disabled"],ou=["onClick","disabled"],ru=["onClick","disabled"],au=["onClick","disabled"],iu={class:"bg-gray-900 border border-gray-800 rounded-xl w-full max-w-2xl max-h-[80vh] flex flex-col"},uu={class:"px-4 py-3 border-b border-gray-800 flex items-center justify-between"},du={class:"p-4 space-y-3 overflow-y-auto flex-1"},cu={class:"relative"},fu={class:"bg-gray-950 border border-gray-800 rounded-lg p-4 text-xs font-mono text-gray-300 overflow-x-auto whitespace-pre"},pu={class:"px-4 py-3 border-t border-gray-800 flex justify-end gap-3"},gu={key:1,class:"space-y-4"},mu={class:"grid grid-cols-2 sm:grid-cols-4 gap-4"},bu={__name:"Dashboard",props:{status:Object,loading:Boolean,runningTask:Object,adminStatus:{type:Object,default:null}},emits:["refresh","task-started"],setup(e,{emit:t}){const s=e,n=t,l=M(""),o=M(""),a=M(!1),u=M(!1),d=M(!1),p=M(""),c=M(null),m=M(!1),v=M(""),C=M([]),j=se(()=>{var i;return!!((i=s.adminStatus)!=null&&i.configured)}),I=se(()=>!!s.runningTask||!j.value||d.value),D=se(()=>a.value||I.value),F=se(()=>u.value||!!s.runningTask),V=se(()=>{var i;return(((i=s.status)==null?void 0:i.accounts)||[]).filter(X)}),G=se(()=>V.value.filter(i=>C.value.includes(i.email)&&!i.disabled)),P=se(()=>V.value.filter(i=>C.value.includes(i.email)&&i.disabled)),Z=se(()=>!!V.value.length&&C.value.length===V.value.length),W=se(()=>I.value||!G.value.length),le=se(()=>I.value||!P.value.length),ve=se(()=>{if(!s.status)return[];const i=s.status.summary;return[{label:"活跃",value:i.active,color:"text-green-400"},{label:"待修复",value:i.auth_pending||0,color:"text-cyan-400"},{label:"待命",value:i.standby,color:"text-yellow-400"},{label:"额度用完",value:i.exhausted,color:"text-red-400"},{label:"禁用",value:i.disabled||0,color:"text-fuchsia-400"},{label:"总计",value:i.total,color:"text-white"}]});function Pe(i){return{active:"bg-green-500/10 text-green-400",auth_pending:"bg-cyan-500/10 text-cyan-400",exhausted:"bg-red-500/10 text-red-400",standby:"bg-yellow-500/10 text-yellow-400",disabled:"bg-fuchsia-500/10 text-fuchsia-400",pending:"bg-gray-500/10 text-gray-400"}[i]||"bg-gray-500/10 text-gray-400"}function Se(i){return{active:"bg-green-400",auth_pending:"bg-cyan-400",exhausted:"bg-red-400",standby:"bg-yellow-400",disabled:"bg-fuchsia-400",pending:"bg-gray-400"}[i]||"bg-gray-400"}function J(i){return{active:"Active",auth_pending:"Auth pending",exhausted:"Used up",standby:"Standby",disabled:"Disabled",pending:"Pending"}[i]||i}function X(i){return!!i&&!i.is_main_account}function Ee(i){return C.value.includes(i)}function ee(i,f){if(i){if(f){C.value.includes(i)||(C.value=[...C.value,i]);return}C.value=C.value.filter(g=>g!==i)}}function De(i){C.value=i?V.value.map(f=>f.email):[]}$t(()=>{var i;return(i=s.status)==null?void 0:i.accounts},i=>{const f=new Set((i||[]).filter(X).map(g=>g.email));C.value=C.value.filter(g=>f.has(g))},{immediate:!0});function he(i,f){var _,k;const g=((k=(_=s.status)==null?void 0:_.quota_cache)==null?void 0:k[i.email])||i.last_quota;return g?100-((f==="primary"?g.primary_pct:g.weekly_pct)||0):null}function ie(i,f){const g=he(i,f);return g!==null?`${g}%`:"-"}function ae(i,f){var k,U;const g=((U=(k=s.status)==null?void 0:k.quota_cache)==null?void 0:U[i.email])||i.last_quota;if(!g)return"-";const S=f==="primary"?g.primary_resets_at:g.weekly_resets_at;if(!S)return"-";const _=new Date(S*1e3);return`${String(_.getMonth()+1).padStart(2,"0")}-${String(_.getDate()).padStart(2,"0")} ${String(_.getHours()).padStart(2,"0")}:${String(_.getMinutes()).padStart(2,"0")}`}function Re(i){return i===null?"text-gray-500":i>30?"text-green-400":i>0?"text-yellow-400":"text-red-400"}const Ie=se(()=>c.value?JSON.stringify(c.value.codex_auth,null,2):"");async function ke(i){try{c.value=await z.getCodexAuth(i),m.value=!1}catch(f){p.value=f.message,v.value="bg-red-500/10 text-red-400 border-red-500/20",setTimeout(()=>{p.value=""},8e3)}}async function Oe(){try{await navigator.clipboard.writeText(Ie.value)}catch{const i=document.createElement("textarea");i.value=Ie.value,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i)}m.value=!0,setTimeout(()=>{m.value=!1},3e3)}function gt(){const i=new Blob([Ie.value],{type:"application/json"}),f=URL.createObjectURL(i),g=document.createElement("a");g.href=f,g.download="auth.json",g.click(),URL.revokeObjectURL(f)}async function Rt(){if(!D.value){a.value=!0,p.value="";try{const i=await z.postSyncAccounts();p.value=i.message||"同步完成",v.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(i){p.value=i.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{a.value=!1,setTimeout(()=>{p.value=""},8e3)}}}async function At(){if(!(F.value||!window.confirm(`确认清空所有托管非主号账号的本地额度恢复记录吗? - -这会清空 last_quota / quota_resets_at / quota_exhausted_at,并把 exhausted 账号恢复为可检查状态。 -不会自动执行轮转或检查。`))){u.value=!0,p.value="";try{const f=await z.startResetQuota();p.value=`任务已提交: ${f.task_id}`,v.value="bg-blue-500/10 text-blue-400 border-blue-500/20",n("task-started")}catch(f){p.value=f.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{u.value=!1,setTimeout(()=>{p.value=""},8e3)}}}async function tt(i){if(!I.value){l.value=i,o.value="login",p.value="";try{const f=await z.loginAccount(i);p.value=`已提交 ${i} 的登录任务: ${f.task_id}`,v.value="bg-blue-500/10 text-blue-400 border-blue-500/20",n("refresh")}catch(f){p.value=f.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{p.value=""},8e3)}}}async function st(i){if(!(I.value||!window.confirm(`确认将 ${i} 移出 Team? -账号会变为 standby 状态,额度恢复后可重新复用。`))){l.value=i,o.value="kick",p.value="";try{const g=await z.kickAccount(i);p.value=g.message||`已将 ${i} 移出 Team`,v.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(g){p.value=g.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{p.value=""},8e3)}}}async function Ge(i){if(I.value)return;const f=!i.disabled;if(window.confirm(f?`确认禁用账号 ${i.email}? -禁用后自动巡检、轮转和远端同步都会跳过该账号。`:`确认启用账号 ${i.email}? -启用后该账号会重新参与自动巡检、轮转和远端同步。`)){l.value=i.email,o.value=f?"disable":"enable",p.value="";try{const S=f?await z.disableAccount(i.email):await z.enableAccount(i.email);p.value=S.message||`${f?"已禁用":"已启用"} ${i.email}`,v.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(S){p.value=S.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{p.value=""},8e3)}}}async function Je(){if(W.value)return;const i=G.value.map(g=>g.email);if(window.confirm(`确认批量禁用这 ${i.length} 个账号吗? -禁用后自动巡检、轮转和远端同步都会跳过它们。`)){d.value=!0,p.value="";try{const g=await z.bulkDisableAccounts(i);p.value=g.message||`已禁用 ${i.length} 个账号`,v.value="bg-green-500/10 text-green-400 border-green-500/20",C.value=[],n("refresh")}catch(g){p.value=g.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{d.value=!1,setTimeout(()=>{p.value=""},8e3)}}}async function w(){if(le.value)return;const i=P.value.map(g=>g.email);if(window.confirm(`确认批量启用这 ${i.length} 个账号吗? -启用后它们会重新参与自动巡检、轮转和远端同步。`)){d.value=!0,p.value="";try{const g=await z.bulkEnableAccounts(i);p.value=g.message||`已启用 ${i.length} 个账号`,v.value="bg-green-500/10 text-green-400 border-green-500/20",C.value=[],n("refresh")}catch(g){p.value=g.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{d.value=!1,setTimeout(()=>{p.value=""},8e3)}}}async function T(i){if(!(I.value||!window.confirm(`确认删除账号 ${i}? -这会同时清理本地记录、已配置远端、Team/Invite 和 CloudMail。`))){l.value=i,o.value="delete",p.value="";try{const g=await z.deleteAccount(i);p.value=g.message||`已删除 ${i}`,v.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(g){p.value=g.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{p.value=""},8e3)}}}return(i,f)=>e.status?(b(),x("div",Oi,[r("div",Ri,[(b(!0),x(de,null,$e(ve.value,g=>(b(),x("div",{key:g.label,class:"bg-gray-900 border border-gray-800 rounded-xl p-4"},[r("div",Mi,y(g.label),1),r("div",{class:Q(["text-3xl font-bold mt-1",g.color])},y(g.value),3)]))),128))]),r("div",Ui,[r("div",Li,[f[4]||(f[4]=r("h2",{class:"text-lg font-semibold text-white"},"账号列表",-1)),r("div",Di,[C.value.length?(b(),x("div",Ni," 已选 "+y(C.value.length)+" 个 ",1)):B("",!0),r("button",{onClick:Je,disabled:W.value,class:Q(["px-3 py-1.5 text-xs rounded-lg border transition disabled:opacity-50",W.value?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-fuchsia-600/10 text-fuchsia-400 border-fuchsia-500/30 hover:bg-fuchsia-600/20"])},y(d.value?"批量处理中...":`一键禁用${G.value.length?`(${G.value.length})`:""}`),11,ji),r("button",{onClick:w,disabled:le.value,class:Q(["px-3 py-1.5 text-xs rounded-lg border transition disabled:opacity-50",le.value?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-emerald-600/10 text-emerald-400 border-emerald-500/30 hover:bg-emerald-600/20"])},y(d.value?"批量处理中...":`一键启用${P.value.length?`(${P.value.length})`:""}`),11,Bi),r("button",{onClick:At,disabled:F.value,class:Q(["btn-secondary px-3 py-1.5 text-xs disabled:opacity-50",F.value?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"hover:text-white"])},y(u.value?"提交中...":"重置额度恢复记录"),11,Fi),r("button",{onClick:Rt,disabled:D.value,class:"px-3 py-1.5 bg-gray-800 hover:bg-gray-700 text-xs rounded-lg border border-gray-700 transition disabled:opacity-50 text-gray-400 hover:text-white"},y(a.value?"同步中...":"同步账号"),9,Vi)])]),p.value?(b(),x("div",{key:0,class:Q(["mx-4 mt-4 px-4 py-3 rounded-lg text-sm border",v.value])},y(p.value),3)):B("",!0),j.value?B("",!0):(b(),x("div",Hi," 请先在「配置面板」页完成管理员登录后,才能操作账号;“重置额度恢复记录”可单独使用。 ")),r("div",Ki,[r("table",Wi,[r("thead",null,[r("tr",Gi,[r("th",qi,[r("input",{type:"checkbox",checked:Z.value,disabled:!V.value.length||I.value,onChange:f[0]||(f[0]=g=>De(g.target.checked)),class:"h-4 w-4 rounded border-gray-700 bg-gray-900 text-fuchsia-500 focus:ring-fuchsia-500 disabled:opacity-40"},null,40,Yi)]),f[5]||(f[5]=r("th",{class:"px-4 py-3 font-medium"},"#",-1)),f[6]||(f[6]=r("th",{class:"px-4 py-3 font-medium"},"邮箱",-1)),f[7]||(f[7]=r("th",{class:"px-4 py-3 font-medium"},"状态",-1)),f[8]||(f[8]=r("th",{class:"px-4 py-3 font-medium text-right"},"5h 剩余",-1)),f[9]||(f[9]=r("th",{class:"px-4 py-3 font-medium text-right"},"周 剩余",-1)),f[10]||(f[10]=r("th",{class:"px-4 py-3 font-medium"},"5h 重置",-1)),f[11]||(f[11]=r("th",{class:"px-4 py-3 font-medium"},"周 重置",-1)),f[12]||(f[12]=r("th",{class:"px-4 py-3 font-medium text-right"},"操作",-1))])]),r("tbody",null,[(b(!0),x(de,null,$e(e.status.accounts,(g,S)=>(b(),x("tr",{key:g.email,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",Ji,[r("input",{type:"checkbox",checked:Ee(g.email),disabled:!X(g)||I.value,onChange:_=>ee(g.email,_.target.checked),class:"h-4 w-4 rounded border-gray-700 bg-gray-900 text-fuchsia-500 focus:ring-fuchsia-500 disabled:opacity-40"},null,40,zi)]),r("td",Xi,y(S+1),1),r("td",Qi,y(g.email),1),r("td",Zi,[r("span",{class:Q(["inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium",Pe(g.status)])},[r("span",{class:Q(["w-1.5 h-1.5 rounded-full",Se(g.status)])},null,2),_e(" "+y(J(g.status)),1)],2)]),r("td",{class:Q(["px-4 py-3 text-right font-mono",Re(he(g,"primary"))])},y(ie(g,"primary")),3),r("td",{class:Q(["px-4 py-3 text-right font-mono",Re(he(g,"weekly"))])},y(ie(g,"weekly")),3),r("td",eu,y(ae(g,"primary")),1),r("td",tu,y(ae(g,"weekly")),1),r("td",su,[!g.is_main_account&&!g.disabled&&g.raw_status!=="active"?(b(),x("button",{key:0,onClick:_=>tt(g.email),disabled:I.value||l.value===g.email,class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",I.value||l.value===g.email?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-blue-600/10 text-blue-400 border-blue-500/30 hover:bg-blue-600/20"])},y(l.value===g.email&&o.value==="login"?"登录中...":"登录"),11,nu)):B("",!0),!g.is_main_account&&["active","auth_pending","exhausted"].includes(g.raw_status)?(b(),x("button",{key:1,onClick:_=>st(g.email),disabled:I.value||l.value===g.email,class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",I.value||l.value===g.email?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-amber-600/10 text-amber-400 border-amber-500/30 hover:bg-amber-600/20"])},y(l.value===g.email&&o.value==="kick"?"移出中...":"移出"),11,lu)):B("",!0),g.raw_status==="active"||g.is_main_account?(b(),x("button",{key:2,onClick:_=>ke(g.email),disabled:l.value===g.email,class:"px-3 py-1.5 rounded-lg text-xs font-medium border transition bg-cyan-600/10 text-cyan-400 border-cyan-500/30 hover:bg-cyan-600/20"}," 导出 ",8,ou)):B("",!0),g.is_main_account?B("",!0):(b(),x("button",{key:3,onClick:_=>Ge(g),disabled:I.value||l.value===g.email,class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",I.value||l.value===g.email?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":g.disabled?"bg-emerald-600/10 text-emerald-400 border-emerald-500/30 hover:bg-emerald-600/20":"bg-fuchsia-600/10 text-fuchsia-400 border-fuchsia-500/30 hover:bg-fuchsia-600/20"])},y(l.value===g.email&&o.value===(g.disabled?"enable":"disable")?g.disabled?"启用中...":"禁用中...":g.disabled?"启用":"禁用"),11,ru)),g.is_main_account?B("",!0):(b(),x("button",{key:4,onClick:_=>T(g.email),disabled:I.value||l.value===g.email,class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",I.value||l.value===g.email?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-rose-600/10 text-rose-400 border-rose-500/30 hover:bg-rose-600/20"])},y(l.value===g.email&&o.value==="delete"?"删除中...":"删除"),11,au))])]))),128))])])]),c.value?(b(),x("div",{key:2,class:"fixed inset-0 bg-black/60 z-50 flex items-center justify-center p-4",onClick:f[3]||(f[3]=Xa(g=>c.value=null,["self"]))},[r("div",iu,[r("div",uu,[f[13]||(f[13]=r("h3",{class:"text-white font-semibold"},"Codex CLI 认证文件",-1)),r("button",{onClick:f[1]||(f[1]=g=>c.value=null),class:"text-gray-400 hover:text-white text-lg"},"×")]),r("div",du,[f[14]||(f[14]=Ft('
使用步骤:
  1. 退出当前 Codex CLI 会话
  2. 删除旧文件:rm ~/.codex/auth.json
  3. 将下方内容保存到 ~/.codex/auth.json(Windows: %APPDATA%\\codex\\auth.json
  4. 重新启动 Codex CLI
导出后 Codex CLI 直连 OpenAI,不走 CPA 代理,响应更快。
',1)),r("div",cu,[r("pre",fu,y(Ie.value),1),r("button",{onClick:Oe,class:Q(["absolute top-2 right-2 px-2 py-1 rounded border text-xs transition",m.value?"bg-green-600/20 text-green-400 border-green-500/30":"bg-gray-800 hover:bg-gray-700 text-gray-400 hover:text-white border-gray-700"])},y(m.value?"复制成功":"复制"),3)])]),r("div",pu,[r("button",{onClick:gt,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition"}," 下载 auth.json "),r("button",{onClick:f[2]||(f[2]=g=>c.value=null),class:"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-sm text-gray-300 rounded-lg border border-gray-700 transition"}," 关闭 ")])])])):B("",!0)])])):e.loading?(b(),x("div",gu,[r("div",mu,[(b(),x(de,null,$e(4,g=>r("div",{key:g,class:"bg-gray-900 border border-gray-800 rounded-xl p-4 h-20 animate-pulse"})),64))]),f[15]||(f[15]=r("div",{class:"bg-gray-900 border border-gray-800 rounded-xl h-64 animate-pulse"},null,-1))])):B("",!0)}},hu={class:"space-y-6"},xu={key:0,class:"glass-card p-5"},vu={class:"flex items-center justify-between gap-4 mb-4"},yu={key:1,class:"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm"},_u={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg"},wu={class:"font-mono text-white break-all"},Su={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg"},ku={class:"font-mono text-white break-all"},Au={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},Cu={class:"text-white"},$u={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},Tu={key:0,class:"text-green-400 text-xs"},Pu={key:1,class:"space-y-2"},Iu={class:"space-y-2"},Eu={class:"flex justify-end"},Ou=["disabled"],Ru={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},Mu={class:"text-white"},Uu={key:2,class:"mt-4"},Lu={key:0,class:"space-y-4"},Du={class:"flex flex-col sm:flex-row gap-3"},Nu=["disabled"],ju={class:"border border-gray-800 rounded-xl p-4 bg-gray-800/30"},Bu={class:"space-y-3"},Fu={class:"flex justify-end"},Vu=["disabled"],Hu={key:1,class:"flex flex-wrap gap-3"},Ku=["disabled"],Wu=["disabled"],Gu=["disabled"],qu=["disabled"],Yu={key:3,class:"space-y-4"},Ju={class:"text-sm text-gray-300"},zu={class:"font-mono"},Xu={key:0,class:"flex flex-col sm:flex-row gap-3"},Qu=["disabled"],Zu=["disabled"],ed={key:1,class:"flex flex-col sm:flex-row gap-3"},td=["disabled"],sd=["disabled"],nd={key:2,class:"space-y-3"},ld=["disabled"],od=["value"],rd=["disabled"],ad={key:3,class:"text-xs text-blue-300"},id={class:"flex justify-end"},ud=["disabled"],dd={key:4,class:"mt-4 space-y-4 border-t border-gray-800 pt-4"},cd={class:"text-sm text-gray-300"},fd={key:0,class:"flex flex-col sm:flex-row gap-3"},pd=["disabled"],gd=["disabled"],md={key:1,class:"flex flex-col sm:flex-row gap-3"},bd=["disabled"],hd=["disabled"],xd={key:2,class:"text-xs text-cyan-300"},vd={class:"flex justify-end"},yd=["disabled"],_d={key:1,class:"glass-card p-5"},wd={class:"flex items-center justify-between mb-4"},Sd={key:0,class:"text-xs text-green-400 transition"},kd={class:"grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-6"},Ad={class:"flex items-center gap-2"},Cd={class:"flex items-center gap-2"},$d={class:"flex items-center gap-2"},Td={class:"flex items-center gap-2"},Pd={class:"flex items-center gap-2"},Id={class:"mt-3 flex items-center justify-between gap-3"},Ed={class:"text-xs text-gray-500"},Od={key:0},Rd=["disabled"],Md={key:0,class:"mt-4 rounded-2xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-xs leading-6 text-amber-200"},bl={__name:"Settings",props:{adminStatus:{type:Object,default:null},codexStatus:{type:Object,default:null},section:{type:String,default:"all"}},emits:["refresh","admin-progress"],setup(e,{emit:t}){const s=e,n=t,l=M({interval:5,target_seats:5,threshold:10,min_low:2,retry_add_phone:!0,add_phone_max_retries:3}),o=M(!1),a=M(!1),u=M(""),d=M(""),p=M(""),c=M(""),m=M(""),v=M(""),C=M(""),j=M(""),I=M(""),D=M(!1),F=M(!1),V=M(""),G=M(!1),P=M(""),Z=M(""),W=M(""),le=M(""),ve=se(()=>{var w;return!!((w=s.adminStatus)!=null&&w.configured)}),Pe=se(()=>{var w;return!!((w=s.adminStatus)!=null&&w.login_in_progress)}),Se=se(()=>{var w;return!!((w=s.codexStatus)!=null&&w.in_progress)}),J=se(()=>{var w;return((w=s.codexStatus)==null?void 0:w.action)==="sync"?"同步":"登录"}),X=se(()=>s.section!=="auto-check"),Ee=se(()=>s.section!=="admin");$t(()=>s.adminStatus,w=>{var T,i,f;if(w!=null&&w.configured&&w.email&&(u.value=w.email,d.value=w.email),w!=null&&w.login_in_progress||(c.value="",m.value="",v.value="",W.value="",C.value=(w==null?void 0:w.email)||C.value),(w==null?void 0:w.login_step)==="workspace_required"&&!v.value){const g=(T=w==null?void 0:w.workspace_options)==null?void 0:T.find(S=>S.kind==="preferred");v.value=(g==null?void 0:g.id)||((f=(i=w==null?void 0:w.workspace_options)==null?void 0:i[0])==null?void 0:f.id)||""}},{immediate:!0}),$t(()=>s.codexStatus,w=>{w!=null&&w.in_progress||(j.value="",I.value="",le.value="")},{immediate:!0}),Vt(async()=>{Ee.value&&await De()});function ee(w,T="success"){P.value=w,Z.value=T==="success"?"bg-green-500/10 text-green-400 border-green-500/20":"bg-red-500/10 text-red-400 border-red-500/20",window.clearTimeout(ee._timer),ee._timer=window.setTimeout(()=>{P.value=""},8e3)}async function De(){try{const w=await z.getAutoCheckConfig();l.value={interval:Math.round(w.interval/60),target_seats:w.target_seats??5,threshold:w.threshold,min_low:w.min_low,retry_add_phone:w.retry_add_phone??!0,add_phone_max_retries:w.add_phone_max_retries??3}}catch(w){console.error("加载巡检配置失败:",w)}}async function he(){D.value=!0,W.value="正在打开管理员登录页...";try{C.value=u.value;const w=await z.startAdminLogin(u.value);ee(w.status==="completed"?"管理员登录完成":"已进入下一步登录流程"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function ie(){D.value=!0,W.value="正在校验 session_token 并识别 workspace...";try{C.value=d.value;const w=await z.submitAdminSession(d.value,p.value);p.value="",ee(w.status==="completed"?"session_token 导入成功":"session_token 已提交"),n("refresh")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function ae(){D.value=!0,W.value="密码已提交,正在等待登录页响应...";try{const w=await z.submitAdminPassword(c.value);ee(w.status==="completed"?"管理员登录完成":"密码已提交,请继续下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function Re(){D.value=!0,W.value="验证码已提交,正在等待登录页响应,通常需要 5 到 10 秒...";try{const w=await z.submitAdminCode(m.value);ee(w.status==="completed"?"管理员登录完成":"验证码已提交,请继续下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function Ie(){D.value=!0,W.value="组织选择已提交,正在等待登录页响应...";try{const w=await z.submitAdminWorkspace(v.value);ee(w.status==="completed"?"管理员登录完成":"组织选择已提交,请继续下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function ke(){D.value=!0;try{await z.cancelAdminLogin(),c.value="",m.value="",ee("管理员登录已取消"),n("refresh")}catch(w){ee(w.message,"error")}finally{D.value=!1}}async function Oe(){D.value=!0;try{await z.logoutAdmin(),c.value="",m.value="",ee("管理员登录态已清除"),n("refresh")}catch(w){ee(w.message,"error")}finally{D.value=!1}}async function gt(){F.value=!0,V.value="login",le.value="正在打开主号 Codex 登录页...";try{const w=await z.startMainCodexLogin();ee(w.status==="completed"?w.message||"主号 Codex 已登录":"主号 Codex 登录进入下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{F.value=!1,V.value="",le.value=""}}async function Rt(){F.value=!0,V.value="sync",le.value="正在打开主号 Codex 登录页...";try{const w=await z.startMainCodexSync();ee(w.status==="completed"?w.message||"主号 Codex 已同步":"主号 Codex 登录进入下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{F.value=!1,V.value="",le.value=""}}async function At(){var w;F.value=!0,V.value=((w=s.codexStatus)==null?void 0:w.action)||"login",le.value="密码已提交,正在等待主号 Codex 登录页响应...";try{const T=await z.submitMainCodexPassword(j.value);ee(T.status==="completed"?T.message||"主号 Codex 已同步":"主号 Codex 密码已提交"),n("admin-progress")}catch(T){ee(T.message,"error")}finally{F.value=!1,V.value="",le.value=""}}async function tt(){var w;F.value=!0,V.value=((w=s.codexStatus)==null?void 0:w.action)||"login",le.value="验证码已提交,正在等待主号 Codex 登录页响应,通常需要 5 到 10 秒...";try{const T=await z.submitMainCodexCode(I.value);ee(T.status==="completed"?T.message||"主号 Codex 已同步":"主号 Codex 验证码已提交"),n("admin-progress")}catch(T){ee(T.message,"error")}finally{F.value=!1,V.value="",le.value=""}}async function st(){F.value=!0;try{await z.cancelMainCodexSync(),ee("主号 Codex 登录已取消"),n("refresh")}catch(w){ee(w.message,"error")}finally{F.value=!1}}async function Ge(){G.value=!0;try{const w=await z.deleteMainCodexFromRemoteFiles();ee(w.message||"已从已启用远端删除主号文件"),n("refresh")}catch(w){ee(w.message,"error")}finally{G.value=!1}}async function Je(){o.value=!0,a.value=!1;try{const w=await z.setAutoCheckConfig({interval:l.value.interval*60,target_seats:l.value.target_seats,threshold:l.value.threshold,min_low:l.value.min_low,retry_add_phone:!!l.value.retry_add_phone,add_phone_max_retries:l.value.add_phone_max_retries});l.value={interval:Math.round(w.interval/60),target_seats:w.target_seats??5,threshold:w.threshold,min_low:w.min_low,retry_add_phone:w.retry_add_phone??!0,add_phone_max_retries:w.add_phone_max_retries??3},a.value=!0,setTimeout(()=>{a.value=!1},3e3)}catch(w){console.error("保存失败:",w)}finally{o.value=!1}}return(w,T)=>{var i,f,g,S,_,k,U,L,O,A,H,N;return b(),x("div",hu,[X.value?(b(),x("div",xu,[r("div",vu,[T[15]||(T[15]=r("div",null,[r("h2",{class:"text-lg font-semibold text-white"},"管理员登录"),r("p",{class:"text-sm text-gray-400 mt-1"}," 首次启动先在这里完成主号登录,系统会统一写入单个 state.json 文件,保存邮箱、session、workspace ID、workspace 名称;如果你走了密码登录,也会保留密码供主号 Codex 复用。 ")],-1)),r("span",{class:Q(["min-w-[72px] px-3 py-1.5 rounded-full text-xs text-center whitespace-nowrap border",ve.value?"bg-green-500/10 text-green-400 border-green-500/20":Pe.value?"bg-yellow-500/10 text-yellow-300 border-yellow-500/20":"bg-gray-800 text-gray-400 border-gray-700"])},y(ve.value?"已配置":Pe.value?"登录中":"未配置"),3)]),P.value?(b(),x("div",{key:0,class:Q(["mb-4 rounded-2xl px-4 py-3 text-sm border",Z.value])},y(P.value),3)):B("",!0),ve.value&&!Pe.value?(b(),x("div",yu,[r("div",_u,[T[16]||(T[16]=r("div",{class:"text-gray-500 mb-1"},"管理员邮箱",-1)),r("div",wu,y(((i=s.adminStatus)==null?void 0:i.email)||"-"),1)]),r("div",Su,[T[17]||(T[17]=r("div",{class:"text-gray-500 mb-1"},"Workspace ID",-1)),r("div",ku,y(((f=s.adminStatus)==null?void 0:f.account_id)||"-"),1)]),r("div",Au,[T[18]||(T[18]=r("div",{class:"text-gray-500 mb-1"},"Workspace 名称",-1)),r("div",Cu,y(((g=s.adminStatus)==null?void 0:g.workspace_name)||"未识别"),1)]),r("div",$u,[T[20]||(T[20]=r("div",{class:"text-gray-500 mb-1"},"Session Token",-1)),(S=s.adminStatus)!=null&&S.session_present?(b(),x("div",Tu,"已配置")):(b(),x("div",Pu,[T[19]||(T[19]=Ft('
未配置(Team 管理功能需要 session token)
获取方式:
  1. 在浏览器中打开 chatgpt.com 并登录管理员账号
  2. 按 F12 打开开发者工具 → Application → Cookies → chatgpt.com
  3. 找到 __Secure-next-auth.session-token
  4. 如果有 .0.1 两个,将值按顺序拼接在一起
  5. 粘贴到下方输入框
',2)),r("div",Iu,[ue(r("input",{"onUpdate:modelValue":T[0]||(T[0]=E=>p.value=E),type:"password",placeholder:"粘贴 session token",class:"w-full px-2 py-1.5 bg-gray-800 border border-gray-700 rounded text-xs text-white font-mono focus:outline-none focus:border-blue-500"},null,512),[[Ce,p.value,void 0,{trim:!0}]]),r("div",Eu,[r("button",{onClick:ie,disabled:D.value||!d.value||!p.value,class:"px-3 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-xs rounded transition disabled:opacity-50"},y(D.value?"校验中...":"保存"),9,Ou)])])]))]),r("div",Ru,[T[21]||(T[21]=r("div",{class:"text-gray-500 mb-1"},"管理员密码",-1)),r("div",Mu,y((_=s.adminStatus)!=null&&_.password_saved?"已保存,可用于主号 Codex 登录":"未保存"),1)])])):B("",!0),Pe.value?B("",!0):(b(),x("div",Uu,[ve.value?Se.value?B("",!0):(b(),x("div",Hu,[r("button",{onClick:gt,disabled:D.value||F.value||G.value,class:"px-4 py-2 bg-blue-700 hover:bg-blue-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(F.value&&V.value==="login"?"登录中...":"登录主号 Codex"),9,Ku),r("button",{onClick:Rt,disabled:D.value||F.value||G.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(F.value&&V.value==="sync"?"同步中...":"同步主号 Codex 到已启用远端"),9,Wu),r("button",{onClick:Ge,disabled:D.value||F.value||G.value,class:"px-4 py-2 bg-amber-700 hover:bg-amber-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(G.value?"删除中...":"从已启用远端删除主号文件"),9,Gu),r("button",{onClick:Oe,disabled:D.value||F.value||G.value,class:"px-4 py-2 bg-rose-700/80 hover:bg-rose-700 text-white text-sm rounded-lg transition disabled:opacity-50"},y(D.value?"处理中...":"清除登录态"),9,qu)])):(b(),x("div",Lu,[r("div",Du,[ue(r("input",{"onUpdate:modelValue":T[1]||(T[1]=E=>u.value=E),type:"email",autocomplete:"username",placeholder:"输入主号邮箱",class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,u.value,void 0,{trim:!0}]]),r("button",{onClick:he,disabled:D.value||!u.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50"},y(D.value?"提交中...":"开始登录"),9,Nu)]),r("div",ju,[T[22]||(T[22]=Ft('
或手动导入 session_token

适合你已经在浏览器里拿到 __Secure-next-auth.session-token 的场景。系统会校验 token,并自动识别 workspace ID / 名称。

获取方式:
  1. 在浏览器中打开 chatgpt.com 并登录管理员账号
  2. 按 F12 打开开发者工具 → Application → Cookies → chatgpt.com
  3. 找到 __Secure-next-auth.session-token
  4. 如果有 .0.1 两个,将值按顺序拼接在一起
  5. 粘贴到下方输入框
',3)),r("div",Bu,[ue(r("input",{"onUpdate:modelValue":T[2]||(T[2]=E=>d.value=E),type:"email",autocomplete:"username",placeholder:"输入主号邮箱",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-cyan-500"},null,512),[[Ce,d.value,void 0,{trim:!0}]]),ue(r("textarea",{"onUpdate:modelValue":T[3]||(T[3]=E=>p.value=E),rows:"4",spellcheck:"false",placeholder:"粘贴完整 session_token",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white font-mono focus:outline-none focus:border-cyan-500"},null,512),[[Ce,p.value,void 0,{trim:!0}]]),r("div",Fu,[r("button",{onClick:ie,disabled:D.value||!d.value||!p.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(D.value?"校验中...":"导入 session_token"),9,Vu)])])])]))])),Pe.value?(b(),x("div",Yu,[r("div",Ju,[T[23]||(T[23]=_e(" 当前邮箱: ",-1)),r("span",zu,y(C.value||((k=s.adminStatus)==null?void 0:k.email)||"-"),1)]),((U=s.adminStatus)==null?void 0:U.login_step)==="password_required"?(b(),x("div",Xu,[ue(r("input",{"onUpdate:modelValue":T[4]||(T[4]=E=>c.value=E),type:"password",autocomplete:"current-password",placeholder:"输入主号密码",disabled:D.value,class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,Qu),[[Ce,c.value]]),r("button",{onClick:ae,disabled:D.value||!c.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50"},y(D.value?"提交中...":"提交密码"),9,Zu)])):((L=s.adminStatus)==null?void 0:L.login_step)==="code_required"?(b(),x("div",ed,[ue(r("input",{"onUpdate:modelValue":T[5]||(T[5]=E=>m.value=E),type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"输入邮箱验证码",disabled:D.value,class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,td),[[Ce,m.value,void 0,{trim:!0}]]),r("button",{onClick:Re,disabled:D.value||!m.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50 disabled:bg-gray-700 disabled:hover:bg-gray-700"},y(D.value?"提交中...":"提交验证码"),9,sd)])):((O=s.adminStatus)==null?void 0:O.login_step)==="workspace_required"?(b(),x("div",nd,[T[25]||(T[25]=r("div",{class:"text-sm text-gray-300"}," 请选择要进入的组织 / workspace ",-1)),ue(r("select",{"onUpdate:modelValue":T[6]||(T[6]=E=>v.value=E),disabled:D.value,class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},[T[24]||(T[24]=r("option",{disabled:"",value:""},"请选择组织",-1)),(b(!0),x(de,null,$e(((A=s.adminStatus)==null?void 0:A.workspace_options)||[],E=>(b(),x("option",{key:E.id,value:E.id},y(E.label)+y(E.kind==="fallback"?" (可能是个人/免费)":""),9,od))),128))],8,ld),[[Jt,v.value]]),r("button",{onClick:Ie,disabled:D.value||!v.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50 disabled:bg-gray-700 disabled:hover:bg-gray-700"},y(D.value?"提交中...":"确认组织选择"),9,rd)])):B("",!0),D.value&&W.value?(b(),x("div",ad,y(W.value),1)):B("",!0),r("div",id,[r("button",{onClick:ke,disabled:D.value,class:"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-sm text-gray-200 rounded-lg border border-gray-700 transition disabled:opacity-50"}," 取消登录 ",8,ud)])])):B("",!0),Se.value?(b(),x("div",dd,[r("div",cd," 主号 Codex"+y(J.value)+"继续中 ",1),((H=s.codexStatus)==null?void 0:H.step)==="password_required"?(b(),x("div",fd,[ue(r("input",{"onUpdate:modelValue":T[7]||(T[7]=E=>j.value=E),type:"password",autocomplete:"current-password",placeholder:"输入主号密码",disabled:F.value,class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,pd),[[Ce,j.value]]),r("button",{onClick:At,disabled:F.value||!j.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(F.value?"提交中...":"提交密码"),9,gd)])):((N=s.codexStatus)==null?void 0:N.step)==="code_required"?(b(),x("div",md,[ue(r("input",{"onUpdate:modelValue":T[8]||(T[8]=E=>I.value=E),type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"输入主号 Codex 验证码",disabled:F.value,class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,bd),[[Ce,I.value,void 0,{trim:!0}]]),r("button",{onClick:tt,disabled:F.value||!I.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(F.value?"提交中...":"提交验证码"),9,hd)])):B("",!0),F.value&&le.value?(b(),x("div",xd,y(le.value),1)):B("",!0),r("div",vd,[r("button",{onClick:st,disabled:F.value,class:"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-sm text-gray-200 rounded-lg border border-gray-700 transition disabled:opacity-50"}," 取消主号 Codex 登录 ",8,yd)])])):B("",!0)])):B("",!0),Ee.value?(b(),x("div",_d,[r("div",wd,[T[26]||(T[26]=r("h2",{class:"text-lg font-semibold text-white"},"巡检设置",-1)),a.value?(b(),x("span",Sd,"已保存")):B("",!0)]),r("div",kd,[r("div",null,[T[28]||(T[28]=r("label",{class:"block text-sm text-gray-400 mb-1"},"巡检间隔",-1)),r("div",Ad,[ue(r("input",{"onUpdate:modelValue":T[9]||(T[9]=E=>l.value.interval=E),type:"number",min:"1",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.interval,void 0,{number:!0}]]),T[27]||(T[27]=r("span",{class:"text-sm text-gray-500 shrink-0"},"分钟",-1))])]),r("div",null,[T[30]||(T[30]=r("label",{class:"block text-sm text-gray-400 mb-1"},"总 seat 数",-1)),r("div",Cd,[ue(r("input",{"onUpdate:modelValue":T[10]||(T[10]=E=>l.value.target_seats=E),type:"number",min:"1",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.target_seats,void 0,{number:!0}]]),T[29]||(T[29]=r("span",{class:"text-sm text-gray-500 shrink-0"},"个",-1))])]),r("div",null,[T[32]||(T[32]=r("label",{class:"block text-sm text-gray-400 mb-1"},"额度阈值",-1)),r("div",$d,[ue(r("input",{"onUpdate:modelValue":T[11]||(T[11]=E=>l.value.threshold=E),type:"number",min:"1",max:"100",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.threshold,void 0,{number:!0}]]),T[31]||(T[31]=r("span",{class:"text-sm text-gray-500 shrink-0"},"%",-1))])]),r("div",null,[T[34]||(T[34]=r("label",{class:"block text-sm text-gray-400 mb-1"},"触发账号数",-1)),r("div",Td,[ue(r("input",{"onUpdate:modelValue":T[12]||(T[12]=E=>l.value.min_low=E),type:"number",min:"1",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.min_low,void 0,{number:!0}]]),T[33]||(T[33]=r("span",{class:"text-sm text-gray-500 shrink-0"},"个",-1))])]),r("div",null,[T[36]||(T[36]=r("label",{class:"block text-sm text-gray-400 mb-1"},"手机号验证自动重试",-1)),ue(r("select",{"onUpdate:modelValue":T[13]||(T[13]=E=>l.value.retry_add_phone=E),class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},[...T[35]||(T[35]=[r("option",{value:!0},"开启",-1),r("option",{value:!1},"关闭",-1)])],512),[[Jt,l.value.retry_add_phone]])]),r("div",null,[T[38]||(T[38]=r("label",{class:"block text-sm text-gray-400 mb-1"},"手机号验证最大重试",-1)),r("div",Pd,[ue(r("input",{"onUpdate:modelValue":T[14]||(T[14]=E=>l.value.add_phone_max_retries=E),type:"number",min:"1",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.add_phone_max_retries,void 0,{number:!0}]]),T[37]||(T[37]=r("span",{class:"text-sm text-gray-500 shrink-0"},"次",-1))])])]),r("div",Id,[r("p",Ed,[_e(" 每 "+y(l.value.interval)+" 分钟检查一次,按 Team 总 seat "+y(l.value.target_seats)+" 个做自动轮转 / 补位判断; "+y(l.value.min_low)+" 个以上账号剩余低于 "+y(l.value.threshold)+"% 时自动轮转; ",1),l.value.target_seats===2?(b(),x("span",Od,"seat=2 时会对低额度子号启用 best-effort 预切换,若满员无法先加新号则自动回退到先移后补;")):B("",!0),_e(" add_phone "+y(l.value.retry_add_phone?`开启自动重试(最多 ${l.value.add_phone_max_retries} 次)`:"保持人工处理"),1)]),r("button",{onClick:Je,disabled:o.value,class:"px-4 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50"},y(o.value?"保存中...":"保存"),9,Rd)]),l.value.target_seats===2?(b(),x("div",Md,[...T[39]||(T[39]=[r("div",{class:"font-medium text-amber-100"},"注意事项",-1),r("div",{class:"mt-1"}," 为了尽量实现 2-seat 的无感切换,系统会优先尝试“先加账号、再踢旧账号”,因此短时间内可能出现额外占位, 导致下个月账单比预期多一些。若不希望这样,可将主号的 seat type 改成 codex,并保持这里的总 seat 数仍为 2。 ",-1)])])):B("",!0)])):B("",!0)])}}},Ud={class:"mt-6 space-y-6"},Ld={class:"glass-card p-4"},Dd={class:"flex flex-wrap gap-2"},Nd=["onClick"],jd={class:"text-base"},Bd={key:0,class:"glass-card p-6"},Fd={class:"mb-6 flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},Vd={class:"mb-2 inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-1 text-xs text-slate-300"},Hd={class:"section-heading"},Kd={class:"section-subtitle max-w-3xl"},Wd={key:0,class:"mt-2 text-xs text-slate-500"},Gd={class:"flex items-center gap-3"},qd={key:0,class:"status-badge border-emerald-400/20 bg-emerald-500/10 text-emerald-200"},Yd={key:1,class:"text-sm text-slate-400"},Jd={key:2,class:"space-y-5"},zd={class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Xd={class:"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},Qd={class:"status-badge text-xs text-slate-400"},Zd={class:"mt-4 flex flex-wrap gap-3"},ec={key:0,class:"rounded-2xl border border-dashed border-white/10 bg-white/5 px-4 py-5 text-sm text-slate-400"},tc={class:"mb-4 flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between"},sc={class:"flex flex-wrap items-center gap-2"},nc={class:"text-sm font-medium text-white"},lc={class:"status-badge text-[11px] text-slate-300"},oc={key:0,class:"status-badge border-emerald-400/20 bg-emerald-500/10 text-[11px] text-emerald-200"},rc={key:1,class:"status-badge border-amber-400/20 bg-amber-500/10 text-[11px] text-amber-200"},ac={class:"mt-1 text-xs leading-5 text-slate-400"},ic={class:"flex flex-wrap gap-2"},uc=["onClick"],dc=["onClick"],cc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},fc={class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},pc=["onUpdate:modelValue"],gc={class:"mb-2 block text-sm font-medium text-slate-300"},mc={key:0,class:"text-red-400"},bc={key:1,class:"mt-1 text-[11px] font-normal text-slate-500 break-all"},hc=["onUpdate:modelValue","type","placeholder"],xc={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},vc=["disabled"],yc={key:3,class:"space-y-5"},_c={class:"rounded-2xl border border-white/10 bg-white/5 p-5"},wc={class:"mb-4 flex items-center justify-between gap-4"},Sc={class:"status-badge text-xs text-slate-400"},kc={class:"grid grid-cols-1 gap-4 md:grid-cols-2"},Ac={class:"mb-2 block text-sm font-medium text-slate-300"},Cc=["onUpdate:modelValue"],$c={key:0,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Tc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Pc={class:"mb-2 block text-sm font-medium text-slate-300"},Ic={key:0,class:"text-red-400"},Ec=["onUpdate:modelValue","type","placeholder"],Oc={key:1,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Rc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Mc={class:"mb-2 block text-sm font-medium text-slate-300"},Uc={key:0,class:"text-red-400"},Lc={key:1,class:"mt-1 font-mono text-[11px] font-normal text-slate-500 break-all"},Dc=["onUpdate:modelValue","type","placeholder"],Nc={key:2,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},jc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Bc={class:"mb-2 block text-sm font-medium text-slate-300"},Fc={key:0,class:"text-red-400"},Vc={key:1,class:"mt-1 font-mono text-[11px] font-normal text-slate-500 break-all"},Hc=["onUpdate:modelValue"],Kc=["onUpdate:modelValue"],Wc=["onUpdate:modelValue","type","step","placeholder"],Gc={key:3,class:"rounded-2xl border border-white/10 bg-white/5 px-4 py-4 text-sm text-slate-400"},qc={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},Yc=["disabled"],Jc={key:4,class:"space-y-4"},zc={class:"rounded-2xl border border-white/10 bg-white/5 p-4"},Xc={class:"text-xs text-slate-400"},Qc={key:0,class:"mt-4 grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Zc={class:"mb-2 block text-sm font-medium text-slate-300"},ef={key:0,class:"text-red-400"},tf=["onUpdate:modelValue","type","placeholder"],sf={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},nf=["disabled"],lf={key:5,class:"space-y-4"},of={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},rf={class:"mb-2 block text-sm font-medium text-slate-300"},af={key:0,class:"text-red-400"},uf={key:1,class:"ml-1 text-xs text-slate-500"},df=["onUpdate:modelValue","type","placeholder"],cf={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},ff={class:"text-xs leading-6 text-slate-400"},pf=["disabled"],gf={key:3,class:"glass-card space-y-4 p-6"},mf={class:"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},bf={class:"status-badge break-all font-mono text-[11px] text-slate-400"},hf={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},xf={class:"flex gap-2"},vf=["disabled"],yf=["disabled"],_f={__name:"ConfigPage",props:{adminStatus:{type:Object,default:null},codexStatus:{type:Object,default:null}},emits:["refresh","admin-progress"],setup(e,{emit:t}){const s=t,n={cloudmail:["MAIL_PROVIDER","CLOUDMAIL_BASE_URL","CLOUDMAIL_EMAIL","CLOUDMAIL_PASSWORD","CLOUDMAIL_DOMAIN","CF_TEMP_EMAIL_BASE_URL","CF_TEMP_EMAIL_ADMIN_PASSWORD","CF_TEMP_EMAIL_DOMAIN"],sync:["SYNC_TARGET_CPA","SYNC_TARGET_SUB2API","CPA_URL","CPA_KEY","SUB2API_URL","SUB2API_EMAIL","SUB2API_PASSWORD","SUB2API_GROUP","SUB2API_CONCURRENCY","SUB2API_PRIORITY","SUB2API_RATE_MULTIPLIER","SUB2API_AUTO_PAUSE_ON_EXPIRED","SUB2API_MODEL_WHITELIST","SUB2API_OPENAI_WS_MODE","SUB2API_OPENAI_PASSTHROUGH","SUB2API_OVERWRITE_ACCOUNT_SETTINGS","SUB2API_PROXY"],proxy:["PLAYWRIGHT_PROXY_URL","PLAYWRIGHT_PROXY_BYPASS"],security:["API_KEY"]},l={cloudmail:{icon:"📧",badge:"Mail Services",title:"邮箱服务配置",description:"配置自动注册和收验证码所需的邮箱后端。现在支持同时维护多个 CloudMail / Cloudflare Temp Email 实例,并指定默认新建服务。",note:"已有账号会优先按账号自身保存的 mail_service_id 或唯一邮箱域名匹配服务;存在歧义时不会盲猜。",footer:"邮箱服务配置保存后会立即热加载;之后的新建、复用和验证码轮询都会按最新服务列表执行。"},sync:{icon:"☁️",badge:"Remote Sync",title:"远端同步",description:"先选择启用的远端同步目标,再填写对应的连接信息。账号池操作会根据这里的启用状态决定同步到哪些远端。",note:"支持同时启用 CPA 和 Sub2API;界面只显示当前已启用目标的详细配置。"},proxy:{icon:"🛰️",badge:"Proxy / Advanced",title:"代理 / 高级",description:"用于单独配置 Playwright 浏览器流量代理。属于低频项,默认折叠,避免把主配置界面堆得过满。",note:"只有在代理 ChatGPT / Auth 页面访问时才建议配置;本地回调场景通常还需要设置 bypass。"},security:{icon:"🔐",badge:"Security",title:"安全 / 访问控制",description:"入口级配置集中放在这里。API Key 决定 Web 面板和 HTTP API 的访问控制,不再和其他运行参数混在一起。",note:"留空会自动生成新的 API Key;保存后前端会立即切换到新的密钥。",footer:"这是控制面板和 API 的入口密钥。修改后会立即生效,并同步刷新当前浏览器里的 API Key。"}},o=[{key:"cloudmail",label:"邮箱服务",icon:"📧"},{key:"sync",label:"远端同步",icon:"☁️"},{key:"security",label:"安全 / 访问控制",icon:"🔐"},{key:"admin",label:"管理员 / 主号",icon:"👤"},{key:"auto-check",label:"巡检设置",icon:"🔄"},{key:"source",label:"源文件编辑",icon:"📝"},{key:"proxy",label:"代理 / 高级",icon:"🛰️"}],a=M("cloudmail"),u=M(!1),d=M([]),p=hs({}),c=M([]),m=M(""),v=M(!1),C=M(!1),j=M(!1),I=M(""),D=M(""),F=M(""),V=M(""),G=M(!1),P=M(!1),Z=M(!1),W=M(""),le=M(""),ve=new Set(["API_KEY"]),Pe={SUB2API_URL:"ENV: SUB2API_URL · Sub2API API base URL",SUB2API_EMAIL:"ENV: SUB2API_EMAIL · login.email",SUB2API_PASSWORD:"ENV: SUB2API_PASSWORD · login.password",SUB2API_GROUP:"ENV: SUB2API_GROUP · group_ids",SUB2API_PROXY:"ENV: SUB2API_PROXY · account.proxy_id(ID 或名称,仅账号池新建时写入)",SUB2API_CONCURRENCY:"ENV: SUB2API_CONCURRENCY · account.concurrency",SUB2API_PRIORITY:"ENV: SUB2API_PRIORITY · account.priority",SUB2API_RATE_MULTIPLIER:"ENV: SUB2API_RATE_MULTIPLIER · account.rate_multiplier",SUB2API_AUTO_PAUSE_ON_EXPIRED:"ENV: SUB2API_AUTO_PAUSE_ON_EXPIRED · account.auto_pause_on_expired",SUB2API_MODEL_WHITELIST:"ENV: SUB2API_MODEL_WHITELIST · credentials.model_mapping",SUB2API_OPENAI_WS_MODE:"ENV: SUB2API_OPENAI_WS_MODE · extra.openai_oauth_responses_websockets_v2_mode / enabled",SUB2API_OPENAI_PASSTHROUGH:"ENV: SUB2API_OPENAI_PASSTHROUGH · extra.openai_passthrough",SUB2API_OVERWRITE_ACCOUNT_SETTINGS:"ENV: SUB2API_OVERWRITE_ACCOUNT_SETTINGS · AutoTeam overwrite switch"},Se={cloudmail:[{key:"base_url",label:"CloudMail API 地址",required:!0,placeholder:"https://your-cloudmail.com/api"},{key:"email",label:"CloudMail 登录邮箱",required:!0,placeholder:"admin@example.com"},{key:"password",label:"CloudMail 登录密码",required:!0,inputType:"password"},{key:"domain",label:"CloudMail 邮箱域名",required:!0,placeholder:"example.com 或 @example.com",hint:"用于自动匹配已有账号所属邮箱服务"}],cloudflare_temp_email:[{key:"base_url",label:"Cloudflare Temp Email API 地址",required:!0,placeholder:"https://temp-email-api.example.com"},{key:"admin_password",label:"管理员密码",required:!0,inputType:"password"},{key:"domain",label:"邮箱域名",required:!0,placeholder:"mail.example.com",hint:"用于自动匹配已有账号所属邮箱服务"}]},J=se(()=>n[a.value]?a.value:""),X=se(()=>l[J.value]||null);function Ee(h){return d.value.find($=>$.key===h)||null}function ee(h){return Pe[h]||""}function De(h){return h.map($=>Ee($)).filter(Boolean)}const he=se(()=>De(n.security)),ie=se(()=>De(n.proxy)),ae=se(()=>De(["SYNC_TARGET_CPA","SYNC_TARGET_SUB2API"])),Re=se(()=>c.value.find(h=>h.id===m.value)||null),Ie=se(()=>String(p.SYNC_TARGET_CPA||"").toLowerCase()==="true"),ke=se(()=>String(p.SYNC_TARGET_SUB2API||"").toLowerCase()==="true"),Oe=se(()=>Ie.value?De(["CPA_URL","CPA_KEY"]):[]),gt=se(()=>ke.value?De(["SUB2API_URL","SUB2API_EMAIL","SUB2API_PASSWORD","SUB2API_GROUP"]):[]),Rt=se(()=>ke.value?De(["SUB2API_CONCURRENCY","SUB2API_PRIORITY","SUB2API_RATE_MULTIPLIER","SUB2API_AUTO_PAUSE_ON_EXPIRED","SUB2API_MODEL_WHITELIST","SUB2API_OPENAI_WS_MODE","SUB2API_OPENAI_PASSTHROUGH","SUB2API_OVERWRITE_ACCOUNT_SETTINGS","SUB2API_PROXY"]):[]),At=se(()=>J.value==="security"?he.value:[]),tt=se(()=>{const h=[];return Ie.value&&h.push("CPA"),ke.value&&h.push("Sub2API"),h.length?`已启用:${h.join(" + ")}`:"当前未启用远端"}),st=se(()=>{if(!J.value)return{label:"",class:"border-white/10 bg-white/5 text-slate-400"};if(J.value==="sync"){if(!Ie.value&&!ke.value)return{label:"未启用",class:"border-white/10 bg-white/5 text-slate-400"};const te=!Ie.value||Oe.value.every(Ne=>!oe(Ne)||Ne.configured),Ae=!ke.value||gt.value.every(Ne=>!oe(Ne)||Ne.configured);return te&&Ae?{label:"已配置",class:"border-emerald-400/20 bg-emerald-500/10 text-emerald-200"}:{label:"未配置",class:"border-red-400/20 bg-red-500/10 text-red-200"}}if(J.value==="proxy")return ie.value.some(te=>te.configured)?{label:"已设置",class:"border-emerald-400/20 bg-emerald-500/10 text-emerald-200"}:{label:"未设置",class:"border-white/10 bg-white/5 text-slate-400"};if(J.value==="cloudmail")return c.value.length?Re.value?c.value.some(te=>!A(te))?{label:"待补全",class:"border-amber-400/20 bg-amber-500/10 text-amber-200"}:{label:"已配置",class:"border-emerald-400/20 bg-emerald-500/10 text-emerald-200"}:{label:"未设默认",class:"border-amber-400/20 bg-amber-500/10 text-amber-200"}:{label:"未配置",class:"border-red-400/20 bg-red-500/10 text-red-200"};const h=At.value;return h.length>0&&h.every(te=>!oe(te)||te.configured)?{label:"已配置",class:"border-emerald-400/20 bg-emerald-500/10 text-emerald-200"}:{label:"未配置",class:"border-red-400/20 bg-red-500/10 text-red-200"}});function Ge(h,$="success"){I.value=h,D.value=$==="success"?"bg-green-500/10 text-green-400 border-green-500/20":"bg-red-500/10 text-red-400 border-red-500/20",window.clearTimeout(Ge._timer),Ge._timer=window.setTimeout(()=>{I.value=""},8e3)}function Je(h,$="success"){W.value=h,le.value=$==="success"?"bg-green-500/10 text-green-400 border-green-500/20":"bg-red-500/10 text-red-400 border-red-500/20",window.clearTimeout(Je._timer),Je._timer=window.setTimeout(()=>{W.value=""},8e3)}function w(h){return["SUB2API_CONCURRENCY","SUB2API_PRIORITY","SUB2API_RATE_MULTIPLIER"].includes(h)?"number":h.includes("PASSWORD")||h.includes("KEY")?"password":"text"}function T(h){return h==="SYNC_TARGET_CPA"||h==="SYNC_TARGET_SUB2API"}function i(h){return T(h)||["SUB2API_AUTO_PAUSE_ON_EXPIRED","SUB2API_OPENAI_PASSTHROUGH","SUB2API_OVERWRITE_ACCOUNT_SETTINGS"].includes(h)}function f(h){return h==="SUB2API_OPENAI_WS_MODE"}function g(h){if(h==="SUB2API_RATE_MULTIPLIER")return"0.001";if(h==="SUB2API_CONCURRENCY"||h==="SUB2API_PRIORITY")return"1"}function S(h="cloudmail"){const $=String(h||"").toLowerCase()==="cloudflare_temp_email"?"cloudflare_temp_email":"cloudmail",te=Math.random().toString(36).slice(2,8);return{id:`mailsvc-${Date.now().toString(36)}-${te}`,type:$,name:"",base_url:"",domain:"",email:"",password:"",admin_password:""}}function _(h){const $=S(h==null?void 0:h.type);return{...$,id:String((h==null?void 0:h.id)||$.id),name:String((h==null?void 0:h.name)||""),base_url:String((h==null?void 0:h.base_url)||""),domain:String((h==null?void 0:h.domain)||""),email:String((h==null?void 0:h.email)||""),password:String((h==null?void 0:h.password)||""),admin_password:String((h==null?void 0:h.admin_password)||"")}}function k(h){const $=_(h);return $.domain=$.domain.trim(),$.type==="cloudflare_temp_email"?(delete $.email,delete $.password):delete $.admin_password,$}function U(h){return h==="cloudflare_temp_email"?"Cloudflare Temp Email":"CloudMail"}function L(h){return h==="cloudflare_temp_email"?"填写管理端 API 地址、管理员密码和对应邮箱域名。":"填写 CloudMail API 地址、管理员账号密码和对应邮箱域名。"}function O(h){return Se[h==null?void 0:h.type]||Se.cloudmail}function A(h){return O(h).every($=>$.required?String((h==null?void 0:h[$.key])||"").trim()!=="":!0)}function H(h){const $=String((h==null?void 0:h.name)||"").trim();if($)return $;const te=U(h==null?void 0:h.type),Ae=String((h==null?void 0:h.domain)||"").trim();return Ae?`${te} (${Ae})`:te}function N(){var $;const h=new Set(c.value.map(te=>te.id));m.value&&h.has(m.value)||(m.value=(($=c.value[0])==null?void 0:$.id)||"")}function E(h){c.value=[...c.value,S(h)],N()}function q(h){c.value=c.value.filter($=>$.id!==h),N()}function re(h){m.value=h}function oe(h){return!!(h!=null&&h.runtime_required)||ve.has(h==null?void 0:h.key)}function ge(h){const $=(h==null?void 0:h.value)??(h==null?void 0:h.default)??"";if(i(h==null?void 0:h.key))return String($).toLowerCase()==="true"?"true":"false";if(f(h==null?void 0:h.key)){const te=String($||"").toLowerCase();return["off","ctx_pool","passthrough"].includes(te)?te:"off"}return $}async function ye(){v.value=!0;try{const h=await z.getRuntimeConfig();d.value=h.fields||[],c.value=Array.isArray(h.mail_services)?h.mail_services.map($=>_($)):[],m.value=String(h.mail_service_default||""),N();for(const $ of Object.keys(p))d.value.find(te=>te.key===$)||delete p[$];for(const $ of d.value)p[$.key]=ge($)}catch(h){console.error("加载运行时配置失败:",h),Ge("加载运行时配置失败: "+h.message,"error")}finally{v.value=!1}}async function we(){var h;C.value=!0,j.value=!1;try{const $={};for(const Xe of d.value){const es=p[Xe.key];$[Xe.key]=es==null?"":String(es)}const te=c.value.map(Xe=>k(Xe)),Ae=te.some(Xe=>Xe.id===m.value)?m.value:((h=te[0])==null?void 0:h.id)||"";$.mail_services=te,$.mail_service_default=Ae;const Ne=await z.saveRuntimeConfig($);Ne.api_key&&Us(Ne.api_key),Ge(Ne.message||"配置保存成功"),j.value=!0,window.setTimeout(()=>{j.value=!1},3e3),await ye(),s("refresh")}catch($){Ge($.message,"error")}finally{C.value=!1}}async function He(){G.value=!0;try{const h=await z.getRuntimeConfigSource();F.value=h.path||".env",V.value=h.content||"",Z.value=!0}catch(h){console.error("加载源文件失败:",h),Je("加载源文件失败: "+h.message,"error")}finally{G.value=!1}}async function ze(){P.value=!0;try{const h=await z.saveRuntimeConfigSource({content:V.value});h.api_key&&Us(h.api_key),Je(h.message||"源文件保存成功"),await Promise.all([He(),ye()]),s("refresh")}catch(h){Je(h.message,"error")}finally{P.value=!1}}return $t(a,async h=>{h==="source"&&!Z.value&&await He()}),Vt(async()=>{await ye()}),(h,$)=>{var te,Ae,Ne,Xe,es,Un;return b(),x("div",Ud,[$[23]||($[23]=Ft('
AutoTeam Configuration Center

配置面板

按邮箱服务、远端同步、安全、管理员、巡检、源文件编辑和代理拆成独立分区,避免把所有运行配置堆在一个页面里。

高频配置前置,低频配置后置;代理等高级项默认折叠,源文件编辑仍然保留。
🧩
独立配置分区
邮箱服务、同步、安全等高频项前置,低频代理项后置,不再混在一张表单里。
☁️
动态同步配置
可增删多个邮箱服务 / 启用远端目标,再按状态展示对应配置。
📝
源文件编辑保留
可视化配置之外,仍可直接维护完整 .env 源文件。
',1)),r("div",Ld,[r("div",Dd,[(b(),x(de,null,$e(o,R=>r("button",{key:R.key,onClick:ce=>a.value=R.key,class:Q(["pill-tab flex items-center gap-2",a.value===R.key?"pill-tab-active":""])},[r("span",jd,y(R.icon),1),_e(" "+y(R.label),1)],10,Nd)),64))])]),J.value?(b(),x("div",Bd,[r("div",Fd,[r("div",null,[r("div",Vd,[r("span",null,y((te=X.value)==null?void 0:te.icon),1),_e(" "+y((Ae=X.value)==null?void 0:Ae.badge),1)]),r("h3",Hd,y((Ne=X.value)==null?void 0:Ne.title),1),r("p",Kd,y((Xe=X.value)==null?void 0:Xe.description),1),(es=X.value)!=null&&es.note?(b(),x("p",Wd,y(X.value.note),1)):B("",!0)]),r("div",Gd,[j.value?(b(),x("span",qd," 已保存 ")):B("",!0),r("span",{class:Q(["status-badge min-w-[84px] justify-center",st.value.class])},y(st.value.label),3)])]),I.value?(b(),x("div",{key:0,class:Q(["mb-4 rounded-2xl px-4 py-3 text-sm border",D.value])},y(I.value),3)):B("",!0),v.value?(b(),x("div",Yd," 正在加载当前配置... ")):J.value==="cloudmail"?(b(),x("div",Jd,[r("div",zd,[r("div",Xd,[$[8]||($[8]=r("div",null,[r("div",{class:"text-sm font-medium text-white"},"邮箱服务列表"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 可以同时添加多个 CloudMail / Cloudflare Temp Email 实例;默认服务用于新建账号,已有账号会优先复用自身绑定或唯一域名匹配到的服务。 ")],-1)),r("div",Qd,y(Re.value?`默认:${H(Re.value)}`:"未设置默认服务"),1)]),r("div",Zd,[r("button",{class:"btn-secondary",onClick:$[0]||($[0]=R=>E("cloudmail"))}," + 添加 CloudMail "),r("button",{class:"btn-secondary",onClick:$[1]||($[1]=R=>E("cloudflare_temp_email"))}," + 添加 Cloudflare Temp Email ")])]),c.value.length?B("",!0):(b(),x("div",ec," 还没有配置任何邮箱服务。先添加一个服务,再设置为默认服务。 ")),(b(!0),x(de,null,$e(c.value,R=>(b(),x("div",{key:R.id,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},[r("div",tc,[r("div",null,[r("div",sc,[r("div",nc,y(H(R)),1),r("span",lc,y(U(R.type)),1),m.value===R.id?(b(),x("span",oc," 默认新建服务 ")):B("",!0),A(R)?B("",!0):(b(),x("span",rc," 待补全 "))]),r("div",ac,y(L(R.type)),1)]),r("div",ic,[m.value!==R.id?(b(),x("button",{key:0,class:"btn-secondary",onClick:ce=>re(R.id)}," 设为默认 ",8,uc)):B("",!0),r("button",{class:"btn-secondary border-red-500/30 text-red-300 hover:border-red-400/40 hover:text-red-200",onClick:ce=>q(R.id)}," 删除 ",8,dc)])]),r("div",cc,[r("div",fc,[$[9]||($[9]=r("label",{class:"mb-2 block text-sm font-medium text-slate-300"},[_e(" 服务名称 "),r("span",{class:"ml-1 text-xs font-normal text-slate-500"},"(可选)")],-1)),ue(r("input",{"onUpdate:modelValue":ce=>R.name=ce,type:"text",placeholder:"例如:CloudMail #1",class:"input-dark"},null,8,pc),[[Ce,R.name]])]),(b(!0),x(de,null,$e(O(R),ce=>(b(),x("div",{key:`${R.id}-${ce.key}`,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",gc,[_e(y(ce.label)+" ",1),ce.required?(b(),x("span",mc,"*")):B("",!0),ce.hint?(b(),x("div",bc,y(ce.hint),1)):B("",!0)]),ue(r("input",{"onUpdate:modelValue":Io=>R[ce.key]=Io,type:ce.inputType||"text",placeholder:ce.placeholder||"",class:"input-dark"},null,8,hc),[[Nt,R[ce.key]]])]))),128))])]))),128)),r("div",xc,[$[10]||($[10]=r("p",{class:"text-xs leading-6 text-slate-400"}," 保存后会立即热加载。新建账号会使用默认服务;已有账号会优先按 `mail_service_id` 或唯一邮箱域名匹配对应服务。 ",-1)),r("button",{onClick:we,disabled:C.value||v.value,class:"btn-primary"},y(C.value?"保存中...":"保存配置"),9,vc)])])):J.value==="sync"?(b(),x("div",yc,[r("div",_c,[r("div",wc,[$[11]||($[11]=r("div",null,[r("div",{class:"text-sm font-medium text-white"},"同步目标开关"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 可同时启用多个远端。界面只展示当前已启用目标的详细配置。 ")],-1)),r("div",Sc,y(tt.value),1)]),r("div",kc,[(b(!0),x(de,null,$e(ae.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Ac,y(R.prompt),1),ue(r("select",{"onUpdate:modelValue":ce=>p[R.key]=ce,class:"input-dark"},[...$[12]||($[12]=[r("option",{value:"true"},"启用",-1),r("option",{value:"false"},"关闭",-1)])],8,Cc),[[Jt,p[R.key]]])]))),128))])]),Ie.value?(b(),x("div",$c,[$[13]||($[13]=r("div",{class:"mb-4"},[r("div",{class:"text-sm font-medium text-white"},"CPA"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 为已启用的 CPA 远端填写连接地址和管理密钥。 ")],-1)),r("div",Tc,[(b(!0),x(de,null,$e(Oe.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Pc,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",Ic,"*")):B("",!0)]),ue(r("input",{"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),placeholder:R.default||"",class:"input-dark"},null,8,Ec),[[Nt,p[R.key]]])]))),128))])])):B("",!0),ke.value?(b(),x("div",Oc,[$[14]||($[14]=r("div",{class:"mb-4"},[r("div",{class:"text-sm font-medium text-white"},"Sub2API"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 为已启用的 Sub2API 远端填写地址、管理员邮箱、密码和可选分组。 ")],-1)),r("div",Rc,[(b(!0),x(de,null,$e(gt.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Mc,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",Uc,"*")):B("",!0),ee(R.key)?(b(),x("div",Lc,y(ee(R.key)),1)):B("",!0)]),ue(r("input",{"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),placeholder:R.default||"",class:"input-dark"},null,8,Dc),[[Nt,p[R.key]]])]))),128))])])):B("",!0),ke.value?(b(),x("div",Nc,[$[17]||($[17]=r("div",{class:"mb-4"},[r("div",{class:"text-sm font-medium text-white"},"Sub2API 默认账号设置"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 新创建的 Sub2API 账号会自动带上这些默认参数和可选代理绑定;已存在账号默认不覆盖,只有开启“覆盖账号设置”后才会在每次同步时强制统一(代理绑定仍只在新建账号时写入)。 ")],-1)),r("div",jc,[(b(!0),x(de,null,$e(Rt.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Bc,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",Fc,"*")):B("",!0),ee(R.key)?(b(),x("div",Vc,y(ee(R.key)),1)):B("",!0)]),i(R.key)?ue((b(),x("select",{key:0,"onUpdate:modelValue":ce=>p[R.key]=ce,class:"input-dark"},[...$[15]||($[15]=[r("option",{value:"true"},"true",-1),r("option",{value:"false"},"false",-1)])],8,Hc)),[[Jt,p[R.key]]]):f(R.key)?ue((b(),x("select",{key:1,"onUpdate:modelValue":ce=>p[R.key]=ce,class:"input-dark"},[...$[16]||($[16]=[r("option",{value:"off"},"off",-1),r("option",{value:"ctx_pool"},"ctx_pool",-1),r("option",{value:"passthrough"},"passthrough",-1)])],8,Kc)),[[Jt,p[R.key]]]):ue((b(),x("input",{key:2,"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),step:g(R.key),placeholder:R.default||"",class:"input-dark"},null,8,Wc)),[[Nt,p[R.key]]])]))),128))])])):B("",!0),!Ie.value&&!ke.value?(b(),x("div",Gc," 当前还没有启用任何远端同步目标。先打开上面的开关,再填写对应远端配置。 ")):B("",!0),r("div",qc,[$[18]||($[18]=r("p",{class:"text-xs leading-6 text-slate-400"}," 保存后会立即热加载;账号池操作会根据当前已启用远端决定后续同步行为。 ",-1)),r("button",{onClick:we,disabled:C.value||v.value,class:"btn-primary"},y(C.value?"保存中...":"保存配置"),9,Yc)])])):J.value==="proxy"?(b(),x("div",Jc,[r("div",zc,[r("button",{onClick:$[2]||($[2]=R=>u.value=!u.value),class:"flex w-full items-center justify-between gap-4 text-left"},[$[19]||($[19]=r("div",null,[r("div",{class:"text-sm font-medium text-white"},"高级代理设置"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 低频配置,默认折叠。只有浏览器流量需要单独代理时才建议填写。 ")],-1)),r("span",Xc,y(u.value?"收起":"展开"),1)]),u.value?(b(),x("div",Qc,[(b(!0),x(de,null,$e(ie.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Zc,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",ef,"*")):B("",!0)]),ue(r("input",{"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),placeholder:R.default||"",class:"input-dark"},null,8,tf),[[Nt,p[R.key]]])]))),128))])):B("",!0)]),r("div",sf,[$[20]||($[20]=r("p",{class:"text-xs leading-6 text-slate-400"}," 推荐只在确实需要代理 Playwright 浏览器流量时启用,并配合绕过列表避免本地回调误走代理。 ",-1)),r("button",{onClick:we,disabled:C.value||v.value,class:"btn-primary"},y(C.value?"保存中...":"保存配置"),9,nf)])])):(b(),x("div",lf,[r("div",of,[(b(!0),x(de,null,$e(At.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-white/5 p-4"},[r("label",rf,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",af,"*")):B("",!0),R.key==="API_KEY"?(b(),x("span",uf,"(留空自动生成)")):B("",!0)]),ue(r("input",{"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),placeholder:R.default||"",class:"input-dark"},null,8,df),[[Nt,p[R.key]]])]))),128))]),r("div",cf,[r("p",ff,y((Un=X.value)==null?void 0:Un.footer),1),r("button",{onClick:we,disabled:C.value||v.value,class:"btn-primary"},y(C.value?"保存中...":"保存配置"),9,pf)])]))])):a.value==="admin"?(b(),qe(bl,{key:1,"admin-status":e.adminStatus,"codex-status":e.codexStatus,section:"admin",onRefresh:$[3]||($[3]=R=>h.$emit("refresh")),onAdminProgress:$[4]||($[4]=R=>h.$emit("admin-progress"))},null,8,["admin-status","codex-status"])):a.value==="auto-check"?(b(),qe(bl,{key:2,"admin-status":e.adminStatus,"codex-status":e.codexStatus,section:"auto-check",onRefresh:$[5]||($[5]=R=>h.$emit("refresh")),onAdminProgress:$[6]||($[6]=R=>h.$emit("admin-progress"))},null,8,["admin-status","codex-status"])):a.value==="source"?(b(),x("div",gf,[r("div",mf,[$[21]||($[21]=r("div",null,[r("div",{class:"mb-2 inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-1 text-xs text-slate-300"},[r("span",null,"📝"),_e(" Source Editor ")]),r("h3",{class:"section-heading"},"源文件编辑"),r("p",{class:"section-subtitle"}," 直接编辑 .env 源文件。保存后会立即重载并校验邮箱服务 / 远端同步配置。 ")],-1)),r("div",bf,y(F.value||".env"),1)]),W.value?(b(),x("div",{key:0,class:Q(["rounded-2xl px-4 py-3 text-sm border",le.value])},y(W.value),3)):B("",!0),ue(r("textarea",{"onUpdate:modelValue":$[7]||($[7]=R=>V.value=R),rows:"20",spellcheck:"false",class:"textarea-dark min-h-[420px] font-mono",placeholder:"在这里编辑 .env 内容"},null,512),[[Ce,V.value]]),r("div",hf,[$[22]||($[22]=r("p",{class:"text-xs leading-6 text-slate-400"}," 这里是原始文本模式,适合你直接粘贴或手工维护完整 .env。 ",-1)),r("div",xf,[r("button",{onClick:He,disabled:G.value||P.value,class:"btn-secondary"},y(G.value?"加载中...":"重新读取"),9,vf),r("button",{onClick:ze,disabled:G.value||P.value,class:"btn-primary"},y(P.value?"保存中...":"保存源文件"),9,yf)])])])):B("",!0)])}}},wf={class:"flex items-center justify-between mb-6"},Sf=["disabled"],kf={key:0,class:"mb-4 px-4 py-3 rounded-lg text-sm bg-red-500/10 text-red-400 border border-red-500/20"},Af={key:1,class:"space-y-4"},Cf={class:"flex gap-4 text-sm"},$f={class:"px-3 py-1.5 bg-gray-800 rounded-lg text-gray-300"},Tf={class:"text-white font-medium"},Pf={key:0,class:"px-3 py-1.5 bg-gray-800 rounded-lg text-gray-300"},If={class:"text-yellow-400 font-medium"},Ef={class:"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},Of={class:"overflow-x-auto"},Rf={class:"w-full text-sm"},Mf={class:"px-4 py-3 text-gray-500"},Uf={class:"px-4 py-3 font-mono text-xs text-slate-200"},Lf={class:"px-4 py-3"},Df={class:"px-4 py-3"},Nf={class:"px-4 py-3"},jf={class:"px-4 py-3 text-right"},Bf=["onClick","disabled"],Ff={key:2,class:"bg-gray-900 border border-gray-800 rounded-xl h-64 animate-pulse"},Vf={key:3,class:"text-center text-gray-500 py-12"},ln="autoteam_team_members",Hf={__name:"TeamMembers",setup(e){const t=M(null),s=M(!1),n=M(""),l=M("");function o(){try{const c=localStorage.getItem(ln);if(c){const m=JSON.parse(c);if(m.time&&Date.now()-m.time<6e5)return m.data}}catch{}return null}function a(c){try{localStorage.setItem(ln,JSON.stringify({data:c,time:Date.now()}))}catch{}}function u(c){return`${c.type}:${c.user_id}:${c.email}`}async function d(){s.value=!0,n.value="";try{t.value=await z.getTeamMembers(),a(t.value)}catch(c){n.value=c.message}finally{s.value=!1}}async function p(c){const m=c.type==="invite"?"取消邀请":"移出 Team";if(window.confirm(`确认${m} ${c.email}?`)){l.value=u(c),n.value="";try{await z.removeTeamMember({email:c.email,user_id:c.user_id,type:c.type});try{localStorage.removeItem(ln)}catch{}await d()}catch(C){n.value=C.message}finally{l.value=""}}}return Vt(()=>{const c=o();c?t.value=c:d()}),(c,m)=>(b(),x("div",null,[r("div",wf,[m[0]||(m[0]=r("h2",{class:"text-xl font-bold text-white"},"Team 成员",-1)),r("button",{onClick:d,disabled:s.value,class:"px-3 py-1.5 bg-gray-800 hover:bg-gray-700 text-sm rounded-lg border border-gray-700 transition disabled:opacity-50 text-gray-300 hover:text-white"},y(s.value?"加载中...":"刷新"),9,Sf)]),n.value?(b(),x("div",kf,y(n.value),1)):B("",!0),t.value?(b(),x("div",Af,[r("div",Cf,[r("span",$f,[m[1]||(m[1]=_e("成员: ",-1)),r("span",Tf,y(t.value.total),1)]),t.value.invites>0?(b(),x("span",Pf,[m[2]||(m[2]=_e("待接受邀请: ",-1)),r("span",If,y(t.value.invites),1)])):B("",!0)]),r("div",Ef,[r("div",Of,[r("table",Rf,[m[3]||(m[3]=r("thead",null,[r("tr",{class:"text-gray-400 text-left border-b border-gray-800"},[r("th",{class:"px-4 py-3 font-medium"},"#"),r("th",{class:"px-4 py-3 font-medium"},"邮箱"),r("th",{class:"px-4 py-3 font-medium"},"角色"),r("th",{class:"px-4 py-3 font-medium"},"类型"),r("th",{class:"px-4 py-3 font-medium"},"来源"),r("th",{class:"px-4 py-3 font-medium text-right"},"操作")])],-1)),r("tbody",null,[(b(!0),x(de,null,$e(t.value.members,(v,C)=>(b(),x("tr",{key:v.email+v.type,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",Mf,y(C+1),1),r("td",Uf,y(v.email),1),r("td",Lf,[r("span",{class:Q(["px-2 py-0.5 rounded text-xs font-medium",{"bg-purple-500/10 text-purple-400":v.role==="account-owner","bg-blue-500/10 text-blue-400":v.role==="account-admin","bg-gray-500/10 text-gray-300":v.role!=="account-owner"&&v.role!=="account-admin"}])},y(v.role||"member"),3)]),r("td",Df,[r("span",{class:Q(["px-2 py-0.5 rounded text-xs font-medium",v.type==="invite"?"bg-yellow-500/10 text-yellow-400":"bg-green-500/10 text-green-400"])},y(v.type==="invite"?"待接受":"已加入"),3)]),r("td",Nf,[r("span",{class:Q(["text-xs",v.is_local?"text-blue-400":"text-gray-500"])},y(v.is_local?"本地管理":"外部"),3)]),r("td",jf,[v.role!=="account-owner"?(b(),x("button",{key:0,onClick:j=>p(v),disabled:l.value===u(v),class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",l.value===u(v)?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-rose-600/10 text-rose-400 border-rose-500/30 hover:bg-rose-600/20"])},y(l.value===u(v)?"处理中...":"移出"),11,Bf)):B("",!0)])]))),128))])])])])])):s.value?(b(),x("div",Ff)):(b(),x("div",Vf," 点击「刷新」加载 Team 成员列表 "))]))}},Kf={class:"mt-6 bg-gray-900 border border-gray-800 rounded-xl p-4"},Wf={class:"text-lg font-semibold text-white mb-4"},Gf={key:0,class:"mb-4 px-4 py-3 rounded-lg text-sm border bg-amber-500/10 text-amber-300 border-amber-500/20"},qf={class:"flex flex-wrap gap-3"},Yf=["onClick","disabled"],Jf={key:1,class:"mt-4 flex items-center gap-3"},zf={class:"text-sm text-gray-400"},Xf=["disabled"],Ao={__name:"TaskPanel",props:{runningTask:Object,adminStatus:{type:Object,default:null},mode:{type:String,default:"all"}},emits:["task-started","refresh"],setup(e,{emit:t}){const s=e,n=t,l=[{key:"rotate",group:"pool",label:"智能轮转",method:"startRotate",needParam:!0,paramName:"target",style:"bg-blue-600 text-white border-blue-500"},{key:"check",group:"pool",label:"检查额度",method:"startCheck",needParam:!1,style:"bg-emerald-600 text-white border-emerald-500"},{key:"fill",group:"pool",label:"补满成员",method:"startFill",needParam:!0,paramName:"target",style:"bg-violet-600 text-white border-violet-500"},{key:"add",group:"pool",label:"添加账号",method:"startAdd",needParam:!1,style:"bg-amber-600 text-white border-amber-500"},{key:"cleanup",group:"pool",label:"清理成员",method:"startCleanup",needParam:!1,style:"bg-rose-600 text-white border-rose-500"},{key:"sync",group:"sync",label:"同步远端",method:"postSync",needParam:!1,sync:!0,allowWithoutAdmin:!0,style:"bg-cyan-600 text-white border-cyan-500"},{key:"pull-cpa",group:"sync",label:"拉取 CPA",method:"postSyncFromCpa",needParam:!1,sync:!0,allowWithoutAdmin:!0,style:"bg-emerald-600 text-white border-emerald-500"},{key:"sync-accounts",group:"sync",label:"同步账号",method:"postSyncAccounts",needParam:!1,sync:!0,allowWithoutAdmin:!0,style:"bg-sky-600 text-white border-sky-500"}],o=M(!1),a=M(""),u=M(5),d=M(null),p=M(""),c=M(""),m=se(()=>{var P;return!!((P=s.adminStatus)!=null&&P.configured)}),v=se(()=>s.mode==="all"?l:l.filter(P=>P.group===s.mode)),C=se(()=>s.mode==="pool"?"账号池操作":s.mode==="sync"?"同步操作":"操作"),j=se(()=>s.mode==="sync"?"同步类操作可独立使用:同步账号、同步已启用远端、拉取 CPA。":"请先在「配置面板」页完成管理员登录后,轮转/补满/清理等账号池操作才会开放。"),I=se(()=>!m.value&&(s.mode==="pool"||s.mode==="sync"));function D(P){return!!(s.runningTask||!m.value&&!P.allowWithoutAdmin)}async function F(P){if(!D(P)){if(p.value="",P.needParam){d.value=P,a.value=P.paramName==="target"?"目标成员数":"最大席位",u.value=5,o.value=!0;return}await G(P)}}async function V(){o.value=!1,d.value&&(await G(d.value,u.value),d.value=null)}async function G(P,Z){try{if(P.sync){const W=await z[P.method]();p.value=W.message||"操作完成",c.value="bg-green-500/10 text-green-400 border border-green-500/20",n("refresh")}else{const W=await z[P.method](Z);p.value=`任务已提交: ${W.task_id}`,c.value="bg-blue-500/10 text-blue-400 border border-blue-500/20",n("task-started")}}catch(W){p.value=W.message,c.value="bg-red-500/10 text-red-400 border border-red-500/20"}setTimeout(()=>{p.value=""},8e3)}return(P,Z)=>(b(),x("div",Kf,[r("h2",Wf,y(C.value),1),I.value?(b(),x("div",Gf,y(j.value),1)):B("",!0),r("div",qf,[(b(!0),x(de,null,$e(v.value,W=>(b(),x("button",{key:W.key,onClick:le=>F(W),disabled:D(W),class:Q(["px-4 py-2 rounded-lg text-sm font-medium transition border",D(W)?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":`${W.style} hover:opacity-80`])},y(W.label),11,Yf))),128))]),o.value?(b(),x("div",Jf,[r("label",zf,y(a.value)+":",1),ue(r("input",{"onUpdate:modelValue":Z[0]||(Z[0]=W=>u.value=W),type:"number",min:"1",max:"20",class:"w-20 px-3 py-1.5 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,u.value,void 0,{number:!0}]]),r("button",{onClick:V,disabled:d.value&&D(d.value),class:"px-4 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition"}," 确认执行 ",8,Xf),r("button",{onClick:Z[1]||(Z[1]=W=>o.value=!1),class:"px-3 py-1.5 text-gray-400 hover:text-white text-sm transition"}," 取消 ")])):B("",!0),p.value?(b(),x("div",{key:2,class:Q(["mt-4 px-4 py-3 rounded-lg text-sm",c.value])},y(p.value),3)):B("",!0)]))}},Qf={__name:"PoolPage",props:{runningTask:Object,adminStatus:Object},emits:["task-started","refresh"],setup(e){return(t,s)=>(b(),x("div",null,[s[2]||(s[2]=r("h2",{class:"text-xl font-bold text-white mb-2"},"账号池操作",-1)),s[3]||(s[3]=r("p",{class:"text-sm text-gray-400 mb-6"}," 这里集中放轮转、检查、补满、添加、清理等会直接影响账号池状态的操作。 ",-1)),Ve(Ao,{mode:"pool","running-task":e.runningTask,"admin-status":e.adminStatus,onTaskStarted:s[0]||(s[0]=n=>t.$emit("task-started")),onRefresh:s[1]||(s[1]=n=>t.$emit("refresh"))},null,8,["running-task","admin-status"])]))}},Zf={__name:"SyncPage",props:{runningTask:Object,adminStatus:Object},emits:["task-started","refresh"],setup(e){return(t,s)=>(b(),x("div",null,[s[2]||(s[2]=r("h2",{class:"text-xl font-bold text-white mb-2"},"同步中心",-1)),s[3]||(s[3]=r("p",{class:"text-sm text-gray-400 mb-6"}," 这里放对账与同步类操作:本地账号池对账、同步到已启用远端,以及从 CPA 反向拉取认证文件。 ",-1)),Ve(Ao,{mode:"sync","running-task":e.runningTask,"admin-status":e.adminStatus,onTaskStarted:s[0]||(s[0]=n=>t.$emit("task-started")),onRefresh:s[1]||(s[1]=n=>t.$emit("refresh"))},null,8,["running-task","admin-status"])]))}},e0={class:"mt-6 bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},t0={key:0,class:"px-4 py-8 text-center text-gray-500 text-sm"},s0={key:1,class:"overflow-x-auto"},n0={class:"w-full text-sm"},l0={class:"px-4 py-3 font-mono text-xs text-gray-400"},o0={class:"px-4 py-3"},r0={class:"px-2 py-0.5 bg-gray-800 rounded text-xs font-medium text-gray-300"},a0={class:"px-4 py-3 text-xs text-gray-400"},i0={class:"px-4 py-3"},u0={key:0,class:"animate-spin inline-block w-3 h-3 border-2 border-current border-t-transparent rounded-full"},d0={class:"px-4 py-3 text-xs text-gray-400"},c0={class:"px-4 py-3 text-xs text-gray-400"},f0={__name:"TaskHistory",props:{tasks:{type:Array,default:()=>[]}},setup(e){const t=M(""),s=M("");function n(d){return{pending:"text-gray-400",running:"text-yellow-400",cancelling:"text-amber-300",completed:"text-green-400",failed:"text-red-400",cancelled:"text-slate-400"}[d]||"text-gray-400"}function l(d){return{pending:"bg-gray-400",completed:"bg-green-400",failed:"bg-red-400",cancelled:"bg-slate-500"}[d]||"bg-gray-400"}function o(d){return{pending:"等待中",running:"执行中",cancelling:"终止中",completed:"已完成",failed:"失败",cancelled:"已终止"}[d]||d}function a(d){return d==="pending"||d==="running"||d==="cancelling"}function u(d){if(!d)return"-";const p=new Date(d*1e3);return`${String(p.getMonth()+1).padStart(2,"0")}-${String(p.getDate()).padStart(2,"0")} ${String(p.getHours()).padStart(2,"0")}:${String(p.getMinutes()).padStart(2,"0")}:${String(p.getSeconds()).padStart(2,"0")}`}function d(p){const c=p.started_at||p.created_at,m=p.finished_at||(p.status==="running"||p.status==="cancelling"?Date.now()/1e3:null);if(!c||!m)return"-";const v=Math.round(m-c);return v<60?`${v}s`:`${Math.floor(v/60)}m ${v%60}s`}function p(c){return!c||Object.keys(c).length===0?"-":Object.entries(c).map(([m,v])=>`${m}=${v}`).join(", ")}function c(m){return m==null?"-":typeof m=="string"?m:JSON.stringify(m)}async function m(v){if(!v||!a(v.status)||t.value)return;t.value=v.task_id,s.value="",v.status!=="cancelling"&&(v.status="cancelling",v.cancel_requested=!0,v.error="任务终止中");try{await z.cancelTask(v.task_id)}catch(C){s.value=C.message||"终止任务失败"}finally{t.value=""}}return(v,C)=>(b(),x("div",e0,[C[1]||(C[1]=r("div",{class:"px-4 py-3 border-b border-gray-800"},[r("h2",{class:"text-lg font-semibold text-white"},"任务历史")],-1)),s.value?(b(),x("div",{key:0,class:"mx-4 mt-4 rounded-lg border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-300"},y(s.value),1)):B("",!0),e.tasks.length===0?(b(),x("div",t0," 暂无任务记录 ")):(b(),x("div",s0,[r("table",n0,[C[0]||(C[0]=r("thead",null,[r("tr",{class:"text-gray-400 text-left border-b border-gray-800"},[r("th",{class:"px-4 py-3 font-medium"},"任务 ID"),r("th",{class:"px-4 py-3 font-medium"},"命令"),r("th",{class:"px-4 py-3 font-medium"},"参数"),r("th",{class:"px-4 py-3 font-medium"},"状态"),r("th",{class:"px-4 py-3 font-medium"},"创建时间"),r("th",{class:"px-4 py-3 font-medium"},"耗时"),r("th",{class:"px-4 py-3 font-medium"},"结果"),r("th",{class:"px-4 py-3 font-medium text-right"},"操作")])],-1)),r("tbody",null,[(b(!0),x(de,null,$e(e.tasks,v=>(b(),x("tr",{key:v.task_id,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",l0,y(v.task_id),1),r("td",o0,[r("span",r0,y(v.command),1)]),r("td",a0,y(p(v.params)),1),r("td",i0,[r("span",{class:Q(["inline-flex items-center gap-1.5 text-xs font-medium",n(v.status)])},[v.status==="running"||v.status==="cancelling"?(b(),x("span",u0)):(b(),x("span",{key:1,class:Q(["w-1.5 h-1.5 rounded-full",l(v.status)])},null,2)),_e(" "+y(o(v.status)),1)],2)]),r("td",d0,y(u(v.created_at)),1),r("td",c0,y(d(v)),1),r("td",{class:Q(["px-4 py-3 text-xs max-w-xs truncate",v.error&&v.status!=="cancelled"?"text-red-400":"text-gray-400"])},y(v.error||c(v.result)),3),r("td",{class:"px-4 py-3 text-right"},[a(v.status)?(b(),x("button",{key:0,onClick:g=>m(v),disabled:!!t.value||v.status==="cancelling",class:"rounded-lg border border-red-500/20 bg-red-500/10 px-3 py-1.5 text-xs text-red-300 transition hover:bg-red-500/20 disabled:cursor-not-allowed disabled:opacity-50"},y(t.value===v.task_id||v.status==="cancelling"?"终止中...":"终止任务"),9,["onClick","disabled"])):(b(),x("span",{key:1,class:"text-xs text-gray-600"},"-"))])]))),128))])])]))]))}},p0={__name:"TaskHistoryPage",props:{tasks:Array},setup(e){return(t,s)=>(b(),x("div",null,[s[0]||(s[0]=r("h2",{class:"text-xl font-bold text-white mb-2"},"任务历史",-1)),s[1]||(s[1]=r("p",{class:"text-sm text-gray-400 mb-6"}," 查看后台任务的执行状态、耗时、参数和结果,便于排查失败原因。 ",-1)),Ve(f0,{tasks:e.tasks},null,8,["tasks"])]))}},g0={class:"flex items-center justify-between mb-6"},m0={class:"flex items-center gap-3"},b0={class:"flex items-center gap-2 text-sm text-gray-400"},h0=["disabled"],x0={key:0,class:"text-gray-600 text-center py-8"},v0={class:"text-gray-600 shrink-0"},y0={class:"text-gray-300 break-all"},_0={__name:"LogViewer",setup(e){const t=M([]),s=M(!1),n=M(!0),l=M(null);let o=null,a=0;function u(c){const m=new Date(c*1e3);return`${String(m.getHours()).padStart(2,"0")}:${String(m.getMinutes()).padStart(2,"0")}:${String(m.getSeconds()).padStart(2,"0")}`}async function d(){s.value=!0;try{const c=await z.getLogs(500,a);c.logs.length>0&&(a===0?t.value=c.logs:(t.value.push(...c.logs),t.value.length>1e3&&(t.value=t.value.slice(-1e3))),a=c.logs[c.logs.length-1].time,n.value&&Pn(()=>{l.value&&(l.value.scrollTop=l.value.scrollHeight)}))}catch(c){console.error("获取日志失败:",c)}finally{s.value=!1}}function p(){t.value=[],a=0}return Vt(()=>{d(),o=setInterval(d,3e3)}),Ks(()=>{o&&clearInterval(o)}),(c,m)=>(b(),x("div",null,[r("div",g0,[m[2]||(m[2]=r("h2",{class:"text-xl font-bold text-white"},"日志",-1)),r("div",m0,[r("label",b0,[ue(r("input",{type:"checkbox","onUpdate:modelValue":m[0]||(m[0]=v=>n.value=v),class:"rounded bg-gray-800 border-gray-700"},null,512),[[So,n.value]]),m[1]||(m[1]=_e(" 自动滚动 ",-1))]),r("button",{onClick:d,disabled:s.value,class:"px-3 py-1.5 bg-gray-800 hover:bg-gray-700 text-sm rounded-lg border border-gray-700 transition disabled:opacity-50 text-gray-300 hover:text-white"}," 刷新 ",8,h0),r("button",{onClick:p,class:"px-3 py-1.5 bg-gray-800 hover:bg-gray-700 text-sm rounded-lg border border-gray-700 transition text-gray-400 hover:text-white"}," 清空 ")])]),r("div",{ref_key:"logContainer",ref:l,class:"bg-gray-950 border border-gray-800 rounded-xl p-3 md:p-4 font-mono text-xs leading-relaxed h-[calc(100vh-200px)] md:h-[600px] overflow-y-auto"},[t.value.length===0?(b(),x("div",x0,"暂无日志")):B("",!0),(b(!0),x(de,null,$e(t.value,(v,C)=>(b(),x("div",{key:C,class:"py-0.5 flex gap-3 hover:bg-gray-900/50"},[r("span",v0,y(u(v.time)),1),r("span",{class:Q(["shrink-0 w-16",{"text-red-400":v.level==="ERROR","text-yellow-400":v.level==="WARNING","text-blue-400":v.level==="INFO","text-gray-500":v.level==="DEBUG"}])},y(v.level),3),r("span",y0,y(v.message),1)]))),128))],512)]))}},w0={class:"mt-6 space-y-6"},S0={class:"bg-gray-900 border border-gray-800 rounded-xl p-4"},k0={class:"flex items-center justify-between gap-4 mb-4"},A0={key:1,class:"mb-4 px-4 py-3 rounded-lg text-sm border bg-green-500/10 text-green-400 border-green-500/20"},C0={key:2,class:"mb-4 px-4 py-3 rounded-lg text-sm border bg-red-500/10 text-red-400 border-red-500/20"},$0={key:3,class:"flex flex-wrap gap-3"},T0=["disabled"],P0={key:4,class:"space-y-4"},I0={class:"space-y-2"},E0={class:"p-3 bg-gray-800 border border-gray-700 rounded-lg text-xs font-mono break-all text-gray-200"},O0={class:"flex flex-wrap gap-3"},R0=["href"],M0={key:0,class:"text-xs text-emerald-300"},U0={class:"space-y-3"},L0=["disabled"],D0=["disabled"],N0={key:1,class:"text-xs text-emerald-300"},j0={class:"flex justify-end"},B0=["disabled"],F0={__name:"OAuthPage",props:{manualAccountStatus:{type:Object,default:null}},emits:["refresh","progress"],setup(e,{emit:t}){const s=e,n=t,l=M(""),o=M(!1),a=M(""),u=M(""),d=M(""),p=se(()=>{var j;return!!((j=s.manualAccountStatus)!=null&&j.in_progress)});$t(()=>s.manualAccountStatus,j=>{j!=null&&j.in_progress||(l.value="",a.value="")},{immediate:!0});function c(j,I="success"){u.value=j,d.value=I==="success"?"bg-green-500/10 text-green-400 border-green-500/20":"bg-red-500/10 text-red-400 border-red-500/20",window.clearTimeout(c._timer),c._timer=window.setTimeout(()=>{u.value=""},8e3)}async function m(){o.value=!0,a.value="正在生成 OAuth 链接...";try{const j=await z.startManualAccount();c(j.auth_url?"OAuth 链接已生成,请完成登录后粘贴回调 URL":"已开始 OAuth 登录流程"),n("progress")}catch(j){c(j.message,"error")}finally{o.value=!1,a.value=""}}async function v(){o.value=!0,a.value="正在提交回调 URL 并交换 token...";try{const j=await z.submitManualAccountCallback(l.value);c(j.status==="completed"?j.message||"账号已添加":"回调 URL 已提交"),n("progress")}catch(j){c(j.message,"error")}finally{o.value=!1,a.value=""}}async function C(){o.value=!0;try{await z.cancelManualAccount(),l.value="",c("OAuth 登录流程已取消"),n("refresh")}catch(j){c(j.message,"error")}finally{o.value=!1}}return(j,I)=>{var D,F,V,G,P,Z,W,le,ve,Pe,Se;return b(),x("div",w0,[r("div",S0,[r("div",k0,[I[1]||(I[1]=r("div",null,[r("h2",{class:"text-lg font-semibold text-white"},"OAuth 登录"),r("p",{class:"text-sm text-gray-400 mt-1"}," 参考 CLIProxyAPI 的手动 OAuth 思路:系统先生成认证链接,你在浏览器中手动完成登录,最后把回调 URL 粘贴回来完成认证。 ")],-1)),r("span",{class:Q(["min-w-[72px] px-3 py-1.5 rounded-full text-xs text-center whitespace-nowrap border",p.value?"bg-yellow-500/10 text-yellow-300 border-yellow-500/20":"bg-gray-800 text-gray-400 border-gray-700"])},y(p.value?"进行中":"空闲"),3)]),u.value?(b(),x("div",{key:0,class:Q(["mb-4 px-4 py-3 rounded-lg text-sm border",d.value])},y(u.value),3)):B("",!0),((D=e.manualAccountStatus)==null?void 0:D.status)==="completed"&&((F=e.manualAccountStatus)!=null&&F.account)?(b(),x("div",A0,y(e.manualAccountStatus.message||`已添加账号 ${e.manualAccountStatus.account.email}`),1)):((V=e.manualAccountStatus)==null?void 0:V.status)==="error"&&((G=e.manualAccountStatus)!=null&&G.error)?(b(),x("div",C0,y(e.manualAccountStatus.error),1)):B("",!0),p.value?(b(),x("div",P0,[I[3]||(I[3]=r("div",{class:"text-sm text-gray-300"},[_e(" 已生成 OAuth 链接。若当前机器可访问 "),r("span",{class:"font-mono"},"localhost:1455"),_e(",系统会自动接收回调;否则请手动粘贴最终回调 URL。 ")],-1)),r("div",{class:Q(["px-4 py-3 rounded-lg text-sm border",(P=e.manualAccountStatus)!=null&&P.auto_callback_available?"bg-blue-500/10 text-blue-300 border-blue-500/20":"bg-amber-500/10 text-amber-300 border-amber-500/20"])},y((Z=e.manualAccountStatus)!=null&&Z.auto_callback_available?"本地自动回调服务已启动:OpenAI 跳回 localhost:1455 后会自动完成认证。":`本地自动回调不可用:${((W=e.manualAccountStatus)==null?void 0:W.auto_callback_error)||"请改用手动粘贴回调 URL"}`),3),r("div",I0,[I[2]||(I[2]=r("div",{class:"text-xs text-gray-500"},"OAuth 链接",-1)),r("div",E0,y((le=e.manualAccountStatus)==null?void 0:le.auth_url),1)]),r("div",O0,[r("a",{href:(ve=e.manualAccountStatus)==null?void 0:ve.auth_url,target:"_blank",rel:"noopener noreferrer",class:"px-4 py-2 bg-emerald-700 hover:bg-emerald-600 text-white text-sm rounded-lg transition"}," 打开 OAuth 链接 ",8,R0)]),(Pe=e.manualAccountStatus)!=null&&Pe.callback_received?(b(),x("div",M0," 已收到"+y(((Se=e.manualAccountStatus)==null?void 0:Se.callback_source)==="auto"?"自动":"手动")+"回调,刷新轮询中… ",1)):B("",!0),r("div",U0,[ue(r("input",{"onUpdate:modelValue":I[0]||(I[0]=J=>l.value=J),type:"text",placeholder:"粘贴回调 URL,例如 http://localhost:1455/auth/callback?code=...&state=...",disabled:o.value,class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,L0),[[Ce,l.value,void 0,{trim:!0}]]),r("button",{onClick:v,disabled:o.value||!l.value,class:"px-4 py-2 bg-emerald-700 hover:bg-emerald-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(o.value?"提交中...":"提交回调 URL"),9,D0)]),o.value&&a.value?(b(),x("div",N0,y(a.value),1)):B("",!0),r("div",j0,[r("button",{onClick:C,disabled:o.value,class:"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-sm text-gray-200 rounded-lg border border-gray-700 transition disabled:opacity-50"}," 取消 OAuth 登录 ",8,B0)])])):(b(),x("div",$0,[r("button",{onClick:m,disabled:o.value,class:"px-4 py-2 bg-emerald-700 hover:bg-emerald-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(o.value?"生成中...":"生成 OAuth 链接"),9,T0)]))])])}}},Co="autoteam_theme",Tt=M("dark");let hl=!1;function $o(e){if(typeof document>"u")return;const t=e==="light"?"light":"dark";document.documentElement.dataset.theme=t,document.documentElement.style.colorScheme=t}function To(){if(!hl){if(hl=!0,typeof window<"u"){const e=window.localStorage.getItem(Co);Tt.value=e==="light"||e==="dark"?e:"dark"}$o(Tt.value)}}function Po(e){Tt.value=e==="light"?"light":"dark",typeof window<"u"&&window.localStorage.setItem(Co,Tt.value),$o(Tt.value)}function V0(){Po(Tt.value==="dark"?"light":"dark")}function H0(){return To(),{theme:Tt,isDark:se(()=>Tt.value==="dark"),setTheme:Po,toggleTheme:V0}}const K0=["title","aria-label"],W0={class:"text-base"},G0={class:"hidden sm:inline"},xl={__name:"ThemeToggle",props:{floating:{type:Boolean,default:!1}},setup(e){const{isDark:t,toggleTheme:s}=H0();return(n,l)=>(b(),x("button",{type:"button",class:Q(["theme-toggle",{"theme-toggle-floating":e.floating}]),title:Lt(t)?"切换到白天模式":"切换到夜间模式","aria-label":Lt(t)?"切换到白天模式":"切换到夜间模式",onClick:l[0]||(l[0]=(...o)=>Lt(s)&&Lt(s)(...o))},[r("span",W0,y(Lt(t)?"🌙":"☀️"),1),r("span",G0,y(Lt(t)?"夜间":"白天"),1)],10,K0))}},q0={key:2,class:"relative min-h-screen overflow-hidden"},Y0={class:"relative mx-auto flex min-h-screen max-w-6xl items-center px-4 py-10"},J0={class:"grid w-full items-center gap-8 lg:grid-cols-[1.2fr_0.8fr]"},z0={class:"glass-card w-full p-7 sm:p-8"},X0={key:0,class:"mb-4 rounded-2xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-300"},Q0={class:"space-y-4"},Z0=["disabled"],ep={key:3,class:"relative md:flex"},tp={class:"relative min-w-0 flex-1 overflow-y-auto pb-20 md:pb-8"},sp={class:"mx-auto w-full max-w-[1500px] px-4 py-4 md:px-8 md:py-8"},np={class:"mb-5 flex justify-end"},lp={key:0,class:"mb-5 flex items-center gap-3 rounded-2xl border border-amber-400/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-200 backdrop-blur"},op={class:"font-medium"},rp={__name:"App",setup(e){const t=M(!1),s=M(!1),n=M(!1),l=M(!1),o=M(""),a=M(""),u=M("dashboard"),d=M(null),p=M(null),c=M(null),m=M(null),v=M([]),C=M(!1),j=M(null),I=se(()=>{var J,X;return(J=p.value)!=null&&J.login_in_progress?{command:"admin-login"}:(X=c.value)!=null&&X.in_progress?{command:"main-codex-sync"}:j.value});let D=null;async function F(){try{const J=await z.checkAuth();return s.value=J.authenticated,n.value=J.auth_required,J.authenticated}catch(J){return J.status===401?(s.value=!1,n.value=!0,!1):(s.value=!0,n.value=!1,!0)}}async function V(){o.value="",l.value=!0;try{Us(a.value),await F()?(a.value="",P(),le(6e5)):(nn(),o.value="API Key 无效")}catch(J){nn(),o.value=J.message}finally{l.value=!1}}function G(){nn(),s.value=!1,ve()}async function P(){C.value=!0;try{const[J,X,Ee,ee,De]=await Promise.all([z.getStatus(),z.getTasks(),z.getAdminStatus(),z.getMainCodexStatus(),z.getManualAccountStatus()]);d.value=J,v.value=X,p.value=Ee,c.value=ee,m.value=De,j.value=X.find(he=>he.status==="running"||he.status==="pending"||he.status==="cancelling")||null}catch(J){if(J.status===401){s.value=!1;return}console.error("刷新失败:",J)}finally{C.value=!1}}function Z(){le(1e4),P()}function W(){le(1e4),P()}function le(J=6e5){ve(),D=setInterval(async()=>{await P(),!I.value&&J<6e5&&le(6e5)},J)}function ve(){D&&(clearInterval(D),D=null)}async function Pe(){try{return(await z.getSetupStatus()).configured}catch{return!0}}function Se(){t.value=!1,F().then(J=>{J&&(P(),le(6e5))})}return Vt(async()=>{if(To(),!await Pe()){t.value=!0;return}await F()&&(P(),le(6e5))}),Ks(()=>{ve()}),(J,X)=>(b(),x(de,null,[t.value||!s.value?(b(),qe(xl,{key:0,floating:""})):B("",!0),t.value?(b(),qe(hi,{key:1,onConfigured:Se})):s.value?(b(),x("div",ep,[X[8]||(X[8]=r("div",{class:"pointer-events-none absolute inset-0 overflow-hidden"},[r("div",{class:"absolute left-[10%] top-0 h-72 w-72 rounded-full bg-blue-500/8 blur-3xl"}),r("div",{class:"absolute bottom-0 right-[8%] h-80 w-80 rounded-full bg-cyan-500/8 blur-3xl"})],-1)),Ve(Ei,{active:u.value,loading:C.value,"auth-required":n.value,onNavigate:X[1]||(X[1]=Ee=>u.value=Ee),onRefresh:P,onLogout:G},null,8,["active","loading","auth-required"]),r("div",tp,[r("div",sp,[r("div",np,[Ve(xl)]),I.value?(b(),x("div",lp,[X[7]||(X[7]=r("span",{class:"inline-block h-4 w-4 animate-spin rounded-full border-2 border-amber-300 border-t-transparent"},null,-1)),r("span",op,y(I.value.command==="admin-login"?"管理员登录中...":I.value.command==="main-codex-sync"?"主号 Codex 同步中...":I.value.status==="cancelling"?`${I.value.command} 终止中...`:`${I.value.command} 执行中...`),1)])):B("",!0),u.value==="dashboard"?(b(),qe(bu,{key:1,status:d.value,loading:C.value,"running-task":I.value,"admin-status":p.value,onRefresh:P,onTaskStarted:Z},null,8,["status","loading","running-task","admin-status"])):u.value==="config"?(b(),qe(_f,{key:2,"admin-status":p.value,"codex-status":c.value,onRefresh:P,onAdminProgress:W},null,8,["admin-status","codex-status"])):u.value==="team"?(b(),qe(Hf,{key:3})):u.value==="pool"?(b(),qe(Qf,{key:4,"running-task":I.value,"admin-status":p.value,onTaskStarted:Z,onRefresh:P},null,8,["running-task","admin-status"])):u.value==="sync"?(b(),qe(Zf,{key:5,"running-task":I.value,"admin-status":p.value,onTaskStarted:Z,onRefresh:P},null,8,["running-task","admin-status"])):u.value==="oauth"?(b(),qe(F0,{key:6,"manual-account-status":m.value,onRefresh:P,onProgress:W},null,8,["manual-account-status"])):u.value==="tasks"?(b(),qe(p0,{key:7,tasks:v.value},null,8,["tasks"])):u.value==="logs"?(b(),qe(_0,{key:8})):B("",!0)])])])):(b(),x("div",q0,[X[6]||(X[6]=r("div",{class:"pointer-events-none absolute inset-0"},[r("div",{class:"absolute left-[-8rem] top-[-8rem] h-72 w-72 rounded-full bg-blue-500/20 blur-3xl"}),r("div",{class:"absolute bottom-[-10rem] right-[-5rem] h-80 w-80 rounded-full bg-cyan-500/15 blur-3xl"})],-1)),r("div",Y0,[r("div",J0,[X[5]||(X[5]=Ft('',1)),r("div",z0,[X[3]||(X[3]=r("div",{class:"mb-6 flex items-center gap-3"},[r("div",{class:"flex h-12 w-12 items-center justify-center rounded-2xl bg-gradient-to-br from-blue-500/30 to-cyan-500/20 text-2xl shadow-inner shadow-white/10"}," ⚡ "),r("div",null,[r("h2",{class:"text-2xl font-semibold text-white"},"登录面板"),r("p",{class:"mt-1 text-sm text-slate-400"},"请输入 API Key 进入 AutoTeam")])],-1)),o.value?(b(),x("div",X0,y(o.value),1)):B("",!0),r("div",Q0,[r("div",null,[X[2]||(X[2]=r("label",{class:"mb-2 block text-sm font-medium text-slate-300"},"API Key",-1)),ue(r("input",{"onUpdate:modelValue":X[0]||(X[0]=Ee=>a.value=Ee),type:"password",placeholder:"输入 API Key",onKeyup:Za(V,["enter"]),class:"input-dark"},null,544),[[Ce,a.value,void 0,{trim:!0}]])]),r("button",{onClick:V,disabled:!a.value||l.value,class:"btn-primary w-full"},y(l.value?"验证中...":"登录"),9,Z0)]),X[4]||(X[4]=r("div",{class:"mt-5 rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-xs leading-6 text-slate-400"}," 如果你是首次部署,启动后只需要先配置 API Key。CloudMail、CPA / Sub2API、代理等运行项可以在登录后进入配置面板继续设置。 ",-1))])])])]))],64))}};si(rp).mount("#app"); diff --git a/src/autoteam/web/dist/assets/index-P_JTQSU0.js b/src/autoteam/web/dist/assets/index-P_JTQSU0.js new file mode 100644 index 00000000..867f8145 --- /dev/null +++ b/src/autoteam/web/dist/assets/index-P_JTQSU0.js @@ -0,0 +1,26 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))n(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function s(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(l){if(l.ep)return;l.ep=!0;const o=s(l);fetch(l.href,o)}})();/** +* @vue/shared v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function hn(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const be={},Gt=[],ct=()=>{},vl=()=>!1,Ls=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ds=e=>e.startsWith("onUpdate:"),Le=Object.assign,xn=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},Eo=Object.prototype.hasOwnProperty,pe=(e,t)=>Eo.call(e,t),Y=Array.isArray,qt=e=>bs(e)==="[object Map]",Zt=e=>bs(e)==="[object Set]",Ln=e=>bs(e)==="[object Date]",ne=e=>typeof e=="function",Te=e=>typeof e=="string",ft=e=>typeof e=="symbol",me=e=>e!==null&&typeof e=="object",yl=e=>(me(e)||ne(e))&&ne(e.then)&&ne(e.catch),_l=Object.prototype.toString,bs=e=>_l.call(e),Oo=e=>bs(e).slice(8,-1),wl=e=>bs(e)==="[object Object]",vn=e=>Te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ls=hn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Ns=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},Ro=/-\w/g,nt=Ns(e=>e.replace(Ro,t=>t.slice(1).toUpperCase())),Mo=/\B([A-Z])/g,Ot=Ns(e=>e.replace(Mo,"-$1").toLowerCase()),Sl=Ns(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ys=Ns(e=>e?`on${Sl(e)}`:""),dt=(e,t)=>!Object.is(e,t),ks=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},js=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Dn;const Bs=()=>Dn||(Dn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function yn(e){if(Y(e)){const t={};for(let s=0;s{if(s){const n=s.split(Lo);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Q(e){let t="";if(Te(e))t=e;else if(Y(e))for(let s=0;sPt(s,t))}const Cl=e=>!!(e&&e.__v_isRef===!0),y=e=>Te(e)?e:e==null?"":Y(e)||me(e)&&(e.toString===_l||!ne(e.toString))?Cl(e)?y(e.value):JSON.stringify(e,$l,2):String(e),$l=(e,t)=>Cl(t)?$l(e,t.value):qt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,l],o)=>(s[Js(n,o)+" =>"]=l,s),{})}:Zt(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>Js(s))}:ft(t)?Js(t):me(t)&&!Y(t)&&!wl(t)?String(t):t,Js=(e,t="")=>{var s;return ft(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};/** +* @vue/reactivity v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let We;class Vo{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=We,!t&&We&&(this.index=(We.scopes||(We.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t0&&--this._on===0&&(We=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s0)return;if(rs){let t=rs;for(rs=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;os;){let t=os;for(os=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function El(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ol(e){let t,s=e.depsTail,n=s;for(;n;){const l=n.prevDep;n.version===-1?(n===s&&(s=l),kn(n),Ko(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=l}e.deps=t,e.depsTail=s}function on(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Rl(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Rl(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===cs)||(e.globalVersion=cs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!on(e))))return;e.flags|=2;const t=e.dep,s=xe,n=lt;xe=e,lt=!0;try{El(e);const l=e.fn(e._value);(t.version===0||dt(l,e._value))&&(e.flags|=128,e._value=l,t.version++)}catch(l){throw t.version++,l}finally{xe=s,lt=n,Ol(e),e.flags&=-3}}function kn(e,t=!1){const{dep:s,prevSub:n,nextSub:l}=e;if(n&&(n.nextSub=l,e.prevSub=void 0),l&&(l.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let o=s.computed.deps;o;o=o.nextDep)kn(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function Ko(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let lt=!0;const Ml=[];function _t(){Ml.push(lt),lt=!1}function wt(){const e=Ml.pop();lt=e===void 0?!0:e}function Nn(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=xe;xe=void 0;try{t()}finally{xe=s}}}let cs=0;class Wo{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class An{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!xe||!lt||xe===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==xe)s=this.activeLink=new Wo(xe,this),xe.deps?(s.prevDep=xe.depsTail,xe.depsTail.nextDep=s,xe.depsTail=s):xe.deps=xe.depsTail=s,Ul(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=xe.depsTail,s.nextDep=void 0,xe.depsTail.nextDep=s,xe.depsTail=s,xe.deps===s&&(xe.deps=n)}return s}trigger(t){this.version++,cs++,this.notify(t)}notify(t){wn();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Sn()}}}function Ul(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Ul(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const rn=new WeakMap,jt=Symbol(""),an=Symbol(""),fs=Symbol("");function Me(e,t,s){if(lt&&xe){let n=rn.get(e);n||rn.set(e,n=new Map);let l=n.get(s);l||(n.set(s,l=new An),l.map=n,l.key=s),l.track()}}function xt(e,t,s,n,l,o){const a=rn.get(e);if(!a){cs++;return}const u=d=>{d&&d.trigger()};if(wn(),t==="clear")a.forEach(u);else{const d=Y(e),p=d&&vn(s);if(d&&s==="length"){const c=Number(n);a.forEach((m,v)=>{(v==="length"||v===fs||!ft(v)&&v>=c)&&u(m)})}else switch((s!==void 0||a.has(void 0))&&u(a.get(s)),p&&u(a.get(fs)),t){case"add":d?p&&u(a.get("length")):(u(a.get(jt)),qt(e)&&u(a.get(an)));break;case"delete":d||(u(a.get(jt)),qt(e)&&u(a.get(an)));break;case"set":qt(e)&&u(a.get(jt));break}}Sn()}function Kt(e){const t=fe(e);return t===e?t:(Me(t,"iterate",fs),Ze(e)?t:t.map(ot))}function Fs(e){return Me(e=fe(e),"iterate",fs),e}function it(e,t){return St(e)?zt(Bt(e)?ot(t):t):ot(t)}const Go={__proto__:null,[Symbol.iterator](){return Xs(this,Symbol.iterator,e=>it(this,e))},concat(...e){return Kt(this).concat(...e.map(t=>Y(t)?Kt(t):t))},entries(){return Xs(this,"entries",e=>(e[1]=it(this,e[1]),e))},every(e,t){return mt(this,"every",e,t,void 0,arguments)},filter(e,t){return mt(this,"filter",e,t,s=>s.map(n=>it(this,n)),arguments)},find(e,t){return mt(this,"find",e,t,s=>it(this,s),arguments)},findIndex(e,t){return mt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return mt(this,"findLast",e,t,s=>it(this,s),arguments)},findLastIndex(e,t){return mt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return mt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Qs(this,"includes",e)},indexOf(...e){return Qs(this,"indexOf",e)},join(e){return Kt(this).join(e)},lastIndexOf(...e){return Qs(this,"lastIndexOf",e)},map(e,t){return mt(this,"map",e,t,void 0,arguments)},pop(){return ts(this,"pop")},push(...e){return ts(this,"push",e)},reduce(e,...t){return jn(this,"reduce",e,t)},reduceRight(e,...t){return jn(this,"reduceRight",e,t)},shift(){return ts(this,"shift")},some(e,t){return mt(this,"some",e,t,void 0,arguments)},splice(...e){return ts(this,"splice",e)},toReversed(){return Kt(this).toReversed()},toSorted(e){return Kt(this).toSorted(e)},toSpliced(...e){return Kt(this).toSpliced(...e)},unshift(...e){return ts(this,"unshift",e)},values(){return Xs(this,"values",e=>it(this,e))}};function Xs(e,t,s){const n=Fs(e),l=n[t]();return n!==e&&!Ze(e)&&(l._next=l.next,l.next=()=>{const o=l._next();return o.done||(o.value=s(o.value)),o}),l}const qo=Array.prototype;function mt(e,t,s,n,l,o){const a=Fs(e),u=a!==e&&!Ze(e),d=a[t];if(d!==qo[t]){const m=d.apply(e,o);return u?ot(m):m}let p=s;a!==e&&(u?p=function(m,v){return s.call(this,it(e,m),v,e)}:s.length>2&&(p=function(m,v){return s.call(this,m,v,e)}));const c=d.call(a,p,n);return u&&l?l(c):c}function jn(e,t,s,n){const l=Fs(e),o=l!==e&&!Ze(e);let a=s,u=!1;l!==e&&(o?(u=n.length===0,a=function(p,c,m){return u&&(u=!1,p=it(e,p)),s.call(this,p,it(e,c),m,e)}):s.length>3&&(a=function(p,c,m){return s.call(this,p,c,m,e)}));const d=l[t](a,...n);return u?it(e,d):d}function Qs(e,t,s){const n=fe(e);Me(n,"iterate",fs);const l=n[t](...s);return(l===-1||l===!1)&&Tn(s[0])?(s[0]=fe(s[0]),n[t](...s)):l}function ts(e,t,s=[]){_t(),wn();const n=fe(e)[t].apply(e,s);return Sn(),wt(),n}const Yo=hn("__proto__,__v_isRef,__isVue"),Ll=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ft));function Jo(e){ft(e)||(e=String(e));const t=fe(this);return Me(t,"has",e),t.hasOwnProperty(e)}class Dl{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const l=this._isReadonly,o=this._isShallow;if(s==="__v_isReactive")return!l;if(s==="__v_isReadonly")return l;if(s==="__v_isShallow")return o;if(s==="__v_raw")return n===(l?o?or:Fl:o?Bl:jl).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const a=Y(t);if(!l){let d;if(a&&(d=Go[s]))return d;if(s==="hasOwnProperty")return Jo}const u=Reflect.get(t,s,Ue(t)?t:n);if((ft(s)?Ll.has(s):Yo(s))||(l||Me(t,"get",s),o))return u;if(Ue(u)){const d=a&&vn(s)?u:u.value;return l&&me(d)?dn(d):d}return me(u)?l?dn(u):hs(u):u}}class Nl extends Dl{constructor(t=!1){super(!1,t)}set(t,s,n,l){let o=t[s];const a=Y(t)&&vn(s);if(!this._isShallow){const p=St(o);if(!Ze(n)&&!St(n)&&(o=fe(o),n=fe(n)),!a&&Ue(o)&&!Ue(n))return p||(o.value=n),!0}const u=a?Number(s)e,ys=e=>Reflect.getPrototypeOf(e);function er(e,t,s){return function(...n){const l=this.__v_raw,o=fe(l),a=qt(o),u=e==="entries"||e===Symbol.iterator&&a,d=e==="keys"&&a,p=l[e](...n),c=s?un:t?zt:ot;return!t&&Me(o,"iterate",d?an:jt),Le(Object.create(p),{next(){const{value:m,done:v}=p.next();return v?{value:m,done:v}:{value:u?[c(m[0]),c(m[1])]:c(m),done:v}}})}}function _s(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function tr(e,t){const s={get(l){const o=this.__v_raw,a=fe(o),u=fe(l);e||(dt(l,u)&&Me(a,"get",l),Me(a,"get",u));const{has:d}=ys(a),p=t?un:e?zt:ot;if(d.call(a,l))return p(o.get(l));if(d.call(a,u))return p(o.get(u));o!==a&&o.get(l)},get size(){const l=this.__v_raw;return!e&&Me(fe(l),"iterate",jt),l.size},has(l){const o=this.__v_raw,a=fe(o),u=fe(l);return e||(dt(l,u)&&Me(a,"has",l),Me(a,"has",u)),l===u?o.has(l):o.has(l)||o.has(u)},forEach(l,o){const a=this,u=a.__v_raw,d=fe(u),p=t?un:e?zt:ot;return!e&&Me(d,"iterate",jt),u.forEach((c,m)=>l.call(o,p(c),p(m),a))}};return Le(s,e?{add:_s("add"),set:_s("set"),delete:_s("delete"),clear:_s("clear")}:{add(l){const o=fe(this),a=ys(o),u=fe(l),d=!t&&!Ze(l)&&!St(l)?u:l;return a.has.call(o,d)||dt(l,d)&&a.has.call(o,l)||dt(u,d)&&a.has.call(o,u)||(o.add(d),xt(o,"add",d,d)),this},set(l,o){!t&&!Ze(o)&&!St(o)&&(o=fe(o));const a=fe(this),{has:u,get:d}=ys(a);let p=u.call(a,l);p||(l=fe(l),p=u.call(a,l));const c=d.call(a,l);return a.set(l,o),p?dt(o,c)&&xt(a,"set",l,o):xt(a,"add",l,o),this},delete(l){const o=fe(this),{has:a,get:u}=ys(o);let d=a.call(o,l);d||(l=fe(l),d=a.call(o,l)),u&&u.call(o,l);const p=o.delete(l);return d&&xt(o,"delete",l,void 0),p},clear(){const l=fe(this),o=l.size!==0,a=l.clear();return o&&xt(l,"clear",void 0,void 0),a}}),["keys","values","entries",Symbol.iterator].forEach(l=>{s[l]=er(l,e,t)}),s}function Cn(e,t){const s=tr(e,t);return(n,l,o)=>l==="__v_isReactive"?!e:l==="__v_isReadonly"?e:l==="__v_raw"?n:Reflect.get(pe(s,l)&&l in n?s:n,l,o)}const sr={get:Cn(!1,!1)},nr={get:Cn(!1,!0)},lr={get:Cn(!0,!1)};const jl=new WeakMap,Bl=new WeakMap,Fl=new WeakMap,or=new WeakMap;function rr(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ar(e){return e.__v_skip||!Object.isExtensible(e)?0:rr(Oo(e))}function hs(e){return St(e)?e:$n(e,!1,Xo,sr,jl)}function ir(e){return $n(e,!1,Zo,nr,Bl)}function dn(e){return $n(e,!0,Qo,lr,Fl)}function $n(e,t,s,n,l){if(!me(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=ar(e);if(o===0)return e;const a=l.get(e);if(a)return a;const u=new Proxy(e,o===2?n:s);return l.set(e,u),u}function Bt(e){return St(e)?Bt(e.__v_raw):!!(e&&e.__v_isReactive)}function St(e){return!!(e&&e.__v_isReadonly)}function Ze(e){return!!(e&&e.__v_isShallow)}function Tn(e){return e?!!e.__v_raw:!1}function fe(e){const t=e&&e.__v_raw;return t?fe(t):e}function ur(e){return!pe(e,"__v_skip")&&Object.isExtensible(e)&&kl(e,"__v_skip",!0),e}const ot=e=>me(e)?hs(e):e,zt=e=>me(e)?dn(e):e;function Ue(e){return e?e.__v_isRef===!0:!1}function M(e){return dr(e,!1)}function dr(e,t){return Ue(e)?e:new cr(e,t)}class cr{constructor(t,s){this.dep=new An,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:fe(t),this._value=s?t:ot(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||Ze(t)||St(t);t=n?t:fe(t),dt(t,s)&&(this._rawValue=t,this._value=n?t:ot(t),this.dep.trigger())}}function Lt(e){return Ue(e)?e.value:e}const fr={get:(e,t,s)=>t==="__v_raw"?e:Lt(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const l=e[t];return Ue(l)&&!Ue(s)?(l.value=s,!0):Reflect.set(e,t,s,n)}};function Vl(e){return Bt(e)?e:new Proxy(e,fr)}class pr{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new An(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=cs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&xe!==this)return Il(this,!0),!0}get value(){const t=this.dep.track();return Rl(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function gr(e,t,s=!1){let n,l;return ne(e)?n=e:(n=e.get,l=e.set),new pr(n,l,s)}const ws={},Ps=new WeakMap;let Dt;function mr(e,t=!1,s=Dt){if(s){let n=Ps.get(s);n||Ps.set(s,n=[]),n.push(e)}}function br(e,t,s=be){const{immediate:n,deep:l,once:o,scheduler:a,augmentJob:u,call:d}=s,p=P=>l?P:Ze(P)||l===!1||l===0?vt(P,1):vt(P);let c,m,v,$,j=!1,I=!1;if(Ue(e)?(m=()=>e.value,j=Ze(e)):Bt(e)?(m=()=>p(e),j=!0):Y(e)?(I=!0,j=e.some(P=>Bt(P)||Ze(P)),m=()=>e.map(P=>{if(Ue(P))return P.value;if(Bt(P))return p(P);if(ne(P))return d?d(P,2):P()})):ne(e)?t?m=d?()=>d(e,2):e:m=()=>{if(v){_t();try{v()}finally{wt()}}const P=Dt;Dt=c;try{return d?d(e,3,[$]):e($)}finally{Dt=P}}:m=ct,t&&l){const P=m,Z=l===!0?1/0:l;m=()=>vt(P(),Z)}const D=Ho(),F=()=>{c.stop(),D&&D.active&&xn(D.effects,c)};if(o&&t){const P=t;t=(...Z)=>{P(...Z),F()}}let V=I?new Array(e.length).fill(ws):ws;const G=P=>{if(!(!(c.flags&1)||!c.dirty&&!P))if(t){const Z=c.run();if(l||j||(I?Z.some((W,le)=>dt(W,V[le])):dt(Z,V))){v&&v();const W=Dt;Dt=c;try{const le=[Z,V===ws?void 0:I&&V[0]===ws?[]:V,$];V=Z,d?d(t,3,le):t(...le)}finally{Dt=W}}}else c.run()};return u&&u(G),c=new Tl(m),c.scheduler=a?()=>a(G,!1):G,$=P=>mr(P,!1,c),v=c.onStop=()=>{const P=Ps.get(c);if(P){if(d)d(P,4);else for(const Z of P)Z();Ps.delete(c)}},t?n?G(!0):V=c.run():a?a(G.bind(null,!0),!0):c.run(),F.pause=c.pause.bind(c),F.resume=c.resume.bind(c),F.stop=F,F}function vt(e,t=1/0,s){if(t<=0||!me(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Ue(e))vt(e.value,t,s);else if(Y(e))for(let n=0;n{vt(n,t,s)});else if(wl(e)){for(const n in e)vt(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&vt(e[n],t,s)}return e}/** +* @vue/runtime-core v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function xs(e,t,s,n){try{return n?e(...n):e()}catch(l){Vs(l,t,s)}}function pt(e,t,s,n){if(ne(e)){const l=xs(e,t,s,n);return l&&yl(l)&&l.catch(o=>{Vs(o,t,s)}),l}if(Y(e)){const l=[];for(let o=0;o>>1,l=Be[n],o=ps(l);o=ps(s)?Be.push(e):Be.splice(xr(t),0,e),e.flags|=1,Kl()}}function Kl(){Is||(Is=Hl.then(Gl))}function vr(e){Y(e)?Yt.push(...e):Ct&&e.id===-1?Ct.splice(Wt+1,0,e):e.flags&1||(Yt.push(e),e.flags|=1),Kl()}function Bn(e,t,s=at+1){for(;sps(s)-ps(n));if(Yt.length=0,Ct){Ct.push(...t);return}for(Ct=t,Wt=0;Wte.id==null?e.flags&2?-1:1/0:e.id;function Gl(e){try{for(at=0;at{n._d&&Xn(-1);const o=Es(t);let a;try{a=e(...l)}finally{Es(o),n._d&&Xn(1)}return a};return n._n=!0,n._c=!0,n._d=!0,n}function ue(e,t){if(Qe===null)return e;const s=qs(Qe),n=e.dirs||(e.dirs=[]);for(let l=0;l1)return s&&ne(t)?t.call(n&&n.proxy):t}}const wr=Symbol.for("v-scx"),Sr=()=>As(wr);function $t(e,t,s){return Yl(e,t,s)}function Yl(e,t,s=be){const{immediate:n,deep:l,flush:o,once:a}=s,u=Le({},s),d=t&&n||!t&&o!=="post";let p;if(ms){if(o==="sync"){const $=Sr();p=$.__watcherHandles||($.__watcherHandles=[])}else if(!d){const $=()=>{};return $.stop=ct,$.resume=ct,$.pause=ct,$}}const c=Fe;u.call=($,j,I)=>pt($,c,j,I);let m=!1;o==="post"?u.scheduler=$=>{Ke($,c&&c.suspense)}:o!=="sync"&&(m=!0,u.scheduler=($,j)=>{j?$():In($)}),u.augmentJob=$=>{t&&($.flags|=4),m&&($.flags|=2,c&&($.id=c.uid,$.i=c))};const v=br(e,t,u);return ms&&(p?p.push(v):d&&v()),v}function kr(e,t,s){const n=this.proxy,l=Te(e)?e.includes(".")?Jl(n,e):()=>n[e]:e.bind(n,n);let o;ne(t)?o=t:(o=t.handler,s=t);const a=vs(this),u=Yl(l,o.bind(n),s);return a(),u}function Jl(e,t){const s=t.split(".");return()=>{let n=e;for(let l=0;le.__isTeleport,$r=Symbol("_leaveCb");function En(e,t){e.shapeFlag&6&&e.component?(e.transition=t,En(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function zl(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Fn(e,t){let s;return!!((s=Object.getOwnPropertyDescriptor(e,t))&&!s.configurable)}const Os=new WeakMap;function as(e,t,s,n,l=!1){if(Y(e)){e.forEach((I,D)=>as(I,t&&(Y(t)?t[D]:t),s,n,l));return}if(is(n)&&!l){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&as(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?qs(n.component):n.el,a=l?null:o,{i:u,r:d}=e,p=t&&t.r,c=u.refs===be?u.refs={}:u.refs,m=u.setupState,v=fe(m),$=m===be?vl:I=>Fn(c,I)?!1:pe(v,I),j=(I,D)=>!(D&&Fn(c,D));if(p!=null&&p!==d){if(Vn(t),Te(p))c[p]=null,$(p)&&(m[p]=null);else if(Ue(p)){const I=t;j(p,I.k)&&(p.value=null),I.k&&(c[I.k]=null)}}if(ne(d))xs(d,u,12,[a,c]);else{const I=Te(d),D=Ue(d);if(I||D){const F=()=>{if(e.f){const V=I?$(d)?m[d]:c[d]:j()||!e.k?d.value:c[e.k];if(l)Y(V)&&xn(V,o);else if(Y(V))V.includes(o)||V.push(o);else if(I)c[d]=[o],$(d)&&(m[d]=c[d]);else{const G=[o];j(d,e.k)&&(d.value=G),e.k&&(c[e.k]=G)}}else I?(c[d]=a,$(d)&&(m[d]=a)):D&&(j(d,e.k)&&(d.value=a),e.k&&(c[e.k]=a))};if(a){const V=()=>{F(),Os.delete(e)};V.id=-1,Os.set(e,V),Ke(V,s)}else Vn(e),F()}}}function Vn(e){const t=Os.get(e);t&&(t.flags|=8,Os.delete(e))}Bs().requestIdleCallback;Bs().cancelIdleCallback;const is=e=>!!e.type.__asyncLoader,Xl=e=>e.type.__isKeepAlive;function Tr(e,t){Ql(e,"a",t)}function Pr(e,t){Ql(e,"da",t)}function Ql(e,t,s=Fe){const n=e.__wdc||(e.__wdc=()=>{let l=s;for(;l;){if(l.isDeactivated)return;l=l.parent}return e()});if(Hs(t,n,s),s){let l=s.parent;for(;l&&l.parent;)Xl(l.parent.vnode)&&Ir(n,t,s,l),l=l.parent}}function Ir(e,t,s,n){const l=Hs(t,e,n,!0);Ks(()=>{xn(n[t],l)},s)}function Hs(e,t,s=Fe,n=!1){if(s){const l=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...a)=>{_t();const u=vs(s),d=pt(t,s,e,a);return u(),wt(),d});return n?l.unshift(o):l.push(o),o}}const kt=e=>(t,s=Fe)=>{(!ms||e==="sp")&&Hs(e,(...n)=>t(...n),s)},Er=kt("bm"),Ht=kt("m"),Or=kt("bu"),Rr=kt("u"),Mr=kt("bum"),Ks=kt("um"),Ur=kt("sp"),Lr=kt("rtg"),Dr=kt("rtc");function Nr(e,t=Fe){Hs("ec",e,t)}const jr=Symbol.for("v-ndc");function $e(e,t,s,n){let l;const o=s,a=Y(e);if(a||Te(e)){const u=a&&Bt(e);let d=!1,p=!1;u&&(d=!Ze(e),p=St(e),e=Fs(e)),l=new Array(e.length);for(let c=0,m=e.length;ct(u,d,void 0,o));else{const u=Object.keys(e);l=new Array(u.length);for(let d=0,p=u.length;de?yo(e)?qs(e):cn(e.parent):null,us=Le(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>cn(e.parent),$root:e=>cn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>eo(e),$forceUpdate:e=>e.f||(e.f=()=>{In(e.update)}),$nextTick:e=>e.n||(e.n=Pn.bind(e.proxy)),$watch:e=>kr.bind(e)}),Zs=(e,t)=>e!==be&&!e.__isScriptSetup&&pe(e,t),Br={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:l,props:o,accessCache:a,type:u,appContext:d}=e;if(t[0]!=="$"){const v=a[t];if(v!==void 0)switch(v){case 1:return n[t];case 2:return l[t];case 4:return s[t];case 3:return o[t]}else{if(Zs(n,t))return a[t]=1,n[t];if(l!==be&&pe(l,t))return a[t]=2,l[t];if(pe(o,t))return a[t]=3,o[t];if(s!==be&&pe(s,t))return a[t]=4,s[t];fn&&(a[t]=0)}}const p=us[t];let c,m;if(p)return t==="$attrs"&&Me(e.attrs,"get",""),p(e);if((c=u.__cssModules)&&(c=c[t]))return c;if(s!==be&&pe(s,t))return a[t]=4,s[t];if(m=d.config.globalProperties,pe(m,t))return m[t]},set({_:e},t,s){const{data:n,setupState:l,ctx:o}=e;return Zs(l,t)?(l[t]=s,!0):n!==be&&pe(n,t)?(n[t]=s,!0):pe(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:l,props:o,type:a}},u){let d;return!!(s[u]||e!==be&&u[0]!=="$"&&pe(e,u)||Zs(t,u)||pe(o,u)||pe(n,u)||pe(us,u)||pe(l.config.globalProperties,u)||(d=a.__cssModules)&&d[u])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:pe(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Hn(e){return Y(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let fn=!0;function Fr(e){const t=eo(e),s=e.proxy,n=e.ctx;fn=!1,t.beforeCreate&&Kn(t.beforeCreate,e,"bc");const{data:l,computed:o,methods:a,watch:u,provide:d,inject:p,created:c,beforeMount:m,mounted:v,beforeUpdate:$,updated:j,activated:I,deactivated:D,beforeDestroy:F,beforeUnmount:V,destroyed:G,unmounted:P,render:Z,renderTracked:W,renderTriggered:le,errorCaptured:ve,serverPrefetch:Pe,expose:Se,inheritAttrs:J,components:X,directives:Ee,filters:ee}=t;if(p&&Vr(p,n,null),a)for(const ie in a){const ae=a[ie];ne(ae)&&(n[ie]=ae.bind(s))}if(l){const ie=l.call(s,s);me(ie)&&(e.data=hs(ie))}if(fn=!0,o)for(const ie in o){const ae=o[ie],Re=ne(ae)?ae.bind(s,s):ne(ae.get)?ae.get.bind(s,s):ct,Ie=!ne(ae)&&ne(ae.set)?ae.set.bind(s):ct,ke=se({get:Re,set:Ie});Object.defineProperty(n,ie,{enumerable:!0,configurable:!0,get:()=>ke.value,set:Oe=>ke.value=Oe})}if(u)for(const ie in u)Zl(u[ie],n,s,ie);if(d){const ie=ne(d)?d.call(s):d;Reflect.ownKeys(ie).forEach(ae=>{_r(ae,ie[ae])})}c&&Kn(c,e,"c");function he(ie,ae){Y(ae)?ae.forEach(Re=>ie(Re.bind(s))):ae&&ie(ae.bind(s))}if(he(Er,m),he(Ht,v),he(Or,$),he(Rr,j),he(Tr,I),he(Pr,D),he(Nr,ve),he(Dr,W),he(Lr,le),he(Mr,V),he(Ks,P),he(Ur,Pe),Y(Se))if(Se.length){const ie=e.exposed||(e.exposed={});Se.forEach(ae=>{Object.defineProperty(ie,ae,{get:()=>s[ae],set:Re=>s[ae]=Re,enumerable:!0})})}else e.exposed||(e.exposed={});Z&&e.render===ct&&(e.render=Z),J!=null&&(e.inheritAttrs=J),X&&(e.components=X),Ee&&(e.directives=Ee),Pe&&zl(e)}function Vr(e,t,s=ct){Y(e)&&(e=pn(e));for(const n in e){const l=e[n];let o;me(l)?"default"in l?o=As(l.from||n,l.default,!0):o=As(l.from||n):o=As(l),Ue(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:a=>o.value=a}):t[n]=o}}function Kn(e,t,s){pt(Y(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function Zl(e,t,s,n){let l=n.includes(".")?Jl(s,n):()=>s[n];if(Te(e)){const o=t[e];ne(o)&&$t(l,o)}else if(ne(e))$t(l,e.bind(s));else if(me(e))if(Y(e))e.forEach(o=>Zl(o,t,s,n));else{const o=ne(e.handler)?e.handler.bind(s):t[e.handler];ne(o)&&$t(l,o,e)}}function eo(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:l,optionsCache:o,config:{optionMergeStrategies:a}}=e.appContext,u=o.get(t);let d;return u?d=u:!l.length&&!s&&!n?d=t:(d={},l.length&&l.forEach(p=>Rs(d,p,a,!0)),Rs(d,t,a)),me(t)&&o.set(t,d),d}function Rs(e,t,s,n=!1){const{mixins:l,extends:o}=t;o&&Rs(e,o,s,!0),l&&l.forEach(a=>Rs(e,a,s,!0));for(const a in t)if(!(n&&a==="expose")){const u=Hr[a]||s&&s[a];e[a]=u?u(e[a],t[a]):t[a]}return e}const Hr={data:Wn,props:Gn,emits:Gn,methods:ns,computed:ns,beforeCreate:je,created:je,beforeMount:je,mounted:je,beforeUpdate:je,updated:je,beforeDestroy:je,beforeUnmount:je,destroyed:je,unmounted:je,activated:je,deactivated:je,errorCaptured:je,serverPrefetch:je,components:ns,directives:ns,watch:Wr,provide:Wn,inject:Kr};function Wn(e,t){return t?e?function(){return Le(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function Kr(e,t){return ns(pn(e),pn(t))}function pn(e){if(Y(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${nt(t)}Modifiers`]||e[`${Ot(t)}Modifiers`];function Jr(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||be;let l=s;const o=t.startsWith("update:"),a=o&&Yr(n,t.slice(7));a&&(a.trim&&(l=s.map(c=>Te(c)?c.trim():c)),a.number&&(l=s.map(js)));let u,d=n[u=Ys(t)]||n[u=Ys(nt(t))];!d&&o&&(d=n[u=Ys(Ot(t))]),d&&pt(d,e,6,l);const p=n[u+"Once"];if(p){if(!e.emitted)e.emitted={};else if(e.emitted[u])return;e.emitted[u]=!0,pt(p,e,6,l)}}const zr=new WeakMap;function so(e,t,s=!1){const n=s?zr:t.emitsCache,l=n.get(e);if(l!==void 0)return l;const o=e.emits;let a={},u=!1;if(!ne(e)){const d=p=>{const c=so(p,t,!0);c&&(u=!0,Le(a,c))};!s&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}return!o&&!u?(me(e)&&n.set(e,null),null):(Y(o)?o.forEach(d=>a[d]=null):Le(a,o),me(e)&&n.set(e,a),a)}function Ws(e,t){return!e||!Ls(t)?!1:(t=t.slice(2).replace(/Once$/,""),pe(e,t[0].toLowerCase()+t.slice(1))||pe(e,Ot(t))||pe(e,t))}function qn(e){const{type:t,vnode:s,proxy:n,withProxy:l,propsOptions:[o],slots:a,attrs:u,emit:d,render:p,renderCache:c,props:m,data:v,setupState:$,ctx:j,inheritAttrs:I}=e,D=Es(e);let F,V;try{if(s.shapeFlag&4){const P=l||n,Z=P;F=ut(p.call(Z,P,c,m,$,v,j)),V=u}else{const P=t;F=ut(P.length>1?P(m,{attrs:u,slots:a,emit:d}):P(m,null)),V=t.props?u:Xr(u)}}catch(P){ds.length=0,Vs(P,e,1),F=Ve(It)}let G=F;if(V&&I!==!1){const P=Object.keys(V),{shapeFlag:Z}=G;P.length&&Z&7&&(o&&P.some(Ds)&&(V=Qr(V,o)),G=Xt(G,V,!1,!0))}return s.dirs&&(G=Xt(G,null,!1,!0),G.dirs=G.dirs?G.dirs.concat(s.dirs):s.dirs),s.transition&&En(G,s.transition),F=G,Es(D),F}const Xr=e=>{let t;for(const s in e)(s==="class"||s==="style"||Ls(s))&&((t||(t={}))[s]=e[s]);return t},Qr=(e,t)=>{const s={};for(const n in e)(!Ds(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Zr(e,t,s){const{props:n,children:l,component:o}=e,{props:a,children:u,patchFlag:d}=t,p=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&d>=0){if(d&1024)return!0;if(d&16)return n?Yn(n,a,p):!!a;if(d&8){const c=t.dynamicProps;for(let m=0;mObject.create(lo),ro=e=>Object.getPrototypeOf(e)===lo;function ta(e,t,s,n=!1){const l={},o=oo();e.propsDefaults=Object.create(null),ao(e,t,l,o);for(const a in e.propsOptions[0])a in l||(l[a]=void 0);s?e.props=n?l:ir(l):e.type.props?e.props=l:e.props=o,e.attrs=o}function sa(e,t,s,n){const{props:l,attrs:o,vnode:{patchFlag:a}}=e,u=fe(l),[d]=e.propsOptions;let p=!1;if((n||a>0)&&!(a&16)){if(a&8){const c=e.vnode.dynamicProps;for(let m=0;m{d=!0;const[v,$]=io(m,t,!0);Le(a,v),$&&u.push(...$)};!s&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!o&&!d)return me(e)&&n.set(e,Gt),Gt;if(Y(o))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",Rn=e=>Y(e)?e.map(ut):[ut(e)],la=(e,t,s)=>{if(t._n)return t;const n=yr((...l)=>Rn(t(...l)),s);return n._c=!1,n},uo=(e,t,s)=>{const n=e._ctx;for(const l in e){if(On(l))continue;const o=e[l];if(ne(o))t[l]=la(l,o,n);else if(o!=null){const a=Rn(o);t[l]=()=>a}}},co=(e,t)=>{const s=Rn(t);e.slots.default=()=>s},fo=(e,t,s)=>{for(const n in t)(s||!On(n))&&(e[n]=t[n])},oa=(e,t,s)=>{const n=e.slots=oo();if(e.vnode.shapeFlag&32){const l=t._;l?(fo(n,t,s),s&&kl(n,"_",l,!0)):uo(t,n)}else t&&co(e,t)},ra=(e,t,s)=>{const{vnode:n,slots:l}=e;let o=!0,a=be;if(n.shapeFlag&32){const u=t._;u?s&&u===1?o=!1:fo(l,t,s):(o=!t.$stable,uo(t,l)),a=t}else t&&(co(e,t),a={default:1});if(o)for(const u in l)!On(u)&&a[u]==null&&delete l[u]},Ke=ca;function aa(e){return ia(e)}function ia(e,t){const s=Bs();s.__VUE__=!0;const{insert:n,remove:l,patchProp:o,createElement:a,createText:u,createComment:d,setText:p,setElementText:c,parentNode:m,nextSibling:v,setScopeId:$=ct,insertStaticContent:j}=e,I=(i,f,g,S=null,_=null,k=null,U=void 0,L=null,O=!!f.dynamicChildren)=>{if(i===f)return;i&&!ss(i,f)&&(S=st(i),Oe(i,_,k,!0),i=null),f.patchFlag===-2&&(O=!1,f.dynamicChildren=null);const{type:C,ref:H,shapeFlag:N}=f;switch(C){case Gs:D(i,f,g,S);break;case It:F(i,f,g,S);break;case Cs:i==null&&V(f,g,S,U);break;case de:X(i,f,g,S,_,k,U,L,O);break;default:N&1?Z(i,f,g,S,_,k,U,L,O):N&6?Ee(i,f,g,S,_,k,U,L,O):(N&64||N&128)&&C.process(i,f,g,S,_,k,U,L,O,w)}H!=null&&_?as(H,i&&i.ref,k,f||i,!f):H==null&&i&&i.ref!=null&&as(i.ref,null,k,i,!0)},D=(i,f,g,S)=>{if(i==null)n(f.el=u(f.children),g,S);else{const _=f.el=i.el;f.children!==i.children&&p(_,f.children)}},F=(i,f,g,S)=>{i==null?n(f.el=d(f.children||""),g,S):f.el=i.el},V=(i,f,g,S)=>{[i.el,i.anchor]=j(i.children,f,g,S,i.el,i.anchor)},G=({el:i,anchor:f},g,S)=>{let _;for(;i&&i!==f;)_=v(i),n(i,g,S),i=_;n(f,g,S)},P=({el:i,anchor:f})=>{let g;for(;i&&i!==f;)g=v(i),l(i),i=g;l(f)},Z=(i,f,g,S,_,k,U,L,O)=>{if(f.type==="svg"?U="svg":f.type==="math"&&(U="mathml"),i==null)W(f,g,S,_,k,U,L,O);else{const C=i.el&&i.el._isVueCE?i.el:null;try{C&&C._beginPatch(),Pe(i,f,_,k,U,L,O)}finally{C&&C._endPatch()}}},W=(i,f,g,S,_,k,U,L)=>{let O,C;const{props:H,shapeFlag:N,transition:E,dirs:q}=i;if(O=i.el=a(i.type,k,H&&H.is,H),N&8?c(O,i.children):N&16&&ve(i.children,O,null,S,_,en(i,k),U,L),q&&Mt(i,null,S,"created"),le(O,i,i.scopeId,U,S),H){for(const oe in H)oe!=="value"&&!ls(oe)&&o(O,oe,null,H[oe],k,S);"value"in H&&o(O,"value",null,H.value,k),(C=H.onVnodeBeforeMount)&&rt(C,S,i)}q&&Mt(i,null,S,"beforeMount");const re=ua(_,E);re&&E.beforeEnter(O),n(O,f,g),((C=H&&H.onVnodeMounted)||re||q)&&Ke(()=>{try{C&&rt(C,S,i),re&&E.enter(O),q&&Mt(i,null,S,"mounted")}finally{}},_)},le=(i,f,g,S,_)=>{if(g&&$(i,g),S)for(let k=0;k{for(let C=O;C{const L=f.el=i.el;let{patchFlag:O,dynamicChildren:C,dirs:H}=f;O|=i.patchFlag&16;const N=i.props||be,E=f.props||be;let q;if(g&&Ut(g,!1),(q=E.onVnodeBeforeUpdate)&&rt(q,g,f,i),H&&Mt(f,i,g,"beforeUpdate"),g&&Ut(g,!0),(N.innerHTML&&E.innerHTML==null||N.textContent&&E.textContent==null)&&c(L,""),C?Se(i.dynamicChildren,C,L,g,S,en(f,_),k):U||ae(i,f,L,null,g,S,en(f,_),k,!1),O>0){if(O&16)J(L,N,E,g,_);else if(O&2&&N.class!==E.class&&o(L,"class",null,E.class,_),O&4&&o(L,"style",N.style,E.style,_),O&8){const re=f.dynamicProps;for(let oe=0;oe{q&&rt(q,g,f,i),H&&Mt(f,i,g,"updated")},S)},Se=(i,f,g,S,_,k,U)=>{for(let L=0;L{if(f!==g){if(f!==be)for(const k in f)!ls(k)&&!(k in g)&&o(i,k,f[k],null,_,S);for(const k in g){if(ls(k))continue;const U=g[k],L=f[k];U!==L&&k!=="value"&&o(i,k,L,U,_,S)}"value"in g&&o(i,"value",f.value,g.value,_)}},X=(i,f,g,S,_,k,U,L,O)=>{const C=f.el=i?i.el:u(""),H=f.anchor=i?i.anchor:u("");let{patchFlag:N,dynamicChildren:E,slotScopeIds:q}=f;q&&(L=L?L.concat(q):q),i==null?(n(C,g,S),n(H,g,S),ve(f.children||[],g,H,_,k,U,L,O)):N>0&&N&64&&E&&i.dynamicChildren&&i.dynamicChildren.length===E.length?(Se(i.dynamicChildren,E,g,_,k,U,L),(f.key!=null||_&&f===_.subTree)&&po(i,f,!0)):ae(i,f,g,H,_,k,U,L,O)},Ee=(i,f,g,S,_,k,U,L,O)=>{f.slotScopeIds=L,i==null?f.shapeFlag&512?_.ctx.activate(f,g,S,U,O):ee(f,g,S,_,k,U,O):De(i,f,O)},ee=(i,f,g,S,_,k,U)=>{const L=i.component=xa(i,S,_);if(Xl(i)&&(L.ctx.renderer=w),ya(L,!1,U),L.asyncDep){if(_&&_.registerDep(L,he,U),!i.el){const O=L.subTree=Ve(It);F(null,O,f,g),i.placeholder=O.el}}else he(L,i,f,g,_,k,U)},De=(i,f,g)=>{const S=f.component=i.component;if(Zr(i,f,g))if(S.asyncDep&&!S.asyncResolved){ie(S,f,g);return}else S.next=f,S.update();else f.el=i.el,S.vnode=f},he=(i,f,g,S,_,k,U)=>{const L=()=>{if(i.isMounted){let{next:N,bu:E,u:q,parent:re,vnode:oe}=i;{const ze=go(i);if(ze){N&&(N.el=oe.el,ie(i,N,U)),ze.asyncDep.then(()=>{Ke(()=>{i.isUnmounted||C()},_)});return}}let ge=N,ye;Ut(i,!1),N?(N.el=oe.el,ie(i,N,U)):N=oe,E&&ks(E),(ye=N.props&&N.props.onVnodeBeforeUpdate)&&rt(ye,re,N,oe),Ut(i,!0);const we=qn(i),He=i.subTree;i.subTree=we,I(He,we,m(He.el),st(He),i,_,k),N.el=we.el,ge===null&&ea(i,we.el),q&&Ke(q,_),(ye=N.props&&N.props.onVnodeUpdated)&&Ke(()=>rt(ye,re,N,oe),_)}else{let N;const{el:E,props:q}=f,{bm:re,m:oe,parent:ge,root:ye,type:we}=i,He=is(f);Ut(i,!1),re&&ks(re),!He&&(N=q&&q.onVnodeBeforeMount)&&rt(N,ge,f),Ut(i,!0);{ye.ce&&ye.ce._hasShadowRoot()&&ye.ce._injectChildStyle(we,i.parent?i.parent.type:void 0);const ze=i.subTree=qn(i);I(null,ze,g,S,i,_,k),f.el=ze.el}if(oe&&Ke(oe,_),!He&&(N=q&&q.onVnodeMounted)){const ze=f;Ke(()=>rt(N,ge,ze),_)}(f.shapeFlag&256||ge&&is(ge.vnode)&&ge.vnode.shapeFlag&256)&&i.a&&Ke(i.a,_),i.isMounted=!0,f=g=S=null}};i.scope.on();const O=i.effect=new Tl(L);i.scope.off();const C=i.update=O.run.bind(O),H=i.job=O.runIfDirty.bind(O);H.i=i,H.id=i.uid,O.scheduler=()=>In(H),Ut(i,!0),C()},ie=(i,f,g)=>{f.component=i;const S=i.vnode.props;i.vnode=f,i.next=null,sa(i,f.props,S,g),ra(i,f.children,g),_t(),Bn(i),wt()},ae=(i,f,g,S,_,k,U,L,O=!1)=>{const C=i&&i.children,H=i?i.shapeFlag:0,N=f.children,{patchFlag:E,shapeFlag:q}=f;if(E>0){if(E&128){Ie(C,N,g,S,_,k,U,L,O);return}else if(E&256){Re(C,N,g,S,_,k,U,L,O);return}}q&8?(H&16&&tt(C,_,k),N!==C&&c(g,N)):H&16?q&16?Ie(C,N,g,S,_,k,U,L,O):tt(C,_,k,!0):(H&8&&c(g,""),q&16&&ve(N,g,S,_,k,U,L,O))},Re=(i,f,g,S,_,k,U,L,O)=>{i=i||Gt,f=f||Gt;const C=i.length,H=f.length,N=Math.min(C,H);let E;for(E=0;EH?tt(i,_,k,!0,!1,N):ve(f,g,S,_,k,U,L,O,N)},Ie=(i,f,g,S,_,k,U,L,O)=>{let C=0;const H=f.length;let N=i.length-1,E=H-1;for(;C<=N&&C<=E;){const q=i[C],re=f[C]=O?ht(f[C]):ut(f[C]);if(ss(q,re))I(q,re,g,null,_,k,U,L,O);else break;C++}for(;C<=N&&C<=E;){const q=i[N],re=f[E]=O?ht(f[E]):ut(f[E]);if(ss(q,re))I(q,re,g,null,_,k,U,L,O);else break;N--,E--}if(C>N){if(C<=E){const q=E+1,re=qE)for(;C<=N;)Oe(i[C],_,k,!0),C++;else{const q=C,re=C,oe=new Map;for(C=re;C<=E;C++){const te=f[C]=O?ht(f[C]):ut(f[C]);te.key!=null&&oe.set(te.key,C)}let ge,ye=0;const we=E-re+1;let He=!1,ze=0;const h=new Array(we);for(C=0;C=we){Oe(te,_,k,!0);continue}let Ae;if(te.key!=null)Ae=oe.get(te.key);else for(ge=re;ge<=E;ge++)if(h[ge-re]===0&&ss(te,f[ge])){Ae=ge;break}Ae===void 0?Oe(te,_,k,!0):(h[Ae-re]=C+1,Ae>=ze?ze=Ae:He=!0,I(te,f[Ae],g,null,_,k,U,L,O),ye++)}const T=He?da(h):Gt;for(ge=T.length-1,C=we-1;C>=0;C--){const te=re+C,Ae=f[te],Ne=f[te+1],Xe=te+1{const{el:k,type:U,transition:L,children:O,shapeFlag:C}=i;if(C&6){ke(i.component.subTree,f,g,S);return}if(C&128){i.suspense.move(f,g,S);return}if(C&64){U.move(i,f,g,w);return}if(U===de){n(k,f,g);for(let N=0;NL.enter(k),_);else{const{leave:N,delayLeave:E,afterLeave:q}=L,re=()=>{i.ctx.isUnmounted?l(k):n(k,f,g)},oe=()=>{k._isLeaving&&k[$r](!0),N(k,()=>{re(),q&&q()})};E?E(k,re,oe):oe()}else n(k,f,g)},Oe=(i,f,g,S=!1,_=!1)=>{const{type:k,props:U,ref:L,children:O,dynamicChildren:C,shapeFlag:H,patchFlag:N,dirs:E,cacheIndex:q,memo:re}=i;if(N===-2&&(_=!1),L!=null&&(_t(),as(L,null,g,i,!0),wt()),q!=null&&(f.renderCache[q]=void 0),H&256){f.ctx.deactivate(i);return}const oe=H&1&&E,ge=!is(i);let ye;if(ge&&(ye=U&&U.onVnodeBeforeUnmount)&&rt(ye,f,i),H&6)At(i.component,g,S);else{if(H&128){i.suspense.unmount(g,S);return}oe&&Mt(i,null,f,"beforeUnmount"),H&64?i.type.remove(i,f,g,w,S):C&&!C.hasOnce&&(k!==de||N>0&&N&64)?tt(C,f,g,!1,!0):(k===de&&N&384||!_&&H&16)&&tt(O,f,g),S&>(i)}const we=re!=null&&q==null;(ge&&(ye=U&&U.onVnodeUnmounted)||oe||we)&&Ke(()=>{ye&&rt(ye,f,i),oe&&Mt(i,null,f,"unmounted"),we&&(i.el=null)},g)},gt=i=>{const{type:f,el:g,anchor:S,transition:_}=i;if(f===de){Rt(g,S);return}if(f===Cs){P(i);return}const k=()=>{l(g),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(i.shapeFlag&1&&_&&!_.persisted){const{leave:U,delayLeave:L}=_,O=()=>U(g,k);L?L(i.el,k,O):O()}else k()},Rt=(i,f)=>{let g;for(;i!==f;)g=v(i),l(i),i=g;l(f)},At=(i,f,g)=>{const{bum:S,scope:_,job:k,subTree:U,um:L,m:O,a:C}=i;zn(O),zn(C),S&&ks(S),_.stop(),k&&(k.flags|=8,Oe(U,i,f,g)),L&&Ke(L,f),Ke(()=>{i.isUnmounted=!0},f)},tt=(i,f,g,S=!1,_=!1,k=0)=>{for(let U=k;U{if(i.shapeFlag&6)return st(i.component.subTree);if(i.shapeFlag&128)return i.suspense.next();const f=v(i.anchor||i.el),g=f&&f[Ar];return g?v(g):f};let Ge=!1;const Je=(i,f,g)=>{let S;i==null?f._vnode&&(Oe(f._vnode,null,null,!0),S=f._vnode.component):I(f._vnode||null,i,f,null,null,null,g),f._vnode=i,Ge||(Ge=!0,Bn(S),Wl(),Ge=!1)},w={p:I,um:Oe,m:ke,r:gt,mt:ee,mc:ve,pc:ae,pbc:Se,n:st,o:e};return{render:Je,hydrate:void 0,createApp:qr(Je)}}function en({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function Ut({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ua(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function po(e,t,s=!1){const n=e.children,l=t.children;if(Y(n)&&Y(l))for(let o=0;o>1,e[s[u]]0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,a=s[o-1];o-- >0;)s[o]=a,a=t[a];return s}function go(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:go(t)}function zn(e){if(e)for(let t=0;te.__isSuspense;function ca(e,t){t&&t.pendingBranch?Y(e)?t.effects.push(...e):t.effects.push(e):vr(e)}const de=Symbol.for("v-fgt"),Gs=Symbol.for("v-txt"),It=Symbol.for("v-cmt"),Cs=Symbol.for("v-stc"),ds=[];let Ye=null;function b(e=!1){ds.push(Ye=e?null:[])}function fa(){ds.pop(),Ye=ds[ds.length-1]||null}let gs=1;function Xn(e,t=!1){gs+=e,e<0&&Ye&&t&&(Ye.hasOnce=!0)}function ho(e){return e.dynamicChildren=gs>0?Ye||Gt:null,fa(),gs>0&&Ye&&Ye.push(e),e}function x(e,t,s,n,l,o){return ho(r(e,t,s,n,l,o,!0))}function qe(e,t,s,n,l){return ho(Ve(e,t,s,n,l,!0))}function xo(e){return e?e.__v_isVNode===!0:!1}function ss(e,t){return e.type===t.type&&e.key===t.key}const vo=({key:e})=>e??null,$s=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||Ue(e)||ne(e)?{i:Qe,r:e,k:t,f:!!s}:e:null);function r(e,t=null,s=null,n=0,l=null,o=e===de?0:1,a=!1,u=!1){const d={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&vo(t),ref:t&&$s(t),scopeId:ql,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:n,dynamicProps:l,dynamicChildren:null,appContext:null,ctx:Qe};return u?(Mn(d,s),o&128&&e.normalize(d)):s&&(d.shapeFlag|=Te(s)?8:16),gs>0&&!a&&Ye&&(d.patchFlag>0||o&6)&&d.patchFlag!==32&&Ye.push(d),d}const Ve=pa;function pa(e,t=null,s=null,n=0,l=null,o=!1){if((!e||e===jr)&&(e=It),xo(e)){const u=Xt(e,t,!0);return s&&Mn(u,s),gs>0&&!o&&Ye&&(u.shapeFlag&6?Ye[Ye.indexOf(e)]=u:Ye.push(u)),u.patchFlag=-2,u}if(ka(e)&&(e=e.__vccOpts),t){t=ga(t);let{class:u,style:d}=t;u&&!Te(u)&&(t.class=Q(u)),me(d)&&(Tn(d)&&!Y(d)&&(d=Le({},d)),t.style=yn(d))}const a=Te(e)?1:bo(e)?128:Cr(e)?64:me(e)?4:ne(e)?2:0;return r(e,t,s,n,l,a,o,!0)}function ga(e){return e?Tn(e)||ro(e)?Le({},e):e:null}function Xt(e,t,s=!1,n=!1){const{props:l,ref:o,patchFlag:a,children:u,transition:d}=e,p=t?ma(l||{},t):l,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:p,key:p&&vo(p),ref:t&&t.ref?s&&o?Y(o)?o.concat($s(t)):[o,$s(t)]:$s(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:u,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==de?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:d,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xt(e.ssContent),ssFallback:e.ssFallback&&Xt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return d&&n&&En(c,d.clone(c)),c}function _e(e=" ",t=0){return Ve(Gs,null,e,t)}function Vt(e,t){const s=Ve(Cs,null,e);return s.staticCount=t,s}function B(e="",t=!1){return t?(b(),qe(It,null,e)):Ve(It,null,e)}function ut(e){return e==null||typeof e=="boolean"?Ve(It):Y(e)?Ve(de,null,e.slice()):xo(e)?ht(e):Ve(Gs,null,String(e))}function ht(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Xt(e)}function Mn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(Y(t))s=16;else if(typeof t=="object")if(n&65){const l=t.default;l&&(l._c&&(l._d=!1),Mn(e,l()),l._c&&(l._d=!0));return}else{s=32;const l=t._;!l&&!ro(t)?t._ctx=Qe:l===3&&Qe&&(Qe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:Qe},s=32):(t=String(t),n&64?(s=16,t=[_e(t)]):s=8);e.children=t,e.shapeFlag|=s}function ma(...e){const t={};for(let s=0;sFe||Qe;let Ms,mn;{const e=Bs(),t=(s,n)=>{let l;return(l=e[s])||(l=e[s]=[]),l.push(n),o=>{l.length>1?l.forEach(a=>a(o)):l[0](o)}};Ms=t("__VUE_INSTANCE_SETTERS__",s=>Fe=s),mn=t("__VUE_SSR_SETTERS__",s=>ms=s)}const vs=e=>{const t=Fe;return Ms(e),e.scope.on(),()=>{e.scope.off(),Ms(t)}},Qn=()=>{Fe&&Fe.scope.off(),Ms(null)};function yo(e){return e.vnode.shapeFlag&4}let ms=!1;function ya(e,t=!1,s=!1){t&&mn(t);const{props:n,children:l}=e.vnode,o=yo(e);ta(e,n,o,t),oa(e,l,s||t);const a=o?_a(e,t):void 0;return t&&mn(!1),a}function _a(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Br);const{setup:n}=s;if(n){_t();const l=e.setupContext=n.length>1?Sa(e):null,o=vs(e),a=xs(n,e,0,[e.props,l]),u=yl(a);if(wt(),o(),(u||e.sp)&&!is(e)&&zl(e),u){if(a.then(Qn,Qn),t)return a.then(d=>{Zn(e,d)}).catch(d=>{Vs(d,e,0)});e.asyncDep=a}else Zn(e,a)}else _o(e)}function Zn(e,t,s){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:me(t)&&(e.setupState=Vl(t)),_o(e)}function _o(e,t,s){const n=e.type;e.render||(e.render=n.render||ct);{const l=vs(e);_t();try{Fr(e)}finally{wt(),l()}}}const wa={get(e,t){return Me(e,"get",""),e[t]}};function Sa(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,wa),slots:e.slots,emit:e.emit,expose:t}}function qs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Vl(ur(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in us)return us[s](e)},has(t,s){return s in t||s in us}})):e.proxy}function ka(e){return ne(e)&&"__vccOpts"in e}const se=(e,t)=>gr(e,t,ms),Aa="3.5.32";/** +* @vue/runtime-dom v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let bn;const el=typeof window<"u"&&window.trustedTypes;if(el)try{bn=el.createPolicy("vue",{createHTML:e=>e})}catch{}const wo=bn?e=>bn.createHTML(e):e=>e,Ca="http://www.w3.org/2000/svg",$a="http://www.w3.org/1998/Math/MathML",bt=typeof document<"u"?document:null,tl=bt&&bt.createElement("template"),Ta={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const l=t==="svg"?bt.createElementNS(Ca,e):t==="mathml"?bt.createElementNS($a,e):s?bt.createElement(e,{is:s}):bt.createElement(e);return e==="select"&&n&&n.multiple!=null&&l.setAttribute("multiple",n.multiple),l},createText:e=>bt.createTextNode(e),createComment:e=>bt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>bt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,l,o){const a=s?s.previousSibling:t.lastChild;if(l&&(l===o||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),s),!(l===o||!(l=l.nextSibling)););else{tl.innerHTML=wo(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const u=tl.content;if(n==="svg"||n==="mathml"){const d=u.firstChild;for(;d.firstChild;)u.appendChild(d.firstChild);u.removeChild(d)}t.insertBefore(u,s)}return[a?a.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Pa=Symbol("_vtc");function Ia(e,t,s){const n=e[Pa];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const sl=Symbol("_vod"),Ea=Symbol("_vsh"),Oa=Symbol(""),Ra=/(?:^|;)\s*display\s*:/;function Ma(e,t,s){const n=e.style,l=Te(s);let o=!1;if(s&&!l){if(t)if(Te(t))for(const a of t.split(";")){const u=a.slice(0,a.indexOf(":")).trim();s[u]==null&&Ts(n,u,"")}else for(const a in t)s[a]==null&&Ts(n,a,"");for(const a in s)a==="display"&&(o=!0),Ts(n,a,s[a])}else if(l){if(t!==s){const a=n[Oa];a&&(s+=";"+a),n.cssText=s,o=Ra.test(s)}}else t&&e.removeAttribute("style");sl in e&&(e[sl]=o?n.display:"",e[Ea]&&(n.display="none"))}const nl=/\s*!important$/;function Ts(e,t,s){if(Y(s))s.forEach(n=>Ts(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=Ua(e,t);nl.test(s)?e.setProperty(Ot(n),s.replace(nl,""),"important"):e[n]=s}}const ll=["Webkit","Moz","ms"],tn={};function Ua(e,t){const s=tn[t];if(s)return s;let n=nt(t);if(n!=="filter"&&n in e)return tn[t]=n;n=Sl(n);for(let l=0;lsn||(ja.then(()=>sn=0),sn=Date.now());function Fa(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;pt(Va(n,s.value),t,5,[n])};return s.value=e,s.attached=Ba(),s}function Va(e,t){if(Y(t)){const s=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{s.call(e),e._stopped=!0},t.map(n=>l=>!l._stopped&&n&&n(l))}else return t}const dl=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ha=(e,t,s,n,l,o)=>{const a=l==="svg";t==="class"?Ia(e,n,a):t==="style"?Ma(e,s,n):Ls(t)?Ds(t)||Da(e,t,s,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ka(e,t,n,a))?(al(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&rl(e,t,n,a,o,t!=="value")):e._isVueCE&&(Wa(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Te(n)))?al(e,nt(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),rl(e,t,n,a))};function Ka(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&dl(t)&&ne(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const l=e.tagName;if(l==="IMG"||l==="VIDEO"||l==="CANVAS"||l==="SOURCE")return!1}return dl(t)&&Te(s)?!1:t in e}function Wa(e,t){const s=e._def.props;if(!s)return!1;const n=nt(t);return Array.isArray(s)?s.some(l=>nt(l)===n):Object.keys(s).some(l=>nt(l)===n)}const Et=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Y(t)?s=>ks(t,s):t};function Ga(e){e.target.composing=!0}function cl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const et=Symbol("_assign");function fl(e,t,s){return t&&(e=e.trim()),s&&(e=js(e)),e}const Ce={created(e,{modifiers:{lazy:t,trim:s,number:n}},l){e[et]=Et(l);const o=n||l.props&&l.props.type==="number";yt(e,t?"change":"input",a=>{a.target.composing||e[et](fl(e.value,s,o))}),(s||o)&&yt(e,"change",()=>{e.value=fl(e.value,s,o)}),t||(yt(e,"compositionstart",Ga),yt(e,"compositionend",cl),yt(e,"change",cl))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:l,number:o}},a){if(e[et]=Et(a),e.composing)return;const u=(o||e.type==="number")&&!/^0\d/.test(e.value)?js(e.value):e.value,d=t??"";if(u===d)return;const p=e.getRootNode();(p instanceof Document||p instanceof ShadowRoot)&&p.activeElement===e&&e.type!=="range"&&(n&&t===s||l&&e.value.trim()===d)||(e.value=d)}},So={deep:!0,created(e,t,s){e[et]=Et(s),yt(e,"change",()=>{const n=e._modelValue,l=Qt(e),o=e.checked,a=e[et];if(Y(n)){const u=_n(n,l),d=u!==-1;if(o&&!d)a(n.concat(l));else if(!o&&d){const p=[...n];p.splice(u,1),a(p)}}else if(Zt(n)){const u=new Set(n);o?u.add(l):u.delete(l),a(u)}else a(ko(e,o))})},mounted:pl,beforeUpdate(e,t,s){e[et]=Et(s),pl(e,t,s)}};function pl(e,{value:t,oldValue:s},n){e._modelValue=t;let l;if(Y(t))l=_n(t,n.props.value)>-1;else if(Zt(t))l=t.has(n.props.value);else{if(t===s)return;l=Pt(t,ko(e,!0))}e.checked!==l&&(e.checked=l)}const qa={created(e,{value:t},s){e.checked=Pt(t,s.props.value),e[et]=Et(s),yt(e,"change",()=>{e[et](Qt(e))})},beforeUpdate(e,{value:t,oldValue:s},n){e[et]=Et(n),t!==s&&(e.checked=Pt(t,n.props.value))}},Ft={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const l=Zt(t);yt(e,"change",()=>{const o=Array.prototype.filter.call(e.options,a=>a.selected).map(a=>s?js(Qt(a)):Qt(a));e[et](e.multiple?l?new Set(o):o:o[0]),e._assigning=!0,Pn(()=>{e._assigning=!1})}),e[et]=Et(n)},mounted(e,{value:t}){gl(e,t)},beforeUpdate(e,t,s){e[et]=Et(s)},updated(e,{value:t}){e._assigning||gl(e,t)}};function gl(e,t){const s=e.multiple,n=Y(t);if(!(s&&!n&&!Zt(t))){for(let l=0,o=e.options.length;lString(p)===String(u)):a.selected=_n(t,u)>-1}else a.selected=t.has(u);else if(Pt(Qt(a),t)){e.selectedIndex!==l&&(e.selectedIndex=l);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Qt(e){return"_value"in e?e._value:e.value}function ko(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const Nt={created(e,t,s){Ss(e,t,s,null,"created")},mounted(e,t,s){Ss(e,t,s,null,"mounted")},beforeUpdate(e,t,s,n){Ss(e,t,s,n,"beforeUpdate")},updated(e,t,s,n){Ss(e,t,s,n,"updated")}};function Ya(e,t){switch(e){case"SELECT":return Ft;case"TEXTAREA":return Ce;default:switch(t){case"checkbox":return So;case"radio":return qa;default:return Ce}}}function Ss(e,t,s,n,l){const a=Ya(e.tagName,s.props&&s.props.type)[l];a&&a(e,t,s,n)}const Ja=["ctrl","shift","alt","meta"],za={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ja.some(s=>e[`${s}Key`]&&!t.includes(s))},Xa=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((l,...o)=>{for(let a=0;a{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=(l=>{if(!("key"in l))return;const o=Ot(l.key);if(t.some(a=>a===o||Qa[a]===o))return e(l)}))},ei=Le({patchProp:Ha},Ta);let ml;function ti(){return ml||(ml=aa(ei))}const si=((...e)=>{const t=ti().createApp(...e),{mount:s}=t;return t.mount=n=>{const l=li(n);if(!l)return;const o=t._component;!ne(o)&&!o.render&&!o.template&&(o.template=l.innerHTML),l.nodeType===1&&(l.textContent="");const a=s(l,!1,ni(l));return l instanceof Element&&(l.removeAttribute("v-cloak"),l.setAttribute("data-v-app","")),a},t});function ni(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function li(e){return Te(e)?document.querySelector(e):e}const oi="/api";function ri(){return localStorage.getItem("autoteam_api_key")||""}function Us(e){localStorage.setItem("autoteam_api_key",e)}function nn(){localStorage.removeItem("autoteam_api_key")}async function K(e,t,s=null){var d;const n={"Content-Type":"application/json"},l=ri();l&&(n.Authorization=`Bearer ${l}`);const o={method:e,headers:n};s&&(o.body=JSON.stringify(s));const a=await fetch(`${oi}${t}`,o);let u;try{u=await a.json()}catch{const p=new Error(`HTTP ${a.status}: 服务器返回了非 JSON 响应`);throw p.status=a.status,p}if(!a.ok){const p=(u==null?void 0:u.message)||((d=u==null?void 0:u.detail)==null?void 0:d.message)||(u==null?void 0:u.detail)||`HTTP ${a.status}`,c=new Error(p);throw c.status=a.status,c}return u}const z={checkAuth:()=>K("GET","/auth/check"),getSetupStatus:()=>K("GET","/setup/status"),saveSetup:e=>K("POST","/setup/save",e),getRuntimeConfig:()=>K("GET","/config/runtime"),saveRuntimeConfig:e=>K("PUT","/config/runtime",e),getRuntimeConfigSource:()=>K("GET","/config/source"),saveRuntimeConfigSource:e=>K("PUT","/config/source",e),getStatus:()=>K("GET","/status"),getAdminStatus:()=>K("GET","/admin/status"),getMainCodexStatus:()=>K("GET","/main-codex/status"),getManualAccountStatus:()=>K("GET","/manual-account/status"),getAccounts:()=>K("GET","/accounts"),getActiveAccounts:()=>K("GET","/accounts/active"),getStandbyAccounts:()=>K("GET","/accounts/standby"),bulkDisableAccounts:e=>K("POST","/accounts/bulk/disable",{emails:e}),bulkEnableAccounts:e=>K("POST","/accounts/bulk/enable",{emails:e}),disableAccount:e=>K("POST",`/accounts/${encodeURIComponent(e)}/disable`),enableAccount:e=>K("POST",`/accounts/${encodeURIComponent(e)}/enable`),deleteAccount:e=>K("DELETE",`/accounts/${encodeURIComponent(e)}`),loginAccount:e=>K("POST","/accounts/login",{email:e}),getCodexAuth:e=>K("GET",`/accounts/${encodeURIComponent(e)}/codex-auth`),kickAccount:e=>K("POST",`/accounts/${encodeURIComponent(e)}/kick`),getCpaFiles:()=>K("GET","/cpa/files"),startAdminLogin:e=>K("POST","/admin/login/start",{email:e}),submitAdminSession:(e,t)=>K("POST","/admin/login/session",{email:e,session_token:t}),submitAdminPassword:e=>K("POST","/admin/login/password",{password:e}),submitAdminCode:e=>K("POST","/admin/login/code",{code:e}),submitAdminWorkspace:e=>K("POST","/admin/login/workspace",{option_id:e}),cancelAdminLogin:()=>K("POST","/admin/login/cancel"),logoutAdmin:()=>K("POST","/admin/logout"),startMainCodexLogin:()=>K("POST","/main-codex/login"),startMainCodexSync:()=>K("POST","/main-codex/start"),submitMainCodexPassword:e=>K("POST","/main-codex/password",{password:e}),submitMainCodexCode:e=>K("POST","/main-codex/code",{code:e}),cancelMainCodexSync:()=>K("POST","/main-codex/cancel"),deleteMainCodexFromRemoteFiles:()=>K("POST","/main-codex/delete-remote-files"),startManualAccount:()=>K("POST","/manual-account/start"),submitManualAccountCallback:e=>K("POST","/manual-account/callback",{redirect_url:e}),cancelManualAccount:()=>K("POST","/manual-account/cancel"),postSync:()=>K("POST","/sync"),postSyncFromCpa:()=>K("POST","/sync/from-cpa"),postSyncAccounts:()=>K("POST","/sync/accounts"),postSyncMainCodex:()=>K("POST","/sync/main-codex"),startRotate:(e=5)=>K("POST","/tasks/rotate",{target:e}),startCheck:()=>K("POST","/tasks/check"),startAdd:()=>K("POST","/tasks/add"),startFill:(e=5)=>K("POST","/tasks/fill",{target:e}),startCleanup:(e=null)=>K("POST","/tasks/cleanup",{max_seats:e}),startResetQuota:()=>K("POST","/tasks/reset-quota"),getTasks:()=>K("GET","/tasks"),getTask:e=>K("GET",`/tasks/${e}`),getAutoCheckConfig:()=>K("GET","/config/auto-check"),setAutoCheckConfig:e=>K("PUT","/config/auto-check",e),getTeamMembers:()=>K("GET","/team/members"),removeTeamMember:e=>K("POST","/team/members/remove",e),getLogs:(e=100,t=0)=>K("GET",`/logs?limit=${e}&since=${t}`)},ai={class:"relative min-h-screen overflow-hidden"},ii={class:"relative mx-auto flex min-h-screen max-w-6xl items-center px-4 py-10"},ui={class:"grid w-full items-center gap-8 lg:grid-cols-[1.05fr_0.95fr]"},di={class:"glass-card w-full p-7 sm:p-8"},ci={class:"space-y-4"},fi={class:"mb-2 block text-sm font-medium text-slate-300"},pi={key:0,class:"text-red-400"},gi={key:1,class:"ml-1 text-xs text-slate-500"},mi=["onUpdate:modelValue","type","placeholder"],bi=["disabled"],hi={__name:"SetupPage",emits:["configured"],setup(e,{emit:t}){const s=t,n=M([]),l=hs({}),o=M(!1),a=M(""),u=M("");Ht(async()=>{try{const p=await z.getSetupStatus();n.value=p.fields;for(const c of p.fields)l[c.key]=c.default||""}catch(p){a.value="获取配置状态失败: "+p.message,u.value="bg-red-500/10 text-red-400 border-red-500/20"}});async function d(){o.value=!0,a.value="";try{const p=await z.saveSetup({...l});p.api_key&&Us(p.api_key),a.value=p.message,u.value="bg-green-500/10 text-green-400 border-green-500/20",setTimeout(()=>s("configured"),1e3)}catch(p){a.value=p.message,u.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{o.value=!1}}return(p,c)=>(b(),x("div",ai,[c[3]||(c[3]=r("div",{class:"pointer-events-none absolute inset-0"},[r("div",{class:"absolute left-[-6rem] top-[-6rem] h-72 w-72 rounded-full bg-blue-500/20 blur-3xl"}),r("div",{class:"absolute bottom-[-8rem] right-[-4rem] h-80 w-80 rounded-full bg-cyan-500/15 blur-3xl"})],-1)),r("div",ii,[r("div",ui,[c[2]||(c[2]=Vt('',1)),r("div",di,[c[0]||(c[0]=r("div",{class:"mb-6 flex items-center gap-3"},[r("div",{class:"flex h-12 w-12 items-center justify-center rounded-2xl bg-gradient-to-br from-blue-500/30 to-cyan-500/20 text-2xl shadow-inner shadow-white/10"}," 🔑 "),r("div",null,[r("h2",{class:"text-2xl font-semibold text-white"},"AutoTeam 初始配置"),r("p",{class:"mt-1 text-sm text-slate-400"},"完成这一项后即可进入控制面板")])],-1)),a.value?(b(),x("div",{key:0,class:Q(["mb-4 rounded-2xl px-4 py-3 text-sm border",u.value])},y(a.value),3)):B("",!0),r("div",ci,[(b(!0),x(de,null,$e(n.value,m=>(b(),x("div",{key:m.key,class:"rounded-2xl border border-white/10 bg-white/5 p-4"},[r("label",fi,[_e(y(m.prompt)+" ",1),m.optional?B("",!0):(b(),x("span",pi,"*")),m.key==="API_KEY"?(b(),x("span",gi,"(留空自动生成)")):B("",!0)]),ue(r("input",{"onUpdate:modelValue":v=>l[m.key]=v,type:m.key.includes("PASSWORD")||m.key.includes("KEY")?"password":"text",placeholder:m.default||"",class:"input-dark"},null,8,mi),[[Nt,l[m.key]]])]))),128))]),r("button",{onClick:d,disabled:o.value,class:"btn-primary mt-6 w-full py-3"},y(o.value?"保存中...":"保存并进入面板"),9,bi),c[1]||(c[1]=r("div",{class:"mt-4 rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-xs leading-6 text-slate-400"}," 保存后你可以继续去配置面板补充 CloudMail、CPA / Sub2API、代理以及巡检参数。 ",-1))])])])]))}},xi={class:"sticky top-0 hidden min-h-screen w-72 shrink-0 flex-col border-r border-white/10 bg-slate-950/65 p-5 backdrop-blur-2xl md:flex"},vi={class:"flex-1 space-y-2"},yi=["onClick"],_i={class:"min-w-0 flex-1"},wi={class:"block text-sm font-medium"},Si={class:"mt-0.5 block text-xs text-slate-500 group-hover:text-slate-400"},ki={class:"space-y-2 border-t border-white/10 pt-5"},Ai=["disabled"],Ci={class:"fixed bottom-3 left-3 right-3 z-50 flex rounded-3xl border border-white/10 bg-slate-950/80 p-1.5 shadow-[0_20px_40px_-20px_rgba(15,23,42,0.9)] backdrop-blur-2xl md:hidden"},$i=["onClick"],Ti={class:"flex flex-col items-center"},Pi={class:"text-lg"},Ii={class:"mt-0.5"},Ei={__name:"Sidebar",props:{active:String,loading:Boolean,authRequired:Boolean},emits:["navigate","refresh","logout"],setup(e){const t=[{key:"dashboard",icon:"📊",label:"仪表盘",mobileLabel:"仪表盘",hint:"概览账号池与状态"},{key:"config",icon:"🧩",label:"配置面板",mobileLabel:"配置",hint:"统一编辑系统配置"},{key:"team",icon:"👥",label:"Team 成员",mobileLabel:"成员",hint:"查看与管理成员"},{key:"pool",icon:"🔁",label:"账号池操作",mobileLabel:"账号池",hint:"轮转、补位与清理"},{key:"sync",icon:"🔄",label:"同步中心",mobileLabel:"同步",hint:"同步本地、远端与状态"},{key:"oauth",icon:"🔐",label:"OAuth 登录",mobileLabel:"OAuth",hint:"手动接管 OAuth 流程"},{key:"tasks",icon:"📜",label:"任务历史",mobileLabel:"任务",hint:"追踪任务执行结果"},{key:"logs",icon:"📋",label:"日志",mobileLabel:"日志",hint:"查看实时运行日志"}];return(s,n)=>(b(),x(de,null,[r("nav",xi,[n[4]||(n[4]=Vt('

AutoTeam

账号轮转管理中心

面板在线

统一查看仪表盘、配置、同步、OAuth 和日志。

',1)),r("div",vi,[(b(),x(de,null,$e(t,l=>r("button",{key:l.key,onClick:o=>s.$emit("navigate",l.key),class:Q(["group flex w-full items-center gap-3 rounded-2xl px-3 py-3 text-left transition",e.active===l.key?"bg-blue-500/15 text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.05)] ring-1 ring-blue-400/20":"text-slate-400 hover:bg-white/5 hover:text-white"])},[r("span",{class:Q(["flex h-11 w-11 items-center justify-center rounded-2xl border text-lg transition",e.active===l.key?"border-blue-400/20 bg-blue-500/15 text-blue-200":"border-white/10 bg-white/5 text-slate-300 group-hover:border-white/20 group-hover:bg-white/10"])},y(l.icon),3),r("span",_i,[r("span",wi,y(l.label),1),r("span",Si,y(l.hint),1)]),r("span",{class:Q(["h-2.5 w-2.5 rounded-full transition",e.active===l.key?"bg-cyan-300 shadow-[0_0_14px_rgba(103,232,249,0.9)]":"bg-slate-700 group-hover:bg-slate-500"])},null,2)],10,yi)),64))]),r("div",ki,[r("button",{onClick:n[0]||(n[0]=l=>s.$emit("refresh")),disabled:e.loading,class:"btn-secondary w-full justify-start gap-3 rounded-2xl px-3 py-3 text-left disabled:opacity-50"},[n[2]||(n[2]=r("span",{class:"text-base"},"🔄",-1)),_e(" "+y(e.loading?"刷新中...":"刷新数据"),1)],8,Ai),e.authRequired?(b(),x("button",{key:0,onClick:n[1]||(n[1]=l=>s.$emit("logout")),class:"btn-danger w-full justify-start gap-3 rounded-2xl px-3 py-3 text-left"},[...n[3]||(n[3]=[r("span",{class:"text-base"},"🚪",-1),_e(" 登出 ",-1)])])):B("",!0)])]),r("nav",Ci,[(b(),x(de,null,$e(t,l=>r("button",{key:l.key,onClick:o=>s.$emit("navigate",l.key),class:Q(["flex-1 rounded-2xl px-1 py-2 text-xs transition",e.active===l.key?"bg-blue-500/15 text-blue-300":"text-slate-500"])},[r("div",Ti,[r("span",Pi,y(l.icon),1),r("span",Ii,y(l.mobileLabel||l.label),1)])],10,$i)),64))])],64))}},Oi={key:0},Ri={class:"grid grid-cols-2 sm:grid-cols-3 xl:grid-cols-6 gap-4 mb-6"},Mi={class:"text-sm text-gray-400"},Ui={class:"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},Li={class:"px-4 py-3 border-b border-gray-800 flex items-center justify-between"},Di={class:"flex items-center gap-2"},Ni={key:0,class:"text-xs text-fuchsia-300"},ji=["disabled"],Bi=["disabled"],Fi=["disabled"],Vi=["disabled"],Hi={key:1,class:"mx-4 mt-4 px-4 py-3 rounded-lg text-sm border bg-amber-500/10 text-amber-300 border-amber-500/20"},Ki={class:"overflow-x-auto"},Wi={class:"w-full text-sm"},Gi={class:"text-gray-400 text-left border-b border-gray-800"},qi={class:"px-4 py-3 font-medium w-10"},Yi=["checked","disabled"],Ji={class:"px-4 py-3"},zi=["checked","disabled","onChange"],Xi={class:"px-4 py-3 text-gray-500"},Qi={class:"px-4 py-3 font-mono text-xs text-slate-200"},Zi={class:"px-4 py-3"},eu={class:"px-4 py-3 text-gray-400 text-xs"},tu={class:"px-4 py-3 text-gray-400 text-xs"},su={class:"px-4 py-3 text-right space-x-2"},nu=["onClick","disabled"],lu=["onClick","disabled"],ou=["onClick","disabled"],ru=["onClick","disabled"],au=["onClick","disabled"],iu={class:"bg-gray-900 border border-gray-800 rounded-xl w-full max-w-2xl max-h-[80vh] flex flex-col"},uu={class:"px-4 py-3 border-b border-gray-800 flex items-center justify-between"},du={class:"p-4 space-y-3 overflow-y-auto flex-1"},cu={class:"relative"},fu={class:"bg-gray-950 border border-gray-800 rounded-lg p-4 text-xs font-mono text-gray-300 overflow-x-auto whitespace-pre"},pu={class:"px-4 py-3 border-t border-gray-800 flex justify-end gap-3"},gu={key:1,class:"space-y-4"},mu={class:"grid grid-cols-2 sm:grid-cols-4 gap-4"},bu={__name:"Dashboard",props:{status:Object,loading:Boolean,runningTask:Object,adminStatus:{type:Object,default:null}},emits:["refresh","task-started"],setup(e,{emit:t}){const s=e,n=t,l=M(""),o=M(""),a=M(!1),u=M(!1),d=M(!1),p=M(""),c=M(null),m=M(!1),v=M(""),$=M([]),j=se(()=>{var i;return!!((i=s.adminStatus)!=null&&i.configured)}),I=se(()=>!!s.runningTask||!j.value||d.value),D=se(()=>a.value||I.value),F=se(()=>u.value||!!s.runningTask),V=se(()=>{var i;return(((i=s.status)==null?void 0:i.accounts)||[]).filter(X)}),G=se(()=>V.value.filter(i=>$.value.includes(i.email)&&!i.disabled)),P=se(()=>V.value.filter(i=>$.value.includes(i.email)&&i.disabled)),Z=se(()=>!!V.value.length&&$.value.length===V.value.length),W=se(()=>I.value||!G.value.length),le=se(()=>I.value||!P.value.length),ve=se(()=>{if(!s.status)return[];const i=s.status.summary;return[{label:"活跃",value:i.active,color:"text-green-400"},{label:"待修复",value:i.auth_pending||0,color:"text-cyan-400"},{label:"待命",value:i.standby,color:"text-yellow-400"},{label:"额度用完",value:i.exhausted,color:"text-red-400"},{label:"禁用",value:i.disabled||0,color:"text-fuchsia-400"},{label:"总计",value:i.total,color:"text-white"}]});function Pe(i){return{active:"bg-green-500/10 text-green-400",auth_pending:"bg-cyan-500/10 text-cyan-400",exhausted:"bg-red-500/10 text-red-400",standby:"bg-yellow-500/10 text-yellow-400",disabled:"bg-fuchsia-500/10 text-fuchsia-400",pending:"bg-gray-500/10 text-gray-400"}[i]||"bg-gray-500/10 text-gray-400"}function Se(i){return{active:"bg-green-400",auth_pending:"bg-cyan-400",exhausted:"bg-red-400",standby:"bg-yellow-400",disabled:"bg-fuchsia-400",pending:"bg-gray-400"}[i]||"bg-gray-400"}function J(i){return{active:"Active",auth_pending:"Auth pending",exhausted:"Used up",standby:"Standby",disabled:"Disabled",pending:"Pending"}[i]||i}function X(i){return!!i&&!i.is_main_account}function Ee(i){return $.value.includes(i)}function ee(i,f){if(i){if(f){$.value.includes(i)||($.value=[...$.value,i]);return}$.value=$.value.filter(g=>g!==i)}}function De(i){$.value=i?V.value.map(f=>f.email):[]}$t(()=>{var i;return(i=s.status)==null?void 0:i.accounts},i=>{const f=new Set((i||[]).filter(X).map(g=>g.email));$.value=$.value.filter(g=>f.has(g))},{immediate:!0});function he(i,f){var _,k;const g=((k=(_=s.status)==null?void 0:_.quota_cache)==null?void 0:k[i.email])||i.last_quota;return g?100-((f==="primary"?g.primary_pct:g.weekly_pct)||0):null}function ie(i,f){const g=he(i,f);return g!==null?`${g}%`:"-"}function ae(i,f){var k,U;const g=((U=(k=s.status)==null?void 0:k.quota_cache)==null?void 0:U[i.email])||i.last_quota;if(!g)return"-";const S=f==="primary"?g.primary_resets_at:g.weekly_resets_at;if(!S)return"-";const _=new Date(S*1e3);return`${String(_.getMonth()+1).padStart(2,"0")}-${String(_.getDate()).padStart(2,"0")} ${String(_.getHours()).padStart(2,"0")}:${String(_.getMinutes()).padStart(2,"0")}`}function Re(i){return i===null?"text-gray-500":i>30?"text-green-400":i>0?"text-yellow-400":"text-red-400"}const Ie=se(()=>c.value?JSON.stringify(c.value.codex_auth,null,2):"");async function ke(i){try{c.value=await z.getCodexAuth(i),m.value=!1}catch(f){p.value=f.message,v.value="bg-red-500/10 text-red-400 border-red-500/20",setTimeout(()=>{p.value=""},8e3)}}async function Oe(){try{await navigator.clipboard.writeText(Ie.value)}catch{const i=document.createElement("textarea");i.value=Ie.value,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i)}m.value=!0,setTimeout(()=>{m.value=!1},3e3)}function gt(){const i=new Blob([Ie.value],{type:"application/json"}),f=URL.createObjectURL(i),g=document.createElement("a");g.href=f,g.download="auth.json",g.click(),URL.revokeObjectURL(f)}async function Rt(){if(!D.value){a.value=!0,p.value="";try{const i=await z.postSyncAccounts();p.value=i.message||"同步完成",v.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(i){p.value=i.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{a.value=!1,setTimeout(()=>{p.value=""},8e3)}}}async function At(){if(!(F.value||!window.confirm(`确认清空所有托管非主号账号的本地额度恢复记录吗? + +这会清空 last_quota / quota_resets_at / quota_exhausted_at,并把 exhausted 账号恢复为可检查状态。 +不会自动执行轮转或检查。`))){u.value=!0,p.value="";try{const f=await z.startResetQuota();p.value=`任务已提交: ${f.task_id}`,v.value="bg-blue-500/10 text-blue-400 border-blue-500/20",n("task-started")}catch(f){p.value=f.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{u.value=!1,setTimeout(()=>{p.value=""},8e3)}}}async function tt(i){if(!I.value){l.value=i,o.value="login",p.value="";try{const f=await z.loginAccount(i);p.value=`已提交 ${i} 的登录任务: ${f.task_id}`,v.value="bg-blue-500/10 text-blue-400 border-blue-500/20",n("refresh")}catch(f){p.value=f.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{p.value=""},8e3)}}}async function st(i){if(!(I.value||!window.confirm(`确认将 ${i} 移出 Team? +账号会变为 standby 状态,额度恢复后可重新复用。`))){l.value=i,o.value="kick",p.value="";try{const g=await z.kickAccount(i);p.value=g.message||`已将 ${i} 移出 Team`,v.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(g){p.value=g.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{p.value=""},8e3)}}}async function Ge(i){if(I.value)return;const f=!i.disabled;if(window.confirm(f?`确认禁用账号 ${i.email}? +禁用后自动巡检、轮转和远端同步都会跳过该账号。`:`确认启用账号 ${i.email}? +启用后该账号会重新参与自动巡检、轮转和远端同步。`)){l.value=i.email,o.value=f?"disable":"enable",p.value="";try{const S=f?await z.disableAccount(i.email):await z.enableAccount(i.email);p.value=S.message||`${f?"已禁用":"已启用"} ${i.email}`,v.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(S){p.value=S.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{p.value=""},8e3)}}}async function Je(){if(W.value)return;const i=G.value.map(g=>g.email);if(window.confirm(`确认批量禁用这 ${i.length} 个账号吗? +禁用后自动巡检、轮转和远端同步都会跳过它们。`)){d.value=!0,p.value="";try{const g=await z.bulkDisableAccounts(i);p.value=g.message||`已禁用 ${i.length} 个账号`,v.value="bg-green-500/10 text-green-400 border-green-500/20",$.value=[],n("refresh")}catch(g){p.value=g.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{d.value=!1,setTimeout(()=>{p.value=""},8e3)}}}async function w(){if(le.value)return;const i=P.value.map(g=>g.email);if(window.confirm(`确认批量启用这 ${i.length} 个账号吗? +启用后它们会重新参与自动巡检、轮转和远端同步。`)){d.value=!0,p.value="";try{const g=await z.bulkEnableAccounts(i);p.value=g.message||`已启用 ${i.length} 个账号`,v.value="bg-green-500/10 text-green-400 border-green-500/20",$.value=[],n("refresh")}catch(g){p.value=g.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{d.value=!1,setTimeout(()=>{p.value=""},8e3)}}}async function A(i){if(!(I.value||!window.confirm(`确认删除账号 ${i}? +这会同时清理本地记录、已配置远端、Team/Invite 和 CloudMail。`))){l.value=i,o.value="delete",p.value="";try{const g=await z.deleteAccount(i);p.value=g.message||`已删除 ${i}`,v.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(g){p.value=g.message,v.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{p.value=""},8e3)}}}return(i,f)=>e.status?(b(),x("div",Oi,[r("div",Ri,[(b(!0),x(de,null,$e(ve.value,g=>(b(),x("div",{key:g.label,class:"bg-gray-900 border border-gray-800 rounded-xl p-4"},[r("div",Mi,y(g.label),1),r("div",{class:Q(["text-3xl font-bold mt-1",g.color])},y(g.value),3)]))),128))]),r("div",Ui,[r("div",Li,[f[4]||(f[4]=r("h2",{class:"text-lg font-semibold text-white"},"账号列表",-1)),r("div",Di,[$.value.length?(b(),x("div",Ni," 已选 "+y($.value.length)+" 个 ",1)):B("",!0),r("button",{onClick:Je,disabled:W.value,class:Q(["px-3 py-1.5 text-xs rounded-lg border transition disabled:opacity-50",W.value?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-fuchsia-600/10 text-fuchsia-400 border-fuchsia-500/30 hover:bg-fuchsia-600/20"])},y(d.value?"批量处理中...":`一键禁用${G.value.length?`(${G.value.length})`:""}`),11,ji),r("button",{onClick:w,disabled:le.value,class:Q(["px-3 py-1.5 text-xs rounded-lg border transition disabled:opacity-50",le.value?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-emerald-600/10 text-emerald-400 border-emerald-500/30 hover:bg-emerald-600/20"])},y(d.value?"批量处理中...":`一键启用${P.value.length?`(${P.value.length})`:""}`),11,Bi),r("button",{onClick:At,disabled:F.value,class:Q(["btn-secondary px-3 py-1.5 text-xs disabled:opacity-50",F.value?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"hover:text-white"])},y(u.value?"提交中...":"重置额度恢复记录"),11,Fi),r("button",{onClick:Rt,disabled:D.value,class:"px-3 py-1.5 bg-gray-800 hover:bg-gray-700 text-xs rounded-lg border border-gray-700 transition disabled:opacity-50 text-gray-400 hover:text-white"},y(a.value?"同步中...":"同步账号"),9,Vi)])]),p.value?(b(),x("div",{key:0,class:Q(["mx-4 mt-4 px-4 py-3 rounded-lg text-sm border",v.value])},y(p.value),3)):B("",!0),j.value?B("",!0):(b(),x("div",Hi," 请先在「配置面板」页完成管理员登录后,才能操作账号;“重置额度恢复记录”可单独使用。 ")),r("div",Ki,[r("table",Wi,[r("thead",null,[r("tr",Gi,[r("th",qi,[r("input",{type:"checkbox",checked:Z.value,disabled:!V.value.length||I.value,onChange:f[0]||(f[0]=g=>De(g.target.checked)),class:"h-4 w-4 rounded border-gray-700 bg-gray-900 text-fuchsia-500 focus:ring-fuchsia-500 disabled:opacity-40"},null,40,Yi)]),f[5]||(f[5]=r("th",{class:"px-4 py-3 font-medium"},"#",-1)),f[6]||(f[6]=r("th",{class:"px-4 py-3 font-medium"},"邮箱",-1)),f[7]||(f[7]=r("th",{class:"px-4 py-3 font-medium"},"状态",-1)),f[8]||(f[8]=r("th",{class:"px-4 py-3 font-medium text-right"},"5h 剩余",-1)),f[9]||(f[9]=r("th",{class:"px-4 py-3 font-medium text-right"},"周 剩余",-1)),f[10]||(f[10]=r("th",{class:"px-4 py-3 font-medium"},"5h 重置",-1)),f[11]||(f[11]=r("th",{class:"px-4 py-3 font-medium"},"周 重置",-1)),f[12]||(f[12]=r("th",{class:"px-4 py-3 font-medium text-right"},"操作",-1))])]),r("tbody",null,[(b(!0),x(de,null,$e(e.status.accounts,(g,S)=>(b(),x("tr",{key:g.email,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",Ji,[r("input",{type:"checkbox",checked:Ee(g.email),disabled:!X(g)||I.value,onChange:_=>ee(g.email,_.target.checked),class:"h-4 w-4 rounded border-gray-700 bg-gray-900 text-fuchsia-500 focus:ring-fuchsia-500 disabled:opacity-40"},null,40,zi)]),r("td",Xi,y(S+1),1),r("td",Qi,y(g.email),1),r("td",Zi,[r("span",{class:Q(["inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium",Pe(g.status)])},[r("span",{class:Q(["w-1.5 h-1.5 rounded-full",Se(g.status)])},null,2),_e(" "+y(J(g.status)),1)],2)]),r("td",{class:Q(["px-4 py-3 text-right font-mono",Re(he(g,"primary"))])},y(ie(g,"primary")),3),r("td",{class:Q(["px-4 py-3 text-right font-mono",Re(he(g,"weekly"))])},y(ie(g,"weekly")),3),r("td",eu,y(ae(g,"primary")),1),r("td",tu,y(ae(g,"weekly")),1),r("td",su,[!g.is_main_account&&!g.disabled&&g.raw_status!=="active"?(b(),x("button",{key:0,onClick:_=>tt(g.email),disabled:I.value||l.value===g.email,class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",I.value||l.value===g.email?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-blue-600/10 text-blue-400 border-blue-500/30 hover:bg-blue-600/20"])},y(l.value===g.email&&o.value==="login"?"登录中...":"登录"),11,nu)):B("",!0),!g.is_main_account&&["active","auth_pending","exhausted"].includes(g.raw_status)?(b(),x("button",{key:1,onClick:_=>st(g.email),disabled:I.value||l.value===g.email,class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",I.value||l.value===g.email?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-amber-600/10 text-amber-400 border-amber-500/30 hover:bg-amber-600/20"])},y(l.value===g.email&&o.value==="kick"?"移出中...":"移出"),11,lu)):B("",!0),g.raw_status==="active"||g.is_main_account?(b(),x("button",{key:2,onClick:_=>ke(g.email),disabled:l.value===g.email,class:"px-3 py-1.5 rounded-lg text-xs font-medium border transition bg-cyan-600/10 text-cyan-400 border-cyan-500/30 hover:bg-cyan-600/20"}," 导出 ",8,ou)):B("",!0),g.is_main_account?B("",!0):(b(),x("button",{key:3,onClick:_=>Ge(g),disabled:I.value||l.value===g.email,class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",I.value||l.value===g.email?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":g.disabled?"bg-emerald-600/10 text-emerald-400 border-emerald-500/30 hover:bg-emerald-600/20":"bg-fuchsia-600/10 text-fuchsia-400 border-fuchsia-500/30 hover:bg-fuchsia-600/20"])},y(l.value===g.email&&o.value===(g.disabled?"enable":"disable")?g.disabled?"启用中...":"禁用中...":g.disabled?"启用":"禁用"),11,ru)),g.is_main_account?B("",!0):(b(),x("button",{key:4,onClick:_=>A(g.email),disabled:I.value||l.value===g.email,class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",I.value||l.value===g.email?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-rose-600/10 text-rose-400 border-rose-500/30 hover:bg-rose-600/20"])},y(l.value===g.email&&o.value==="delete"?"删除中...":"删除"),11,au))])]))),128))])])]),c.value?(b(),x("div",{key:2,class:"fixed inset-0 bg-black/60 z-50 flex items-center justify-center p-4",onClick:f[3]||(f[3]=Xa(g=>c.value=null,["self"]))},[r("div",iu,[r("div",uu,[f[13]||(f[13]=r("h3",{class:"text-white font-semibold"},"Codex CLI 认证文件",-1)),r("button",{onClick:f[1]||(f[1]=g=>c.value=null),class:"text-gray-400 hover:text-white text-lg"},"×")]),r("div",du,[f[14]||(f[14]=Vt('
使用步骤:
  1. 退出当前 Codex CLI 会话
  2. 删除旧文件:rm ~/.codex/auth.json
  3. 将下方内容保存到 ~/.codex/auth.json(Windows: %APPDATA%\\codex\\auth.json
  4. 重新启动 Codex CLI
导出后 Codex CLI 直连 OpenAI,不走 CPA 代理,响应更快。
',1)),r("div",cu,[r("pre",fu,y(Ie.value),1),r("button",{onClick:Oe,class:Q(["absolute top-2 right-2 px-2 py-1 rounded border text-xs transition",m.value?"bg-green-600/20 text-green-400 border-green-500/30":"bg-gray-800 hover:bg-gray-700 text-gray-400 hover:text-white border-gray-700"])},y(m.value?"复制成功":"复制"),3)])]),r("div",pu,[r("button",{onClick:gt,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition"}," 下载 auth.json "),r("button",{onClick:f[2]||(f[2]=g=>c.value=null),class:"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-sm text-gray-300 rounded-lg border border-gray-700 transition"}," 关闭 ")])])])):B("",!0)])])):e.loading?(b(),x("div",gu,[r("div",mu,[(b(),x(de,null,$e(4,g=>r("div",{key:g,class:"bg-gray-900 border border-gray-800 rounded-xl p-4 h-20 animate-pulse"})),64))]),f[15]||(f[15]=r("div",{class:"bg-gray-900 border border-gray-800 rounded-xl h-64 animate-pulse"},null,-1))])):B("",!0)}},hu={class:"space-y-6"},xu={key:0,class:"glass-card p-5"},vu={class:"flex items-center justify-between gap-4 mb-4"},yu={key:1,class:"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm"},_u={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg"},wu={class:"font-mono text-white break-all"},Su={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg"},ku={class:"font-mono text-white break-all"},Au={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},Cu={class:"text-white"},$u={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},Tu={key:0,class:"text-green-400 text-xs"},Pu={key:1,class:"space-y-2"},Iu={class:"space-y-2"},Eu={class:"flex justify-end"},Ou=["disabled"],Ru={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},Mu={class:"text-white"},Uu={key:2,class:"mt-4"},Lu={key:0,class:"space-y-4"},Du={class:"flex flex-col sm:flex-row gap-3"},Nu=["disabled"],ju={class:"border border-gray-800 rounded-xl p-4 bg-gray-800/30"},Bu={class:"space-y-3"},Fu={class:"flex justify-end"},Vu=["disabled"],Hu={key:1,class:"flex flex-wrap gap-3"},Ku=["disabled"],Wu=["disabled"],Gu=["disabled"],qu=["disabled"],Yu={key:3,class:"space-y-4"},Ju={class:"text-sm text-gray-300"},zu={class:"font-mono"},Xu={key:0,class:"flex flex-col sm:flex-row gap-3"},Qu=["disabled"],Zu=["disabled"],ed={key:1,class:"flex flex-col sm:flex-row gap-3"},td=["disabled"],sd=["disabled"],nd={key:2,class:"space-y-3"},ld=["disabled"],od=["value"],rd=["disabled"],ad={key:3,class:"text-xs text-blue-300"},id={class:"flex justify-end"},ud=["disabled"],dd={key:4,class:"mt-4 space-y-4 border-t border-gray-800 pt-4"},cd={class:"text-sm text-gray-300"},fd={key:0,class:"flex flex-col sm:flex-row gap-3"},pd=["disabled"],gd=["disabled"],md={key:1,class:"flex flex-col sm:flex-row gap-3"},bd=["disabled"],hd=["disabled"],xd={key:2,class:"text-xs text-cyan-300"},vd={class:"flex justify-end"},yd=["disabled"],_d={key:1,class:"glass-card p-5"},wd={class:"flex items-center justify-between mb-4"},Sd={key:0,class:"text-xs text-green-400 transition"},kd={class:"grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-6"},Ad={class:"flex items-center gap-2"},Cd={class:"flex items-center gap-2"},$d={class:"flex items-center gap-2"},Td={class:"flex items-center gap-2"},Pd={class:"flex items-center gap-2"},Id={class:"mt-3 flex items-center justify-between gap-3"},Ed={class:"text-xs text-gray-500"},Od={key:0},Rd=["disabled"],Md={key:0,class:"mt-4 rounded-2xl border border-amber-500/20 bg-amber-500/10 px-4 py-3 text-xs leading-6 text-amber-200"},bl={__name:"Settings",props:{adminStatus:{type:Object,default:null},codexStatus:{type:Object,default:null},section:{type:String,default:"all"}},emits:["refresh","admin-progress"],setup(e,{emit:t}){const s=e,n=t,l=M({interval:5,target_seats:5,threshold:10,min_low:2,retry_add_phone:!0,add_phone_max_retries:3,skip_standby_reuse:!1}),o=M(!1),a=M(!1),u=M(""),d=M(""),p=M(""),c=M(""),m=M(""),v=M(""),$=M(""),j=M(""),I=M(""),D=M(!1),F=M(!1),V=M(""),G=M(!1),P=M(""),Z=M(""),W=M(""),le=M(""),ve=se(()=>{var w;return!!((w=s.adminStatus)!=null&&w.configured)}),Pe=se(()=>{var w;return!!((w=s.adminStatus)!=null&&w.login_in_progress)}),Se=se(()=>{var w;return!!((w=s.codexStatus)!=null&&w.in_progress)}),J=se(()=>{var w;return((w=s.codexStatus)==null?void 0:w.action)==="sync"?"同步":"登录"}),X=se(()=>s.section!=="auto-check"),Ee=se(()=>s.section!=="admin");$t(()=>s.adminStatus,w=>{var A,i,f;if(w!=null&&w.configured&&w.email&&(u.value=w.email,d.value=w.email),w!=null&&w.login_in_progress||(c.value="",m.value="",v.value="",W.value="",$.value=(w==null?void 0:w.email)||$.value),(w==null?void 0:w.login_step)==="workspace_required"&&!v.value){const g=(A=w==null?void 0:w.workspace_options)==null?void 0:A.find(S=>S.kind==="preferred");v.value=(g==null?void 0:g.id)||((f=(i=w==null?void 0:w.workspace_options)==null?void 0:i[0])==null?void 0:f.id)||""}},{immediate:!0}),$t(()=>s.codexStatus,w=>{w!=null&&w.in_progress||(j.value="",I.value="",le.value="")},{immediate:!0}),Ht(async()=>{Ee.value&&await De()});function ee(w,A="success"){P.value=w,Z.value=A==="success"?"bg-green-500/10 text-green-400 border-green-500/20":"bg-red-500/10 text-red-400 border-red-500/20",window.clearTimeout(ee._timer),ee._timer=window.setTimeout(()=>{P.value=""},8e3)}async function De(){try{const w=await z.getAutoCheckConfig();l.value={interval:Math.round(w.interval/60),target_seats:w.target_seats??5,threshold:w.threshold,min_low:w.min_low,retry_add_phone:w.retry_add_phone??!0,add_phone_max_retries:w.add_phone_max_retries??3,skip_standby_reuse:w.skip_standby_reuse??!1}}catch(w){console.error("加载巡检配置失败:",w)}}async function he(){D.value=!0,W.value="正在打开管理员登录页...";try{$.value=u.value;const w=await z.startAdminLogin(u.value);ee(w.status==="completed"?"管理员登录完成":"已进入下一步登录流程"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function ie(){D.value=!0,W.value="正在校验 session_token 并识别 workspace...";try{$.value=d.value;const w=await z.submitAdminSession(d.value,p.value);p.value="",ee(w.status==="completed"?"session_token 导入成功":"session_token 已提交"),n("refresh")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function ae(){D.value=!0,W.value="密码已提交,正在等待登录页响应...";try{const w=await z.submitAdminPassword(c.value);ee(w.status==="completed"?"管理员登录完成":"密码已提交,请继续下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function Re(){D.value=!0,W.value="验证码已提交,正在等待登录页响应,通常需要 5 到 10 秒...";try{const w=await z.submitAdminCode(m.value);ee(w.status==="completed"?"管理员登录完成":"验证码已提交,请继续下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function Ie(){D.value=!0,W.value="组织选择已提交,正在等待登录页响应...";try{const w=await z.submitAdminWorkspace(v.value);ee(w.status==="completed"?"管理员登录完成":"组织选择已提交,请继续下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{D.value=!1,W.value=""}}async function ke(){D.value=!0;try{await z.cancelAdminLogin(),c.value="",m.value="",ee("管理员登录已取消"),n("refresh")}catch(w){ee(w.message,"error")}finally{D.value=!1}}async function Oe(){D.value=!0;try{await z.logoutAdmin(),c.value="",m.value="",ee("管理员登录态已清除"),n("refresh")}catch(w){ee(w.message,"error")}finally{D.value=!1}}async function gt(){F.value=!0,V.value="login",le.value="正在打开主号 Codex 登录页...";try{const w=await z.startMainCodexLogin();ee(w.status==="completed"?w.message||"主号 Codex 已登录":"主号 Codex 登录进入下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{F.value=!1,V.value="",le.value=""}}async function Rt(){F.value=!0,V.value="sync",le.value="正在打开主号 Codex 登录页...";try{const w=await z.startMainCodexSync();ee(w.status==="completed"?w.message||"主号 Codex 已同步":"主号 Codex 登录进入下一步"),n("admin-progress")}catch(w){ee(w.message,"error")}finally{F.value=!1,V.value="",le.value=""}}async function At(){var w;F.value=!0,V.value=((w=s.codexStatus)==null?void 0:w.action)||"login",le.value="密码已提交,正在等待主号 Codex 登录页响应...";try{const A=await z.submitMainCodexPassword(j.value);ee(A.status==="completed"?A.message||"主号 Codex 已同步":"主号 Codex 密码已提交"),n("admin-progress")}catch(A){ee(A.message,"error")}finally{F.value=!1,V.value="",le.value=""}}async function tt(){var w;F.value=!0,V.value=((w=s.codexStatus)==null?void 0:w.action)||"login",le.value="验证码已提交,正在等待主号 Codex 登录页响应,通常需要 5 到 10 秒...";try{const A=await z.submitMainCodexCode(I.value);ee(A.status==="completed"?A.message||"主号 Codex 已同步":"主号 Codex 验证码已提交"),n("admin-progress")}catch(A){ee(A.message,"error")}finally{F.value=!1,V.value="",le.value=""}}async function st(){F.value=!0;try{await z.cancelMainCodexSync(),ee("主号 Codex 登录已取消"),n("refresh")}catch(w){ee(w.message,"error")}finally{F.value=!1}}async function Ge(){G.value=!0;try{const w=await z.deleteMainCodexFromRemoteFiles();ee(w.message||"已从已启用远端删除主号文件"),n("refresh")}catch(w){ee(w.message,"error")}finally{G.value=!1}}async function Je(){o.value=!0,a.value=!1;try{const w=await z.setAutoCheckConfig({interval:l.value.interval*60,target_seats:l.value.target_seats,threshold:l.value.threshold,min_low:l.value.min_low,retry_add_phone:!!l.value.retry_add_phone,add_phone_max_retries:l.value.add_phone_max_retries,skip_standby_reuse:!!l.value.skip_standby_reuse});l.value={interval:Math.round(w.interval/60),target_seats:w.target_seats??5,threshold:w.threshold,min_low:w.min_low,retry_add_phone:w.retry_add_phone??!0,add_phone_max_retries:w.add_phone_max_retries??3,skip_standby_reuse:w.skip_standby_reuse??!1},a.value=!0,setTimeout(()=>{a.value=!1},3e3)}catch(w){console.error("保存失败:",w)}finally{o.value=!1}}return(w,A)=>{var i,f,g,S,_,k,U,L,O,C,H,N;return b(),x("div",hu,[X.value?(b(),x("div",xu,[r("div",vu,[A[16]||(A[16]=r("div",null,[r("h2",{class:"text-lg font-semibold text-white"},"管理员登录"),r("p",{class:"text-sm text-gray-400 mt-1"}," 首次启动先在这里完成主号登录,系统会统一写入单个 state.json 文件,保存邮箱、session、workspace ID、workspace 名称;如果你走了密码登录,也会保留密码供主号 Codex 复用。 ")],-1)),r("span",{class:Q(["min-w-[72px] px-3 py-1.5 rounded-full text-xs text-center whitespace-nowrap border",ve.value?"bg-green-500/10 text-green-400 border-green-500/20":Pe.value?"bg-yellow-500/10 text-yellow-300 border-yellow-500/20":"bg-gray-800 text-gray-400 border-gray-700"])},y(ve.value?"已配置":Pe.value?"登录中":"未配置"),3)]),P.value?(b(),x("div",{key:0,class:Q(["mb-4 rounded-2xl px-4 py-3 text-sm border",Z.value])},y(P.value),3)):B("",!0),ve.value&&!Pe.value?(b(),x("div",yu,[r("div",_u,[A[17]||(A[17]=r("div",{class:"text-gray-500 mb-1"},"管理员邮箱",-1)),r("div",wu,y(((i=s.adminStatus)==null?void 0:i.email)||"-"),1)]),r("div",Su,[A[18]||(A[18]=r("div",{class:"text-gray-500 mb-1"},"Workspace ID",-1)),r("div",ku,y(((f=s.adminStatus)==null?void 0:f.account_id)||"-"),1)]),r("div",Au,[A[19]||(A[19]=r("div",{class:"text-gray-500 mb-1"},"Workspace 名称",-1)),r("div",Cu,y(((g=s.adminStatus)==null?void 0:g.workspace_name)||"未识别"),1)]),r("div",$u,[A[21]||(A[21]=r("div",{class:"text-gray-500 mb-1"},"Session Token",-1)),(S=s.adminStatus)!=null&&S.session_present?(b(),x("div",Tu,"已配置")):(b(),x("div",Pu,[A[20]||(A[20]=Vt('
未配置(Team 管理功能需要 session token)
获取方式:
  1. 在浏览器中打开 chatgpt.com 并登录管理员账号
  2. 按 F12 打开开发者工具 → Application → Cookies → chatgpt.com
  3. 找到 __Secure-next-auth.session-token
  4. 如果有 .0.1 两个,将值按顺序拼接在一起
  5. 粘贴到下方输入框
',2)),r("div",Iu,[ue(r("input",{"onUpdate:modelValue":A[0]||(A[0]=E=>p.value=E),type:"password",placeholder:"粘贴 session token",class:"w-full px-2 py-1.5 bg-gray-800 border border-gray-700 rounded text-xs text-white font-mono focus:outline-none focus:border-blue-500"},null,512),[[Ce,p.value,void 0,{trim:!0}]]),r("div",Eu,[r("button",{onClick:ie,disabled:D.value||!d.value||!p.value,class:"px-3 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-xs rounded transition disabled:opacity-50"},y(D.value?"校验中...":"保存"),9,Ou)])])]))]),r("div",Ru,[A[22]||(A[22]=r("div",{class:"text-gray-500 mb-1"},"管理员密码",-1)),r("div",Mu,y((_=s.adminStatus)!=null&&_.password_saved?"已保存,可用于主号 Codex 登录":"未保存"),1)])])):B("",!0),Pe.value?B("",!0):(b(),x("div",Uu,[ve.value?Se.value?B("",!0):(b(),x("div",Hu,[r("button",{onClick:gt,disabled:D.value||F.value||G.value,class:"px-4 py-2 bg-blue-700 hover:bg-blue-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(F.value&&V.value==="login"?"登录中...":"登录主号 Codex"),9,Ku),r("button",{onClick:Rt,disabled:D.value||F.value||G.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(F.value&&V.value==="sync"?"同步中...":"同步主号 Codex 到已启用远端"),9,Wu),r("button",{onClick:Ge,disabled:D.value||F.value||G.value,class:"px-4 py-2 bg-amber-700 hover:bg-amber-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(G.value?"删除中...":"从已启用远端删除主号文件"),9,Gu),r("button",{onClick:Oe,disabled:D.value||F.value||G.value,class:"px-4 py-2 bg-rose-700/80 hover:bg-rose-700 text-white text-sm rounded-lg transition disabled:opacity-50"},y(D.value?"处理中...":"清除登录态"),9,qu)])):(b(),x("div",Lu,[r("div",Du,[ue(r("input",{"onUpdate:modelValue":A[1]||(A[1]=E=>u.value=E),type:"email",autocomplete:"username",placeholder:"输入主号邮箱",class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,u.value,void 0,{trim:!0}]]),r("button",{onClick:he,disabled:D.value||!u.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50"},y(D.value?"提交中...":"开始登录"),9,Nu)]),r("div",ju,[A[23]||(A[23]=Vt('
或手动导入 session_token

适合你已经在浏览器里拿到 __Secure-next-auth.session-token 的场景。系统会校验 token,并自动识别 workspace ID / 名称。

获取方式:
  1. 在浏览器中打开 chatgpt.com 并登录管理员账号
  2. 按 F12 打开开发者工具 → Application → Cookies → chatgpt.com
  3. 找到 __Secure-next-auth.session-token
  4. 如果有 .0.1 两个,将值按顺序拼接在一起
  5. 粘贴到下方输入框
',3)),r("div",Bu,[ue(r("input",{"onUpdate:modelValue":A[2]||(A[2]=E=>d.value=E),type:"email",autocomplete:"username",placeholder:"输入主号邮箱",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-cyan-500"},null,512),[[Ce,d.value,void 0,{trim:!0}]]),ue(r("textarea",{"onUpdate:modelValue":A[3]||(A[3]=E=>p.value=E),rows:"4",spellcheck:"false",placeholder:"粘贴完整 session_token",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white font-mono focus:outline-none focus:border-cyan-500"},null,512),[[Ce,p.value,void 0,{trim:!0}]]),r("div",Fu,[r("button",{onClick:ie,disabled:D.value||!d.value||!p.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(D.value?"校验中...":"导入 session_token"),9,Vu)])])])]))])),Pe.value?(b(),x("div",Yu,[r("div",Ju,[A[24]||(A[24]=_e(" 当前邮箱: ",-1)),r("span",zu,y($.value||((k=s.adminStatus)==null?void 0:k.email)||"-"),1)]),((U=s.adminStatus)==null?void 0:U.login_step)==="password_required"?(b(),x("div",Xu,[ue(r("input",{"onUpdate:modelValue":A[4]||(A[4]=E=>c.value=E),type:"password",autocomplete:"current-password",placeholder:"输入主号密码",disabled:D.value,class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,Qu),[[Ce,c.value]]),r("button",{onClick:ae,disabled:D.value||!c.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50"},y(D.value?"提交中...":"提交密码"),9,Zu)])):((L=s.adminStatus)==null?void 0:L.login_step)==="code_required"?(b(),x("div",ed,[ue(r("input",{"onUpdate:modelValue":A[5]||(A[5]=E=>m.value=E),type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"输入邮箱验证码",disabled:D.value,class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,td),[[Ce,m.value,void 0,{trim:!0}]]),r("button",{onClick:Re,disabled:D.value||!m.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50 disabled:bg-gray-700 disabled:hover:bg-gray-700"},y(D.value?"提交中...":"提交验证码"),9,sd)])):((O=s.adminStatus)==null?void 0:O.login_step)==="workspace_required"?(b(),x("div",nd,[A[26]||(A[26]=r("div",{class:"text-sm text-gray-300"}," 请选择要进入的组织 / workspace ",-1)),ue(r("select",{"onUpdate:modelValue":A[6]||(A[6]=E=>v.value=E),disabled:D.value,class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},[A[25]||(A[25]=r("option",{disabled:"",value:""},"请选择组织",-1)),(b(!0),x(de,null,$e(((C=s.adminStatus)==null?void 0:C.workspace_options)||[],E=>(b(),x("option",{key:E.id,value:E.id},y(E.label)+y(E.kind==="fallback"?" (可能是个人/免费)":""),9,od))),128))],8,ld),[[Ft,v.value]]),r("button",{onClick:Ie,disabled:D.value||!v.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50 disabled:bg-gray-700 disabled:hover:bg-gray-700"},y(D.value?"提交中...":"确认组织选择"),9,rd)])):B("",!0),D.value&&W.value?(b(),x("div",ad,y(W.value),1)):B("",!0),r("div",id,[r("button",{onClick:ke,disabled:D.value,class:"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-sm text-gray-200 rounded-lg border border-gray-700 transition disabled:opacity-50"}," 取消登录 ",8,ud)])])):B("",!0),Se.value?(b(),x("div",dd,[r("div",cd," 主号 Codex"+y(J.value)+"继续中 ",1),((H=s.codexStatus)==null?void 0:H.step)==="password_required"?(b(),x("div",fd,[ue(r("input",{"onUpdate:modelValue":A[7]||(A[7]=E=>j.value=E),type:"password",autocomplete:"current-password",placeholder:"输入主号密码",disabled:F.value,class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,pd),[[Ce,j.value]]),r("button",{onClick:At,disabled:F.value||!j.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(F.value?"提交中...":"提交密码"),9,gd)])):((N=s.codexStatus)==null?void 0:N.step)==="code_required"?(b(),x("div",md,[ue(r("input",{"onUpdate:modelValue":A[8]||(A[8]=E=>I.value=E),type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"输入主号 Codex 验证码",disabled:F.value,class:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,bd),[[Ce,I.value,void 0,{trim:!0}]]),r("button",{onClick:tt,disabled:F.value||!I.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(F.value?"提交中...":"提交验证码"),9,hd)])):B("",!0),F.value&&le.value?(b(),x("div",xd,y(le.value),1)):B("",!0),r("div",vd,[r("button",{onClick:st,disabled:F.value,class:"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-sm text-gray-200 rounded-lg border border-gray-700 transition disabled:opacity-50"}," 取消主号 Codex 登录 ",8,yd)])])):B("",!0)])):B("",!0),Ee.value?(b(),x("div",_d,[r("div",wd,[A[27]||(A[27]=r("h2",{class:"text-lg font-semibold text-white"},"巡检设置",-1)),a.value?(b(),x("span",Sd,"已保存")):B("",!0)]),r("div",kd,[r("div",null,[A[29]||(A[29]=r("label",{class:"block text-sm text-gray-400 mb-1"},"巡检间隔",-1)),r("div",Ad,[ue(r("input",{"onUpdate:modelValue":A[9]||(A[9]=E=>l.value.interval=E),type:"number",min:"1",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.interval,void 0,{number:!0}]]),A[28]||(A[28]=r("span",{class:"text-sm text-gray-500 shrink-0"},"分钟",-1))])]),r("div",null,[A[31]||(A[31]=r("label",{class:"block text-sm text-gray-400 mb-1"},"总 seat 数",-1)),r("div",Cd,[ue(r("input",{"onUpdate:modelValue":A[10]||(A[10]=E=>l.value.target_seats=E),type:"number",min:"1",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.target_seats,void 0,{number:!0}]]),A[30]||(A[30]=r("span",{class:"text-sm text-gray-500 shrink-0"},"个",-1))])]),r("div",null,[A[33]||(A[33]=r("label",{class:"block text-sm text-gray-400 mb-1"},"额度阈值",-1)),r("div",$d,[ue(r("input",{"onUpdate:modelValue":A[11]||(A[11]=E=>l.value.threshold=E),type:"number",min:"1",max:"100",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.threshold,void 0,{number:!0}]]),A[32]||(A[32]=r("span",{class:"text-sm text-gray-500 shrink-0"},"%",-1))])]),r("div",null,[A[35]||(A[35]=r("label",{class:"block text-sm text-gray-400 mb-1"},"触发账号数",-1)),r("div",Td,[ue(r("input",{"onUpdate:modelValue":A[12]||(A[12]=E=>l.value.min_low=E),type:"number",min:"1",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.min_low,void 0,{number:!0}]]),A[34]||(A[34]=r("span",{class:"text-sm text-gray-500 shrink-0"},"个",-1))])]),r("div",null,[A[37]||(A[37]=r("label",{class:"block text-sm text-gray-400 mb-1"},"手机号验证自动重试",-1)),ue(r("select",{"onUpdate:modelValue":A[13]||(A[13]=E=>l.value.retry_add_phone=E),class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},[...A[36]||(A[36]=[r("option",{value:!0},"开启",-1),r("option",{value:!1},"关闭",-1)])],512),[[Ft,l.value.retry_add_phone]])]),r("div",null,[A[39]||(A[39]=r("label",{class:"block text-sm text-gray-400 mb-1"},"手机号验证最大重试",-1)),r("div",Pd,[ue(r("input",{"onUpdate:modelValue":A[14]||(A[14]=E=>l.value.add_phone_max_retries=E),type:"number",min:"1",class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,l.value.add_phone_max_retries,void 0,{number:!0}]]),A[38]||(A[38]=r("span",{class:"text-sm text-gray-500 shrink-0"},"次",-1))])]),r("div",null,[A[41]||(A[41]=r("label",{class:"block text-sm text-gray-400 mb-1"},"跳过复用旧账号",-1)),ue(r("select",{"onUpdate:modelValue":A[15]||(A[15]=E=>l.value.skip_standby_reuse=E),class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},[...A[40]||(A[40]=[r("option",{value:!1},"关闭",-1),r("option",{value:!0},"开启",-1)])],512),[[Ft,l.value.skip_standby_reuse]])])]),r("div",Id,[r("p",Ed,[_e(" 每 "+y(l.value.interval)+" 分钟检查一次,按 Team 总 seat "+y(l.value.target_seats)+" 个做自动轮转 / 补位判断; "+y(l.value.min_low)+" 个以上账号剩余低于 "+y(l.value.threshold)+"% 时自动轮转; ",1),l.value.target_seats===2?(b(),x("span",Od,"seat=2 时会对低额度子号启用 best-effort 预切换,若满员无法先加新号则自动回退到先移后补;")):B("",!0),_e(" add_phone "+y(l.value.retry_add_phone?`开启自动重试(最多 ${l.value.add_phone_max_retries} 次)`:"保持人工处理")+"; "+y(l.value.skip_standby_reuse?"已跳过复用旧账号,轮转时直接注册新账号":"轮转时优先复用旧账号"),1)]),r("button",{onClick:Je,disabled:o.value,class:"px-4 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50"},y(o.value?"保存中...":"保存"),9,Rd)]),l.value.target_seats===2?(b(),x("div",Md,[...A[42]||(A[42]=[r("div",{class:"font-medium text-amber-100"},"注意事项",-1),r("div",{class:"mt-1"}," 为了尽量实现 2-seat 的无感切换,系统会优先尝试“先加账号、再踢旧账号”,因此短时间内可能出现额外占位, 导致下个月账单比预期多一些。若不希望这样,可将主号的 seat type 改成 codex,并保持这里的总 seat 数仍为 2。 ",-1)])])):B("",!0)])):B("",!0)])}}},Ud={class:"mt-6 space-y-6"},Ld={class:"glass-card p-4"},Dd={class:"flex flex-wrap gap-2"},Nd=["onClick"],jd={class:"text-base"},Bd={key:0,class:"glass-card p-6"},Fd={class:"mb-6 flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},Vd={class:"mb-2 inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-1 text-xs text-slate-300"},Hd={class:"section-heading"},Kd={class:"section-subtitle max-w-3xl"},Wd={key:0,class:"mt-2 text-xs text-slate-500"},Gd={class:"flex items-center gap-3"},qd={key:0,class:"status-badge border-emerald-400/20 bg-emerald-500/10 text-emerald-200"},Yd={key:1,class:"text-sm text-slate-400"},Jd={key:2,class:"space-y-5"},zd={class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Xd={class:"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},Qd={class:"status-badge text-xs text-slate-400"},Zd={class:"mt-4 flex flex-wrap gap-3"},ec={key:0,class:"rounded-2xl border border-dashed border-white/10 bg-white/5 px-4 py-5 text-sm text-slate-400"},tc={class:"mb-4 flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between"},sc={class:"flex flex-wrap items-center gap-2"},nc={class:"text-sm font-medium text-white"},lc={class:"status-badge text-[11px] text-slate-300"},oc={key:0,class:"status-badge border-emerald-400/20 bg-emerald-500/10 text-[11px] text-emerald-200"},rc={key:1,class:"status-badge border-amber-400/20 bg-amber-500/10 text-[11px] text-amber-200"},ac={class:"mt-1 text-xs leading-5 text-slate-400"},ic={class:"flex flex-wrap gap-2"},uc=["onClick"],dc=["onClick"],cc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},fc={class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},pc=["onUpdate:modelValue"],gc={class:"mb-2 block text-sm font-medium text-slate-300"},mc={key:0,class:"text-red-400"},bc={key:1,class:"mt-1 text-[11px] font-normal text-slate-500 break-all"},hc=["onUpdate:modelValue","type","placeholder"],xc={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},vc=["disabled"],yc={key:3,class:"space-y-5"},_c={class:"rounded-2xl border border-white/10 bg-white/5 p-5"},wc={class:"mb-4 flex items-center justify-between gap-4"},Sc={class:"status-badge text-xs text-slate-400"},kc={class:"grid grid-cols-1 gap-4 md:grid-cols-2"},Ac={class:"mb-2 block text-sm font-medium text-slate-300"},Cc=["onUpdate:modelValue"],$c={key:0,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Tc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Pc={class:"mb-2 block text-sm font-medium text-slate-300"},Ic={key:0,class:"text-red-400"},Ec=["onUpdate:modelValue","type","placeholder"],Oc={key:1,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Rc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Mc={class:"mb-2 block text-sm font-medium text-slate-300"},Uc={key:0,class:"text-red-400"},Lc={key:1,class:"mt-1 font-mono text-[11px] font-normal text-slate-500 break-all"},Dc=["onUpdate:modelValue","type","placeholder"],Nc={key:2,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},jc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Bc={class:"mb-2 block text-sm font-medium text-slate-300"},Fc={key:0,class:"text-red-400"},Vc={key:1,class:"mt-1 font-mono text-[11px] font-normal text-slate-500 break-all"},Hc=["onUpdate:modelValue"],Kc=["onUpdate:modelValue"],Wc=["onUpdate:modelValue","type","step","placeholder"],Gc={key:3,class:"rounded-2xl border border-white/10 bg-white/5 px-4 py-4 text-sm text-slate-400"},qc={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},Yc=["disabled"],Jc={key:4,class:"space-y-4"},zc={class:"rounded-2xl border border-white/10 bg-white/5 p-4"},Xc={class:"text-xs text-slate-400"},Qc={key:0,class:"mt-4 grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Zc={class:"mb-2 block text-sm font-medium text-slate-300"},ef={key:0,class:"text-red-400"},tf=["onUpdate:modelValue","type","placeholder"],sf={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},nf=["disabled"],lf={key:5,class:"space-y-4"},of={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},rf={class:"mb-2 block text-sm font-medium text-slate-300"},af={key:0,class:"text-red-400"},uf={key:1,class:"ml-1 text-xs text-slate-500"},df=["onUpdate:modelValue","type","placeholder"],cf={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},ff={class:"text-xs leading-6 text-slate-400"},pf=["disabled"],gf={key:3,class:"glass-card space-y-4 p-6"},mf={class:"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},bf={class:"status-badge break-all font-mono text-[11px] text-slate-400"},hf={class:"flex flex-col gap-3 rounded-2xl border border-white/10 bg-white/5 p-4 lg:flex-row lg:items-center lg:justify-between"},xf={class:"flex gap-2"},vf=["disabled"],yf=["disabled"],_f={__name:"ConfigPage",props:{adminStatus:{type:Object,default:null},codexStatus:{type:Object,default:null}},emits:["refresh","admin-progress"],setup(e,{emit:t}){const s=t,n={cloudmail:["MAIL_PROVIDER","CLOUDMAIL_BASE_URL","CLOUDMAIL_EMAIL","CLOUDMAIL_PASSWORD","CLOUDMAIL_DOMAIN","CF_TEMP_EMAIL_BASE_URL","CF_TEMP_EMAIL_ADMIN_PASSWORD","CF_TEMP_EMAIL_DOMAIN"],sync:["SYNC_TARGET_CPA","SYNC_TARGET_SUB2API","CPA_URL","CPA_KEY","SUB2API_URL","SUB2API_EMAIL","SUB2API_PASSWORD","SUB2API_GROUP","SUB2API_CONCURRENCY","SUB2API_PRIORITY","SUB2API_RATE_MULTIPLIER","SUB2API_AUTO_PAUSE_ON_EXPIRED","SUB2API_MODEL_WHITELIST","SUB2API_OPENAI_WS_MODE","SUB2API_OPENAI_PASSTHROUGH","SUB2API_OVERWRITE_ACCOUNT_SETTINGS","SUB2API_PROXY"],proxy:["PLAYWRIGHT_PROXY_URL","PLAYWRIGHT_PROXY_BYPASS"],security:["API_KEY"]},l={cloudmail:{icon:"📧",badge:"Mail Services",title:"邮箱服务配置",description:"配置自动注册和收验证码所需的邮箱后端。现在支持同时维护多个 CloudMail / Cloudflare Temp Email 实例,并指定默认新建服务。",note:"已有账号会优先按账号自身保存的 mail_service_id 或唯一邮箱域名匹配服务;存在歧义时不会盲猜。",footer:"邮箱服务配置保存后会立即热加载;之后的新建、复用和验证码轮询都会按最新服务列表执行。"},sync:{icon:"☁️",badge:"Remote Sync",title:"远端同步",description:"先选择启用的远端同步目标,再填写对应的连接信息。账号池操作会根据这里的启用状态决定同步到哪些远端。",note:"支持同时启用 CPA 和 Sub2API;界面只显示当前已启用目标的详细配置。"},proxy:{icon:"🛰️",badge:"Proxy / Advanced",title:"代理 / 高级",description:"用于单独配置 Playwright 浏览器流量代理。属于低频项,默认折叠,避免把主配置界面堆得过满。",note:"只有在代理 ChatGPT / Auth 页面访问时才建议配置;本地回调场景通常还需要设置 bypass。"},security:{icon:"🔐",badge:"Security",title:"安全 / 访问控制",description:"入口级配置集中放在这里。API Key 决定 Web 面板和 HTTP API 的访问控制,不再和其他运行参数混在一起。",note:"留空会自动生成新的 API Key;保存后前端会立即切换到新的密钥。",footer:"这是控制面板和 API 的入口密钥。修改后会立即生效,并同步刷新当前浏览器里的 API Key。"}},o=[{key:"cloudmail",label:"邮箱服务",icon:"📧"},{key:"sync",label:"远端同步",icon:"☁️"},{key:"security",label:"安全 / 访问控制",icon:"🔐"},{key:"admin",label:"管理员 / 主号",icon:"👤"},{key:"auto-check",label:"巡检设置",icon:"🔄"},{key:"source",label:"源文件编辑",icon:"📝"},{key:"proxy",label:"代理 / 高级",icon:"🛰️"}],a=M("cloudmail"),u=M(!1),d=M([]),p=hs({}),c=M([]),m=M(""),v=M(!1),$=M(!1),j=M(!1),I=M(""),D=M(""),F=M(""),V=M(""),G=M(!1),P=M(!1),Z=M(!1),W=M(""),le=M(""),ve=new Set(["API_KEY"]),Pe={SUB2API_URL:"ENV: SUB2API_URL · Sub2API API base URL",SUB2API_EMAIL:"ENV: SUB2API_EMAIL · login.email",SUB2API_PASSWORD:"ENV: SUB2API_PASSWORD · login.password",SUB2API_GROUP:"ENV: SUB2API_GROUP · group_ids",SUB2API_PROXY:"ENV: SUB2API_PROXY · account.proxy_id(ID 或名称,仅账号池新建时写入)",SUB2API_CONCURRENCY:"ENV: SUB2API_CONCURRENCY · account.concurrency",SUB2API_PRIORITY:"ENV: SUB2API_PRIORITY · account.priority",SUB2API_RATE_MULTIPLIER:"ENV: SUB2API_RATE_MULTIPLIER · account.rate_multiplier",SUB2API_AUTO_PAUSE_ON_EXPIRED:"ENV: SUB2API_AUTO_PAUSE_ON_EXPIRED · account.auto_pause_on_expired",SUB2API_MODEL_WHITELIST:"ENV: SUB2API_MODEL_WHITELIST · credentials.model_mapping",SUB2API_OPENAI_WS_MODE:"ENV: SUB2API_OPENAI_WS_MODE · extra.openai_oauth_responses_websockets_v2_mode / enabled",SUB2API_OPENAI_PASSTHROUGH:"ENV: SUB2API_OPENAI_PASSTHROUGH · extra.openai_passthrough",SUB2API_OVERWRITE_ACCOUNT_SETTINGS:"ENV: SUB2API_OVERWRITE_ACCOUNT_SETTINGS · AutoTeam overwrite switch"},Se={cloudmail:[{key:"base_url",label:"CloudMail API 地址",required:!0,placeholder:"https://your-cloudmail.com/api"},{key:"email",label:"CloudMail 登录邮箱",required:!0,placeholder:"admin@example.com"},{key:"password",label:"CloudMail 登录密码",required:!0,inputType:"password"},{key:"domain",label:"CloudMail 邮箱域名",required:!0,placeholder:"example.com 或 @example.com",hint:"用于自动匹配已有账号所属邮箱服务"}],cloudflare_temp_email:[{key:"base_url",label:"Cloudflare Temp Email API 地址",required:!0,placeholder:"https://temp-email-api.example.com"},{key:"admin_password",label:"管理员密码",required:!0,inputType:"password"},{key:"domain",label:"邮箱域名",required:!0,placeholder:"mail.example.com",hint:"用于自动匹配已有账号所属邮箱服务"}]},J=se(()=>n[a.value]?a.value:""),X=se(()=>l[J.value]||null);function Ee(h){return d.value.find(T=>T.key===h)||null}function ee(h){return Pe[h]||""}function De(h){return h.map(T=>Ee(T)).filter(Boolean)}const he=se(()=>De(n.security)),ie=se(()=>De(n.proxy)),ae=se(()=>De(["SYNC_TARGET_CPA","SYNC_TARGET_SUB2API"])),Re=se(()=>c.value.find(h=>h.id===m.value)||null),Ie=se(()=>String(p.SYNC_TARGET_CPA||"").toLowerCase()==="true"),ke=se(()=>String(p.SYNC_TARGET_SUB2API||"").toLowerCase()==="true"),Oe=se(()=>Ie.value?De(["CPA_URL","CPA_KEY"]):[]),gt=se(()=>ke.value?De(["SUB2API_URL","SUB2API_EMAIL","SUB2API_PASSWORD","SUB2API_GROUP"]):[]),Rt=se(()=>ke.value?De(["SUB2API_CONCURRENCY","SUB2API_PRIORITY","SUB2API_RATE_MULTIPLIER","SUB2API_AUTO_PAUSE_ON_EXPIRED","SUB2API_MODEL_WHITELIST","SUB2API_OPENAI_WS_MODE","SUB2API_OPENAI_PASSTHROUGH","SUB2API_OVERWRITE_ACCOUNT_SETTINGS","SUB2API_PROXY"]):[]),At=se(()=>J.value==="security"?he.value:[]),tt=se(()=>{const h=[];return Ie.value&&h.push("CPA"),ke.value&&h.push("Sub2API"),h.length?`已启用:${h.join(" + ")}`:"当前未启用远端"}),st=se(()=>{if(!J.value)return{label:"",class:"border-white/10 bg-white/5 text-slate-400"};if(J.value==="sync"){if(!Ie.value&&!ke.value)return{label:"未启用",class:"border-white/10 bg-white/5 text-slate-400"};const te=!Ie.value||Oe.value.every(Ne=>!oe(Ne)||Ne.configured),Ae=!ke.value||gt.value.every(Ne=>!oe(Ne)||Ne.configured);return te&&Ae?{label:"已配置",class:"border-emerald-400/20 bg-emerald-500/10 text-emerald-200"}:{label:"未配置",class:"border-red-400/20 bg-red-500/10 text-red-200"}}if(J.value==="proxy")return ie.value.some(te=>te.configured)?{label:"已设置",class:"border-emerald-400/20 bg-emerald-500/10 text-emerald-200"}:{label:"未设置",class:"border-white/10 bg-white/5 text-slate-400"};if(J.value==="cloudmail")return c.value.length?Re.value?c.value.some(te=>!C(te))?{label:"待补全",class:"border-amber-400/20 bg-amber-500/10 text-amber-200"}:{label:"已配置",class:"border-emerald-400/20 bg-emerald-500/10 text-emerald-200"}:{label:"未设默认",class:"border-amber-400/20 bg-amber-500/10 text-amber-200"}:{label:"未配置",class:"border-red-400/20 bg-red-500/10 text-red-200"};const h=At.value;return h.length>0&&h.every(te=>!oe(te)||te.configured)?{label:"已配置",class:"border-emerald-400/20 bg-emerald-500/10 text-emerald-200"}:{label:"未配置",class:"border-red-400/20 bg-red-500/10 text-red-200"}});function Ge(h,T="success"){I.value=h,D.value=T==="success"?"bg-green-500/10 text-green-400 border-green-500/20":"bg-red-500/10 text-red-400 border-red-500/20",window.clearTimeout(Ge._timer),Ge._timer=window.setTimeout(()=>{I.value=""},8e3)}function Je(h,T="success"){W.value=h,le.value=T==="success"?"bg-green-500/10 text-green-400 border-green-500/20":"bg-red-500/10 text-red-400 border-red-500/20",window.clearTimeout(Je._timer),Je._timer=window.setTimeout(()=>{W.value=""},8e3)}function w(h){return["SUB2API_CONCURRENCY","SUB2API_PRIORITY","SUB2API_RATE_MULTIPLIER"].includes(h)?"number":h.includes("PASSWORD")||h.includes("KEY")?"password":"text"}function A(h){return h==="SYNC_TARGET_CPA"||h==="SYNC_TARGET_SUB2API"}function i(h){return A(h)||["SUB2API_AUTO_PAUSE_ON_EXPIRED","SUB2API_OPENAI_PASSTHROUGH","SUB2API_OVERWRITE_ACCOUNT_SETTINGS"].includes(h)}function f(h){return h==="SUB2API_OPENAI_WS_MODE"}function g(h){if(h==="SUB2API_RATE_MULTIPLIER")return"0.001";if(h==="SUB2API_CONCURRENCY"||h==="SUB2API_PRIORITY")return"1"}function S(h="cloudmail"){const T=String(h||"").toLowerCase()==="cloudflare_temp_email"?"cloudflare_temp_email":"cloudmail",te=Math.random().toString(36).slice(2,8);return{id:`mailsvc-${Date.now().toString(36)}-${te}`,type:T,name:"",base_url:"",domain:"",email:"",password:"",admin_password:""}}function _(h){const T=S(h==null?void 0:h.type);return{...T,id:String((h==null?void 0:h.id)||T.id),name:String((h==null?void 0:h.name)||""),base_url:String((h==null?void 0:h.base_url)||""),domain:String((h==null?void 0:h.domain)||""),email:String((h==null?void 0:h.email)||""),password:String((h==null?void 0:h.password)||""),admin_password:String((h==null?void 0:h.admin_password)||"")}}function k(h){const T=_(h);return T.domain=T.domain.trim(),T.type==="cloudflare_temp_email"?(delete T.email,delete T.password):delete T.admin_password,T}function U(h){return h==="cloudflare_temp_email"?"Cloudflare Temp Email":"CloudMail"}function L(h){return h==="cloudflare_temp_email"?"填写管理端 API 地址、管理员密码和对应邮箱域名。":"填写 CloudMail API 地址、管理员账号密码和对应邮箱域名。"}function O(h){return Se[h==null?void 0:h.type]||Se.cloudmail}function C(h){return O(h).every(T=>T.required?String((h==null?void 0:h[T.key])||"").trim()!=="":!0)}function H(h){const T=String((h==null?void 0:h.name)||"").trim();if(T)return T;const te=U(h==null?void 0:h.type),Ae=String((h==null?void 0:h.domain)||"").trim();return Ae?`${te} (${Ae})`:te}function N(){var T;const h=new Set(c.value.map(te=>te.id));m.value&&h.has(m.value)||(m.value=((T=c.value[0])==null?void 0:T.id)||"")}function E(h){c.value=[...c.value,S(h)],N()}function q(h){c.value=c.value.filter(T=>T.id!==h),N()}function re(h){m.value=h}function oe(h){return!!(h!=null&&h.runtime_required)||ve.has(h==null?void 0:h.key)}function ge(h){const T=(h==null?void 0:h.value)??(h==null?void 0:h.default)??"";if(i(h==null?void 0:h.key))return String(T).toLowerCase()==="true"?"true":"false";if(f(h==null?void 0:h.key)){const te=String(T||"").toLowerCase();return["off","ctx_pool","passthrough"].includes(te)?te:"off"}return T}async function ye(){v.value=!0;try{const h=await z.getRuntimeConfig();d.value=h.fields||[],c.value=Array.isArray(h.mail_services)?h.mail_services.map(T=>_(T)):[],m.value=String(h.mail_service_default||""),N();for(const T of Object.keys(p))d.value.find(te=>te.key===T)||delete p[T];for(const T of d.value)p[T.key]=ge(T)}catch(h){console.error("加载运行时配置失败:",h),Ge("加载运行时配置失败: "+h.message,"error")}finally{v.value=!1}}async function we(){var h;$.value=!0,j.value=!1;try{const T={};for(const Xe of d.value){const es=p[Xe.key];T[Xe.key]=es==null?"":String(es)}const te=c.value.map(Xe=>k(Xe)),Ae=te.some(Xe=>Xe.id===m.value)?m.value:((h=te[0])==null?void 0:h.id)||"";T.mail_services=te,T.mail_service_default=Ae;const Ne=await z.saveRuntimeConfig(T);Ne.api_key&&Us(Ne.api_key),Ge(Ne.message||"配置保存成功"),j.value=!0,window.setTimeout(()=>{j.value=!1},3e3),await ye(),s("refresh")}catch(T){Ge(T.message,"error")}finally{$.value=!1}}async function He(){G.value=!0;try{const h=await z.getRuntimeConfigSource();F.value=h.path||".env",V.value=h.content||"",Z.value=!0}catch(h){console.error("加载源文件失败:",h),Je("加载源文件失败: "+h.message,"error")}finally{G.value=!1}}async function ze(){P.value=!0;try{const h=await z.saveRuntimeConfigSource({content:V.value});h.api_key&&Us(h.api_key),Je(h.message||"源文件保存成功"),await Promise.all([He(),ye()]),s("refresh")}catch(h){Je(h.message,"error")}finally{P.value=!1}}return $t(a,async h=>{h==="source"&&!Z.value&&await He()}),Ht(async()=>{await ye()}),(h,T)=>{var te,Ae,Ne,Xe,es,Un;return b(),x("div",Ud,[T[23]||(T[23]=Vt('
AutoTeam Configuration Center

配置面板

按邮箱服务、远端同步、安全、管理员、巡检、源文件编辑和代理拆成独立分区,避免把所有运行配置堆在一个页面里。

高频配置前置,低频配置后置;代理等高级项默认折叠,源文件编辑仍然保留。
🧩
独立配置分区
邮箱服务、同步、安全等高频项前置,低频代理项后置,不再混在一张表单里。
☁️
动态同步配置
可增删多个邮箱服务 / 启用远端目标,再按状态展示对应配置。
📝
源文件编辑保留
可视化配置之外,仍可直接维护完整 .env 源文件。
',1)),r("div",Ld,[r("div",Dd,[(b(),x(de,null,$e(o,R=>r("button",{key:R.key,onClick:ce=>a.value=R.key,class:Q(["pill-tab flex items-center gap-2",a.value===R.key?"pill-tab-active":""])},[r("span",jd,y(R.icon),1),_e(" "+y(R.label),1)],10,Nd)),64))])]),J.value?(b(),x("div",Bd,[r("div",Fd,[r("div",null,[r("div",Vd,[r("span",null,y((te=X.value)==null?void 0:te.icon),1),_e(" "+y((Ae=X.value)==null?void 0:Ae.badge),1)]),r("h3",Hd,y((Ne=X.value)==null?void 0:Ne.title),1),r("p",Kd,y((Xe=X.value)==null?void 0:Xe.description),1),(es=X.value)!=null&&es.note?(b(),x("p",Wd,y(X.value.note),1)):B("",!0)]),r("div",Gd,[j.value?(b(),x("span",qd," 已保存 ")):B("",!0),r("span",{class:Q(["status-badge min-w-[84px] justify-center",st.value.class])},y(st.value.label),3)])]),I.value?(b(),x("div",{key:0,class:Q(["mb-4 rounded-2xl px-4 py-3 text-sm border",D.value])},y(I.value),3)):B("",!0),v.value?(b(),x("div",Yd," 正在加载当前配置... ")):J.value==="cloudmail"?(b(),x("div",Jd,[r("div",zd,[r("div",Xd,[T[8]||(T[8]=r("div",null,[r("div",{class:"text-sm font-medium text-white"},"邮箱服务列表"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 可以同时添加多个 CloudMail / Cloudflare Temp Email 实例;默认服务用于新建账号,已有账号会优先复用自身绑定或唯一域名匹配到的服务。 ")],-1)),r("div",Qd,y(Re.value?`默认:${H(Re.value)}`:"未设置默认服务"),1)]),r("div",Zd,[r("button",{class:"btn-secondary",onClick:T[0]||(T[0]=R=>E("cloudmail"))}," + 添加 CloudMail "),r("button",{class:"btn-secondary",onClick:T[1]||(T[1]=R=>E("cloudflare_temp_email"))}," + 添加 Cloudflare Temp Email ")])]),c.value.length?B("",!0):(b(),x("div",ec," 还没有配置任何邮箱服务。先添加一个服务,再设置为默认服务。 ")),(b(!0),x(de,null,$e(c.value,R=>(b(),x("div",{key:R.id,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},[r("div",tc,[r("div",null,[r("div",sc,[r("div",nc,y(H(R)),1),r("span",lc,y(U(R.type)),1),m.value===R.id?(b(),x("span",oc," 默认新建服务 ")):B("",!0),C(R)?B("",!0):(b(),x("span",rc," 待补全 "))]),r("div",ac,y(L(R.type)),1)]),r("div",ic,[m.value!==R.id?(b(),x("button",{key:0,class:"btn-secondary",onClick:ce=>re(R.id)}," 设为默认 ",8,uc)):B("",!0),r("button",{class:"btn-secondary border-red-500/30 text-red-300 hover:border-red-400/40 hover:text-red-200",onClick:ce=>q(R.id)}," 删除 ",8,dc)])]),r("div",cc,[r("div",fc,[T[9]||(T[9]=r("label",{class:"mb-2 block text-sm font-medium text-slate-300"},[_e(" 服务名称 "),r("span",{class:"ml-1 text-xs font-normal text-slate-500"},"(可选)")],-1)),ue(r("input",{"onUpdate:modelValue":ce=>R.name=ce,type:"text",placeholder:"例如:CloudMail #1",class:"input-dark"},null,8,pc),[[Ce,R.name]])]),(b(!0),x(de,null,$e(O(R),ce=>(b(),x("div",{key:`${R.id}-${ce.key}`,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",gc,[_e(y(ce.label)+" ",1),ce.required?(b(),x("span",mc,"*")):B("",!0),ce.hint?(b(),x("div",bc,y(ce.hint),1)):B("",!0)]),ue(r("input",{"onUpdate:modelValue":Io=>R[ce.key]=Io,type:ce.inputType||"text",placeholder:ce.placeholder||"",class:"input-dark"},null,8,hc),[[Nt,R[ce.key]]])]))),128))])]))),128)),r("div",xc,[T[10]||(T[10]=r("p",{class:"text-xs leading-6 text-slate-400"}," 保存后会立即热加载。新建账号会使用默认服务;已有账号会优先按 `mail_service_id` 或唯一邮箱域名匹配对应服务。 ",-1)),r("button",{onClick:we,disabled:$.value||v.value,class:"btn-primary"},y($.value?"保存中...":"保存配置"),9,vc)])])):J.value==="sync"?(b(),x("div",yc,[r("div",_c,[r("div",wc,[T[11]||(T[11]=r("div",null,[r("div",{class:"text-sm font-medium text-white"},"同步目标开关"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 可同时启用多个远端。界面只展示当前已启用目标的详细配置。 ")],-1)),r("div",Sc,y(tt.value),1)]),r("div",kc,[(b(!0),x(de,null,$e(ae.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Ac,y(R.prompt),1),ue(r("select",{"onUpdate:modelValue":ce=>p[R.key]=ce,class:"input-dark"},[...T[12]||(T[12]=[r("option",{value:"true"},"启用",-1),r("option",{value:"false"},"关闭",-1)])],8,Cc),[[Ft,p[R.key]]])]))),128))])]),Ie.value?(b(),x("div",$c,[T[13]||(T[13]=r("div",{class:"mb-4"},[r("div",{class:"text-sm font-medium text-white"},"CPA"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 为已启用的 CPA 远端填写连接地址和管理密钥。 ")],-1)),r("div",Tc,[(b(!0),x(de,null,$e(Oe.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Pc,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",Ic,"*")):B("",!0)]),ue(r("input",{"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),placeholder:R.default||"",class:"input-dark"},null,8,Ec),[[Nt,p[R.key]]])]))),128))])])):B("",!0),ke.value?(b(),x("div",Oc,[T[14]||(T[14]=r("div",{class:"mb-4"},[r("div",{class:"text-sm font-medium text-white"},"Sub2API"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 为已启用的 Sub2API 远端填写地址、管理员邮箱、密码和可选分组。 ")],-1)),r("div",Rc,[(b(!0),x(de,null,$e(gt.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Mc,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",Uc,"*")):B("",!0),ee(R.key)?(b(),x("div",Lc,y(ee(R.key)),1)):B("",!0)]),ue(r("input",{"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),placeholder:R.default||"",class:"input-dark"},null,8,Dc),[[Nt,p[R.key]]])]))),128))])])):B("",!0),ke.value?(b(),x("div",Nc,[T[17]||(T[17]=r("div",{class:"mb-4"},[r("div",{class:"text-sm font-medium text-white"},"Sub2API 默认账号设置"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 新创建的 Sub2API 账号会自动带上这些默认参数和可选代理绑定;已存在账号默认不覆盖,只有开启“覆盖账号设置”后才会在每次同步时强制统一(代理绑定仍只在新建账号时写入)。 ")],-1)),r("div",jc,[(b(!0),x(de,null,$e(Rt.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Bc,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",Fc,"*")):B("",!0),ee(R.key)?(b(),x("div",Vc,y(ee(R.key)),1)):B("",!0)]),i(R.key)?ue((b(),x("select",{key:0,"onUpdate:modelValue":ce=>p[R.key]=ce,class:"input-dark"},[...T[15]||(T[15]=[r("option",{value:"true"},"true",-1),r("option",{value:"false"},"false",-1)])],8,Hc)),[[Ft,p[R.key]]]):f(R.key)?ue((b(),x("select",{key:1,"onUpdate:modelValue":ce=>p[R.key]=ce,class:"input-dark"},[...T[16]||(T[16]=[r("option",{value:"off"},"off",-1),r("option",{value:"ctx_pool"},"ctx_pool",-1),r("option",{value:"passthrough"},"passthrough",-1)])],8,Kc)),[[Ft,p[R.key]]]):ue((b(),x("input",{key:2,"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),step:g(R.key),placeholder:R.default||"",class:"input-dark"},null,8,Wc)),[[Nt,p[R.key]]])]))),128))])])):B("",!0),!Ie.value&&!ke.value?(b(),x("div",Gc," 当前还没有启用任何远端同步目标。先打开上面的开关,再填写对应远端配置。 ")):B("",!0),r("div",qc,[T[18]||(T[18]=r("p",{class:"text-xs leading-6 text-slate-400"}," 保存后会立即热加载;账号池操作会根据当前已启用远端决定后续同步行为。 ",-1)),r("button",{onClick:we,disabled:$.value||v.value,class:"btn-primary"},y($.value?"保存中...":"保存配置"),9,Yc)])])):J.value==="proxy"?(b(),x("div",Jc,[r("div",zc,[r("button",{onClick:T[2]||(T[2]=R=>u.value=!u.value),class:"flex w-full items-center justify-between gap-4 text-left"},[T[19]||(T[19]=r("div",null,[r("div",{class:"text-sm font-medium text-white"},"高级代理设置"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 低频配置,默认折叠。只有浏览器流量需要单独代理时才建议填写。 ")],-1)),r("span",Xc,y(u.value?"收起":"展开"),1)]),u.value?(b(),x("div",Qc,[(b(!0),x(de,null,$e(ie.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Zc,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",ef,"*")):B("",!0)]),ue(r("input",{"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),placeholder:R.default||"",class:"input-dark"},null,8,tf),[[Nt,p[R.key]]])]))),128))])):B("",!0)]),r("div",sf,[T[20]||(T[20]=r("p",{class:"text-xs leading-6 text-slate-400"}," 推荐只在确实需要代理 Playwright 浏览器流量时启用,并配合绕过列表避免本地回调误走代理。 ",-1)),r("button",{onClick:we,disabled:$.value||v.value,class:"btn-primary"},y($.value?"保存中...":"保存配置"),9,nf)])])):(b(),x("div",lf,[r("div",of,[(b(!0),x(de,null,$e(At.value,R=>(b(),x("div",{key:R.key,class:"rounded-2xl border border-white/10 bg-white/5 p-4"},[r("label",rf,[_e(y(R.prompt)+" ",1),oe(R)?(b(),x("span",af,"*")):B("",!0),R.key==="API_KEY"?(b(),x("span",uf,"(留空自动生成)")):B("",!0)]),ue(r("input",{"onUpdate:modelValue":ce=>p[R.key]=ce,type:w(R.key),placeholder:R.default||"",class:"input-dark"},null,8,df),[[Nt,p[R.key]]])]))),128))]),r("div",cf,[r("p",ff,y((Un=X.value)==null?void 0:Un.footer),1),r("button",{onClick:we,disabled:$.value||v.value,class:"btn-primary"},y($.value?"保存中...":"保存配置"),9,pf)])]))])):a.value==="admin"?(b(),qe(bl,{key:1,"admin-status":e.adminStatus,"codex-status":e.codexStatus,section:"admin",onRefresh:T[3]||(T[3]=R=>h.$emit("refresh")),onAdminProgress:T[4]||(T[4]=R=>h.$emit("admin-progress"))},null,8,["admin-status","codex-status"])):a.value==="auto-check"?(b(),qe(bl,{key:2,"admin-status":e.adminStatus,"codex-status":e.codexStatus,section:"auto-check",onRefresh:T[5]||(T[5]=R=>h.$emit("refresh")),onAdminProgress:T[6]||(T[6]=R=>h.$emit("admin-progress"))},null,8,["admin-status","codex-status"])):a.value==="source"?(b(),x("div",gf,[r("div",mf,[T[21]||(T[21]=r("div",null,[r("div",{class:"mb-2 inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-3 py-1 text-xs text-slate-300"},[r("span",null,"📝"),_e(" Source Editor ")]),r("h3",{class:"section-heading"},"源文件编辑"),r("p",{class:"section-subtitle"}," 直接编辑 .env 源文件。保存后会立即重载并校验邮箱服务 / 远端同步配置。 ")],-1)),r("div",bf,y(F.value||".env"),1)]),W.value?(b(),x("div",{key:0,class:Q(["rounded-2xl px-4 py-3 text-sm border",le.value])},y(W.value),3)):B("",!0),ue(r("textarea",{"onUpdate:modelValue":T[7]||(T[7]=R=>V.value=R),rows:"20",spellcheck:"false",class:"textarea-dark min-h-[420px] font-mono",placeholder:"在这里编辑 .env 内容"},null,512),[[Ce,V.value]]),r("div",hf,[T[22]||(T[22]=r("p",{class:"text-xs leading-6 text-slate-400"}," 这里是原始文本模式,适合你直接粘贴或手工维护完整 .env。 ",-1)),r("div",xf,[r("button",{onClick:He,disabled:G.value||P.value,class:"btn-secondary"},y(G.value?"加载中...":"重新读取"),9,vf),r("button",{onClick:ze,disabled:G.value||P.value,class:"btn-primary"},y(P.value?"保存中...":"保存源文件"),9,yf)])])])):B("",!0)])}}},wf={class:"flex items-center justify-between mb-6"},Sf=["disabled"],kf={key:0,class:"mb-4 px-4 py-3 rounded-lg text-sm bg-red-500/10 text-red-400 border border-red-500/20"},Af={key:1,class:"space-y-4"},Cf={class:"flex gap-4 text-sm"},$f={class:"px-3 py-1.5 bg-gray-800 rounded-lg text-gray-300"},Tf={class:"text-white font-medium"},Pf={key:0,class:"px-3 py-1.5 bg-gray-800 rounded-lg text-gray-300"},If={class:"text-yellow-400 font-medium"},Ef={class:"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},Of={class:"overflow-x-auto"},Rf={class:"w-full text-sm"},Mf={class:"px-4 py-3 text-gray-500"},Uf={class:"px-4 py-3 font-mono text-xs text-slate-200"},Lf={class:"px-4 py-3"},Df={class:"px-4 py-3"},Nf={class:"px-4 py-3"},jf={class:"px-4 py-3 text-right"},Bf=["onClick","disabled"],Ff={key:2,class:"bg-gray-900 border border-gray-800 rounded-xl h-64 animate-pulse"},Vf={key:3,class:"text-center text-gray-500 py-12"},ln="autoteam_team_members",Hf={__name:"TeamMembers",setup(e){const t=M(null),s=M(!1),n=M(""),l=M("");function o(){try{const c=localStorage.getItem(ln);if(c){const m=JSON.parse(c);if(m.time&&Date.now()-m.time<6e5)return m.data}}catch{}return null}function a(c){try{localStorage.setItem(ln,JSON.stringify({data:c,time:Date.now()}))}catch{}}function u(c){return`${c.type}:${c.user_id}:${c.email}`}async function d(){s.value=!0,n.value="";try{t.value=await z.getTeamMembers(),a(t.value)}catch(c){n.value=c.message}finally{s.value=!1}}async function p(c){const m=c.type==="invite"?"取消邀请":"移出 Team";if(window.confirm(`确认${m} ${c.email}?`)){l.value=u(c),n.value="";try{await z.removeTeamMember({email:c.email,user_id:c.user_id,type:c.type});try{localStorage.removeItem(ln)}catch{}await d()}catch($){n.value=$.message}finally{l.value=""}}}return Ht(()=>{const c=o();c?t.value=c:d()}),(c,m)=>(b(),x("div",null,[r("div",wf,[m[0]||(m[0]=r("h2",{class:"text-xl font-bold text-white"},"Team 成员",-1)),r("button",{onClick:d,disabled:s.value,class:"px-3 py-1.5 bg-gray-800 hover:bg-gray-700 text-sm rounded-lg border border-gray-700 transition disabled:opacity-50 text-gray-300 hover:text-white"},y(s.value?"加载中...":"刷新"),9,Sf)]),n.value?(b(),x("div",kf,y(n.value),1)):B("",!0),t.value?(b(),x("div",Af,[r("div",Cf,[r("span",$f,[m[1]||(m[1]=_e("成员: ",-1)),r("span",Tf,y(t.value.total),1)]),t.value.invites>0?(b(),x("span",Pf,[m[2]||(m[2]=_e("待接受邀请: ",-1)),r("span",If,y(t.value.invites),1)])):B("",!0)]),r("div",Ef,[r("div",Of,[r("table",Rf,[m[3]||(m[3]=r("thead",null,[r("tr",{class:"text-gray-400 text-left border-b border-gray-800"},[r("th",{class:"px-4 py-3 font-medium"},"#"),r("th",{class:"px-4 py-3 font-medium"},"邮箱"),r("th",{class:"px-4 py-3 font-medium"},"角色"),r("th",{class:"px-4 py-3 font-medium"},"类型"),r("th",{class:"px-4 py-3 font-medium"},"来源"),r("th",{class:"px-4 py-3 font-medium text-right"},"操作")])],-1)),r("tbody",null,[(b(!0),x(de,null,$e(t.value.members,(v,$)=>(b(),x("tr",{key:v.email+v.type,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",Mf,y($+1),1),r("td",Uf,y(v.email),1),r("td",Lf,[r("span",{class:Q(["px-2 py-0.5 rounded text-xs font-medium",{"bg-purple-500/10 text-purple-400":v.role==="account-owner","bg-blue-500/10 text-blue-400":v.role==="account-admin","bg-gray-500/10 text-gray-300":v.role!=="account-owner"&&v.role!=="account-admin"}])},y(v.role||"member"),3)]),r("td",Df,[r("span",{class:Q(["px-2 py-0.5 rounded text-xs font-medium",v.type==="invite"?"bg-yellow-500/10 text-yellow-400":"bg-green-500/10 text-green-400"])},y(v.type==="invite"?"待接受":"已加入"),3)]),r("td",Nf,[r("span",{class:Q(["text-xs",v.is_local?"text-blue-400":"text-gray-500"])},y(v.is_local?"本地管理":"外部"),3)]),r("td",jf,[v.role!=="account-owner"?(b(),x("button",{key:0,onClick:j=>p(v),disabled:l.value===u(v),class:Q(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",l.value===u(v)?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"bg-rose-600/10 text-rose-400 border-rose-500/30 hover:bg-rose-600/20"])},y(l.value===u(v)?"处理中...":"移出"),11,Bf)):B("",!0)])]))),128))])])])])])):s.value?(b(),x("div",Ff)):(b(),x("div",Vf," 点击「刷新」加载 Team 成员列表 "))]))}},Kf={class:"mt-6 bg-gray-900 border border-gray-800 rounded-xl p-4"},Wf={class:"text-lg font-semibold text-white mb-4"},Gf={key:0,class:"mb-4 px-4 py-3 rounded-lg text-sm border bg-amber-500/10 text-amber-300 border-amber-500/20"},qf={class:"flex flex-wrap gap-3"},Yf=["onClick","disabled"],Jf={key:1,class:"mt-4 flex items-center gap-3"},zf={class:"text-sm text-gray-400"},Xf=["disabled"],Ao={__name:"TaskPanel",props:{runningTask:Object,adminStatus:{type:Object,default:null},mode:{type:String,default:"all"}},emits:["task-started","refresh"],setup(e,{emit:t}){const s=e,n=t,l=[{key:"rotate",group:"pool",label:"智能轮转",method:"startRotate",needParam:!0,paramName:"target",style:"bg-blue-600 text-white border-blue-500"},{key:"check",group:"pool",label:"检查额度",method:"startCheck",needParam:!1,style:"bg-emerald-600 text-white border-emerald-500"},{key:"fill",group:"pool",label:"补满成员",method:"startFill",needParam:!0,paramName:"target",style:"bg-violet-600 text-white border-violet-500"},{key:"add",group:"pool",label:"添加账号",method:"startAdd",needParam:!1,style:"bg-amber-600 text-white border-amber-500"},{key:"cleanup",group:"pool",label:"清理成员",method:"startCleanup",needParam:!1,style:"bg-rose-600 text-white border-rose-500"},{key:"sync",group:"sync",label:"同步远端",method:"postSync",needParam:!1,sync:!0,allowWithoutAdmin:!0,style:"bg-cyan-600 text-white border-cyan-500"},{key:"pull-cpa",group:"sync",label:"拉取 CPA",method:"postSyncFromCpa",needParam:!1,sync:!0,allowWithoutAdmin:!0,style:"bg-emerald-600 text-white border-emerald-500"},{key:"sync-accounts",group:"sync",label:"同步账号",method:"postSyncAccounts",needParam:!1,sync:!0,allowWithoutAdmin:!0,style:"bg-sky-600 text-white border-sky-500"}],o=M(!1),a=M(""),u=M(5),d=M(null),p=M(""),c=M(""),m=se(()=>{var P;return!!((P=s.adminStatus)!=null&&P.configured)}),v=se(()=>s.mode==="all"?l:l.filter(P=>P.group===s.mode)),$=se(()=>s.mode==="pool"?"账号池操作":s.mode==="sync"?"同步操作":"操作"),j=se(()=>s.mode==="sync"?"同步类操作可独立使用:同步账号、同步已启用远端、拉取 CPA。":"请先在「配置面板」页完成管理员登录后,轮转/补满/清理等账号池操作才会开放。"),I=se(()=>!m.value&&(s.mode==="pool"||s.mode==="sync"));function D(P){return!!(s.runningTask||!m.value&&!P.allowWithoutAdmin)}async function F(P){if(!D(P)){if(p.value="",P.needParam){d.value=P,a.value=P.paramName==="target"?"目标成员数":"最大席位",u.value=5,o.value=!0;return}await G(P)}}async function V(){o.value=!1,d.value&&(await G(d.value,u.value),d.value=null)}async function G(P,Z){try{if(P.sync){const W=await z[P.method]();p.value=W.message||"操作完成",c.value="bg-green-500/10 text-green-400 border border-green-500/20",n("refresh")}else{const W=await z[P.method](Z);p.value=`任务已提交: ${W.task_id}`,c.value="bg-blue-500/10 text-blue-400 border border-blue-500/20",n("task-started")}}catch(W){p.value=W.message,c.value="bg-red-500/10 text-red-400 border border-red-500/20"}setTimeout(()=>{p.value=""},8e3)}return(P,Z)=>(b(),x("div",Kf,[r("h2",Wf,y($.value),1),I.value?(b(),x("div",Gf,y(j.value),1)):B("",!0),r("div",qf,[(b(!0),x(de,null,$e(v.value,W=>(b(),x("button",{key:W.key,onClick:le=>F(W),disabled:D(W),class:Q(["px-4 py-2 rounded-lg text-sm font-medium transition border",D(W)?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":`${W.style} hover:opacity-80`])},y(W.label),11,Yf))),128))]),o.value?(b(),x("div",Jf,[r("label",zf,y(a.value)+":",1),ue(r("input",{"onUpdate:modelValue":Z[0]||(Z[0]=W=>u.value=W),type:"number",min:"1",max:"20",class:"w-20 px-3 py-1.5 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,512),[[Ce,u.value,void 0,{number:!0}]]),r("button",{onClick:V,disabled:d.value&&D(d.value),class:"px-4 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition"}," 确认执行 ",8,Xf),r("button",{onClick:Z[1]||(Z[1]=W=>o.value=!1),class:"px-3 py-1.5 text-gray-400 hover:text-white text-sm transition"}," 取消 ")])):B("",!0),p.value?(b(),x("div",{key:2,class:Q(["mt-4 px-4 py-3 rounded-lg text-sm",c.value])},y(p.value),3)):B("",!0)]))}},Qf={__name:"PoolPage",props:{runningTask:Object,adminStatus:Object},emits:["task-started","refresh"],setup(e){return(t,s)=>(b(),x("div",null,[s[2]||(s[2]=r("h2",{class:"text-xl font-bold text-white mb-2"},"账号池操作",-1)),s[3]||(s[3]=r("p",{class:"text-sm text-gray-400 mb-6"}," 这里集中放轮转、检查、补满、添加、清理等会直接影响账号池状态的操作。 ",-1)),Ve(Ao,{mode:"pool","running-task":e.runningTask,"admin-status":e.adminStatus,onTaskStarted:s[0]||(s[0]=n=>t.$emit("task-started")),onRefresh:s[1]||(s[1]=n=>t.$emit("refresh"))},null,8,["running-task","admin-status"])]))}},Zf={__name:"SyncPage",props:{runningTask:Object,adminStatus:Object},emits:["task-started","refresh"],setup(e){return(t,s)=>(b(),x("div",null,[s[2]||(s[2]=r("h2",{class:"text-xl font-bold text-white mb-2"},"同步中心",-1)),s[3]||(s[3]=r("p",{class:"text-sm text-gray-400 mb-6"}," 这里放对账与同步类操作:本地账号池对账、同步到已启用远端,以及从 CPA 反向拉取认证文件。 ",-1)),Ve(Ao,{mode:"sync","running-task":e.runningTask,"admin-status":e.adminStatus,onTaskStarted:s[0]||(s[0]=n=>t.$emit("task-started")),onRefresh:s[1]||(s[1]=n=>t.$emit("refresh"))},null,8,["running-task","admin-status"])]))}},e0={class:"mt-6 bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},t0={key:0,class:"px-4 py-8 text-center text-gray-500 text-sm"},s0={key:1,class:"overflow-x-auto"},n0={class:"w-full text-sm"},l0={class:"px-4 py-3 font-mono text-xs text-gray-400"},o0={class:"px-4 py-3"},r0={class:"px-2 py-0.5 bg-gray-800 rounded text-xs font-medium text-gray-300"},a0={class:"px-4 py-3 text-xs text-gray-400"},i0={class:"px-4 py-3"},u0={key:0,class:"animate-spin inline-block w-3 h-3 border-2 border-current border-t-transparent rounded-full"},d0={class:"px-4 py-3 text-xs text-gray-400"},c0={class:"px-4 py-3 text-xs text-gray-400"},f0={__name:"TaskHistory",props:{tasks:{type:Array,default:()=>[]}},setup(e){function t(d){return{pending:"text-gray-400",running:"text-yellow-400",completed:"text-green-400",failed:"text-red-400"}[d]||"text-gray-400"}function s(d){return{pending:"bg-gray-400",completed:"bg-green-400",failed:"bg-red-400"}[d]||"bg-gray-400"}function n(d){return{pending:"等待中",running:"执行中",completed:"已完成",failed:"失败"}[d]||d}function l(d){if(!d)return"-";const p=new Date(d*1e3);return`${String(p.getMonth()+1).padStart(2,"0")}-${String(p.getDate()).padStart(2,"0")} ${String(p.getHours()).padStart(2,"0")}:${String(p.getMinutes()).padStart(2,"0")}:${String(p.getSeconds()).padStart(2,"0")}`}function o(d){const p=d.started_at||d.created_at,c=d.finished_at||(d.status==="running"?Date.now()/1e3:null);if(!p||!c)return"-";const m=Math.round(c-p);return m<60?`${m}s`:`${Math.floor(m/60)}m ${m%60}s`}function a(d){return!d||Object.keys(d).length===0?"-":Object.entries(d).map(([p,c])=>`${p}=${c}`).join(", ")}function u(d){return d==null?"-":typeof d=="string"?d:JSON.stringify(d)}return(d,p)=>(b(),x("div",e0,[p[1]||(p[1]=r("div",{class:"px-4 py-3 border-b border-gray-800"},[r("h2",{class:"text-lg font-semibold text-white"},"任务历史")],-1)),e.tasks.length===0?(b(),x("div",t0," 暂无任务记录 ")):(b(),x("div",s0,[r("table",n0,[p[0]||(p[0]=r("thead",null,[r("tr",{class:"text-gray-400 text-left border-b border-gray-800"},[r("th",{class:"px-4 py-3 font-medium"},"任务 ID"),r("th",{class:"px-4 py-3 font-medium"},"命令"),r("th",{class:"px-4 py-3 font-medium"},"参数"),r("th",{class:"px-4 py-3 font-medium"},"状态"),r("th",{class:"px-4 py-3 font-medium"},"创建时间"),r("th",{class:"px-4 py-3 font-medium"},"耗时"),r("th",{class:"px-4 py-3 font-medium"},"结果")])],-1)),r("tbody",null,[(b(!0),x(de,null,$e(e.tasks,c=>(b(),x("tr",{key:c.task_id,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",l0,y(c.task_id),1),r("td",o0,[r("span",r0,y(c.command),1)]),r("td",a0,y(a(c.params)),1),r("td",i0,[r("span",{class:Q(["inline-flex items-center gap-1.5 text-xs font-medium",t(c.status)])},[c.status==="running"?(b(),x("span",u0)):(b(),x("span",{key:1,class:Q(["w-1.5 h-1.5 rounded-full",s(c.status)])},null,2)),_e(" "+y(n(c.status)),1)],2)]),r("td",d0,y(l(c.created_at)),1),r("td",c0,y(o(c)),1),r("td",{class:Q(["px-4 py-3 text-xs max-w-xs truncate",c.error?"text-red-400":"text-gray-400"])},y(c.error||u(c.result)),3)]))),128))])])]))]))}},p0={__name:"TaskHistoryPage",props:{tasks:Array},setup(e){return(t,s)=>(b(),x("div",null,[s[0]||(s[0]=r("h2",{class:"text-xl font-bold text-white mb-2"},"任务历史",-1)),s[1]||(s[1]=r("p",{class:"text-sm text-gray-400 mb-6"}," 查看后台任务的执行状态、耗时、参数和结果,便于排查失败原因。 ",-1)),Ve(f0,{tasks:e.tasks},null,8,["tasks"])]))}},g0={class:"flex items-center justify-between mb-6"},m0={class:"flex items-center gap-3"},b0={class:"flex items-center gap-2 text-sm text-gray-400"},h0=["disabled"],x0={key:0,class:"text-gray-600 text-center py-8"},v0={class:"text-gray-600 shrink-0"},y0={class:"text-gray-300 break-all"},_0={__name:"LogViewer",setup(e){const t=M([]),s=M(!1),n=M(!0),l=M(null);let o=null,a=0;function u(c){const m=new Date(c*1e3);return`${String(m.getHours()).padStart(2,"0")}:${String(m.getMinutes()).padStart(2,"0")}:${String(m.getSeconds()).padStart(2,"0")}`}async function d(){s.value=!0;try{const c=await z.getLogs(500,a);c.logs.length>0&&(a===0?t.value=c.logs:(t.value.push(...c.logs),t.value.length>1e3&&(t.value=t.value.slice(-1e3))),a=c.logs[c.logs.length-1].time,n.value&&Pn(()=>{l.value&&(l.value.scrollTop=l.value.scrollHeight)}))}catch(c){console.error("获取日志失败:",c)}finally{s.value=!1}}function p(){t.value=[],a=0}return Ht(()=>{d(),o=setInterval(d,3e3)}),Ks(()=>{o&&clearInterval(o)}),(c,m)=>(b(),x("div",null,[r("div",g0,[m[2]||(m[2]=r("h2",{class:"text-xl font-bold text-white"},"日志",-1)),r("div",m0,[r("label",b0,[ue(r("input",{type:"checkbox","onUpdate:modelValue":m[0]||(m[0]=v=>n.value=v),class:"rounded bg-gray-800 border-gray-700"},null,512),[[So,n.value]]),m[1]||(m[1]=_e(" 自动滚动 ",-1))]),r("button",{onClick:d,disabled:s.value,class:"px-3 py-1.5 bg-gray-800 hover:bg-gray-700 text-sm rounded-lg border border-gray-700 transition disabled:opacity-50 text-gray-300 hover:text-white"}," 刷新 ",8,h0),r("button",{onClick:p,class:"px-3 py-1.5 bg-gray-800 hover:bg-gray-700 text-sm rounded-lg border border-gray-700 transition text-gray-400 hover:text-white"}," 清空 ")])]),r("div",{ref_key:"logContainer",ref:l,class:"bg-gray-950 border border-gray-800 rounded-xl p-3 md:p-4 font-mono text-xs leading-relaxed h-[calc(100vh-200px)] md:h-[600px] overflow-y-auto"},[t.value.length===0?(b(),x("div",x0,"暂无日志")):B("",!0),(b(!0),x(de,null,$e(t.value,(v,$)=>(b(),x("div",{key:$,class:"py-0.5 flex gap-3 hover:bg-gray-900/50"},[r("span",v0,y(u(v.time)),1),r("span",{class:Q(["shrink-0 w-16",{"text-red-400":v.level==="ERROR","text-yellow-400":v.level==="WARNING","text-blue-400":v.level==="INFO","text-gray-500":v.level==="DEBUG"}])},y(v.level),3),r("span",y0,y(v.message),1)]))),128))],512)]))}},w0={class:"mt-6 space-y-6"},S0={class:"bg-gray-900 border border-gray-800 rounded-xl p-4"},k0={class:"flex items-center justify-between gap-4 mb-4"},A0={key:1,class:"mb-4 px-4 py-3 rounded-lg text-sm border bg-green-500/10 text-green-400 border-green-500/20"},C0={key:2,class:"mb-4 px-4 py-3 rounded-lg text-sm border bg-red-500/10 text-red-400 border-red-500/20"},$0={key:3,class:"flex flex-wrap gap-3"},T0=["disabled"],P0={key:4,class:"space-y-4"},I0={class:"space-y-2"},E0={class:"p-3 bg-gray-800 border border-gray-700 rounded-lg text-xs font-mono break-all text-gray-200"},O0={class:"flex flex-wrap gap-3"},R0=["href"],M0={key:0,class:"text-xs text-emerald-300"},U0={class:"space-y-3"},L0=["disabled"],D0=["disabled"],N0={key:1,class:"text-xs text-emerald-300"},j0={class:"flex justify-end"},B0=["disabled"],F0={__name:"OAuthPage",props:{manualAccountStatus:{type:Object,default:null}},emits:["refresh","progress"],setup(e,{emit:t}){const s=e,n=t,l=M(""),o=M(!1),a=M(""),u=M(""),d=M(""),p=se(()=>{var j;return!!((j=s.manualAccountStatus)!=null&&j.in_progress)});$t(()=>s.manualAccountStatus,j=>{j!=null&&j.in_progress||(l.value="",a.value="")},{immediate:!0});function c(j,I="success"){u.value=j,d.value=I==="success"?"bg-green-500/10 text-green-400 border-green-500/20":"bg-red-500/10 text-red-400 border-red-500/20",window.clearTimeout(c._timer),c._timer=window.setTimeout(()=>{u.value=""},8e3)}async function m(){o.value=!0,a.value="正在生成 OAuth 链接...";try{const j=await z.startManualAccount();c(j.auth_url?"OAuth 链接已生成,请完成登录后粘贴回调 URL":"已开始 OAuth 登录流程"),n("progress")}catch(j){c(j.message,"error")}finally{o.value=!1,a.value=""}}async function v(){o.value=!0,a.value="正在提交回调 URL 并交换 token...";try{const j=await z.submitManualAccountCallback(l.value);c(j.status==="completed"?j.message||"账号已添加":"回调 URL 已提交"),n("progress")}catch(j){c(j.message,"error")}finally{o.value=!1,a.value=""}}async function $(){o.value=!0;try{await z.cancelManualAccount(),l.value="",c("OAuth 登录流程已取消"),n("refresh")}catch(j){c(j.message,"error")}finally{o.value=!1}}return(j,I)=>{var D,F,V,G,P,Z,W,le,ve,Pe,Se;return b(),x("div",w0,[r("div",S0,[r("div",k0,[I[1]||(I[1]=r("div",null,[r("h2",{class:"text-lg font-semibold text-white"},"OAuth 登录"),r("p",{class:"text-sm text-gray-400 mt-1"}," 参考 CLIProxyAPI 的手动 OAuth 思路:系统先生成认证链接,你在浏览器中手动完成登录,最后把回调 URL 粘贴回来完成认证。 ")],-1)),r("span",{class:Q(["min-w-[72px] px-3 py-1.5 rounded-full text-xs text-center whitespace-nowrap border",p.value?"bg-yellow-500/10 text-yellow-300 border-yellow-500/20":"bg-gray-800 text-gray-400 border-gray-700"])},y(p.value?"进行中":"空闲"),3)]),u.value?(b(),x("div",{key:0,class:Q(["mb-4 px-4 py-3 rounded-lg text-sm border",d.value])},y(u.value),3)):B("",!0),((D=e.manualAccountStatus)==null?void 0:D.status)==="completed"&&((F=e.manualAccountStatus)!=null&&F.account)?(b(),x("div",A0,y(e.manualAccountStatus.message||`已添加账号 ${e.manualAccountStatus.account.email}`),1)):((V=e.manualAccountStatus)==null?void 0:V.status)==="error"&&((G=e.manualAccountStatus)!=null&&G.error)?(b(),x("div",C0,y(e.manualAccountStatus.error),1)):B("",!0),p.value?(b(),x("div",P0,[I[3]||(I[3]=r("div",{class:"text-sm text-gray-300"},[_e(" 已生成 OAuth 链接。若当前机器可访问 "),r("span",{class:"font-mono"},"localhost:1455"),_e(",系统会自动接收回调;否则请手动粘贴最终回调 URL。 ")],-1)),r("div",{class:Q(["px-4 py-3 rounded-lg text-sm border",(P=e.manualAccountStatus)!=null&&P.auto_callback_available?"bg-blue-500/10 text-blue-300 border-blue-500/20":"bg-amber-500/10 text-amber-300 border-amber-500/20"])},y((Z=e.manualAccountStatus)!=null&&Z.auto_callback_available?"本地自动回调服务已启动:OpenAI 跳回 localhost:1455 后会自动完成认证。":`本地自动回调不可用:${((W=e.manualAccountStatus)==null?void 0:W.auto_callback_error)||"请改用手动粘贴回调 URL"}`),3),r("div",I0,[I[2]||(I[2]=r("div",{class:"text-xs text-gray-500"},"OAuth 链接",-1)),r("div",E0,y((le=e.manualAccountStatus)==null?void 0:le.auth_url),1)]),r("div",O0,[r("a",{href:(ve=e.manualAccountStatus)==null?void 0:ve.auth_url,target:"_blank",rel:"noopener noreferrer",class:"px-4 py-2 bg-emerald-700 hover:bg-emerald-600 text-white text-sm rounded-lg transition"}," 打开 OAuth 链接 ",8,R0)]),(Pe=e.manualAccountStatus)!=null&&Pe.callback_received?(b(),x("div",M0," 已收到"+y(((Se=e.manualAccountStatus)==null?void 0:Se.callback_source)==="auto"?"自动":"手动")+"回调,刷新轮询中… ",1)):B("",!0),r("div",U0,[ue(r("input",{"onUpdate:modelValue":I[0]||(I[0]=J=>l.value=J),type:"text",placeholder:"粘贴回调 URL,例如 http://localhost:1455/auth/callback?code=...&state=...",disabled:o.value,class:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm text-white focus:outline-none focus:border-blue-500"},null,8,L0),[[Ce,l.value,void 0,{trim:!0}]]),r("button",{onClick:v,disabled:o.value||!l.value,class:"px-4 py-2 bg-emerald-700 hover:bg-emerald-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(o.value?"提交中...":"提交回调 URL"),9,D0)]),o.value&&a.value?(b(),x("div",N0,y(a.value),1)):B("",!0),r("div",j0,[r("button",{onClick:$,disabled:o.value,class:"px-4 py-2 bg-gray-800 hover:bg-gray-700 text-sm text-gray-200 rounded-lg border border-gray-700 transition disabled:opacity-50"}," 取消 OAuth 登录 ",8,B0)])])):(b(),x("div",$0,[r("button",{onClick:m,disabled:o.value,class:"px-4 py-2 bg-emerald-700 hover:bg-emerald-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(o.value?"生成中...":"生成 OAuth 链接"),9,T0)]))])])}}},Co="autoteam_theme",Tt=M("dark");let hl=!1;function $o(e){if(typeof document>"u")return;const t=e==="light"?"light":"dark";document.documentElement.dataset.theme=t,document.documentElement.style.colorScheme=t}function To(){if(!hl){if(hl=!0,typeof window<"u"){const e=window.localStorage.getItem(Co);Tt.value=e==="light"||e==="dark"?e:"dark"}$o(Tt.value)}}function Po(e){Tt.value=e==="light"?"light":"dark",typeof window<"u"&&window.localStorage.setItem(Co,Tt.value),$o(Tt.value)}function V0(){Po(Tt.value==="dark"?"light":"dark")}function H0(){return To(),{theme:Tt,isDark:se(()=>Tt.value==="dark"),setTheme:Po,toggleTheme:V0}}const K0=["title","aria-label"],W0={class:"text-base"},G0={class:"hidden sm:inline"},xl={__name:"ThemeToggle",props:{floating:{type:Boolean,default:!1}},setup(e){const{isDark:t,toggleTheme:s}=H0();return(n,l)=>(b(),x("button",{type:"button",class:Q(["theme-toggle",{"theme-toggle-floating":e.floating}]),title:Lt(t)?"切换到白天模式":"切换到夜间模式","aria-label":Lt(t)?"切换到白天模式":"切换到夜间模式",onClick:l[0]||(l[0]=(...o)=>Lt(s)&&Lt(s)(...o))},[r("span",W0,y(Lt(t)?"🌙":"☀️"),1),r("span",G0,y(Lt(t)?"夜间":"白天"),1)],10,K0))}},q0={key:2,class:"relative min-h-screen overflow-hidden"},Y0={class:"relative mx-auto flex min-h-screen max-w-6xl items-center px-4 py-10"},J0={class:"grid w-full items-center gap-8 lg:grid-cols-[1.2fr_0.8fr]"},z0={class:"glass-card w-full p-7 sm:p-8"},X0={key:0,class:"mb-4 rounded-2xl border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-300"},Q0={class:"space-y-4"},Z0=["disabled"],ep={key:3,class:"relative md:flex"},tp={class:"relative min-w-0 flex-1 overflow-y-auto pb-20 md:pb-8"},sp={class:"mx-auto w-full max-w-[1500px] px-4 py-4 md:px-8 md:py-8"},np={class:"mb-5 flex justify-end"},lp={key:0,class:"mb-5 flex items-center gap-3 rounded-2xl border border-amber-400/20 bg-amber-500/10 px-4 py-3 text-sm text-amber-200 backdrop-blur"},op={class:"font-medium"},rp={__name:"App",setup(e){const t=M(!1),s=M(!1),n=M(!1),l=M(!1),o=M(""),a=M(""),u=M("dashboard"),d=M(null),p=M(null),c=M(null),m=M(null),v=M([]),$=M(!1),j=M(null),I=se(()=>{var J,X;return(J=p.value)!=null&&J.login_in_progress?{command:"admin-login"}:(X=c.value)!=null&&X.in_progress?{command:"main-codex-sync"}:j.value});let D=null;async function F(){try{const J=await z.checkAuth();return s.value=J.authenticated,n.value=J.auth_required,J.authenticated}catch(J){return J.status===401?(s.value=!1,n.value=!0,!1):(s.value=!0,n.value=!1,!0)}}async function V(){o.value="",l.value=!0;try{Us(a.value),await F()?(a.value="",P(),le(6e5)):(nn(),o.value="API Key 无效")}catch(J){nn(),o.value=J.message}finally{l.value=!1}}function G(){nn(),s.value=!1,ve()}async function P(){$.value=!0;try{const[J,X,Ee,ee,De]=await Promise.all([z.getStatus(),z.getTasks(),z.getAdminStatus(),z.getMainCodexStatus(),z.getManualAccountStatus()]);d.value=J,v.value=X,p.value=Ee,c.value=ee,m.value=De,j.value=X.find(he=>he.status==="running"||he.status==="pending")||null}catch(J){if(J.status===401){s.value=!1;return}console.error("刷新失败:",J)}finally{$.value=!1}}function Z(){le(1e4),P()}function W(){le(1e4),P()}function le(J=6e5){ve(),D=setInterval(async()=>{await P(),!I.value&&J<6e5&&le(6e5)},J)}function ve(){D&&(clearInterval(D),D=null)}async function Pe(){try{return(await z.getSetupStatus()).configured}catch{return!0}}function Se(){t.value=!1,F().then(J=>{J&&(P(),le(6e5))})}return Ht(async()=>{if(To(),!await Pe()){t.value=!0;return}await F()&&(P(),le(6e5))}),Ks(()=>{ve()}),(J,X)=>(b(),x(de,null,[t.value||!s.value?(b(),qe(xl,{key:0,floating:""})):B("",!0),t.value?(b(),qe(hi,{key:1,onConfigured:Se})):s.value?(b(),x("div",ep,[X[8]||(X[8]=r("div",{class:"pointer-events-none absolute inset-0 overflow-hidden"},[r("div",{class:"absolute left-[10%] top-0 h-72 w-72 rounded-full bg-blue-500/8 blur-3xl"}),r("div",{class:"absolute bottom-0 right-[8%] h-80 w-80 rounded-full bg-cyan-500/8 blur-3xl"})],-1)),Ve(Ei,{active:u.value,loading:$.value,"auth-required":n.value,onNavigate:X[1]||(X[1]=Ee=>u.value=Ee),onRefresh:P,onLogout:G},null,8,["active","loading","auth-required"]),r("div",tp,[r("div",sp,[r("div",np,[Ve(xl)]),I.value?(b(),x("div",lp,[X[7]||(X[7]=r("span",{class:"inline-block h-4 w-4 animate-spin rounded-full border-2 border-amber-300 border-t-transparent"},null,-1)),r("span",op,y(I.value.command==="admin-login"?"管理员登录中...":I.value.command==="main-codex-sync"?"主号 Codex 同步中...":`${I.value.command} 执行中...`),1)])):B("",!0),u.value==="dashboard"?(b(),qe(bu,{key:1,status:d.value,loading:$.value,"running-task":I.value,"admin-status":p.value,onRefresh:P,onTaskStarted:Z},null,8,["status","loading","running-task","admin-status"])):u.value==="config"?(b(),qe(_f,{key:2,"admin-status":p.value,"codex-status":c.value,onRefresh:P,onAdminProgress:W},null,8,["admin-status","codex-status"])):u.value==="team"?(b(),qe(Hf,{key:3})):u.value==="pool"?(b(),qe(Qf,{key:4,"running-task":I.value,"admin-status":p.value,onTaskStarted:Z,onRefresh:P},null,8,["running-task","admin-status"])):u.value==="sync"?(b(),qe(Zf,{key:5,"running-task":I.value,"admin-status":p.value,onTaskStarted:Z,onRefresh:P},null,8,["running-task","admin-status"])):u.value==="oauth"?(b(),qe(F0,{key:6,"manual-account-status":m.value,onRefresh:P,onProgress:W},null,8,["manual-account-status"])):u.value==="tasks"?(b(),qe(p0,{key:7,tasks:v.value},null,8,["tasks"])):u.value==="logs"?(b(),qe(_0,{key:8})):B("",!0)])])])):(b(),x("div",q0,[X[6]||(X[6]=r("div",{class:"pointer-events-none absolute inset-0"},[r("div",{class:"absolute left-[-8rem] top-[-8rem] h-72 w-72 rounded-full bg-blue-500/20 blur-3xl"}),r("div",{class:"absolute bottom-[-10rem] right-[-5rem] h-80 w-80 rounded-full bg-cyan-500/15 blur-3xl"})],-1)),r("div",Y0,[r("div",J0,[X[5]||(X[5]=Vt('',1)),r("div",z0,[X[3]||(X[3]=r("div",{class:"mb-6 flex items-center gap-3"},[r("div",{class:"flex h-12 w-12 items-center justify-center rounded-2xl bg-gradient-to-br from-blue-500/30 to-cyan-500/20 text-2xl shadow-inner shadow-white/10"}," ⚡ "),r("div",null,[r("h2",{class:"text-2xl font-semibold text-white"},"登录面板"),r("p",{class:"mt-1 text-sm text-slate-400"},"请输入 API Key 进入 AutoTeam")])],-1)),o.value?(b(),x("div",X0,y(o.value),1)):B("",!0),r("div",Q0,[r("div",null,[X[2]||(X[2]=r("label",{class:"mb-2 block text-sm font-medium text-slate-300"},"API Key",-1)),ue(r("input",{"onUpdate:modelValue":X[0]||(X[0]=Ee=>a.value=Ee),type:"password",placeholder:"输入 API Key",onKeyup:Za(V,["enter"]),class:"input-dark"},null,544),[[Ce,a.value,void 0,{trim:!0}]])]),r("button",{onClick:V,disabled:!a.value||l.value,class:"btn-primary w-full"},y(l.value?"验证中...":"登录"),9,Z0)]),X[4]||(X[4]=r("div",{class:"mt-5 rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-xs leading-6 text-slate-400"}," 如果你是首次部署,启动后只需要先配置 API Key。CloudMail、CPA / Sub2API、代理等运行项可以在登录后进入配置面板继续设置。 ",-1))])])])]))],64))}};si(rp).mount("#app"); diff --git a/src/autoteam/web/dist/index.html b/src/autoteam/web/dist/index.html index fe893685..960d1aed 100644 --- a/src/autoteam/web/dist/index.html +++ b/src/autoteam/web/dist/index.html @@ -1,14 +1,14 @@ - - - - - - AutoTeam - - + + + + + + AutoTeam + + - - -
- - + + +
+ + diff --git a/web/src/components/Settings.vue b/web/src/components/Settings.vue index 20427da6..5f7edcfa 100644 --- a/web/src/components/Settings.vue +++ b/web/src/components/Settings.vue @@ -392,6 +392,16 @@ +
+ + +
@@ -399,7 +409,8 @@ 每 {{ form.interval }} 分钟检查一次,按 Team 总 seat {{ form.target_seats }} 个做自动轮转 / 补位判断; {{ form.min_low }} 个以上账号剩余低于 {{ form.threshold }}% 时自动轮转; seat=2 时会对低额度子号启用 best-effort 预切换,若满员无法先加新号则自动回退到先移后补; - add_phone {{ form.retry_add_phone ? `开启自动重试(最多 ${form.add_phone_max_retries} 次)` : '保持人工处理' }} + add_phone {{ form.retry_add_phone ? `开启自动重试(最多 ${form.add_phone_max_retries} 次)` : '保持人工处理' }}; + {{ form.skip_standby_reuse ? '已跳过复用旧账号,轮转时直接注册新账号' : '轮转时优先复用旧账号' }}