Tools & Capabilities
dsh-browser
wqty123/dsh-browser · ★ 185
Shared real browser for DSH: a native Electron window the human can watch and take over, driven by the agent over CDP with 20 browser_* tools (open/snapshot/execute/fill/screenshot/download/auth), per-task session isolation, cookie persistence, CAPTCHA detection; self-hosts on plain dsh web without a desktop shell.
Manifest details
安装
dsh plugin --profile web add github:wqty123/dsh-browserGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
For install and environment setup, plus plugin development tutorials, see DSH community docs ↗
README
Table of contents
What is this
dsh-builtin-browser gives DeepSeek Harness browser capability:
- A real page, not a relay: pages are hosted by a real browser — on the desktop that is the official side panel, on
dsh webit is a window this plugin launches, and you can point it at your own installed Chrome / Edge instead. The user watches what the agent is doing and can take over at any time; - Human and agent on the same page (desktop): the page the agent drives is the same page the human sees — no more acting inside a window you cannot watch;
- Works on install: the carrier is chosen automatically (desktop side panel first, otherwise self-hosted), and plain
dsh webneeds no extra configuration; - One plugin, one toolset: installing it gives the agent 34
dsh_browser_*tools (open, read, accessibility tree, wait, semantic/coordinate actions, scroll, history navigation, batch and single-control form filling, keys, structured extraction, screenshots, downloads, login-state management).
In one line: install the plugin and you have a real browser shared with, and drivable by, the user's agent.
Quick start
First, which side are you on — these are two separate installs; updating one does not update the other, and they host the browser differently.
Updating an installed plugin takes two steps (since DSH 0.2.1-alpha.2, installing over an installed package fails outright with
already-installed): rundsh plugin --profile <profile> remove dsh-builtin-browserfirst, thenaddthe target version. See the user guide (Chinese).
DSH Desktop
dsh plugin --profile desktop add dsh-builtin-browser
On the desktop the plugin drives the browser panel inside the official side panel — no extra window, no Electron dependency, and the agent operates the very page you see in the interface.
Driving that panel also needs a bridge, installed into the desktop app's own install directory rather than the profile:
node desktop-bridge/install.mjs # idempotent; backs up main.js.before-bridge first
node desktop-bridge/install.mjs --revert # roll back
Optional: without the bridge the plugin falls back to self-hosting — identical capability, just one extra standalone window. Re-run it after every desktop upgrade, which replaces
resources/app/and takes the bridge with it.
Web (dsh web)
dsh plugin --profile web add dsh-builtin-browser
There is no side panel and no bridge on the web side: the shared browser is self-hosted in a standalone window (titled dsh-browser) with a full toolbar (address bar, back/forward/reload, tab strip) you can use like any browser.
If the Electron binary is missing on first install (44+ no longer downloads it), run
npx install-electrononce as the error suggests — it needs network.
Both sides
No further configuration; just ask the agent:
Open https://example.com and summarise the main content for me.
The browser window appears with the first call, and you can operate in it yourself at any point. Either side can be pointed at your own installed Chrome / Edge in settings — that option behaves identically on both.
Documentation
| Goal | Entry point |
|---|---|
| Why this plugin exists, and how it differs from headless | Why a shared real browser |
| Install, configure, daily use, troubleshooting | User guide |
| Every one of the 34 tools: parameters, output, examples | Tool reference |
| The seam / provider / tool layers and the self-hosted host | Architecture |
| What it deliberately cannot do, and why | Known limitations |
| Build, test, re-verify host compatibility | Development |
| All documents and how they divide the work | Documentation index |
Requirements, the four carriers and their tradeoffs, configuration, operating discipline, troubleshooting and updating all live in those documents — this README is an entry point and does not repeat them.
Tool namespace
This plugin claims the global dsh_browser_* namespace (34 tools).
Before 0.4.8 it was browser_*. That is an unprefixed, generic word, and it collided directly with Tencent BrowserSkill's DSH plugin (browser_session in @wxg-prc-cpg/browser-skill-dsh-plugin @0.3.2) — and DSH's tool registry is global and refuses duplicates, so whichever registers second throws. All six of that plugin's tools failed to register, which reads as "installed but does nothing".
Why we changed rather than waiting: a bare name like browser_* belongs to nobody, and the cost of one collision is not "each plugin keeps one" — it is that the second one loses its entire toolset. Giving up the generic name is a better answer than asking every user to patch their own node_modules. Tencent's upstream has renamed its six tools to bsk_* as well.
If your log shows could not register dsh_browser_xxx: another plugin holds that name. From 0.4.8 every tool registers independently, so a collision costs that one name and nothing else — the check exists so the next collision is visible at a glance rather than starting from "the plugin is broken".
Who should update to 0.4.8: only names changed, not behaviour. If this is your only browser plugin, you do not need to update. If you also run another browser plugin (Tencent BrowserSkill especially), updating is recommended. The upgrade note is at the end of the user guide (Chinese).
Release history
The full record — per round, with the cause and the evidence for each fix — is in CHANGELOG.md (Chinese). Published with a tag since 0.1.16.
| Version | Date | Theme |
|---|---|---|
| 0.4.8 | 2026-10-14 | Tool namespace: 34 tools move to dsh_browser_*; one taken name can no longer cost the whole toolset |
| 0.4.7 | 2026-10-12 | Three defects of one shape: a hardcoded carrier, a dead host never replaced, a setting read once; takes the four suggestions from #26 |
| 0.4.6 | 2026-10-08 | Reading another conversation's sidebar, blank pages spawned while waiting, sign-outs on upgrade |
| 0.4.5 | 2026-10-06 | The real cause of cross-conversation bleed: panel placement keyed by conversation id, not by what the shell displays |
| 0.4.0–0.4.4 | 2026-10-02 | Splitting "limitations" into real ones and implementation ones: dsh_browser_auth works on all three carriers, JPEG works on an installed Chrome/Edge, downscaling everywhere; plus fixes for defects that crashed the host, silently did the wrong thing, or hung forever |
Credits
Thanks to the DeepSeek Harness repository and the DeepSeek AI team: this plugin's seam, tool runtime and plugin system are all built on that project.
Thanks as well to Cordis for the plugin foundation, and to everyone who discussed, tested, reported and built plugins around this one — including the reporters who arrived with a full reproduction and a local patch, which is why these fixes did not have to be guessed.
Author
If you have an opinion about the plugin, or an idea for another one, add me on WeChat:
wx: hui13866591135 (please say what it is about when you add me)
License
A community plugin for DeepSeek Harness, not an official DeepSeek product.