前言¶
DSH 的 Agent 要读一个内部系统、填一张表单、确认一个下单动作,通常有两条路:要么给它一个干净的 Playwright 浏览器,但它没有你浏览器里的登录态,遇到验证码和二次确认就卡住;要么让它自己猜页面步骤,容易点错、读错。这个插件走第三条路:在你日常使用的 Chrome / Edge 里装一个扩展做桥,Agent 通过它在专用标签组里操作你真实、已登录的浏览器,第一次接触某个域名时先问你要权限。
下面介绍 yelinos 维护的 dsh-chrome-bridge。它思路对齐 OpenAI Codex 的 Chrome 扩展,定位是 DSH 的浏览器控制插件,MIT 许可,当前版本 0.1.1,目录页标注星标为 0。
整体思路¶
插件分两部分,通过本机 WebSocket 通信:
DSH Host 进程 你的 Chrome / Edge
chrome-bridge (service) DSH Chrome Bridge (MV3)
· WebSocket 服务器 · service worker
· 命令/超时/keepalive · chrome.tabs/tabGroups
· status() Remote 接口 ws://127.0.0.1:8765
chrome-bridge-tools DSH Web UI · chrome.debugger (CDP)
· chrome_* 工具 · popup:状态/端口/token
· 按域名授权 / 会话标签组 右侧栏「Chrome 桥接」面板
· 截图 → 附件管线
client.js
· 侧栏状态卡/安装引导
扩展侧是 Manifest V3,只用 chrome.* API,不打包第三方运行时,零依赖;Host 半身是普通 ESM,纯插件挂载,没有构建步骤。
三个设计约束值得注意:
- 扩展只主动连
ws://127.0.0.1,不监听端口,网页无法访问它。 - 服务默认只绑回环地址;同机任意进程仍可连该端口,介意者建议设
authToken。 chrome.debugger附加时浏览器会显示「正在调试此浏览器」提示条,这是读写页面所必需的。
核心能力¶
按 README 的功能表,能力分这么几组。
真实浏览器操作。打开 / 导航标签页、读页面文本、执行 JS、截图。鼠标键盘走 CDP Input 域,是真实输入而不是合成事件,选择器或坐标点击都支持,含双击和右键。
按域名授权。首次接触域名弹出「本次会话允许 / 始终允许 / 拒绝」;「始终允许」经 settings 服务写入 allowedDomains 并持久化。门禁在导航和页面交互(读 / 执行 / 点击 / 输入 / 截图)前都会执行,blockedDomains 永远拒绝。
会话级标签组。每个 Agent 会话独立一个 DSH · <会话标识> 标签组,多会话并行互不干扰;组名默认取首个页面标题,Agent 可用 chrome_group 改成简短目的名。标签页默认复用当前会话页,每会话最多保留 maxSessionTabs 个,超出按 LRU 自动关闭,空闲超时与会话结束时自动清理。
读页方式有两种。chrome_snapshot 返回带层级、可见状态和稳定 e1 引用的无障碍树,默认输出增量 diff;chrome_read_page / chrome_read_urls 直接读可见文本或 HTML。
此外还有虚拟光标(读页时显示,回合结束收起)、滚动、截图直回对话(PNG 经附件管线作为图像内容块给模型,无附件服务时落盘)、以及右侧栏的连接状态 / 安装引导 / 域名名单面板。
安装¶
先装 DSH 插件,再装浏览器扩展。
1. 安装 DSH 插件¶
在 DSH 会话里让 Agent 执行 plugin_manager 的 install_bundle,目标为本目录的绝对路径;或在终端:
dsh plugin --profile web add /absolute/path/to/dsh-chrome-bridge
这会挂载两个 Host 级行:chrome-bridge(桥接服务,WebSocket 服务器)和 chrome-bridge-tools(chrome_* 工具)。装好后要刷新一次 Web 页面,右侧栏「+」菜单里才会出现「Chrome 桥接」标签页。
2. 安装浏览器扩展¶
- 打开
chrome://extensions(Edge 为edge://extensions),开启「开发者模式」。 - 点「加载已解压的扩展程序」,选择本包的
extension/目录。侧栏面板里可以一键复制该路径。 - 点扩展图标,确认显示 Connected to DSH(端口默认
8765,需与服务端一致)。
3. 验证¶
让 Agent 调用 chrome_status,应看到类似输出:
DSH Chrome Bridge connected:
- listening: true
- endpoint: ws://127.0.0.1:8765
- extension: DSH Chrome Bridge 0.1.1
- extension directory: /path/to/dsh-chrome-bridge/extension/
README 提到 0.1.1 需要在扩展管理页重新加载,并重新挂载 DSH 插件;扩展增加了 HTTP/HTTPS 网站访问权限,用于隔离光标脚本及已有标签页注入。
工具面¶
chrome_* 工具不少,按用途归类如下(节选 README 工具表的一部分)。
页面读取与执行:chrome_navigate(默认复用当前会话标签页,newTab: true 才新开)、chrome_read_page、chrome_read_urls、chrome_eval、chrome_snapshot、chrome_scroll、chrome_find。
真实输入:chrome_click、chrome_type、chrome_key、chrome_move、chrome_screenshot、chrome_element_info / chrome_element_screenshot。
会话与标签组管理:chrome_tabs、chrome_active_tab、chrome_group、chrome_open_tabs / chrome_claim_tab / chrome_release_tab、chrome_mark_tab、chrome_close_tab(只关 Agent 标签组内的页)。
长尾能力包括 chrome_act(一次调用批量执行多个动作,减少往返)、chrome_locator(Playwright 风格定位器)、chrome_upload / chrome_download、chrome_clipboard / chrome_dialog、chrome_logs、chrome_export / chrome_export_gsuite / chrome_export_youtube_transcript、chrome_viewport / chrome_visibility / chrome_cdp / chrome_network、chrome_user_takeover(暂停自动化请用户接管登录 / CAPTCHA / 2FA)、chrome_js(持久 JS 浏览器会话,暴露 agent.browsers / browser.tabs / tab.playwright / tab.ax / tab.cua 等)、chrome_webmcp、chrome_history / chrome_bookmarks 等。
工具全表以 README 为准。
配置¶
配置分服务行和工具行两处,编辑 profile 的 cordis.patch.yml,按 id 覆盖对应行的 config。
chrome-bridge(服务行):
| 字段 | 默认 | 说明 |
|---|---|---|
host |
127.0.0.1 |
绑定地址 |
port |
8765 |
端口 |
authToken |
"" |
非空时扩展 popup 里需填相同 token |
commandTimeoutMs |
20000 |
单条命令超时 |
chrome-bridge-tools(工具行):
| 字段 | 默认 | 说明 |
|---|---|---|
tabGroupTitle |
DSH |
Agent 标签组标题前缀 |
askForNewDomains |
true |
遇到新域名先问用户 |
allowedDomains |
[] |
始终允许的域名;可被「始终允许」写入并持久化 |
blockedDomains |
[] |
拒绝的域名 |
maxSnapshotChars |
24000 |
页面文本截断长度 |
maxSessionTabs |
3 |
每会话最多保留的 Agent 标签页 |
autoCloseIdleMs |
180000 |
标签页空闲多久后自动关闭(0 关闭空闲清理) |
autoCloseOnSessionEnd |
true |
Agent 会话结束时关闭其打开的所有标签页 |
不想改文件的话,直接在对话里选「始终允许」,由 settings 服务写入 allowedDomains。
典型用法¶
一次常规操作大致是:先 chrome_status 确认桥接和扩展在线,再用 chrome_navigate 打开目标页面(默认复用当前会话页),接着 chrome_snapshot 拿带稳定 ref 的页面树,然后 chrome_act 一次调用里连续执行点击、输入、滚动或截图并拿回每步观察,最后需要交付或交接时用 chrome_mark_tab 标记标签页,避免被自动清理回收。
如果页面要人机验证,调用 chrome_user_takeover 暂停自动化交给用户,而不是让 Agent 反复撞。
需要一次性批量读多个 URL 时用 chrome_read_urls(在临时后台标签中读取);需要原始调试能力时用 chrome_cdp。
适用场景与注意¶
适合这类开发者:已经在 Chrome / Edge 里登录好要操作的系统(内部工单、文档、控制台),希望 Agent 在保留登录态的前提下点页面、填表单、看截图,同时不想让 Agent 的自由度扩散到整个浏览器。
几点需要留意:
- 依赖浏览器扩展与
chrome.debugger,仅支持 Chromium 系(Chrome / Edge / Chromium)。 - 标签组按会话拆分,同一会话内所有标签共用一个组。
- 若附件服务不可用(精简组合),截图回退为工作区文件 +
read_image。 - README 明确这是实验性插件,协议为包内私有 v1,可能随版本调整。
- 插件以当前 dsh 进程权限运行,会挂载两个 Host 级行;安装前建议先读一遍源码和 MIT 许可,再决定是否加载扩展。
目录页是独立的社区站点 SkillHub,与 DeepSeek / 幻方无官方从属关系,不是官方应用商店。
小结¶
dsh-chrome-bridge 的价值在于把「Agent 操作浏览器」这件事从干净沙箱拉回到你正在用的浏览器上,用域名授权和会话标签组把不可控的自动化约束在可审计的边界内。如果你的 DSH 工作流里反复需要在一个已登录的 Web 系统上执行操作,值得装一遍试;如果是需要批量无头抓取的场景,它并不合适。
目录页:https://www.skillhub.cn/plugins/yelinos/dsh-chrome-bridge
源码与 README:https://github.com/yelinos/dsh-chrome-bridge