# vendored from jiangchang-platform-kit; do not edit here, edit the kit. """统一 persistent context 启动封装。""" from __future__ import annotations import os from typing import TYPE_CHECKING from ..runtime_env import find_chrome_executable from .stealth import ( STEALTH_INIT_SCRIPT, persistent_context_launch_parts, stealth_enabled, ) if TYPE_CHECKING: from playwright.async_api import BrowserContext async def launch_persistent_browser( playwright, *, profile_dir: str, channel: str = "chrome", executable_path: str | None = None, headless: bool | None = None, extra_args: list[str] | None = None, record_video_dir: str | None = None, ) -> "BrowserContext": """用 stealth 参数启动 persistent context + 注入 STEALTH_INIT_SCRIPT。 headless=None 时读 OPENCLAW_BROWSER_HEADLESS。 record_video_dir 非空则开录屏。 """ if headless is None: v = (os.environ.get("OPENCLAW_BROWSER_HEADLESS") or "0").strip().lower() headless = v in ("1", "true", "yes", "on") chrome = executable_path or find_chrome_executable() if not chrome: raise RuntimeError( "ERROR:MISSING_BROWSER 未检测到 Chrome 或 Edge 浏览器,请安装后重试。" ) args, ignore = persistent_context_launch_parts(extra_args=extra_args) launch_kwargs: dict = dict( user_data_dir=profile_dir, headless=headless, executable_path=chrome, locale="zh-CN", no_viewport=True, args=args, ) if ignore is not None: launch_kwargs["ignore_default_args"] = ignore if record_video_dir: launch_kwargs["record_video_dir"] = record_video_dir context = await playwright.chromium.launch_persistent_context(**launch_kwargs) if stealth_enabled(): await context.add_init_script(STEALTH_INIT_SCRIPT) return context