diff --git a/.env.example b/.env.example index a1ad1357..b88ed2bb 100644 --- a/.env.example +++ b/.env.example @@ -54,3 +54,5 @@ EMAIL_POLL_TIMEOUT=300 AUTO_CHECK_INTERVAL=300 # 巡检间隔(秒),默认 5 分钟 AUTO_CHECK_THRESHOLD=10 # 额度低于此百分比触发轮转,默认 10% AUTO_CHECK_MIN_LOW=2 # 至少几个账号低于阈值才触发,默认 2 +AUTO_CHECK_RETRY_ADD_PHONE=true # 是否自动重试 add_phone(手机号验证) +AUTO_CHECK_ADD_PHONE_MAX_RETRIES=3 # add_phone 最大自动重试次数 diff --git a/docs/configuration.md b/docs/configuration.md index c4a5cc74..cb734783 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -41,6 +41,8 @@ cp .env.example .env | `AUTO_CHECK_THRESHOLD` | 额度低于此百分比触发轮转 | 否(默认 `10`) | | `AUTO_CHECK_INTERVAL` | 巡检间隔(秒) | 否(默认 `300`) | | `AUTO_CHECK_MIN_LOW` | 至少几个账号低于阈值才触发 | 否(默认 `2`) | +| `AUTO_CHECK_RETRY_ADD_PHONE` | 是否自动重试 `add_phone`(手机号验证) | 否(默认 `true`) | +| `AUTO_CHECK_ADD_PHONE_MAX_RETRIES` | `add_phone` 最大自动重试次数 | 否(默认 `3`) | ## 配置面板分区 @@ -146,6 +148,8 @@ PLAYWRIGHT_PROXY_URL=http://username:password@host.docker.internal:1080 ```env AUTO_CHECK_INTERVAL=300 # 5 分钟 +AUTO_CHECK_RETRY_ADD_PHONE=true +AUTO_CHECK_ADD_PHONE_MAX_RETRIES=3 ``` Windows / macOS 下也会按 UTF-8 正常读取。 diff --git a/src/autoteam/api.py b/src/autoteam/api.py index 02c33eec..558e1cda 100644 --- a/src/autoteam/api.py +++ b/src/autoteam/api.py @@ -161,6 +161,8 @@ class SourceConfig(BaseModel): "AUTO_CHECK_INTERVAL", "AUTO_CHECK_THRESHOLD", "AUTO_CHECK_MIN_LOW", + "AUTO_CHECK_RETRY_ADD_PHONE", + "AUTO_CHECK_ADD_PHONE_MAX_RETRIES", "PLAYWRIGHT_PROXY_URL", "PLAYWRIGHT_PROXY_SERVER", "PLAYWRIGHT_PROXY_USERNAME", @@ -577,11 +579,19 @@ def _sync_runtime_globals(): return try: - from autoteam.config import AUTO_CHECK_INTERVAL, AUTO_CHECK_MIN_LOW, AUTO_CHECK_THRESHOLD + from autoteam.config import ( + AUTO_CHECK_ADD_PHONE_MAX_RETRIES, + AUTO_CHECK_INTERVAL, + AUTO_CHECK_MIN_LOW, + AUTO_CHECK_RETRY_ADD_PHONE, + AUTO_CHECK_THRESHOLD, + ) auto_check_config["interval"] = AUTO_CHECK_INTERVAL auto_check_config["threshold"] = AUTO_CHECK_THRESHOLD 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 if auto_check_restart is not None: auto_check_restart.set() except Exception: @@ -2341,12 +2351,18 @@ def get_task(task_id: str): # 后台自动巡检 # --------------------------------------------------------------------------- +from autoteam.config import ( + AUTO_CHECK_ADD_PHONE_MAX_RETRIES as _DEFAULT_ADD_PHONE_MAX_RETRIES, +) from autoteam.config import ( AUTO_CHECK_INTERVAL as _DEFAULT_INTERVAL, ) from autoteam.config import ( AUTO_CHECK_MIN_LOW as _DEFAULT_MIN_LOW, ) +from autoteam.config import ( + AUTO_CHECK_RETRY_ADD_PHONE as _DEFAULT_RETRY_ADD_PHONE, +) from autoteam.config import ( AUTO_CHECK_THRESHOLD as _DEFAULT_THRESHOLD, ) @@ -2356,6 +2372,8 @@ def get_task(task_id: str): "interval": _DEFAULT_INTERVAL, "threshold": _DEFAULT_THRESHOLD, "min_low": _DEFAULT_MIN_LOW, + "retry_add_phone": _DEFAULT_RETRY_ADD_PHONE, + "add_phone_max_retries": _DEFAULT_ADD_PHONE_MAX_RETRIES, } _auto_check_stop = threading.Event() _auto_check_restart = threading.Event() # 配置变更时通知线程重启 @@ -2837,22 +2855,35 @@ class AutoCheckConfig(BaseModel): interval: int = 300 # 巡检间隔(秒) threshold: int = 10 # 额度阈值(%) min_low: int = 2 # 触发轮转的最少账号数 + retry_add_phone: bool = True # 是否自动重试 add_phone + add_phone_max_retries: int = 3 # add_phone 最大自动重试次数 -def _normalized_auto_check_config(cfg: AutoCheckConfig | dict[str, int]) -> dict[str, int]: +def _normalized_auto_check_config(cfg: AutoCheckConfig | dict[str, object]) -> dict[str, int | bool]: if isinstance(cfg, AutoCheckConfig): interval = cfg.interval threshold = cfg.threshold min_low = cfg.min_low + retry_add_phone = cfg.retry_add_phone + add_phone_max_retries = cfg.add_phone_max_retries else: interval = cfg.get("interval", _auto_check_config.get("interval", _DEFAULT_INTERVAL)) threshold = cfg.get("threshold", _auto_check_config.get("threshold", _DEFAULT_THRESHOLD)) min_low = cfg.get("min_low", _auto_check_config.get("min_low", _DEFAULT_MIN_LOW)) + retry_add_phone = cfg.get( + "retry_add_phone", _auto_check_config.get("retry_add_phone", _DEFAULT_RETRY_ADD_PHONE) + ) + add_phone_max_retries = cfg.get( + "add_phone_max_retries", + _auto_check_config.get("add_phone_max_retries", _DEFAULT_ADD_PHONE_MAX_RETRIES), + ) return { "interval": max(60, int(interval)), "threshold": max(1, min(100, int(threshold))), "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)), } @@ -2874,6 +2905,8 @@ def set_auto_check_config(cfg: AutoCheckConfig): "AUTO_CHECK_INTERVAL": str(normalized["interval"]), "AUTO_CHECK_THRESHOLD": str(normalized["threshold"]), "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"]), } for key, value in persisted.items(): os.environ[key] = value @@ -2882,10 +2915,12 @@ def set_auto_check_config(cfg: AutoCheckConfig): _sync_runtime_env_reload_state() _auto_check_restart.set() # 唤醒巡检线程,立即应用新配置 logger.info( - "[巡检] 配置已更新并持久化: 间隔=%ds 阈值=%d%% 触发=%d个", + "[巡检] 配置已更新并持久化: 间隔=%ds 阈值=%d%% 触发=%d个 add_phone自动重试=%s 最大重试=%d", _auto_check_config["interval"], _auto_check_config["threshold"], _auto_check_config["min_low"], + "开" if _auto_check_config["retry_add_phone"] else "关", + _auto_check_config["add_phone_max_retries"], ) return _auto_check_config.copy() diff --git a/src/autoteam/config.py b/src/autoteam/config.py index 4d63b6c5..f866ca9f 100644 --- a/src/autoteam/config.py +++ b/src/autoteam/config.py @@ -100,6 +100,8 @@ def _normalize_chatgpt_api_transport(value: str) -> str: AUTO_CHECK_INTERVAL = _get_int_env("AUTO_CHECK_INTERVAL", 300) # 巡检间隔(秒),默认 5 分钟 AUTO_CHECK_THRESHOLD = _get_int_env("AUTO_CHECK_THRESHOLD", 10) # 额度低于此百分比触发轮转,默认 10% 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 最大自动重试次数 # Playwright 代理配置 PLAYWRIGHT_PROXY_URL = os.environ.get("PLAYWRIGHT_PROXY_URL", "").strip() diff --git a/src/autoteam/manager.py b/src/autoteam/manager.py index e0485176..3eafe65f 100644 --- a/src/autoteam/manager.py +++ b/src/autoteam/manager.py @@ -93,7 +93,8 @@ def _chatgpt_session_ready(chatgpt_api) -> bool: return bool(getattr(chatgpt_api, "browser", None)) -AUTH_REPAIR_HARD_FAILURE_TYPES = {"add_phone", "human_verification"} +AUTH_REPAIR_HARD_FAILURE_TYPES = {"human_verification"} +AUTH_REPAIR_SINGLE_ATTEMPT_FAILURE_TYPES = {"add_phone", "human_verification"} def _normalized_email(value: str | None) -> str: @@ -219,6 +220,51 @@ def _auth_repair_retry_delays() -> tuple[int, int, int]: return (interval * 2, interval * 4, interval * 6) +def _auth_repair_retry_add_phone_enabled() -> bool: + from autoteam.config import AUTO_CHECK_RETRY_ADD_PHONE + + enabled = AUTO_CHECK_RETRY_ADD_PHONE + try: + from autoteam.api import _auto_check_config + + enabled = bool(_auto_check_config.get("retry_add_phone", enabled)) + except Exception: + pass + + return bool(enabled) + + +def _auth_repair_add_phone_max_retries() -> int: + from autoteam.config import AUTO_CHECK_ADD_PHONE_MAX_RETRIES + + retries = AUTO_CHECK_ADD_PHONE_MAX_RETRIES + try: + from autoteam.api import _auto_check_config + + retries = int(_auto_check_config.get("add_phone_max_retries", retries) or retries) + except Exception: + pass + + return max(1, int(retries)) + + +def _auth_repair_add_phone_retry_delays(max_retries: int | None = None) -> tuple[int, ...]: + from autoteam.config import AUTO_CHECK_INTERVAL + + interval = AUTO_CHECK_INTERVAL + try: + from autoteam.api import _auto_check_config + + interval = int(_auto_check_config.get("interval", interval) or interval) + except Exception: + pass + + retries = _auth_repair_add_phone_max_retries() if max_retries is None else max_retries + interval = max(60, int(interval)) + retries = max(1, int(retries)) + return tuple(interval * (2**idx) for idx in range(retries)) + + def _auth_repair_error_label(error_type: str | None) -> str: mapping = { "add_phone": "手机号验证", @@ -251,6 +297,37 @@ def _auth_repair_reset(email: str): update_account(email, **_auth_repair_reset_fields()) +def _release_auth_repair_team_seat(email: str, *, chatgpt_api=None) -> str: + managed_chatgpt = chatgpt_api + started_here = False + + try: + if managed_chatgpt is None: + managed_chatgpt = ChatGPTTeamAPI() + + if not _chatgpt_session_ready(managed_chatgpt): + managed_chatgpt.start() + started_here = True + + return str(remove_from_team(managed_chatgpt, email, return_status=True)) + except Exception as exc: + logger.warning("[认证修复] 释放 %s 的 Team 席位失败: %s", email, exc) + return "failed" + finally: + if started_here and _chatgpt_session_ready(managed_chatgpt): + managed_chatgpt.stop() + + +def _auth_repair_result_suffix(result: dict | None) -> str: + result = result or {} + suffix = _auth_repair_state_suffix(result) + if result.get("seat_released"): + return f"{suffix},已释放 Team 席位" + if result.get("release_attempted") and result.get("remove_status") == "failed": + return f"{suffix},释放 Team 席位失败" + return suffix + + def _auth_repair_skip_reason(acc: dict | None, *, force: bool = False, now: float | None = None) -> str | None: if force or not acc: return None @@ -269,14 +346,46 @@ def _auth_repair_skip_reason(acc: dict | None, *, force: bool = False, now: floa return None -def _record_auth_repair_failure(email: str, error_type: str | None = None, error_detail: str | None = None) -> dict: +def _record_auth_repair_failure( + email: str, + error_type: str | None = None, + error_detail: str | None = None, + *, + chatgpt_api=None, +) -> dict: now = time.time() acc = find_account(load_accounts(), email) or {"email": email} error_type = error_type or "login_failed" error_detail = error_detail or _auth_repair_error_label(error_type) retry_delays = _auth_repair_retry_delays() - - if error_type in AUTH_REPAIR_HARD_FAILURE_TYPES: + release_team_seat = False + + if error_type == "add_phone" and _auth_repair_retry_add_phone_enabled(): + prev_count = int(acc.get("auth_retry_count") or 0) if acc.get("auth_last_error") == "add_phone" else 0 + next_count = prev_count + 1 + max_retries = _auth_repair_add_phone_max_retries() + add_phone_delays = _auth_repair_add_phone_retry_delays(max_retries) + + if next_count > max_retries: + state = { + "auth_retry_count": next_count, + "auth_last_error": error_type, + "auth_last_error_detail": error_detail, + "auth_last_failed_at": now, + "auth_retry_after": None, + "auth_retry_paused": True, + } + release_team_seat = True + else: + state = { + "auth_retry_count": next_count, + "auth_last_error": error_type, + "auth_last_error_detail": error_detail, + "auth_last_failed_at": now, + "auth_retry_after": now + add_phone_delays[next_count - 1], + "auth_retry_paused": False, + } + elif error_type in AUTH_REPAIR_HARD_FAILURE_TYPES or error_type == "add_phone": retry_count = max(int(acc.get("auth_retry_count") or 0), len(retry_delays)) state = { "auth_retry_count": retry_count, @@ -286,23 +395,44 @@ def _record_auth_repair_failure(email: str, error_type: str | None = None, error "auth_retry_after": None, "auth_retry_paused": True, } - update_account(email, **state) - return state - - prev_count = int(acc.get("auth_retry_count") or 0) - next_count = min(prev_count + 1, len(retry_delays)) - delay = retry_delays[max(0, next_count - 1)] - retry_after = now + delay - state = { - "auth_retry_count": next_count, - "auth_last_error": error_type, - "auth_last_error_detail": error_detail, - "auth_last_failed_at": now, - "auth_retry_after": retry_after, - "auth_retry_paused": False, - } + else: + prev_count = int(acc.get("auth_retry_count") or 0) + next_count = min(prev_count + 1, len(retry_delays)) + delay = retry_delays[max(0, next_count - 1)] + retry_after = now + delay + state = { + "auth_retry_count": next_count, + "auth_last_error": error_type, + "auth_last_error_detail": error_detail, + "auth_last_failed_at": now, + "auth_retry_after": retry_after, + "auth_retry_paused": False, + } + update_account(email, **state) - return state + + is_team_member = _is_email_in_team(email) + if not is_team_member and acc.get("status") in (STATUS_ACTIVE, STATUS_EXHAUSTED, STATUS_AUTH_PENDING): + is_team_member = True + + release_attempted = False + remove_status = None + seat_released = False + if release_team_seat and is_team_member: + release_attempted = True + remove_status = _release_auth_repair_team_seat(email, chatgpt_api=chatgpt_api) + seat_released = remove_status in ("removed", "already_absent") + + final_status = STATUS_STANDBY if seat_released or not is_team_member else STATUS_AUTH_PENDING + update_account(email, status=final_status) + + return { + **state, + "status": final_status, + "seat_released": seat_released, + "release_attempted": release_attempted, + "remove_status": remove_status, + } def _login_codex_with_result( @@ -390,7 +520,7 @@ def _reject_non_team(bundle: dict | None) -> dict | None: last_result = result error_type = result.get("error_type") retryable = bool(result.get("retryable")) - if attempt >= max_attempts or not retryable or error_type in AUTH_REPAIR_HARD_FAILURE_TYPES: + if attempt >= max_attempts or not retryable or error_type in AUTH_REPAIR_SINGLE_ATTEMPT_FAILURE_TYPES: return result logger.warning( @@ -999,32 +1129,30 @@ def cmd_check(force_auth_repair=False): update_account(email, status=STATUS_ACTIVE, last_active_at=time.time()) logger.info("[%s] 额度可用", email) elif status_str == "auth_error": - final_status = _set_auth_pending_or_standby(email) - state = _record_auth_repair_failure( + result = _record_auth_repair_failure( email, login_result.get("error_type") or "non_team_plan", login_result.get("error_detail") or "重新登录后仍无法查询额度", ) - extra = _auth_repair_state_suffix(state) + extra = _auth_repair_result_suffix(result) logger.warning( "[%s] 重新登录后仍无法查询额度(可能未选中 Team workspace),标记为 %s%s", email, - final_status, + result.get("status"), extra, ) else: - final_status = _set_auth_pending_or_standby(email) - state = _record_auth_repair_failure( + result = _record_auth_repair_failure( email, login_result.get("error_type"), login_result.get("error_detail"), ) - extra = _auth_repair_state_suffix(state) + extra = _auth_repair_result_suffix(result) logger.error( "[%s] Codex 登录失败,标记为 %s(%s%s)", email, - final_status, - _auth_repair_error_label(state.get("auth_last_error")), + result.get("status"), + _auth_repair_error_label(result.get("auth_last_error")), extra, ) @@ -1139,13 +1267,13 @@ def _complete_registration(email, password, invite_link, mail_client): logger.info("[注册] 账号就绪: %s", email) return email else: - update_account(email, status=STATUS_AUTH_PENDING) - state = _record_auth_repair_failure(email, login_result.get("error_type"), login_result.get("error_detail")) - extra = _auth_repair_state_suffix(state) + result = _record_auth_repair_failure(email, login_result.get("error_type"), login_result.get("error_detail")) + extra = _auth_repair_result_suffix(result) logger.warning( - "[注册] 账号已加入 Team 但 Codex 登录失败,标记为 auth_pending: %s(%s%s)", + "[注册] 账号已加入 Team 但 Codex 登录失败,标记为 %s: %s(%s%s)", + result.get("status"), email, - _auth_repair_error_label(state.get("auth_last_error")), + _auth_repair_error_label(result.get("auth_last_error")), extra, ) return email @@ -1963,13 +2091,13 @@ def create_account_direct(mail_client): logger.info("[直接注册] 账号就绪: %s", email) return email else: - update_account(email, status=STATUS_AUTH_PENDING) - state = _record_auth_repair_failure(email, login_result.get("error_type"), login_result.get("error_detail")) - extra = _auth_repair_state_suffix(state) + result = _record_auth_repair_failure(email, login_result.get("error_type"), login_result.get("error_detail")) + extra = _auth_repair_result_suffix(result) logger.warning( - "[直接注册] 账号已加入 Team 但 Codex 登录失败,标记为 auth_pending: %s(%s%s)", + "[直接注册] 账号已加入 Team 但 Codex 登录失败,标记为 %s: %s(%s%s)", + result.get("status"), email, - _auth_repair_error_label(state.get("auth_last_error")), + _auth_repair_error_label(result.get("auth_last_error")), extra, ) return email @@ -2012,14 +2140,18 @@ def reinvite_account(chatgpt_api, mail_client, acc): login_result = _login_codex_with_result(email, password, mail_client=mail_client) bundle = login_result.get("bundle") if not login_result.get("ok") or not bundle: - final_status = _set_auth_pending_or_standby(email) - state = _record_auth_repair_failure(email, login_result.get("error_type"), login_result.get("error_detail")) - extra = _auth_repair_state_suffix(state) + result = _record_auth_repair_failure( + email, + login_result.get("error_type"), + login_result.get("error_detail"), + chatgpt_api=chatgpt_api, + ) + extra = _auth_repair_result_suffix(result) logger.warning( "[轮转] 旧账号 OAuth 登录失败,标记为 %s: %s(%s%s)", - final_status, + result.get("status"), email, - _auth_repair_error_label(state.get("auth_last_error")), + _auth_repair_error_label(result.get("auth_last_error")), extra, ) return False @@ -2027,9 +2159,13 @@ def reinvite_account(chatgpt_api, mail_client, acc): plan_type = (bundle.get("plan_type") or "").lower() if plan_type != "team": logger.warning("[轮转] 旧账号登录后 plan=%s,不是 team,恢复失败: %s", plan_type or "unknown", email) - final_status = _set_auth_pending_or_standby(email) - _record_auth_repair_failure(email, "non_team_plan", f"登录后 plan={plan_type or 'unknown'}") - logger.warning("[轮转] 旧账号保持状态为 %s: %s", final_status, email) + result = _record_auth_repair_failure( + email, + "non_team_plan", + f"登录后 plan={plan_type or 'unknown'}", + chatgpt_api=chatgpt_api, + ) + logger.warning("[轮转] 旧账号保持状态为 %s: %s", result.get("status"), email) return False auth_file = save_auth_file(bundle) @@ -2671,6 +2807,10 @@ def ensure_account_mail(acc): if skip_reason: logger.info("[填充] 跳过旧账号: %s(%s)", email, skip_reason) continue + retry_skip_reason = _auth_repair_skip_reason(reusable, force=False) + if retry_skip_reason: + logger.info("[填充] 跳过旧账号: %s(%s)", email, retry_skip_reason) + continue logger.info("[填充] 复用旧账号: %s", email) # 确保 chatgpt 浏览器可用 if not _chatgpt_session_ready(chatgpt): diff --git a/src/autoteam/web/dist/assets/index-BK2ezUIr.js b/src/autoteam/web/dist/assets/index-BK2ezUIr.js new file mode 100644 index 00000000..d0ef5435 --- /dev/null +++ b/src/autoteam/web/dist/assets/index-BK2ezUIr.js @@ -0,0 +1,22 @@ +(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 i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&n(i)}).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 dn(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const me={},jt=[],ot=()=>{},ml=()=>!1,Is=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Es=e=>e.startsWith("onUpdate:"),Ie=Object.assign,fn=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},Co=Object.prototype.hasOwnProperty,fe=(e,t)=>Co.call(e,t),q=Array.isArray,Ft=e=>cs(e)==="[object Map]",Gt=e=>cs(e)==="[object Set]",On=e=>cs(e)==="[object Date]",te=e=>typeof e=="function",Se=e=>typeof e=="string",rt=e=>typeof e=="symbol",ge=e=>e!==null&&typeof e=="object",hl=e=>(ge(e)||te(e))&&te(e.then)&&te(e.catch),bl=Object.prototype.toString,cs=e=>bl.call(e),Po=e=>cs(e).slice(8,-1),vl=e=>cs(e)==="[object Object]",pn=e=>Se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Qt=dn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Os=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},To=/-\w/g,Ge=Os(e=>e.replace(To,t=>t.slice(1).toUpperCase())),$o=/\B([A-Z])/g,At=Os(e=>e.replace($o,"-$1").toLowerCase()),xl=Os(e=>e.charAt(0).toUpperCase()+e.slice(1)),Bs=Os(e=>e?`on${xl(e)}`:""),lt=(e,t)=>!Object.is(e,t),vs=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Rs=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Rn;const Ms=()=>Rn||(Rn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function gn(e){if(q(e)){const t={};for(let s=0;s{if(s){const n=s.split(Eo);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function ne(e){let t="";if(Se(e))t=e;else if(q(e))for(let s=0;swt(s,t))}const wl=e=>!!(e&&e.__v_isRef===!0),y=e=>Se(e)?e:e==null?"":q(e)||ge(e)&&(e.toString===bl||!te(e.toString))?wl(e)?y(e.value):JSON.stringify(e,Sl,2):String(e),Sl=(e,t)=>wl(t)?Sl(e,t.value):Ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,l],o)=>(s[Hs(n,o)+" =>"]=l,s),{})}:Gt(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>Hs(s))}:rt(t)?Hs(t):ge(t)&&!q(t)&&!vl(t)?String(t):t,Hs=(e,t="")=>{var s;return rt(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 Le;class Do{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=Le,!t&&Le&&(this.index=(Le.scopes||(Le.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&&(Le=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(es){let t=es;for(es=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Zt;){let t=Zt;for(Zt=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 Pl(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Tl(e){let t,s=e.depsTail,n=s;for(;n;){const l=n.prevDep;n.version===-1?(n===s&&(s=l),vn(n),jo(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=l}e.deps=t,e.depsTail=s}function Zs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&($l(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function $l(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===os)||(e.globalVersion=os,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Zs(e))))return;e.flags|=2;const t=e.dep,s=he,n=Ye;he=e,Ye=!0;try{Pl(e);const l=e.fn(e._value);(t.version===0||lt(l,e._value))&&(e.flags|=128,e._value=l,t.version++)}catch(l){throw t.version++,l}finally{he=s,Ye=n,Tl(e),e.flags&=-3}}function vn(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)vn(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function jo(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let Ye=!0;const Il=[];function mt(){Il.push(Ye),Ye=!1}function ht(){const e=Il.pop();Ye=e===void 0?!0:e}function Mn(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=he;he=void 0;try{t()}finally{he=s}}}let os=0;class Fo{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 xn{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(!he||!Ye||he===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==he)s=this.activeLink=new Fo(he,this),he.deps?(s.prevDep=he.depsTail,he.depsTail.nextDep=s,he.depsTail=s):he.deps=he.depsTail=s,El(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=he.depsTail,s.nextDep=void 0,he.depsTail.nextDep=s,he.depsTail=s,he.deps===s&&(he.deps=n)}return s}trigger(t){this.version++,os++,this.notify(t)}notify(t){hn();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{bn()}}}function El(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)El(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const en=new WeakMap,Et=Symbol(""),tn=Symbol(""),rs=Symbol("");function Te(e,t,s){if(Ye&&he){let n=en.get(e);n||en.set(e,n=new Map);let l=n.get(s);l||(n.set(s,l=new xn),l.map=n,l.key=s),l.track()}}function ft(e,t,s,n,l,o){const i=en.get(e);if(!i){os++;return}const a=u=>{u&&u.trigger()};if(hn(),t==="clear")i.forEach(a);else{const u=q(e),d=u&&pn(s);if(u&&s==="length"){const c=Number(n);i.forEach((g,_)=>{(_==="length"||_===rs||!rt(_)&&_>=c)&&a(g)})}else switch((s!==void 0||i.has(void 0))&&a(i.get(s)),d&&a(i.get(rs)),t){case"add":u?d&&a(i.get("length")):(a(i.get(Et)),Ft(e)&&a(i.get(tn)));break;case"delete":u||(a(i.get(Et)),Ft(e)&&a(i.get(tn)));break;case"set":Ft(e)&&a(i.get(Et));break}}bn()}function Dt(e){const t=de(e);return t===e?t:(Te(t,"iterate",rs),He(e)?t:t.map(qe))}function Us(e){return Te(e=de(e),"iterate",rs),e}function st(e,t){return bt(e)?Ht(Ot(e)?qe(t):t):qe(t)}const Vo={__proto__:null,[Symbol.iterator](){return Ws(this,Symbol.iterator,e=>st(this,e))},concat(...e){return Dt(this).concat(...e.map(t=>q(t)?Dt(t):t))},entries(){return Ws(this,"entries",e=>(e[1]=st(this,e[1]),e))},every(e,t){return ut(this,"every",e,t,void 0,arguments)},filter(e,t){return ut(this,"filter",e,t,s=>s.map(n=>st(this,n)),arguments)},find(e,t){return ut(this,"find",e,t,s=>st(this,s),arguments)},findIndex(e,t){return ut(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return ut(this,"findLast",e,t,s=>st(this,s),arguments)},findLastIndex(e,t){return ut(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return ut(this,"forEach",e,t,void 0,arguments)},includes(...e){return Gs(this,"includes",e)},indexOf(...e){return Gs(this,"indexOf",e)},join(e){return Dt(this).join(e)},lastIndexOf(...e){return Gs(this,"lastIndexOf",e)},map(e,t){return ut(this,"map",e,t,void 0,arguments)},pop(){return Jt(this,"pop")},push(...e){return Jt(this,"push",e)},reduce(e,...t){return Un(this,"reduce",e,t)},reduceRight(e,...t){return Un(this,"reduceRight",e,t)},shift(){return Jt(this,"shift")},some(e,t){return ut(this,"some",e,t,void 0,arguments)},splice(...e){return Jt(this,"splice",e)},toReversed(){return Dt(this).toReversed()},toSorted(e){return Dt(this).toSorted(e)},toSpliced(...e){return Dt(this).toSpliced(...e)},unshift(...e){return Jt(this,"unshift",e)},values(){return Ws(this,"values",e=>st(this,e))}};function Ws(e,t,s){const n=Us(e),l=n[t]();return n!==e&&!He(e)&&(l._next=l.next,l.next=()=>{const o=l._next();return o.done||(o.value=s(o.value)),o}),l}const Bo=Array.prototype;function ut(e,t,s,n,l,o){const i=Us(e),a=i!==e&&!He(e),u=i[t];if(u!==Bo[t]){const g=u.apply(e,o);return a?qe(g):g}let d=s;i!==e&&(a?d=function(g,_){return s.call(this,st(e,g),_,e)}:s.length>2&&(d=function(g,_){return s.call(this,g,_,e)}));const c=u.call(i,d,n);return a&&l?l(c):c}function Un(e,t,s,n){const l=Us(e),o=l!==e&&!He(e);let i=s,a=!1;l!==e&&(o?(a=n.length===0,i=function(d,c,g){return a&&(a=!1,d=st(e,d)),s.call(this,d,st(e,c),g,e)}):s.length>3&&(i=function(d,c,g){return s.call(this,d,c,g,e)}));const u=l[t](i,...n);return a?st(e,u):u}function Gs(e,t,s){const n=de(e);Te(n,"iterate",rs);const l=n[t](...s);return(l===-1||l===!1)&&wn(s[0])?(s[0]=de(s[0]),n[t](...s)):l}function Jt(e,t,s=[]){mt(),hn();const n=de(e)[t].apply(e,s);return bn(),ht(),n}const Ho=dn("__proto__,__v_isRef,__isVue"),Ol=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(rt));function Ko(e){rt(e)||(e=String(e));const t=de(this);return Te(t,"has",e),t.hasOwnProperty(e)}class Rl{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?er:Dl:o?Ll:Ul).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const i=q(t);if(!l){let u;if(i&&(u=Vo[s]))return u;if(s==="hasOwnProperty")return Ko}const a=Reflect.get(t,s,$e(t)?t:n);if((rt(s)?Ol.has(s):Ho(s))||(l||Te(t,"get",s),o))return a;if($e(a)){const u=i&&pn(s)?a:a.value;return l&&ge(u)?nn(u):u}return ge(a)?l?nn(a):ds(a):a}}class Ml extends Rl{constructor(t=!1){super(!1,t)}set(t,s,n,l){let o=t[s];const i=q(t)&&pn(s);if(!this._isShallow){const d=bt(o);if(!He(n)&&!bt(n)&&(o=de(o),n=de(n)),!i&&$e(o)&&!$e(n))return d||(o.value=n),!0}const a=i?Number(s)e,gs=e=>Reflect.getPrototypeOf(e);function Jo(e,t,s){return function(...n){const l=this.__v_raw,o=de(l),i=Ft(o),a=e==="entries"||e===Symbol.iterator&&i,u=e==="keys"&&i,d=l[e](...n),c=s?sn:t?Ht:qe;return!t&&Te(o,"iterate",u?tn:Et),Ie(Object.create(d),{next(){const{value:g,done:_}=d.next();return _?{value:g,done:_}:{value:a?[c(g[0]),c(g[1])]:c(g),done:_}}})}}function ms(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Xo(e,t){const s={get(l){const o=this.__v_raw,i=de(o),a=de(l);e||(lt(l,a)&&Te(i,"get",l),Te(i,"get",a));const{has:u}=gs(i),d=t?sn:e?Ht:qe;if(u.call(i,l))return d(o.get(l));if(u.call(i,a))return d(o.get(a));o!==i&&o.get(l)},get size(){const l=this.__v_raw;return!e&&Te(de(l),"iterate",Et),l.size},has(l){const o=this.__v_raw,i=de(o),a=de(l);return e||(lt(l,a)&&Te(i,"has",l),Te(i,"has",a)),l===a?o.has(l):o.has(l)||o.has(a)},forEach(l,o){const i=this,a=i.__v_raw,u=de(a),d=t?sn:e?Ht:qe;return!e&&Te(u,"iterate",Et),a.forEach((c,g)=>l.call(o,d(c),d(g),i))}};return Ie(s,e?{add:ms("add"),set:ms("set"),delete:ms("delete"),clear:ms("clear")}:{add(l){const o=de(this),i=gs(o),a=de(l),u=!t&&!He(l)&&!bt(l)?a:l;return i.has.call(o,u)||lt(l,u)&&i.has.call(o,l)||lt(a,u)&&i.has.call(o,a)||(o.add(u),ft(o,"add",u,u)),this},set(l,o){!t&&!He(o)&&!bt(o)&&(o=de(o));const i=de(this),{has:a,get:u}=gs(i);let d=a.call(i,l);d||(l=de(l),d=a.call(i,l));const c=u.call(i,l);return i.set(l,o),d?lt(o,c)&&ft(i,"set",l,o):ft(i,"add",l,o),this},delete(l){const o=de(this),{has:i,get:a}=gs(o);let u=i.call(o,l);u||(l=de(l),u=i.call(o,l)),a&&a.call(o,l);const d=o.delete(l);return u&&ft(o,"delete",l,void 0),d},clear(){const l=de(this),o=l.size!==0,i=l.clear();return o&&ft(l,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(l=>{s[l]=Jo(l,e,t)}),s}function yn(e,t){const s=Xo(e,t);return(n,l,o)=>l==="__v_isReactive"?!e:l==="__v_isReadonly"?e:l==="__v_raw"?n:Reflect.get(fe(s,l)&&l in n?s:n,l,o)}const zo={get:yn(!1,!1)},Qo={get:yn(!1,!0)},Zo={get:yn(!0,!1)};const Ul=new WeakMap,Ll=new WeakMap,Dl=new WeakMap,er=new WeakMap;function tr(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function sr(e){return e.__v_skip||!Object.isExtensible(e)?0:tr(Po(e))}function ds(e){return bt(e)?e:_n(e,!1,Go,zo,Ul)}function nr(e){return _n(e,!1,qo,Qo,Ll)}function nn(e){return _n(e,!0,Yo,Zo,Dl)}function _n(e,t,s,n,l){if(!ge(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=sr(e);if(o===0)return e;const i=l.get(e);if(i)return i;const a=new Proxy(e,o===2?n:s);return l.set(e,a),a}function Ot(e){return bt(e)?Ot(e.__v_raw):!!(e&&e.__v_isReactive)}function bt(e){return!!(e&&e.__v_isReadonly)}function He(e){return!!(e&&e.__v_isShallow)}function wn(e){return e?!!e.__v_raw:!1}function de(e){const t=e&&e.__v_raw;return t?de(t):e}function lr(e){return!fe(e,"__v_skip")&&Object.isExtensible(e)&&yl(e,"__v_skip",!0),e}const qe=e=>ge(e)?ds(e):e,Ht=e=>ge(e)?nn(e):e;function $e(e){return e?e.__v_isRef===!0:!1}function U(e){return or(e,!1)}function or(e,t){return $e(e)?e:new rr(e,t)}class rr{constructor(t,s){this.dep=new xn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:de(t),this._value=s?t:qe(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||He(t)||bt(t);t=n?t:de(t),lt(t,s)&&(this._rawValue=t,this._value=n?t:qe(t),this.dep.trigger())}}function Tt(e){return $e(e)?e.value:e}const ir={get:(e,t,s)=>t==="__v_raw"?e:Tt(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const l=e[t];return $e(l)&&!$e(s)?(l.value=s,!0):Reflect.set(e,t,s,n)}};function Nl(e){return Ot(e)?e:new Proxy(e,ir)}class ar{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new xn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=os-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&he!==this)return Cl(this,!0),!0}get value(){const t=this.dep.track();return $l(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function ur(e,t,s=!1){let n,l;return te(e)?n=e:(n=e.get,l=e.set),new ar(n,l,s)}const hs={},Ss=new WeakMap;let $t;function cr(e,t=!1,s=$t){if(s){let n=Ss.get(s);n||Ss.set(s,n=[]),n.push(e)}}function dr(e,t,s=me){const{immediate:n,deep:l,once:o,scheduler:i,augmentJob:a,call:u}=s,d=T=>l?T:He(T)||l===!1||l===0?pt(T,1):pt(T);let c,g,_,$,V=!1,D=!1;if($e(e)?(g=()=>e.value,V=He(e)):Ot(e)?(g=()=>d(e),V=!0):q(e)?(D=!0,V=e.some(T=>Ot(T)||He(T)),g=()=>e.map(T=>{if($e(T))return T.value;if(Ot(T))return d(T);if(te(T))return u?u(T,2):T()})):te(e)?t?g=u?()=>u(e,2):e:g=()=>{if(_){mt();try{_()}finally{ht()}}const T=$t;$t=c;try{return u?u(e,3,[$]):e($)}finally{$t=T}}:g=ot,t&&l){const T=g,z=l===!0?1/0:l;g=()=>pt(T(),z)}const N=No(),B=()=>{c.stop(),N&&N.active&&fn(N.effects,c)};if(o&&t){const T=t;t=(...z)=>{T(...z),B()}}let K=D?new Array(e.length).fill(hs):hs;const J=T=>{if(!(!(c.flags&1)||!c.dirty&&!T))if(t){const z=c.run();if(l||V||(D?z.some((G,le)=>lt(G,K[le])):lt(z,K))){_&&_();const G=$t;$t=c;try{const le=[z,K===hs?void 0:D&&K[0]===hs?[]:K,$];K=z,u?u(t,3,le):t(...le)}finally{$t=G}}}else c.run()};return a&&a(J),c=new kl(g),c.scheduler=i?()=>i(J,!1):J,$=T=>cr(T,!1,c),_=c.onStop=()=>{const T=Ss.get(c);if(T){if(u)u(T,4);else for(const z of T)z();Ss.delete(c)}},t?n?J(!0):K=c.run():i?i(J.bind(null,!0),!0):c.run(),B.pause=c.pause.bind(c),B.resume=c.resume.bind(c),B.stop=B,B}function pt(e,t=1/0,s){if(t<=0||!ge(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,$e(e))pt(e.value,t,s);else if(q(e))for(let n=0;n{pt(n,t,s)});else if(vl(e)){for(const n in e)pt(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&pt(e[n],t,s)}return e}/** +* @vue/runtime-core v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function fs(e,t,s,n){try{return n?e(...n):e()}catch(l){Ls(l,t,s)}}function it(e,t,s,n){if(te(e)){const l=fs(e,t,s,n);return l&&hl(l)&&l.catch(o=>{Ls(o,t,s)}),l}if(q(e)){const l=[];for(let o=0;o>>1,l=Oe[n],o=is(l);o=is(s)?Oe.push(e):Oe.splice(pr(t),0,e),e.flags|=1,Fl()}}function Fl(){ks||(ks=jl.then(Bl))}function gr(e){q(e)?Vt.push(...e):yt&&e.id===-1?yt.splice(Nt+1,0,e):e.flags&1||(Vt.push(e),e.flags|=1),Fl()}function Ln(e,t,s=tt+1){for(;sis(s)-is(n));if(Vt.length=0,yt){yt.push(...t);return}for(yt=t,Nt=0;Nte.id==null?e.flags&2?-1:1/0:e.id;function Bl(e){try{for(tt=0;tt{n._d&&Yn(-1);const o=As(t);let i;try{i=e(...l)}finally{As(o),n._d&&Yn(1)}return i};return n._n=!0,n._c=!0,n._d=!0,n}function ae(e,t){if(Be===null)return e;const s=Vs(Be),n=e.dirs||(e.dirs=[]);for(let l=0;l1)return s&&te(t)?t.call(n&&n.proxy):t}}const br=Symbol.for("v-scx"),vr=()=>xs(br);function Rt(e,t,s){return Kl(e,t,s)}function Kl(e,t,s=me){const{immediate:n,deep:l,flush:o,once:i}=s,a=Ie({},s),u=t&&n||!t&&o!=="post";let d;if(us){if(o==="sync"){const $=vr();d=$.__watcherHandles||($.__watcherHandles=[])}else if(!u){const $=()=>{};return $.stop=ot,$.resume=ot,$.pause=ot,$}}const c=Re;a.call=($,V,D)=>it($,c,V,D);let g=!1;o==="post"?a.scheduler=$=>{Ue($,c&&c.suspense)}:o!=="sync"&&(g=!0,a.scheduler=($,V)=>{V?$():kn($)}),a.augmentJob=$=>{t&&($.flags|=4),g&&($.flags|=2,c&&($.id=c.uid,$.i=c))};const _=dr(e,t,a);return us&&(d?d.push(_):u&&_()),_}function xr(e,t,s){const n=this.proxy,l=Se(e)?e.includes(".")?Wl(n,e):()=>n[e]:e.bind(n,n);let o;te(t)?o=t:(o=t.handler,s=t);const i=ps(this),a=Kl(l,o.bind(n),s);return i(),a}function Wl(e,t){const s=t.split(".");return()=>{let n=e;for(let l=0;le.__isTeleport,wr=Symbol("_leaveCb");function An(e,t){e.shapeFlag&6&&e.component?(e.transition=t,An(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 Gl(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Dn(e,t){let s;return!!((s=Object.getOwnPropertyDescriptor(e,t))&&!s.configurable)}const Cs=new WeakMap;function ts(e,t,s,n,l=!1){if(q(e)){e.forEach((D,N)=>ts(D,t&&(q(t)?t[N]:t),s,n,l));return}if(ss(n)&&!l){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&ts(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?Vs(n.component):n.el,i=l?null:o,{i:a,r:u}=e,d=t&&t.r,c=a.refs===me?a.refs={}:a.refs,g=a.setupState,_=de(g),$=g===me?ml:D=>Dn(c,D)?!1:fe(_,D),V=(D,N)=>!(N&&Dn(c,N));if(d!=null&&d!==u){if(Nn(t),Se(d))c[d]=null,$(d)&&(g[d]=null);else if($e(d)){const D=t;V(d,D.k)&&(d.value=null),D.k&&(c[D.k]=null)}}if(te(u))fs(u,a,12,[i,c]);else{const D=Se(u),N=$e(u);if(D||N){const B=()=>{if(e.f){const K=D?$(u)?g[u]:c[u]:V()||!e.k?u.value:c[e.k];if(l)q(K)&&fn(K,o);else if(q(K))K.includes(o)||K.push(o);else if(D)c[u]=[o],$(u)&&(g[u]=c[u]);else{const J=[o];V(u,e.k)&&(u.value=J),e.k&&(c[e.k]=J)}}else D?(c[u]=i,$(u)&&(g[u]=i)):N&&(V(u,e.k)&&(u.value=i),e.k&&(c[e.k]=i))};if(i){const K=()=>{B(),Cs.delete(e)};K.id=-1,Cs.set(e,K),Ue(K,s)}else Nn(e),B()}}}function Nn(e){const t=Cs.get(e);t&&(t.flags|=8,Cs.delete(e))}Ms().requestIdleCallback;Ms().cancelIdleCallback;const ss=e=>!!e.type.__asyncLoader,Yl=e=>e.type.__isKeepAlive;function Sr(e,t){ql(e,"a",t)}function kr(e,t){ql(e,"da",t)}function ql(e,t,s=Re){const n=e.__wdc||(e.__wdc=()=>{let l=s;for(;l;){if(l.isDeactivated)return;l=l.parent}return e()});if(Ds(t,n,s),s){let l=s.parent;for(;l&&l.parent;)Yl(l.parent.vnode)&&Ar(n,t,s,l),l=l.parent}}function Ar(e,t,s,n){const l=Ds(t,e,n,!0);Ns(()=>{fn(n[t],l)},s)}function Ds(e,t,s=Re,n=!1){if(s){const l=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...i)=>{mt();const a=ps(s),u=it(t,s,e,i);return a(),ht(),u});return n?l.unshift(o):l.push(o),o}}const vt=e=>(t,s=Re)=>{(!us||e==="sp")&&Ds(e,(...n)=>t(...n),s)},Cr=vt("bm"),Ut=vt("m"),Pr=vt("bu"),Tr=vt("u"),$r=vt("bum"),Ns=vt("um"),Ir=vt("sp"),Er=vt("rtg"),Or=vt("rtc");function Rr(e,t=Re){Ds("ec",e,t)}const Mr=Symbol.for("v-ndc");function we(e,t,s,n){let l;const o=s,i=q(e);if(i||Se(e)){const a=i&&Ot(e);let u=!1,d=!1;a&&(u=!He(e),d=bt(e),e=Us(e)),l=new Array(e.length);for(let c=0,g=e.length;ct(a,u,void 0,o));else{const a=Object.keys(e);l=new Array(a.length);for(let u=0,d=a.length;ue?ho(e)?Vs(e):ln(e.parent):null,ns=Ie(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=>ln(e.parent),$root:e=>ln(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Xl(e),$forceUpdate:e=>e.f||(e.f=()=>{kn(e.update)}),$nextTick:e=>e.n||(e.n=Sn.bind(e.proxy)),$watch:e=>xr.bind(e)}),Ys=(e,t)=>e!==me&&!e.__isScriptSetup&&fe(e,t),Ur={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:l,props:o,accessCache:i,type:a,appContext:u}=e;if(t[0]!=="$"){const _=i[t];if(_!==void 0)switch(_){case 1:return n[t];case 2:return l[t];case 4:return s[t];case 3:return o[t]}else{if(Ys(n,t))return i[t]=1,n[t];if(l!==me&&fe(l,t))return i[t]=2,l[t];if(fe(o,t))return i[t]=3,o[t];if(s!==me&&fe(s,t))return i[t]=4,s[t];on&&(i[t]=0)}}const d=ns[t];let c,g;if(d)return t==="$attrs"&&Te(e.attrs,"get",""),d(e);if((c=a.__cssModules)&&(c=c[t]))return c;if(s!==me&&fe(s,t))return i[t]=4,s[t];if(g=u.config.globalProperties,fe(g,t))return g[t]},set({_:e},t,s){const{data:n,setupState:l,ctx:o}=e;return Ys(l,t)?(l[t]=s,!0):n!==me&&fe(n,t)?(n[t]=s,!0):fe(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:i}},a){let u;return!!(s[a]||e!==me&&a[0]!=="$"&&fe(e,a)||Ys(t,a)||fe(o,a)||fe(n,a)||fe(ns,a)||fe(l.config.globalProperties,a)||(u=i.__cssModules)&&u[a])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:fe(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function jn(e){return q(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let on=!0;function Lr(e){const t=Xl(e),s=e.proxy,n=e.ctx;on=!1,t.beforeCreate&&Fn(t.beforeCreate,e,"bc");const{data:l,computed:o,methods:i,watch:a,provide:u,inject:d,created:c,beforeMount:g,mounted:_,beforeUpdate:$,updated:V,activated:D,deactivated:N,beforeDestroy:B,beforeUnmount:K,destroyed:J,unmounted:T,render:z,renderTracked:G,renderTriggered:le,errorCaptured:oe,serverPrefetch:be,expose:ke,inheritAttrs:Z,components:X,directives:Ce,filters:se}=t;if(d&&Dr(d,n,null),i)for(const E in i){const F=i[E];te(F)&&(n[E]=F.bind(s))}if(l){const E=l.call(s,s);ge(E)&&(e.data=ds(E))}if(on=!0,o)for(const E in o){const F=o[E],O=te(F)?F.bind(s,s):te(F.get)?F.get.bind(s,s):ot,ye=!te(F)&&te(F.set)?F.set.bind(s):ot,ve=re({get:O,set:ye});Object.defineProperty(n,E,{enumerable:!0,configurable:!0,get:()=>ve.value,set:_e=>ve.value=_e})}if(a)for(const E in a)Jl(a[E],n,s,E);if(u){const E=te(u)?u.call(s):u;Reflect.ownKeys(E).forEach(F=>{hr(F,E[F])})}c&&Fn(c,e,"c");function pe(E,F){q(F)?F.forEach(O=>E(O.bind(s))):F&&E(F.bind(s))}if(pe(Cr,g),pe(Ut,_),pe(Pr,$),pe(Tr,V),pe(Sr,D),pe(kr,N),pe(Rr,oe),pe(Or,G),pe(Er,le),pe($r,K),pe(Ns,T),pe(Ir,be),q(ke))if(ke.length){const E=e.exposed||(e.exposed={});ke.forEach(F=>{Object.defineProperty(E,F,{get:()=>s[F],set:O=>s[F]=O,enumerable:!0})})}else e.exposed||(e.exposed={});z&&e.render===ot&&(e.render=z),Z!=null&&(e.inheritAttrs=Z),X&&(e.components=X),Ce&&(e.directives=Ce),be&&Gl(e)}function Dr(e,t,s=ot){q(e)&&(e=rn(e));for(const n in e){const l=e[n];let o;ge(l)?"default"in l?o=xs(l.from||n,l.default,!0):o=xs(l.from||n):o=xs(l),$e(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[n]=o}}function Fn(e,t,s){it(q(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function Jl(e,t,s,n){let l=n.includes(".")?Wl(s,n):()=>s[n];if(Se(e)){const o=t[e];te(o)&&Rt(l,o)}else if(te(e))Rt(l,e.bind(s));else if(ge(e))if(q(e))e.forEach(o=>Jl(o,t,s,n));else{const o=te(e.handler)?e.handler.bind(s):t[e.handler];te(o)&&Rt(l,o,e)}}function Xl(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:l,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,a=o.get(t);let u;return a?u=a:!l.length&&!s&&!n?u=t:(u={},l.length&&l.forEach(d=>Ps(u,d,i,!0)),Ps(u,t,i)),ge(t)&&o.set(t,u),u}function Ps(e,t,s,n=!1){const{mixins:l,extends:o}=t;o&&Ps(e,o,s,!0),l&&l.forEach(i=>Ps(e,i,s,!0));for(const i in t)if(!(n&&i==="expose")){const a=Nr[i]||s&&s[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const Nr={data:Vn,props:Bn,emits:Bn,methods:zt,computed:zt,beforeCreate:Ee,created:Ee,beforeMount:Ee,mounted:Ee,beforeUpdate:Ee,updated:Ee,beforeDestroy:Ee,beforeUnmount:Ee,destroyed:Ee,unmounted:Ee,activated:Ee,deactivated:Ee,errorCaptured:Ee,serverPrefetch:Ee,components:zt,directives:zt,watch:Fr,provide:Vn,inject:jr};function Vn(e,t){return t?e?function(){return Ie(te(e)?e.call(this,this):e,te(t)?t.call(this,this):t)}:t:e}function jr(e,t){return zt(rn(e),rn(t))}function rn(e){if(q(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ge(t)}Modifiers`]||e[`${At(t)}Modifiers`];function Kr(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||me;let l=s;const o=t.startsWith("update:"),i=o&&Hr(n,t.slice(7));i&&(i.trim&&(l=s.map(c=>Se(c)?c.trim():c)),i.number&&(l=s.map(Rs)));let a,u=n[a=Bs(t)]||n[a=Bs(Ge(t))];!u&&o&&(u=n[a=Bs(At(t))]),u&&it(u,e,6,l);const d=n[a+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,it(d,e,6,l)}}const Wr=new WeakMap;function Ql(e,t,s=!1){const n=s?Wr:t.emitsCache,l=n.get(e);if(l!==void 0)return l;const o=e.emits;let i={},a=!1;if(!te(e)){const u=d=>{const c=Ql(d,t,!0);c&&(a=!0,Ie(i,c))};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}return!o&&!a?(ge(e)&&n.set(e,null),null):(q(o)?o.forEach(u=>i[u]=null):Ie(i,o),ge(e)&&n.set(e,i),i)}function js(e,t){return!e||!Is(t)?!1:(t=t.slice(2).replace(/Once$/,""),fe(e,t[0].toLowerCase()+t.slice(1))||fe(e,At(t))||fe(e,t))}function Hn(e){const{type:t,vnode:s,proxy:n,withProxy:l,propsOptions:[o],slots:i,attrs:a,emit:u,render:d,renderCache:c,props:g,data:_,setupState:$,ctx:V,inheritAttrs:D}=e,N=As(e);let B,K;try{if(s.shapeFlag&4){const T=l||n,z=T;B=nt(d.call(z,T,c,g,$,_,V)),K=a}else{const T=t;B=nt(T.length>1?T(g,{attrs:a,slots:i,emit:u}):T(g,null)),K=t.props?a:Gr(a)}}catch(T){ls.length=0,Ls(T,e,1),B=Me(St)}let J=B;if(K&&D!==!1){const T=Object.keys(K),{shapeFlag:z}=J;T.length&&z&7&&(o&&T.some(Es)&&(K=Yr(K,o)),J=Kt(J,K,!1,!0))}return s.dirs&&(J=Kt(J,null,!1,!0),J.dirs=J.dirs?J.dirs.concat(s.dirs):s.dirs),s.transition&&An(J,s.transition),B=J,As(N),B}const Gr=e=>{let t;for(const s in e)(s==="class"||s==="style"||Is(s))&&((t||(t={}))[s]=e[s]);return t},Yr=(e,t)=>{const s={};for(const n in e)(!Es(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function qr(e,t,s){const{props:n,children:l,component:o}=e,{props:i,children:a,patchFlag:u}=t,d=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&u>=0){if(u&1024)return!0;if(u&16)return n?Kn(n,i,d):!!i;if(u&8){const c=t.dynamicProps;for(let g=0;gObject.create(eo),so=e=>Object.getPrototypeOf(e)===eo;function Xr(e,t,s,n=!1){const l={},o=to();e.propsDefaults=Object.create(null),no(e,t,l,o);for(const i in e.propsOptions[0])i in l||(l[i]=void 0);s?e.props=n?l:nr(l):e.type.props?e.props=l:e.props=o,e.attrs=o}function zr(e,t,s,n){const{props:l,attrs:o,vnode:{patchFlag:i}}=e,a=de(l),[u]=e.propsOptions;let d=!1;if((n||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let g=0;g{u=!0;const[_,$]=lo(g,t,!0);Ie(i,_),$&&a.push(...$)};!s&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!o&&!u)return ge(e)&&n.set(e,jt),jt;if(q(o))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",Pn=e=>q(e)?e.map(nt):[nt(e)],Zr=(e,t,s)=>{if(t._n)return t;const n=mr((...l)=>Pn(t(...l)),s);return n._c=!1,n},oo=(e,t,s)=>{const n=e._ctx;for(const l in e){if(Cn(l))continue;const o=e[l];if(te(o))t[l]=Zr(l,o,n);else if(o!=null){const i=Pn(o);t[l]=()=>i}}},ro=(e,t)=>{const s=Pn(t);e.slots.default=()=>s},io=(e,t,s)=>{for(const n in t)(s||!Cn(n))&&(e[n]=t[n])},ei=(e,t,s)=>{const n=e.slots=to();if(e.vnode.shapeFlag&32){const l=t._;l?(io(n,t,s),s&&yl(n,"_",l,!0)):oo(t,n)}else t&&ro(e,t)},ti=(e,t,s)=>{const{vnode:n,slots:l}=e;let o=!0,i=me;if(n.shapeFlag&32){const a=t._;a?s&&a===1?o=!1:io(l,t,s):(o=!t.$stable,oo(t,l)),i=t}else t&&(ro(e,t),i={default:1});if(o)for(const a in l)!Cn(a)&&i[a]==null&&delete l[a]},Ue=ri;function si(e){return ni(e)}function ni(e,t){const s=Ms();s.__VUE__=!0;const{insert:n,remove:l,patchProp:o,createElement:i,createText:a,createComment:u,setText:d,setElementText:c,parentNode:g,nextSibling:_,setScopeId:$=ot,insertStaticContent:V}=e,D=(f,p,v,C=null,k=null,A=null,L=void 0,R=null,h=!!p.dynamicChildren)=>{if(f===p)return;f&&!Xt(f,p)&&(C=Fe(f),_e(f,k,A,!0),f=null),p.patchFlag===-2&&(h=!1,p.dynamicChildren=null);const{type:m,ref:j,shapeFlag:M}=p;switch(m){case Fs:N(f,p,v,C);break;case St:B(f,p,v,C);break;case ys:f==null&&K(p,v,C,L);break;case ue:X(f,p,v,C,k,A,L,R,h);break;default:M&1?z(f,p,v,C,k,A,L,R,h):M&6?Ce(f,p,v,C,k,A,L,R,h):(M&64||M&128)&&m.process(f,p,v,C,k,A,L,R,h,S)}j!=null&&k?ts(j,f&&f.ref,A,p||f,!p):j==null&&f&&f.ref!=null&&ts(f.ref,null,A,f,!0)},N=(f,p,v,C)=>{if(f==null)n(p.el=a(p.children),v,C);else{const k=p.el=f.el;p.children!==f.children&&d(k,p.children)}},B=(f,p,v,C)=>{f==null?n(p.el=u(p.children||""),v,C):p.el=f.el},K=(f,p,v,C)=>{[f.el,f.anchor]=V(f.children,p,v,C,f.el,f.anchor)},J=({el:f,anchor:p},v,C)=>{let k;for(;f&&f!==p;)k=_(f),n(f,v,C),f=k;n(p,v,C)},T=({el:f,anchor:p})=>{let v;for(;f&&f!==p;)v=_(f),l(f),f=v;l(p)},z=(f,p,v,C,k,A,L,R,h)=>{if(p.type==="svg"?L="svg":p.type==="math"&&(L="mathml"),f==null)G(p,v,C,k,A,L,R,h);else{const m=f.el&&f.el._isVueCE?f.el:null;try{m&&m._beginPatch(),be(f,p,k,A,L,R,h)}finally{m&&m._endPatch()}}},G=(f,p,v,C,k,A,L,R)=>{let h,m;const{props:j,shapeFlag:M,transition:P,dirs:Y}=f;if(h=f.el=i(f.type,A,j&&j.is,j),M&8?c(h,f.children):M&16&&oe(f.children,h,null,C,k,qs(f,A),L,R),Y&&Ct(f,null,C,"created"),le(h,f,f.scopeId,L,C),j){for(const ce in j)ce!=="value"&&!Qt(ce)&&o(h,ce,null,j[ce],A,C);"value"in j&&o(h,"value",null,j.value,A),(m=j.onVnodeBeforeMount)&&et(m,C,f)}Y&&Ct(f,null,C,"beforeMount");const ie=li(k,P);ie&&P.beforeEnter(h),n(h,p,v),((m=j&&j.onVnodeMounted)||ie||Y)&&Ue(()=>{try{m&&et(m,C,f),ie&&P.enter(h),Y&&Ct(f,null,C,"mounted")}finally{}},k)},le=(f,p,v,C,k)=>{if(v&&$(f,v),C)for(let A=0;A{for(let m=h;m{const R=p.el=f.el;let{patchFlag:h,dynamicChildren:m,dirs:j}=p;h|=f.patchFlag&16;const M=f.props||me,P=p.props||me;let Y;if(v&&Pt(v,!1),(Y=P.onVnodeBeforeUpdate)&&et(Y,v,p,f),j&&Ct(p,f,v,"beforeUpdate"),v&&Pt(v,!0),(M.innerHTML&&P.innerHTML==null||M.textContent&&P.textContent==null)&&c(R,""),m?ke(f.dynamicChildren,m,R,v,C,qs(p,k),A):L||F(f,p,R,null,v,C,qs(p,k),A,!1),h>0){if(h&16)Z(R,M,P,v,k);else if(h&2&&M.class!==P.class&&o(R,"class",null,P.class,k),h&4&&o(R,"style",M.style,P.style,k),h&8){const ie=p.dynamicProps;for(let ce=0;ce{Y&&et(Y,v,p,f),j&&Ct(p,f,v,"updated")},C)},ke=(f,p,v,C,k,A,L)=>{for(let R=0;R{if(p!==v){if(p!==me)for(const A in p)!Qt(A)&&!(A in v)&&o(f,A,p[A],null,k,C);for(const A in v){if(Qt(A))continue;const L=v[A],R=p[A];L!==R&&A!=="value"&&o(f,A,R,L,k,C)}"value"in v&&o(f,"value",p.value,v.value,k)}},X=(f,p,v,C,k,A,L,R,h)=>{const m=p.el=f?f.el:a(""),j=p.anchor=f?f.anchor:a("");let{patchFlag:M,dynamicChildren:P,slotScopeIds:Y}=p;Y&&(R=R?R.concat(Y):Y),f==null?(n(m,v,C),n(j,v,C),oe(p.children||[],v,j,k,A,L,R,h)):M>0&&M&64&&P&&f.dynamicChildren&&f.dynamicChildren.length===P.length?(ke(f.dynamicChildren,P,v,k,A,L,R),(p.key!=null||k&&p===k.subTree)&&ao(f,p,!0)):F(f,p,v,j,k,A,L,R,h)},Ce=(f,p,v,C,k,A,L,R,h)=>{p.slotScopeIds=R,f==null?p.shapeFlag&512?k.ctx.activate(p,v,C,L,h):se(p,v,C,k,A,L,h):Je(f,p,h)},se=(f,p,v,C,k,A,L)=>{const R=f.component=pi(f,C,k);if(Yl(f)&&(R.ctx.renderer=S),mi(R,!1,L),R.asyncDep){if(k&&k.registerDep(R,pe,L),!f.el){const h=R.subTree=Me(St);B(null,h,p,v),f.placeholder=h.el}}else pe(R,f,p,v,k,A,L)},Je=(f,p,v)=>{const C=p.component=f.component;if(qr(f,p,v))if(C.asyncDep&&!C.asyncResolved){E(C,p,v);return}else C.next=p,C.update();else p.el=f.el,C.vnode=p},pe=(f,p,v,C,k,A,L)=>{const R=()=>{if(f.isMounted){let{next:M,bu:P,u:Y,parent:ie,vnode:ce}=f;{const Qe=uo(f);if(Qe){M&&(M.el=ce.el,E(f,M,L)),Qe.asyncDep.then(()=>{Ue(()=>{f.isUnmounted||m()},k)});return}}let w=M,ee;Pt(f,!1),M?(M.el=ce.el,E(f,M,L)):M=ce,P&&vs(P),(ee=M.props&&M.props.onVnodeBeforeUpdate)&&et(ee,ie,M,ce),Pt(f,!0);const Pe=Hn(f),ze=f.subTree;f.subTree=Pe,D(ze,Pe,g(ze.el),Fe(ze),f,k,A),M.el=Pe.el,w===null&&Jr(f,Pe.el),Y&&Ue(Y,k),(ee=M.props&&M.props.onVnodeUpdated)&&Ue(()=>et(ee,ie,M,ce),k)}else{let M;const{el:P,props:Y}=p,{bm:ie,m:ce,parent:w,root:ee,type:Pe}=f,ze=ss(p);Pt(f,!1),ie&&vs(ie),!ze&&(M=Y&&Y.onVnodeBeforeMount)&&et(M,w,p),Pt(f,!0);{ee.ce&&ee.ce._hasShadowRoot()&&ee.ce._injectChildStyle(Pe,f.parent?f.parent.type:void 0);const Qe=f.subTree=Hn(f);D(null,Qe,v,C,f,k,A),p.el=Qe.el}if(ce&&Ue(ce,k),!ze&&(M=Y&&Y.onVnodeMounted)){const Qe=p;Ue(()=>et(M,w,Qe),k)}(p.shapeFlag&256||w&&ss(w.vnode)&&w.vnode.shapeFlag&256)&&f.a&&Ue(f.a,k),f.isMounted=!0,p=v=C=null}};f.scope.on();const h=f.effect=new kl(R);f.scope.off();const m=f.update=h.run.bind(h),j=f.job=h.runIfDirty.bind(h);j.i=f,j.id=f.uid,h.scheduler=()=>kn(j),Pt(f,!0),m()},E=(f,p,v)=>{p.component=f;const C=f.vnode.props;f.vnode=p,f.next=null,zr(f,p.props,C,v),ti(f,p.children,v),mt(),Ln(f),ht()},F=(f,p,v,C,k,A,L,R,h=!1)=>{const m=f&&f.children,j=f?f.shapeFlag:0,M=p.children,{patchFlag:P,shapeFlag:Y}=p;if(P>0){if(P&128){ye(m,M,v,C,k,A,L,R,h);return}else if(P&256){O(m,M,v,C,k,A,L,R,h);return}}Y&8?(j&16&&Xe(m,k,A),M!==m&&c(v,M)):j&16?Y&16?ye(m,M,v,C,k,A,L,R,h):Xe(m,k,A,!0):(j&8&&c(v,""),Y&16&&oe(M,v,C,k,A,L,R,h))},O=(f,p,v,C,k,A,L,R,h)=>{f=f||jt,p=p||jt;const m=f.length,j=p.length,M=Math.min(m,j);let P;for(P=0;Pj?Xe(f,k,A,!0,!1,M):oe(p,v,C,k,A,L,R,h,M)},ye=(f,p,v,C,k,A,L,R,h)=>{let m=0;const j=p.length;let M=f.length-1,P=j-1;for(;m<=M&&m<=P;){const Y=f[m],ie=p[m]=h?dt(p[m]):nt(p[m]);if(Xt(Y,ie))D(Y,ie,v,null,k,A,L,R,h);else break;m++}for(;m<=M&&m<=P;){const Y=f[M],ie=p[P]=h?dt(p[P]):nt(p[P]);if(Xt(Y,ie))D(Y,ie,v,null,k,A,L,R,h);else break;M--,P--}if(m>M){if(m<=P){const Y=P+1,ie=YP)for(;m<=M;)_e(f[m],k,A,!0),m++;else{const Y=m,ie=m,ce=new Map;for(m=ie;m<=P;m++){const De=p[m]=h?dt(p[m]):nt(p[m]);De.key!=null&&ce.set(De.key,m)}let w,ee=0;const Pe=P-ie+1;let ze=!1,Qe=0;const qt=new Array(Pe);for(m=0;m=Pe){_e(De,k,A,!0);continue}let Ze;if(De.key!=null)Ze=ce.get(De.key);else for(w=ie;w<=P;w++)if(qt[w-ie]===0&&Xt(De,p[w])){Ze=w;break}Ze===void 0?_e(De,k,A,!0):(qt[Ze-ie]=m+1,Ze>=Qe?Qe=Ze:ze=!0,D(De,p[Ze],v,null,k,A,L,R,h),ee++)}const $n=ze?oi(qt):jt;for(w=$n.length-1,m=Pe-1;m>=0;m--){const De=ie+m,Ze=p[De],In=p[De+1],En=De+1{const{el:A,type:L,transition:R,children:h,shapeFlag:m}=f;if(m&6){ve(f.component.subTree,p,v,C);return}if(m&128){f.suspense.move(p,v,C);return}if(m&64){L.move(f,p,v,S);return}if(L===ue){n(A,p,v);for(let M=0;MR.enter(A),k);else{const{leave:M,delayLeave:P,afterLeave:Y}=R,ie=()=>{f.ctx.isUnmounted?l(A):n(A,p,v)},ce=()=>{A._isLeaving&&A[wr](!0),M(A,()=>{ie(),Y&&Y()})};P?P(A,ie,ce):ce()}else n(A,p,v)},_e=(f,p,v,C=!1,k=!1)=>{const{type:A,props:L,ref:R,children:h,dynamicChildren:m,shapeFlag:j,patchFlag:M,dirs:P,cacheIndex:Y,memo:ie}=f;if(M===-2&&(k=!1),R!=null&&(mt(),ts(R,null,v,f,!0),ht()),Y!=null&&(p.renderCache[Y]=void 0),j&256){p.ctx.deactivate(f);return}const ce=j&1&&P,w=!ss(f);let ee;if(w&&(ee=L&&L.onVnodeBeforeUnmount)&&et(ee,p,f),j&6)Yt(f.component,v,C);else{if(j&128){f.suspense.unmount(v,C);return}ce&&Ct(f,null,p,"beforeUnmount"),j&64?f.type.remove(f,p,v,S,C):m&&!m.hasOnce&&(A!==ue||M>0&&M&64)?Xe(m,p,v,!1,!0):(A===ue&&M&384||!k&&j&16)&&Xe(h,p,v),C&&at(f)}const Pe=ie!=null&&Y==null;(w&&(ee=L&&L.onVnodeUnmounted)||ce||Pe)&&Ue(()=>{ee&&et(ee,p,f),ce&&Ct(f,null,p,"unmounted"),Pe&&(f.el=null)},v)},at=f=>{const{type:p,el:v,anchor:C,transition:k}=f;if(p===ue){Lt(v,C);return}if(p===ys){T(f);return}const A=()=>{l(v),k&&!k.persisted&&k.afterLeave&&k.afterLeave()};if(f.shapeFlag&1&&k&&!k.persisted){const{leave:L,delayLeave:R}=k,h=()=>L(v,A);R?R(f.el,A,h):h()}else A()},Lt=(f,p)=>{let v;for(;f!==p;)v=_(f),l(f),f=v;l(p)},Yt=(f,p,v)=>{const{bum:C,scope:k,job:A,subTree:L,um:R,m:h,a:m}=f;Gn(h),Gn(m),C&&vs(C),k.stop(),A&&(A.flags|=8,_e(L,f,p,v)),R&&Ue(R,p),Ue(()=>{f.isUnmounted=!0},p)},Xe=(f,p,v,C=!1,k=!1,A=0)=>{for(let L=A;L{if(f.shapeFlag&6)return Fe(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const p=_(f.anchor||f.el),v=p&&p[yr];return v?_(v):p};let We=!1;const Ve=(f,p,v)=>{let C;f==null?p._vnode&&(_e(p._vnode,null,null,!0),C=p._vnode.component):D(p._vnode||null,f,p,null,null,null,v),p._vnode=f,We||(We=!0,Ln(C),Vl(),We=!1)},S={p:D,um:_e,m:ve,r:at,mt:se,mc:oe,pc:F,pbc:ke,n:Fe,o:e};return{render:Ve,hydrate:void 0,createApp:Br(Ve)}}function qs({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 Pt({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function li(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ao(e,t,s=!1){const n=e.children,l=t.children;if(q(n)&&q(l))for(let o=0;o>1,e[s[a]]0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,i=s[o-1];o-- >0;)s[o]=i,i=t[i];return s}function uo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:uo(t)}function Gn(e){if(e)for(let t=0;te.__isSuspense;function ri(e,t){t&&t.pendingBranch?q(e)?t.effects.push(...e):t.effects.push(e):gr(e)}const ue=Symbol.for("v-fgt"),Fs=Symbol.for("v-txt"),St=Symbol.for("v-cmt"),ys=Symbol.for("v-stc"),ls=[];let je=null;function b(e=!1){ls.push(je=e?null:[])}function ii(){ls.pop(),je=ls[ls.length-1]||null}let as=1;function Yn(e,t=!1){as+=e,e<0&&je&&t&&(je.hasOnce=!0)}function po(e){return e.dynamicChildren=as>0?je||jt:null,ii(),as>0&&je&&je.push(e),e}function x(e,t,s,n,l,o){return po(r(e,t,s,n,l,o,!0))}function Ne(e,t,s,n,l){return po(Me(e,t,s,n,l,!0))}function go(e){return e?e.__v_isVNode===!0:!1}function Xt(e,t){return e.type===t.type&&e.key===t.key}const mo=({key:e})=>e??null,_s=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Se(e)||$e(e)||te(e)?{i:Be,r:e,k:t,f:!!s}:e:null);function r(e,t=null,s=null,n=0,l=null,o=e===ue?0:1,i=!1,a=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&mo(t),ref:t&&_s(t),scopeId:Hl,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:Be};return a?(Tn(u,s),o&128&&e.normalize(u)):s&&(u.shapeFlag|=Se(s)?8:16),as>0&&!i&&je&&(u.patchFlag>0||o&6)&&u.patchFlag!==32&&je.push(u),u}const Me=ai;function ai(e,t=null,s=null,n=0,l=null,o=!1){if((!e||e===Mr)&&(e=St),go(e)){const a=Kt(e,t,!0);return s&&Tn(a,s),as>0&&!o&&je&&(a.shapeFlag&6?je[je.indexOf(e)]=a:je.push(a)),a.patchFlag=-2,a}if(xi(e)&&(e=e.__vccOpts),t){t=ui(t);let{class:a,style:u}=t;a&&!Se(a)&&(t.class=ne(a)),ge(u)&&(wn(u)&&!q(u)&&(u=Ie({},u)),t.style=gn(u))}const i=Se(e)?1:fo(e)?128:_r(e)?64:ge(e)?4:te(e)?2:0;return r(e,t,s,n,l,i,o,!0)}function ui(e){return e?wn(e)||so(e)?Ie({},e):e:null}function Kt(e,t,s=!1,n=!1){const{props:l,ref:o,patchFlag:i,children:a,transition:u}=e,d=t?ci(l||{},t):l,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&mo(d),ref:t&&t.ref?s&&o?q(o)?o.concat(_s(t)):[o,_s(t)]:_s(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ue?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:u,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Kt(e.ssContent),ssFallback:e.ssFallback&&Kt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return u&&n&&An(c,u.clone(c)),c}function xe(e=" ",t=0){return Me(Fs,null,e,t)}function Mt(e,t){const s=Me(ys,null,e);return s.staticCount=t,s}function H(e="",t=!1){return t?(b(),Ne(St,null,e)):Me(St,null,e)}function nt(e){return e==null||typeof e=="boolean"?Me(St):q(e)?Me(ue,null,e.slice()):go(e)?dt(e):Me(Fs,null,String(e))}function dt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Kt(e)}function Tn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(q(t))s=16;else if(typeof t=="object")if(n&65){const l=t.default;l&&(l._c&&(l._d=!1),Tn(e,l()),l._c&&(l._d=!0));return}else{s=32;const l=t._;!l&&!so(t)?t._ctx=Be:l===3&&Be&&(Be.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else te(t)?(t={default:t,_ctx:Be},s=32):(t=String(t),n&64?(s=16,t=[xe(t)]):s=8);e.children=t,e.shapeFlag|=s}function ci(...e){const t={};for(let s=0;sRe||Be;let Ts,un;{const e=Ms(),t=(s,n)=>{let l;return(l=e[s])||(l=e[s]=[]),l.push(n),o=>{l.length>1?l.forEach(i=>i(o)):l[0](o)}};Ts=t("__VUE_INSTANCE_SETTERS__",s=>Re=s),un=t("__VUE_SSR_SETTERS__",s=>us=s)}const ps=e=>{const t=Re;return Ts(e),e.scope.on(),()=>{e.scope.off(),Ts(t)}},qn=()=>{Re&&Re.scope.off(),Ts(null)};function ho(e){return e.vnode.shapeFlag&4}let us=!1;function mi(e,t=!1,s=!1){t&&un(t);const{props:n,children:l}=e.vnode,o=ho(e);Xr(e,n,o,t),ei(e,l,s||t);const i=o?hi(e,t):void 0;return t&&un(!1),i}function hi(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ur);const{setup:n}=s;if(n){mt();const l=e.setupContext=n.length>1?vi(e):null,o=ps(e),i=fs(n,e,0,[e.props,l]),a=hl(i);if(ht(),o(),(a||e.sp)&&!ss(e)&&Gl(e),a){if(i.then(qn,qn),t)return i.then(u=>{Jn(e,u)}).catch(u=>{Ls(u,e,0)});e.asyncDep=i}else Jn(e,i)}else bo(e)}function Jn(e,t,s){te(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ge(t)&&(e.setupState=Nl(t)),bo(e)}function bo(e,t,s){const n=e.type;e.render||(e.render=n.render||ot);{const l=ps(e);mt();try{Lr(e)}finally{ht(),l()}}}const bi={get(e,t){return Te(e,"get",""),e[t]}};function vi(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,bi),slots:e.slots,emit:e.emit,expose:t}}function Vs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Nl(lr(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in ns)return ns[s](e)},has(t,s){return s in t||s in ns}})):e.proxy}function xi(e){return te(e)&&"__vccOpts"in e}const re=(e,t)=>ur(e,t,us),yi="3.5.32";/** +* @vue/runtime-dom v3.5.32 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let cn;const Xn=typeof window<"u"&&window.trustedTypes;if(Xn)try{cn=Xn.createPolicy("vue",{createHTML:e=>e})}catch{}const vo=cn?e=>cn.createHTML(e):e=>e,_i="http://www.w3.org/2000/svg",wi="http://www.w3.org/1998/Math/MathML",ct=typeof document<"u"?document:null,zn=ct&&ct.createElement("template"),Si={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"?ct.createElementNS(_i,e):t==="mathml"?ct.createElementNS(wi,e):s?ct.createElement(e,{is:s}):ct.createElement(e);return e==="select"&&n&&n.multiple!=null&&l.setAttribute("multiple",n.multiple),l},createText:e=>ct.createTextNode(e),createComment:e=>ct.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ct.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,l,o){const i=s?s.previousSibling:t.lastChild;if(l&&(l===o||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),s),!(l===o||!(l=l.nextSibling)););else{zn.innerHTML=vo(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const a=zn.content;if(n==="svg"||n==="mathml"){const u=a.firstChild;for(;u.firstChild;)a.appendChild(u.firstChild);a.removeChild(u)}t.insertBefore(a,s)}return[i?i.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},ki=Symbol("_vtc");function Ai(e,t,s){const n=e[ki];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const Qn=Symbol("_vod"),Ci=Symbol("_vsh"),Pi=Symbol(""),Ti=/(?:^|;)\s*display\s*:/;function $i(e,t,s){const n=e.style,l=Se(s);let o=!1;if(s&&!l){if(t)if(Se(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();s[a]==null&&ws(n,a,"")}else for(const i in t)s[i]==null&&ws(n,i,"");for(const i in s)i==="display"&&(o=!0),ws(n,i,s[i])}else if(l){if(t!==s){const i=n[Pi];i&&(s+=";"+i),n.cssText=s,o=Ti.test(s)}}else t&&e.removeAttribute("style");Qn in e&&(e[Qn]=o?n.display:"",e[Ci]&&(n.display="none"))}const Zn=/\s*!important$/;function ws(e,t,s){if(q(s))s.forEach(n=>ws(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=Ii(e,t);Zn.test(s)?e.setProperty(At(n),s.replace(Zn,""),"important"):e[n]=s}}const el=["Webkit","Moz","ms"],Js={};function Ii(e,t){const s=Js[t];if(s)return s;let n=Ge(t);if(n!=="filter"&&n in e)return Js[t]=n;n=xl(n);for(let l=0;lXs||(Mi.then(()=>Xs=0),Xs=Date.now());function Li(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;it(Di(n,s.value),t,5,[n])};return s.value=e,s.attached=Ui(),s}function Di(e,t){if(q(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 rl=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ni=(e,t,s,n,l,o)=>{const i=l==="svg";t==="class"?Ai(e,n,i):t==="style"?$i(e,s,n):Is(t)?Es(t)||Oi(e,t,s,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ji(e,t,n,i))?(nl(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&sl(e,t,n,i,o,t!=="value")):e._isVueCE&&(Fi(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Se(n)))?nl(e,Ge(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),sl(e,t,n,i))};function ji(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&rl(t)&&te(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 rl(t)&&Se(s)?!1:t in e}function Fi(e,t){const s=e._def.props;if(!s)return!1;const n=Ge(t);return Array.isArray(s)?s.some(l=>Ge(l)===n):Object.keys(s).some(l=>Ge(l)===n)}const kt=e=>{const t=e.props["onUpdate:modelValue"]||!1;return q(t)?s=>vs(t,s):t};function Vi(e){e.target.composing=!0}function il(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ke=Symbol("_assign");function al(e,t,s){return t&&(e=e.trim()),s&&(e=Rs(e)),e}const Ae={created(e,{modifiers:{lazy:t,trim:s,number:n}},l){e[Ke]=kt(l);const o=n||l.props&&l.props.type==="number";gt(e,t?"change":"input",i=>{i.target.composing||e[Ke](al(e.value,s,o))}),(s||o)&>(e,"change",()=>{e.value=al(e.value,s,o)}),t||(gt(e,"compositionstart",Vi),gt(e,"compositionend",il),gt(e,"change",il))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:l,number:o}},i){if(e[Ke]=kt(i),e.composing)return;const a=(o||e.type==="number")&&!/^0\d/.test(e.value)?Rs(e.value):e.value,u=t??"";if(a===u)return;const d=e.getRootNode();(d instanceof Document||d instanceof ShadowRoot)&&d.activeElement===e&&e.type!=="range"&&(n&&t===s||l&&e.value.trim()===u)||(e.value=u)}},xo={deep:!0,created(e,t,s){e[Ke]=kt(s),gt(e,"change",()=>{const n=e._modelValue,l=Wt(e),o=e.checked,i=e[Ke];if(q(n)){const a=mn(n,l),u=a!==-1;if(o&&!u)i(n.concat(l));else if(!o&&u){const d=[...n];d.splice(a,1),i(d)}}else if(Gt(n)){const a=new Set(n);o?a.add(l):a.delete(l),i(a)}else i(yo(e,o))})},mounted:ul,beforeUpdate(e,t,s){e[Ke]=kt(s),ul(e,t,s)}};function ul(e,{value:t,oldValue:s},n){e._modelValue=t;let l;if(q(t))l=mn(t,n.props.value)>-1;else if(Gt(t))l=t.has(n.props.value);else{if(t===s)return;l=wt(t,yo(e,!0))}e.checked!==l&&(e.checked=l)}const Bi={created(e,{value:t},s){e.checked=wt(t,s.props.value),e[Ke]=kt(s),gt(e,"change",()=>{e[Ke](Wt(e))})},beforeUpdate(e,{value:t,oldValue:s},n){e[Ke]=kt(n),t!==s&&(e.checked=wt(t,n.props.value))}},It={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const l=Gt(t);gt(e,"change",()=>{const o=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>s?Rs(Wt(i)):Wt(i));e[Ke](e.multiple?l?new Set(o):o:o[0]),e._assigning=!0,Sn(()=>{e._assigning=!1})}),e[Ke]=kt(n)},mounted(e,{value:t}){cl(e,t)},beforeUpdate(e,t,s){e[Ke]=kt(s)},updated(e,{value:t}){e._assigning||cl(e,t)}};function cl(e,t){const s=e.multiple,n=q(t);if(!(s&&!n&&!Gt(t))){for(let l=0,o=e.options.length;lString(d)===String(a)):i.selected=mn(t,a)>-1}else i.selected=t.has(a);else if(wt(Wt(i),t)){e.selectedIndex!==l&&(e.selectedIndex=l);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Wt(e){return"_value"in e?e._value:e.value}function yo(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const xt={created(e,t,s){bs(e,t,s,null,"created")},mounted(e,t,s){bs(e,t,s,null,"mounted")},beforeUpdate(e,t,s,n){bs(e,t,s,n,"beforeUpdate")},updated(e,t,s,n){bs(e,t,s,n,"updated")}};function Hi(e,t){switch(e){case"SELECT":return It;case"TEXTAREA":return Ae;default:switch(t){case"checkbox":return xo;case"radio":return Bi;default:return Ae}}}function bs(e,t,s,n,l){const i=Hi(e.tagName,s.props&&s.props.type)[l];i&&i(e,t,s,n)}const Ki=["ctrl","shift","alt","meta"],Wi={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)=>Ki.some(s=>e[`${s}Key`]&&!t.includes(s))},Gi=(e,t)=>{if(!e)return e;const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=((l,...o)=>{for(let i=0;i{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=(l=>{if(!("key"in l))return;const o=At(l.key);if(t.some(i=>i===o||Yi[i]===o))return e(l)}))},Ji=Ie({patchProp:Ni},Si);let dl;function Xi(){return dl||(dl=si(Ji))}const zi=((...e)=>{const t=Xi().createApp(...e),{mount:s}=t;return t.mount=n=>{const l=Zi(n);if(!l)return;const o=t._component;!te(o)&&!o.render&&!o.template&&(o.template=l.innerHTML),l.nodeType===1&&(l.textContent="");const i=s(l,!1,Qi(l));return l instanceof Element&&(l.removeAttribute("v-cloak"),l.setAttribute("data-v-app","")),i},t});function Qi(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Zi(e){return Se(e)?document.querySelector(e):e}const ea="/api";function ta(){return localStorage.getItem("autoteam_api_key")||""}function $s(e){localStorage.setItem("autoteam_api_key",e)}function zs(){localStorage.removeItem("autoteam_api_key")}async function W(e,t,s=null){var u;const n={"Content-Type":"application/json"},l=ta();l&&(n.Authorization=`Bearer ${l}`);const o={method:e,headers:n};s&&(o.body=JSON.stringify(s));const i=await fetch(`${ea}${t}`,o);let a;try{a=await i.json()}catch{const d=new Error(`HTTP ${i.status}: 服务器返回了非 JSON 响应`);throw d.status=i.status,d}if(!i.ok){const d=(a==null?void 0:a.message)||((u=a==null?void 0:a.detail)==null?void 0:u.message)||(a==null?void 0:a.detail)||`HTTP ${i.status}`,c=new Error(d);throw c.status=i.status,c}return a}const Q={checkAuth:()=>W("GET","/auth/check"),getSetupStatus:()=>W("GET","/setup/status"),saveSetup:e=>W("POST","/setup/save",e),getRuntimeConfig:()=>W("GET","/config/runtime"),saveRuntimeConfig:e=>W("PUT","/config/runtime",e),getRuntimeConfigSource:()=>W("GET","/config/source"),saveRuntimeConfigSource:e=>W("PUT","/config/source",e),getStatus:()=>W("GET","/status"),getAdminStatus:()=>W("GET","/admin/status"),getMainCodexStatus:()=>W("GET","/main-codex/status"),getManualAccountStatus:()=>W("GET","/manual-account/status"),getAccounts:()=>W("GET","/accounts"),getActiveAccounts:()=>W("GET","/accounts/active"),getStandbyAccounts:()=>W("GET","/accounts/standby"),deleteAccount:e=>W("DELETE",`/accounts/${encodeURIComponent(e)}`),loginAccount:e=>W("POST","/accounts/login",{email:e}),getCodexAuth:e=>W("GET",`/accounts/${encodeURIComponent(e)}/codex-auth`),kickAccount:e=>W("POST",`/accounts/${encodeURIComponent(e)}/kick`),getCpaFiles:()=>W("GET","/cpa/files"),startAdminLogin:e=>W("POST","/admin/login/start",{email:e}),submitAdminSession:(e,t)=>W("POST","/admin/login/session",{email:e,session_token:t}),submitAdminPassword:e=>W("POST","/admin/login/password",{password:e}),submitAdminCode:e=>W("POST","/admin/login/code",{code:e}),submitAdminWorkspace:e=>W("POST","/admin/login/workspace",{option_id:e}),cancelAdminLogin:()=>W("POST","/admin/login/cancel"),logoutAdmin:()=>W("POST","/admin/logout"),startMainCodexLogin:()=>W("POST","/main-codex/login"),startMainCodexSync:()=>W("POST","/main-codex/start"),submitMainCodexPassword:e=>W("POST","/main-codex/password",{password:e}),submitMainCodexCode:e=>W("POST","/main-codex/code",{code:e}),cancelMainCodexSync:()=>W("POST","/main-codex/cancel"),deleteMainCodexFromRemoteFiles:()=>W("POST","/main-codex/delete-remote-files"),startManualAccount:()=>W("POST","/manual-account/start"),submitManualAccountCallback:e=>W("POST","/manual-account/callback",{redirect_url:e}),cancelManualAccount:()=>W("POST","/manual-account/cancel"),postSync:()=>W("POST","/sync"),postSyncFromCpa:()=>W("POST","/sync/from-cpa"),postSyncAccounts:()=>W("POST","/sync/accounts"),postSyncMainCodex:()=>W("POST","/sync/main-codex"),startRotate:(e=5)=>W("POST","/tasks/rotate",{target:e}),startCheck:()=>W("POST","/tasks/check"),startAdd:()=>W("POST","/tasks/add"),startFill:(e=5)=>W("POST","/tasks/fill",{target:e}),startCleanup:(e=null)=>W("POST","/tasks/cleanup",{max_seats:e}),startResetQuota:()=>W("POST","/tasks/reset-quota"),getTasks:()=>W("GET","/tasks"),getTask:e=>W("GET",`/tasks/${e}`),getAutoCheckConfig:()=>W("GET","/config/auto-check"),setAutoCheckConfig:e=>W("PUT","/config/auto-check",e),getTeamMembers:()=>W("GET","/team/members"),removeTeamMember:e=>W("POST","/team/members/remove",e),getLogs:(e=100,t=0)=>W("GET",`/logs?limit=${e}&since=${t}`)},sa={class:"relative min-h-screen overflow-hidden"},na={class:"relative mx-auto flex min-h-screen max-w-6xl items-center px-4 py-10"},la={class:"grid w-full items-center gap-8 lg:grid-cols-[1.05fr_0.95fr]"},oa={class:"glass-card w-full p-7 sm:p-8"},ra={class:"space-y-4"},ia={class:"mb-2 block text-sm font-medium text-slate-300"},aa={key:0,class:"text-red-400"},ua={key:1,class:"ml-1 text-xs text-slate-500"},ca=["onUpdate:modelValue","type","placeholder"],da=["disabled"],fa={__name:"SetupPage",emits:["configured"],setup(e,{emit:t}){const s=t,n=U([]),l=ds({}),o=U(!1),i=U(""),a=U("");Ut(async()=>{try{const d=await Q.getSetupStatus();n.value=d.fields;for(const c of d.fields)l[c.key]=c.default||""}catch(d){i.value="获取配置状态失败: "+d.message,a.value="bg-red-500/10 text-red-400 border-red-500/20"}});async function u(){o.value=!0,i.value="";try{const d=await Q.saveSetup({...l});d.api_key&&$s(d.api_key),i.value=d.message,a.value="bg-green-500/10 text-green-400 border-green-500/20",setTimeout(()=>s("configured"),1e3)}catch(d){i.value=d.message,a.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{o.value=!1}}return(d,c)=>(b(),x("div",sa,[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",na,[r("div",la,[c[2]||(c[2]=Mt('',1)),r("div",oa,[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)),i.value?(b(),x("div",{key:0,class:ne(["mb-4 rounded-2xl px-4 py-3 text-sm border",a.value])},y(i.value),3)):H("",!0),r("div",ra,[(b(!0),x(ue,null,we(n.value,g=>(b(),x("div",{key:g.key,class:"rounded-2xl border border-white/10 bg-white/5 p-4"},[r("label",ia,[xe(y(g.prompt)+" ",1),g.optional?H("",!0):(b(),x("span",aa,"*")),g.key==="API_KEY"?(b(),x("span",ua,"(留空自动生成)")):H("",!0)]),ae(r("input",{"onUpdate:modelValue":_=>l[g.key]=_,type:g.key.includes("PASSWORD")||g.key.includes("KEY")?"password":"text",placeholder:g.default||"",class:"input-dark"},null,8,ca),[[xt,l[g.key]]])]))),128))]),r("button",{onClick:u,disabled:o.value,class:"btn-primary mt-6 w-full py-3"},y(o.value?"保存中...":"保存并进入面板"),9,da),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))])])])]))}},pa={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"},ga={class:"flex-1 space-y-2"},ma=["onClick"],ha={class:"min-w-0 flex-1"},ba={class:"block text-sm font-medium"},va={class:"mt-0.5 block text-xs text-slate-500 group-hover:text-slate-400"},xa={class:"space-y-2 border-t border-white/10 pt-5"},ya=["disabled"],_a={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"},wa=["onClick"],Sa={class:"flex flex-col items-center"},ka={class:"text-lg"},Aa={class:"mt-0.5"},Ca={__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(ue,null,[r("nav",pa,[n[4]||(n[4]=Mt('

AutoTeam

账号轮转管理中心

面板在线

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

',1)),r("div",ga,[(b(),x(ue,null,we(t,l=>r("button",{key:l.key,onClick:o=>s.$emit("navigate",l.key),class:ne(["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:ne(["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",ha,[r("span",ba,y(l.label),1),r("span",va,y(l.hint),1)]),r("span",{class:ne(["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,ma)),64))]),r("div",xa,[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)),xe(" "+y(e.loading?"刷新中...":"刷新数据"),1)],8,ya),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),xe(" 登出 ",-1)])])):H("",!0)])]),r("nav",_a,[(b(),x(ue,null,we(t,l=>r("button",{key:l.key,onClick:o=>s.$emit("navigate",l.key),class:ne(["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",Sa,[r("span",ka,y(l.icon),1),r("span",Aa,y(l.mobileLabel||l.label),1)])],10,wa)),64))])],64))}},Pa={key:0},Ta={class:"grid grid-cols-2 sm:grid-cols-3 xl:grid-cols-5 gap-4 mb-6"},$a={class:"text-sm text-gray-400"},Ia={class:"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},Ea={class:"px-4 py-3 border-b border-gray-800 flex items-center justify-between"},Oa={class:"flex items-center gap-2"},Ra=["disabled"],Ma=["disabled"],Ua={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"},La={class:"overflow-x-auto"},Da={class:"w-full text-sm"},Na={class:"px-4 py-3 text-gray-500"},ja={class:"px-4 py-3 font-mono text-xs text-slate-200"},Fa={class:"px-4 py-3"},Va={class:"px-4 py-3 text-gray-400 text-xs"},Ba={class:"px-4 py-3 text-gray-400 text-xs"},Ha={class:"px-4 py-3 text-right space-x-2"},Ka=["onClick","disabled"],Wa=["onClick","disabled"],Ga=["onClick","disabled"],Ya=["onClick","disabled"],qa={class:"bg-gray-900 border border-gray-800 rounded-xl w-full max-w-2xl max-h-[80vh] flex flex-col"},Ja={class:"px-4 py-3 border-b border-gray-800 flex items-center justify-between"},Xa={class:"p-4 space-y-3 overflow-y-auto flex-1"},za={class:"relative"},Qa={class:"bg-gray-950 border border-gray-800 rounded-lg p-4 text-xs font-mono text-gray-300 overflow-x-auto whitespace-pre"},Za={class:"px-4 py-3 border-t border-gray-800 flex justify-end gap-3"},eu={key:1,class:"space-y-4"},tu={class:"grid grid-cols-2 sm:grid-cols-4 gap-4"},su={__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=U(""),o=U(""),i=U(!1),a=U(!1),u=U(""),d=U(null),c=U(!1),g=U(""),_=re(()=>{var E;return!!((E=s.adminStatus)!=null&&E.configured)}),$=re(()=>!!s.runningTask||!_.value),V=re(()=>i.value||$.value),D=re(()=>a.value||!!s.runningTask),N=re(()=>{if(!s.status)return[];const E=s.status.summary;return[{label:"活跃",value:E.active,color:"text-green-400"},{label:"待修复",value:E.auth_pending||0,color:"text-cyan-400"},{label:"待命",value:E.standby,color:"text-yellow-400"},{label:"额度用完",value:E.exhausted,color:"text-red-400"},{label:"总计",value:E.total,color:"text-white"}]});function B(E){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",pending:"bg-gray-500/10 text-gray-400"}[E]||"bg-gray-500/10 text-gray-400"}function K(E){return{active:"bg-green-400",auth_pending:"bg-cyan-400",exhausted:"bg-red-400",standby:"bg-yellow-400",pending:"bg-gray-400"}[E]||"bg-gray-400"}function J(E){return{active:"Active",auth_pending:"Auth pending",exhausted:"Used up",standby:"Standby",pending:"Pending"}[E]||E}function T(E,F){var ve,_e;const O=((_e=(ve=s.status)==null?void 0:ve.quota_cache)==null?void 0:_e[E.email])||E.last_quota;return O?100-((F==="primary"?O.primary_pct:O.weekly_pct)||0):null}function z(E,F){const O=T(E,F);return O!==null?`${O}%`:"-"}function G(E,F){var _e,at;const O=((at=(_e=s.status)==null?void 0:_e.quota_cache)==null?void 0:at[E.email])||E.last_quota;if(!O)return"-";const ye=F==="primary"?O.primary_resets_at:O.weekly_resets_at;if(!ye)return"-";const ve=new Date(ye*1e3);return`${String(ve.getMonth()+1).padStart(2,"0")}-${String(ve.getDate()).padStart(2,"0")} ${String(ve.getHours()).padStart(2,"0")}:${String(ve.getMinutes()).padStart(2,"0")}`}function le(E){return E===null?"text-gray-500":E>30?"text-green-400":E>0?"text-yellow-400":"text-red-400"}const oe=re(()=>d.value?JSON.stringify(d.value.codex_auth,null,2):"");async function be(E){try{d.value=await Q.getCodexAuth(E),c.value=!1}catch(F){u.value=F.message,g.value="bg-red-500/10 text-red-400 border-red-500/20",setTimeout(()=>{u.value=""},8e3)}}async function ke(){try{await navigator.clipboard.writeText(oe.value)}catch{const E=document.createElement("textarea");E.value=oe.value,E.style.position="fixed",E.style.opacity="0",document.body.appendChild(E),E.select(),document.execCommand("copy"),document.body.removeChild(E)}c.value=!0,setTimeout(()=>{c.value=!1},3e3)}function Z(){const E=new Blob([oe.value],{type:"application/json"}),F=URL.createObjectURL(E),O=document.createElement("a");O.href=F,O.download="auth.json",O.click(),URL.revokeObjectURL(F)}async function X(){if(!V.value){i.value=!0,u.value="";try{const E=await Q.postSyncAccounts();u.value=E.message||"同步完成",g.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(E){u.value=E.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{i.value=!1,setTimeout(()=>{u.value=""},8e3)}}}async function Ce(){if(!(D.value||!window.confirm(`确认清空所有托管非主号账号的本地额度恢复记录吗? + +这会清空 last_quota / quota_resets_at / quota_exhausted_at,并把 exhausted 账号恢复为可检查状态。 +不会自动执行轮转或检查。`))){a.value=!0,u.value="";try{const F=await Q.startResetQuota();u.value=`任务已提交: ${F.task_id}`,g.value="bg-blue-500/10 text-blue-400 border-blue-500/20",n("task-started")}catch(F){u.value=F.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{a.value=!1,setTimeout(()=>{u.value=""},8e3)}}}async function se(E){if(!$.value){l.value=E,o.value="login",u.value="";try{const F=await Q.loginAccount(E);u.value=`已提交 ${E} 的登录任务: ${F.task_id}`,g.value="bg-blue-500/10 text-blue-400 border-blue-500/20",n("refresh")}catch(F){u.value=F.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{u.value=""},8e3)}}}async function Je(E){if(!($.value||!window.confirm(`确认将 ${E} 移出 Team? +账号会变为 standby 状态,额度恢复后可重新复用。`))){l.value=E,o.value="kick",u.value="";try{const O=await Q.kickAccount(E);u.value=O.message||`已将 ${E} 移出 Team`,g.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(O){u.value=O.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{u.value=""},8e3)}}}async function pe(E){if(!($.value||!window.confirm(`确认删除账号 ${E}? +这会同时清理本地记录、已配置远端、Team/Invite 和 CloudMail。`))){l.value=E,o.value="delete",u.value="";try{const O=await Q.deleteAccount(E);u.value=O.message||`已删除 ${E}`,g.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(O){u.value=O.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{u.value=""},8e3)}}}return(E,F)=>e.status?(b(),x("div",Pa,[r("div",Ta,[(b(!0),x(ue,null,we(N.value,O=>(b(),x("div",{key:O.label,class:"bg-gray-900 border border-gray-800 rounded-xl p-4"},[r("div",$a,y(O.label),1),r("div",{class:ne(["text-3xl font-bold mt-1",O.color])},y(O.value),3)]))),128))]),r("div",Ia,[r("div",Ea,[F[3]||(F[3]=r("h2",{class:"text-lg font-semibold text-white"},"账号列表",-1)),r("div",Oa,[r("button",{onClick:Ce,disabled:D.value,class:ne(["btn-secondary px-3 py-1.5 text-xs disabled:opacity-50",D.value?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"hover:text-white"])},y(a.value?"提交中...":"重置额度恢复记录"),11,Ra),r("button",{onClick:X,disabled:V.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(i.value?"同步中...":"同步账号"),9,Ma)])]),u.value?(b(),x("div",{key:0,class:ne(["mx-4 mt-4 px-4 py-3 rounded-lg text-sm border",g.value])},y(u.value),3)):H("",!0),_.value?H("",!0):(b(),x("div",Ua," 请先在「配置面板」页完成管理员登录后,才能操作账号;“重置额度恢复记录”可单独使用。 ")),r("div",La,[r("table",Da,[F[4]||(F[4]=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 text-right"},"5h 剩余"),r("th",{class:"px-4 py-3 font-medium text-right"},"周 剩余"),r("th",{class:"px-4 py-3 font-medium"},"5h 重置"),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(ue,null,we(e.status.accounts,(O,ye)=>(b(),x("tr",{key:O.email,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",Na,y(ye+1),1),r("td",ja,y(O.email),1),r("td",Fa,[r("span",{class:ne(["inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium",B(O.status)])},[r("span",{class:ne(["w-1.5 h-1.5 rounded-full",K(O.status)])},null,2),xe(" "+y(J(O.status)),1)],2)]),r("td",{class:ne(["px-4 py-3 text-right font-mono",le(T(O,"primary"))])},y(z(O,"primary")),3),r("td",{class:ne(["px-4 py-3 text-right font-mono",le(T(O,"weekly"))])},y(z(O,"weekly")),3),r("td",Va,y(G(O,"primary")),1),r("td",Ba,y(G(O,"weekly")),1),r("td",Ha,[!O.is_main_account&&O.status!=="active"?(b(),x("button",{key:0,onClick:ve=>se(O.email),disabled:$.value||l.value===O.email,class:ne(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",$.value||l.value===O.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===O.email&&o.value==="login"?"登录中...":"登录"),11,Ka)):H("",!0),!O.is_main_account&&O.status==="active"?(b(),x("button",{key:1,onClick:ve=>Je(O.email),disabled:$.value||l.value===O.email,class:ne(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",$.value||l.value===O.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===O.email&&o.value==="kick"?"移出中...":"移出"),11,Wa)):H("",!0),O.status==="active"||O.is_main_account?(b(),x("button",{key:2,onClick:ve=>be(O.email),disabled:l.value===O.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,Ga)):H("",!0),O.is_main_account?H("",!0):(b(),x("button",{key:3,onClick:ve=>pe(O.email),disabled:$.value||l.value===O.email,class:ne(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",$.value||l.value===O.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===O.email&&o.value==="delete"?"删除中...":"删除"),11,Ya))])]))),128))])])]),d.value?(b(),x("div",{key:2,class:"fixed inset-0 bg-black/60 z-50 flex items-center justify-center p-4",onClick:F[2]||(F[2]=Gi(O=>d.value=null,["self"]))},[r("div",qa,[r("div",Ja,[F[5]||(F[5]=r("h3",{class:"text-white font-semibold"},"Codex CLI 认证文件",-1)),r("button",{onClick:F[0]||(F[0]=O=>d.value=null),class:"text-gray-400 hover:text-white text-lg"},"×")]),r("div",Xa,[F[6]||(F[6]=Mt('
使用步骤:
  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",za,[r("pre",Qa,y(oe.value),1),r("button",{onClick:ke,class:ne(["absolute top-2 right-2 px-2 py-1 rounded border text-xs transition",c.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(c.value?"复制成功":"复制"),3)])]),r("div",Za,[r("button",{onClick:Z,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[1]||(F[1]=O=>d.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"}," 关闭 ")])])])):H("",!0)])])):e.loading?(b(),x("div",eu,[r("div",tu,[(b(),x(ue,null,we(4,O=>r("div",{key:O,class:"bg-gray-900 border border-gray-800 rounded-xl p-4 h-20 animate-pulse"})),64))]),F[7]||(F[7]=r("div",{class:"bg-gray-900 border border-gray-800 rounded-xl h-64 animate-pulse"},null,-1))])):H("",!0)}},nu={class:"space-y-6"},lu={key:0,class:"glass-card p-5"},ou={class:"flex items-center justify-between gap-4 mb-4"},ru={key:1,class:"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm"},iu={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg"},au={class:"font-mono text-white break-all"},uu={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg"},cu={class:"font-mono text-white break-all"},du={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},fu={class:"text-white"},pu={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},gu={key:0,class:"text-green-400 text-xs"},mu={key:1,class:"space-y-2"},hu={class:"space-y-2"},bu={class:"flex justify-end"},vu=["disabled"],xu={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},yu={class:"text-white"},_u={key:2,class:"mt-4"},wu={key:0,class:"space-y-4"},Su={class:"flex flex-col sm:flex-row gap-3"},ku=["disabled"],Au={class:"border border-gray-800 rounded-xl p-4 bg-gray-800/30"},Cu={class:"space-y-3"},Pu={class:"flex justify-end"},Tu=["disabled"],$u={key:1,class:"flex flex-wrap gap-3"},Iu=["disabled"],Eu=["disabled"],Ou=["disabled"],Ru=["disabled"],Mu={key:3,class:"space-y-4"},Uu={class:"text-sm text-gray-300"},Lu={class:"font-mono"},Du={key:0,class:"flex flex-col sm:flex-row gap-3"},Nu=["disabled"],ju=["disabled"],Fu={key:1,class:"flex flex-col sm:flex-row gap-3"},Vu=["disabled"],Bu=["disabled"],Hu={key:2,class:"space-y-3"},Ku=["disabled"],Wu=["value"],Gu=["disabled"],Yu={key:3,class:"text-xs text-blue-300"},qu={class:"flex justify-end"},Ju=["disabled"],Xu={key:4,class:"mt-4 space-y-4 border-t border-gray-800 pt-4"},zu={class:"text-sm text-gray-300"},Qu={key:0,class:"flex flex-col sm:flex-row gap-3"},Zu=["disabled"],ec=["disabled"],tc={key:1,class:"flex flex-col sm:flex-row gap-3"},sc=["disabled"],nc=["disabled"],lc={key:2,class:"text-xs text-cyan-300"},oc={class:"flex justify-end"},rc=["disabled"],ic={key:1,class:"glass-card p-5"},ac={class:"flex items-center justify-between mb-4"},uc={key:0,class:"text-xs text-green-400 transition"},cc={class:"grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-5"},dc={class:"flex items-center gap-2"},fc={class:"flex items-center gap-2"},pc={class:"flex items-center gap-2"},gc={class:"flex items-center gap-2"},mc={class:"mt-3 flex items-center justify-between gap-3"},hc={class:"text-xs text-gray-500"},bc=["disabled"],fl={__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=U({interval:5,threshold:10,min_low:2,retry_add_phone:!0,add_phone_max_retries:3}),o=U(!1),i=U(!1),a=U(""),u=U(""),d=U(""),c=U(""),g=U(""),_=U(""),$=U(""),V=U(""),D=U(""),N=U(!1),B=U(!1),K=U(""),J=U(!1),T=U(""),z=U(""),G=U(""),le=U(""),oe=re(()=>{var S;return!!((S=s.adminStatus)!=null&&S.configured)}),be=re(()=>{var S;return!!((S=s.adminStatus)!=null&&S.login_in_progress)}),ke=re(()=>{var S;return!!((S=s.codexStatus)!=null&&S.in_progress)}),Z=re(()=>{var S;return((S=s.codexStatus)==null?void 0:S.action)==="sync"?"同步":"登录"}),X=re(()=>s.section!=="auto-check"),Ce=re(()=>s.section!=="admin");Rt(()=>s.adminStatus,S=>{var I,f,p;if(S!=null&&S.configured&&S.email&&(a.value=S.email,u.value=S.email),S!=null&&S.login_in_progress||(c.value="",g.value="",_.value="",G.value="",$.value=(S==null?void 0:S.email)||$.value),(S==null?void 0:S.login_step)==="workspace_required"&&!_.value){const v=(I=S==null?void 0:S.workspace_options)==null?void 0:I.find(C=>C.kind==="preferred");_.value=(v==null?void 0:v.id)||((p=(f=S==null?void 0:S.workspace_options)==null?void 0:f[0])==null?void 0:p.id)||""}},{immediate:!0}),Rt(()=>s.codexStatus,S=>{S!=null&&S.in_progress||(V.value="",D.value="",le.value="")},{immediate:!0}),Ut(async()=>{Ce.value&&await Je()});function se(S,I="success"){T.value=S,z.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(se._timer),se._timer=window.setTimeout(()=>{T.value=""},8e3)}async function Je(){try{const S=await Q.getAutoCheckConfig();l.value={interval:Math.round(S.interval/60),threshold:S.threshold,min_low:S.min_low,retry_add_phone:S.retry_add_phone??!0,add_phone_max_retries:S.add_phone_max_retries??3}}catch(S){console.error("加载巡检配置失败:",S)}}async function pe(){N.value=!0,G.value="正在打开管理员登录页...";try{$.value=a.value;const S=await Q.startAdminLogin(a.value);se(S.status==="completed"?"管理员登录完成":"已进入下一步登录流程"),n("admin-progress")}catch(S){se(S.message,"error")}finally{N.value=!1,G.value=""}}async function E(){N.value=!0,G.value="正在校验 session_token 并识别 workspace...";try{$.value=u.value;const S=await Q.submitAdminSession(u.value,d.value);d.value="",se(S.status==="completed"?"session_token 导入成功":"session_token 已提交"),n("refresh")}catch(S){se(S.message,"error")}finally{N.value=!1,G.value=""}}async function F(){N.value=!0,G.value="密码已提交,正在等待登录页响应...";try{const S=await Q.submitAdminPassword(c.value);se(S.status==="completed"?"管理员登录完成":"密码已提交,请继续下一步"),n("admin-progress")}catch(S){se(S.message,"error")}finally{N.value=!1,G.value=""}}async function O(){N.value=!0,G.value="验证码已提交,正在等待登录页响应,通常需要 5 到 10 秒...";try{const S=await Q.submitAdminCode(g.value);se(S.status==="completed"?"管理员登录完成":"验证码已提交,请继续下一步"),n("admin-progress")}catch(S){se(S.message,"error")}finally{N.value=!1,G.value=""}}async function ye(){N.value=!0,G.value="组织选择已提交,正在等待登录页响应...";try{const S=await Q.submitAdminWorkspace(_.value);se(S.status==="completed"?"管理员登录完成":"组织选择已提交,请继续下一步"),n("admin-progress")}catch(S){se(S.message,"error")}finally{N.value=!1,G.value=""}}async function ve(){N.value=!0;try{await Q.cancelAdminLogin(),c.value="",g.value="",se("管理员登录已取消"),n("refresh")}catch(S){se(S.message,"error")}finally{N.value=!1}}async function _e(){N.value=!0;try{await Q.logoutAdmin(),c.value="",g.value="",se("管理员登录态已清除"),n("refresh")}catch(S){se(S.message,"error")}finally{N.value=!1}}async function at(){B.value=!0,K.value="login",le.value="正在打开主号 Codex 登录页...";try{const S=await Q.startMainCodexLogin();se(S.status==="completed"?S.message||"主号 Codex 已登录":"主号 Codex 登录进入下一步"),n("admin-progress")}catch(S){se(S.message,"error")}finally{B.value=!1,K.value="",le.value=""}}async function Lt(){B.value=!0,K.value="sync",le.value="正在打开主号 Codex 登录页...";try{const S=await Q.startMainCodexSync();se(S.status==="completed"?S.message||"主号 Codex 已同步":"主号 Codex 登录进入下一步"),n("admin-progress")}catch(S){se(S.message,"error")}finally{B.value=!1,K.value="",le.value=""}}async function Yt(){var S;B.value=!0,K.value=((S=s.codexStatus)==null?void 0:S.action)||"login",le.value="密码已提交,正在等待主号 Codex 登录页响应...";try{const I=await Q.submitMainCodexPassword(V.value);se(I.status==="completed"?I.message||"主号 Codex 已同步":"主号 Codex 密码已提交"),n("admin-progress")}catch(I){se(I.message,"error")}finally{B.value=!1,K.value="",le.value=""}}async function Xe(){var S;B.value=!0,K.value=((S=s.codexStatus)==null?void 0:S.action)||"login",le.value="验证码已提交,正在等待主号 Codex 登录页响应,通常需要 5 到 10 秒...";try{const I=await Q.submitMainCodexCode(D.value);se(I.status==="completed"?I.message||"主号 Codex 已同步":"主号 Codex 验证码已提交"),n("admin-progress")}catch(I){se(I.message,"error")}finally{B.value=!1,K.value="",le.value=""}}async function Fe(){B.value=!0;try{await Q.cancelMainCodexSync(),se("主号 Codex 登录已取消"),n("refresh")}catch(S){se(S.message,"error")}finally{B.value=!1}}async function We(){J.value=!0;try{const S=await Q.deleteMainCodexFromRemoteFiles();se(S.message||"已从已启用远端删除主号文件"),n("refresh")}catch(S){se(S.message,"error")}finally{J.value=!1}}async function Ve(){o.value=!0,i.value=!1;try{const S=await Q.setAutoCheckConfig({interval:l.value.interval*60,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(S.interval/60),threshold:S.threshold,min_low:S.min_low,retry_add_phone:S.retry_add_phone??!0,add_phone_max_retries:S.add_phone_max_retries??3},i.value=!0,setTimeout(()=>{i.value=!1},3e3)}catch(S){console.error("保存失败:",S)}finally{o.value=!1}}return(S,I)=>{var f,p,v,C,k,A,L,R,h,m,j,M;return b(),x("div",nu,[X.value?(b(),x("div",lu,[r("div",ou,[I[14]||(I[14]=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:ne(["min-w-[72px] px-3 py-1.5 rounded-full text-xs text-center whitespace-nowrap border",oe.value?"bg-green-500/10 text-green-400 border-green-500/20":be.value?"bg-yellow-500/10 text-yellow-300 border-yellow-500/20":"bg-gray-800 text-gray-400 border-gray-700"])},y(oe.value?"已配置":be.value?"登录中":"未配置"),3)]),T.value?(b(),x("div",{key:0,class:ne(["mb-4 rounded-2xl px-4 py-3 text-sm border",z.value])},y(T.value),3)):H("",!0),oe.value&&!be.value?(b(),x("div",ru,[r("div",iu,[I[15]||(I[15]=r("div",{class:"text-gray-500 mb-1"},"管理员邮箱",-1)),r("div",au,y(((f=s.adminStatus)==null?void 0:f.email)||"-"),1)]),r("div",uu,[I[16]||(I[16]=r("div",{class:"text-gray-500 mb-1"},"Workspace ID",-1)),r("div",cu,y(((p=s.adminStatus)==null?void 0:p.account_id)||"-"),1)]),r("div",du,[I[17]||(I[17]=r("div",{class:"text-gray-500 mb-1"},"Workspace 名称",-1)),r("div",fu,y(((v=s.adminStatus)==null?void 0:v.workspace_name)||"未识别"),1)]),r("div",pu,[I[19]||(I[19]=r("div",{class:"text-gray-500 mb-1"},"Session Token",-1)),(C=s.adminStatus)!=null&&C.session_present?(b(),x("div",gu,"已配置")):(b(),x("div",mu,[I[18]||(I[18]=Mt('
未配置(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",hu,[ae(r("input",{"onUpdate:modelValue":I[0]||(I[0]=P=>d.value=P),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),[[Ae,d.value,void 0,{trim:!0}]]),r("div",bu,[r("button",{onClick:E,disabled:N.value||!u.value||!d.value,class:"px-3 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-xs rounded transition disabled:opacity-50"},y(N.value?"校验中...":"保存"),9,vu)])])]))]),r("div",xu,[I[20]||(I[20]=r("div",{class:"text-gray-500 mb-1"},"管理员密码",-1)),r("div",yu,y((k=s.adminStatus)!=null&&k.password_saved?"已保存,可用于主号 Codex 登录":"未保存"),1)])])):H("",!0),be.value?H("",!0):(b(),x("div",_u,[oe.value?ke.value?H("",!0):(b(),x("div",$u,[r("button",{onClick:at,disabled:N.value||B.value||J.value,class:"px-4 py-2 bg-blue-700 hover:bg-blue-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(B.value&&K.value==="login"?"登录中...":"登录主号 Codex"),9,Iu),r("button",{onClick:Lt,disabled:N.value||B.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(B.value&&K.value==="sync"?"同步中...":"同步主号 Codex 到已启用远端"),9,Eu),r("button",{onClick:We,disabled:N.value||B.value||J.value,class:"px-4 py-2 bg-amber-700 hover:bg-amber-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(J.value?"删除中...":"从已启用远端删除主号文件"),9,Ou),r("button",{onClick:_e,disabled:N.value||B.value||J.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(N.value?"处理中...":"清除登录态"),9,Ru)])):(b(),x("div",wu,[r("div",Su,[ae(r("input",{"onUpdate:modelValue":I[1]||(I[1]=P=>a.value=P),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),[[Ae,a.value,void 0,{trim:!0}]]),r("button",{onClick:pe,disabled:N.value||!a.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50"},y(N.value?"提交中...":"开始登录"),9,ku)]),r("div",Au,[I[21]||(I[21]=Mt('
或手动导入 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",Cu,[ae(r("input",{"onUpdate:modelValue":I[2]||(I[2]=P=>u.value=P),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),[[Ae,u.value,void 0,{trim:!0}]]),ae(r("textarea",{"onUpdate:modelValue":I[3]||(I[3]=P=>d.value=P),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),[[Ae,d.value,void 0,{trim:!0}]]),r("div",Pu,[r("button",{onClick:E,disabled:N.value||!u.value||!d.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(N.value?"校验中...":"导入 session_token"),9,Tu)])])])]))])),be.value?(b(),x("div",Mu,[r("div",Uu,[I[22]||(I[22]=xe(" 当前邮箱: ",-1)),r("span",Lu,y($.value||((A=s.adminStatus)==null?void 0:A.email)||"-"),1)]),((L=s.adminStatus)==null?void 0:L.login_step)==="password_required"?(b(),x("div",Du,[ae(r("input",{"onUpdate:modelValue":I[4]||(I[4]=P=>c.value=P),type:"password",autocomplete:"current-password",placeholder:"输入主号密码",disabled:N.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,Nu),[[Ae,c.value]]),r("button",{onClick:F,disabled:N.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(N.value?"提交中...":"提交密码"),9,ju)])):((R=s.adminStatus)==null?void 0:R.login_step)==="code_required"?(b(),x("div",Fu,[ae(r("input",{"onUpdate:modelValue":I[5]||(I[5]=P=>g.value=P),type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"输入邮箱验证码",disabled:N.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,Vu),[[Ae,g.value,void 0,{trim:!0}]]),r("button",{onClick:O,disabled:N.value||!g.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(N.value?"提交中...":"提交验证码"),9,Bu)])):((h=s.adminStatus)==null?void 0:h.login_step)==="workspace_required"?(b(),x("div",Hu,[I[24]||(I[24]=r("div",{class:"text-sm text-gray-300"}," 请选择要进入的组织 / workspace ",-1)),ae(r("select",{"onUpdate:modelValue":I[6]||(I[6]=P=>_.value=P),disabled:N.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"},[I[23]||(I[23]=r("option",{disabled:"",value:""},"请选择组织",-1)),(b(!0),x(ue,null,we(((m=s.adminStatus)==null?void 0:m.workspace_options)||[],P=>(b(),x("option",{key:P.id,value:P.id},y(P.label)+y(P.kind==="fallback"?" (可能是个人/免费)":""),9,Wu))),128))],8,Ku),[[It,_.value]]),r("button",{onClick:ye,disabled:N.value||!_.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(N.value?"提交中...":"确认组织选择"),9,Gu)])):H("",!0),N.value&&G.value?(b(),x("div",Yu,y(G.value),1)):H("",!0),r("div",qu,[r("button",{onClick:ve,disabled:N.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,Ju)])])):H("",!0),ke.value?(b(),x("div",Xu,[r("div",zu," 主号 Codex"+y(Z.value)+"继续中 ",1),((j=s.codexStatus)==null?void 0:j.step)==="password_required"?(b(),x("div",Qu,[ae(r("input",{"onUpdate:modelValue":I[7]||(I[7]=P=>V.value=P),type:"password",autocomplete:"current-password",placeholder:"输入主号密码",disabled:B.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,Zu),[[Ae,V.value]]),r("button",{onClick:Yt,disabled:B.value||!V.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(B.value?"提交中...":"提交密码"),9,ec)])):((M=s.codexStatus)==null?void 0:M.step)==="code_required"?(b(),x("div",tc,[ae(r("input",{"onUpdate:modelValue":I[8]||(I[8]=P=>D.value=P),type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"输入主号 Codex 验证码",disabled:B.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,sc),[[Ae,D.value,void 0,{trim:!0}]]),r("button",{onClick:Xe,disabled:B.value||!D.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(B.value?"提交中...":"提交验证码"),9,nc)])):H("",!0),B.value&&le.value?(b(),x("div",lc,y(le.value),1)):H("",!0),r("div",oc,[r("button",{onClick:Fe,disabled:B.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,rc)])])):H("",!0)])):H("",!0),Ce.value?(b(),x("div",ic,[r("div",ac,[I[25]||(I[25]=r("h2",{class:"text-lg font-semibold text-white"},"巡检设置",-1)),i.value?(b(),x("span",uc,"已保存")):H("",!0)]),r("div",cc,[r("div",null,[I[27]||(I[27]=r("label",{class:"block text-sm text-gray-400 mb-1"},"巡检间隔",-1)),r("div",dc,[ae(r("input",{"onUpdate:modelValue":I[9]||(I[9]=P=>l.value.interval=P),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),[[Ae,l.value.interval,void 0,{number:!0}]]),I[26]||(I[26]=r("span",{class:"text-sm text-gray-500 shrink-0"},"分钟",-1))])]),r("div",null,[I[29]||(I[29]=r("label",{class:"block text-sm text-gray-400 mb-1"},"额度阈值",-1)),r("div",fc,[ae(r("input",{"onUpdate:modelValue":I[10]||(I[10]=P=>l.value.threshold=P),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),[[Ae,l.value.threshold,void 0,{number:!0}]]),I[28]||(I[28]=r("span",{class:"text-sm text-gray-500 shrink-0"},"%",-1))])]),r("div",null,[I[31]||(I[31]=r("label",{class:"block text-sm text-gray-400 mb-1"},"触发账号数",-1)),r("div",pc,[ae(r("input",{"onUpdate:modelValue":I[11]||(I[11]=P=>l.value.min_low=P),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),[[Ae,l.value.min_low,void 0,{number:!0}]]),I[30]||(I[30]=r("span",{class:"text-sm text-gray-500 shrink-0"},"个",-1))])]),r("div",null,[I[33]||(I[33]=r("label",{class:"block text-sm text-gray-400 mb-1"},"手机号验证自动重试",-1)),ae(r("select",{"onUpdate:modelValue":I[12]||(I[12]=P=>l.value.retry_add_phone=P),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"},[...I[32]||(I[32]=[r("option",{value:!0},"开启",-1),r("option",{value:!1},"关闭",-1)])],512),[[It,l.value.retry_add_phone]])]),r("div",null,[I[35]||(I[35]=r("label",{class:"block text-sm text-gray-400 mb-1"},"手机号验证最大重试",-1)),r("div",gc,[ae(r("input",{"onUpdate:modelValue":I[13]||(I[13]=P=>l.value.add_phone_max_retries=P),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),[[Ae,l.value.add_phone_max_retries,void 0,{number:!0}]]),I[34]||(I[34]=r("span",{class:"text-sm text-gray-500 shrink-0"},"次",-1))])])]),r("div",mc,[r("p",hc," 每 "+y(l.value.interval)+" 分钟检查一次,"+y(l.value.min_low)+" 个以上账号剩余低于 "+y(l.value.threshold)+"% 时自动轮转; add_phone "+y(l.value.retry_add_phone?`开启自动重试(最多 ${l.value.add_phone_max_retries} 次)`:"保持人工处理"),1),r("button",{onClick:Ve,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,bc)])])):H("",!0)])}}},vc={class:"mt-6 space-y-6"},xc={class:"glass-card p-4"},yc={class:"flex flex-wrap gap-2"},_c=["onClick"],wc={class:"text-base"},Sc={key:0,class:"glass-card p-6"},kc={class:"mb-6 flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},Ac={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"},Cc={class:"section-heading"},Pc={class:"section-subtitle max-w-3xl"},Tc={key:0,class:"mt-2 text-xs text-slate-500"},$c={class:"flex items-center gap-3"},Ic={key:0,class:"status-badge border-emerald-400/20 bg-emerald-500/10 text-emerald-200"},Ec={key:1,class:"text-sm text-slate-400"},Oc={key:2,class:"space-y-5"},Rc={class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Mc={class:"mb-4 flex items-center justify-between gap-4"},Uc={class:"status-badge text-xs text-slate-400"},Lc={key:0,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Dc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Nc={class:"mb-2 block text-sm font-medium text-slate-300"},jc={key:0,class:"text-red-400"},Fc=["onUpdate:modelValue","type","placeholder"],Vc={key:1,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Bc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Hc={class:"mb-2 block text-sm font-medium text-slate-300"},Kc={key:0,class:"text-red-400"},Wc=["onUpdate:modelValue","type","placeholder"],Gc={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"],qc={key:3,class:"space-y-5"},Jc={class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Xc={class:"mb-4 flex items-center justify-between gap-4"},zc={class:"status-badge text-xs text-slate-400"},Qc={class:"grid grid-cols-1 gap-4 md:grid-cols-2"},Zc={class:"mb-2 block text-sm font-medium text-slate-300"},ed=["onUpdate:modelValue"],td={key:0,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},sd={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},nd={class:"mb-2 block text-sm font-medium text-slate-300"},ld={key:0,class:"text-red-400"},od=["onUpdate:modelValue","type","placeholder"],rd={key:1,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},id={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},ad={class:"mb-2 block text-sm font-medium text-slate-300"},ud={key:0,class:"text-red-400"},cd={key:1,class:"mt-1 font-mono text-[11px] font-normal text-slate-500 break-all"},dd=["onUpdate:modelValue","type","placeholder"],fd={key:2,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},pd={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},gd={class:"mb-2 block text-sm font-medium text-slate-300"},md={key:0,class:"text-red-400"},hd={key:1,class:"mt-1 font-mono text-[11px] font-normal text-slate-500 break-all"},bd=["onUpdate:modelValue"],vd=["onUpdate:modelValue"],xd=["onUpdate:modelValue","type","step","placeholder"],yd={key:3,class:"rounded-2xl border border-white/10 bg-white/5 px-4 py-4 text-sm text-slate-400"},_d={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"},wd=["disabled"],Sd={key:4,class:"space-y-4"},kd={class:"rounded-2xl border border-white/10 bg-white/5 p-4"},Ad={class:"text-xs text-slate-400"},Cd={key:0,class:"mt-4 grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Pd={class:"mb-2 block text-sm font-medium text-slate-300"},Td={key:0,class:"text-red-400"},$d=["onUpdate:modelValue","type","placeholder"],Id={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"},Ed=["disabled"],Od={key:5,class:"space-y-4"},Rd={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Md={class:"mb-2 block text-sm font-medium text-slate-300"},Ud={key:0,class:"text-red-400"},Ld={key:1,class:"ml-1 text-xs text-slate-500"},Dd=["onUpdate:modelValue","type","placeholder"],Nd={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"},jd={class:"text-xs leading-6 text-slate-400"},Fd=["disabled"],Vd={key:3,class:"glass-card space-y-4 p-6"},Bd={class:"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},Hd={class:"status-badge break-all font-mono text-[11px] text-slate-400"},Kd={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"},Wd={class:"flex gap-2"},Gd=["disabled"],Yd=["disabled"],qd={__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 Provider",title:"邮箱服务配置",description:"配置自动注册和收验证码所需的邮箱后端。可以在 CloudMail 和 Cloudflare Temp Email 之间切换。",note:"带 * 的项会直接影响账号池操作;只有当前选中的邮箱提供者配置会被视为运行时必填。",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:"🛰️"}],i=U("cloudmail"),a=U(!1),u=U([]),d=ds({}),c=U(!1),g=U(!1),_=U(!1),$=U(""),V=U(""),D=U(""),N=U(""),B=U(!1),K=U(!1),J=U(!1),T=U(""),z=U(""),G=new Set(["API_KEY"]),le={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"},oe=re(()=>n[i.value]?i.value:""),be=re(()=>l[oe.value]||null);function ke(h){return u.value.find(m=>m.key===h)||null}function Z(h){return le[h]||""}function X(h){return h.map(m=>ke(m)).filter(Boolean)}const Ce=re(()=>X(n.security)),se=re(()=>X(n.proxy)),Je=re(()=>X(["SYNC_TARGET_CPA","SYNC_TARGET_SUB2API"])),pe=re(()=>String(d.MAIL_PROVIDER||"cloudmail").toLowerCase()==="cloudflare_temp_email"?"cloudflare_temp_email":"cloudmail"),E=re(()=>X(["CLOUDMAIL_BASE_URL","CLOUDMAIL_EMAIL","CLOUDMAIL_PASSWORD","CLOUDMAIL_DOMAIN"])),F=re(()=>X(["CF_TEMP_EMAIL_BASE_URL","CF_TEMP_EMAIL_ADMIN_PASSWORD","CF_TEMP_EMAIL_DOMAIN"])),O=re(()=>String(d.SYNC_TARGET_CPA||"").toLowerCase()==="true"),ye=re(()=>String(d.SYNC_TARGET_SUB2API||"").toLowerCase()==="true"),ve=re(()=>O.value?X(["CPA_URL","CPA_KEY"]):[]),_e=re(()=>ye.value?X(["SUB2API_URL","SUB2API_EMAIL","SUB2API_PASSWORD","SUB2API_GROUP"]):[]),at=re(()=>ye.value?X(["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"]):[]),Lt=re(()=>oe.value==="cloudmail"?pe.value==="cloudflare_temp_email"?F.value:E.value:oe.value==="security"?Ce.value:[]),Yt=re(()=>{const h=[];return O.value&&h.push("CPA"),ye.value&&h.push("Sub2API"),h.length?`已启用:${h.join(" + ")}`:"当前未启用远端"}),Xe=re(()=>{if(!oe.value)return{label:"",class:"border-white/10 bg-white/5 text-slate-400"};if(oe.value==="sync"){if(!O.value&&!ye.value)return{label:"未启用",class:"border-white/10 bg-white/5 text-slate-400"};const j=!O.value||ve.value.every(P=>!v(P)||P.configured),M=!ye.value||_e.value.every(P=>!v(P)||P.configured);return j&&M?{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(oe.value==="proxy")return se.value.some(j=>j.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(oe.value==="cloudmail"){const j=pe.value==="cloudflare_temp_email"?F.value:E.value;return j.length>0&&j.every(P=>!v(P)||P.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"}}const h=Lt.value;return h.length>0&&h.every(j=>!v(j)||j.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 Fe(h,m="success"){$.value=h,V.value=m==="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(Fe._timer),Fe._timer=window.setTimeout(()=>{$.value=""},8e3)}function We(h,m="success"){T.value=h,z.value=m==="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(We._timer),We._timer=window.setTimeout(()=>{T.value=""},8e3)}function Ve(h){return["SUB2API_CONCURRENCY","SUB2API_PRIORITY","SUB2API_RATE_MULTIPLIER"].includes(h)?"number":h.includes("PASSWORD")||h.includes("KEY")?"password":"text"}function S(h){return h==="SYNC_TARGET_CPA"||h==="SYNC_TARGET_SUB2API"}function I(h){return S(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 p(h){if(h==="SUB2API_RATE_MULTIPLIER")return"0.001";if(h==="SUB2API_CONCURRENCY"||h==="SUB2API_PRIORITY")return"1"}function v(h){return!!(h!=null&&h.runtime_required)||G.has(h==null?void 0:h.key)}function C(h){const m=(h==null?void 0:h.value)??(h==null?void 0:h.default)??"";if(I(h==null?void 0:h.key))return String(m).toLowerCase()==="true"?"true":"false";if(f(h==null?void 0:h.key)){const j=String(m||"").toLowerCase();return["off","ctx_pool","passthrough"].includes(j)?j:"off"}return m}async function k(){c.value=!0;try{const h=await Q.getRuntimeConfig();u.value=h.fields||[];for(const m of Object.keys(d))u.value.find(j=>j.key===m)||delete d[m];for(const m of u.value)d[m.key]=C(m)}catch(h){console.error("加载运行时配置失败:",h),Fe("加载运行时配置失败: "+h.message,"error")}finally{c.value=!1}}async function A(){g.value=!0,_.value=!1;try{const h={};for(const j of u.value){const M=d[j.key];h[j.key]=M==null?"":String(M)}const m=await Q.saveRuntimeConfig(h);m.api_key&&$s(m.api_key),Fe(m.message||"配置保存成功"),_.value=!0,window.setTimeout(()=>{_.value=!1},3e3),await k(),s("refresh")}catch(h){Fe(h.message,"error")}finally{g.value=!1}}async function L(){B.value=!0;try{const h=await Q.getRuntimeConfigSource();D.value=h.path||".env",N.value=h.content||"",J.value=!0}catch(h){console.error("加载源文件失败:",h),We("加载源文件失败: "+h.message,"error")}finally{B.value=!1}}async function R(){K.value=!0;try{const h=await Q.saveRuntimeConfigSource({content:N.value});h.api_key&&$s(h.api_key),We(h.message||"源文件保存成功"),await Promise.all([L(),k()]),s("refresh")}catch(h){We(h.message,"error")}finally{K.value=!1}}return Rt(i,async h=>{h==="source"&&!J.value&&await L()}),Ut(async()=>{await k()}),(h,m)=>{var j,M,P,Y,ie,ce;return b(),x("div",vc,[m[24]||(m[24]=Mt('
AutoTeam Configuration Center

配置面板

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

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

AutoTeam

账号轮转管理中心

面板在线

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

',1)),r("div",ga,[(b(),x(ae,null,we(t,l=>r("button",{key:l.key,onClick:o=>s.$emit("navigate",l.key),class:ne(["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:ne(["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",ha,[r("span",ba,y(l.label),1),r("span",va,y(l.hint),1)]),r("span",{class:ne(["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,ma)),64))]),r("div",xa,[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)),xe(" "+y(e.loading?"刷新中...":"刷新数据"),1)],8,ya),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),xe(" 登出 ",-1)])])):H("",!0)])]),r("nav",_a,[(b(),x(ae,null,we(t,l=>r("button",{key:l.key,onClick:o=>s.$emit("navigate",l.key),class:ne(["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",Sa,[r("span",ka,y(l.icon),1),r("span",Aa,y(l.mobileLabel||l.label),1)])],10,wa)),64))])],64))}},Pa={key:0},Ta={class:"grid grid-cols-2 sm:grid-cols-3 xl:grid-cols-5 gap-4 mb-6"},$a={class:"text-sm text-gray-400"},Ia={class:"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},Ea={class:"px-4 py-3 border-b border-gray-800 flex items-center justify-between"},Oa={class:"flex items-center gap-2"},Ra=["disabled"],Ma=["disabled"],Ua={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"},La={class:"overflow-x-auto"},Da={class:"w-full text-sm"},Na={class:"px-4 py-3 text-gray-500"},ja={class:"px-4 py-3 font-mono text-xs text-slate-200"},Fa={class:"px-4 py-3"},Ba={class:"px-4 py-3 text-gray-400 text-xs"},Va={class:"px-4 py-3 text-gray-400 text-xs"},Ha={class:"px-4 py-3 text-right space-x-2"},Ka=["onClick","disabled"],Wa=["onClick","disabled"],Ga=["onClick","disabled"],Ya=["onClick","disabled"],qa={class:"bg-gray-900 border border-gray-800 rounded-xl w-full max-w-2xl max-h-[80vh] flex flex-col"},Ja={class:"px-4 py-3 border-b border-gray-800 flex items-center justify-between"},Xa={class:"p-4 space-y-3 overflow-y-auto flex-1"},za={class:"relative"},Qa={class:"bg-gray-950 border border-gray-800 rounded-lg p-4 text-xs font-mono text-gray-300 overflow-x-auto whitespace-pre"},Za={class:"px-4 py-3 border-t border-gray-800 flex justify-end gap-3"},eu={key:1,class:"space-y-4"},tu={class:"grid grid-cols-2 sm:grid-cols-4 gap-4"},su={__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(""),i=M(!1),a=M(!1),u=M(""),d=M(null),c=M(!1),g=M(""),_=re(()=>{var I;return!!((I=s.adminStatus)!=null&&I.configured)}),$=re(()=>!!s.runningTask||!_.value),B=re(()=>i.value||$.value),D=re(()=>a.value||!!s.runningTask),N=re(()=>{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.total,color:"text-white"}]});function V(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",pending:"bg-gray-500/10 text-gray-400"}[I]||"bg-gray-500/10 text-gray-400"}function K(I){return{active:"bg-green-400",auth_pending:"bg-cyan-400",exhausted:"bg-red-400",standby:"bg-yellow-400",pending:"bg-gray-400"}[I]||"bg-gray-400"}function J(I){return{active:"Active",auth_pending:"Auth pending",exhausted:"Used up",standby:"Standby",pending:"Pending"}[I]||I}function T(I,F){var ve,_e;const E=((_e=(ve=s.status)==null?void 0:ve.quota_cache)==null?void 0:_e[I.email])||I.last_quota;return E?100-((F==="primary"?E.primary_pct:E.weekly_pct)||0):null}function z(I,F){const E=T(I,F);return E!==null?`${E}%`:"-"}function G(I,F){var _e,at;const E=((at=(_e=s.status)==null?void 0:_e.quota_cache)==null?void 0:at[I.email])||I.last_quota;if(!E)return"-";const ye=F==="primary"?E.primary_resets_at:E.weekly_resets_at;if(!ye)return"-";const ve=new Date(ye*1e3);return`${String(ve.getMonth()+1).padStart(2,"0")}-${String(ve.getDate()).padStart(2,"0")} ${String(ve.getHours()).padStart(2,"0")}:${String(ve.getMinutes()).padStart(2,"0")}`}function le(I){return I===null?"text-gray-500":I>30?"text-green-400":I>0?"text-yellow-400":"text-red-400"}const oe=re(()=>d.value?JSON.stringify(d.value.codex_auth,null,2):"");async function be(I){try{d.value=await Q.getCodexAuth(I),c.value=!1}catch(F){u.value=F.message,g.value="bg-red-500/10 text-red-400 border-red-500/20",setTimeout(()=>{u.value=""},8e3)}}async function ke(){try{await navigator.clipboard.writeText(oe.value)}catch{const I=document.createElement("textarea");I.value=oe.value,I.style.position="fixed",I.style.opacity="0",document.body.appendChild(I),I.select(),document.execCommand("copy"),document.body.removeChild(I)}c.value=!0,setTimeout(()=>{c.value=!1},3e3)}function Z(){const I=new Blob([oe.value],{type:"application/json"}),F=URL.createObjectURL(I),E=document.createElement("a");E.href=F,E.download="auth.json",E.click(),URL.revokeObjectURL(F)}async function X(){if(!B.value){i.value=!0,u.value="";try{const I=await Q.postSyncAccounts();u.value=I.message||"同步完成",g.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(I){u.value=I.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{i.value=!1,setTimeout(()=>{u.value=""},8e3)}}}async function Ae(){if(!(D.value||!window.confirm(`确认清空所有托管非主号账号的本地额度恢复记录吗? - -这会清空 last_quota / quota_resets_at / quota_exhausted_at,并把 exhausted 账号恢复为可检查状态。 -不会自动执行轮转或检查。`))){a.value=!0,u.value="";try{const F=await Q.startResetQuota();u.value=`任务已提交: ${F.task_id}`,g.value="bg-blue-500/10 text-blue-400 border-blue-500/20",n("task-started")}catch(F){u.value=F.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{a.value=!1,setTimeout(()=>{u.value=""},8e3)}}}async function se(I){if(!$.value){l.value=I,o.value="login",u.value="";try{const F=await Q.loginAccount(I);u.value=`已提交 ${I} 的登录任务: ${F.task_id}`,g.value="bg-blue-500/10 text-blue-400 border-blue-500/20",n("refresh")}catch(F){u.value=F.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{u.value=""},8e3)}}}async function Je(I){if(!($.value||!window.confirm(`确认将 ${I} 移出 Team? -账号会变为 standby 状态,额度恢复后可重新复用。`))){l.value=I,o.value="kick",u.value="";try{const E=await Q.kickAccount(I);u.value=E.message||`已将 ${I} 移出 Team`,g.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(E){u.value=E.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{u.value=""},8e3)}}}async function pe(I){if(!($.value||!window.confirm(`确认删除账号 ${I}? -这会同时清理本地记录、已配置远端、Team/Invite 和 CloudMail。`))){l.value=I,o.value="delete",u.value="";try{const E=await Q.deleteAccount(I);u.value=E.message||`已删除 ${I}`,g.value="bg-green-500/10 text-green-400 border-green-500/20",n("refresh")}catch(E){u.value=E.message,g.value="bg-red-500/10 text-red-400 border-red-500/20"}finally{l.value="",o.value="",setTimeout(()=>{u.value=""},8e3)}}}return(I,F)=>e.status?(b(),x("div",Pa,[r("div",Ta,[(b(!0),x(ae,null,we(N.value,E=>(b(),x("div",{key:E.label,class:"bg-gray-900 border border-gray-800 rounded-xl p-4"},[r("div",$a,y(E.label),1),r("div",{class:ne(["text-3xl font-bold mt-1",E.color])},y(E.value),3)]))),128))]),r("div",Ia,[r("div",Ea,[F[3]||(F[3]=r("h2",{class:"text-lg font-semibold text-white"},"账号列表",-1)),r("div",Oa,[r("button",{onClick:Ae,disabled:D.value,class:ne(["btn-secondary px-3 py-1.5 text-xs disabled:opacity-50",D.value?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":"hover:text-white"])},y(a.value?"提交中...":"重置额度恢复记录"),11,Ra),r("button",{onClick:X,disabled:B.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(i.value?"同步中...":"同步账号"),9,Ma)])]),u.value?(b(),x("div",{key:0,class:ne(["mx-4 mt-4 px-4 py-3 rounded-lg text-sm border",g.value])},y(u.value),3)):H("",!0),_.value?H("",!0):(b(),x("div",Ua," 请先在「配置面板」页完成管理员登录后,才能操作账号;“重置额度恢复记录”可单独使用。 ")),r("div",La,[r("table",Da,[F[4]||(F[4]=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 text-right"},"5h 剩余"),r("th",{class:"px-4 py-3 font-medium text-right"},"周 剩余"),r("th",{class:"px-4 py-3 font-medium"},"5h 重置"),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(ae,null,we(e.status.accounts,(E,ye)=>(b(),x("tr",{key:E.email,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",Na,y(ye+1),1),r("td",ja,y(E.email),1),r("td",Fa,[r("span",{class:ne(["inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium",V(E.status)])},[r("span",{class:ne(["w-1.5 h-1.5 rounded-full",K(E.status)])},null,2),xe(" "+y(J(E.status)),1)],2)]),r("td",{class:ne(["px-4 py-3 text-right font-mono",le(T(E,"primary"))])},y(z(E,"primary")),3),r("td",{class:ne(["px-4 py-3 text-right font-mono",le(T(E,"weekly"))])},y(z(E,"weekly")),3),r("td",Ba,y(G(E,"primary")),1),r("td",Va,y(G(E,"weekly")),1),r("td",Ha,[!E.is_main_account&&E.status!=="active"?(b(),x("button",{key:0,onClick:ve=>se(E.email),disabled:$.value||l.value===E.email,class:ne(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",$.value||l.value===E.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===E.email&&o.value==="login"?"登录中...":"登录"),11,Ka)):H("",!0),!E.is_main_account&&E.status==="active"?(b(),x("button",{key:1,onClick:ve=>Je(E.email),disabled:$.value||l.value===E.email,class:ne(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",$.value||l.value===E.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===E.email&&o.value==="kick"?"移出中...":"移出"),11,Wa)):H("",!0),E.status==="active"||E.is_main_account?(b(),x("button",{key:2,onClick:ve=>be(E.email),disabled:l.value===E.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,Ga)):H("",!0),E.is_main_account?H("",!0):(b(),x("button",{key:3,onClick:ve=>pe(E.email),disabled:$.value||l.value===E.email,class:ne(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",$.value||l.value===E.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===E.email&&o.value==="delete"?"删除中...":"删除"),11,Ya))])]))),128))])])]),d.value?(b(),x("div",{key:2,class:"fixed inset-0 bg-black/60 z-50 flex items-center justify-center p-4",onClick:F[2]||(F[2]=Gi(E=>d.value=null,["self"]))},[r("div",qa,[r("div",Ja,[F[5]||(F[5]=r("h3",{class:"text-white font-semibold"},"Codex CLI 认证文件",-1)),r("button",{onClick:F[0]||(F[0]=E=>d.value=null),class:"text-gray-400 hover:text-white text-lg"},"×")]),r("div",Xa,[F[6]||(F[6]=Rt('
使用步骤:
  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",za,[r("pre",Qa,y(oe.value),1),r("button",{onClick:ke,class:ne(["absolute top-2 right-2 px-2 py-1 rounded border text-xs transition",c.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(c.value?"复制成功":"复制"),3)])]),r("div",Za,[r("button",{onClick:Z,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[1]||(F[1]=E=>d.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"}," 关闭 ")])])])):H("",!0)])])):e.loading?(b(),x("div",eu,[r("div",tu,[(b(),x(ae,null,we(4,E=>r("div",{key:E,class:"bg-gray-900 border border-gray-800 rounded-xl p-4 h-20 animate-pulse"})),64))]),F[7]||(F[7]=r("div",{class:"bg-gray-900 border border-gray-800 rounded-xl h-64 animate-pulse"},null,-1))])):H("",!0)}},nu={class:"space-y-6"},lu={key:0,class:"glass-card p-5"},ou={class:"flex items-center justify-between gap-4 mb-4"},ru={key:1,class:"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm"},iu={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg"},au={class:"font-mono text-white break-all"},uu={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg"},cu={class:"font-mono text-white break-all"},du={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},fu={class:"text-white"},pu={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},gu={key:0,class:"text-green-400 text-xs"},mu={key:1,class:"space-y-2"},hu={class:"space-y-2"},bu={class:"flex justify-end"},vu=["disabled"],xu={class:"px-3 py-3 bg-gray-800/60 border border-gray-800 rounded-lg md:col-span-2"},yu={class:"text-white"},_u={key:2,class:"mt-4"},wu={key:0,class:"space-y-4"},Su={class:"flex flex-col sm:flex-row gap-3"},ku=["disabled"],Au={class:"border border-gray-800 rounded-xl p-4 bg-gray-800/30"},Cu={class:"space-y-3"},Pu={class:"flex justify-end"},Tu=["disabled"],$u={key:1,class:"flex flex-wrap gap-3"},Iu=["disabled"],Eu=["disabled"],Ou=["disabled"],Ru=["disabled"],Mu={key:3,class:"space-y-4"},Uu={class:"text-sm text-gray-300"},Lu={class:"font-mono"},Du={key:0,class:"flex flex-col sm:flex-row gap-3"},Nu=["disabled"],ju=["disabled"],Fu={key:1,class:"flex flex-col sm:flex-row gap-3"},Bu=["disabled"],Vu=["disabled"],Hu={key:2,class:"space-y-3"},Ku=["disabled"],Wu=["value"],Gu=["disabled"],Yu={key:3,class:"text-xs text-blue-300"},qu={class:"flex justify-end"},Ju=["disabled"],Xu={key:4,class:"mt-4 space-y-4 border-t border-gray-800 pt-4"},zu={class:"text-sm text-gray-300"},Qu={key:0,class:"flex flex-col sm:flex-row gap-3"},Zu=["disabled"],ec=["disabled"],tc={key:1,class:"flex flex-col sm:flex-row gap-3"},sc=["disabled"],nc=["disabled"],lc={key:2,class:"text-xs text-cyan-300"},oc={class:"flex justify-end"},rc=["disabled"],ic={key:1,class:"glass-card p-5"},ac={class:"flex items-center justify-between mb-4"},uc={key:0,class:"text-xs text-green-400 transition"},cc={class:"grid grid-cols-1 sm:grid-cols-3 gap-4"},dc={class:"flex items-center gap-2"},fc={class:"flex items-center gap-2"},pc={class:"flex items-center gap-2"},gc={class:"mt-3 flex items-center justify-between gap-3"},mc={class:"text-xs text-gray-500"},hc=["disabled"],fl={__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,threshold:10,min_low:2}),o=M(!1),i=M(!1),a=M(""),u=M(""),d=M(""),c=M(""),g=M(""),_=M(""),$=M(""),B=M(""),D=M(""),N=M(!1),V=M(!1),K=M(""),J=M(!1),T=M(""),z=M(""),G=M(""),le=M(""),oe=re(()=>{var k;return!!((k=s.adminStatus)!=null&&k.configured)}),be=re(()=>{var k;return!!((k=s.adminStatus)!=null&&k.login_in_progress)}),ke=re(()=>{var k;return!!((k=s.codexStatus)!=null&&k.in_progress)}),Z=re(()=>{var k;return((k=s.codexStatus)==null?void 0:k.action)==="sync"?"同步":"登录"}),X=re(()=>s.section!=="auto-check"),Ae=re(()=>s.section!=="admin");Ot(()=>s.adminStatus,k=>{var L,f,p;if(k!=null&&k.configured&&k.email&&(a.value=k.email,u.value=k.email),k!=null&&k.login_in_progress||(c.value="",g.value="",_.value="",G.value="",$.value=(k==null?void 0:k.email)||$.value),(k==null?void 0:k.login_step)==="workspace_required"&&!_.value){const v=(L=k==null?void 0:k.workspace_options)==null?void 0:L.find(C=>C.kind==="preferred");_.value=(v==null?void 0:v.id)||((p=(f=k==null?void 0:k.workspace_options)==null?void 0:f[0])==null?void 0:p.id)||""}},{immediate:!0}),Ot(()=>s.codexStatus,k=>{k!=null&&k.in_progress||(B.value="",D.value="",le.value="")},{immediate:!0}),Mt(async()=>{Ae.value&&await Je()});function se(k,L="success"){T.value=k,z.value=L==="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(se._timer),se._timer=window.setTimeout(()=>{T.value=""},8e3)}async function Je(){try{const k=await Q.getAutoCheckConfig();l.value={interval:Math.round(k.interval/60),threshold:k.threshold,min_low:k.min_low}}catch(k){console.error("加载巡检配置失败:",k)}}async function pe(){N.value=!0,G.value="正在打开管理员登录页...";try{$.value=a.value;const k=await Q.startAdminLogin(a.value);se(k.status==="completed"?"管理员登录完成":"已进入下一步登录流程"),n("admin-progress")}catch(k){se(k.message,"error")}finally{N.value=!1,G.value=""}}async function I(){N.value=!0,G.value="正在校验 session_token 并识别 workspace...";try{$.value=u.value;const k=await Q.submitAdminSession(u.value,d.value);d.value="",se(k.status==="completed"?"session_token 导入成功":"session_token 已提交"),n("refresh")}catch(k){se(k.message,"error")}finally{N.value=!1,G.value=""}}async function F(){N.value=!0,G.value="密码已提交,正在等待登录页响应...";try{const k=await Q.submitAdminPassword(c.value);se(k.status==="completed"?"管理员登录完成":"密码已提交,请继续下一步"),n("admin-progress")}catch(k){se(k.message,"error")}finally{N.value=!1,G.value=""}}async function E(){N.value=!0,G.value="验证码已提交,正在等待登录页响应,通常需要 5 到 10 秒...";try{const k=await Q.submitAdminCode(g.value);se(k.status==="completed"?"管理员登录完成":"验证码已提交,请继续下一步"),n("admin-progress")}catch(k){se(k.message,"error")}finally{N.value=!1,G.value=""}}async function ye(){N.value=!0,G.value="组织选择已提交,正在等待登录页响应...";try{const k=await Q.submitAdminWorkspace(_.value);se(k.status==="completed"?"管理员登录完成":"组织选择已提交,请继续下一步"),n("admin-progress")}catch(k){se(k.message,"error")}finally{N.value=!1,G.value=""}}async function ve(){N.value=!0;try{await Q.cancelAdminLogin(),c.value="",g.value="",se("管理员登录已取消"),n("refresh")}catch(k){se(k.message,"error")}finally{N.value=!1}}async function _e(){N.value=!0;try{await Q.logoutAdmin(),c.value="",g.value="",se("管理员登录态已清除"),n("refresh")}catch(k){se(k.message,"error")}finally{N.value=!1}}async function at(){V.value=!0,K.value="login",le.value="正在打开主号 Codex 登录页...";try{const k=await Q.startMainCodexLogin();se(k.status==="completed"?k.message||"主号 Codex 已登录":"主号 Codex 登录进入下一步"),n("admin-progress")}catch(k){se(k.message,"error")}finally{V.value=!1,K.value="",le.value=""}}async function Ut(){V.value=!0,K.value="sync",le.value="正在打开主号 Codex 登录页...";try{const k=await Q.startMainCodexSync();se(k.status==="completed"?k.message||"主号 Codex 已同步":"主号 Codex 登录进入下一步"),n("admin-progress")}catch(k){se(k.message,"error")}finally{V.value=!1,K.value="",le.value=""}}async function Yt(){var k;V.value=!0,K.value=((k=s.codexStatus)==null?void 0:k.action)||"login",le.value="密码已提交,正在等待主号 Codex 登录页响应...";try{const L=await Q.submitMainCodexPassword(B.value);se(L.status==="completed"?L.message||"主号 Codex 已同步":"主号 Codex 密码已提交"),n("admin-progress")}catch(L){se(L.message,"error")}finally{V.value=!1,K.value="",le.value=""}}async function Xe(){var k;V.value=!0,K.value=((k=s.codexStatus)==null?void 0:k.action)||"login",le.value="验证码已提交,正在等待主号 Codex 登录页响应,通常需要 5 到 10 秒...";try{const L=await Q.submitMainCodexCode(D.value);se(L.status==="completed"?L.message||"主号 Codex 已同步":"主号 Codex 验证码已提交"),n("admin-progress")}catch(L){se(L.message,"error")}finally{V.value=!1,K.value="",le.value=""}}async function Fe(){V.value=!0;try{await Q.cancelMainCodexSync(),se("主号 Codex 登录已取消"),n("refresh")}catch(k){se(k.message,"error")}finally{V.value=!1}}async function We(){J.value=!0;try{const k=await Q.deleteMainCodexFromRemoteFiles();se(k.message||"已从已启用远端删除主号文件"),n("refresh")}catch(k){se(k.message,"error")}finally{J.value=!1}}async function Be(){o.value=!0,i.value=!1;try{const k=await Q.setAutoCheckConfig({interval:l.value.interval*60,threshold:l.value.threshold,min_low:l.value.min_low});l.value={interval:Math.round(k.interval/60),threshold:k.threshold,min_low:k.min_low},i.value=!0,setTimeout(()=>{i.value=!1},3e3)}catch(k){console.error("保存失败:",k)}finally{o.value=!1}}return(k,L)=>{var f,p,v,C,S,A,U,O,h,m,j,R;return b(),x("div",nu,[X.value?(b(),x("div",lu,[r("div",ou,[L[12]||(L[12]=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:ne(["min-w-[72px] px-3 py-1.5 rounded-full text-xs text-center whitespace-nowrap border",oe.value?"bg-green-500/10 text-green-400 border-green-500/20":be.value?"bg-yellow-500/10 text-yellow-300 border-yellow-500/20":"bg-gray-800 text-gray-400 border-gray-700"])},y(oe.value?"已配置":be.value?"登录中":"未配置"),3)]),T.value?(b(),x("div",{key:0,class:ne(["mb-4 rounded-2xl px-4 py-3 text-sm border",z.value])},y(T.value),3)):H("",!0),oe.value&&!be.value?(b(),x("div",ru,[r("div",iu,[L[13]||(L[13]=r("div",{class:"text-gray-500 mb-1"},"管理员邮箱",-1)),r("div",au,y(((f=s.adminStatus)==null?void 0:f.email)||"-"),1)]),r("div",uu,[L[14]||(L[14]=r("div",{class:"text-gray-500 mb-1"},"Workspace ID",-1)),r("div",cu,y(((p=s.adminStatus)==null?void 0:p.account_id)||"-"),1)]),r("div",du,[L[15]||(L[15]=r("div",{class:"text-gray-500 mb-1"},"Workspace 名称",-1)),r("div",fu,y(((v=s.adminStatus)==null?void 0:v.workspace_name)||"未识别"),1)]),r("div",pu,[L[17]||(L[17]=r("div",{class:"text-gray-500 mb-1"},"Session Token",-1)),(C=s.adminStatus)!=null&&C.session_present?(b(),x("div",gu,"已配置")):(b(),x("div",mu,[L[16]||(L[16]=Rt('
未配置(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",hu,[fe(r("input",{"onUpdate:modelValue":L[0]||(L[0]=P=>d.value=P),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),[[Pe,d.value,void 0,{trim:!0}]]),r("div",bu,[r("button",{onClick:I,disabled:N.value||!u.value||!d.value,class:"px-3 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-xs rounded transition disabled:opacity-50"},y(N.value?"校验中...":"保存"),9,vu)])])]))]),r("div",xu,[L[18]||(L[18]=r("div",{class:"text-gray-500 mb-1"},"管理员密码",-1)),r("div",yu,y((S=s.adminStatus)!=null&&S.password_saved?"已保存,可用于主号 Codex 登录":"未保存"),1)])])):H("",!0),be.value?H("",!0):(b(),x("div",_u,[oe.value?ke.value?H("",!0):(b(),x("div",$u,[r("button",{onClick:at,disabled:N.value||V.value||J.value,class:"px-4 py-2 bg-blue-700 hover:bg-blue-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(V.value&&K.value==="login"?"登录中...":"登录主号 Codex"),9,Iu),r("button",{onClick:Ut,disabled:N.value||V.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(V.value&&K.value==="sync"?"同步中...":"同步主号 Codex 到已启用远端"),9,Eu),r("button",{onClick:We,disabled:N.value||V.value||J.value,class:"px-4 py-2 bg-amber-700 hover:bg-amber-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(J.value?"删除中...":"从已启用远端删除主号文件"),9,Ou),r("button",{onClick:_e,disabled:N.value||V.value||J.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(N.value?"处理中...":"清除登录态"),9,Ru)])):(b(),x("div",wu,[r("div",Su,[fe(r("input",{"onUpdate:modelValue":L[1]||(L[1]=P=>a.value=P),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),[[Pe,a.value,void 0,{trim:!0}]]),r("button",{onClick:pe,disabled:N.value||!a.value,class:"px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition disabled:opacity-50"},y(N.value?"提交中...":"开始登录"),9,ku)]),r("div",Au,[L[19]||(L[19]=Rt('
或手动导入 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",Cu,[fe(r("input",{"onUpdate:modelValue":L[2]||(L[2]=P=>u.value=P),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),[[Pe,u.value,void 0,{trim:!0}]]),fe(r("textarea",{"onUpdate:modelValue":L[3]||(L[3]=P=>d.value=P),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),[[Pe,d.value,void 0,{trim:!0}]]),r("div",Pu,[r("button",{onClick:I,disabled:N.value||!u.value||!d.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(N.value?"校验中...":"导入 session_token"),9,Tu)])])])]))])),be.value?(b(),x("div",Mu,[r("div",Uu,[L[20]||(L[20]=xe(" 当前邮箱: ",-1)),r("span",Lu,y($.value||((A=s.adminStatus)==null?void 0:A.email)||"-"),1)]),((U=s.adminStatus)==null?void 0:U.login_step)==="password_required"?(b(),x("div",Du,[fe(r("input",{"onUpdate:modelValue":L[4]||(L[4]=P=>c.value=P),type:"password",autocomplete:"current-password",placeholder:"输入主号密码",disabled:N.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,Nu),[[Pe,c.value]]),r("button",{onClick:F,disabled:N.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(N.value?"提交中...":"提交密码"),9,ju)])):((O=s.adminStatus)==null?void 0:O.login_step)==="code_required"?(b(),x("div",Fu,[fe(r("input",{"onUpdate:modelValue":L[5]||(L[5]=P=>g.value=P),type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"输入邮箱验证码",disabled:N.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,Bu),[[Pe,g.value,void 0,{trim:!0}]]),r("button",{onClick:E,disabled:N.value||!g.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(N.value?"提交中...":"提交验证码"),9,Vu)])):((h=s.adminStatus)==null?void 0:h.login_step)==="workspace_required"?(b(),x("div",Hu,[L[22]||(L[22]=r("div",{class:"text-sm text-gray-300"}," 请选择要进入的组织 / workspace ",-1)),fe(r("select",{"onUpdate:modelValue":L[6]||(L[6]=P=>_.value=P),disabled:N.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"},[L[21]||(L[21]=r("option",{disabled:"",value:""},"请选择组织",-1)),(b(!0),x(ae,null,we(((m=s.adminStatus)==null?void 0:m.workspace_options)||[],P=>(b(),x("option",{key:P.id,value:P.id},y(P.label)+y(P.kind==="fallback"?" (可能是个人/免费)":""),9,Wu))),128))],8,Ku),[[Nt,_.value]]),r("button",{onClick:ye,disabled:N.value||!_.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(N.value?"提交中...":"确认组织选择"),9,Gu)])):H("",!0),N.value&&G.value?(b(),x("div",Yu,y(G.value),1)):H("",!0),r("div",qu,[r("button",{onClick:ve,disabled:N.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,Ju)])])):H("",!0),ke.value?(b(),x("div",Xu,[r("div",zu," 主号 Codex"+y(Z.value)+"继续中 ",1),((j=s.codexStatus)==null?void 0:j.step)==="password_required"?(b(),x("div",Qu,[fe(r("input",{"onUpdate:modelValue":L[7]||(L[7]=P=>B.value=P),type:"password",autocomplete:"current-password",placeholder:"输入主号密码",disabled:V.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,Zu),[[Pe,B.value]]),r("button",{onClick:Yt,disabled:V.value||!B.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(V.value?"提交中...":"提交密码"),9,ec)])):((R=s.codexStatus)==null?void 0:R.step)==="code_required"?(b(),x("div",tc,[fe(r("input",{"onUpdate:modelValue":L[8]||(L[8]=P=>D.value=P),type:"text",inputmode:"numeric",autocomplete:"one-time-code",placeholder:"输入主号 Codex 验证码",disabled:V.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,sc),[[Pe,D.value,void 0,{trim:!0}]]),r("button",{onClick:Xe,disabled:V.value||!D.value,class:"px-4 py-2 bg-cyan-700 hover:bg-cyan-600 text-white text-sm rounded-lg transition disabled:opacity-50"},y(V.value?"提交中...":"提交验证码"),9,nc)])):H("",!0),V.value&&le.value?(b(),x("div",lc,y(le.value),1)):H("",!0),r("div",oc,[r("button",{onClick:Fe,disabled:V.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,rc)])])):H("",!0)])):H("",!0),Ae.value?(b(),x("div",ic,[r("div",ac,[L[23]||(L[23]=r("h2",{class:"text-lg font-semibold text-white"},"巡检设置",-1)),i.value?(b(),x("span",uc,"已保存")):H("",!0)]),r("div",cc,[r("div",null,[L[25]||(L[25]=r("label",{class:"block text-sm text-gray-400 mb-1"},"巡检间隔",-1)),r("div",dc,[fe(r("input",{"onUpdate:modelValue":L[9]||(L[9]=P=>l.value.interval=P),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),[[Pe,l.value.interval,void 0,{number:!0}]]),L[24]||(L[24]=r("span",{class:"text-sm text-gray-500 shrink-0"},"分钟",-1))])]),r("div",null,[L[27]||(L[27]=r("label",{class:"block text-sm text-gray-400 mb-1"},"额度阈值",-1)),r("div",fc,[fe(r("input",{"onUpdate:modelValue":L[10]||(L[10]=P=>l.value.threshold=P),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),[[Pe,l.value.threshold,void 0,{number:!0}]]),L[26]||(L[26]=r("span",{class:"text-sm text-gray-500 shrink-0"},"%",-1))])]),r("div",null,[L[29]||(L[29]=r("label",{class:"block text-sm text-gray-400 mb-1"},"触发账号数",-1)),r("div",pc,[fe(r("input",{"onUpdate:modelValue":L[11]||(L[11]=P=>l.value.min_low=P),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),[[Pe,l.value.min_low,void 0,{number:!0}]]),L[28]||(L[28]=r("span",{class:"text-sm text-gray-500 shrink-0"},"个",-1))])])]),r("div",gc,[r("p",mc," 每 "+y(l.value.interval)+" 分钟检查一次,"+y(l.value.min_low)+" 个以上账号剩余低于 "+y(l.value.threshold)+"% 时自动轮转 ",1),r("button",{onClick:Be,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,hc)])])):H("",!0)])}}},bc={class:"mt-6 space-y-6"},vc={class:"glass-card p-4"},xc={class:"flex flex-wrap gap-2"},yc=["onClick"],_c={class:"text-base"},wc={key:0,class:"glass-card p-6"},Sc={class:"mb-6 flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},kc={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"},Ac={class:"section-heading"},Cc={class:"section-subtitle max-w-3xl"},Pc={key:0,class:"mt-2 text-xs text-slate-500"},Tc={class:"flex items-center gap-3"},$c={key:0,class:"status-badge border-emerald-400/20 bg-emerald-500/10 text-emerald-200"},Ic={key:1,class:"text-sm text-slate-400"},Ec={key:2,class:"space-y-5"},Oc={class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Rc={class:"mb-4 flex items-center justify-between gap-4"},Mc={class:"status-badge text-xs text-slate-400"},Uc={key:0,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Lc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Dc={class:"mb-2 block text-sm font-medium text-slate-300"},Nc={key:0,class:"text-red-400"},jc=["onUpdate:modelValue","type","placeholder"],Fc={key:1,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Bc={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Vc={class:"mb-2 block text-sm font-medium text-slate-300"},Hc={key:0,class:"text-red-400"},Kc=["onUpdate:modelValue","type","placeholder"],Wc={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"},Gc=["disabled"],Yc={key:3,class:"space-y-5"},qc={class:"rounded-2xl border border-white/10 bg-white/5 p-5"},Jc={class:"mb-4 flex items-center justify-between gap-4"},Xc={class:"status-badge text-xs text-slate-400"},zc={class:"grid grid-cols-1 gap-4 md:grid-cols-2"},Qc={class:"mb-2 block text-sm font-medium text-slate-300"},Zc=["onUpdate:modelValue"],ed={key:0,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},td={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},sd={class:"mb-2 block text-sm font-medium text-slate-300"},nd={key:0,class:"text-red-400"},ld=["onUpdate:modelValue","type","placeholder"],od={key:1,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},rd={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},id={class:"mb-2 block text-sm font-medium text-slate-300"},ad={key:0,class:"text-red-400"},ud={key:1,class:"mt-1 font-mono text-[11px] font-normal text-slate-500 break-all"},cd=["onUpdate:modelValue","type","placeholder"],dd={key:2,class:"rounded-2xl border border-white/10 bg-white/5 p-5"},fd={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},pd={class:"mb-2 block text-sm font-medium text-slate-300"},gd={key:0,class:"text-red-400"},md={key:1,class:"mt-1 font-mono text-[11px] font-normal text-slate-500 break-all"},hd=["onUpdate:modelValue"],bd=["onUpdate:modelValue"],vd=["onUpdate:modelValue","type","step","placeholder"],xd={key:3,class:"rounded-2xl border border-white/10 bg-white/5 px-4 py-4 text-sm text-slate-400"},yd={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"},_d=["disabled"],wd={key:4,class:"space-y-4"},Sd={class:"rounded-2xl border border-white/10 bg-white/5 p-4"},kd={class:"text-xs text-slate-400"},Ad={key:0,class:"mt-4 grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Cd={class:"mb-2 block text-sm font-medium text-slate-300"},Pd={key:0,class:"text-red-400"},Td=["onUpdate:modelValue","type","placeholder"],$d={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"},Id=["disabled"],Ed={key:5,class:"space-y-4"},Od={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"},Rd={class:"mb-2 block text-sm font-medium text-slate-300"},Md={key:0,class:"text-red-400"},Ud={key:1,class:"ml-1 text-xs text-slate-500"},Ld=["onUpdate:modelValue","type","placeholder"],Dd={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"},Nd={class:"text-xs leading-6 text-slate-400"},jd=["disabled"],Fd={key:3,class:"glass-card space-y-4 p-6"},Bd={class:"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between"},Vd={class:"status-badge break-all font-mono text-[11px] text-slate-400"},Hd={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"},Kd={class:"flex gap-2"},Wd=["disabled"],Gd=["disabled"],Yd={__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 Provider",title:"邮箱服务配置",description:"配置自动注册和收验证码所需的邮箱后端。可以在 CloudMail 和 Cloudflare Temp Email 之间切换。",note:"带 * 的项会直接影响账号池操作;只有当前选中的邮箱提供者配置会被视为运行时必填。",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:"🛰️"}],i=M("cloudmail"),a=M(!1),u=M([]),d=ds({}),c=M(!1),g=M(!1),_=M(!1),$=M(""),B=M(""),D=M(""),N=M(""),V=M(!1),K=M(!1),J=M(!1),T=M(""),z=M(""),G=new Set(["API_KEY"]),le={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"},oe=re(()=>n[i.value]?i.value:""),be=re(()=>l[oe.value]||null);function ke(h){return u.value.find(m=>m.key===h)||null}function Z(h){return le[h]||""}function X(h){return h.map(m=>ke(m)).filter(Boolean)}const Ae=re(()=>X(n.security)),se=re(()=>X(n.proxy)),Je=re(()=>X(["SYNC_TARGET_CPA","SYNC_TARGET_SUB2API"])),pe=re(()=>String(d.MAIL_PROVIDER||"cloudmail").toLowerCase()==="cloudflare_temp_email"?"cloudflare_temp_email":"cloudmail"),I=re(()=>X(["CLOUDMAIL_BASE_URL","CLOUDMAIL_EMAIL","CLOUDMAIL_PASSWORD","CLOUDMAIL_DOMAIN"])),F=re(()=>X(["CF_TEMP_EMAIL_BASE_URL","CF_TEMP_EMAIL_ADMIN_PASSWORD","CF_TEMP_EMAIL_DOMAIN"])),E=re(()=>String(d.SYNC_TARGET_CPA||"").toLowerCase()==="true"),ye=re(()=>String(d.SYNC_TARGET_SUB2API||"").toLowerCase()==="true"),ve=re(()=>E.value?X(["CPA_URL","CPA_KEY"]):[]),_e=re(()=>ye.value?X(["SUB2API_URL","SUB2API_EMAIL","SUB2API_PASSWORD","SUB2API_GROUP"]):[]),at=re(()=>ye.value?X(["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"]):[]),Ut=re(()=>oe.value==="cloudmail"?pe.value==="cloudflare_temp_email"?F.value:I.value:oe.value==="security"?Ae.value:[]),Yt=re(()=>{const h=[];return E.value&&h.push("CPA"),ye.value&&h.push("Sub2API"),h.length?`已启用:${h.join(" + ")}`:"当前未启用远端"}),Xe=re(()=>{if(!oe.value)return{label:"",class:"border-white/10 bg-white/5 text-slate-400"};if(oe.value==="sync"){if(!E.value&&!ye.value)return{label:"未启用",class:"border-white/10 bg-white/5 text-slate-400"};const j=!E.value||ve.value.every(P=>!v(P)||P.configured),R=!ye.value||_e.value.every(P=>!v(P)||P.configured);return j&&R?{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(oe.value==="proxy")return se.value.some(j=>j.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(oe.value==="cloudmail"){const j=pe.value==="cloudflare_temp_email"?F.value:I.value;return j.length>0&&j.every(P=>!v(P)||P.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"}}const h=Ut.value;return h.length>0&&h.every(j=>!v(j)||j.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 Fe(h,m="success"){$.value=h,B.value=m==="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(Fe._timer),Fe._timer=window.setTimeout(()=>{$.value=""},8e3)}function We(h,m="success"){T.value=h,z.value=m==="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(We._timer),We._timer=window.setTimeout(()=>{T.value=""},8e3)}function Be(h){return["SUB2API_CONCURRENCY","SUB2API_PRIORITY","SUB2API_RATE_MULTIPLIER"].includes(h)?"number":h.includes("PASSWORD")||h.includes("KEY")?"password":"text"}function k(h){return h==="SYNC_TARGET_CPA"||h==="SYNC_TARGET_SUB2API"}function L(h){return k(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 p(h){if(h==="SUB2API_RATE_MULTIPLIER")return"0.001";if(h==="SUB2API_CONCURRENCY"||h==="SUB2API_PRIORITY")return"1"}function v(h){return!!(h!=null&&h.runtime_required)||G.has(h==null?void 0:h.key)}function C(h){const m=(h==null?void 0:h.value)??(h==null?void 0:h.default)??"";if(L(h==null?void 0:h.key))return String(m).toLowerCase()==="true"?"true":"false";if(f(h==null?void 0:h.key)){const j=String(m||"").toLowerCase();return["off","ctx_pool","passthrough"].includes(j)?j:"off"}return m}async function S(){c.value=!0;try{const h=await Q.getRuntimeConfig();u.value=h.fields||[];for(const m of Object.keys(d))u.value.find(j=>j.key===m)||delete d[m];for(const m of u.value)d[m.key]=C(m)}catch(h){console.error("加载运行时配置失败:",h),Fe("加载运行时配置失败: "+h.message,"error")}finally{c.value=!1}}async function A(){g.value=!0,_.value=!1;try{const h={};for(const j of u.value){const R=d[j.key];h[j.key]=R==null?"":String(R)}const m=await Q.saveRuntimeConfig(h);m.api_key&&$s(m.api_key),Fe(m.message||"配置保存成功"),_.value=!0,window.setTimeout(()=>{_.value=!1},3e3),await S(),s("refresh")}catch(h){Fe(h.message,"error")}finally{g.value=!1}}async function U(){V.value=!0;try{const h=await Q.getRuntimeConfigSource();D.value=h.path||".env",N.value=h.content||"",J.value=!0}catch(h){console.error("加载源文件失败:",h),We("加载源文件失败: "+h.message,"error")}finally{V.value=!1}}async function O(){K.value=!0;try{const h=await Q.saveRuntimeConfigSource({content:N.value});h.api_key&&$s(h.api_key),We(h.message||"源文件保存成功"),await Promise.all([U(),S()]),s("refresh")}catch(h){We(h.message,"error")}finally{K.value=!1}}return Ot(i,async h=>{h==="source"&&!J.value&&await U()}),Mt(async()=>{await S()}),(h,m)=>{var j,R,P,Y,ie,ue;return b(),x("div",bc,[m[24]||(m[24]=Rt('
AutoTeam Configuration Center

配置面板

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

高频配置前置,低频配置后置;代理等高级项默认折叠,源文件编辑仍然保留。
🧩
独立配置分区
邮箱服务、同步、安全等高频项前置,低频代理项后置,不再混在一张表单里。
☁️
动态同步配置
先选择邮箱提供者 / 启用目标,再按状态展示对应配置。
📝
源文件编辑保留
可视化配置之外,仍可直接维护完整 .env 源文件。
',1)),r("div",vc,[r("div",xc,[(b(),x(ae,null,we(o,w=>r("button",{key:w.key,onClick:ee=>i.value=w.key,class:ne(["pill-tab flex items-center gap-2",i.value===w.key?"pill-tab-active":""])},[r("span",_c,y(w.icon),1),xe(" "+y(w.label),1)],10,yc)),64))])]),oe.value?(b(),x("div",wc,[r("div",Sc,[r("div",null,[r("div",kc,[r("span",null,y((j=be.value)==null?void 0:j.icon),1),xe(" "+y((R=be.value)==null?void 0:R.badge),1)]),r("h3",Ac,y((P=be.value)==null?void 0:P.title),1),r("p",Cc,y((Y=be.value)==null?void 0:Y.description),1),(ie=be.value)!=null&&ie.note?(b(),x("p",Pc,y(be.value.note),1)):H("",!0)]),r("div",Tc,[_.value?(b(),x("span",$c," 已保存 ")):H("",!0),r("span",{class:ne(["status-badge min-w-[84px] justify-center",Xe.value.class])},y(Xe.value.label),3)])]),$.value?(b(),x("div",{key:0,class:ne(["mb-4 rounded-2xl px-4 py-3 text-sm border",B.value])},y($.value),3)):H("",!0),c.value?(b(),x("div",Ic," 正在加载当前配置... ")):oe.value==="cloudmail"?(b(),x("div",Ec,[r("div",Oc,[r("div",Rc,[m[7]||(m[7]=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",Mc,y(pe.value==="cloudflare_temp_email"?"Cloudflare Temp Email":"CloudMail"),1)]),fe(r("select",{"onUpdate:modelValue":m[0]||(m[0]=w=>d.MAIL_PROVIDER=w),class:"input-dark"},[...m[8]||(m[8]=[r("option",{value:"cloudmail"},"CloudMail",-1),r("option",{value:"cloudflare_temp_email"},"Cloudflare Temp Email",-1)])],512),[[Nt,d.MAIL_PROVIDER]])]),pe.value==="cloudmail"?(b(),x("div",Uc,[m[9]||(m[9]=r("div",{class:"mb-4"},[r("div",{class:"text-sm font-medium text-white"},"CloudMail"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 填写 CloudMail API 地址、管理员账号和用于创建临时邮箱的域名。 ")],-1)),r("div",Lc,[(b(!0),x(ae,null,we(I.value,w=>(b(),x("div",{key:w.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Dc,[xe(y(w.prompt)+" ",1),v(w)?(b(),x("span",Nc,"*")):H("",!0)]),fe(r("input",{"onUpdate:modelValue":ee=>d[w.key]=ee,type:Be(w.key),placeholder:w.default||"",class:"input-dark"},null,8,jc),[[xt,d[w.key]]])]))),128))])])):pe.value==="cloudflare_temp_email"?(b(),x("div",Fc,[m[10]||(m[10]=r("div",{class:"mb-4"},[r("div",{class:"text-sm font-medium text-white"},"Cloudflare Temp Email"),r("div",{class:"mt-1 text-xs leading-5 text-slate-400"}," 填写 Cloudflare Temp Email 管理端地址、管理员密码和默认邮箱域名。 ")],-1)),r("div",Bc,[(b(!0),x(ae,null,we(F.value,w=>(b(),x("div",{key:w.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Vc,[xe(y(w.prompt)+" ",1),v(w)?(b(),x("span",Hc,"*")):H("",!0)]),fe(r("input",{"onUpdate:modelValue":ee=>d[w.key]=ee,type:Be(w.key),placeholder:w.default||"",class:"input-dark"},null,8,Kc),[[xt,d[w.key]]])]))),128))])])):H("",!0),r("div",Wc,[m[11]||(m[11]=r("p",{class:"text-xs leading-6 text-slate-400"}," 保存后会立即热加载;后续创建账号、自动收验证码和自动复用都会改用当前选择的邮箱提供者。 ",-1)),r("button",{onClick:A,disabled:g.value||c.value,class:"btn-primary"},y(g.value?"保存中...":"保存配置"),9,Gc)])])):oe.value==="sync"?(b(),x("div",Yc,[r("div",qc,[r("div",Jc,[m[12]||(m[12]=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",Xc,y(Yt.value),1)]),r("div",zc,[(b(!0),x(ae,null,we(Je.value,w=>(b(),x("div",{key:w.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Qc,y(w.prompt),1),fe(r("select",{"onUpdate:modelValue":ee=>d[w.key]=ee,class:"input-dark"},[...m[13]||(m[13]=[r("option",{value:"true"},"启用",-1),r("option",{value:"false"},"关闭",-1)])],8,Zc),[[Nt,d[w.key]]])]))),128))])]),E.value?(b(),x("div",ed,[m[14]||(m[14]=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",td,[(b(!0),x(ae,null,we(ve.value,w=>(b(),x("div",{key:w.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",sd,[xe(y(w.prompt)+" ",1),v(w)?(b(),x("span",nd,"*")):H("",!0)]),fe(r("input",{"onUpdate:modelValue":ee=>d[w.key]=ee,type:Be(w.key),placeholder:w.default||"",class:"input-dark"},null,8,ld),[[xt,d[w.key]]])]))),128))])])):H("",!0),ye.value?(b(),x("div",od,[m[15]||(m[15]=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",rd,[(b(!0),x(ae,null,we(_e.value,w=>(b(),x("div",{key:w.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",id,[xe(y(w.prompt)+" ",1),v(w)?(b(),x("span",ad,"*")):H("",!0),Z(w.key)?(b(),x("div",ud,y(Z(w.key)),1)):H("",!0)]),fe(r("input",{"onUpdate:modelValue":ee=>d[w.key]=ee,type:Be(w.key),placeholder:w.default||"",class:"input-dark"},null,8,cd),[[xt,d[w.key]]])]))),128))])])):H("",!0),ye.value?(b(),x("div",dd,[m[18]||(m[18]=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",fd,[(b(!0),x(ae,null,we(at.value,w=>(b(),x("div",{key:w.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",pd,[xe(y(w.prompt)+" ",1),v(w)?(b(),x("span",gd,"*")):H("",!0),Z(w.key)?(b(),x("div",md,y(Z(w.key)),1)):H("",!0)]),L(w.key)?fe((b(),x("select",{key:0,"onUpdate:modelValue":ee=>d[w.key]=ee,class:"input-dark"},[...m[16]||(m[16]=[r("option",{value:"true"},"true",-1),r("option",{value:"false"},"false",-1)])],8,hd)),[[Nt,d[w.key]]]):f(w.key)?fe((b(),x("select",{key:1,"onUpdate:modelValue":ee=>d[w.key]=ee,class:"input-dark"},[...m[17]||(m[17]=[r("option",{value:"off"},"off",-1),r("option",{value:"ctx_pool"},"ctx_pool",-1),r("option",{value:"passthrough"},"passthrough",-1)])],8,bd)),[[Nt,d[w.key]]]):fe((b(),x("input",{key:2,"onUpdate:modelValue":ee=>d[w.key]=ee,type:Be(w.key),step:p(w.key),placeholder:w.default||"",class:"input-dark"},null,8,vd)),[[xt,d[w.key]]])]))),128))])])):H("",!0),!E.value&&!ye.value?(b(),x("div",xd," 当前还没有启用任何远端同步目标。先打开上面的开关,再填写对应远端配置。 ")):H("",!0),r("div",yd,[m[19]||(m[19]=r("p",{class:"text-xs leading-6 text-slate-400"}," 保存后会立即热加载;账号池操作会根据当前已启用远端决定后续同步行为。 ",-1)),r("button",{onClick:A,disabled:g.value||c.value,class:"btn-primary"},y(g.value?"保存中...":"保存配置"),9,_d)])])):oe.value==="proxy"?(b(),x("div",wd,[r("div",Sd,[r("button",{onClick:m[1]||(m[1]=w=>a.value=!a.value),class:"flex w-full items-center justify-between gap-4 text-left"},[m[20]||(m[20]=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",kd,y(a.value?"收起":"展开"),1)]),a.value?(b(),x("div",Ad,[(b(!0),x(ae,null,we(se.value,w=>(b(),x("div",{key:w.key,class:"rounded-2xl border border-white/10 bg-slate-950/25 p-4"},[r("label",Cd,[xe(y(w.prompt)+" ",1),v(w)?(b(),x("span",Pd,"*")):H("",!0)]),fe(r("input",{"onUpdate:modelValue":ee=>d[w.key]=ee,type:Be(w.key),placeholder:w.default||"",class:"input-dark"},null,8,Td),[[xt,d[w.key]]])]))),128))])):H("",!0)]),r("div",$d,[m[21]||(m[21]=r("p",{class:"text-xs leading-6 text-slate-400"}," 推荐只在确实需要代理 Playwright 浏览器流量时启用,并配合绕过列表避免本地回调误走代理。 ",-1)),r("button",{onClick:A,disabled:g.value||c.value,class:"btn-primary"},y(g.value?"保存中...":"保存配置"),9,Id)])])):(b(),x("div",Ed,[r("div",Od,[(b(!0),x(ae,null,we(Ut.value,w=>(b(),x("div",{key:w.key,class:"rounded-2xl border border-white/10 bg-white/5 p-4"},[r("label",Rd,[xe(y(w.prompt)+" ",1),v(w)?(b(),x("span",Md,"*")):H("",!0),w.key==="API_KEY"?(b(),x("span",Ud,"(留空自动生成)")):H("",!0)]),fe(r("input",{"onUpdate:modelValue":ee=>d[w.key]=ee,type:Be(w.key),placeholder:w.default||"",class:"input-dark"},null,8,Ld),[[xt,d[w.key]]])]))),128))]),r("div",Dd,[r("p",Nd,y((ue=be.value)==null?void 0:ue.footer),1),r("button",{onClick:A,disabled:g.value||c.value,class:"btn-primary"},y(g.value?"保存中...":"保存配置"),9,jd)])]))])):i.value==="admin"?(b(),Ne(fl,{key:1,"admin-status":e.adminStatus,"codex-status":e.codexStatus,section:"admin",onRefresh:m[2]||(m[2]=w=>h.$emit("refresh")),onAdminProgress:m[3]||(m[3]=w=>h.$emit("admin-progress"))},null,8,["admin-status","codex-status"])):i.value==="auto-check"?(b(),Ne(fl,{key:2,"admin-status":e.adminStatus,"codex-status":e.codexStatus,section:"auto-check",onRefresh:m[4]||(m[4]=w=>h.$emit("refresh")),onAdminProgress:m[5]||(m[5]=w=>h.$emit("admin-progress"))},null,8,["admin-status","codex-status"])):i.value==="source"?(b(),x("div",Fd,[r("div",Bd,[m[22]||(m[22]=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,"📝"),xe(" Source Editor ")]),r("h3",{class:"section-heading"},"源文件编辑"),r("p",{class:"section-subtitle"}," 直接编辑 .env 源文件。保存后会立即重载并校验邮箱服务 / 远端同步配置。 ")],-1)),r("div",Vd,y(D.value||".env"),1)]),T.value?(b(),x("div",{key:0,class:ne(["rounded-2xl px-4 py-3 text-sm border",z.value])},y(T.value),3)):H("",!0),fe(r("textarea",{"onUpdate:modelValue":m[6]||(m[6]=w=>N.value=w),rows:"20",spellcheck:"false",class:"textarea-dark min-h-[420px] font-mono",placeholder:"在这里编辑 .env 内容"},null,512),[[Pe,N.value]]),r("div",Hd,[m[23]||(m[23]=r("p",{class:"text-xs leading-6 text-slate-400"}," 这里是原始文本模式,适合你直接粘贴或手工维护完整 .env。 ",-1)),r("div",Kd,[r("button",{onClick:U,disabled:V.value||K.value,class:"btn-secondary"},y(V.value?"加载中...":"重新读取"),9,Wd),r("button",{onClick:O,disabled:V.value||K.value,class:"btn-primary"},y(K.value?"保存中...":"保存源文件"),9,Gd)])])])):H("",!0)])}}},qd={class:"flex items-center justify-between mb-6"},Jd=["disabled"],Xd={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"},zd={key:1,class:"space-y-4"},Qd={class:"flex gap-4 text-sm"},Zd={class:"px-3 py-1.5 bg-gray-800 rounded-lg text-gray-300"},ef={class:"text-white font-medium"},tf={key:0,class:"px-3 py-1.5 bg-gray-800 rounded-lg text-gray-300"},sf={class:"text-yellow-400 font-medium"},nf={class:"bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},lf={class:"overflow-x-auto"},of={class:"w-full text-sm"},rf={class:"px-4 py-3 text-gray-500"},af={class:"px-4 py-3 font-mono text-xs text-slate-200"},uf={class:"px-4 py-3"},cf={class:"px-4 py-3"},df={class:"px-4 py-3"},ff={class:"px-4 py-3 text-right"},pf=["onClick","disabled"],gf={key:2,class:"bg-gray-900 border border-gray-800 rounded-xl h-64 animate-pulse"},mf={key:3,class:"text-center text-gray-500 py-12"},Qs="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(Qs);if(c){const g=JSON.parse(c);if(g.time&&Date.now()-g.time<6e5)return g.data}}catch{}return null}function i(c){try{localStorage.setItem(Qs,JSON.stringify({data:c,time:Date.now()}))}catch{}}function a(c){return`${c.type}:${c.user_id}:${c.email}`}async function u(){s.value=!0,n.value="";try{t.value=await Q.getTeamMembers(),i(t.value)}catch(c){n.value=c.message}finally{s.value=!1}}async function d(c){const g=c.type==="invite"?"取消邀请":"移出 Team";if(window.confirm(`确认${g} ${c.email}?`)){l.value=a(c),n.value="";try{await Q.removeTeamMember({email:c.email,user_id:c.user_id,type:c.type});try{localStorage.removeItem(Qs)}catch{}await u()}catch($){n.value=$.message}finally{l.value=""}}}return Mt(()=>{const c=o();c?t.value=c:u()}),(c,g)=>(b(),x("div",null,[r("div",qd,[g[0]||(g[0]=r("h2",{class:"text-xl font-bold text-white"},"Team 成员",-1)),r("button",{onClick:u,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,Jd)]),n.value?(b(),x("div",Xd,y(n.value),1)):H("",!0),t.value?(b(),x("div",zd,[r("div",Qd,[r("span",Zd,[g[1]||(g[1]=xe("成员: ",-1)),r("span",ef,y(t.value.total),1)]),t.value.invites>0?(b(),x("span",tf,[g[2]||(g[2]=xe("待接受邀请: ",-1)),r("span",sf,y(t.value.invites),1)])):H("",!0)]),r("div",nf,[r("div",lf,[r("table",of,[g[3]||(g[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(ae,null,we(t.value.members,(_,$)=>(b(),x("tr",{key:_.email+_.type,class:"border-b border-gray-800/50 hover:bg-gray-800/30 transition"},[r("td",rf,y($+1),1),r("td",af,y(_.email),1),r("td",uf,[r("span",{class:ne(["px-2 py-0.5 rounded text-xs font-medium",{"bg-purple-500/10 text-purple-400":_.role==="account-owner","bg-blue-500/10 text-blue-400":_.role==="account-admin","bg-gray-500/10 text-gray-300":_.role!=="account-owner"&&_.role!=="account-admin"}])},y(_.role||"member"),3)]),r("td",cf,[r("span",{class:ne(["px-2 py-0.5 rounded text-xs font-medium",_.type==="invite"?"bg-yellow-500/10 text-yellow-400":"bg-green-500/10 text-green-400"])},y(_.type==="invite"?"待接受":"已加入"),3)]),r("td",df,[r("span",{class:ne(["text-xs",_.is_local?"text-blue-400":"text-gray-500"])},y(_.is_local?"本地管理":"外部"),3)]),r("td",ff,[_.role!=="account-owner"?(b(),x("button",{key:0,onClick:B=>d(_),disabled:l.value===a(_),class:ne(["px-3 py-1.5 rounded-lg text-xs font-medium border transition",l.value===a(_)?"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===a(_)?"处理中...":"移出"),11,pf)):H("",!0)])]))),128))])])])])])):s.value?(b(),x("div",gf)):(b(),x("div",mf," 点击「刷新」加载 Team 成员列表 "))]))}},bf={class:"mt-6 bg-gray-900 border border-gray-800 rounded-xl p-4"},vf={class:"text-lg font-semibold text-white mb-4"},xf={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"},yf={class:"flex flex-wrap gap-3"},_f=["onClick","disabled"],wf={key:1,class:"mt-4 flex items-center gap-3"},Sf={class:"text-sm text-gray-400"},kf=["disabled"],_o={__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),i=M(""),a=M(5),u=M(null),d=M(""),c=M(""),g=re(()=>{var T;return!!((T=s.adminStatus)!=null&&T.configured)}),_=re(()=>s.mode==="all"?l:l.filter(T=>T.group===s.mode)),$=re(()=>s.mode==="pool"?"账号池操作":s.mode==="sync"?"同步操作":"操作"),B=re(()=>s.mode==="sync"?"同步类操作可独立使用:同步账号、同步已启用远端、拉取 CPA。":"请先在「配置面板」页完成管理员登录后,轮转/补满/清理等账号池操作才会开放。"),D=re(()=>!g.value&&(s.mode==="pool"||s.mode==="sync"));function N(T){return!!(s.runningTask||!g.value&&!T.allowWithoutAdmin)}async function V(T){if(!N(T)){if(d.value="",T.needParam){u.value=T,i.value=T.paramName==="target"?"目标成员数":"最大席位",a.value=5,o.value=!0;return}await J(T)}}async function K(){o.value=!1,u.value&&(await J(u.value,a.value),u.value=null)}async function J(T,z){try{if(T.sync){const G=await Q[T.method]();d.value=G.message||"操作完成",c.value="bg-green-500/10 text-green-400 border border-green-500/20",n("refresh")}else{const G=await Q[T.method](z);d.value=`任务已提交: ${G.task_id}`,c.value="bg-blue-500/10 text-blue-400 border border-blue-500/20",n("task-started")}}catch(G){d.value=G.message,c.value="bg-red-500/10 text-red-400 border border-red-500/20"}setTimeout(()=>{d.value=""},8e3)}return(T,z)=>(b(),x("div",bf,[r("h2",vf,y($.value),1),D.value?(b(),x("div",xf,y(B.value),1)):H("",!0),r("div",yf,[(b(!0),x(ae,null,we(_.value,G=>(b(),x("button",{key:G.key,onClick:le=>V(G),disabled:N(G),class:ne(["px-4 py-2 rounded-lg text-sm font-medium transition border",N(G)?"bg-gray-800 text-gray-500 border-gray-700 cursor-not-allowed":`${G.style} hover:opacity-80`])},y(G.label),11,_f))),128))]),o.value?(b(),x("div",wf,[r("label",Sf,y(i.value)+":",1),fe(r("input",{"onUpdate:modelValue":z[0]||(z[0]=G=>a.value=G),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),[[Pe,a.value,void 0,{number:!0}]]),r("button",{onClick:K,disabled:u.value&&N(u.value),class:"px-4 py-1.5 bg-blue-600 hover:bg-blue-500 text-white text-sm rounded-lg transition"}," 确认执行 ",8,kf),r("button",{onClick:z[1]||(z[1]=G=>o.value=!1),class:"px-3 py-1.5 text-gray-400 hover:text-white text-sm transition"}," 取消 ")])):H("",!0),d.value?(b(),x("div",{key:2,class:ne(["mt-4 px-4 py-3 rounded-lg text-sm",c.value])},y(d.value),3)):H("",!0)]))}},Af={__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)),Me(_o,{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"])]))}},Cf={__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)),Me(_o,{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"])]))}},Pf={class:"mt-6 bg-gray-900 border border-gray-800 rounded-xl overflow-hidden"},Tf={key:0,class:"px-4 py-8 text-center text-gray-500 text-sm"},$f={key:1,class:"overflow-x-auto"},If={class:"w-full text-sm"},Ef={class:"px-4 py-3 font-mono text-xs text-gray-400"},Of={class:"px-4 py-3"},Rf={class:"px-2 py-0.5 bg-gray-800 rounded text-xs font-medium text-gray-300"},Mf={class:"px-4 py-3 text-xs text-gray-400"},Uf={class:"px-4 py-3"},Lf={key:0,class:"animate-spin inline-block w-3 h-3 border-2 border-current border-t-transparent rounded-full"},Df={class:"px-4 py-3 text-xs text-gray-400"},Nf={class:"px-4 py-3 text-xs text-gray-400"},jf={__name:"TaskHistory",props:{tasks:{type:Array,default:()=>[]}},setup(e){function t(u){return{pending:"text-gray-400",running:"text-yellow-400",completed:"text-green-400",failed:"text-red-400"}[u]||"text-gray-400"}function s(u){return{pending:"bg-gray-400",completed:"bg-green-400",failed:"bg-red-400"}[u]||"bg-gray-400"}function n(u){return{pending:"等待中",running:"执行中",completed:"已完成",failed:"失败"}[u]||u}function l(u){if(!u)return"-";const d=new Date(u*1e3);return`${String(d.getMonth()+1).padStart(2,"0")}-${String(d.getDate()).padStart(2,"0")} ${String(d.getHours()).padStart(2,"0")}:${String(d.getMinutes()).padStart(2,"0")}:${String(d.getSeconds()).padStart(2,"0")}`}function o(u){const d=u.started_at||u.created_at,c=u.finished_at||(u.status==="running"?Date.now()/1e3:null);if(!d||!c)return"-";const g=Math.round(c-d);return g<60?`${g}s`:`${Math.floor(g/60)}m ${g%60}s`}function i(u){return!u||Object.keys(u).length===0?"-":Object.entries(u).map(([d,c])=>`${d}=${c}`).join(", ")}function a(u){return u==null?"-":typeof u=="string"?u:JSON.stringify(u)}return(u,d)=>(b(),x("div",Pf,[d[1]||(d[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",Tf," 暂无任务记录 ")):(b(),x("div",$f,[r("table",If,[d[0]||(d[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(ae,null,we(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",Ef,y(c.task_id),1),r("td",Of,[r("span",Rf,y(c.command),1)]),r("td",Mf,y(i(c.params)),1),r("td",Uf,[r("span",{class:ne(["inline-flex items-center gap-1.5 text-xs font-medium",t(c.status)])},[c.status==="running"?(b(),x("span",Lf)):(b(),x("span",{key:1,class:ne(["w-1.5 h-1.5 rounded-full",s(c.status)])},null,2)),xe(" "+y(n(c.status)),1)],2)]),r("td",Df,y(l(c.created_at)),1),r("td",Nf,y(o(c)),1),r("td",{class:ne(["px-4 py-3 text-xs max-w-xs truncate",c.error?"text-red-400":"text-gray-400"])},y(c.error||a(c.result)),3)]))),128))])])]))]))}},Ff={__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)),Me(jf,{tasks:e.tasks},null,8,["tasks"])]))}},Bf={class:"flex items-center justify-between mb-6"},Vf={class:"flex items-center gap-3"},Hf={class:"flex items-center gap-2 text-sm text-gray-400"},Kf=["disabled"],Wf={key:0,class:"text-gray-600 text-center py-8"},Gf={class:"text-gray-600 shrink-0"},Yf={class:"text-gray-300 break-all"},qf={__name:"LogViewer",setup(e){const t=M([]),s=M(!1),n=M(!0),l=M(null);let o=null,i=0;function a(c){const g=new Date(c*1e3);return`${String(g.getHours()).padStart(2,"0")}:${String(g.getMinutes()).padStart(2,"0")}:${String(g.getSeconds()).padStart(2,"0")}`}async function u(){s.value=!0;try{const c=await Q.getLogs(500,i);c.logs.length>0&&(i===0?t.value=c.logs:(t.value.push(...c.logs),t.value.length>1e3&&(t.value=t.value.slice(-1e3))),i=c.logs[c.logs.length-1].time,n.value&&Sn(()=>{l.value&&(l.value.scrollTop=l.value.scrollHeight)}))}catch(c){console.error("获取日志失败:",c)}finally{s.value=!1}}function d(){t.value=[],i=0}return Mt(()=>{u(),o=setInterval(u,3e3)}),Ns(()=>{o&&clearInterval(o)}),(c,g)=>(b(),x("div",null,[r("div",Bf,[g[2]||(g[2]=r("h2",{class:"text-xl font-bold text-white"},"日志",-1)),r("div",Vf,[r("label",Hf,[fe(r("input",{type:"checkbox","onUpdate:modelValue":g[0]||(g[0]=_=>n.value=_),class:"rounded bg-gray-800 border-gray-700"},null,512),[[xo,n.value]]),g[1]||(g[1]=xe(" 自动滚动 ",-1))]),r("button",{onClick:u,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,Kf),r("button",{onClick:d,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",Wf,"暂无日志")):H("",!0),(b(!0),x(ae,null,we(t.value,(_,$)=>(b(),x("div",{key:$,class:"py-0.5 flex gap-3 hover:bg-gray-900/50"},[r("span",Gf,y(a(_.time)),1),r("span",{class:ne(["shrink-0 w-16",{"text-red-400":_.level==="ERROR","text-yellow-400":_.level==="WARNING","text-blue-400":_.level==="INFO","text-gray-500":_.level==="DEBUG"}])},y(_.level),3),r("span",Yf,y(_.message),1)]))),128))],512)]))}},Jf={class:"mt-6 space-y-6"},Xf={class:"bg-gray-900 border border-gray-800 rounded-xl p-4"},zf={class:"flex items-center justify-between gap-4 mb-4"},Qf={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"},Zf={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"},e0={key:3,class:"flex flex-wrap gap-3"},t0=["disabled"],s0={key:4,class:"space-y-4"},n0={class:"space-y-2"},l0={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"],i0={key:0,class:"text-xs text-emerald-300"},a0={class:"space-y-3"},u0=["disabled"],c0=["disabled"],d0={key:1,class:"text-xs text-emerald-300"},f0={class:"flex justify-end"},p0=["disabled"],g0={__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),i=M(""),a=M(""),u=M(""),d=re(()=>{var B;return!!((B=s.manualAccountStatus)!=null&&B.in_progress)});Ot(()=>s.manualAccountStatus,B=>{B!=null&&B.in_progress||(l.value="",i.value="")},{immediate:!0});function c(B,D="success"){a.value=B,u.value=D==="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(()=>{a.value=""},8e3)}async function g(){o.value=!0,i.value="正在生成 OAuth 链接...";try{const B=await Q.startManualAccount();c(B.auth_url?"OAuth 链接已生成,请完成登录后粘贴回调 URL":"已开始 OAuth 登录流程"),n("progress")}catch(B){c(B.message,"error")}finally{o.value=!1,i.value=""}}async function _(){o.value=!0,i.value="正在提交回调 URL 并交换 token...";try{const B=await Q.submitManualAccountCallback(l.value);c(B.status==="completed"?B.message||"账号已添加":"回调 URL 已提交"),n("progress")}catch(B){c(B.message,"error")}finally{o.value=!1,i.value=""}}async function $(){o.value=!0;try{await Q.cancelManualAccount(),l.value="",c("OAuth 登录流程已取消"),n("refresh")}catch(B){c(B.message,"error")}finally{o.value=!1}}return(B,D)=>{var N,V,K,J,T,z,G,le,oe,be,ke;return b(),x("div",Jf,[r("div",Xf,[r("div",zf,[D[1]||(D[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:ne(["min-w-[72px] px-3 py-1.5 rounded-full text-xs text-center whitespace-nowrap border",d.value?"bg-yellow-500/10 text-yellow-300 border-yellow-500/20":"bg-gray-800 text-gray-400 border-gray-700"])},y(d.value?"进行中":"空闲"),3)]),a.value?(b(),x("div",{key:0,class:ne(["mb-4 px-4 py-3 rounded-lg text-sm border",u.value])},y(a.value),3)):H("",!0),((N=e.manualAccountStatus)==null?void 0:N.status)==="completed"&&((V=e.manualAccountStatus)!=null&&V.account)?(b(),x("div",Qf,y(e.manualAccountStatus.message||`已添加账号 ${e.manualAccountStatus.account.email}`),1)):((K=e.manualAccountStatus)==null?void 0:K.status)==="error"&&((J=e.manualAccountStatus)!=null&&J.error)?(b(),x("div",Zf,y(e.manualAccountStatus.error),1)):H("",!0),d.value?(b(),x("div",s0,[D[3]||(D[3]=r("div",{class:"text-sm text-gray-300"},[xe(" 已生成 OAuth 链接。若当前机器可访问 "),r("span",{class:"font-mono"},"localhost:1455"),xe(",系统会自动接收回调;否则请手动粘贴最终回调 URL。 ")],-1)),r("div",{class:ne(["px-4 py-3 rounded-lg text-sm border",(T=e.manualAccountStatus)!=null&&T.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 后会自动完成认证。":`本地自动回调不可用:${((G=e.manualAccountStatus)==null?void 0:G.auto_callback_error)||"请改用手动粘贴回调 URL"}`),3),r("div",n0,[D[2]||(D[2]=r("div",{class:"text-xs text-gray-500"},"OAuth 链接",-1)),r("div",l0,y((le=e.manualAccountStatus)==null?void 0:le.auth_url),1)]),r("div",o0,[r("a",{href:(oe=e.manualAccountStatus)==null?void 0:oe.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)]),(be=e.manualAccountStatus)!=null&&be.callback_received?(b(),x("div",i0," 已收到"+y(((ke=e.manualAccountStatus)==null?void 0:ke.callback_source)==="auto"?"自动":"手动")+"回调,刷新轮询中… ",1)):H("",!0),r("div",a0,[fe(r("input",{"onUpdate:modelValue":D[0]||(D[0]=Z=>l.value=Z),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,u0),[[Pe,l.value,void 0,{trim:!0}]]),r("button",{onClick:_,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,c0)]),o.value&&i.value?(b(),x("div",d0,y(i.value),1)):H("",!0),r("div",f0,[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,p0)])])):(b(),x("div",e0,[r("button",{onClick:g,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)]))])])}}},wo="autoteam_theme",_t=M("dark");let pl=!1;function So(e){if(typeof document>"u")return;const t=e==="light"?"light":"dark";document.documentElement.dataset.theme=t,document.documentElement.style.colorScheme=t}function ko(){if(!pl){if(pl=!0,typeof window<"u"){const e=window.localStorage.getItem(wo);_t.value=e==="light"||e==="dark"?e:"dark"}So(_t.value)}}function Ao(e){_t.value=e==="light"?"light":"dark",typeof window<"u"&&window.localStorage.setItem(wo,_t.value),So(_t.value)}function m0(){Ao(_t.value==="dark"?"light":"dark")}function h0(){return ko(),{theme:_t,isDark:re(()=>_t.value==="dark"),setTheme:Ao,toggleTheme:m0}}const b0=["title","aria-label"],v0={class:"text-base"},x0={class:"hidden sm:inline"},gl={__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:ne(["theme-toggle",{"theme-toggle-floating":e.floating}]),title:Tt(t)?"切换到白天模式":"切换到夜间模式","aria-label":Tt(t)?"切换到白天模式":"切换到夜间模式",onClick:l[0]||(l[0]=(...o)=>Tt(s)&&Tt(s)(...o))},[r("span",v0,y(Tt(t)?"🌙":"☀️"),1),r("span",x0,y(Tt(t)?"夜间":"白天"),1)],10,b0))}},y0={key:2,class:"relative min-h-screen overflow-hidden"},_0={class:"relative mx-auto flex min-h-screen max-w-6xl items-center px-4 py-10"},w0={class:"grid w-full items-center gap-8 lg:grid-cols-[1.2fr_0.8fr]"},S0={class:"glass-card w-full p-7 sm:p-8"},k0={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"},A0={class:"space-y-4"},C0=["disabled"],P0={key:3,class:"relative md:flex"},T0={class:"relative min-w-0 flex-1 overflow-y-auto pb-20 md:pb-8"},$0={class:"mx-auto w-full max-w-[1500px] px-4 py-4 md:px-8 md:py-8"},I0={class:"mb-5 flex justify-end"},E0={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"},O0={class:"font-medium"},R0={__name:"App",setup(e){const t=M(!1),s=M(!1),n=M(!1),l=M(!1),o=M(""),i=M(""),a=M("dashboard"),u=M(null),d=M(null),c=M(null),g=M(null),_=M([]),$=M(!1),B=M(null),D=re(()=>{var Z,X;return(Z=d.value)!=null&&Z.login_in_progress?{command:"admin-login"}:(X=c.value)!=null&&X.in_progress?{command:"main-codex-sync"}:B.value});let N=null;async function V(){try{const Z=await Q.checkAuth();return s.value=Z.authenticated,n.value=Z.auth_required,Z.authenticated}catch(Z){return Z.status===401?(s.value=!1,n.value=!0,!1):(s.value=!0,n.value=!1,!0)}}async function K(){o.value="",l.value=!0;try{$s(i.value),await V()?(i.value="",T(),le(6e5)):(zs(),o.value="API Key 无效")}catch(Z){zs(),o.value=Z.message}finally{l.value=!1}}function J(){zs(),s.value=!1,oe()}async function T(){$.value=!0;try{const[Z,X,Ae,se,Je]=await Promise.all([Q.getStatus(),Q.getTasks(),Q.getAdminStatus(),Q.getMainCodexStatus(),Q.getManualAccountStatus()]);u.value=Z,_.value=X,d.value=Ae,c.value=se,g.value=Je,B.value=X.find(pe=>pe.status==="running"||pe.status==="pending")||null}catch(Z){if(Z.status===401){s.value=!1;return}console.error("刷新失败:",Z)}finally{$.value=!1}}function z(){le(1e4),T()}function G(){le(1e4),T()}function le(Z=6e5){oe(),N=setInterval(async()=>{await T(),!D.value&&Z<6e5&&le(6e5)},Z)}function oe(){N&&(clearInterval(N),N=null)}async function be(){try{return(await Q.getSetupStatus()).configured}catch{return!0}}function ke(){t.value=!1,V().then(Z=>{Z&&(T(),le(6e5))})}return Mt(async()=>{if(ko(),!await be()){t.value=!0;return}await V()&&(T(),le(6e5))}),Ns(()=>{oe()}),(Z,X)=>(b(),x(ae,null,[t.value||!s.value?(b(),Ne(gl,{key:0,floating:""})):H("",!0),t.value?(b(),Ne(fa,{key:1,onConfigured:ke})):s.value?(b(),x("div",P0,[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)),Me(Ca,{active:a.value,loading:$.value,"auth-required":n.value,onNavigate:X[1]||(X[1]=Ae=>a.value=Ae),onRefresh:T,onLogout:J},null,8,["active","loading","auth-required"]),r("div",T0,[r("div",$0,[r("div",I0,[Me(gl)]),D.value?(b(),x("div",E0,[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",O0,y(D.value.command==="admin-login"?"管理员登录中...":D.value.command==="main-codex-sync"?"主号 Codex 同步中...":`${D.value.command} 执行中...`),1)])):H("",!0),a.value==="dashboard"?(b(),Ne(su,{key:1,status:u.value,loading:$.value,"running-task":D.value,"admin-status":d.value,onRefresh:T,onTaskStarted:z},null,8,["status","loading","running-task","admin-status"])):a.value==="config"?(b(),Ne(Yd,{key:2,"admin-status":d.value,"codex-status":c.value,onRefresh:T,onAdminProgress:G},null,8,["admin-status","codex-status"])):a.value==="team"?(b(),Ne(hf,{key:3})):a.value==="pool"?(b(),Ne(Af,{key:4,"running-task":D.value,"admin-status":d.value,onTaskStarted:z,onRefresh:T},null,8,["running-task","admin-status"])):a.value==="sync"?(b(),Ne(Cf,{key:5,"running-task":D.value,"admin-status":d.value,onTaskStarted:z,onRefresh:T},null,8,["running-task","admin-status"])):a.value==="oauth"?(b(),Ne(g0,{key:6,"manual-account-status":g.value,onRefresh:T,onProgress:G},null,8,["manual-account-status"])):a.value==="tasks"?(b(),Ne(Ff,{key:7,tasks:_.value},null,8,["tasks"])):a.value==="logs"?(b(),Ne(qf,{key:8})):H("",!0)])])])):(b(),x("div",y0,[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",_0,[r("div",w0,[X[5]||(X[5]=Rt('',1)),r("div",S0,[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",k0,y(o.value),1)):H("",!0),r("div",A0,[r("div",null,[X[2]||(X[2]=r("label",{class:"mb-2 block text-sm font-medium text-slate-300"},"API Key",-1)),fe(r("input",{"onUpdate:modelValue":X[0]||(X[0]=Ae=>i.value=Ae),type:"password",placeholder:"输入 API Key",onKeyup:qi(K,["enter"]),class:"input-dark"},null,544),[[Pe,i.value,void 0,{trim:!0}]])]),r("button",{onClick:K,disabled:!i.value||l.value,class:"btn-primary w-full"},y(l.value?"验证中...":"登录"),9,C0)]),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))}};zi(R0).mount("#app"); diff --git a/src/autoteam/web/dist/assets/index-D-W9oyDB.css b/src/autoteam/web/dist/assets/index-CFyNdDdU.css similarity index 97% rename from src/autoteam/web/dist/assets/index-D-W9oyDB.css rename to src/autoteam/web/dist/assets/index-CFyNdDdU.css index a260af2e..0f66c732 100644 --- a/src/autoteam/web/dist/assets/index-D-W9oyDB.css +++ b/src/autoteam/web/dist/assets/index-CFyNdDdU.css @@ -1 +1 @@ -*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root[data-theme=light] .text-white{color:#0f172a!important}:root[data-theme=light] .text-slate-400,:root[data-theme=light] .text-gray-400{color:#475569!important}:root[data-theme=light] .text-slate-300,:root[data-theme=light] .text-slate-200,:root[data-theme=light] .text-gray-300,:root[data-theme=light] .text-gray-200{color:#334155!important}:root[data-theme=light] .text-slate-500,:root[data-theme=light] .text-gray-500,:root[data-theme=light] .text-gray-600{color:#64748b!important}:root[data-theme=light] .text-blue-200,:root[data-theme=light] .text-blue-300,:root[data-theme=light] .text-blue-400{color:#1d4ed8!important}:root[data-theme=light] .text-cyan-300,:root[data-theme=light] .text-cyan-400{color:#0f766e!important}:root[data-theme=light] .text-emerald-200,:root[data-theme=light] .text-emerald-300,:root[data-theme=light] .text-green-400{color:#047857!important}:root[data-theme=light] .text-amber-200,:root[data-theme=light] .text-amber-300,:root[data-theme=light] .text-amber-400,:root[data-theme=light] .text-yellow-300,:root[data-theme=light] .text-yellow-400{color:#b45309!important}:root[data-theme=light] .text-red-300,:root[data-theme=light] .text-red-400,:root[data-theme=light] .text-rose-400{color:#b91c1c!important}:root[data-theme=light] .text-purple-400{color:#7c3aed!important}:root[data-theme=light] .bg-gray-950,:root[data-theme=light] .bg-gray-900,:root[data-theme=light] .bg-gray-800,:root[data-theme=light] .bg-gray-800\/60,:root[data-theme=light] .bg-gray-800\/30,:root[data-theme=light] .bg-slate-950\/80,:root[data-theme=light] .bg-slate-950\/65,:root[data-theme=light] .bg-slate-950\/45,:root[data-theme=light] .bg-slate-950\/25,:root[data-theme=light] .bg-white\/5,:root[data-theme=light] .bg-black\/60{background-color:#ffffffc7!important}:root[data-theme=light] .border-white\/10,:root[data-theme=light] .border-gray-800,:root[data-theme=light] .border-gray-800\/50,:root[data-theme=light] .border-gray-700{border-color:#94a3b838!important}:root[data-theme=light] .bg-blue-500\/10,:root[data-theme=light] .bg-blue-500\/15{background-color:#dbeafeeb!important}:root[data-theme=light] .bg-cyan-600\/10,:root[data-theme=light] .bg-cyan-700,:root[data-theme=light] .bg-cyan-500\/15{background-color:#cffafeeb!important}:root[data-theme=light] .bg-emerald-500\/10,:root[data-theme=light] .bg-emerald-700{background-color:#d1fae5eb!important}:root[data-theme=light] .bg-amber-500\/10,:root[data-theme=light] .bg-amber-600\/20,:root[data-theme=light] .bg-amber-700{background-color:#fef3c7f0!important}:root[data-theme=light] .bg-red-500\/10,:root[data-theme=light] .bg-rose-500\/10,:root[data-theme=light] .bg-rose-700\/80{background-color:#fee2e2f0!important}:root[data-theme=light] .border-blue-400\/20,:root[data-theme=light] .border-blue-500\/20,:root[data-theme=light] .border-blue-500\/30{border-color:#60a5fa4d!important}:root[data-theme=light] .border-amber-400\/20,:root[data-theme=light] .border-amber-500\/20,:root[data-theme=light] .border-amber-500\/30,:root[data-theme=light] .border-yellow-500\/20{border-color:#f59e0b4d!important}:root[data-theme=light] .border-emerald-400\/20,:root[data-theme=light] .border-green-500\/20,:root[data-theme=light] .border-green-500\/30{border-color:#10b98147!important}:root[data-theme=light] .border-red-500\/20,:root[data-theme=light] .border-rose-500\/20,:root[data-theme=light] .border-rose-500\/30{border-color:#f871714d!important}:root[data-theme=light] .hover\:text-white:hover,:root[data-theme=light] .group:hover .group-hover\:text-white{color:#0f172a!important}:root[data-theme=light] .group:hover .group-hover\:bg-white\/10{background-color:#f1f5f9f5!important}:root[data-theme=light] .group:hover .group-hover\:border-white\/20{border-color:#94a3b852!important}:root[data-theme=light] .bg-slate-950\/80,:root[data-theme=light] .bg-slate-950\/65{-webkit-backdrop-filter:blur(22px);backdrop-filter:blur(22px)}:root[data-theme=light] .from-blue-300{--tw-gradient-from: #2563eb var(--tw-gradient-from-position) !important;--tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position) !important;--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to) !important}:root[data-theme=light] .via-cyan-300{--tw-gradient-stops: var(--tw-gradient-from), #0891b2 var(--tw-gradient-via-position), var(--tw-gradient-to) !important}:root[data-theme=light] .to-sky-400{--tw-gradient-to: #0284c7 var(--tw-gradient-to-position) !important}.glass-card{border:1px solid var(--card-border);background:var(--card-bg);box-shadow:var(--card-shadow);border-radius:1rem;--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.glass-card-soft{border:1px solid var(--card-border);background:var(--card-soft-bg);border-radius:1rem;--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.section-heading{color:var(--text-strong);font-size:1.25rem;line-height:1.75rem;font-weight:600;letter-spacing:-.025em}.section-subtitle{color:var(--text-muted);margin-top:.25rem;font-size:.875rem;line-height:1.5rem}.input-dark{border:1px solid var(--field-border);background:var(--field-bg);color:var(--field-text);width:100%;border-radius:.75rem;padding:.625rem .75rem;font-size:.875rem;line-height:1.25rem}.input-dark:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(59 130 246 / .2)}.input-dark::-moz-placeholder{color:var(--field-placeholder)}.input-dark::placeholder{color:var(--field-placeholder)}.input-dark:focus{border-color:#60a5fa73}.textarea-dark{border:1px solid var(--field-border);background:var(--field-bg);color:var(--field-text);width:100%;border-radius:1rem;padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem}.textarea-dark:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(59 130 246 / .2)}.textarea-dark::-moz-placeholder{color:var(--field-placeholder)}.textarea-dark::placeholder{color:var(--field-placeholder)}.textarea-dark:focus{border-color:#60a5fa73}:root[data-theme=light] .btn-primary{color:#0f172a}.btn-primary{display:inline-flex;align-items:center;justify-content:center;border-radius:.75rem;background-image:linear-gradient(to right,var(--tw-gradient-stops));--tw-gradient-from: #2563eb var(--tw-gradient-from-position);--tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: #06b6d4 var(--tw-gradient-to-position);padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 12px 32px -12px rgba(59,130,246,.8);--tw-shadow-colored: 0 12px 32px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: #22d3ee var(--tw-gradient-to-position)}.btn-primary:disabled{cursor:not-allowed;opacity:.5;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-secondary{border:1px solid var(--secondary-border);background:var(--secondary-bg);color:var(--secondary-text);display:inline-flex;align-items:center;justify-content:center;border-radius:.75rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary:hover{background:#94a3b81f}.btn-danger{border:1px solid var(--danger-border);background:var(--danger-bg);color:var(--danger-text);display:inline-flex;align-items:center;justify-content:center;border-radius:.75rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-danger:disabled{cursor:not-allowed;opacity:.5}.btn-danger:hover{background:#f43f5e2e}.pill-tab{border:1px solid var(--pill-border);background:var(--pill-bg);color:var(--pill-text);border-radius:.75rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.pill-tab:hover{background:#94a3b81f}:root[data-theme=light] .pill-tab-active{color:#1d4ed8;background-color:#dbeafeeb}.pill-tab-active{border-color:#60a5fa4d;background-color:#3b82f626;--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1));--tw-shadow: inset 0 1px 0 rgba(255,255,255,.06);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.status-badge{border:1px solid var(--status-border);background:var(--status-bg);color:var(--status-text);display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500}.theme-toggle{border:1px solid var(--secondary-border);background:var(--secondary-bg);color:var(--secondary-text);box-shadow:0 12px 32px -20px #0f172a73;display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;padding:.5rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.theme-toggle-floating{position:fixed;top:1rem;right:1rem;z-index:60}.theme-toggle:hover{background:#94a3b824}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.bottom-3{bottom:.75rem}.bottom-\[-10rem\]{bottom:-10rem}.bottom-\[-8rem\]{bottom:-8rem}.left-3{left:.75rem}.left-\[-6rem\]{left:-6rem}.left-\[-8rem\]{left:-8rem}.left-\[10\%\]{left:10%}.right-2{right:.5rem}.right-3{right:.75rem}.right-\[-4rem\]{right:-4rem}.right-\[-5rem\]{right:-5rem}.right-\[8\%\]{right:8%}.top-0{top:0}.top-2{top:.5rem}.top-\[-6rem\]{top:-6rem}.top-\[-8rem\]{top:-8rem}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-64{height:16rem}.h-72{height:18rem}.h-80{height:20rem}.h-\[calc\(100vh-200px\)\]{height:calc(100vh - 200px)}.max-h-\[80vh\]{max-height:80vh}.min-h-\[420px\]{min-height:420px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-72{width:18rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[72px\]{min-width:72px}.min-w-\[84px\]{min-width:84px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-6xl{max-width:72rem}.max-w-\[1500px\]{max-width:1500px}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-amber-400\/20{border-color:#fbbf2433}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/30{border-color:#f59e0b4d}.border-blue-400\/20{border-color:#60a5fa33}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-500\/20{border-color:#3b82f633}.border-blue-500\/30{border-color:#3b82f64d}.border-current{border-color:currentColor}.border-cyan-500{--tw-border-opacity: 1;border-color:rgb(6 182 212 / var(--tw-border-opacity, 1))}.border-cyan-500\/30{border-color:#06b6d44d}.border-emerald-400\/20{border-color:#34d39933}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-gray-800\/50{border-color:#1f293780}.border-green-500\/20{border-color:#22c55e33}.border-green-500\/30{border-color:#22c55e4d}.border-red-400\/20{border-color:#f8717133}.border-red-500\/20{border-color:#ef444433}.border-rose-500{--tw-border-opacity: 1;border-color:rgb(244 63 94 / var(--tw-border-opacity, 1))}.border-rose-500\/30{border-color:#f43f5e4d}.border-sky-500{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.border-violet-500{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-white\/10{border-color:#ffffff1a}.border-yellow-500\/20{border-color:#eab30833}.border-t-transparent{border-top-color:transparent}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-amber-600\/10{background-color:#d977061a}.bg-amber-700{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.bg-black\/60{background-color:#0009}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/15{background-color:#3b82f626}.bg-blue-500\/20{background-color:#3b82f633}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-600\/10{background-color:#2563eb1a}.bg-blue-700{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.bg-cyan-300{--tw-bg-opacity: 1;background-color:rgb(103 232 249 / var(--tw-bg-opacity, 1))}.bg-cyan-400{--tw-bg-opacity: 1;background-color:rgb(34 211 238 / var(--tw-bg-opacity, 1))}.bg-cyan-500\/10{background-color:#06b6d41a}.bg-cyan-500\/15{background-color:#06b6d426}.bg-cyan-600{--tw-bg-opacity: 1;background-color:rgb(8 145 178 / var(--tw-bg-opacity, 1))}.bg-cyan-600\/10{background-color:#0891b21a}.bg-cyan-700{--tw-bg-opacity: 1;background-color:rgb(14 116 144 / var(--tw-bg-opacity, 1))}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-emerald-700{--tw-bg-opacity: 1;background-color:rgb(4 120 87 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-500\/10{background-color:#6b72801a}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-800\/30{background-color:#1f29374d}.bg-gray-800\/60{background-color:#1f293799}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-600\/20{background-color:#16a34a33}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-rose-600{--tw-bg-opacity: 1;background-color:rgb(225 29 72 / var(--tw-bg-opacity, 1))}.bg-rose-600\/10{background-color:#e11d481a}.bg-rose-700\/80{background-color:#be123ccc}.bg-sky-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-950\/25{background-color:#02061740}.bg-slate-950\/65{background-color:#020617a6}.bg-slate-950\/80{background-color:#020617cc}.bg-violet-600{--tw-bg-opacity: 1;background-color:rgb(124 58 237 / var(--tw-bg-opacity, 1))}.bg-white\/5{background-color:#ffffff0d}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/10{background-color:#eab3081a}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-blue-300{--tw-gradient-from: #93c5fd var(--tw-gradient-from-position);--tw-gradient-to: rgb(147 197 253 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-500\/30{--tw-gradient-from: rgb(59 130 246 / .3) var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-cyan-300{--tw-gradient-to: rgb(103 232 249 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #67e8f9 var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-cyan-500\/20{--tw-gradient-to: rgb(6 182 212 / .2) var(--tw-gradient-to-position)}.to-sky-400{--tw-gradient-to: #38bdf8 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-1\.5{padding:.375rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-20{padding-bottom:5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-8{line-height:2rem}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-400\/60{color:#fbbf2499}.text-amber-400\/90{color:#fbbf24e6}.text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-cyan-300{--tw-text-opacity: 1;color:rgb(103 232 249 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-200{--tw-text-opacity: 1;color:rgb(167 243 208 / var(--tw-text-opacity, 1))}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.shadow-\[0_0_14px_rgba\(103\,232\,249\,0\.9\)\]{--tw-shadow: 0 0 14px rgba(103,232,249,.9);--tw-shadow-colored: 0 0 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_14px_rgba\(34\,211\,238\,0\.9\)\]{--tw-shadow: 0 0 14px rgba(34,211,238,.9);--tw-shadow-colored: 0 0 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_14px_rgba\(52\,211\,153\,0\.85\)\]{--tw-shadow: 0 0 14px rgba(52,211,153,.85);--tw-shadow-colored: 0 0 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_16px_rgba\(34\,211\,238\,0\.9\)\]{--tw-shadow: 0 0 16px rgba(34,211,238,.9);--tw-shadow-colored: 0 0 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_20px_40px_-20px_rgba\(15\,23\,42\,0\.9\)\]{--tw-shadow: 0 20px 40px -20px rgba(15,23,42,.9);--tw-shadow-colored: 0 20px 40px -20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.05\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.05);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.08\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.08);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-white\/10{--tw-shadow-color: rgb(255 255 255 / .1);--tw-shadow: var(--tw-shadow-colored)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-blue-400\/20{--tw-ring-color: rgb(96 165 250 / .2)}.blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-2xl{--tw-backdrop-blur: blur(40px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{--page-bg: radial-gradient(circle at top left, rgba(59, 130, 246, .22), transparent 28%), radial-gradient(circle at top right, rgba(14, 165, 233, .18), transparent 24%), radial-gradient(circle at bottom center, rgba(168, 85, 247, .14), transparent 26%), linear-gradient(180deg, #020617 0%, #0b1120 48%, #020617 100%);--page-text: #e5eefb;--grid-color: rgba(148, 163, 184, .08);--selection-bg: rgba(59, 130, 246, .28);--selection-text: #f8fafc;--scroll-track: rgba(15, 23, 42, .45);--scroll-thumb: rgba(71, 85, 105, .8);--scroll-thumb-hover: rgba(100, 116, 139, .95);--card-border: rgba(255, 255, 255, .1);--card-bg: rgba(2, 6, 23, .65);--card-soft-bg: rgba(2, 6, 23, .45);--card-shadow: 0 20px 60px -30px rgba(59, 130, 246, .38);--text-strong: #ffffff;--text-muted: #94a3b8;--field-bg: rgba(15, 23, 42, .8);--field-border: rgba(255, 255, 255, .1);--field-text: #ffffff;--field-placeholder: #64748b;--secondary-bg: rgba(255, 255, 255, .05);--secondary-text: #e2e8f0;--secondary-border: rgba(255, 255, 255, .1);--danger-bg: rgba(244, 63, 94, .1);--danger-text: #fecdd3;--danger-border: rgba(244, 63, 94, .2);--pill-bg: rgba(255, 255, 255, .05);--pill-text: #cbd5e1;--pill-border: rgba(255, 255, 255, .1);--status-bg: rgba(255, 255, 255, .05);--status-text: #cbd5e1;--status-border: rgba(255, 255, 255, .1)}:root[data-theme=light]{--page-bg: radial-gradient(circle at top left, rgba(59, 130, 246, .16), transparent 26%), radial-gradient(circle at top right, rgba(14, 165, 233, .14), transparent 22%), radial-gradient(circle at bottom center, rgba(168, 85, 247, .1), transparent 24%), linear-gradient(180deg, #f8fbff 0%, #eef4ff 48%, #f8fafc 100%);--page-text: #0f172a;--grid-color: rgba(148, 163, 184, .16);--selection-bg: rgba(59, 130, 246, .18);--selection-text: #0f172a;--scroll-track: rgba(226, 232, 240, .9);--scroll-thumb: rgba(148, 163, 184, .9);--scroll-thumb-hover: rgba(100, 116, 139, .95);--card-border: rgba(148, 163, 184, .2);--card-bg: rgba(255, 255, 255, .82);--card-soft-bg: rgba(255, 255, 255, .7);--card-shadow: 0 24px 48px -32px rgba(15, 23, 42, .22);--text-strong: #0f172a;--text-muted: #64748b;--field-bg: rgba(248, 250, 252, .98);--field-border: rgba(148, 163, 184, .25);--field-text: #0f172a;--field-placeholder: #94a3b8;--secondary-bg: rgba(255, 255, 255, .72);--secondary-text: #1e293b;--secondary-border: rgba(148, 163, 184, .22);--danger-bg: rgba(254, 226, 226, .9);--danger-text: #b91c1c;--danger-border: rgba(248, 113, 113, .25);--pill-bg: rgba(255, 255, 255, .78);--pill-text: #334155;--pill-border: rgba(148, 163, 184, .22);--status-bg: rgba(255, 255, 255, .78);--status-text: #334155;--status-border: rgba(148, 163, 184, .2)}html,body,#app{min-height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;background:var(--page-bg);color:var(--page-text);transition:background-color .25s ease,color .25s ease,background-image .25s ease}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;opacity:.28;background-image:linear-gradient(var(--grid-color) 1px,transparent 1px),linear-gradient(90deg,var(--grid-color) 1px,transparent 1px);background-size:28px 28px;-webkit-mask-image:radial-gradient(circle at center,black 34%,transparent 88%);mask-image:radial-gradient(circle at center,black 34%,transparent 88%)}*::-moz-selection{background:var(--selection-bg);color:var(--selection-text)}*::selection{background:var(--selection-bg);color:var(--selection-text)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:var(--scroll-track)}::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:999px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:var(--scroll-thumb-hover);background-clip:padding-box}:root[data-theme=light] .hover\:text-white:hover{color:#0f172a!important}:root[data-theme=light] .hover\:bg-gray-800\/30:hover{background-color:#ffffffc7!important}:root[data-theme=light] .hover\:bg-white\/5:hover{background-color:#ffffffc7!important}:root[data-theme=light] .hover\:bg-amber-600\/20:hover{background-color:#fef3c7f0!important}:root[data-theme=light] .group:hover .group-hover\:text-slate-400{color:#475569!important}.hover\:bg-amber-600:hover{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-600\/20:hover{background-color:#d9770633}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-600\/20:hover{background-color:#2563eb33}.hover\:bg-cyan-600:hover{--tw-bg-opacity: 1;background-color:rgb(8 145 178 / var(--tw-bg-opacity, 1))}.hover\:bg-cyan-600\/20:hover{background-color:#0891b233}.hover\:bg-emerald-600:hover{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800\/30:hover{background-color:#1f29374d}.hover\:bg-gray-900\/50:hover{background-color:#11182780}.hover\:bg-rose-600\/20:hover{background-color:#e11d4833}.hover\:bg-rose-700:hover{--tw-bg-opacity: 1;background-color:rgb(190 18 60 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:border-cyan-500:focus{--tw-border-opacity: 1;border-color:rgb(6 182 212 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\:bg-gray-700:disabled{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:bg-gray-700:hover:disabled{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:border-white\/20{border-color:#fff3}.group:hover .group-hover\:bg-slate-500{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:bg-white\/10{background-color:#ffffff1a}.group:hover .group-hover\:text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}@media(min-width:640px){.sm\:inline{display:inline}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:p-8{padding:2rem}}@media(min-width:768px){.md\:col-span-2{grid-column:span 2 / span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-\[600px\]{height:600px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:p-4{padding:1rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:pb-8{padding-bottom:2rem}}@media(min-width:1024px){.lg\:block{display:block}.lg\:grid-cols-\[1\.05fr_0\.95fr\]{grid-template-columns:1.05fr .95fr}.lg\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}}@media(min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}} +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root[data-theme=light] .text-white{color:#0f172a!important}:root[data-theme=light] .text-slate-400,:root[data-theme=light] .text-gray-400{color:#475569!important}:root[data-theme=light] .text-slate-300,:root[data-theme=light] .text-slate-200,:root[data-theme=light] .text-gray-300,:root[data-theme=light] .text-gray-200{color:#334155!important}:root[data-theme=light] .text-slate-500,:root[data-theme=light] .text-gray-500,:root[data-theme=light] .text-gray-600{color:#64748b!important}:root[data-theme=light] .text-blue-200,:root[data-theme=light] .text-blue-300,:root[data-theme=light] .text-blue-400{color:#1d4ed8!important}:root[data-theme=light] .text-cyan-300,:root[data-theme=light] .text-cyan-400{color:#0f766e!important}:root[data-theme=light] .text-emerald-200,:root[data-theme=light] .text-emerald-300,:root[data-theme=light] .text-green-400{color:#047857!important}:root[data-theme=light] .text-amber-200,:root[data-theme=light] .text-amber-300,:root[data-theme=light] .text-amber-400,:root[data-theme=light] .text-yellow-300,:root[data-theme=light] .text-yellow-400{color:#b45309!important}:root[data-theme=light] .text-red-300,:root[data-theme=light] .text-red-400,:root[data-theme=light] .text-rose-400{color:#b91c1c!important}:root[data-theme=light] .text-purple-400{color:#7c3aed!important}:root[data-theme=light] .bg-gray-950,:root[data-theme=light] .bg-gray-900,:root[data-theme=light] .bg-gray-800,:root[data-theme=light] .bg-gray-800\/60,:root[data-theme=light] .bg-gray-800\/30,:root[data-theme=light] .bg-slate-950\/80,:root[data-theme=light] .bg-slate-950\/65,:root[data-theme=light] .bg-slate-950\/45,:root[data-theme=light] .bg-slate-950\/25,:root[data-theme=light] .bg-white\/5,:root[data-theme=light] .bg-black\/60{background-color:#ffffffc7!important}:root[data-theme=light] .border-white\/10,:root[data-theme=light] .border-gray-800,:root[data-theme=light] .border-gray-800\/50,:root[data-theme=light] .border-gray-700{border-color:#94a3b838!important}:root[data-theme=light] .bg-blue-500\/10,:root[data-theme=light] .bg-blue-500\/15{background-color:#dbeafeeb!important}:root[data-theme=light] .bg-cyan-600\/10,:root[data-theme=light] .bg-cyan-700,:root[data-theme=light] .bg-cyan-500\/15{background-color:#cffafeeb!important}:root[data-theme=light] .bg-emerald-500\/10,:root[data-theme=light] .bg-emerald-700{background-color:#d1fae5eb!important}:root[data-theme=light] .bg-amber-500\/10,:root[data-theme=light] .bg-amber-600\/20,:root[data-theme=light] .bg-amber-700{background-color:#fef3c7f0!important}:root[data-theme=light] .bg-red-500\/10,:root[data-theme=light] .bg-rose-500\/10,:root[data-theme=light] .bg-rose-700\/80{background-color:#fee2e2f0!important}:root[data-theme=light] .border-blue-400\/20,:root[data-theme=light] .border-blue-500\/20,:root[data-theme=light] .border-blue-500\/30{border-color:#60a5fa4d!important}:root[data-theme=light] .border-amber-400\/20,:root[data-theme=light] .border-amber-500\/20,:root[data-theme=light] .border-amber-500\/30,:root[data-theme=light] .border-yellow-500\/20{border-color:#f59e0b4d!important}:root[data-theme=light] .border-emerald-400\/20,:root[data-theme=light] .border-green-500\/20,:root[data-theme=light] .border-green-500\/30{border-color:#10b98147!important}:root[data-theme=light] .border-red-500\/20,:root[data-theme=light] .border-rose-500\/20,:root[data-theme=light] .border-rose-500\/30{border-color:#f871714d!important}:root[data-theme=light] .hover\:text-white:hover,:root[data-theme=light] .group:hover .group-hover\:text-white{color:#0f172a!important}:root[data-theme=light] .group:hover .group-hover\:bg-white\/10{background-color:#f1f5f9f5!important}:root[data-theme=light] .group:hover .group-hover\:border-white\/20{border-color:#94a3b852!important}:root[data-theme=light] .bg-slate-950\/80,:root[data-theme=light] .bg-slate-950\/65{-webkit-backdrop-filter:blur(22px);backdrop-filter:blur(22px)}:root[data-theme=light] .from-blue-300{--tw-gradient-from: #2563eb var(--tw-gradient-from-position) !important;--tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position) !important;--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to) !important}:root[data-theme=light] .via-cyan-300{--tw-gradient-stops: var(--tw-gradient-from), #0891b2 var(--tw-gradient-via-position), var(--tw-gradient-to) !important}:root[data-theme=light] .to-sky-400{--tw-gradient-to: #0284c7 var(--tw-gradient-to-position) !important}.glass-card{border:1px solid var(--card-border);background:var(--card-bg);box-shadow:var(--card-shadow);border-radius:1rem;--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.glass-card-soft{border:1px solid var(--card-border);background:var(--card-soft-bg);border-radius:1rem;--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.section-heading{color:var(--text-strong);font-size:1.25rem;line-height:1.75rem;font-weight:600;letter-spacing:-.025em}.section-subtitle{color:var(--text-muted);margin-top:.25rem;font-size:.875rem;line-height:1.5rem}.input-dark{border:1px solid var(--field-border);background:var(--field-bg);color:var(--field-text);width:100%;border-radius:.75rem;padding:.625rem .75rem;font-size:.875rem;line-height:1.25rem}.input-dark:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(59 130 246 / .2)}.input-dark::-moz-placeholder{color:var(--field-placeholder)}.input-dark::placeholder{color:var(--field-placeholder)}.input-dark:focus{border-color:#60a5fa73}.textarea-dark{border:1px solid var(--field-border);background:var(--field-bg);color:var(--field-text);width:100%;border-radius:1rem;padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem}.textarea-dark:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(59 130 246 / .2)}.textarea-dark::-moz-placeholder{color:var(--field-placeholder)}.textarea-dark::placeholder{color:var(--field-placeholder)}.textarea-dark:focus{border-color:#60a5fa73}:root[data-theme=light] .btn-primary{color:#0f172a}.btn-primary{display:inline-flex;align-items:center;justify-content:center;border-radius:.75rem;background-image:linear-gradient(to right,var(--tw-gradient-stops));--tw-gradient-from: #2563eb var(--tw-gradient-from-position);--tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: #06b6d4 var(--tw-gradient-to-position);padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 12px 32px -12px rgba(59,130,246,.8);--tw-shadow-colored: 0 12px 32px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: #22d3ee var(--tw-gradient-to-position)}.btn-primary:disabled{cursor:not-allowed;opacity:.5;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-secondary{border:1px solid var(--secondary-border);background:var(--secondary-bg);color:var(--secondary-text);display:inline-flex;align-items:center;justify-content:center;border-radius:.75rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary:hover{background:#94a3b81f}.btn-danger{border:1px solid var(--danger-border);background:var(--danger-bg);color:var(--danger-text);display:inline-flex;align-items:center;justify-content:center;border-radius:.75rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-danger:disabled{cursor:not-allowed;opacity:.5}.btn-danger:hover{background:#f43f5e2e}.pill-tab{border:1px solid var(--pill-border);background:var(--pill-bg);color:var(--pill-text);border-radius:.75rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.pill-tab:hover{background:#94a3b81f}:root[data-theme=light] .pill-tab-active{color:#1d4ed8;background-color:#dbeafeeb}.pill-tab-active{border-color:#60a5fa4d;background-color:#3b82f626;--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1));--tw-shadow: inset 0 1px 0 rgba(255,255,255,.06);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.status-badge{border:1px solid var(--status-border);background:var(--status-bg);color:var(--status-text);display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500}.theme-toggle{border:1px solid var(--secondary-border);background:var(--secondary-bg);color:var(--secondary-text);box-shadow:0 12px 32px -20px #0f172a73;display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;padding:.5rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.theme-toggle-floating{position:fixed;top:1rem;right:1rem;z-index:60}.theme-toggle:hover{background:#94a3b824}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.bottom-3{bottom:.75rem}.bottom-\[-10rem\]{bottom:-10rem}.bottom-\[-8rem\]{bottom:-8rem}.left-3{left:.75rem}.left-\[-6rem\]{left:-6rem}.left-\[-8rem\]{left:-8rem}.left-\[10\%\]{left:10%}.right-2{right:.5rem}.right-3{right:.75rem}.right-\[-4rem\]{right:-4rem}.right-\[-5rem\]{right:-5rem}.right-\[8\%\]{right:8%}.top-0{top:0}.top-2{top:.5rem}.top-\[-6rem\]{top:-6rem}.top-\[-8rem\]{top:-8rem}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-64{height:16rem}.h-72{height:18rem}.h-80{height:20rem}.h-\[calc\(100vh-200px\)\]{height:calc(100vh - 200px)}.max-h-\[80vh\]{max-height:80vh}.min-h-\[420px\]{min-height:420px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-72{width:18rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[72px\]{min-width:72px}.min-w-\[84px\]{min-width:84px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-6xl{max-width:72rem}.max-w-\[1500px\]{max-width:1500px}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-amber-400\/20{border-color:#fbbf2433}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/30{border-color:#f59e0b4d}.border-blue-400\/20{border-color:#60a5fa33}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-500\/20{border-color:#3b82f633}.border-blue-500\/30{border-color:#3b82f64d}.border-current{border-color:currentColor}.border-cyan-500{--tw-border-opacity: 1;border-color:rgb(6 182 212 / var(--tw-border-opacity, 1))}.border-cyan-500\/30{border-color:#06b6d44d}.border-emerald-400\/20{border-color:#34d39933}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-gray-800\/50{border-color:#1f293780}.border-green-500\/20{border-color:#22c55e33}.border-green-500\/30{border-color:#22c55e4d}.border-red-400\/20{border-color:#f8717133}.border-red-500\/20{border-color:#ef444433}.border-rose-500{--tw-border-opacity: 1;border-color:rgb(244 63 94 / var(--tw-border-opacity, 1))}.border-rose-500\/30{border-color:#f43f5e4d}.border-sky-500{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.border-violet-500{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-white\/10{border-color:#ffffff1a}.border-yellow-500\/20{border-color:#eab30833}.border-t-transparent{border-top-color:transparent}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-amber-600\/10{background-color:#d977061a}.bg-amber-700{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.bg-black\/60{background-color:#0009}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/15{background-color:#3b82f626}.bg-blue-500\/20{background-color:#3b82f633}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-600\/10{background-color:#2563eb1a}.bg-blue-700{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.bg-cyan-300{--tw-bg-opacity: 1;background-color:rgb(103 232 249 / var(--tw-bg-opacity, 1))}.bg-cyan-400{--tw-bg-opacity: 1;background-color:rgb(34 211 238 / var(--tw-bg-opacity, 1))}.bg-cyan-500\/10{background-color:#06b6d41a}.bg-cyan-500\/15{background-color:#06b6d426}.bg-cyan-600{--tw-bg-opacity: 1;background-color:rgb(8 145 178 / var(--tw-bg-opacity, 1))}.bg-cyan-600\/10{background-color:#0891b21a}.bg-cyan-700{--tw-bg-opacity: 1;background-color:rgb(14 116 144 / var(--tw-bg-opacity, 1))}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-emerald-700{--tw-bg-opacity: 1;background-color:rgb(4 120 87 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-500\/10{background-color:#6b72801a}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-800\/30{background-color:#1f29374d}.bg-gray-800\/60{background-color:#1f293799}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-600\/20{background-color:#16a34a33}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-rose-600{--tw-bg-opacity: 1;background-color:rgb(225 29 72 / var(--tw-bg-opacity, 1))}.bg-rose-600\/10{background-color:#e11d481a}.bg-rose-700\/80{background-color:#be123ccc}.bg-sky-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-950\/25{background-color:#02061740}.bg-slate-950\/65{background-color:#020617a6}.bg-slate-950\/80{background-color:#020617cc}.bg-violet-600{--tw-bg-opacity: 1;background-color:rgb(124 58 237 / var(--tw-bg-opacity, 1))}.bg-white\/5{background-color:#ffffff0d}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/10{background-color:#eab3081a}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-blue-300{--tw-gradient-from: #93c5fd var(--tw-gradient-from-position);--tw-gradient-to: rgb(147 197 253 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-500\/30{--tw-gradient-from: rgb(59 130 246 / .3) var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-cyan-300{--tw-gradient-to: rgb(103 232 249 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #67e8f9 var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-cyan-500\/20{--tw-gradient-to: rgb(6 182 212 / .2) var(--tw-gradient-to-position)}.to-sky-400{--tw-gradient-to: #38bdf8 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-1\.5{padding:.375rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-20{padding-bottom:5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-8{line-height:2rem}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-400\/60{color:#fbbf2499}.text-amber-400\/90{color:#fbbf24e6}.text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-cyan-300{--tw-text-opacity: 1;color:rgb(103 232 249 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-200{--tw-text-opacity: 1;color:rgb(167 243 208 / var(--tw-text-opacity, 1))}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.shadow-\[0_0_14px_rgba\(103\,232\,249\,0\.9\)\]{--tw-shadow: 0 0 14px rgba(103,232,249,.9);--tw-shadow-colored: 0 0 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_14px_rgba\(34\,211\,238\,0\.9\)\]{--tw-shadow: 0 0 14px rgba(34,211,238,.9);--tw-shadow-colored: 0 0 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_14px_rgba\(52\,211\,153\,0\.85\)\]{--tw-shadow: 0 0 14px rgba(52,211,153,.85);--tw-shadow-colored: 0 0 14px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_16px_rgba\(34\,211\,238\,0\.9\)\]{--tw-shadow: 0 0 16px rgba(34,211,238,.9);--tw-shadow-colored: 0 0 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_20px_40px_-20px_rgba\(15\,23\,42\,0\.9\)\]{--tw-shadow: 0 20px 40px -20px rgba(15,23,42,.9);--tw-shadow-colored: 0 20px 40px -20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.05\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.05);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.08\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.08);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-white\/10{--tw-shadow-color: rgb(255 255 255 / .1);--tw-shadow: var(--tw-shadow-colored)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-blue-400\/20{--tw-ring-color: rgb(96 165 250 / .2)}.blur-3xl{--tw-blur: blur(64px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-2xl{--tw-backdrop-blur: blur(40px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{--page-bg: radial-gradient(circle at top left, rgba(59, 130, 246, .22), transparent 28%), radial-gradient(circle at top right, rgba(14, 165, 233, .18), transparent 24%), radial-gradient(circle at bottom center, rgba(168, 85, 247, .14), transparent 26%), linear-gradient(180deg, #020617 0%, #0b1120 48%, #020617 100%);--page-text: #e5eefb;--grid-color: rgba(148, 163, 184, .08);--selection-bg: rgba(59, 130, 246, .28);--selection-text: #f8fafc;--scroll-track: rgba(15, 23, 42, .45);--scroll-thumb: rgba(71, 85, 105, .8);--scroll-thumb-hover: rgba(100, 116, 139, .95);--card-border: rgba(255, 255, 255, .1);--card-bg: rgba(2, 6, 23, .65);--card-soft-bg: rgba(2, 6, 23, .45);--card-shadow: 0 20px 60px -30px rgba(59, 130, 246, .38);--text-strong: #ffffff;--text-muted: #94a3b8;--field-bg: rgba(15, 23, 42, .8);--field-border: rgba(255, 255, 255, .1);--field-text: #ffffff;--field-placeholder: #64748b;--secondary-bg: rgba(255, 255, 255, .05);--secondary-text: #e2e8f0;--secondary-border: rgba(255, 255, 255, .1);--danger-bg: rgba(244, 63, 94, .1);--danger-text: #fecdd3;--danger-border: rgba(244, 63, 94, .2);--pill-bg: rgba(255, 255, 255, .05);--pill-text: #cbd5e1;--pill-border: rgba(255, 255, 255, .1);--status-bg: rgba(255, 255, 255, .05);--status-text: #cbd5e1;--status-border: rgba(255, 255, 255, .1)}:root[data-theme=light]{--page-bg: radial-gradient(circle at top left, rgba(59, 130, 246, .16), transparent 26%), radial-gradient(circle at top right, rgba(14, 165, 233, .14), transparent 22%), radial-gradient(circle at bottom center, rgba(168, 85, 247, .1), transparent 24%), linear-gradient(180deg, #f8fbff 0%, #eef4ff 48%, #f8fafc 100%);--page-text: #0f172a;--grid-color: rgba(148, 163, 184, .16);--selection-bg: rgba(59, 130, 246, .18);--selection-text: #0f172a;--scroll-track: rgba(226, 232, 240, .9);--scroll-thumb: rgba(148, 163, 184, .9);--scroll-thumb-hover: rgba(100, 116, 139, .95);--card-border: rgba(148, 163, 184, .2);--card-bg: rgba(255, 255, 255, .82);--card-soft-bg: rgba(255, 255, 255, .7);--card-shadow: 0 24px 48px -32px rgba(15, 23, 42, .22);--text-strong: #0f172a;--text-muted: #64748b;--field-bg: rgba(248, 250, 252, .98);--field-border: rgba(148, 163, 184, .25);--field-text: #0f172a;--field-placeholder: #94a3b8;--secondary-bg: rgba(255, 255, 255, .72);--secondary-text: #1e293b;--secondary-border: rgba(148, 163, 184, .22);--danger-bg: rgba(254, 226, 226, .9);--danger-text: #b91c1c;--danger-border: rgba(248, 113, 113, .25);--pill-bg: rgba(255, 255, 255, .78);--pill-text: #334155;--pill-border: rgba(148, 163, 184, .22);--status-bg: rgba(255, 255, 255, .78);--status-text: #334155;--status-border: rgba(148, 163, 184, .2)}html,body,#app{min-height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;background:var(--page-bg);color:var(--page-text);transition:background-color .25s ease,color .25s ease,background-image .25s ease}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;opacity:.28;background-image:linear-gradient(var(--grid-color) 1px,transparent 1px),linear-gradient(90deg,var(--grid-color) 1px,transparent 1px);background-size:28px 28px;-webkit-mask-image:radial-gradient(circle at center,black 34%,transparent 88%);mask-image:radial-gradient(circle at center,black 34%,transparent 88%)}*::-moz-selection{background:var(--selection-bg);color:var(--selection-text)}*::selection{background:var(--selection-bg);color:var(--selection-text)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:var(--scroll-track)}::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:999px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:var(--scroll-thumb-hover);background-clip:padding-box}:root[data-theme=light] .hover\:text-white:hover{color:#0f172a!important}:root[data-theme=light] .hover\:bg-gray-800\/30:hover{background-color:#ffffffc7!important}:root[data-theme=light] .hover\:bg-white\/5:hover{background-color:#ffffffc7!important}:root[data-theme=light] .hover\:bg-amber-600\/20:hover{background-color:#fef3c7f0!important}:root[data-theme=light] .group:hover .group-hover\:text-slate-400{color:#475569!important}.hover\:bg-amber-600:hover{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-600\/20:hover{background-color:#d9770633}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-600\/20:hover{background-color:#2563eb33}.hover\:bg-cyan-600:hover{--tw-bg-opacity: 1;background-color:rgb(8 145 178 / var(--tw-bg-opacity, 1))}.hover\:bg-cyan-600\/20:hover{background-color:#0891b233}.hover\:bg-emerald-600:hover{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800\/30:hover{background-color:#1f29374d}.hover\:bg-gray-900\/50:hover{background-color:#11182780}.hover\:bg-rose-600\/20:hover{background-color:#e11d4833}.hover\:bg-rose-700:hover{--tw-bg-opacity: 1;background-color:rgb(190 18 60 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:border-cyan-500:focus{--tw-border-opacity: 1;border-color:rgb(6 182 212 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\:bg-gray-700:disabled{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:bg-gray-700:hover:disabled{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:border-white\/20{border-color:#fff3}.group:hover .group-hover\:bg-slate-500{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:bg-white\/10{background-color:#ffffff1a}.group:hover .group-hover\:text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}@media(min-width:640px){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:p-8{padding:2rem}}@media(min-width:768px){.md\:col-span-2{grid-column:span 2 / span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-\[600px\]{height:600px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:p-4{padding:1rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:pb-8{padding-bottom:2rem}}@media(min-width:1024px){.lg\:block{display:block}.lg\:grid-cols-\[1\.05fr_0\.95fr\]{grid-template-columns:1.05fr .95fr}.lg\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}}@media(min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}} diff --git a/src/autoteam/web/dist/index.html b/src/autoteam/web/dist/index.html index afbeb5d1..4622fc28 100644 --- a/src/autoteam/web/dist/index.html +++ b/src/autoteam/web/dist/index.html @@ -5,8 +5,8 @@ AutoTeam - - + +
diff --git a/tests/unit/test_api_status.py b/tests/unit/test_api_status.py index ed619dc8..57ab2f3d 100644 --- a/tests/unit/test_api_status.py +++ b/tests/unit/test_api_status.py @@ -424,23 +424,45 @@ def test_set_auto_check_config_persists_values_to_env(monkeypatch): sync_calls = [] monkeypatch.setattr("autoteam.setup_wizard._write_env", lambda key, value: written.setdefault(key, value)) - monkeypatch.setattr(api, "_auto_check_config", {"interval": 300, "threshold": 10, "min_low": 2}) + monkeypatch.setattr( + api, + "_auto_check_config", + {"interval": 300, "threshold": 10, "min_low": 2, "retry_add_phone": True, "add_phone_max_retries": 3}, + ) monkeypatch.setattr(api, "_auto_check_restart", restart_event) monkeypatch.setattr(api, "_sync_runtime_env_reload_state", lambda: sync_calls.append("synced")) - result = api.set_auto_check_config(api.AutoCheckConfig(interval=420, threshold=15, min_low=3)) + result = api.set_auto_check_config( + api.AutoCheckConfig( + interval=420, + threshold=15, + min_low=3, + retry_add_phone=False, + add_phone_max_retries=5, + ) + ) - assert result == {"interval": 420, "threshold": 15, "min_low": 3} + assert result == { + "interval": 420, + "threshold": 15, + "min_low": 3, + "retry_add_phone": False, + "add_phone_max_retries": 5, + } assert written == { "AUTO_CHECK_INTERVAL": "420", "AUTO_CHECK_THRESHOLD": "15", "AUTO_CHECK_MIN_LOW": "3", + "AUTO_CHECK_RETRY_ADD_PHONE": "false", + "AUTO_CHECK_ADD_PHONE_MAX_RETRIES": "5", } assert restart_event.is_set() is True assert sync_calls == ["synced"] assert os.environ["AUTO_CHECK_INTERVAL"] == "420" assert os.environ["AUTO_CHECK_THRESHOLD"] == "15" assert os.environ["AUTO_CHECK_MIN_LOW"] == "3" + assert os.environ["AUTO_CHECK_RETRY_ADD_PHONE"] == "false" + assert os.environ["AUTO_CHECK_ADD_PHONE_MAX_RETRIES"] == "5" @pytest.mark.parametrize( diff --git a/tests/unit/test_manager_auth_repair.py b/tests/unit/test_manager_auth_repair.py index 06164cbf..92ff2b75 100644 --- a/tests/unit/test_manager_auth_repair.py +++ b/tests/unit/test_manager_auth_repair.py @@ -10,32 +10,53 @@ def login(self): return None -def test_record_auth_repair_failure_pauses_on_add_phone(monkeypatch): +def test_record_auth_repair_failure_schedules_add_phone_retry_when_enabled(monkeypatch): updates = [] monkeypatch.setattr( manager, "load_accounts", - lambda: [{"email": "user@example.com", "auth_retry_count": 1}], + lambda: [ + { + "email": "user@example.com", + "status": "auth_pending", + "auth_retry_count": 5, + "auth_last_error": "auth_code_missing", + } + ], ) monkeypatch.setattr(manager, "update_account", lambda email, **kwargs: updates.append((email, kwargs))) monkeypatch.setattr(manager.time, "time", lambda: 1_700_000_000) + monkeypatch.setattr(manager, "_auth_repair_retry_add_phone_enabled", lambda: True) + monkeypatch.setattr(manager, "_auth_repair_add_phone_max_retries", lambda: 3) + monkeypatch.setattr(manager, "_auth_repair_add_phone_retry_delays", lambda max_retries=None: (300, 600, 1_200)) + monkeypatch.setattr(manager, "_is_email_in_team", lambda _email: True) + monkeypatch.setattr( + manager, + "_release_auth_repair_team_seat", + lambda *_args, **_kwargs: (_ for _ in ()).throw( + AssertionError("should not release team seat before retries exhaust") + ), + ) state = manager._record_auth_repair_failure("user@example.com", "add_phone", "需要手机号验证") - assert state["auth_retry_paused"] is True - assert state["auth_retry_after"] is None + assert state["auth_retry_count"] == 1 + assert state["auth_retry_paused"] is False + assert state["auth_retry_after"] == 1_700_000_300 + assert state["status"] == "auth_pending" assert updates == [ ( "user@example.com", { - "auth_retry_count": 3, + "auth_retry_count": 1, "auth_last_error": "add_phone", "auth_last_error_detail": "需要手机号验证", "auth_last_failed_at": 1_700_000_000, - "auth_retry_after": None, - "auth_retry_paused": True, + "auth_retry_after": 1_700_000_300, + "auth_retry_paused": False, }, - ) + ), + ("user@example.com", {"status": "auth_pending"}), ] @@ -44,11 +65,12 @@ def test_record_auth_repair_failure_uses_auto_check_interval_backoff(monkeypatch monkeypatch.setattr( manager, "load_accounts", - lambda: [{"email": "user@example.com", "auth_retry_count": 0}], + lambda: [{"email": "user@example.com", "status": "auth_pending", "auth_retry_count": 0}], ) monkeypatch.setattr(manager, "update_account", lambda email, **kwargs: updates.append((email, kwargs))) monkeypatch.setattr(manager.time, "time", lambda: 1_700_000_000) monkeypatch.setattr(manager, "_auth_repair_retry_delays", lambda: (600, 1200, 1800)) + monkeypatch.setattr(manager, "_is_email_in_team", lambda _email: True) state = manager._record_auth_repair_failure("user@example.com", "auth_code_missing", "未获取到 auth code") @@ -65,7 +87,79 @@ def test_record_auth_repair_failure_uses_auto_check_interval_backoff(monkeypatch "auth_retry_after": 1_700_000_600, "auth_retry_paused": False, }, - ) + ), + ("user@example.com", {"status": "auth_pending"}), + ] + + +def test_record_auth_repair_failure_pauses_on_add_phone_when_retry_disabled(monkeypatch): + updates = [] + monkeypatch.setattr( + manager, + "load_accounts", + lambda: [{"email": "user@example.com", "status": "auth_pending", "auth_retry_count": 1}], + ) + monkeypatch.setattr(manager, "update_account", lambda email, **kwargs: updates.append((email, kwargs))) + monkeypatch.setattr(manager.time, "time", lambda: 1_700_000_000) + monkeypatch.setattr(manager, "_auth_repair_retry_add_phone_enabled", lambda: False) + monkeypatch.setattr(manager, "_is_email_in_team", lambda _email: True) + monkeypatch.setattr( + manager, + "_release_auth_repair_team_seat", + lambda *_args, **_kwargs: (_ for _ in ()).throw( + AssertionError("should not release team seat when retry is disabled") + ), + ) + + state = manager._record_auth_repair_failure("user@example.com", "add_phone", "需要手机号验证") + + assert state["auth_retry_paused"] is True + assert state["auth_retry_after"] is None + assert state["status"] == "auth_pending" + assert updates[-1] == ("user@example.com", {"status": "auth_pending"}) + + +def test_record_auth_repair_failure_releases_team_seat_after_add_phone_retries_exhausted(monkeypatch): + updates = [] + monkeypatch.setattr( + manager, + "load_accounts", + lambda: [ + { + "email": "user@example.com", + "status": "auth_pending", + "auth_retry_count": 3, + "auth_last_error": "add_phone", + } + ], + ) + monkeypatch.setattr(manager, "update_account", lambda email, **kwargs: updates.append((email, kwargs))) + monkeypatch.setattr(manager.time, "time", lambda: 1_700_000_000) + monkeypatch.setattr(manager, "_auth_repair_retry_add_phone_enabled", lambda: True) + monkeypatch.setattr(manager, "_auth_repair_add_phone_max_retries", lambda: 3) + monkeypatch.setattr(manager, "_is_email_in_team", lambda _email: True) + monkeypatch.setattr(manager, "_release_auth_repair_team_seat", lambda *_args, **_kwargs: "removed") + + state = manager._record_auth_repair_failure("user@example.com", "add_phone", "需要手机号验证") + + assert state["auth_retry_count"] == 4 + assert state["auth_retry_paused"] is True + assert state["auth_retry_after"] is None + assert state["status"] == "standby" + assert state["seat_released"] is True + assert updates == [ + ( + "user@example.com", + { + "auth_retry_count": 4, + "auth_last_error": "add_phone", + "auth_last_error_detail": "需要手机号验证", + "auth_last_failed_at": 1_700_000_000, + "auth_retry_after": None, + "auth_retry_paused": True, + }, + ), + ("user@example.com", {"status": "standby"}), ] diff --git a/tests/unit/test_manager_fill.py b/tests/unit/test_manager_fill.py index b0c06cb5..5295ceff 100644 --- a/tests/unit/test_manager_fill.py +++ b/tests/unit/test_manager_fill.py @@ -102,6 +102,51 @@ def fake_reinvite(_chatgpt, _mail, acc): assert chatgpt.stopped == 1 +def test_cmd_fill_skips_paused_auth_repair_accounts_during_auto_reuse(monkeypatch): + chatgpt = _FakeChatGPT() + count_values = iter([4, 5]) + events = [] + + monkeypatch.setattr(manager, "ChatGPTTeamAPI", lambda: chatgpt) + monkeypatch.setattr(manager, "CloudMailClient", lambda: _FakeMailClient()) + monkeypatch.setattr(manager, "get_team_member_count", lambda _chatgpt: next(count_values)) + monkeypatch.setattr( + manager, + "get_standby_accounts", + lambda: [ + { + "email": "blocked@example.com", + "_quota_recovered": True, + "auth_retry_paused": True, + "auth_last_error": "add_phone", + }, + {"email": "old-2@example.com", "_quota_recovered": True}, + ], + ) + + def fake_reinvite(_chatgpt, _mail, acc): + events.append(("reinvite", acc["email"])) + return True + + monkeypatch.setattr(manager, "reinvite_account", fake_reinvite) + monkeypatch.setattr( + manager, + "create_new_account", + lambda _chatgpt, _mail: events.append(("create", None)) or True, + ) + monkeypatch.setattr(manager, "sync_to_cpa", lambda: events.append(("sync", None))) + monkeypatch.setattr(manager, "cmd_status", lambda: events.append(("status", None))) + + manager.cmd_fill(target=5) + + assert events == [ + ("reinvite", "old-2@example.com"), + ("sync", None), + ("status", None), + ] + assert chatgpt.stopped == 1 + + def test_cmd_fill_stops_early_when_refreshed_team_count_hits_target(monkeypatch): chatgpt = _FakeChatGPT() count_values = iter([3, 5]) diff --git a/tests/unit/test_manager_reinvite.py b/tests/unit/test_manager_reinvite.py index b8756a5c..61862308 100644 --- a/tests/unit/test_manager_reinvite.py +++ b/tests/unit/test_manager_reinvite.py @@ -53,8 +53,6 @@ def test_reinvite_account_uses_unified_oauth_login_and_marks_active(monkeypatch) def test_reinvite_account_marks_standby_when_oauth_login_returns_non_team(monkeypatch): - updates = [] - monkeypatch.setattr( manager, "login_codex_via_browser", @@ -67,14 +65,8 @@ def test_reinvite_account_marks_standby_when_oauth_login_returns_non_team(monkey ) monkeypatch.setattr( manager, - "update_account", - lambda email, **kwargs: updates.append((email, kwargs)), - ) - monkeypatch.setattr(manager, "_record_auth_repair_failure", lambda *args, **kwargs: {}) - monkeypatch.setattr( - manager, - "_is_email_in_team", - lambda email: False, + "_record_auth_repair_failure", + lambda *args, **kwargs: {"status": accounts.STATUS_STANDBY}, ) result = manager.reinvite_account( @@ -84,33 +76,15 @@ def test_reinvite_account_marks_standby_when_oauth_login_returns_non_team(monkey ) assert result is False - assert updates == [ - ( - "tmp-user@example.com", - { - "status": accounts.STATUS_STANDBY, - "auth_retry_count": 0, - "auth_last_error": None, - "auth_last_error_detail": None, - "auth_last_failed_at": None, - "auth_retry_after": None, - "auth_retry_paused": False, - }, - ) - ] def test_reinvite_account_marks_auth_pending_when_oauth_login_fails_but_team_seat_is_still_occupied(monkeypatch): - updates = [] - monkeypatch.setattr(manager, "login_codex_via_browser", lambda *args, **kwargs: None) monkeypatch.setattr( manager, - "update_account", - lambda email, **kwargs: updates.append((email, kwargs)), + "_record_auth_repair_failure", + lambda *args, **kwargs: {"status": accounts.STATUS_AUTH_PENDING}, ) - monkeypatch.setattr(manager, "_record_auth_repair_failure", lambda *args, **kwargs: {}) - monkeypatch.setattr(manager, "_is_email_in_team", lambda email: True) result = manager.reinvite_account( types.SimpleNamespace(browser=False), @@ -119,4 +93,3 @@ def test_reinvite_account_marks_auth_pending_when_oauth_login_fails_but_team_sea ) assert result is False - assert updates == [("tmp-user@example.com", {"status": accounts.STATUS_AUTH_PENDING})] diff --git a/web/src/components/Settings.vue b/web/src/components/Settings.vue index 966fff12..15d45569 100644 --- a/web/src/components/Settings.vue +++ b/web/src/components/Settings.vue @@ -337,7 +337,7 @@ 已保存 -
+
@@ -362,11 +362,34 @@
+
+ + +
+
+ +
+ + +
+

- 每 {{ form.interval }} 分钟检查一次,{{ form.min_low }} 个以上账号剩余低于 {{ form.threshold }}% 时自动轮转 + 每 {{ form.interval }} 分钟检查一次,{{ form.min_low }} 个以上账号剩余低于 {{ form.threshold }}% 时自动轮转; + add_phone {{ form.retry_add_phone ? `开启自动重试(最多 ${form.add_phone_max_retries} 次)` : '保持人工处理' }}