Repository navigation
Releases
v0.11.36 — Esc 改为双击/长按接管
0.11.36
浮层的 Esc 改成与双击同一套判据:800ms 内连按两下,或按住 600ms 才接管。
为什么
单次 Esc 在页面里太常见(关弹窗、取消输入、退出全屏)。一下就交出控制权,等于把误触从鼠标搬到了键盘。
改了什么
- 扩展 1.0.38:
Esc的 keydown/keyup 改成「两下或长按」;提示行文案同步为「双击任意处接管页面(键盘:连按两下 Esc 或长按 Esc 接管,Enter 中止)」。 - 插件 0.11.36:
browser_hold的工具描述补一句键盘规则,模型知道等价的键盘操作是什么。
验证
node tests/run-all.mjs:10 套件、326 项断言,exit 0。node --check extension/background.js通过;node scripts/build-release.mjsG1–G8 全过。
资产与校验和
| 文件 | 字节 | SHA-256 |
|---|---|---|
browser-unified-core-0.1.10.tgz |
50370 | 896a3cdb3d8739c90bfa3af41c3f665f958e353804f827deb96cf14a4f81b328 |
dsh-browser-unified-0.11.36.tgz |
235887 | abadd6c51f423e064c789409fcfe78c7cdc727a0ee982bedd4b0b1b61928cdd9 |
dsh-browser-unified-mit-0.1.1.tgz |
65576 | 3879f7340c1bbb3077f8317baf012275ef8ff9441b13fe30e8d9c4c9ad39870f |
DSH-Browser-Control-v1.0.38.zip |
71824 | 74e633711182d53783787c93b9c977048161fd282d3a13dec89823a0168d7f42 |
browser-unified-core.zip |
50550 | ce2c0fdcf8ed3a91c4b6ecae5f6dfb04947bf1ba572adb3e9587d69934a9fcfe |
browser-unified-mit.zip |
69407 | 7458ef22b8678a5c6583efff1b7e8764b2be428eae6830ccd22d8ad732c081bb |
browser-unified-plugin.zip |
255892 | 228925e16ed87d5e0d62cf393fea332bcc1e7988cc622017c6520a899787dfa1 |
扩展已同步到本机加载目录,需要在 edge://extensions 点一次「重新加载」。
v0.11.35 — 设置页列表行改成上下布局
0.11.35
修一个设置页布局 bug:「启动时已展开的组」那一行,列表编辑器的宽度不受控,把左边的标题和说明挤成了竖排(一个字符一行)。
改了什么
Row新增stack模式:标签与说明在上,控件独占下一行;列表编辑器那一行改用它。- 加一条源码级断言钉住这个布局(套件里没有 DOM 渲染器):
stack: true出现在那一行、props.stack === true分支存在。 - 版本 0.11.35(0.11.34 已发布,不改已发资产)。扩展没有改动,仍是 1.0.37。
验证
node tests/run-all.mjs:10 套件、326 项断言,exit 0。node scripts/build-release.mjs:G1–G8 全过。
资产与校验和
| 文件 | 字节 | SHA-256 |
|---|---|---|
browser-unified-core-0.1.10.tgz |
50370 | 896a3cdb3d8739c90bfa3af41c3f665f958e353804f827deb96cf14a4f81b328 |
dsh-browser-unified-0.11.35.tgz |
236025 | 42db220e3dd8a8d553764bea82c1acc9c434bd376f4761328675cef275e56be3 |
dsh-browser-unified-mit-0.1.1.tgz |
65746 | 1e45695cdcd3f6825f67f97a564810b2d71475b2fa5d318c2bf3b8cd50586205 |
DSH-Browser-Control-v1.0.37.zip |
71494 | b763f41d0eecbb154dde6f9fb887e1fbb9eddbc480d7a4bfcea95541a2df1d6c |
browser-unified-core.zip |
50550 | ce2c0fdcf8ed3a91c4b6ecae5f6dfb04947bf1ba572adb3e9587d69934a9fcfe |
browser-unified-plugin.zip |
255985 | 3484486bf44afcbf3f865ea76a9fad129a80cd6910472b209d8582c54ef05bb7 |
browser-unified-mit.zip |
69586 | c9d172ce7464f749d615e3d2e8620137ac86fe44936e06e9c0d7f77e0a23563a |
装法(两个 tgz 一起,然后重启 dsh web):
dsh plugin --profile web add \
file:/abs/path/browser-unified-core-0.1.10.tgz \
file:/abs/path/dsh-browser-unified-0.11.35.tgzv0.11.34 — 文案审计 + 英文 README + 安装步骤修正
0.11.34
文案审计(插件 + 扩展)+ 英文 README 作为主 README + 安装步骤修正。
改了什么
- 扩展 1.0.37:弹窗里那两处字面
**去掉;锁定提示改成准确说法(「拒绝模型的全部浏览器命令」,不是「拒绝一切操作」)。 - 设置页文案:默认展开的 6 条长说明压到 45 字内,细节移进包内 README「设置项细节」一节;去掉「同伴件已于某日合并」「namespace 未暴露或 memory 模式」这类内部话;英文侧补齐 18 个缺键(以前英文环境会出现英文标题配中文说明)。
- 31 条模型可见的工具描述:改为英文(与 DSH 本身一致),删掉历史与实现细节,
browser_frames原本指向不存在的browser_frame_eval文字错误一并修正。逐条对照见仓库docs/copy-review-2026-10-18.md。 - README:英文版成为主
README.md,中文移到README.zh.md;上游与前身写成带链接的形式(caob23/dsh-browser-control等)。 - 安装步骤修正:
dsh plugin add github:Short-Arm-Ape/dsh-browser-unified不能用——仓库根目录不是包,实测(pnpm 12.5.1)装出@short-arm-ape/dsh-browser-unified@0.0.0占位包,没有lib/也没有dsh.bundle.patch。文档改为 Release 资产 +file:的正确命令。
验证
node tests/run-all.mjs:10 套件、325 项断言,exit 0。node scripts/build-release.mjs:G1–G8 全过(产物与源码一致、registry 三副本一致、扩展 zip 头与条目形态、版本号对齐、dsh --dump-config零跳过)。- 扩展已同步到本机
D:\edge-extensions\dsh-browser-extension,需要在edge://extensions点一次「重新加载」。
资产与校验和
| 文件 | 字节 | SHA-256 |
|---|---|---|
browser-unified-core-0.1.10.tgz |
50370 | 896a3cdb3d8739c90bfa3af41c3f665f958e353804f827deb96cf14a4f81b328 |
dsh-browser-unified-0.11.34.tgz |
235556 | 2c5aa93d5c67d676508029e0bfc80803dd1c78d6f06b642bb1774ba190ce85a3 |
dsh-browser-unified-mit-0.1.1.tgz |
65746 | 1e45695cdcd3f6825f67f97a564810b2d71475b2fa5d318c2bf3b8cd50586205 |
DSH-Browser-Control-v1.0.37.zip |
71494 | b763f41d0eecbb154dde6f9fb887e1fbb9eddbc480d7a4bfcea95541a2df1d6c |
browser-unified-core.zip |
50550 | ce2c0fdcf8ed3a91c4b6ecae5f6dfb04947bf1ba572adb3e9587d69934a9fcfe |
browser-unified-plugin.zip |
255539 | 9a8e12b0a5a2d296d1e760c6b70fdbb5375dfbfef45eacc9efaa48d9cb5f1da1 |
browser-unified-mit.zip |
69586 | c9d172ce7464f749d615e3d2e8620137ac86fe44936e06e9c0d7f77e0a23563a |
插件装法(两个 tgz 一起):
dsh plugin --profile web add \
file:/abs/path/browser-unified-core-0.1.10.tgz \
file:/abs/path/dsh-browser-unified-0.11.34.tgz然后重启 dsh web。
0.11.33 — overlay, hard lock, permissions
Overlay tool, extension hard lock, read-only/script permissions, working update check. Verification: 10 suites / 322 assertions green; real-browser rig 26/26 + 20/20 + 5/5.
feat(release): 发布流程脚本化 + 扩展源码入库(0.11.20 资产)
dsh-browser-unified 0.11.20 发布说明
跟进上游 caob23 v1.0.8 的安全强化 + 发布流程可复现化(de-037)
版本
| 包 | 版本 | 说明 |
|---|---|---|
dsh-browser-unified |
0.11.20 | 插件壳(27 个 browser_* 工具) |
browser-unified-core |
0.1.4 | 合并核心(URL 策略 / 审批 / 收编桥,AGPL-3.0-only) |
dsh-browser-unified-mit |
0.1.0 | MIT 版(不含桥与驱动工具) |
浏览器扩展 extension/ |
1.0.19 | MV3,本次起随仓库发布(原先在仓库外维护) |
变化
1. 跟进上游 v1.0.8 的安全强化(core 0.1.4)
上游 2026-10-10 发布 v1.0.8,其中两条与我们 2026-09-25 独立发现并修过的问题同类
(他们的 #3/#6:HTTP 面无鉴权 + Access-Control-Allow-Origin: *),且修得更全。本轮并入:
- WebSocket 升级加
Host回环校验 +Origin校验 —— 挡 DNS-rebinding(公网域名解析回
127.0.0.1)与「网页直接拨号」(WS 握手不受 CORS 约束;而桥的默认 token 是公开的dsh-local)。 - HTTP 面 token 形式对齐上游:
Authorization: Bearer/X-Token/?token=,比较用timingSafeEqual
(我们额外保留旧的X-DSH-Token,兼容既有脚本)。 - 所有 JSON 响应不再发
Access-Control-Allow-Origin: *;/api/status改为只对回环来源回显
(GUI 设置页的只读探测依赖它,公网网页读不到)。
我们另外自己修的两条(登记为 bi-031 / bi-032):
- 状态页曾把 token 内嵌进 HTML —— 任何能
GET /的本机程序都能拿到唯一凭据;现改为
sessionStorage + 现问,清理按钮走Authorization: Bearer。 - 弱 token(内置默认或短于 16 字符)现在启动时告警,状态面新增
insecureToken(告警不拒启,
与上游同口径;拒绝启动会让所有现存配对当场断连)。
保留的差异:① guardCommand 策略钩子(HTTP 命令面也要过 URL 策略,上游只做鉴权不做策略);
② 空 token = 不校验(向后兼容);③ /api/status 的回环 CORS 回显;④ hello 多一个 extensionId。
2. 扩展源码迁入仓库(extension/)
扩展此前在仓库外维护(与上游扩展已分叉到 1.0.19),导致 Release 里的扩展无法从 tag 复现,
也不满足 AGPL「给二进制就要给对应源码」。现在源码在 extension/,归属登记在
NOTICE.md 第 5 条。它是能力完整性的前提:browser_frames / browser_frame_eval、
自动拉起的「扩展自建窗口」路径(window.ensure)、端口自动发现、导航完成判定、
div 化 SPA 元素识别(cursor:pointer 样式边界)都只有本版扩展提供。
3. 发布流程改成脚本 + 闸门(scripts/build-release.mjs)
不再「把 packages 下三个文件夹压成 zip」(0.6.1 的形态:会把 .npm-cache/ 88 条一起发出去,
且产物与源码的一致性无人把关)。新脚本产出并自检:
dist-release/
browser-unified-core-0.1.4.tgz + .sha256
dsh-browser-unified-0.11.20.tgz + .sha256
dsh-browser-unified-mit-0.1.0.tgz + .sha256
DSH-Browser-Control-v1.0.19.zip + .sha256 ← 扩展(PK 头 + 正斜杠)
browser-unified-{core,plugin,mit}.zip + .sha256 ← 兼容旧资产名:只含对应 tgz + README
INSTALL.md
闸门(任一不过即非零退出,不出半套资产):
| 闸门 | 抓什么 |
|---|---|
| G1 | core dist/ 存在且含本轮新代码(防"忘构建 → 发空包";dist/ 不入库) |
| G2 | plugin / mit 的 lib/ 工具集 == src/ 工具集(防"入库的 lib 落后 src" —— 上游 v1.0.7 就是这么发出 11/16 个工具的) |
| G3 | core 与 mit 的共享逻辑只比代码行(忽略许可头/模块名)一致(防 MIT 版悄悄漂移) |
| G4 | design/registry.json 与 upstream-baseline.json 的三份副本(根 / plugin / mit)一致 |
| G5 | 扩展:manifest 版本、图标 16/48/128 齐全、无 .map 等垃圾 |
| G6 | 每个 zip:PK\x03\x04 头 + 正斜杠条目 + 不含 .npm-cache / node_modules / *.tgz |
| G7 | 资产名里的版本 == package.json 版本 |
| G8 | dsh --profile web --dump-config 零 skipping profile bundle |
脚本自带的 zip 写入器是自己实现的(Node + zlib):PS 5.1 的 Compress-Archive 会写反斜杠条目,
而 Windows 资源管理器只认文件头 + 正斜杠(上游 issue #2 的教训)。产出后用 Python zipfile.testzip()
与 Info-ZIP unzip -t 双重复核过,且扩展 zip 解压后与 extension/ 逐字节一致。
4. 包内 patch 默认改为 enabled: true
包内 cordis.patch.yml 原本写死 enabled: false:显式值会覆盖 schema 默认值(本来就是 true),
于是「装上即用」变成「装上没监听 9777、扩展报 ERR_CONNECTION_REFUSED」—— 正是上游 v1.0.8 修
issue #4 的同一个坑。现在默认开;关掉的正确位置是 profile 层或设置页(优先级更高)。
实测(模拟全新安装:profile 层不写 browser-bridge 行):桥照样起来,且 9777 被占时自动顺延到 9778。
上游采纳 / 归档
- 归档刷新:caob23
2763148(v1.0.7) →43e6325(v1.0.8);short-arm-aped3f63d4→81df0d5
(README 停维护横幅,源码面仍 0.1.0)。旧快照备份在..\__archive-backups\。 scripts/check-upstream.ps1修复三处自伤(无 UTF-8 BOM → PS 5.1 解析错;Get-Content按 ANSI 读
UTF-8 JSON →ConvertFrom-Json抛错;git 参数只用http.sslBackend=openssl→ 五个上游全部误报
UNREACHABLE),并钉 UTF-8 输出编码。修后实测 5/5 UP-TO-DATE。- 登记簿:新增
de-037(本次)、bi-031/bi-032(上面两条安全缺陷);de-006前提更正 ——
上游 CHANGELOG 明确allowEval从未实现过,该条性质由「恢复上游能力」改为「本仓库自有功能」。
验收
- WSL 活体:插件 0.11.20 + core 0.1.4 装机;探针实例
exit=124、stderr 0 行、0 跳过;
9777 实测:无 Origin 不回 ACAO / 回环来源回显 / 公网来源不回收 /OPTIONS204 且无 CORS /
无 token 401 / 带 token 503(阳性对照)/ WS 坏 Host 403 / 网页 Origin 403;扩展重连正常。 - 测试:7 套 190 项全绿(tool-render 61、permissions-read 23、permissions-resolve 13、
registry-consistency 18、buddy-merged 21、render-settings-pages 22、bridge-http-auth 32)。 - 发布脚本:G1–G8 全通过;4 个 zip 经 Python/Info-ZIP 双重复核;7 个资产 sha256 校验通过。
已知 / 未做
de-005页面级逐请求拦截(route 化)仍未实现(设计 accepted)。- 上游
verify/那套「装载产物实测台」我们只覆盖了一部分(G1/G2/G6 是它的等价物),
发布前建议仍手工跑一遍 7 套测试。 - 状态页/设置页里显示的 token 强度依赖配置:本机当前是默认
dsh-local,建议改强随机值。
安装方法
1. 浏览器扩展(必须换成本版,否则部分工具不可用)
下载 DSH-Browser-Control-v1.0.19.zip → 解压到任意目录 →
edge://extensions(或 chrome://extensions)开「开发者模式」→「加载解压缩的扩展」→ 选该目录。
然后点扩展图标,填桥的端口(默认 9777)与 token。
与上游 caob23 版同协议,但本仓库的扩展多了 frames / 自建窗口 / 端口自动发现 /
导航完成判定 / div 化 SPA 元素识别等改动,配套本插件请使用本版。
2. 插件(两个包一起装)
pnpm add <path>/browser-unified-core-<ver>.tgz
pnpm add <path>/dsh-browser-unified-<ver>.tgz装进 DSH profile(推荐用 CLI,它会落到 profile 的 vendor/ 并改 package.json):
dsh plugin --profile <profile> add file:<path>/browser-unified-core-<ver>.tgz \
file:<path>/dsh-browser-unified-<ver>.tgz然后在 profile 的 cordis.patch.yml 里给 browser-bridge 配好 enabled / port / token
(本版包内 patch 默认 enabled: true),重启 dsh web。
重启后自查:browser_policy_status/browser_tools action=status 应显示桥已监听、
扩展已连接;状态页 http://127.0.0.1:9777/ 可看端口/扩展版本/令牌强度。
3. MIT 版(可选)
只想要 URL 策略 / 审批 / 自更新与设计注册表这几个模块、且不能接受 AGPL 的用户,
装 dsh-browser-unified-mit-<ver>.tgz(不含桥与 browser_* 驱动工具)。
4. 校验
每个资产都有同名 .sha256:
sha256sum -c browser-unified-core-<ver>.tgz.sha256
# Windows: certutil -hashfile <file> SHA2560.6.1
适配上游浏览器扩展版本为1.0.7,若后续未说明新的版本号默认指此版本。
下载地址:Release v1.0.7 · caob23/dsh-browser-control