import fs from "node:fs"; import { DEFAULT_RPA_STORAGE_STATE_PATH } from "@/lib/rpa/env"; import { hasEffectiveMothershipLogin } from "@/lib/rpa/mothership-login-context"; export type PlaywrightStorageState = { cookies: Array<{ name: string; value: string; domain?: string; }>; }; export const DEFAULT_LOGGED_IN_STORAGE_STATE_PATH = ".rpa/mothership-logged-in-storage.json"; export function resolveStorageStatePath(): string { const loggedInPath = process.env.RPA_LOGGED_IN_STORAGE_STATE_PATH?.trim() || DEFAULT_LOGGED_IN_STORAGE_STATE_PATH; // 有 MotherShip 账密时优先登录态 cookie,价源对齐 dashboard if (hasEffectiveMothershipLogin() && fs.existsSync(loggedInPath)) { return loggedInPath; } return ( process.env.RPA_STORAGE_STATE_PATH?.trim() || DEFAULT_RPA_STORAGE_STATE_PATH ); } export function loadStorageState( path = resolveStorageStatePath(), ): PlaywrightStorageState { if (!fs.existsSync(path)) { throw new Error( `缺少 MotherShip 会话文件 ${path};系统将尝试自动获取,或运行 npm run record:mothership`, ); } return JSON.parse(fs.readFileSync(path, "utf8")) as PlaywrightStorageState; } /** 缺会话时自动 bootstrap,再读取 storageState */ export async function loadStorageStateAsync( path = resolveStorageStatePath(), ): Promise { const { ensureMothershipStorageState } = await import( "@/lib/rpa/ensure-storage-state" ); await ensureMothershipStorageState(); return loadStorageState(path); } export function buildCookieHeader(state: PlaywrightStorageState): string { return state.cookies.map((c) => `${c.name}=${c.value}`).join("; "); }