dsh-plugin-browserskill
Tencent/BrowserSkillBrowserSkill 的 DeepSeek Harness 浏览器自动化桥接插件,通过原生浏览器工具控制可见的 Chrome 和 Edge Agent Window,支持可访问性与 VOM 页面观察、截图、隔离的多会话控制和 Web UI 实时观察浮层。
Web access for DSH agents: fetch JS-rendered / protected pages as clean markdown, aggregated search across 14 engines, and stateful interactive sessions — all against a single-binary Rust browser engine, no local Chrome, no Node runtime.
Every session returns a live view URL: open it in any browser to watch the agent browse frame-by-frame and take over with the mouse. Oversight without screen-sharing.
[0] Learn more with rects) — click by index or coordinates, no DOM-dump spelunking.live_view_url per session — watch, or click into the same session.The plugin talks to an aginxbrowser engine over HTTP. The default is the hosted instance at https://browser.aginx.net; to run your own, see Self-hosting.
Install via dshx — the package is on npm (dsh-aginxbrowser), so the registry tarball works directly (local npm pack tgz and git URL work too):
dshx install aginxbrowser https://registry.npmjs.org/dsh-aginxbrowser/-/dsh-aginxbrowser-0.1.1.tgz
dshx list # should show: [on] aginxbrowserFor DSH Desktop profiles, reference the package under its real name in both places — the package.json dependency key and the dsh.profile.bundles entry:
"dependencies": { "dsh-aginxbrowser": "^0.1.0" }DSH Desktop 2.0.5+ enforces dependency-key == actual package name and drops into recovery mode otherwise.
For developing this plugin against a harness checkout, overlay the source directly:
# cordis.yml
plugins:
'@deepseek-ai/dsh':
$overlay:
- insert:
- id: 'dsh-aginxbrowser': '/absolute/path/to/dsh-aginxbrowser/lib/index.js'pnpm i
pnpm dsh web --patch ./cordis.yml # Web UI at 127.0.0.1:3080key · default · baseUrl · https://browser.aginx.net · Engine base URL. Point at your own instance to run fully local. apiKey · *(empty)* · Bearer token, if the instance requires one. timeoutMs · 90000 · Per-request timeout against the engine. screenshotDir · $TMPDIR/aginxbrowser-dsh · Where agx_session_screenshot writes PNGs.
Read side:
render_tier to force). Cloudflare-style challenges, stealth TLS fingerprints, JS-state extraction (js_extract), background XHR body capture (capture_xhr).fetch_top also pulls top-N page contents.Session side (stateful, indexed, live-viewable):
session_id + live_view_url. Viewport pinning, cookie seeding, persistent (survives restarts), keepalive, mobile emulation.[N] listings with rects; N feeds click/input.wait supports selector or JS predicate; click_xy does full mouse-event fidelity for canvas surfaces.Typical loop: agx_fetch for one-shot reads; for interaction, agx_session_create → agx_session_state → agx_session_click/agx_session_input → agx_session_state again.
agx_session_create returns e.g. https://browser.aginx.net/live.html?session=s_42. The page polls frames from the session and forwards your mouse clicks into it — the same session the agent is driving. Hand it to whoever is supervising the agent.
curl -fsSL https://browser.aginx.net/install.sh | sh # single static binary
AGINXBROWSER_BIND=127.0.0.1:8788 aginxbrowserHomebrew also works (brew install yinnho/tap/aginxbrowser). Then set baseUrl: http://127.0.0.1:8788.
sanitize_report.agx_session_eval results like any other web content: untrusted data.Apache-2.0. Engine source and HTTP API docs: yinnho/aginxbrowser.