{"_id":"@angelky7/dsh-browser-control","_rev":"6314859-6ae48ec77a41a79146722c61","dist-tags":{"latest":"1.7.2"},"name":"@angelky7/dsh-browser-control","time":{"created":"2026-10-30T12:34:15.965Z","modified":"2026-11-04T11:32:44.527Z","1.1.0":"2026-10-24T12:09:00.490Z","0.0.0-stage":"2026-10-24T12:08:04.005Z","1.2.0":"2026-10-30T12:33:57.827Z","1.3.0":"2026-11-03T12:32:57.562Z","1.4.0":"2026-11-03T13:10:29.281Z","1.5.0":"2026-11-04T05:10:16.453Z","1.6.0":"2026-11-04T08:52:27.721Z","1.7.0":"2026-11-04T10:01:31.805Z","1.7.1":"2026-11-04T10:29:23.068Z","1.7.2":"2026-11-04T11:32:31.357Z"},"versions":{"1.1.0":{"name":"@angelky7/dsh-browser-control","version":"1.1.0","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"license":"AGPL-3.0-only","_id":"@angelky7/dsh-browser-control@1.1.0","maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"homepage":"https://github.com/angelky7/dsh-browser-control#readme","bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dist":{"shasum":"cbd4c841350eccd4d9dad5029d1bae1a476b3c19","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.1.0.tgz","fileCount":20,"integrity":"sha512-6D+t6uws6Cpx93eRjbWqk8z+DhSF01g+fZceOXf1SBZHlXd7nkN2K6REZu2hhT0PkrByAy7mkFDJ6JZpxVmhwA==","signatures":[{"sig":"MEUCIDZlWJz3/48KfETN0PgEGh1r+WD4nR/+oqVpDtoW1HDsAiEA6E+KuW0+OoRz9EHwmyEYBTBkpdSuw240CR2eP0A9mvs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEiRVaAcWG9PwZ1aYhILqpqZm+SgDmI5ABLwDHSFSMmdAiBBmvQFkqObY3F6/epdIwXX+95/r391HxtUC9s5x9bs9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":326608,"size":102829},"main":"lib/index.js","type":"module","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"},"gitHead":"fd67c307137c29b11f84393d71d4cca3903b052d","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.21.1","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":"22.22.2","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-browser-control_1.1.0_1792843740386_0.6358564897763079","host":"s3://npm-registry-packages-npm-production"},"_cnpmcore_publish_time":"2026-10-24T12:09:00.490Z","publish_time":1792843740490,"_source_registry_name":"default"},"0.0.0-stage":{"name":"@angelky7/dsh-browser-control","version":"0.0.0-stage","_id":"@angelky7/dsh-browser-control@0.0.0-stage","stub":true,"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"dist":{"shasum":"0e55165b2ddd8b4e9d9ec9fe453e8e211dc494f4","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-0.0.0-stage.tgz","fileCount":2,"integrity":"sha512-E5PTADRKUV7fs0tS7aw7BaxnOGMT2z1SVFY8jAAFkF6g20dabvdQkwICzMuiuDVItsUYRbc/d4pz2SzPGaBsdQ==","signatures":[{"sig":"MEUCIQD00HHmlcUfWjQf6c3zyAJWULATa3rqfGb+MgkAwZed7gIgFG8mmXZ0QRwl7M4VjEeg4Ynx+ab/jg/ndsiUuea+OpE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":351,"size":380},"_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"description":"Temporary package placeholder for staged publishing","directories":{},"_cnpmcore_publish_time":"2026-10-24T12:08:04.005Z","publish_time":1792843684005,"_hasShrinkwrap":false,"_source_registry_name":"default"},"1.2.0":{"_id":"@angelky7/dsh-browser-control@1.2.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dist":{"shasum":"fdc2f9fb1cdc8dcb135b3e4a6b1527f7a7396412","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.2.0.tgz","fileCount":20,"integrity":"sha512-Fwrwwy5Vj0Zf0q/a21M4TTiUB6tICK5ZmC39LiouEefeeXJMMmRpbTj3RK3MKP9srWgOOlvr7TF7cXAEU9GMBw==","signatures":[{"sig":"MEUCIHQqqlDuyLJSluOqZAEa9xR4p5i/INkDFmC2rZOly7TQAiEAnM5m8Er55C9pDZppe3UAVjEj78xyFm1UjvVZnsVn/XQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFUUPZh++vfVGJLrI/zi4C3ODiCkW+0fD1EPVprlWRSKAiBV1aOrzmYRC2rdlSN6+fDL5+BVi70u8970NM2wVnNhGg=="}],"unpackedSize":335791,"size":105223},"main":"lib/index.js","name":"@angelky7/dsh-browser-control","type":"module","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"},"gitHead":"ee247d632933eb82025f5a461d2426faa0f63b38","license":"AGPL-3.0-only","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_cookies.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.2.0","_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.12.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":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.2.0_1793363637738_0.3848852106039701"},"_cnpmcore_publish_time":"2026-10-30T12:33:57.827Z","publish_time":1793363637827,"_source_registry_name":"default"},"1.3.0":{"_id":"@angelky7/dsh-browser-control@1.3.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dist":{"shasum":"5d63385ce91ec9ce09c8d407381a1e0dc3f46bc1","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.3.0.tgz","fileCount":20,"integrity":"sha512-ifRqUkhd/KWyWp1aVWrtF3VR946GEWN17EYKM3kAfZIQKZ+tuUvtN8qax3wYGnfw0zcg1r0+8qCx99r9HYstcw==","signatures":[{"sig":"MEUCIF18iuutes5oWsaFbPoEv5EI5p161PcQ20L6vKdcPxq+AiEAkP1fIv8WJgLp3IC7Vd3GhGZvIRBZSICYCUqIIwtOTm0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFZkSsfskrFtGMuLOwihvtQGmABHW9UxRXYzBcHysOt7AiEAthzX+tEgPM4a/PD30YB2LvST5oSKaRQ6QWgtJWGxLlY="}],"unpackedSize":339379,"size":106189},"main":"lib/index.js","name":"@angelky7/dsh-browser-control","type":"module","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"},"gitHead":"e28cb9a5128bf9aa8d7fe00234a96b07a1f480f1","license":"AGPL-3.0-only","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_cookies.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs && node verify/verify_nav_timeout.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.3.0","_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.12.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":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.3.0_1793709177434_0.31860462667131195"},"_cnpmcore_publish_time":"2026-11-03T12:32:57.562Z","publish_time":1793709177562,"_source_registry_name":"default"},"1.4.0":{"_id":"@angelky7/dsh-browser-control@1.4.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dist":{"shasum":"46f1281e2117730e2383a7e8d5c85749867827bd","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.4.0.tgz","fileCount":20,"integrity":"sha512-TkzfU1nuaxi9qf3BoYgmtYCSiCmfIuGRlr9m10vwaX7nvK7lgUESDxNzsiCf/Mcnn3dB3gekyzY3vb0ydLm4Eg==","signatures":[{"sig":"MEUCICIGPOyUKetvAo1+upsOorB8EYLkjBvoeD+v4933VKRTAiEAqF/xqmSpVppQDBWqmCVtRJzlhVxmPMtLGo2PM/XCWzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQClKrmlgGbN/aMaxQiWLtzI9/qFM8vqN57+BKirJAHTBwIhAOy0obY/wKYjg2JESxTvGoefUlg2911tBxeUsDhjeCPN"}],"unpackedSize":344974,"size":107509},"main":"lib/index.js","name":"@angelky7/dsh-browser-control","type":"module","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"},"gitHead":"8c24589c55a9ac7945f1a12e5add585557a05a23","license":"AGPL-3.0-only","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_cookies.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs && node verify/verify_nav_timeout.mjs && node verify/verify_nav_waituntil.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.4.0","_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.12.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":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.4.0_1793711429141_0.8494187107129246"},"_cnpmcore_publish_time":"2026-11-03T13:10:29.281Z","publish_time":1793711429281,"_source_registry_name":"default"},"1.5.0":{"_id":"@angelky7/dsh-browser-control@1.5.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dist":{"shasum":"53ff3f2960768e20e5129e03f58344e93db754b5","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.5.0.tgz","fileCount":20,"integrity":"sha512-NKYgIN5NSbN02KxA8Zr5E2/ESZkFv+BRBG/EzIRVnF9m146T+LceO/0eiqfeTEYE2TOPFEpBUfrDh1iDtsWbIQ==","signatures":[{"sig":"MEYCIQDfeWCDxPRWq+sCO9bQpX52DTDN6iXO6V1i9EhoheWrjgIhAJKE7Z9uRNf6kqZUULX6u44E/THohGiCXSGHzVem+Qlo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCpTr/0Hq3FELEL4EGZUNltQKUNuheTWrxZ8y4AjNfojQIhANWdFto/Gx4KFzr2PMeA9FOmWkdkKGF4QxsStbEexhfJ"}],"unpackedSize":350615,"size":108294},"main":"lib/index.js","name":"@angelky7/dsh-browser-control","type":"module","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"},"gitHead":"8e30bf1333f3fdbeca3267e31f58449fe12a6d62","license":"AGPL-3.0-only","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_cookies.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs && node verify/verify_nav_timeout.mjs && node verify/verify_nav_waituntil.mjs && node verify/verify_archive.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.5.0","_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.12.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":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.5.0_1793769016330_0.601554566274833"},"_cnpmcore_publish_time":"2026-11-04T05:10:16.453Z","publish_time":1793769016453,"_source_registry_name":"default"},"1.6.0":{"_id":"@angelky7/dsh-browser-control@1.6.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dist":{"shasum":"ac0bb01d8508b31a6920f1ec3b1d985bff3c8713","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.6.0.tgz","fileCount":20,"integrity":"sha512-arvBaFqTh/dqwL1o26PKmKbCF7Tp63AEXKPvv2JOQiChOcSyEhF1njIU/hEgj/wpzgQzmGFV4eO6gDQrYM0HwQ==","signatures":[{"sig":"MEYCIQDB1FZN9ldMUldfCGwPrg1sgG2jSj+sUgZNhtWcEo78/AIhAJJHEvs4/RLsyT/sHPgiW4ZIRm9XhVimGbD07My9qJ/w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHBoByn7YaaWM6QiEycZMH6PnI1Yp0oogiciCWVxjyrYAiEAht901ckOL5g4MJDSjG02sIL24jwoWBxCOqlmgwwwMXc="}],"unpackedSize":362298,"size":110882},"main":"lib/index.js","name":"@angelky7/dsh-browser-control","type":"module","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"},"gitHead":"25502180f527e0bbfc4fb5e68b16abbf147c1210","license":"AGPL-3.0-only","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_cookies.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs && node verify/verify_nav_timeout.mjs && node verify/verify_nav_waituntil.mjs && node verify/verify_archive.mjs && node verify/verify_windows.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.6.0","_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.12.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":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.6.0_1793782347614_0.8177406234753383"},"_cnpmcore_publish_time":"2026-11-04T08:52:27.721Z","publish_time":1793782347721,"_source_registry_name":"default"},"1.7.0":{"_id":"@angelky7/dsh-browser-control@1.7.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dist":{"shasum":"602643769b256c2bb4bbd18fe47ebc076b8535e5","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.7.0.tgz","fileCount":20,"integrity":"sha512-500htaDdj0aS+1L+ydXADCCyO+rzUp6UAJVeA0RmSdXQC8yrrIr3nNahk7jHg3d0kD05cQriOTZMfdjlTynUyg==","signatures":[{"sig":"MEQCIGd4GrQXK2lGs3MhnQRb0EtOVGaY3afbJGktNmHcixxkAiALq1TQ6FNhUfiCW/YuR8LdYVf7Bpvh3xKBU5RuQnnfJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDxqhg4IpJJLngiPrrn8T4xTXR/6SfUc43QqcUc/EwKsAIgcEKoGobV69Zz+EGkg3abdGoy44tavlUxPdNes1XvkIM="}],"unpackedSize":369756,"size":112854},"main":"lib/index.js","name":"@angelky7/dsh-browser-control","type":"module","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"},"gitHead":"f15af82ad5dc112c20014d76ca493ffec5b7a74e","license":"AGPL-3.0-only","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_cookies.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs && node verify/verify_nav_timeout.mjs && node verify/verify_nav_waituntil.mjs && node verify/verify_archive.mjs && node verify/verify_windows.mjs && node verify/verify_history_nav.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.7.0","_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.12.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":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.7.0_1793786491598_0.38678216095013784"},"_cnpmcore_publish_time":"2026-11-04T10:01:31.805Z","publish_time":1793786491805,"_source_registry_name":"default"},"1.7.1":{"_id":"@angelky7/dsh-browser-control@1.7.1","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dist":{"shasum":"477250afea48f7d93e8defc14856a227890d6196","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.7.1.tgz","fileCount":20,"integrity":"sha512-n6sA+Wa2GJ4+yWuwtJvaoQdMl2aBJaG/01oOYBVjv5B/ldTY9fJbDDjuwshspy1pIMTB1W1EUPC3zumDFuEwMg==","signatures":[{"sig":"MEUCIQCWtXJNhl9Xi1k2f4V+e7ObX2KI+/3heimu25wGokeqkAIgPLyA2+eirfPz30ISHQG/zKneco2qvTES3Hog3jHUqFA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDvQGaQB5Qg7qe1ctPfObrHm3s0frWxICM3VcbiCt7AlAiEA2s77Fpd9GObGpNI7J3y9WobkQ7ythyGZgyqImwK89h4="}],"unpackedSize":380604,"size":115511},"main":"lib/index.js","name":"@angelky7/dsh-browser-control","type":"module","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"},"gitHead":"7be4cb4bf80c430ee15d4c720cdde1f4501eb9ca","license":"AGPL-3.0-only","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_cookies.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs && node verify/verify_nav_timeout.mjs && node verify/verify_nav_waituntil.mjs && node verify/verify_archive.mjs && node verify/verify_windows.mjs && node verify/verify_history_nav.mjs && node verify/verify_metrics_throttle.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.7.1","_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.12.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":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.7.1_1793788162948_0.41377999781716945"},"_cnpmcore_publish_time":"2026-11-04T10:29:23.068Z","publish_time":1793788163068,"_source_registry_name":"default"},"1.7.2":{"_id":"@angelky7/dsh-browser-control@1.7.2","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"dist":{"shasum":"5cfc5929e7551aaea3f124590c6e622ef937c4b5","tarball":"https://registry.npmmirror.com/@angelky7/dsh-browser-control/-/dsh-browser-control-1.7.2.tgz","fileCount":20,"integrity":"sha512-MSRMxhHDCXitb+8ZzwbAMl92jD/b2bxuampqI3kkHCeTVrJJzzj67+9HF+uOEQmscwRC5QZfl53AH4PsVPcpFQ==","signatures":[{"sig":"MEQCIFTTEF3ywUJkOBTshP2JnW3dW/eZ0QKQRP8OXnsLq2BEAiBWHlE8s0xaz/P/X1XZXD/b2Q/89k94N4EiO6uVX7SkdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDgasa9VjZTBOyPUU5fN698E3k+LXogDE2Va/5PGh6ZeQIhAOcnb6N5jK8jxEFMxRO0WkYiSnnCa6AF8HqmAmRZX4qH"}],"unpackedSize":392961,"size":119665},"main":"lib/index.js","name":"@angelky7/dsh-browser-control","type":"module","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"},"gitHead":"e916303a920dcb15515ea826d6bde905e596e396","license":"AGPL-3.0-only","scripts":{"build":"tsc -p tsconfig.json && tsdown","check":"npm run typecheck && npm run build && publint","verify":"node verify/verify_config_patch.mjs && node verify/verify_peers.mjs && node verify/verify_surface.mjs && node verify/verify_tab_groups.mjs && node verify/verify_tabs_close_many.mjs && node verify/verify_cdp_retry.mjs && node verify/verify_snapshot_ax.mjs && node verify/verify_hard_lock.mjs && node verify/verify_policy.mjs && node verify/verify_cookies.mjs && node verify/verify_extension_e2e.mjs && node verify/verify_plugin.mjs legacy && node verify/verify_plugin.mjs conflict && node verify/verify_plugin.mjs new && node verify/verify_http.mjs && node verify/verify_errors.mjs && node verify/verify_hold.mjs && node verify/verify_protocol.mjs && node verify/verify_bundle_http.mjs && node verify/verify_nav_report.mjs && node verify/verify_nav_landing.mjs && node verify/verify_render_contract.mjs && node verify/verify_press_events.mjs && node verify/verify_nav_timeout.mjs && node verify/verify_nav_waituntil.mjs && node verify/verify_archive.mjs && node verify/verify_windows.mjs && node verify/verify_history_nav.mjs && node verify/verify_metrics_throttle.mjs && node verify/verify_compat_matrix.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.7.2","_npmUser":{"name":"caob23","email":"caob2333@outlook.com"},"homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_npmVersion":"11.12.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":{},"maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"~3.18.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.8.5","tsdown":"^0.22.2","publint":"^0.3.21","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2","@deepseek-ai/dsh-settings":"0.2.0-rc.2","@deepseek-ai/dsh-invariants":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":"~4.0.4","@deepseek-ai/dsh-tools":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-settings":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0","@deepseek-ai/dsh-invariants":"0.2.0-rc.2 || >=0.1.0-rc.1 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-browser-control_1.7.2_1793791951268_0.6550084469236171"},"_cnpmcore_publish_time":"2026-11-04T11:32:31.357Z","publish_time":1793791951357,"_source_registry_name":"default"}},"bugs":{"url":"https://github.com/angelky7/dsh-browser-control/issues"},"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","homepage":"https://github.com/angelky7/dsh-browser-control#readme","keywords":["deepseek-harness","deepseek","dsh","dsh-plugin","browser","browser-automation","cdp","chrome-extension","websocket"],"license":"AGPL-3.0-only","maintainers":[{"name":"caob23","email":"caob2333@outlook.com"}],"readme":"# DSH Browser Control\n\n<p align=\"center\">\n  <img src=\"extension/icons/icon128.png\" width=\"100\" alt=\"DSH Browser Control\">\n</p>\n\n<p align=\"center\">\n  <a href=\"README.md\">简体中文</a> · <a href=\"README.en.md\">English</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/angelky7/dsh-browser-control/releases\"><img src=\"https://img.shields.io/github/v/release/angelky7/dsh-browser-control\" alt=\"release\"></a>\n  <a href=\"https://github.com/angelky7/dsh-browser-control/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/angelky7/dsh-browser-control\" alt=\"license\"></a>\n  <a href=\"https://awesome-dsh-plugin.com\"><img src=\"https://awesome-dsh-plugin.com/badge.svg\" alt=\"Awesome DSH Plugin\"></a>\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>\n  <a href=\"https://github.com/topics/dsh-plugin\"><img src=\"https://img.shields.io/badge/DSH-Plugin-purple\" alt=\"dsh plugin\"></a>\n  <img src=\"https://img.shields.io/badge/CDP-powered-orange\" alt=\"cdp\">\n  <img src=\"https://img.shields.io/badge/tools-11-red\" alt=\"11 browser tools\">\n  <img src=\"https://img.shields.io/badge/tests-29%2F29-brightgreen\" alt=\"tests\">\n</p>\n\nChrome 浏览器扩展 + DeepSeek Harness 插件，让 AI Agent 像人一样操控你的真实浏览器。\n\n<p align=\"center\">\n  <img src=\"assets/banner.png\" width=\"480\" alt=\"DSH Browser Control — a whale searching Google with a mouse\">\n</p>\n\n## 这是什么\n\n不是无头浏览器，不是 Puppeteer——是你的**真实 Chrome**，带着你的登录态、你的 cookies。AI 通过 Chrome DevTools Protocol 驱动标签页，你可以在屏幕上看到每一步操作。\n\n```\n你对 AI 说一句话\n      ↓\nAgent 调用 browser_* 工具\n      ↓\nDSH 插件（WebSocket 桥）\n      ↓\nChrome 扩展（CDP 驱动）\n      ↓\n你的真实浏览器执行操作\n      ↓\n结果返回给 Agent\n```\n\n## 和 MCP 浏览器方案的区别\n\n市面上已经有 Playwright MCP、Puppeteer MCP、browser-use 等，它们的共同点：启动一个**自己下载的全新浏览器实例**。本项目走的是另一条路：\n\n| | 本项目 | Playwright / Puppeteer MCP |\n|---|---|---|\n| 浏览器 | 你正在用的真实 Chrome | 自动下载的独立实例 |\n| 登录态 / Cookies | ✅ 全部继承，无需重新登录 | ❌ 每次全新 profile |\n| 过验证码 / 扫码登录 | 你的会话已经登录，基本不遇到 | 经常卡在登录墙 |\n| 可见性 | 屏幕上实时可见，agent 新建的标签自动归进 `DSH` 分组，随时鼠标接管 | 无头运行或独立窗口 |\n| 环境依赖 | 无需 Node / npx / Python | 需要 npx 或 uvx 运行时 |\n| 接入方式 | 加载扩展 + 设置页开关 | 编辑 MCP 客户端 JSON 配置 |\n| 磁盘占用 | 复用现有 Chrome，零新增 | 额外下载数百 MB 浏览器 |\n| 集成深度 | dsh 原生插件（状态页 / 清理按钮；设置页卡片由宿主版本决定，见下） | 通用 MCP server |\n\n一句话：**要 AI 用\"你自己的\"浏览器干活（已登录的 B 站、知乎、淘宝后台），用本项目；要做跨浏览器、跨应用的通用自动化测试，用 MCP。**\n\n## 下载\n\n| 文件 | 说明 |\n|---|---|\n| [DSH-Browser-Control-v1.7.2.zip](https://github.com/angelky7/dsh-browser-control/releases/download/v1.7.2/DSH-Browser-Control-v1.7.2.zip) | Chrome 扩展（解压后加载；这一版新增 cdp 通道与 capabilities 握手，**必须重装——也是最后一次因功能更新而重装**，此后 CDP 层新能力只更 dsh 插件） |\n| [dsh-browser-control-plugin-v1.7.2.zip](https://github.com/angelky7/dsh-browser-control/releases/download/v1.7.2/dsh-browser-control-plugin-v1.7.2.zip) | dsh 插件（离线兜底，在线装直接用方式 A/B） |\n\n## 安装 Chrome 扩展（30 秒）\n\n下载 zip → 解压到固定文件夹（别删）→ Chrome 打开 `chrome://extensions` → 开启「开发者模式」→ 点「加载已解压的扩展程序」→ 选解压后的文件夹。\n\n工具栏出现鲸鱼图标 → 绿点呼吸 = 已连接。需要 Chrome 116+。\n\n## 安装 dsh 插件\n\n📦 本包是 bundle 包（package.json 中 `dsh.bundle.patch` 指向 `cordis.patch.yml`）。`dsh plugin` 安装成功后会自动把它加入 profile 的 `dsh.profile.bundles`，重启即加载。\n\n前置：`dsh plugin` 转发给 pnpm，需要 pnpm 在 PATH 上；首次使用会自动初始化目标 profile。\n\n### 方式 A：从 npm 安装（推荐）\n\n```bash\n# 通过 dsh plugin 从 npm registry 安装并自动注册到 profile\ndsh plugin --profile web add @angelky7/dsh-browser-control\n```\n\n如果自行管理 profile 的 node_modules，也可以在对应目录中直接使用 npm 安装：\n\n```bash\nnpm install @angelky7/dsh-browser-control\n```\n\n> **刚发布的新版本可能一时装不上，那不是插件坏了。** `dsh plugin add` 会把依赖钉成**确切版本号**，而 pnpm 用的是**你自己配置的源**——国内默认常常是 `registry.npmmirror.com`，它同步官方源有延迟（实测 1.0.10 在官方源已发布时，镜像的 `latest` 还停在 1.0.8）。撞上 `ERR_PNPM_NO_MATCHING_VERSION ... while fetching it from https://registry.npmmirror.com/` 时有三条路：\n>\n> 1. 这一次显式走官方源：`dsh plugin --profile web add @angelky7/dsh-browser-control@<版本> --registry=https://registry.npmjs.org/`\n> 2. 用 Release 里的离线包 `dsh-browser-control-plugin-v<版本>.zip`，解压后对**含有 `package.json` 的那一层**执行 `dsh plugin --profile web add file:<那一层>`（个别版本的 zip 会把条目包进一层子目录，以解压后**含有 `package.json` 的那一层**为准）\n> 3. 等镜像同步后重试原命令：`curl -s https://registry.npmmirror.com/@angelky7/dsh-browser-control`，看到该版本、且 `dist-tags.latest` 也跟上即可\n>\n> **另一种装不上长得像、原因完全不同，别改 registry。** dsh 的 profile 自带 24 小时「包龄」供应链闸门（`node_modules/.pnpm-workspace-state-v1.json` 里的 `minimumReleaseAge: 1440`）。发布未满 24 小时的版本被它拦下时报的是 `ERR_PNPM_NO_MATURE_MATCHING_VERSION`，而且报文里会直接写 `was published at …, within the minimumReleaseAge cutoff (…)`——版本是**存在**的，只是太新。这种只有等满 cutoff 时刻这一条路（改 registry、离线包都不必）。两个码的判据：`NO_MATCHING_VERSION` = 你配置的源里没有这个版本；`NO_MATURE_MATCHING_VERSION` = 有，但没满 24 小时。\n\n### 方式 B：从 GitHub 或本地目录安装\n\n```bash\n# 直接从 GitHub 安装\ndsh plugin --profile web add \"github:angelky7/dsh-browser-control#v1.7.2\"\n\n# 本地目录调试（注意：必须显式 file: 前缀）\ndsh plugin --profile web add \"file:D:\\path\\to\\dsh-browser-control\"\n```\n\n重启 DSH 后生效。卸载：\n\n```bash\ndsh plugin --profile web remove @angelky7/dsh-browser-control\n```\n\n> ⚠️ 本地目录请用 `file:` 前缀。裸路径 / 相对路径会被 pnpm 当作 `link:` 协议，\n> 在 hoisted 布局下不会物化到 node_modules 顶层，导致启动时无法解析该包。\n\n安装并重启后，桥接默认开启（v1.0.6+），不需要再去设置里手动启用。状态页 http://127.0.0.1:9777/ 可看到服务已监听。\n\n> 想关掉默认开启：在你的 profile 覆盖层 `$DSH_HOME/profiles/<名字>/cordis.patch.yml` 里写\n> `- id: browser-bridge` + `config: { enabled: false }` 即可（写法见 [dsh-config/README.md](dsh-config/README.md)）。\n> 注意包内 `cordis.patch.yml` 里那份 `enabled: true` 不要改回 false —— 那会盖掉 schema 默认值，\n> 表现为装上后 9777 无人监听（issue #4）。\n\n### 方式 C：复制进 harness 源码树（旧方式，v1.0.2 及以前）\n\n```bash\ngit clone https://github.com/angelky7/dsh-browser-control.git\ncd dsh-browser-control\ngit checkout v1.0.2   # 旧布局在 v1.0.2 tag\n./install.sh /你的路径/deepseek-harness\n```\n\n脚本只负责把插件文件复制到位，**完成后仍需手动改三处配置**，改完重启 dsh 才会生效：\n\n下载 [`dsh-browser-bridge-plugin-v1.0.2.zip`](https://github.com/angelky7/dsh-browser-control/releases/download/v1.0.2/dsh-browser-bridge-plugin-v1.0.2.zip)，解压到 deepseek-harness 的 `packages/web/browser-bridge/`。\n\n然后补充三处配置：\n\n1. `packages/bundle/base/package.json` 的 dependencies 加：\n\n```json\n\"@deepseek-ai/dsh-browser-bridge\": \"workspace:^\"\n```\n\n2. `cordis.patch.yml` 的 plugins 列表加：\n\n```yaml\n- id: browser-bridge\n  name: '@deepseek-ai/dsh-browser-bridge'\n  config:\n    enabled: false\n```\n\n3. `tsconfig.host.json` 的 references 加：\n\n```json\n{ \"path\": \"./packages/web/browser-bridge\" }\n```\n\n重启 dsh。详细说明见 [dsh-config/README.md](dsh-config/README.md)（注意这一条路径针对 v1.0.2 及以前的旧布局，当时的默认就是 `enabled: false`）。\n\n## 使用\n\n1. 装好即默认开启（v1.0.6+），不需要手动启用\n2. Chrome 扩展自动连接（端口 9777，Token 默认 dsh-local）\n3. 对话说自然语言，Agent 自动操控浏览器\n\n### 「设置 → 插件」里有没有这张卡片，取决于宿主版本（issue #5）\n\nnpm 发布的 bundle 只含宿主侧 `lib/index.js`，没有浏览器端模块，所以卡片不是插件自己画的：\n\n| 宿主 | 设置页 | 改配置的办法 |\n|---|---|---|\n| dsh 0.1.7+ / 0.2.x（dsh-settings 0.1.7-rc.2 起） | 有——宿主按插件自身 `Config` schema 自动投影出这一节 | 设置页，或 profile 覆盖层 |\n| dsh 0.1.2 及更早 | 没有条目（没有客户端半区认领命名空间，宿主就不渲染） | 只能改 profile 覆盖层 `$DSH_HOME/profiles/<名字>/cordis.patch.yml` |\n\n两边都能改的就是配置文件，写法见 [dsh-config/README.md](dsh-config/README.md)。\n\n访问 `http://127.0.0.1:9777/` 查看连接状态。\n\n### 不想让它点，只想让它看：只读档与脚本开关\n\nprofile 覆盖层里给 `browser-bridge` 配两项（完整写法见 [dsh-config/README.md](dsh-config/README.md#两个闸门)）：\n\n```yaml\nconfig:\n  readOnly: true      # 只读：点击/输入/按键/导航/滚动/标签页操作/视口模拟全拒\n  allowScript: false  # 再把 browser_evaluate（在页面里跑任意 JS）关掉\n```\n\n被拦的命令**不会发到浏览器**（零副作用），错误码 `blocked_by_policy`，文案写明改哪个字段。\n注意 `readOnly` 单独打开**不等于**拿掉了任意脚本能力：`browser_evaluate` 能做其它工具能做的所有事，\n所以「能不能执行脚本」是单独一项。这两个开关只管模型那条工具面，HTTP 面（带 token）不受影响。\n\n### agent 开的标签长什么样（自动归进 DSH 分组）\n\nAgent **新建**的标签页会自动收进当前窗口的一个 `DSH` 蓝色标签分组里（每个窗口一组），所以你扫一眼就知道哪些页面是机器开的、哪些是自己开的，事后也能一把清掉：\n\n- `browser_tabs` `action: \"ungroup\"` 拆掉本窗口的组（带 `windowId` 只拆那一个窗口，不带则所有窗口）——只拆标签归属，不关标签。\n- `browser_tabs` `action: \"open\"` 加 `group: false` 可以显式让新标签留在组外；`action: \"group\"` 能把早就存在的散标签拉进来。\n- 归组是锦上添花：Chrome 版本太旧、权限没给、或刚建标签就被用户拖动导致失败时，**开标签本身照常成功**，结果里带 `grouped: false` 和原因。分组动作不改页面内容，重试安全。\n- `browser_tabs` `action: \"close\"` 一次可以关一个（`tabId`）或一批（`tabIds`）；一批在链路上只发**一条命令**。结果把每个 id 的去向都写出来：`closed` / `alreadyGone`（早就没了＝幂等成功，重试安全）/ `failed`（带原因）——部分失败不会被吞掉，单数与批量同一个形状。\n\n### 一键冻结：扩展弹窗里的「锁定」\n\n点扩展图标，按钮行中间那个「锁定」，**单击即生效**：此后扩展对模型**拒绝一切浏览器操作**\n（点击、输入、按键、导航、执行脚本全拦），而 WebSocket 连接照常——调用方看到的是\n「连得上但被冻结」，不是掉线，所以不会误当作网络问题去重试。\n\n- 解锁只有一条路：**在同一个弹窗里点「已锁定」**。桥接侧没有任何解锁命令，模型的工具面里也没有。\n- 冻结状态落在 `chrome.storage.local`，所以 MV3 把 service worker 回收掉也不会「自己解冻」。\n- 万一**读不出**这个状态，扩展按「已冻结」处理（fail-closed）：一个以为锁着、其实没锁的\n  panic switch 等于没有。这时拒绝文案与弹窗都会写「锁状态读不出来」，不会说成「已被用户锁定」，\n  而你照样能在弹窗里点一下把状态写明确。\n- 图标徽标在上锁期间显示红色 `LOCK`，不会继续显示绿色的 `ON` 骗人。\n- 为什么客户端而不是桥接侧管这件事：桥的 token 就写在 profile 的 `cordis.patch.yml` 里，模型读得到也改得动；\n  把「冻结」放在浏览器里、且只留一个人工通道，才真的挡得住。\n\n### 用脚本直连 HTTP（curl 等）\n\n`/api/command` 与 `/api/cleanup` 现在要求 Token，用的就是扩展连 WS 时那个值：\n\n```bash\ncurl -X POST http://127.0.0.1:9777/api/command \\\n  -H 'Authorization: Bearer <你的 token>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"command\":\"nav\",\"params\":{\"url\":\"https://example.com\"}}'\n```\n\n也可以写 `?token=<你的 token>` 或 `X-Token: <你的 token>`。不带、或带错，一律 401；`/` 与 `/api/status` 仍是免鉴权的只读信息。之前「不带 Token 也能调通命令面」的行为已经失效（issue #3 / #6）。状态页上的清理按钮会要求你把 Token 输一次，只记在浏览器会话里。\n\n## 工具清单\n\n| 工具 | 功能 |\n|---|---|\n| `browser_navigate` | 导航到 URL |\n| `browser_read` | 读取页面文本/HTML，正文直接给模型（`offset`/`limit` 窗口，长文分页） |\n| `browser_snapshot` | 页面快照 → 逐条列出 ref 的交互树（`mode:\"ax\"` 走 Chrome 无障碍树，拿 role + 可访问名） |\n| `browser_click` | 点击元素（by ref / selector） |\n| `browser_type` | 在输入框填入文本 |\n| `browser_press` | 模拟键盘按键（回车、Tab、方向键，以及 \"Ctrl+A\" / \"Shift+ArrowRight\" 这类组合键；一次按键只插入一次） |\n| `browser_scroll` | 滚动页面 |\n| `browser_wait` | 等元素出现 / 等文本出现 / 等条件为真（最长 120 秒，v1.0.9+） |\n| `browser_find` | 按 CSS 选择器查元素，返回数量与位置尺寸（只读，v1.0.9+） |\n| `browser_dialog` | 读改原生弹窗应答策略 accept/dismiss/manual，并回最近弹窗记录（v1.0.9+） |\n| `browser_hold` | 在某个标签页上加/撤一层可取消的接管浮层（告知用户 + 防误触）；`covered:false` 时说明盖不住的原因。软层，不是安全边界 |\n| `browser_cookies` | 读/设/删某标签页可见的 cookie（`action: get/set/remove`；get 带 `domain` 过滤，set/remove 需要 `url` 或 `domain` 锚点，remove 复查并回报 `remaining`）。**cookie 的值是凭据**，get 会把值完整放进模型可见文本——见 SECURITY.md |\n| `browser_tabs` | 标签页管理（列表/新建/关闭/切换/归组/拆组；v1.7.0 起支持历史 back/forward——落地判据与 navigate 同一套，历史尽头如实报 unchanged） |\n| `browser_evaluate` | 执行任意 JS |\n| `browser_screenshot` | 截取页面截图（v1.7.0 起回执带**真实像素尺寸**；fullPage 一张截全页、selector 只截一个元素） |\n| `browser_console_log` | 抓取页面 console 日志并逐条给出正文（v1.0.7+） |\n| `browser_network_log` | 抓取 HTTP 请求/响应并逐条给出方法/状态/URL（v1.0.7+） |\n| `browser_network_clear` | 单独清空网络日志缓冲（v1.0.7+） |\n| `browser_pdf` | 当前页导出 PDF（v1.0.7+） |\n| `browser_archive` | 整页存成单文件 MHTML（正文/图片/样式全内联，可当文本 grep 的离线证据；是快照，内嵌脚本不会跑，v1.5.0+） |\n| `browser_emulate` | 切设备视口（移动 / 桌面 / 自定义，v1.0.7+）；v1.7.1 起还能限速：`network` slow3g/fast3g/offline/reset + `cpuThrottlingRate`（1–20），回执写明生效数值，`device:\"reset\"` 一并还原 |\n| `browser_metrics` | 读性能计数器（DOM 节点数 / JS 堆 / 布局与脚本耗时，Performance.getMetrics，只读；让「这页面很重」有数字说话，v1.7.1+） |\n| `browser_windows` | 窗口控制：清单/开窗/改状态与几何/关整窗/跨窗挪标签（唯一能碰窗口几何的工具，v1.6.0+） |\n| `browser_cleanup` | 清理临时文件 |\n| `browser_info` | 报告实际连上的浏览器与扩展版本（排障先跑它，v1.0.9+） |\n\n共 25 个工具。`browser_wait` / `browser_find` / `browser_dialog` / `browser_info` 在 v1.0.8 及以前是「扩展里已实现、但没注册成工具」，agent 调不到；`browser_network_clear` 则是代码里有、这张表漏了。这些现在由 `verify/verify_surface.mjs` 做三方对账（扩展命令表 ↔ 插件调用 ↔ 文档表 ↔ 构建产物），漂移会直接让 `npm run verify` 失败。\n\n## 架构\n\n```\nChrome 浏览器\n  └─ DSH Browser Control 扩展 (MV3)\n       └─ chrome.debugger (CDP)\n            └─ WebSocket ──────→ DSH 插件 (browser-bridge)\n                                      └─ browser_* 工具 → Agent\n```\n\n**关键设计：**\n- 扩展主动外连桥（不需要 native messaging host）\n- 默认开启（v1.0.6+），装上即监听，不需要手动启用\n- 持久 debugger 附着——控制期间横幅始终显示\n- 仅监听 127.0.0.1；命令面（WS 与 HTTP）共用同一个 Token，跨源一律不放行\n- 协议版本独立于版本号：帧契约变了才升，不匹配时状态页直接写出该升级哪一侧\n- **插件升级对旧扩展零倒退**（铁律：插件 x + 扩展 x-n ≥ 插件 x-n + 扩展 x-n）：v1.7.2 起 hello 带 capabilities 精确握手，老扩展走版本映射兜底；缺命令的动作在发送前拦下，给可执行的重装指引而不是裸 unknown command——CDP 层新能力此后只更插件\n\n## 已验证\n\n| 场景 | 结果 |\n|---|---|\n| 百度搜索 → 提取结果标题 | ✅（1.0.x 时期实机） |\n| B 站搜索用户 → 发私信 | ✅（1.0.x 时期实机） |\n| B 站搜索 → 统计视频卡片 + 截图 | ✅（1.0.x 时期实机） |\n| 实测台 `npm run verify`：配置解析、三种宿主形状、HTTP 鉴权与升级来源、发布产物行为 | ✅ 2026-10-10，见 [verify/README.md](verify/README.md) |\n| 实测台 `verify_tab_groups`：agent 标签归组的建组 / 复用 / 退避重试 / 缓存失效 / 按窗口拆组 / 无权限降级 | ✅ 2026-10-11，node:vm + 有状态假 `chrome.tabs`/`chrome.tabGroups`，**未在真实 Chrome 里重跑** |\n| 实测台 `verify_extension_e2e`：真桥 + 真扩展代码 + 真 WebSocket 端到端（帧契约、命令可达、错误分类） | ✅ 2026-10-11，只有 `chrome.*` 是假的；视觉与真实 CDP 行为仍需实机确认 |\n| 实测台 `verify_cdp_retry`：CDP 会话被抢走后的恢复 / 重放不许把副作用做两遍 / 重试有界（6 场景） | ✅ 2026-10-11，真实 `background.js` + 有状态假 `chrome.debugger`；另用合并预览文件交叉验证过 |\n| 实测台 `verify_render_contract`：每条工具的真实返回值同时喂给宿主的输出校验器与它自己的 `render`，断言「模型可见文本里有这次调用真正要的数据」 | ✅ 2026-10-12，真桥 + 假扩展 + 宿主 `validateJsonSchemaValue`；这一层此前**零覆盖**，所以两类缺陷活了 12 / 5 个版本 |\n| 实测台 `verify_compat_matrix`：兼容矩阵——从 git 标签物化**真实历史扩展代码**（v1.2.0–v1.7.1），当前插件对每个面跑 27 个探针逐格验收「≥ 当年组合」；新工具报带重装指引的 extension-outdated、绝不许 unknown command 冒充；命令面 append-only（扩展升级对旧插件也纯增益） | ✅ 2026-11-04，5 面 × 150 项；老 hello 无 capabilities ⇒ 版本映射兜底路径的实测 |\n| **真实宿主 × 真实浏览器**：本机 dsh `0.2.0-rc.2` 用隔离 `DSH_HOME` 挂载本插件，用户的真实 Chrome 连上桥，9 条只读工具全部走真实代码路径 | ✅ 2026-10-12，Chrome 153 + 扩展 1.0.10：`browser_read` 交出 1341 字符真实正文、`browser_snapshot` 交出 14 条带 ref 的清单、输出 schema 零违规；**也正是这一跑发现了旧扩展会静默忽略 `mode:\"ax\"`**（本机扩展是 1.0.10，早于 AX 快照的 1.0.11）——已改成插件侧显式回报 `axFallback` |\n| `tsc --noEmit` + `publint` | ✅ 2026-10-10 |\n\n仓库自 v1.0.4 起不再有单测目录，上面三条浏览器场景是历史实机记录，本版未重跑；本版结论都来自 `verify/` 里可重复执行的实测台。\n\n## 更新日志\n\n见 [CHANGELOG.md](CHANGELOG.md)。\n\n## 许可证 · License\n\n本项目采用 **GNU Affero General Public License v3.0 (AGPL-3.0)**。\n\n- **个人 / 学术 / 非商业用途**：完全免费，在遵守 AGPL-3.0 的前提下自由使用、修改、分发\n- **企业 / 商业用途**：AGPL-3.0 要求通过网络使用本软件也构成\"分发\"，必须公开衍生代码。若企业在闭源产品中嵌入、基于本项目构建 SaaS 服务而不愿开源，需要联系作者获取**商业许可**（另行协商授权条款）\n- **商业许可咨询**：[GitHub Issues](https://github.com/angelky7/dsh-browser-control/issues) 或邮箱 **caob2333@outlook.com**\n\n完整许可证文本见 [LICENSE](LICENSE) 文件（AGPL-3.0）。\n","repository":{"url":"git+https://github.com/angelky7/dsh-browser-control.git","type":"git"},"_source_registry_name":"default"}