1. 总体架构:Client-Daemon 模式

agent-browser 采用经典的 Client-Daemon (客户端-守护进程) 架构。这种设计是为了结合 Rust CLI 的快速启动/响应能力与 Node.js/Playwright 强大的浏览器控制生态,同时实现浏览器实例的持久化,避免每次执行命令都重启浏览器的巨大开销。

graph TD
    User[用户/AI Agent] --> CLI[Rust CLI - Client]

    subgraph "IPC Communication"
        CLI -- JSON Command --> Socket[Unix Socket / TCP]
        Socket -- JSON Response --> CLI
    end

    subgraph "Daemon Process (Node.js)"
        Daemon[Daemon Server]
        BrowserMgr[Browser Manager]
        Playwright[Playwright Engine]
        StreamSvr[WebSocket Stream Server]

        Daemon --> BrowserMgr
        BrowserMgr --> Playwright
        Daemon --> StreamSvr
    end

    Playwright -- CDP/WebDriver --> Browser[Chromium/Firefox/WebKit]

2. 核心组件详解

2.1 Rust CLI (客户端)

2.2 Node.js Daemon (守护进程)

2.3 Protocol (通信协议)

2.4 Browser Manager (浏览器管理)


3. 核心特性实现原理

3.1 AI 友好的 "Refs" 系统

为了解决 AI Agent 难以准确定位 DOM 元素的问题,agent-browser 引入了一套 "Refs" (引用) 机制:

  1. 生成快照 (src/snapshot.ts): 遍历 DOM 生成 Accessibility Tree (可访问性树)。
  2. 分配 ID: 为关键元素(按钮、输入框等)分配简短唯一的 ID(如 @e1, @e2)。
  3. 缓存映射: 在 Daemon 内存中维护 RefMap ({ "@e1": "Playwright Locator" })。
  4. 交互: 当 AI 发出 click @e1 指令时,Daemon 直接查找内存映射,转换为 Playwright 的 Locator 执行操作。
    • 优势: 极大减少了 Token 消耗,且比 CSS 选择器更稳定。

3.2 实时流 (Streaming)

3.3 持久化与状态隔离

Daemon 将关键信息存储在系统临时目录 (os.tmpdir()):


4. 目录结构映射

路径 架构组件 说明
cli/ Client Rust 编写的命令行入口,负责启动和通信。
src/daemon.ts Daemon Node.js 服务器入口,处理 IPC 请求。
src/browser.ts Core 封装 Playwright,管理浏览器实例。
src/protocol.ts Protocol 定义所有命令的 JSON Schema (Zod)。
src/snapshot.ts Feature 生成带 Refs 的可访问性树。
src/actions.ts Logic 实现 click, fill, scroll 等具体动作。

5. 总结

架构设计亮点

agent-browser 的架构设计非常务实且高效:它利用 Rust 解决了 CLI 启动速度慢的问题,利用 Node.js/Playwright 解决了浏览器控制复杂性的问题,并通过 Daemon 机制实现了高性能的连续操作。

"Refs" 系统更是专门针对 LLM/Agent 场景的优化,体现了对 AI 交互模式的深刻理解。