dsh-iab:为 DSH 提供持久登录的内置 Chromium 与飞书文档读取

前言

在 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。

典型用法:首次登录飞书

  1. 让模型调用 dsh_iab_open,URL 填 https://<你的租户>.feishu.cn/。
  2. 右侧栏面板应自动弹出(自动唤出机制);不必手动找标签。
  3. 在面板里扫码或输入账号登录;登录态写入 profile 目录。
  4. 之后可用 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜