{"_id":"@caob23/dsh-browser-control","_rev":"5-5df48654b10171b3962e70ef3baebf01","name":"@caob23/dsh-browser-control","dist-tags":{"latest":"1.0.7"},"versions":{"1.0.3":{"name":"@caob23/dsh-browser-control","version":"1.0.3","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"license":"MIT","_id":"@caob23/dsh-browser-control@1.0.3","maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"homepage":"https://github.com/caob23/dsh-browser-control#readme","bugs":{"url":"https://github.com/caob23/dsh-browser-control/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dist":{"shasum":"090873126a707df6cc49a12c99fdae076865ef15","tarball":"https://registry.npmjs.org/@caob23/dsh-browser-control/-/dsh-browser-control-1.0.3.tgz","fileCount":18,"integrity":"sha512-PfZhpeu76nP3CyaxZFvE5oTARnG11aFD0VQAZVKfkNYr9ofsVnsxqUluljsbi6HaE8tTl+B614gd0P9GlHwmcw==","signatures":[{"sig":"MEUCIBDToIlLXlFLU33o6bPWiRWZAyuIfG+KEnrYotpr8EVqAiEAx5iPxjlKYTSRf0+AjhvlXf1dN54uxwaqvImrszJCPlM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133712},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"gitHead":"246511cb8ccadf86cb586140d61a54e342ecffb5","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run test && npm run build && publint","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"repository":{"url":"git+https://github.com/caob23/dsh-browser-control.git","type":"git"},"_npmVersion":"11.17.0","description":"Local WebSocket bridge between dsh and the DSH Browser Control browser extension, with model-facing browser_* tools and a Settings-managed on/off switch","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.2","vitest":"^4.1.8","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-tools":"^0.1.0-rc.8","@deepseek-ai/dsh-settings":"^0.1.0-rc.8","@deepseek-ai/dsh-invariants":"^0.1.0-rc.8"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-tools":"^0.1.0-rc.8","@deepseek-ai/dsh-settings":"^0.1.0-rc.8","@deepseek-ai/dsh-invariants":"^0.1.0-rc.8"},"_npmOperationalInternal":{"tmp":"tmp/dsh-browser-control_1.0.3_1787484607623_0.3617994441733636","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@caob23/dsh-browser-control","version":"1.0.4","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"license":"AGPL-3.0-only","_id":"@caob23/dsh-browser-control@1.0.4","maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"homepage":"https://github.com/caob23/dsh-browser-control#readme","bugs":{"url":"https://github.com/caob23/dsh-browser-control/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dist":{"shasum":"f5d797c0feffbbd3c18b7362687723e4239b30cb","tarball":"https://registry.npmjs.org/@caob23/dsh-browser-control/-/dsh-browser-control-1.0.4.tgz","fileCount":16,"integrity":"sha512-fdvwMXpqZoK8TpUl65z8ZHRT3RTvSgO4jUH01frrriWyTZ7ncPhlaRtK1fdvYmCwIb64t72jhlA1mDzMZvXQLw==","signatures":[{"sig":"MEUCIQCRe2OPMzPOdA9ldkyNaJHQN023ECkaUfbbcJqE0lax8gIgUTJQhsej29iR4yOT37XbmklbnGlBnKy2NKeCWAG67mg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166461},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"gitHead":"01b72c741b175e329585cf0368f4661ac9484bce","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"repository":{"url":"git+https://github.com/caob23/dsh-browser-control.git","type":"git"},"_npmVersion":"11.17.0","description":"Local WebSocket bridge between dsh and the DSH Browser Control browser extension, with model-facing browser_* tools and a Settings-managed on/off switch","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-tools":"^0.1.0-rc.8","@deepseek-ai/dsh-settings":"^0.1.0-rc.8","@deepseek-ai/dsh-invariants":"^0.1.0-rc.8"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-tools":"^0.1.0-rc.8","@deepseek-ai/dsh-settings":"^0.1.0-rc.8","@deepseek-ai/dsh-invariants":"^0.1.0-rc.8"},"_npmOperationalInternal":{"tmp":"tmp/dsh-browser-control_1.0.4_1787487438207_0.4016326722564374","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@caob23/dsh-browser-control","version":"1.0.5","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"license":"AGPL-3.0-only","_id":"@caob23/dsh-browser-control@1.0.5","maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"homepage":"https://github.com/caob23/dsh-browser-control#readme","bugs":{"url":"https://github.com/caob23/dsh-browser-control/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dist":{"shasum":"b96a0aa8d7465bace62f39a055ad76ec9759473a","tarball":"https://registry.npmjs.org/@caob23/dsh-browser-control/-/dsh-browser-control-1.0.5.tgz","fileCount":16,"integrity":"sha512-L9QWfbSRKjscgaR4GT6WLA7e1xaRKDe4W23wEiS/DhAuomm432pikXVepy/sLVS+pRz34IeSZCxKgcqmJJ9sHg==","signatures":[{"sig":"MEQCIBy7Yw84te15Og0uQPq8q1rCfIOs7v+NEdF0j6CvookcAiB4QY3liTYKpVdE2oXRkX5U71RSLr1vvKbU6BjVLUI9ew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169330},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"repository":{"url":"git+https://github.com/caob23/dsh-browser-control.git","type":"git"},"description":"Local WebSocket bridge between dsh and the DSH Browser Control browser extension, with model-facing browser_* tools and a Settings-managed on/off switch","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-tools":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-settings":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-invariants":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-tools":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-settings":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-invariants":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-browser-control_1.0.5_1788416238737_0.9399282893221825","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@caob23/dsh-browser-control","version":"1.0.6","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"license":"AGPL-3.0-only","_id":"@caob23/dsh-browser-control@1.0.6","maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"homepage":"https://github.com/caob23/dsh-browser-control#readme","bugs":{"url":"https://github.com/caob23/dsh-browser-control/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dist":{"shasum":"ff3b7552e815ea3f747d976b893af528183dda3b","tarball":"https://registry.npmjs.org/@caob23/dsh-browser-control/-/dsh-browser-control-1.0.6.tgz","fileCount":16,"integrity":"sha512-o7G3618HVWkiaKBYboufmChsyKfhmPYa0GBiHJIIvP/1t6DfTO9uUB2OrQQA73/49RbCes/XmX8r4FevJ2tsLQ==","signatures":[{"sig":"MEUCIQD8dbxhbtgsTFatPbNE2OGacn3h1kA+pVmeBU+zyeHY3gIgPUQ9Ofr73xxAb9O4sVdg5ZAMtjpM5iw/TvtMgEYcNoY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169410},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","engines":{"node":"^22.19.0 || >=24.0.0"},"exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"repository":{"url":"git+https://github.com/caob23/dsh-browser-control.git","type":"git"},"description":"Local WebSocket bridge between dsh and the DSH Browser Control browser extension, with model-facing browser_* tools and a Settings-managed on/off switch","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-tools":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-settings":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-invariants":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-tools":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-settings":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-invariants":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-browser-control_1.0.6_1788493609692_0.32534854714515915","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@caob23/dsh-browser-control","description":"Local WebSocket bridge between dsh and the DSH Browser Control browser extension, with model-facing browser_* tools and a Settings-managed on/off switch","version":"1.0.7","type":"module","main":"lib/index.js","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"license":"AGPL-3.0-only","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"scripts":{"build":"tsc -p tsconfig.json && tsdown","typecheck":"tsc -p tsconfig.json --noEmit","check":"npm run typecheck && npm run build && publint"},"engines":{"node":"^22.19.0 || >=24.0.0"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/caob23/dsh-browser-control.git"},"bugs":{"url":"https://github.com/caob23/dsh-browser-control/issues"},"homepage":"https://github.com/caob23/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-invariants":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-settings":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-tools":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0"},"dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"devDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-invariants":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-settings":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@deepseek-ai/dsh-tools":">=0.1.0-rc.1 <0.1.0 || >=0.1.0-rc.1 <0.2.0-0","@types/node":"^22.20.0","publint":"^0.3.21","tsdown":"^0.22.2","typescript":"^6.0.3"},"gitHead":"0e0696c7468e88fb1e77b567d79b57314f30530f","_id":"@caob23/dsh-browser-control@1.0.7","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-ZHGvhvrNi9UQvmDB8t7sUM0R9wZZa02Qa0tQ2fuY2GfLL/XKgXVYdn76e4XOll0lztweduMu0R7ITElX71yMRQ==","shasum":"492f6ed4212e26cfc437ffb18cc314419d143d05","tarball":"https://registry.npmjs.org/@caob23/dsh-browser-control/-/dsh-browser-control-1.0.7.tgz","fileCount":16,"unpackedSize":170347,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFTFr+aGhIYcqVnwYemy/6Cb24sG97LNsuAlm3bSASqfAiEAtnknFUe+feejAaEe7VlWksExM678A9lVXlljjhTFYU8="}]},"_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"directories":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.0.7_1788496004636_0.8362802535690297"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-23T11:30:07.487Z","modified":"2026-09-04T04:26:45.094Z","1.0.3":"2026-08-23T11:30:07.765Z","1.0.4":"2026-08-23T12:17:18.362Z","1.0.5":"2026-09-03T06:17:18.861Z","1.0.6":"2026-09-04T03:46:49.838Z","1.0.7":"2026-09-04T04:26:44.938Z"},"bugs":{"url":"https://github.com/caob23/dsh-browser-control/issues"},"license":"AGPL-3.0-only","homepage":"https://github.com/caob23/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"type":"git","url":"git+https://github.com/caob23/dsh-browser-control.git"},"description":"Local WebSocket bridge between dsh and the DSH Browser Control browser extension, with model-facing browser_* tools and a Settings-managed on/off switch","maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"readme":"# DSH Browser Control\r\n\r\n<p align=\"center\">\r\n  <img src=\"extension/icons/icon128.png\" width=\"100\" alt=\"DSH Browser Control\">\r\n</p>\r\n\r\n<p align=\"center\">\r\n  <a href=\"README.md\">简体中文</a> · <a href=\"README.en.md\">English</a>\r\n</p>\r\n\r\n<p align=\"center\">\r\n  <a href=\"https://github.com/caob23/dsh-browser-control/releases\"><img src=\"https://img.shields.io/github/v/release/caob23/dsh-browser-control\" alt=\"release\"></a>\r\n  <a href=\"https://github.com/caob23/dsh-browser-control/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/caob23/dsh-browser-control\" alt=\"license\"></a>\r\n  <a href=\"https://awesome-dsh-plugin.com\"><img src=\"https://awesome-dsh-plugin.com/badge.svg\" alt=\"Awesome DSH Plugin\"></a>\r\n  <a href=\"https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline\"><img src=\"https://img.shields.io/badge/Chrome-MV3-yellow\" alt=\"chrome mv3\"></a>\r\n  <a href=\"https://github.com/topics/dsh-plugin\"><img src=\"https://img.shields.io/badge/DSH-Plugin-purple\" alt=\"dsh plugin\"></a>\r\n  <img src=\"https://img.shields.io/badge/CDP-powered-orange\" alt=\"cdp\">\r\n  <img src=\"https://img.shields.io/badge/tools-11-red\" alt=\"11 browser tools\">\r\n  <img src=\"https://img.shields.io/badge/tests-29%2F29-brightgreen\" alt=\"tests\">\r\n</p>\r\n\r\nChrome 浏览器扩展 + DeepSeek Harness 插件，让 AI Agent 像人一样操控你的真实浏览器。\r\n\r\n<p align=\"center\">\r\n  <img src=\"assets/banner.png\" width=\"480\" alt=\"DSH Browser Control — a whale searching Google with a mouse\">\r\n</p>\r\n\r\n## 这是什么\r\n\r\n不是无头浏览器，不是 Puppeteer——是你的**真实 Chrome**，带着你的登录态、你的 cookies。AI 通过 Chrome DevTools Protocol 驱动标签页，你可以在屏幕上看到每一步操作。\r\n\r\n```\r\n你对 AI 说一句话\r\n      ↓\r\nAgent 调用 browser_* 工具\r\n      ↓\r\nDSH 插件（WebSocket 桥）\r\n      ↓\r\nChrome 扩展（CDP 驱动）\r\n      ↓\r\n你的真实浏览器执行操作\r\n      ↓\r\n结果返回给 Agent\r\n```\r\n\r\n## 和 MCP 浏览器方案的区别\r\n\r\n市面上已经有 Playwright MCP、Puppeteer MCP、browser-use 等，它们的共同点：启动一个**自己下载的全新浏览器实例**。本项目走的是另一条路：\r\n\r\n| | 本项目 | Playwright / Puppeteer MCP |\r\n|---|---|---|\r\n| 浏览器 | 你正在用的真实 Chrome | 自动下载的独立实例 |\r\n| 登录态 / Cookies | ✅ 全部继承，无需重新登录 | ❌ 每次全新 profile |\r\n| 过验证码 / 扫码登录 | 你的会话已经登录，基本不遇到 | 经常卡在登录墙 |\r\n| 可见性 | 屏幕上实时可见，随时鼠标接管 | 无头运行或独立窗口 |\r\n| 环境依赖 | 无需 Node / npx / Python | 需要 npx 或 uvx 运行时 |\r\n| 接入方式 | 加载扩展 + 设置页开关 | 编辑 MCP 客户端 JSON 配置 |\r\n| 磁盘占用 | 复用现有 Chrome，零新增 | 额外下载数百 MB 浏览器 |\r\n| 集成深度 | dsh 原生插件（设置卡片 / 状态页 / 清理按钮） | 通用 MCP server |\r\n\r\n一句话：**要 AI 用\"你自己的\"浏览器干活（已登录的 B 站、知乎、淘宝后台），用本项目；要做跨浏览器、跨应用的通用自动化测试，用 MCP。**\r\n\r\n## 下载\r\n\r\n| 文件 | 说明 |\r\n|---|---|\r\n| [DSH-Browser-Control-1.0.5.zip](https://github.com/caob23/dsh-browser-control/releases/download/v1.0.5/DSH-Browser-Control-1.0.5.zip) | Chrome 扩展（解压后加载） |\r\n| [dsh-browser-control-plugin-v1.0.5.zip](https://github.com/caob23/dsh-browser-control/releases/download/v1.0.5/dsh-browser-control-plugin-v1.0.5.zip) | dsh 插件（离线兜底，在线装直接用方式 A/B） |\r\n\r\n## 安装 Chrome 扩展（30 秒）\r\n\r\n下载 zip → 解压到固定文件夹（别删）→ Chrome 打开 `chrome://extensions` → 开启「开发者模式」→ 点「加载已解压的扩展程序」→ 选解压后的文件夹。\r\n\r\n工具栏出现鲸鱼图标 → 绿点呼吸 = 已连接。需要 Chrome 116+。\r\n\r\n## 安装 dsh 插件\r\n\r\n📦 本包是 bundle 包（package.json 中 `dsh.bundle.patch` 指向 `cordis.patch.yml`）。`dsh plugin` 安装成功后会自动把它加入 profile 的 `dsh.profile.bundles`，重启即加载。\r\n\r\n前置：`dsh plugin` 转发给 pnpm，需要 pnpm 在 PATH 上；首次使用会自动初始化目标 profile。\r\n\r\n### 方式 A：从 npm 安装（推荐）\r\n\r\n```bash\r\n# 通过 dsh plugin 从 npm registry 安装并自动注册到 profile\r\ndsh plugin --profile web add @caob23/dsh-browser-control\r\n```\r\n\r\n如果自行管理 profile 的 node_modules，也可以在对应目录中直接使用 npm 安装：\r\n\r\n```bash\r\nnpm install @caob23/dsh-browser-control\r\n```\r\n\r\n### 方式 B：从 GitHub 或本地目录安装\r\n\r\n```bash\r\n# 直接从 GitHub 安装\r\ndsh plugin --profile web add \"github:caob23/dsh-browser-control#v1.0.5\"\r\n\r\n# 本地目录调试（注意：必须显式 file: 前缀）\r\ndsh plugin --profile web add \"file:D:\\path\\to\\dsh-browser-control\"\r\n```\r\n\r\n重启 DSH 后生效。卸载：\r\n\r\n```bash\r\ndsh plugin --profile web remove @caob23/dsh-browser-control\r\n```\r\n\r\n> ⚠️ 本地目录请用 `file:` 前缀。裸路径 / 相对路径会被 pnpm 当作 `link:` 协议，\r\n> 在 hoisted 布局下不会物化到 node_modules 顶层，导致启动时无法解析该包。\r\n\r\n安装并重启后，桥接默认开启（v1.0.6+），不需要再去设置里手动启用。状态页 http://127.0.0.1:9777/ 可看到服务已监听。\r\n\r\n> 想关掉默认开启：在 `~/.dsh/settings.yml` 的 `browser-bridge.config` 下写 `enabled: false` 即可。\r\n\r\n### 方式 C：复制进 harness 源码树（旧方式，v1.0.2 及以前）\r\n\r\n```bash\r\ngit clone https://github.com/caob23/dsh-browser-control.git\r\ncd dsh-browser-control\r\ngit checkout v1.0.2   # 旧布局在 v1.0.2 tag\r\n./install.sh /你的路径/deepseek-harness\r\n```\r\n\r\n脚本只负责把插件文件复制到位，**完成后仍需手动改三处配置**，改完重启 dsh 才会生效：\r\n\r\n下载 [`dsh-browser-bridge-plugin-v1.0.2.zip`](https://github.com/caob23/dsh-browser-control/releases/download/v1.0.2/dsh-browser-bridge-plugin-v1.0.2.zip)，解压到 deepseek-harness 的 `packages/web/browser-bridge/`。\r\n\r\n然后补充三处配置：\r\n\r\n1. `packages/bundle/base/package.json` 的 dependencies 加：\r\n\r\n```json\r\n\"@deepseek-ai/dsh-browser-bridge\": \"workspace:^\"\r\n```\r\n\r\n2. `cordis.patch.yml` 的 plugins 列表加：\r\n\r\n```yaml\r\n- id: browser-bridge\r\n  name: '@deepseek-ai/dsh-browser-bridge'\r\n  config:\r\n    enabled: false\r\n```\r\n\r\n3. `tsconfig.host.json` 的 references 加：\r\n\r\n```json\r\n{ \"path\": \"./packages/web/browser-bridge\" }\r\n```\r\n\r\n重启 dsh → 设置页出现「DSH 浏览器控制」→ 开启即可。详细说明见 [dsh-config/README.md](dsh-config/README.md)。\r\n\r\n## 使用\r\n\r\n1. dsh 设置 → 插件 → DSH 浏览器控制 → 开启\r\n2. Chrome 扩展自动连接（端口 9777，Token 默认 dsh-local）\r\n3. 对话说自然语言，Agent 自动操控浏览器\r\n\r\n访问 `http://127.0.0.1:9777/` 查看连接状态。\r\n\r\n## 工具清单\r\n\r\n| 工具 | 功能 |\r\n|---|---|\r\n| `browser_navigate` | 导航到 URL |\r\n| `browser_read` | 读取页面文本/HTML |\r\n| `browser_snapshot` | 页面快照 → ref 交互树 |\r\n| `browser_click` | 点击元素（by ref / selector） |\r\n| `browser_type` | 在输入框填入文本 |\r\n| `browser_press` | 模拟键盘按键 |\r\n| `browser_scroll` | 滚动页面 |\r\n| `browser_tabs` | 标签页管理（列表/新建/关闭/切换） |\r\n| `browser_evaluate` | 执行任意 JS |\r\n| `browser_screenshot` | 截取页面截图 |\r\n| `browser_console_log` | 抓取页面 console 日志（v1.0.7+） |\r\n| `browser_network_log` | 抓取 HTTP 请求/响应（v1.0.7+） |\r\n| `browser_pdf` | 当前页导出 PDF（v1.0.7+） |\r\n| `browser_emulate` | 切设备视口（移动 / 桌面 / 自定义，v1.0.7+） |\r\n| `browser_cleanup` | 清理临时文件 |\r\n\r\n## 架构\r\n\r\n```\r\nChrome 浏览器\r\n  └─ DSH Browser Control 扩展 (MV3)\r\n       └─ chrome.debugger (CDP)\r\n            └─ WebSocket ──────→ DSH 插件 (browser-bridge)\r\n                                      └─ browser_* 工具 → Agent\r\n```\r\n\r\n**关键设计：**\r\n- 扩展主动外连桥（不需要 native messaging host）\r\n- 默认关闭，设置页手动开启\r\n- 持久 debugger 附着——控制期间横幅始终显示\r\n- 仅监听 127.0.0.1，token 认证\r\n\r\n## 已验证\r\n\r\n| 场景 | 结果 |\r\n|---|---|\r\n| 百度搜索 → 提取结果标题 | ✅ |\r\n| B 站搜索用户 → 发私信 | ✅ |\r\n| B 站搜索 → 统计视频卡片 + 截图 | ✅ |\r\n| 单元测试 29/29 | ✅ |\r\n| 类型检查（host + client） | ✅ |\r\n\r\n## 更新日志\r\n\r\n见 [CHANGELOG.md](CHANGELOG.md)。\r\n\r\n## 许可证 · License\r\n\r\n本项目采用 **GNU Affero General Public License v3.0 (AGPL-3.0)**。\r\n\r\n- **个人 / 学术 / 非商业用途**：完全免费，在遵守 AGPL-3.0 的前提下自由使用、修改、分发\r\n- **企业 / 商业用途**：AGPL-3.0 要求通过网络使用本软件也构成\"分发\"，必须公开衍生代码。若企业在闭源产品中嵌入、基于本项目构建 SaaS 服务而不愿开源，需要联系作者获取**商业许可**（另行协商授权条款）\r\n- **商业许可咨询**：[GitHub Issues](https://github.com/caob23/dsh-browser-control/issues) 或邮箱 **caob2333@outlook.com**\r\n\r\n完整许可证文本见 [LICENSE](LICENSE) 文件（AGPL-3.0）。\r\n","readmeFilename":"README.md"}