🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

浏览器操作模式 Shad0wwa1ker/dsh-browser-mode

DeepSeek Harness
Shad0wwa1ker12 天前有提交已提供中文文档扫描:含敏感能力

新建可见浏览器会话,按需授权后才允许模型操作网页

29.7/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Shad0wwa1ker/dsh-browser-mode
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 6 处,展示前 6 条)
  • 读取本地文件
    browser-source.js:63
    if (existsSync(candidate)) return candidate
  • 读取本地文件
    browser-source.js:90
    const value = JSON.parse(readFileSync(statePath(), 'utf8'))
  • 写入本地文件
    browser-source.js:106
    writeFileSync(temporary, `${JSON.stringify(payload, null, 2)}\n`, 'utf8')
  • 写入本地文件
    browser-source.js:107
    renameSync(temporary, file)
  • 发起网络请求
    client.js:61
    const response = await fetch(API, { cache: 'no-store' });
  • 发起网络请求
    client.js:68
    const response = await fetch(API, {
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-experimental-browser-use-playwright-mcp@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 插件包:一个可见浏览器预设,外加一道授权关卡,让其他会话都无法自行打开浏览器。

README

由 DeepSeek 最新模型翻译生成
dsh-browser-mode DeepSeek Harness(DSH)插件包:新增一个「浏览器操作」会话模式,浏览器来源可在运行时切换(默认 Edge),其它会话在用户明确同意前无法打开浏览器。 在 DSH 0.2.1-rc.2(Windows 11 + Edge)上实测通过。 特性 - 可见浏览器:默认 headless: false,能看着它操作,也能随时接管。 - 浏览器来源可选:Edge(默认)、Playwright 内置 Chromium、或连接一个已经开着的浏览器(CDP)。 - 两种入口:新建「浏览器操作」会话,或就在当前会话里让模型申请授权。 - 按会话授权:授权只对当时那个智能体生效,存在插件内存里,重启或重开会话需重新同意。 - 拒绝可解释:被拦下时模型拿到的是中文说明和后续做法,而不是一句 permission denied。 - 失败即关闭:读不到预设、问答服务不可用、服务商未加载时,一律按「不可用浏览器」处理。 安装 一键安装 DSH 插件管理器的安装框接受 git 地址。
展开完整文档(README 剩余 1 节)
dsh-browser-mode

DeepSeek Harness(DSH)插件包:新增一个「浏览器操作」会话模式,浏览器来源可在运行时切换(默认 Edge),其它会话在用户明确同意前无法打开浏览器。

在 DSH 0.2.1-rc.2(Windows 11 + Edge)上实测通过。

特性

- 可见浏览器:默认 headless: false,能看着它操作,也能随时接管。
- 浏览器来源可选:Edge(默认)、Playwright 内置 Chromium、或连接一个已经开着的浏览器(CDP)。
- 两种入口:新建「浏览器操作」会话,或就在当前会话里让模型申请授权。
- 按会话授权:授权只对当时那个智能体生效,存在插件内存里,重启或重开会话需重新同意。
- 拒绝可解释:被拦下时模型拿到的是中文说明和后续做法,而不是一句 permission denied。
- 失败即关闭:读不到预设、问答服务不可用、服务商未加载时,一律按「不可用浏览器」处理。

安装

一键安装

DSH 插件管理器的安装框接受 git 地址。把下面这一行粘贴到「包名或地址」:

github:Shad0wwa1ker/dsh-browser-mode

等价的工具调用:

plugin_manager install_bundle target:github:Shad0wwa1ker/dsh-browser-mode

安装会写入配置档依赖 "@local/dsh-browser-mode": "github:Shad0wwa1ker/dsh-browser-mode",并自动启用包内三行:预设 preset-browser、来源 browser-source、门禁 browser-gate。

首次使用前的一次性配置

在 $DSH_PROFILE_DIR/cordis.patch.yml 里保留共享的 browserUse 注册表行(若已存在则跳过):

- insert:
- id: browser-use
name: "@deepseek-ai/dsh-browser-use"

Playwright MCP 服务商由本插件的 browser-source 行负责挂载,不需要单独的服务商行。这样浏览器来源才能在运行时切换。

[!IMPORTANT]
从 1.5.1 或更早版本升级:请删掉 browser-use-playwright-mcp 那一行(browser-use 保留)。一个进程里只能有一个服务商;旧行还在时 browser-source 只打印一条迁移提示,不会接管。

更新到新版本

插件市场对 github:owner/repo 这种浮动源会读取仓库默认分支的 package.json 版本号做比较,所以每次发版只要改版本号并 push:

git tag v1.6.0
git push && git push --tags

已安装的用户在插件市场点「更新」,或手工执行下面两条(pnpm 会把 GitHub 依赖重新解析到默认分支最新提交):

pnpm add "github:Shad0wwa1ker/dsh-browser-mode"

plugin_manager set_bundle enabled:false target:@local/dsh-browser-mode
plugin_manager set_bundle enabled:true target:@local/dsh-browser-mode

确认安装结果

plugin_manager list_plugins

include:preset-browser、include:browser-source、include:browser-gate 三行都应是 enabled: true、fiberPhase: "active"。

使用

方式一:浏览器模式会话(整段网页任务)

新建会话时把模式选为「浏览器操作」。该会话内模型直接调用 browser_navigate 等工具,不再询问。

方式二:当前会话里申请

直接说「用浏览器打开这个页面并填好」。模型第一次调用浏览器工具时会被拦下,随后调用 browser_access,界面弹出:

允许使用浏览器是否允许我在这个会话里打开浏览器?用途:……
[允许] [不允许]

点「允许」后,该会话后续的浏览器调用全部放行;点「不允许」,模型改用 web_search、web_fetch、文件与命令行继续。

浏览器来源

默认用 Microsoft Edge。三种来源:

| source | 行为 |
| edge | 启动本机 Edge(找不到时退回 Playwright 内置 Chromium) |
| builtin | 启动 Playwright 自带的 Chromium(~/AppData/Local/ms-playwright/chromium-) |
| endpoint | 连接一个已经启动、开了调试端口的浏览器(--cdp-endpoint),此时独占,多会话不能共用 |

在插件页面设置

「插件」页里本插件卡片上的设置页可以直接选来源、填 CDP 地址、改 Edge 路径、切换无头,保存后立即生效(和工具一样,已打开会话的浏览器工具会失效)。这个页面与 browser_source 工具读写同一份配置,两种方式可以混用。

让模型切换

在任意会话里说「换成内置浏览器」「连接我开着的浏览器」,模型会调用 browser_source:

browser_source({ source: "builtin" })
browser_source({ source: "endpoint", endpoint: "http://127.0.0.1:9222" })
不带参数时只回显当前配置。切换会立刻重挂 provider:已经打开的浏览器会话里的工具会失效,请新开一个「浏览器操作」会话再打开页面。

手工改配置

切换结果保存在 $DSH_PROFILE_DIR/browser-source.json(Windows 上是 %USERPROFILE%\.dsh\profiles\<profile>\browser-source.json)。用文件而不是 Loader 配置,是因为重装或管理插件时 Loader 的配置文档会被重写,而这个文件不会。删除它即回到默认(Edge)。

也可以在 profile 的 cordis.patch.yml 里覆盖本行:文件里记录着写入时的行配置快照,你事后手改过的字段优先,没改过的字段继续用文件里的选择(用 browser_source 切换会刷新快照)。

- id: browser-source
name: "@local/dsh-browser-mode/browser-source"
config:
source: builtin # edge | builtin | endpoint
endpoint: "" # source=endpoint 时必填 executablePath: "" # source=edge 时可自定义路径 headless: false

接远程浏览器时,先让浏览器以调试端口启动,例如:

& "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 --user-data-dir="$env:TEMP\edge-cdp"

原理

为什么 provider 由本插件挂载

把 provider 塞进预设的三条路都试过,全部失败:

| 做法 | 结果 |
| provider 行放进预设 | 加载报错 Preset services require isolate realms: browserUse |
| 放进 isolate: { browserUse: true } 组 | 预设能加载,但 provider 收不到 agent/created,会话里没有 browser_ 工具 |
| 预设里再挂一个 provider | 与 profile 的那个重名,调用时报 playwright-mcp: browser tool belongs to another Session |

所以 provider 只能挂在 profile 层。本插件用 browser-source 这一行代挂,好处是:provider 的启动参数由插件自己算,改来源时销毁旧 fiber 再挂新的,不用重启 DSH。代价是 provider 会给每个会话注册浏览器工具,所以需要门禁。

为什么门禁只能拒绝、不能隐藏

@deepseek-ai/dsh-tools 的 tools.restrict() 只过滤一个作用域继承来的工具(全局层与祖先层):

Restrictions filter what a scope inherits … never what its OWN layer registers.

而 provider 用 createScope(ctx, agent) 把工具注册进该 Agent 自己的层,任何 restrict() 都过滤不到(实测:普通会话仍能看到 24 个 mcp__playwright-mcp__ 工具名)。

唯一有效的杠杆是 tools.guard():它在调用管线里同步执行,返回字符串即拒绝,且没有监听器能把拒绝改回放行。

决策顺序:

浏览器工具调用 ├─ 名字不以 mcp__playwright-mcp__ 开头 → 不处理 ├─ 是 browser_access → 不处理 ├─ Agent 的预设是 browser → 放行 ├─ Agent 已被用户授权 → 放行 └─ 其它 → 返回中文拒绝语

授权如何记录

browser_access 调用 ctx.userQuestions.ask({ questions, agent, signal });用户选「允许」后,把该 Agent 的 id 记进插件内存的 Set。不落盘,不跨会话,不跨重启。

配置

来源(browser-source,bundle 内)

| 字段 | 默认 | 说明 |
| source | edge | edge / builtin / endpoint |
| endpoint | 空 | source: endpoint 时连接的目标地址 |
| executablePath | 空 | 自定义浏览器路径;空则用 Edge 默认安装位置 |
| headless | false | 改为 true 则隐藏窗口,调试时建议保持可见 |

门禁

browser-gate.js 顶部常量:

const TOOL_PREFIX = 'mcp__playwright-mcp__' // provider 的工具前缀 const BROWSER_PRESET = 'browser' // 直接用浏览器的预设 id const ACCESS_TOOL = 'browser_access' // 申请授权用的工具名 const DENIED = '……' // 拒绝时给模型看的文字

改 preset-browser 的 id 时,BROWSER_PRESET 必须一起改,否则门禁永远不认这个模式。

验证清单

1. 普通会话里让它打开某个网址:应收到拒绝语,且不弹浏览器窗口。
2. 同一会话里说「我同意你用浏览器」:出现「允许 / 不允许」,点「允许」后再次打开网址,应弹出可见窗口。
3. 新建「浏览器操作」会话:直接打开网址,不询问。
4. 让它做一步真实操作(点按钮、读标题),确认工具确实在页面上执行。
5. 说「换成内置浏览器」或调用 browser_source({ source: "builtin" }):下一次打开页面应换成 Playwright 自带 Chromium。

故障排查

| 现象 | 原因 | 处理 |
| 预设列表里没有「浏览器操作」 | bundle 未启用,或预设行失败 | 看 list_plugins 里 include:preset-browser 是否 active |
| 加载报 Preset services require isolate realms: browserUse | provider 行被放进了预设 | 把 provider 留在 profile 层,由 browser-source 挂载 |
| 会话里完全没有 browser_ 工具 | browser-source 未 active,或旧 browser-use-playwright-mcp 行还在 | 看 include:browser-source;删掉旧 provider 行后重载 |
| 报 browser tool belongs to another Session | 一个进程里有两个 Playwright provider | 只保留 browser-source 这一个 |
| 切换来源后浏览器没变 | 旧会话持有旧的 MCP 连接 | 在会话里重新调用一次浏览器工具 |
| 普通会话能直接开浏览器 | 门禁未生效 | 看 include:browser-gate 是否 active;改过代码需重载 |
| 点「允许」没反应,或报 human interaction is unavailable | 在子 Agent 里调用 | 授权只能在主会话完成 |
| 报 content.some is not a function | 旧版 browser_access 的 output.render 返回值不合规 | 升级到 ≥ 1.5.1 |

兼容性

- 验证环境:DSH 0.2.1-rc.2、Windows 11、Edge。
- 依赖 @deepseek-ai/dsh-experimental-browser-use-playwright-mcp 与 @deepseek-ai/schemastery,版本在 package.json 中声明;DSH 升级后同步调整。
- 门禁只使用公开接口:tools.guard()、tools.register()、agentPresets.composedPreset()、sessionProjections.stateOf()、userQuestions.ask()。其中任何一个改名,browser-gate 会掉出 active,此时浏览器恢复为所有会话可用(门禁失效但不会破坏会话),升级后请重跑验证清单。
- 来源切换使用 settings.update() 写 volatile 字段 + loader/volatile-update 事件;DSH 去掉 volatile 通道时,切换会退化为报错并提示手工改 YAML(浏览器本身不受影响)。

已知限制

- 普通会话里仍能看到 mcp__playwright-mcp__* 工具名,只是调用会被拒绝。
- 浏览器状态(页面、登录态)只在单个会话内保留。
- 授权只存内存,重启即失效。
- 会话开始后不能切换预设,因此临时用浏览器走 browser_access,而不是切模式。
- 子 Agent 不能弹出问答,授权只能在主会话完成。
- 切换来源会重挂 provider,已打开的页面不会保留。

文件

| 文件 | 作用 |
| browser-gate.js | 门禁插件:tools.guard 拒绝 + browser_access 征求同意 |
| browser-source.js | 来源插件:挂载 Playwright MCP provider,支持 Edge / 内置 Chromium / CDP,并提供 browser_source 工具 |
| cordis.patch.yml | 预设 preset-browser、来源行 browser-source、门禁行 browser-gate |
| package.json | bundle 声明(dsh.bundle.patch)、导出、依赖 |
| README.md、README.en.md | 中文、英文说明 |
| CHANGELOG.md | 版本记录 |

开发

本地目录安装(以 junction 链接到源码,改完重载即可):

plugin_manager install_bundle target:<本仓库绝对路径> plugin_manager set_bundle enabled:false target:@local/dsh-browser-mode plugin_manager set_bundle enabled:true target:@local/dsh-browser-mode

发布新版本:

git add .
git commit -m "feat: …"
git tag v1.6.0
git push && git push --tags

License

MIT
预览分享卡片长什么样 ↓Shad0wwa1ker/dsh-browser-mode
分享 · DeepSeek Harness Hub
Shad0wwa1ker/dsh-browser-mode

新建可见浏览器会话,按需授权后才允许模型操作网页

回到顶部