Files
codex-app-server/cloud/skills/browser-automation/SKILL.md
T
host 6f39ab3945 feat: 浏览器二期后端:远控服务 + ref 快照 + server 代理
- playwright_remote.py(新):MCP 进程内 Unix socket HTTP 服务,
  监听 worktree/.browser-remote.sock;GET /state、GET /stream
  (SSE 画面流)、POST /input、POST /control(接管/交还)。
  线程契约(实测):Playwright 同步调用只能在创建页面的线程,
  所以 HTTP 线程只读属性/读最新帧/入队,MCP 主循环用
  select 轮询(50ms) draining 输入并 pump screencast 帧
  (无 ack 则 CDP 首帧后停流)。
- 画面流走 CDP screencast 帧(学 chrome-devtools-mcp),不用
  定时截图;ffmpeg 录像暂不做。
- snapshot_refs/click_ref(学 playwright-mcp 的 ref 机制)+
  mouse_move/key_press/type_text;agent 工具在 holder=user 时
  直接报错,等用户交还。
- server.py:/tasks/{id}/browser/{state,stream,input,control}
  代理到 worktree socket,复用任务鉴权与 worktree 解析;
  会话不存在时 503(轮次结束即消失是设计)。
- 播种器:MCP 脚本是系统文件,版本变化时刷新老租户旧脚本
  (script_refreshed 打日志),否则远控只对新项目生效;
  新增 playwright_remote.py 进播种清单。
- 队列遮蔽修复:cloud/queue.py 会遮蔽 stdlib queue,改用
  SimpleQueue(deque+锁),仓库模式与 flat-copy 两路都通。
- 测试:新 20 项(remote 服务、server 代理、ref/输入/
  screencast fake),全量 1354 项通过(skipped 4)。
2026-10-30 06:44:24 +08:00

3.1 KiB
Raw Blame History

name, description
name description
browser-automation Use when a task needs a real browser: pages that render with JavaScript, clicking through pagination or forms, filling and submitting input, or taking a screenshot of what a page actually looks like. For a plain static page or a quick fact, use web_fetch / web_search first; open the browser only when static fetch cannot see the content.

工具

browser_navigate(打开 URL,返回最终 URL 与标题)、 browser_snapshot(当前页标题、URL、正文,超 8000 字截断并标记)、 browser_click(按 CSS 选择器或 text=... 点击)、 browser_fill(按选择器填表)、 browser_evaluate(在页内跑 JS 表达式,返回字符串,限 4000 字)、 browser_screenshot(把当前页存成工作区内的 PNG,返回绝对路径与字节数)、 browser_click_at(按视口坐标点击,坐标系为 1280x800、原点左上角, 是 live 视图里用户点击的落点)、 browser_live_shot(把当前画面存成固定文件 browser-live.png, 附带 browser-live.json 状态:URL、标题、时间戳,供 watcher 轮询)、 browser_close(关闭浏览器,可重复调用)。

浏览器是单页的:一次 navigate,之后 snapshot / click / fill / screenshot 都针对同一页;要换页再 navigate。

live 视图(第一期)

有人在看浏览器时,每次 navigate / click / fill / click_at 之后 都要调一次 browser_live_shot,让 browser-live.png 保持最新; 不要只在最后截图一次。用户在 live 图上点的坐标会以 x/y 到达 browser_click_at,点完必须再 snapshot 一次确认变化,再调 browser_live_shot 刷新画面。

远控接管(第二期)

用户可以在控制台接管浏览器:接管期间(holder=user)你的 所有 browser_* 工具都会直接报错“user holds browser control”, 不要重试、不要 close 浏览器,停下来等用户交还;交还后 (holder 回到 agent)下一条继续消息会让你续跑,续跑前先 snapshot 一次看清用户改动到哪了。

新工具:browser_snapshot_refs(带 ref 的元素清单,点 browser_click_ref 比 CSS 选择器稳,页面重渲染后先重新 snapshot_refs 再点);browser_mouse_move / browser_key_press / browser_type_text(键盘与鼠标,远控输入与 agent 工具同源)。

规则

  1. 先 navigate,再 snapshot 看实际渲染结果;click / fill 后 必须再 snapshot 一次确认变化,不要凭猜测汇报。
  2. 截图产出后用 shell / PIL 重新打开验证(格式、尺寸、非 0 字节)再交给用户;失败时贴出工具报错,不要换一张别的图顶替。
  3. 网络走 egress 代理:不在 Tinyproxy 白名单里的域名会报 代理 403,这时如实说明,不要绕过白名单。
  4. file:// URL 可用于打开工作区内已写好的测试页(验证 JS 执行、表单行为),是比外网更可靠的自测手段。
  5. 不要用浏览器做静态抓取能做的事;不要用 evaluate 绕过 click / fill 的正常路径去改页面状态,除非 snapshot 已证明 正常路径走不通。