dsh-browser-slotpool:并发浏览器会话槽位池插件

前言

DeepSeek Harness (DSH) 允许在 profile 中添加 MCP 客户端实例以调用浏览器能力。在多会话或多 profile 场景下,直接启动多个浏览器实例通常会导致端口冲突、内存占用过高以及进程间的互相干扰。dsh-browser-slotpool 插件通过引入“槽位池”机制,将并发浏览器会话的数量显式化并加以隔离,解决上述冲突问题。

这是什么

这是一个为 DSH 提供的 patch 层 bundle。它本质上是一个浏览器启动器,封装了 @playwright/mcp 的 stdio 通信。插件维护一个固定数量的 CDP 端口池,每个 DSH mcp-client 实例独占一个槽位,确保会话之间互不破坏。插件本身没有 TypeScript 源码和构建步骤,安装后即开箱即用。

核心功能

该插件主要提供以下能力:
* 槽位池管理:维护一组固定的 CDP 端口(默认 9222, 9223),先到先得,满员时拒绝新连接。
* 原子加锁与自愈:使用 fs.openSync 的独占标志实现原子加锁。通过检查持有者的 PID 活性,自动回收异常退出的进程锁,避免“槽全忙”的死锁状态。
* 幂等就绪探测:在启动 Chrome 前先探测端口是否已开启,避免重复启动;不主动杀死其他槽位的浏览器。
* 所有权隔离:严格限制每个 mcp-client 会话只能操作分配给它的槽位,不代理、不窃取。
* 全委托:将 stdio 通信完全委托给 @playwright/mcp,并将诊断日志输出到 stderr 以保证 MCP 协议通道的畅通。

安装与配置

安装插件需要从 GitHub 仓库添加依赖到当前 DSH profile。

  1. 在 DSH 的 checkout 目录(与 GUI 所在 profile 一致)执行:
    pnpm dsh plugin --profile web add github:bluechips-zhao/dsh-browser-slotpool
  1. 安装完成后,重启目标 profile 以加载依赖。

关键配置步骤

由于 !!js 在 DSH 中求值时没有模块作用域,启动器路径必须通过环境变量显式指定。

  1. 找到插件安装后的启动器路径:
    <DSH_HOME>/profiles/<name>/node_modules/@deepseek-ai/dsh-browser-slotpool/bin/browser-slotpool.mjs
  1. 将该绝对路径设置到环境变量 DSH_BROWSER_LAUNCHER(临时或写入启动脚本):
    $env:DSH_BROWSER_LAUNCHER = "<DSH_HOME>/profiles/<name>/node_modules/@deepseek-ai/dsh-browser-slotpool/bin/browser-slotpool.mjs"

可选环境变量

启动器会读取以下环境变量来控制行为:

变量名 默认值 说明
DSH_BROWSER_PORTS 9222,9223 槽位池包含的 CDP 端口列表,逗号分隔。
DSH_BROWSER_BASE_DIR LOCALAPPDATA/mcp-shared-browsers 共享浏览器数据目录和锁文件的根路径。
DSH_PLAYWRIGHT_MCP_ENTRY (空) @playwright/mcp 的 cli.js 绝对路径。设置后可直接调用 node,避免 npx 网络开销。
DSH_PLAYWRIGHT_MCP_CMD npx 调用 Playwright MCP 的命令(仅在 entry 未设置时使用)。
CHROME_PATH (系统探测) Chrome/Chromium 可执行文件的绝对路径。

使用示例

在 profile 的配置中添加 @deepseek-ai/dsh-mcp-client 实例:

  1. 在配置文件中添加该实例。
  2. 设置 command 指向 bin/browser-slotpool.mjs,设置 args 为空数组。
  3. 确保 DSH_BROWSER_LAUNCHER 环境变量已正确指向上述启动器路径。

完成配置后,浏览器工具会以 mcp__browser__<rawName> 的形式出现在模型可用工具列表中。

本地验证

运行仓库自带的冒烟测试脚本来验证全链路:

node test/mcp-client-smoke.mjs

该脚本会启动本地服务器、创建槽位、连接 Playwright MCP 并执行截图操作,确认渲染真实页面。

适用场景与注意

  • 适用场景:需要在一个 DSH profile 中同时运行多个浏览器实例,且希望严格隔离资源和端口的场景。
  • 运行前提:
    • 需要本地安装 Chrome/Chromium 浏览器。
    • 需要依赖 DSH 自带的 @deepseek-ai/dsh-mcp-client。
    • 需要依赖 @playwright/mcp(若未设置 DSH_PLAYWRIGHT_MCP_ENTRY,首次调用需联网拉取)。
  • 注意事项:
    • 这是一个纯 .mjs 文件,无 TypeScript 源码,修改需直接编辑源文件。
    • 若修改仓库命名空间,需同步更新 dsh plugin add 中的 GitHub 地址。
    • 外网访问能力取决于部署环境(若使用 npx 调用 Playwright MCP)。

结尾

dsh-browser-slotpool 通过显式的槽位管理和 PID 活性检查,为 DSH 提供了一个健壮的并发浏览器解决方案。它解决了多实例环境下的资源竞争问题,适合需要稳定多会话协作的开发者使用。

更多详情及源码,请访问:GitHub 仓库

羽毛球分组比赛记分
小程序二维码

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

小夜