前言¶
在 DeepSeek Harness(DSH)里让模型「打开网页、读内容、在已登录站点里执行脚本」,常见做法是依赖右侧栏自带浏览器或外部工具。DSH 默认右侧栏浏览器使用 session.fromPartition('dsh-sidebar-browser-<uuid>'),且不带 persist: 前缀,Cookie 与 Web Storage 不会在应用重启后保留,每次都要重新登录。对飞书文档、需要扫码的企业内网页,这会直接打断自动化流程。
下面介绍的 dsh-iab(维护者 alamsir,社区分类:联网工具)在宿主进程里启动独立的 Chromium,profile 落在磁盘(默认 $DSH_HOME/dsh-iab/chrome-profile),登录一次可长期有效;同时提供七个 Agent 工具、页面 JavaScript 求值,以及飞书文档转 Markdown,并在右侧栏用 screencast 实时镜像画面。插件为纯 ESM,无构建步骤、无运行时依赖,当前 npm 版本 0.1.0,许可证 MIT。
这是什么¶
dsh-iab 是给 DSH 装的「自带浏览器」:通过 CDP 驱动 Chromium,不把登录态绑在 DSH 默认 ephemeral 分区上。模型通过工具开页、求值、读正文、截图;用户可在右侧栏面板里扫码登录,工具首次打开浏览器时还会自动把面板唤到前台,避免 Agent 打开了登录页却看不到的情况。
与日常 Chrome 的隔离(设计约束)¶
README 写明这些保证写在 src/browser.js 里,属于硬约束而非文档约定:
| 保证 | 实现要点 |
|---|---|
| 不附着到你正在用的 Chrome/Edge | 仅 spawn 自启子进程,不连接已有调试端口 |
| 不写你的浏览器 profile | isForeignProfile() 命中系统 Chrome/Edge User Data 等目录会直接抛错 |
| 不杀外来进程 | stop() 只作用于插件自己启动的子进程,优先 CDP Browser.close |
| 默认不抢焦点 | headless,画面经插件 screencast 面板展示,输入事件回传页面 |
| Chromium 来源 | 优先 Playwright 缓存里的专用构建,系统 Chrome 仅兜底 |
启动参数刻意不带 --disable-web-security,也不使用共享 profile 标志。
核心功能¶
七个 Agent 工具¶
| 工具 | 作用 |
|---|---|
dsh_iab_status |
报告 Chromium 路径、profile 目录、是否运行、已开标签页 |
dsh_iab_open |
打开 URL,返回 tabId;首次调用时启动 Chromium |
dsh_iab_eval |
在页面执行任意 JS,返回 JSON(带登录态,可读私有内容) |
dsh_iab_read |
将页面正文读成纯文本(可用 scrollPasses 触发懒加载) |
dsh_iab_feishu |
飞书文档 → Markdown 落盘(虚拟滚动双向回扫) |
dsh_iab_screenshot |
截图存 PNG |
dsh_iab_tabs |
列标签页 / 关标签页 |
右侧栏与自动唤出¶
- 通过
sidebar.right.pane.tab注册dsh-iab类型,keepMounted;SSE 接收Page.startScreencast的 JPEG 帧,鼠标/滚轮/键盘经Input.dispatch*回传。 - 工具启动浏览器时,宿主经
/dsh-iab/api/events广播reveal,客户端调用ctx.sidebarRight.openTab('dsh-iab')打开面板;设置页(settings.section)可查看 Chromium 路径、profile、运行状态。 - 若面板未自动出现,可查
GET /dsh-iab/api/status的eventClients(为 0 时多为宿主侧旧代码,需重启 DSH),或POST /dsh-iab/api/reveal手动触发。
配置项¶
均通过 schemastery .volatile() 暴露到设置页:
| 字段 | 默认 | 说明 |
|---|---|---|
chromePath |
'' |
Chromium 可执行文件;留空自动探测 |
profileDir |
'' |
profile 目录,默认 <dsh home>/dsh-iab/chrome-profile |
headed |
false |
是否显示真实窗口;默认关,页面在面板里看 |
outDir |
'' |
落盘目录,默认 <cwd>/prd-input |
环境变量 DSH_IAB_CHROME 可覆盖浏览器路径。
安装与启用¶
需要先有一个已初始化的 profile;若从未装过插件,可先跑一次 dsh web 建好 profile。
从 npm 安装(发行版):
dsh plugin --profile web add dsh-iab
装完后必须重启 DSH:宿主侧的七个工具与 HTTP 路由在进程启动时组装,只刷新网页不够。客户端面板支持 HMR,之后改前端一般不用重启。
package.json 要求 Node >=22.5,DSH 引擎范围为 >=0.2.0-0 <0.3.0-0 || >=0.2.1-rc.1 <0.3.0-0。
本地源码安装、desktop profile 与回滚脚本见 GitHub README;desktop 须用安装目录自带的 dsh.cmd,通用 CLI 会拒绝 desktop profile。
典型用法:首次登录飞书¶
- 让模型调用
dsh_iab_open,URL 填https://<你的租户>.feishu.cn/。 - 右侧栏面板应自动弹出(自动唤出机制);不必手动找标签。
- 在面板里扫码或输入账号登录;登录态写入 profile 目录。
- 之后可用
dsh_iab_feishu将文档转为 Markdown 落盘;重启 DSH 一般无需重登。
outDir 留空时,Markdown 等输出默认落在当前工作目录下的 prd-input。
适用场景与注意¶
适合谁:需要在 DSH 对话里稳定访问需登录的 Web(尤其飞书文档)、让模型在真实会话里求值或读正文、又不想每次重启 DSH 都重登的开发者。
权限与安全:插件以当前 DSH 进程权限运行;飞书登录态保存在 profile 目录,等价于会话凭据,应对 profile 目录按敏感凭据保管。安装前建议阅读源码与 MIT 许可证,确认行为符合你的环境策略。
已知限制(README 原文):
- 画板/图片仅有占位符,
canvas与图片位图无法提取为文本。 - 飞书采集不包含评论、@ 提醒、右侧目录。
- 面板是 screencast 镜像,空闲时可能几秒一帧,静态页看起来像「卡住」,阅读与点击不受影响。
- headless 下部分站点会做 UA/指纹探测;必要时将
headed设为true。 - 同一
profileDir只能有一个 Chromium 实例;并行多个 DSH 时需为各实例配置独立profileDir,否则后启动者可能报Chromium exited before exposing a DevTools port。
DSH 生态采用「一切皆插件」思路;SkillHub 目录页 为社区收录站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-iab 把持久登录的 Chromium、七个联网相关工具、飞书 Markdown 导出和右侧栏实时面板收在一个 DSH 插件里,并刻意与日常浏览器 profile 隔离。若你在 Harness 里做文档采集或登录态自动化,可按上文命令安装、重启后再走飞书登录流程。
- 目录页:https://www.skillhub.cn/plugins/alamsir/dsh-iab
- 源码与完整说明:https://github.com/alamsir/dsh-iab