Repository navigation
Conversation
Adds three user-facing capabilities on top of the existing text-only browser bridge, all opt-in and all gated by the extension's per-call approval: - Developer tools (Chrome DevTools Protocol): an opt-in group that exposes Elements/Console/Network inspection (computed styles, box model, matched rules, live CSS/attribute edits, page-context JS evaluation, recorded console output, captured requests and bodies with credential headers redacted by default) plus a character budget (devToolsMaxChars) for the results. - Viewport screenshots: browser_screenshot captures the controlled tab and returns an image, with host permissions widened to <all_urls> and an approval required on every call. - Panel composer controls: permission modes, model strength, and the / command menu in the side panel, backed by new host methods (permission.catalog, session.permissions, session.setPermission, commands.list, commands.execute, skills.list) that are never offered to the model as tools; image paste and drag-drop attachments in the composer. Extension and bridge tests cover each area (devtools controller/elements/network/ serialization/authorization, screenshot, panel api/commands/composer/permissions/ image transfer, remote-host-api, session deferral), and the smoke script exercises the new host methods.
上游自 2026-10-01 起无提交、最后 release 为 v0.1.3,本 fork 暂时承担维护并 把更新源指向自己;对上游的改动统一走 omdsh-dev/dsh-browser 这条 PR 承载分支, 当前对应 issue omdsh-dev#120 与 PR omdsh-dev#121。
概述 / Summary新增可选的开发者工具组:查看与修改元素样式、在页面中执行 JS、抓取网络请求。默认关闭,需要额外授权。
动机 / Motivation参考 #114 现有工具读不到计算样式与布局信息,样式类问题只能得到"页面上有这些元素",无法回答"为什么是这个尺寸""被哪条规则覆盖",这类问题以前直接走进死胡同。 改动内容 / ChangesHost 侧(bridge-browser):
扩展侧(dsh-browser):
两条实现说明:
测试 / Testing
新增用例覆盖:debugger 会话生命周期、网络抓取的事件处理(含 ExtraInfo 情形)、元素定位与样式修改、授权策略("完全控制浏览器"与来源白名单都不覆盖该组)、manifest 的平台差异。 Chrome 实测:查看元素计算样式与命中规则;加一条 outline 后回读确认样式属性已写入;控制台执行 JS 并读回 JSON 与一个带栈的未捕获异常;抓取一次 fetch 的状态、头、时序与格式化后的 JSON 响应体。 影响范围 / Impact
|
概述 / Summary新增 改动内容 / Changes截图工具:
审批:
侧栏:
测试 / Testing
影响范围 / Impact
|
概述 / Summary侧栏输入区现在可以直接选择会话的权限模式、选择模型及其推理强度,并支持输入 动机 / Motivation面板是用户唯一持续可见的操作面,但它的表达力长期只有"发一条消息"。要换模型、收紧权限、跑一条 host 命令,用户只能离开面板。把这些控件补齐,面板才真正覆盖日常操作。 改动内容 / Changes输入区控件:
Host 侧新增六个面板专用方法,只服务于侧栏 UI,不作为工具暴露给模型:
测试 / Testing
新增用例: 影响范围 / Impact
|
|
注意到 #116 也实现了截图能力。对比了两边的实现,主要差异如下: 图片交付:#116 将像素写入本地文件、向模型返回路径,页面通道保持纯文本优先;本 PR 将图片存入附件存储后以内容块直接进入模型上下文。由此本 PR 每次截图少一次工具调用——#116 的模型拿到路径后,需再调用读文件工具才能看到图片;连续多张截图时该差异会成倍放大。纯文本模型由运行时投影为占位符,不受影响。 权限路线:#116 采用 optional 审批:本 PR 对每次调用弹出侧边栏审批,仅"完全控制浏览器"可跳过。 受保护页面:chrome:// 等页面上所有工具均被扩展拒绝执行;#116 单独放行截图( 附带改动:本 PR 另包含侧边栏粘贴、拖拽添加图片。 |
dsh 0.2.1 把 Gateway/Connection 的调用方身份改成必填:wireStream.open、invoke、 createSharedFetchHandler().fetch 都必须显式传入 PeerScope,缺失时会在 Gateway 内部 以 stream-failed 崩掉(Cannot read properties of undefined (reading 'signal'))。 bridge 现在通过 connection.createPeer 自建一个 owner principal、interactions=answer 的 in-process Peer,统一用于每次调用、 流和 /result 回传。 同时跟随 0.2.1 的插件契约变化: - 移除运行时 invariant 插件与 ./invariant 导出(0.2.1 已删除该扩展点) - 清单补 dsh.manifestVersion=1、engines.dsh 与 node 引擎范围 - 新增 locale/en.json、locale/zh.json 与 icon.svg,供插件页展示 - session-persistence-jsonl 改为 function-style 插件,测试改用命名空间导入 - smoke 断言改为:keepInbox 下未认领的页面快照跨重启保留,不再被取消
概述 / Overview浏览器桥插件与扩展跟上了 dsh 0.2.1 的插件接口:在新版 dsh 上恢复加载、建立连接并调用浏览器工具,同时在插件管理页显示自己的标题、简介与图标。 动机 / Motivationdsh 0.2.1 收紧了插件契约:Host 调用与流需要显式的调用方身份(Peer)、运行时 invariant 扩展点被移除、会话持久化后端改为函数式插件、插件清单新增版本与本地化字段。未适配的插件在握手后第一次 Host 调用就会失败,用户侧表现为侧栏一直「重连中」、所有浏览器工具不可用。 改动内容 / Changes
测试 / Testing
影响范围 / Impact
|
DSH Desktop 启动 Host 时固定 `--port 0`,本地 Web 端口每次启动都由系统 随机分配,扩展原有的固定端口探测(3080/3081/3090/14389)无法命中。 - 桥接插件新增固定回环信标:在 43189–43198 范围内取第一个空闲端口回答 `/ext/bridge-config`,通告真实桥地址与进程元数据(pid/启动时间);只绑 127.0.0.1、不发 CORS 头、校验 Host 头(防 DNS rebinding)、不携带 token, 端口冲突按序重试,全部被占只告警不影响桥。 - 扩展启动顺序:已填地址优先(回环地址先预检);失败才做一次自动探测 (上次地址 → 默认端口 → 信标端口 → 扫描平台临时端口区间),命中即连; 全空显示「未找到服务」并在本次面板租约内不再重试。 - 设置页新增「自动检测」:手动触发完整枚举(必定扫全区间、不早退), 列出本机所有实例(地址/来源/PID/当前使用),点击条目填入地址;地址仍可 手动填写。 - 协议仅新增可选字段(pid/startedAt/beacon、status.discovery/address 与 discovery.* 面板消息),旧版本互相兼容。 - 测试:新增信标、端口区间、探测编排、面板交互用例;smoke 在真实 dsh `--port 0` 下断言信标返回同一桥地址。 验证:pnpm run typecheck、pnpm run test(桥 208 / 扩展 572)、pnpm run build、 node scripts/smoke-runtime.mjs 全部通过。
概述 / Overview侧栏现在能在 DSH Desktop 每次启动随机分配端口的情况下重新找到本机 dsh:桥接插件新增固定回环信标,扩展在打开面板时只自动探测一次,设置页新增「自动检测」可列出本机所有实例并点选填入地址。 The side panel now finds a local dsh even though DSH Desktop assigns a new random port on every launch: the bridge plugin advertises a fixed loopback beacon, the extension makes a single startup pass, and Settings → Detect lists every local instance so you can pick one. 动机 / MotivationDSH Desktop 用 改动内容 / Changes
测试 / Tests
影响范围 / Impact
|
agent-loop 在优雅关闭时调用 machine.cancel({ kind: 'disposed' }),不带
keepInbox(只有用户的停止按钮会保留待处理输入),所以未认领的页面快照会被
记成一条 canceled 的 agent/inbox/spliced。原断言假设 dsh 会用 keepInbox 保留,
与 0.2.1-rc.2 的实际行为相反,导致 test:smoke 在 main 上一直失败。
断言改为校验真实契约(恰好一条 canceled splice、removedCount=1);信标探测在
本机已有其他 dsh 占用更早端口时,优先选择指向本次 host 的应答。
content-selection.spec.ts 每个用例都新建 SelectionWatcher 但从未 disarm。 watcher 残留的 selectionchange 监听与 debounce 定时器可能跨到 jsdom 环境销毁 之后才触发,CI 偶发报 unhandled ReferenceError: document is not defined (run #7 的 clean-install 即因此失败)。改为在 afterEach 统一 dispose。
- 5a62443 fix(smoke): 按 dsh 0.2.1 的 dispose 语义断言 inbox 取消 - 08c18d1 test(selection): 释放 watcher 定时器,消除 jsdom 拆环境后的未处理错误 - 来源:承载分支 omdsh-dev/dsh-browser(上游 PR omdsh-dev#121 的 head)
概述 / Summary测试与真机冒烟基础设施修正:smoke 断言改为 dsh 0.2.1 的真实 dispose 语义,并修掉一个会让 CI 偶发失败的 selection 测试定时器泄漏。无产品行为变化。 动机 / Motivation
改动内容 / Changes
测试 / Testing
影响范围 / Impact仅测试脚本与用例;无 wire 协议、权限、依赖或运行时行为变化。 |
页面交接提示里新增第一个动作「跳转回到助手页面」:保持助手绑定不变,把用户前台标签页切回助手所在页面(跨窗口时先聚焦该窗口),状态随即回到 following。只在 handoff 状态出现,携带面板看到的 revision,过期点击失败关闭;受控页已关闭时转入 lost。同时按主体重命名三个选项:助手留在原页面 / 助手跟随当前页面 / 助手留在原页面并不再询问。
概述 / Summary页面交接提示新增第三个选择「跳转回到助手页面」:当助手仍绑定原页面、用户切到别的标签页时,可以一键把浏览器的前台标签页切回助手正在操作的页面(跨窗口时连同该窗口一起带到前台)。同时把三个选项按主体重新命名,让「谁留在哪里」一眼可辨。 对应代码改动与 changelog 条目见 fork 仓库 PR #10(已合入承载分支 动机 / Motivation原交接提示只有两个选择:「留在原页面」让助手留在原页、用户继续看新页;「跟随当前页面」把助手改绑到新页。当用户其实想回到助手所在的页面时两种都不合适——只能自己找回那个标签页。另外两个选项的名字都没写主体,容易混淆。 改动内容 / Changes
测试 / Testing
影响范围 / Impact
|
The devtools capability test waited only for the server-side tool registration, then immediately looked up the hello.ok ack frame in the client's frame list. The ack is delivered asynchronously, so the find could run before the frame arrived and the assertion saw undefined (intermittent CI failures on main and on the release branch). Wrap the lookup in waitFor so the assertion polls until the ack frame arrives.
自动发现原本在信标全部落空后还会扫一遍平台临时端口区间(Windows/macOS 16384 个、Linux 28232 个端口),用来兼容没有发现信标的旧宿主。现在插件与 扩展一体安装、旧宿主的混搭场景很窄,这条兜底路径代价明显更大,因此移除: - 删除 port-scan.ts(区间、并发、超时与扫描上限常量)及其用例; - discovery.ts 只保留固定端口组(上次地址 → 常用端口 → 信标端口), 进度改为按组上报; - 面板文案从「扫描」改为「探测」,实例来源去掉 scan; - README 中英同步去掉临时端口区间扫描的描述。
概述 / Summary浏览器工具从「按编号点击/输入」扩展为一层通用输入能力:指针手势与坐标、组合键与按住、光标插入与逐键输入、剪贴板(文本/富文本)、文件上传、单 iframe 精读。新增 动机 / Motivation富文本编辑器、画布/SVG 白板、代码编辑器和拖拽界面没有语义角色,快照清单点不到;原 改动内容 / Changes
测试 / Testing
影响范围 / Impact
对应代码改动与 changelog 条目见 fork 仓库 PR #18 |
- 工作区 35 个 @deepseek-ai/dsh-* 依赖与桥插件 20 个 devDependencies 升到 0.2.1-rc.3,锁文件重算 - engines.dsh 与 peerDependencies 保持 ^0.2.1-rc.2:rc.3 的插件接口与 rc.2 一致,两个宿主都受支持 - 桥插件 README(中英)、README.i18n.yaml 哈希、cordis.patch.yml 与 manifest 断言注释同步到 rc.3 - 验证:build、typecheck、check:runtime、test(77 文件 / 686 用例)、smoke-runtime 全部通过
- CHANGELOG.md / CHANGELOG.zh-CN.md 各一条 ## latest 条目 - 根 README(中英)与扩展 README(中英)的运行时兼容说明、`npx` 示例同步到 rc.3 - scripts/install.sh / install.ps1 的固定版本示例同步到 rc.3(PowerShell 脚本保留 UTF-8 BOM) - 根与扩展 README.i18n.yaml 哈希回写;.agents/notes/upstream-pr-flow.md 的运行时版本号更新 - 纳入 fork 合入流程文档:AGENTS.md 与 .agents/notes/fork-feature-flow.md (承载分支 → 上游 PR omdsh-dev#121 仅 edit 描述 → 从 main 切 PR 分支 --no-ff 合并承载分支并补 changelog)
本 PR 汇总 fork 仓库新增的功能。changelog 见 fork 仓库的 CHANGELOG.zh-CN.md;每个功能的详细说明(动机、工具与方法、审批与配置、测试与边界)见下方对应评论。
browser_screenshot视口截图工具(每次调用单独审批,需要<all_urls>主机权限),并支持在侧栏粘贴或拖拽图片随消息一起发送。开发者工具组默认关闭,只有 host 显式打开才注册;所有高权限动作保持逐次审批。
后续每次功能更新都推到同一条分支,并在本 PR 内回复对应功能的详细说明与 changelog 条目。