DeepSeek Harness Hub
← 返回列表

手机端代理遥控0x5446/rowel

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

在 iPhone 上端到端加密地查看并批准 Mac 代理的操作

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/11 · 已提供中文文档

DeepSeek Harness (dsh) 的原生 iOS 客户端。在手机上回复你的智能体——中继服务器始终只能看到密文。

综合分
30.2
GitHub 分
30.2
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add 0x5446/rowel
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

Rowel

在你的 iPhone 上驱动 Mac 上的编码代理。 端到端加密;
中继只能看到密文。

DeepSeek Harness(dsh)
运行在你的代码和密钥所在的地方。Rowel 是另一半:阅读
代理做了什么,批准它接下来想做的事,回答它被阻塞的问题,在火车上启动下一件事。

| 组件 | 是什么 | 运行在哪里 |
|---|---|---|
| Rowel | iOS 应用 | 你的 iPhone |
| Bridle | 代表 harness 的伴生进程 | 运行 dsh 的 Mac |
| Relay | 内容盲转接器 | 公共互联网——我们的,或你自己的 |

iPhone                  internet                   your Mac
┌────────┐          ┌──────────┐          ┌──────────────────┐
│ Rowel  │◄──wss───►│  Relay    │◄──wss───►│ Bridle ──► dsh  │
└────────┘  sealed  └──────────┘  sealed  └──────────────────┘
└────────── Noise_IK_25519_ChaChaPoly_SHA256 ─────────┘

Bridle 主动拨出。无需端口转发,无需公网 IP,路由器上无需任何改动。
当手机和 Mac 在同一网络上时,应用直接与 Mac 通信,中继完全不参与——两条路径会竞速,本地路径胜出。

没有账户。配对就是终端里的一个二维码。

目前进展

Mac 端已完成并日常使用。中继已部署。应用尚未上架 App Store——要获得它需要用 Xcode 自行构建,这是免费的,但有一个七天期限的坑。

让它跑起来

1. 在 Mac 上安装 Bridle

curl -fsSL https://rowel.novabox.ai/install | sh

需要 Node 22+ 和 git。该脚本两者都不安装——它会停下来告诉你缺什么。它不会在 ~/.rowel 之外写入任何内容,只会在你的 PATH 上添加一个符号链接。它只有 134 行,其中三分之一是注释,如果你想在运行前先读一读的话。

2. 配对

bridle pair

终端中会出现一个二维码。用应用对准它。首次运行 bridle 时会自动完成此操作,所以这个命令用于添加第二部手机。

在 SSH 环境下,终端可能无法绘制二维码,请加上 --link 来打印原始配对链接。下面还有一个 8 字符的短码,供无法使用摄像头时使用——但请先阅读 SECURITY.md 中关于该路径的说明;它目前是两者中较弱的一种。

3. 保持运行

bridle service install

登录后启动,并在关闭终端后继续运行。bridle service uninstall 将其移除。

bridle 命令

bridle                    启动(首次运行时并配对)
bridle pair               生成新的配对二维码和短码
bridle status             机器、中继、harness、已配对设备
bridle devices            列出已配对设备
bridle revoke     移除一个
bridle backup       加密保存此机器的身份
bridle restore      恢复已保存的身份
bridle service install    登录后保持运行
bridle doctor             检查本机的设置

bridle 本身的有用标志:

--relay        使用不同的中继(默认:公共中继)
--dsh          测试框架,如果它不在常用端口上
--advertise    在配对码中放入一个额外地址——一个该机器
无法自行发现的隧道主机名。局域网和
Tailscale 地址会被自动发现。
--direct-port    固定局域网端口
--no-direct         完全不在局域网上监听
--no-auto-start     从不启动测试框架
--link              同时打印原始配对链接

状态保存在 ~/.rowel/bridle.json 中,权限模式为 0600,其中保存着本机的
私钥。ROWEL_HOME 可以改变它的位置。

一台 Mac 上运行两个测试框架

一个 Bridle 服务一个 dsh。若放任不管,它会探测常用端口(3080–3083、
8080、8791),并停留在上次应答的那个 dsh 上——只有一个测试框架时没问题,
有两个时就是在抛硬币。--dsh 可以终结这种猜测:
sh
bridle --dsh http://127.0.0.1:3081

如果那里没有任何应答,Bridle 会在那个确切的端口上启动一个测试框架——当它
这样做时,启动行会显示 (started by bridle)。--no-auto-start 会让它
拒绝启动。

每个身份只能运行一个 Bridle;第二次启动会停止并指出第一个。因此,要把你
现有的配对迁移到不同的端口,请停止正在运行的 Bridle,并用 --dsh 重新
启动它。要在第一个测试框架旁边再服务第二个测试框架,请给它一个自己的
身份:
sh
ROWEL_HOME=~/.rowel-3081 bridle --dsh http://127.0.0.1:3081

它的首次运行会打印自己的二维码,应用会显示第二台机器——名称相同,通过
指纹后缀加以区分。bridle pair 不需要这些:它不启动任何东西,因此可以
与已经启动的 Bridle 愉快地并存。

它保护什么,不保护什么

中继通过电路编号在两个套接字之间转发密封帧。它没有密钥材料,也无法打开
它们,这是其结构本身的属性,而不是对任何人行为的承诺——一个端到端测试会
接入套接字,如果方法名、机器名或会话 ID 曾出现在线路上,测试就会失败。
隧道的两种实现都只使用各自平台自身的原语,Node 的 node:crypto 和
Swift 的 CryptoKit。代码树中没有任何第三方密码学依赖。

人们低估的部分: dsh 自身没有身份验证,因此已配对的手机对该 Mac
拥有的权限与它自己的终端相同——它可以运行命令并读写文件。bridle revoke
是收回该权限的唯一方法。应用中的任何操作都不是比这更小的权限;应用只是
绘制了更少的按钮。

SECURITY.md 是完整的威胁模型,包括中继确实会了解到什么、
一部解锁的手机会意味着什么,以及已知的弱点。在你配对任何你在意的东西
之前,值得一读。

从源码构建
sh
npm install
npm test               # 构建、文档检查、单元测试。几秒钟。
npm run test:e2e       # 整个技术栈(大部分需要运行一个测试框架)
npm run test:ios       # 需要 Xcode 和 brew install xcodegen
npm run vectors        # 重新生成跨语言测试向量

protocol/      Noise、帧、配对、中继线格式(TypeScript)
bridle/        伴随进程及其 CLI
dsh-plugin/    同一个核心,挂载在测试框架内部而非旁边
relay/         Node 中继
relay-worker/  同一个中继,运行在 Cloudflare Workers 和 Durable Objects 上
e2e/           跨越以上三者的测试
ios/           应用(Swift、SwiftUI、XcodeGen)

两个实现如何保持同一协议

Noise 握手和帧编码写了两遍,一遍用 TypeScript,一遍用 Swift。“我的服务器和我的客户端能通信”在两边都是我自己的时候证明不了什么,所以 npm run vectors 用固定的密钥和固定的临时密钥运行握手,并写出一个确定性的测试夹具;Swift 端逐字节比较——握手消息、握手哈希、确认号、传输密文、配对链接、帧编码。

那里的失败是协议分叉,而不是不稳定的测试。它已经抓到过一次:Foundation 的 JSONEncoder 不保证键的顺序,两端都能愉快地解析,而无论怎么自说自话都发现不了。

运行你自己的中继

bridle --relay wss://your.host 就是整个客户端。relay/ 是一个没有数据库、没有配置文件的单一 Node 进程;relay-worker/ 是同一个交换机,运行在 Cloudflare Workers 上,公开的那个就跑在上面。docs/deployment.md 有 DNS 和 TLS 的细节。

文档

docs/ 是中文的——它是为维护这个项目的人写的,翻译它比保持它正确是更大的工程。英文读者并没有被挡在重要的部分之外:SECURITY.md 涵盖威胁模型,CONTRIBUTING.md 涵盖构建和规则,代码注释和提交信息全程都是英文。

| | |
|---|---|
| docs/architecture.md | 为什么是这个形状,新功能该放在哪里 |
| docs/protocol.md | 线上确切的字节,足以写出第三个客户端 |
| docs/fold.md | 事件日志如何逐条规则变成屏幕 |
| docs/dsh-api-inventory.md | 测试框架的 51 个方法及其 RPC 模型 |
| docs/deployment.md | 运行中继、DNS,以及发布还需要什么 |

docs/README.md 说明了哪些章节是规范级的,哪些是设计级的。在根据设计级文档重新实现之前,请先询问。

许可证

MIT。见 LICENSE。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群