deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
A DeepSeek Harness browser visualization plugin: opens a real, visible Chrome window per session, lets the agent drive the browser through the
chrome_*tool suite, and streams the live view into a Chrome tab in the Web GUI — take over manually at any time.
![]() |
![]() |
chrome_open / chrome_status / chrome_close / chrome_navigate / chrome_tabs / chrome_snapshot / chrome_screenshot / chrome_click / chrome_click_at / chrome_fill / chrome_type / chrome_press_key / chrome_hover / chrome_scroll / chrome_evaluate / chrome_wait. chrome_tabs covers list / new / close / select, and snapshots, screenshots and clicks always act on the selected tab.chrome_snapshot returns a compact a11y tree with stable element uids; clicks and fills target uids directly — far lighter than DOM dumps and robust against fragile selectors.chrome_screenshot sends the image into the model context (as an image block) AND saves it to the session's screenshot history shown in the panel — history entries keep title/URL/size metadata across restarts. (Running a text-only model? See the FAQ.)chrome_close closes explicitly, and plugin unload / host shutdown closes every window it opened.Prerequisites: DeepSeek Harness (DSH) installed, and Chrome or Edge on the machine.
# Option 1: install from GitHub (recommended)
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:jiaererw/dsh-plugin-chrome
# Option 2: local path (development)
npx -p @deepseek-ai/dsh dsh plugin --profile web add D:/harness/dsh-plugin-chrome
Restart DSH after installing — a Chrome tab appears at the top of every conversation.
If your profile's
cordis.patch.ymlstill carries an old manual mount line fordsh-plugin-chrome(from local development), remove it before installing through the CLI to avoid double-mounting.
The agent gets the chrome_* suite automatically. Just ask it:
Open Chrome, go to https://example.com, take a screenshot, then click the "Login" button and fill in the username.
The agent will: chrome_open → chrome_navigate → chrome_screenshot (sees the image) → chrome_snapshot (gets uids) → chrome_click / chrome_fill.
chrome_screenshot is stored in the panel; click a thumbnail to enlarge.chrome_* call (or the panel's Open button).DevToolsActivePort and takes the window over instead of failing (the same autoConnect idea as chrome-devtools-mcp).idleTimeoutMs (default 10 min) closes automatically — never while a Web UI viewer is watching.chrome:// internal pages never dead-ends.Override the plugin row in the profile's cordis.patch.yml (config is replaced wholesale):
- id: dsh-plugin-chrome
config:
headless: false # keep false — a visible window is the point
executablePath: '' # empty auto-detects Chrome/Edge; or set an absolute path
idleTimeoutMs: 600000 # idle auto-close (0 disables)
windowWidth: 1280
windowHeight: 900
screencastFrameSkip: 4 # live-view frame decimation (1 = smoothest)
screencastQuality: 70 # JPEG quality 1-100
maxSnapshotText: 60000 # max chars per snapshot
maxTabs: 16
extraArgs: '' # extra Chrome launch flags
Data directory (browser profiles & screenshots): ~/.dsh/data/dsh-plugin-chrome/sessions/<sessionId>/ (override with dataRoot).
chrome_snapshot.chrome_* call or the Open button relaunches it.chrome_screenshot delivers the picture as an image block into the conversation history. If the session's model does not accept images, every following turn is rejected with UNSUPPORTED_CONTENT: does not accept image input and the session no longer responds — retrying doesn't help. Use a vision-capable model for sessions that screenshot, or avoid chrome_screenshot there.dsh-plugin-chrome: true to allowBuilds in the profile's pnpm-workspace.yaml and retry the install.npm install
npm run typecheck # host + client programs
npm test # vitest unit tests
npm run test:e2e # real-Chrome end-to-end smoke (pops a visible window)
npm run build # lib/index.js + lib/index.d.ts (host), lib/client.js + lib/client.d.ts (client bundle)
npm run watch # continuous build; client changes hot-reload, host changes need a DSH restart
Architecture: the host half (cordis plugin) drives the local Chrome through puppeteer-core, registers the chrome_* tools and the /dsh-chrome/* HTTP/WS API; the client half (browser bundle) registers the Chrome tab on conversation.view and consumes the API and the frame stream. The picture = native Chrome screencast (active pages) + screenshot heartbeat (idle fallback). The control layer borrows proven designs from chrome-devtools-mcp (CDP control, a11y snapshots with uid lookup, wait discipline, autoConnect adoption) and mcp-chrome (screenshot compression, CDP coordinate input, session refcounting).
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。