dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness plugin for macOS desktop automation. Observes the accessibility tree, gates risky actions behind one-time approval, permanently refuses secure fields, and returns bounded visual evidence — through a native helper you build and grant locally.
一个不会拿“刚才看到的屏幕”当成“现在仍可操作”的 macOS Computer Use Driver。
有界 Accessibility 观察 • 原生窗口视觉 + Set-of-Mark • 过期 opaque ref • 宿主审批 • 动作回执
包名:@zseven-w/dsh-computer · 本地候选版本:0.1.0-rc.3 · 运行环境:macOS + Node.js >=24.11.0
Computer 驱动实际采集的浅色原生测试窗口,编号来自视觉观察。已执行文本输入和 AX 点击;点击回执为 unknown,随后重新观察确认 PASS。没有发布任何内容。
刚才看见一个按钮,不代表现在还有权点击它。窗口会移动,App 会重启,PID 会复用,动态界面会重排子节点,另一个 Agent 也可能同时在操作。DSH Computer 把每次观察当成一张短期能力票据,而不是一包长期有效的坐标。
computer_observe
显式/前台 App + 显式/聚焦窗口
bundle id + PID + 启动身份
窗口号(或复合身份)
role + name + identifier + frame
│
▼ observation + opaque ref,只属于一个 Agent,最长 30 秒
┌──────────────────────────────┴──────────────────────────────┐
▼ ▼
computer_visual_observe computer_act
只截明确编号的窗口 解析一个 ref
原生 PNG + 像素校验 重新核验身份
AX Set-of-Mark 覆盖 策略需要时只询问一次
交给 DSH 图片附件 执行一个动作
│ │
▼ ▼
当前支持图片的模型收到窗口附件 confirmed | unknown | rejected | failed
视觉观察和动作共用同一把 observation 互斥锁。视觉读取不会消耗 ref;被接受或可能已经执行的变更动作会消费整次 observation。
computer_act
只在该 Agent 的作用域内解析 ref
重新观察 App/进程/窗口/目标
拒绝过期、重绑或密码框目标
确定性高风险目标只向所属用户询问一次
执行一个绑定后的动作
│
▼
回执:confirmed | unknown | rejected | failed
+ 可获得时附动作后观察
首个纵向切片刻意不做设置面板,只提供 5 个 headless 工具,以及一套供 dsh-qa 复用的 Cordis Driver 服务。
| 工具 | 契约 |
|---|---|
computer_apps | 列出 Dock 可见的运行中 App:精确 bundle id、pid、是否最前,以及 computer_observe 可用的 Accessibility 窗口号(window_number)。只读;仅在已授予 Accessibility 时列出窗口。 |
computer_launch | 按精确的反向域名 bundle id 打开已安装 App(已运行则激活),并短暂等待首个窗口出现。不能传参数、文档或 URL,因此不需要审批;路径和显示名会被拒绝。用它代替 shell open -a。 |
computer_observe | 有界读取一个 macOS App/窗口的 Accessibility 树,返回 opaque ref、指纹和过期时间。 |
computer_visual_observe | 只截取新鲜 observation 绑定的明确编号窗口,做像素校验,把有界 AX Set-of-Mark 编号烙入图片,再通过 DSH 附件交给当前这一路支持图片的模型。 |
computer_visual_act | 对同一份截图的附件图像像素执行 click、drag 或 scroll;必须先经宿主批准,工具只用受信任的附件几何信息把附件像素换算成原生像素,不接受模型提供的缩放或原生坐标。 |
computer_act | 对一个新鲜 ref 执行安全的 click、focus、type、key 或 scroll;每次动作前都重新核验身份。scroll 调整所属 AX 滚动区域,在重新观察证明内容移动前返回 unknown。 |
computer_evidence | 返回交互会话、Accessibility 与录屏就绪状态,Helper executable/bundle/signing/process/caller/resolution 身份,以及当前 Agent 自己的近期 AX/视觉动作回执。 |
模型参数里没有 Agent id、AX path、PID lease,也没有让模型自己决定的 sensitive 开关。实时 Agent 身份由宿主提供;原始 AX 定位路径不会离开 Driver。
computer_visual_observe 只接受 observation_id 和可选 max_marks(1–200,默认 80),不接受 path、App、窗口、坐标、动作 ref 或审批参数。任何截图发生前都会精确检查 request header 对应的 provider/model route;附件/LLM 服务缺失、route 未知或文本模型都会明确失败,而且不会影响 computer_observe。工具 JSON 只包含持久附件元数据、原生/附件尺寸与缩放、编号 → opaque ref/source index 映射,不含路径、base64 或截图 byte buffer。DSH 即使规范化或缩小附件,编号也已经烙在图里。
computer_visual_act 接受 op、observation_id、capture_sha256、point;op=drag 另需 to,op=scroll 另需 direction/amount。point/to 是模型看到的交付附件图像像素。工具只使用 computer_visual_observe 保存的受信任附件几何信息换算原生像素,不接受调用方传入的缩放或原生坐标,也不接受 App、窗口、路径、ref、审批、Agent id 或任何图像理解结果作为模型参数。每个视觉动作都按 AX-opaque 未知目标处理,因此一律要求宿主审批,并在审批前后重新截图/核验,派发后回执为 unknown——不会 confirmed,也不应盲目重试。
exec.agent.id 隔离;没有实时 Agent 身份的工具调用直接拒绝。Return/Enter 提交键,以及明确导航白名单之外的按键组合,都需要宿主向所属用户展示上下文并取得一次性的 allowed-once。安全 focus/导航不弹审批;esc 与 arrowleft/arrowright/arrowup/arrowdown 会归一为 escape/left/right/up/down。用 key 发送可打印字符属于非导航组合键,每次都会弹审批——请改为点击屏幕按钮或使用 type。「清除」(Clear) 在中英文下都不算破坏性操作;删除/抹掉/卸载/销毁(delete/erase/remove)仍需审批。模型无法传入或伪造审批参数。allowed-once;询问前和派发前重新核验并截图同一窗口。坐标点或拖拽终点下发现密码等安全字段时直接拒绝。unknown。confirmed;目标消失、替换、移动或只是获得焦点都仍是 unknown。unknown,不会假装成 failed,从而诱导盲目重试。global-hook 只用于监听 agent/disposed 并清理该 Agent 的状态;插件不会读取或改写 Agent 消息。短命 Helper 使用普通 stdin/stdout JSON 协议。原生 approval grant 校验只是可信的同一用户 DSH host → plugin → Helper 链路内的 defense-in-depth,并不会以密码学方式认证调用方。公开发行前必须增加认证 IPC/XPC,或等价的签名宿主约束,才能把 Helper 当成抵御同一 macOS 用户下其他进程的安全边界。
插件通过 Cordis 提供 zsevenComputerDriver 服务,并导出结构化 TypeScript 契约:
import {
COMPUTER_DRIVER_SERVICE,
type ComputerDriver,
} from '@zseven-w/dsh-computer/driver'
ctx.inject([COMPUTER_DRIVER_SERVICE], (driverCtx) => {
const driver = driverCtx[COMPUTER_DRIVER_SERVICE] as ComputerDriver
// scopeId 必须来自可信的实时 Agent/session,不能来自模型参数。
})
当前 contractVersion 为 5。v3 新增了 scroll 动作;v4 让证据对截断保持诚实(computer_evidence 现携带 receipts_total/receipts_dropped/receipts_returned/bounded),将观察淘汰改为 TTL 优先而非按数量,并把每个未标记的 Set-of-Mark 目标都写入 omitted。v5 新增面向 AX-opaque 自定义控件的坐标回退 computer_visual_act:computer_visual_observe 会保存按 PNG SHA-256 绑定的截图几何信息,DSH 工具用受信任的附件几何把附件像素换算成原生像素,Driver 在要求宿主审批前后都会重新截图并核验同一窗口,然后才派发 click/drag/scroll。视觉派发回执一律是 unknown,绝不写成 confirmed;消费者应重新观察来判断效果,且不得盲目重试 unknown。Evidence 现在从同一个有界回执环返回类型化的 AX/视觉回执联合,视觉动作不会从 computer_evidence 中消失。省略原因词汇表:mark-budget-exceeded、static-label、target_has_no_frame、target_outside_captured_window、stale_target: …。后续消费者应先判断版本,再依赖新增字段。
listApps() 与 launchApp({ bundleId })(对应 computer_apps/computer_launch)是 v5 内可选、增量的 Driver 方法:锁定 v5 的消费者无需它们,因此版本号不变。调用前先检查方法是否存在。
观察保留还按 Agent 作用域做字节预算(32 MiB 序列化负载):新观察会超出预算时,先淘汰最旧的 TTL 有效观察——同样以 OBSERVATION_EVICTED 报告——且最新一次观察永不被淘汰。
Helper 不随包分发:它由你在本机构建并授权,并且刻意不做 Developer ID 签名与公证。下列步骤不会把任何 App 安装到 /Applications。
环境要求:macOS、Node.js >=24.11.0、pnpm 10.34.5,以及编译原生 Helper 所需的 Swift 工具链。DSH 单独安装:
npm install -g @deepseek-ai/dsh@latest
在本仓库目录执行以下命令,并将绝对路径替换为实际 checkout:
pnpm install
pnpm build
dsh plugin --profile web add link:/absolute/path/to/dsh-computer
dsh web
Swift Helper 源码随插件打包。运行时解析顺序固定为:显式 DSHPLUGIN_COMPUTER_HELPER override、下方固定本地 App、最后才是 staging 到内容寻址缓存并用固定开发 code identifier 重新 ad-hoc 签名的开发构建;SwiftPM 工作树产物绝不会被原地执行。显式 override 与开发构建都会如实报告 identityStable: false。
如需稳定的本机 TCC 身份,签名证书必须由你明确选择,并显式运行安装脚本:
security find-identity -v -p codesigning
pnpm run helper:install-local -- --identity "<证书完整名称或 SHA-1>"
脚本会组装并验证 ~/Library/Application Support/ZSeven/DSH Computer/DSH Computer Helper.app,固定 bundle id 为 io.github.zseven-w.dsh-computer.helper。安装依赖、激活、构建、测试、打包和发布都不会自动调用它;它也不会替你选证书、打开系统设置或申请 Accessibility/Screen Recording。npm 包只带脚本与 Swift 源码,不会带入本机签名 .app。
观察 UI 前,macOS 必须存在已解锁的交互式控制台会话,并给实际路径对应的 DSH Computer Helper授予 Accessibility;截图则要给同一个 Helper 单独授予 Screen Recording。computer_evidence 会报告会话可用性/已知锁定状态、两项 TCC preflight 布尔值、实际 executable/bundle/signing 身份、Helper PID/PPID 和直接拉起它的 DSH/Node caller context。所有状态检查都不会弹权限框;interactiveSessionAvailable: false 也可能表示信号无法确认,TCC 布尔值本身则不能区分“已拒绝”和“尚未决定”。
pnpm install
pnpm run typecheck
pnpm test
pnpm build
pnpm run smoke:pack
验收包含 Node 单测、Swift 纯策略/身份测试、真实 Swift Helper 构建与协议 status 握手,以及 npm pack → 全新目录 npm install。在 macOS 上,全新安装会从包内源码惰性构建自己的 Helper,只运行 status 和一次有界观察(绝不执行动作),并等待所有子进程收敛。smoke 同时断言 node_modules 中没有任何 @deepseek-ai/* 包。
computer_visual_act 提供绑定截图、必须经宿主批准的坐标 click、drag 和 scroll,派发结果保持 unknown,由消费者继续验证效果。AX scroll 调整所属滚动区域的垂直滚动条。当前没有内置 OCR、剪贴板自动化或完整 IME 模拟。type 通过可写 Accessibility value 完成,不等同于自然键盘或输入法输入。dsh-qa 消费的版本化类型。