前言¶
在 DeepSeek Harness(DSH)中,模型执行“打开网页”等操作时,通常使用系统默认浏览器。当默认浏览器是 Edge、Firefox 或 360 时,DSH 的跳转行为就与预期不一致。这个 bundle 把这件事钉死:强制 DSH 内所有浏览器跳转只走 Google Chrome。
它是什么¶
seekafterseek/dsh-chrome-only 是一个 DSH 插件包,由维护者 SeekAfterSeek 提供。它的核心价值是:无论系统默认浏览器如何设置,DSH 自己打开网页时永远使用 Chrome;只有用户明确点名时才允许例外。
它通过五层机制实现这一目标:
| 层 | 机制 | 效果 |
|---|---|---|
| 提示层 | ctx.systemPrompt.section() |
每轮请求注入硬规则 + Chrome 缺失时的授权流程 + 唯一例外条款 |
| 工具层 | chrome_open |
直接启动 chrome.exe --new-window <url>,永不回退系统默认浏览器 |
| 工具层 | chrome_status |
检测 Chrome 是否安装、实际可执行文件路径、宿主补丁真实状态 |
| 工具层 | chrome_install |
必须先拿到用户授权(authorized: true)才下载安装 Chrome |
| 拦截层 | ctx.tools.guard() |
拒绝 Start-Process <url>、start <url>、Invoke-Item、explorer <url>、rundll32 url.dll、xdg-open、open,以及 msedge / firefox / brave / vivaldi / chromium / 360 / QQ / Sogou / maxthon 等非 Chrome 启动 |
| 启动层 | web-runtime 配置覆盖 + Chrome 交接 |
dsh web 不再调用系统默认浏览器:openBrowser 固定为 false,改由插件在服务器就绪后用 Chrome 打开同一个带 token 的地址;--no-open 仍然有效 |
| 宿主层 | Electron shell.openExternal 重定向 |
Electron 主进程里可用时把外链交给 Chrome;桌面应用的 Host 是 Electron Node 子进程,那里 require('electron') 不可用,此层自动降级并如实上报 |
安装与启用¶
仓库根目录就是 bundle 包(package.json 里声明了 dsh.bundle.patch)。使用前请先克隆仓库。
git clone https://github.com/SeekAfterSeek/dsh-chrome-only.git
桌面 profile(desktop)¶
用 Plugin Manager 安装本地 bundle,或调用 plugin_manager 的 install_bundle,target 指向仓库绝对路径。
web profile(dsh web 用的那个)¶
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\Install-WebProfile.ps1
该脚本执行与 Plugin Manager 相同的三步:dependencies 加 link: → dsh.profile.bundles 追加 → 用 DSH 自带的 pnpm 安装。重复执行安全。写回 package.json 必须无 BOM,否则 DSH 启动时报 Unexpected token ''。
注意:两个 profile 里记的是 link:<仓库路径>。仓库被移动或删除后,启动时会解析不到 bundle——建议把仓库放在固定位置。
配置¶
- id: chrome-only
name: '@local/dsh-chrome-only'
config:
chromePath: '' # 显式指定 chrome.exe;留空自动探测(注册表 + 常见安装路径)
newWindow: true # 每次打开新窗口
guardShellTools: true # 拦截 shell 工具里的非 Chrome 浏览器启动
patchElectronShell: true # Electron 主进程可用时重定向 shell.openExternal
openWebUiInChrome: true # dsh web 就绪后由本插件用 Chrome 打开 GUI
extraForbiddenBrowsers: []
Chrome 探测顺序:chromePath → CHROME_ONLY_CHROME_PATH → %ProgramFiles% / %ProgramFiles(x86)% / %LOCALAPPDATA% → 注册表 App Paths\chrome.exe。
典型用法¶
模型侧¶
- 打开网页只用
chrome_open。 - 查状态用
chrome_status。 - 装 Chrome 前必须先
ask_user_question拿到授权,再chrome_install { authorized: true }。
脚本侧¶
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\Open-DshChrome.ps1 -Url https://example.com -NewWindow
退出码:0 已在 Chrome 中打开;2 网址非法;3 本机没有 Chrome(此时必须先申请安装授权,禁止换浏览器)。
或者直接用 Chrome 本体:
& "$env:ProgramFiles\Google\Chrome\Application\chrome.exe" "https://example.com"
验证¶
node test\matcher.test.mjs # 17 条拦截 + 17 条放行 + URL 规范化
node test\handoff.test.mjs # dsh web 交接:正常→打开 / --no-open→不打开 / 关配置→不接手
powershell -File .\scripts\Open-DshChrome.ps1 -Url about:blank
适用场景与注意¶
- 适合希望 DSH 内所有网页跳转统一使用 Chrome 的开发者与用户。
- 插件以当前 dsh 进程权限运行,安装前建议检查源码与许可证。
- 桌面应用是“Electron 主进程 + Electron Node 子进程(Cordis Host)”两段结构。点外链、下载地址、登录页这几处
shell.openExternal在主进程里,插件在子进程,够不到;chrome_status会显示electronShellPatch.patched: false及原因。把系统默认浏览器设为 Chrome 即可顺带覆盖这几处。 .html这类文件扩展名关联是独立于默认浏览器的设置,插件不碰;chrome_open对本地文件始终用 Chrome。web_fetch/web_search是服务端取文本,不启动浏览器,不受规则影响。- guard 只审命令行文本,审不到脚本文件内部(
pwsh -File deploy.ps1里写Start-Process msedge)。 dsh web --no-open是用户明确表态“不要打开”,不打开任何浏览器。
诊断工具¶
不解包整个 app.asar 就能按关键字定位、列目录、导出单个文件:
node tools\asar-scan.mjs "...\resources\app.asar" openExternal
node tools\asar-list.mjs "...\resources\app.asar" "dsh/node_modules/@deepseek-ai/dsh-web-app/lib"
node tools\asar-extract.mjs "...\resources\app.asar" "path/inside/asar.js" .\out.js
(read 能读 asar 内部路径,rg 不能——所以这三个脚本绕过解包。)
卸载¶
- 临时关闭:在 Plugin Manager 里关闭
chrome-only行。 - 彻底移除:移除 bundle,并从两个 profile 的
package.json去掉依赖与 bundles 条目,再跑一次 pnpm install。
结语¶
这个 bundle 通过提示层、工具层、拦截层、启动层、宿主层等多层机制,把 DSH 内所有浏览器跳转锁定为 Chrome,并拦截其他浏览器的启动。如果你需要统一的浏览器行为,可以参考这个插件。
- 目录页:https://www.skillhub.cn/plugins/SeekAfterSeek/dsh-chrome-only
- GitHub:https://github.com/SeekAfterSeek/dsh-chrome-only