dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH (DeepSeek Harness) browser plugin: give your agent hands inside the Chrome you already use — native messaging + CDP, no TCP port, no Connect button, 9 native browser_* tools.
= 116" /> = 18" />
English · 简体中文 · Development notes
Give your DSH agent hands inside the Chrome you are already using — your logins, your tabs, your session. Install once, no Connect button, ever.
What it is: a DeepSeek Harness (DSH) plugin that lets the model operate the Chrome you already use: open pages, click, type, fill in forms, read pages, take screenshots and work across tabs, with your existing logins.
Use it for: "fill in this web form", "check this admin page for me", "screenshot this site", or anything else the model has to do inside a browser.
Install: dsh plugin add https://github.com/OrderG-X/dsh-chrome-bridge/releases/latest/download/dsh-chrome-bridge.tgz, restart DSH, then add the DSH Bridge extension from the Chrome Web Store. Needs macOS, Windows or Linux, Chrome 116+ and Node.js 18+.Every click flies a cursor to the target and labels what it is doing. It renders *inside the page*, so it lands in screenshots too — you and the model look at the same picture.
Every existing option makes you click something, every time:
Option · What goes wrong chrome-devtools-mcp --autoConnect · Chrome asks *"Allow remote debugging?"* on every connection Browser MCP (store extension) · You must click the extension icon → Connect on every tab WebSocket-based bridges · Open a TCP port and trust anything that can reach it dsh-chrome-bridge · Nothing to click. Nothing listening on a port.
Three things make the difference:
0600 Unix socket guarded by a token. No TCP port to scan, no origin to spoof.Input.* events, so they carry a user gesture — popups open, focus works, and sites that reject synthetic events behave normally. Screenshots, network, console and raw CDP come for free.DSH's agent (provided by the harness — this repo ships none)
├── browser_* tools (DSH plugin) ─┐
└── cb CLI (shell) ─┤
▼
Unix socket /tmp/dsh-bridge-<uid>/ (0700 dir + token)
▼
Node native host ←─ native messaging (stdio) ─→ Chrome extension (MV3)
│ chrome.debugger
▼
real CDPThis repo ships no agent — the agent above is DSH's own; we only give it hands.
The extension ID is fixed by the public key embedded in plugin/vendor/extension/manifest.json, so it is identical on every machine and the native-host registration never needs editing. The Web Store build has its own store-assigned ID; the host accepts both.
The host ships inside the plugin package. Adding the plugin copies the native host and the MV3 extension into place and registers native messaging for you — no git clone, no install.sh, no python3.
Requirements: macOS, Windows or Linux, Google Chrome 116+, Node.js 18+.
1. Sidebar → Plugins → Add plugin → paste this → Install → Enable → restart DSH:
https://github.com/OrderG-X/dsh-chrome-bridge/releases/latest/download/dsh-chrome-bridge.tgz2. The plugin installs the host on first load (~/.dsh/chrome-bridge, ~/dsh-bridge-extension, plus com.dsh.bridge.json in Chrome's NativeMessagingHosts). All that's left is getting the extension into Chrome — pick one:
Recommended: install from the Chrome Web Store — open the DSH Bridge store page → Add to Chrome. No Developer mode, and the extension updates itself.
Or: load it unpacked (to run the newest extension from the repo). Chrome 137+ removed --load-extension, so that click has to be yours; the plugin walks you to it:
browser_* tool finds nothing to talk to, it opens `chrome://extensions` in a background tab and puts `~/dsh-bridge-extension` on your clipboard (once per session; the error text repeats the steps);Do it once, ever:
chrome://extensionsFrom a source checkout, ./bridge setup does exactly this in one command: installs the host, opens the page, copies the path, and waits until the extension connects — printing ✅ when it does.
3. Verify (the cb CLI is installed along the way):
cb status # host pid … | extension connected: ✅
cb tabsUntil step 2 is done the browser_* tools fail loudly with exactly these steps — never silently.
Tool · What it does browser_tabs · list / find / open / close / activate tabs browser_read · numbered list of clickable / fillable elements (snapshot — same-origin iframes included, and their elements are clickable by number too), visible text, HTML, attributes, page info browser_click · click by element number (ref), selector, text, or coordinates browser_input · type, press keys, select, upload, hover, scroll browser_nav · go to a URL, back / forward / reload, and wait for load browser_screenshot · screenshot returned as an image (viewport / full / element) browser_eval · run JS in the page browser_wait · wait for an element, a piece of text, or a URL — or for it to go away (gone) browser_dialog · release alert / confirm / prompt browser_drag · drag by element number, selector, visible text or coordinates — HTML5 drag-and-drop and mouse-driven widgets (sliders, sortable lists) browser_download · download a file (invoices, reports, PDFs…) with your Chrome login, into Downloads or the session's working directory; never overwrites browser_devtools · console output + uncaught JS errors, network requests (status, timing), a request's response body
A freshly installed bundle is not hot-loaded; DSH must be restarted once.
dsh plugin add from the CLI refuses the app-managed profile — use the sidebar there.Plugin updates are not automatic in DSH yet: to upgrade, uninstall and install again.
! = host down, ⏸ = paused).browser_* call without tab keeps using the tab that session opened or last named; if there is none it fails and says so. Acting on your current tab takes an explicit tab="active".cb detach, if the tab is closed, or if you press *Cancel* on Chrome's debugging banner.git clone https://github.com/OrderG-X/dsh-chrome-bridge.git
cd dsh-chrome-bridge
./install.sh # same layout as the plugin's auto-install, plus the manager CLI
./bridge status # repo / installed / running version + connectionThen point DSH at the checkout for the native tools: Plugins → Add plugin → /absolute/path/to/dsh-chrome-bridge/plugin (a link:, so a git pull is enough to update).
cb — from the shellcb status / cb version / cb reload # health, hot-reload the extension after edits
cb tabs # list tabs (* = active)
cb find <keyword> # filter by title/URL
cb info active # title, URL, viewport, pending dialog
cb text active [selector] # visible text (best first read)
cb html active [selector]
cb attr active <selector> <name>
cb wait-for active "<selector>" # wait until it exists and is visible
cb eval active "<js>" # run JS in the page
cb click-el active "<selector>" # real mouse event
cb click-text active "Sign in"
cb click active <x> <y>
cb type active "text" --into "<selector>"
cb key active Enter # combos: "meta+a"
cb focus / cb select / cb upload / cb hover / cb scroll
cb dialog active accept # release an alert/confirm — otherwise the page hangs
cb nav active https://example.com
cb shot active --out /tmp/x.png # --full whole page, --sel "<selector>" one element
cb console active / cb network active --reload
cb cursor active click 400 300 # drive the cursor by hand
cb cdp active Page.reload '{}' # raw CDP escape hatchactive can be replaced by a tab id. Add --json for raw output. Clicks and typing move the visible cursor by default; pass --no-cursor to skip it.
dsh-chrome-bridge status # repo / installed / running version + connection
dsh-chrome-bridge update # sync code + hot-reload the extension (no Chrome clicking)
dsh-chrome-bridge test # end-to-end self test
dsh-chrome-bridge logs # extension log + host log
dsh-chrome-bridge uninstallBe honest about what this is: the extension can read and control every page you are logged into.
0600 and additionally token-guarded. It opens no network listener of its own (the DSH settings card goes through DSH's built-in local web server; that route only accepts loopback, rejects cross-site requests, and cannot resume control).bash. That is what "native" buys you — and it means an unattended agent holds your browser. Disable the plugin in the sidebar if you want that gate back.cb detach .alert() blocks the page: cb info warns you, cb dialog accept releases it.alert() in background tabs until the tab is focused.--load-extension) needs one manual load through chrome://extensions.The DSH browser-plugin space is already busy — these are worth a look:
wc3_* toolsWhat is different here: no listening port (native messaging), real CDP input events via chrome.debugger, and an on-page cursor that shows up in screenshots.
Found a bug or want a feature? Open an issue. Including your DSH and plugin versions helps a lot.
Issues and PRs welcome.
docs/NOTES.zh.md is the running log of every pitfall hit while building this — read it before changing the extension or the plugin; it will save you a day. It also documents a way to verify the plugin without restarting your app (throwaway profile + headless).
MIT licensed.