🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

iPhone 远程控制台 GUIDchen/dsh-iphone-mobile

DeepSeek Harness
GUIDchen12 天前有提交已提供中文文档扫描:含敏感能力

在 iPhone 上批准工具调用并查看流式回答

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add GUIDchen/dsh-iphone-mobile
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 12 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 13 处,展示前 13 条)
  • 发起网络请求
    public/push-client.js:50
    const info = await fetch('/m/push/vapid').then((r) => r.json());
  • 发起网络请求
    public/push-client.js:55
    await fetch('/m/push/subscribe', {
  • 发起网络请求
    public/status.js:18
    const up = await fetch('/m/push/status').then((r) => r.json());
  • 发起网络请求
    public/status.js:24
    const res = await fetch('/m/health').then((r) => r.json());
  • 发起网络请求
    public/status.js:55
    const info = await fetch('/m/push/vapid').then((r) => r.json());
  • 发起网络请求
    public/status.js:61
    await fetch('/m/push/subscribe', {
  • 发起网络请求
    public/status.js:78
    const res = await fetch('/m/push/test', { method: 'POST' }).then((r) => r.json());
  • 读取密钥环境变量
    server/gateway.mjs:28
    if (process.env.GATEWAY_TOKEN) return process.env.GATEWAY_TOKEN;
  • 发起网络请求
    server/gateway.mjs:206
    const res = await fetch('http://' + UPSTREAM_HOST + ':' + UPSTREAM_PORT + '/', {
  • 发起网络请求
    server/gateway.mjs:287
    const upstream = http.request(
  • 读取密钥环境变量
    server/push.mjs:17
    if (process.env.VAPID_PUBLIC_KEY && process.env.VAPID_PRIVATE_KEY) {
  • 读取密钥环境变量
    server/push.mjs:18
    return { publicKey: process.env.VAPID_PUBLIC_KEY, privateKey: process.env.VAPID_PRIVATE_KEY };
  • 发起网络请求
    server/webpush.mjs:121
    const res = await fetch(subscription.endpoint, {
扫描于 2026/11/4(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

用 iPhone 远程控制本地 DeepSeek Harness:零依赖网关,带 PWA、推送通知和 token 认证。

README

由 DeepSeek 最新模型翻译生成
dsh-iphone-mobile 在 iPhone 上使用跑在你 Mac 上的 DeepSeek Harness:离开工位时也能批准工具调用、看流式回答、查后台任务。 代码、会话、API Key 都不离开本机,手机只作为控制面。 状态页 为什么需要它 一轮 harness 会话可能跑很久,然后因为一件事停下来:某个工具调用在等你批准。 如果这时候你不在电脑前,整轮就卡住了。 最直觉的做法——把 Web UI 通过隧道暴露出去——开箱即用是不成立的。harness 的 /api 有一层浏览器信任围栏: Host 必须是 loopback 权威(或用 --trusted-host 声明的权威),浏览器带 Origin 时还必须与之匹配。 经隧道进来的流量携带的是公网主机名,于是在任何 RPC 派发之前就被 403 挡掉。 而这道围栏是可达性策略,不是鉴权。 本项目补的就是这一层:一个对 harness 说 loopback 的网关,它重写上游 Host、对外做鉴权,再叠加移动端 PWA 层。 它是什么,不是什么 - 它是 网关加移动层:反向代理、令牌鉴权、PWA 清单、安全区样式、推送通知。 - 它不是 对 harness 界面的重写。GUI 已有会话、文件、终端与任务,也已有窄屏断点;再写一套是浪费。 - 它不是 托管中转。链路里没有我们的服务器,隧道是你自己的。
展开完整文档(README 剩余 1 节)
dsh-iphone-mobile

在 iPhone 上使用跑在你 Mac 上的 DeepSeek Harness:离开工位时也能批准工具调用、看流式回答、查后台任务。

代码、会话、API Key 都不离开本机,手机只作为控制面。

状态页

为什么需要它

一轮 harness 会话可能跑很久,然后因为一件事停下来:某个工具调用在等你批准。
如果这时候你不在电脑前,整轮就卡住了。

最直觉的做法——把 Web UI 通过隧道暴露出去——开箱即用是不成立的。harness 的 /api 有一层浏览器信任围栏: Host 必须是 loopback 权威(或用 --trusted-host 声明的权威),浏览器带 Origin 时还必须与之匹配。
经隧道进来的流量携带的是公网主机名,于是在任何 RPC 派发之前就被 403 挡掉。
而这道围栏是可达性策略,不是鉴权。

本项目补的就是这一层:一个对 harness 说 loopback 的网关,它重写上游 Host、对外做鉴权,再叠加移动端 PWA 层。

它是什么,不是什么

- 它是 网关加移动层:反向代理、令牌鉴权、PWA 清单、安全区样式、推送通知。
- 它不是 对 harness 界面的重写。GUI 已有会话、文件、终端与任务,也已有窄屏断点;再写一套是浪费。
- 它不是 托管中转。链路里没有我们的服务器,隧道是你自己的。

架构

flowchart LR
P[iPhone Safari / PWA] -->|HTTPS 443| T{Tailscale 或 Cloudflare Tunnel}
T --> G[dsh-mobile-gateway 127.0.0.1:3081]
G -->|Host 重写为 loopback| W[dsh web 127.0.0.1:3080]
W --> H[DeepSeek Harness]
W -.->|/api/events.mux| G
G -.->|Web Push| P

网关做四件事:

1. 代理:转发到 harness,把 Host 重写为 loopback 并删除 Origin,围栏无需改动 harness 一行即可通过。
WebSocket 升级走原始 TCP 重放握手再双向管道,因此不需要 ws 依赖。
2. 鉴权:随机令牌换取 HttpOnly Cookie,登录失败按来源限流。
3. 包一层 PWA:向响应 HTML 注入清单、图标、Service Worker、安全区样式与订阅入口,不改 harness 产物。
4. 通知:订阅 harness 事件流,把审批请求、提问、agent 报错与任务终态转成推送。

特性

- 经 Tailscale 或 Cloudflare Tunnel 远程访问,只需管理一个令牌
- 可安装 PWA:standalone 显示、iOS 图标、安全区适配、16px 输入字号(避免自动放大)
- 推送覆盖 approval/requested、question/requested、agent 报错、任务终态与轮次结束
- 去重:任务帧是全量快照,只在终态跃迁时通知;turn/end 按 seq 去重
- 自愈:推送返回 404/410 即删除失效订阅;事件观察器断线按指数退避重连
- 手机状态页 /m/status:上游健康、订阅数量、开启通知、发送测试推送
- 零运行时依赖:只用 Node 内置模块,包括手写的 RFC 8291 / RFC 8292 Web Push 实现

快速开始

要求:Node.js 22 及以上,且 dsh web 正在 127.0.0.1:3080 运行。

终端 1 —— harness(默认只监听 loopback)
dsh web

终端 2 —— 网关
npm start

首次运行自动生成的访问令牌
cat ~/.dsh-mobile/token

然后在手机上:

1. 打开 https://<你的入口>/login?token=<令牌> 一次,换取 Cookie。
2. 分享菜单 → 添加到主屏幕。
3. 点击 开启通知 —— iOS 要求在用户手势中完成订阅。

验证方式

下面的脚本全部离线运行,断言行为而不是打印安慰性文字:

node scripts/selftest-gateway.mjs # 28 项:鉴权、围栏代过、注入、WebSocket 升级、推送往返
node scripts/selftest-webpush.mjs # 11 项:VAPID 签名、aes128gcm 往返、篡改拒绝、410
node scripts/selftest-push.mjs # 11 项:事件到通知的映射与去重
node scripts/check-stream.mjs --selftest

Web Push 那组是真实的密码学往返:生成订阅端密钥对,让发送端指向本地假推送服务,再用订阅端私钥把收到的密文解出来比对明文。

安全地对外暴露

./scripts/setup-tailscale.sh # 私有 tailnet 入口
DOMAIN=dsh.example.com ./scripts/setup-cloudflare-tunnel.sh # 公网入口,前面再加 Access

两个脚本都刻意指向网关的 3081。把隧道直接指向 harness 会重新踩到 403 围栏,同时失去鉴权层。

已知限制

- harness GUI 没有 URL 路由,通知无法深链到具体会话;通知正文里带会话标识,点击打开应用根路径。
- 隧道断开时既没有页面也没有通知。要补上这个缺口需要原生壳加 APNs(代码尚未编写,且免费 Apple 开发者账号无法开启推送权限)。
- Service Worker 刻意不缓存页面:GUI 内容随会话变化,陈旧缓存比离线空壳更糟。
- 网关令牌是单因子。任何公网入口前面都应再加 Cloudflare Access 或等效身份层。

目录结构

server/ 网关(代理 + 鉴权 + PWA 注入)与推送服务 public/ PWA 资产:清单、图标、Service Worker、移动端样式、状态页 scripts/ 隧道接入、弱网注入、事件流观察、自测脚本 docs/ 设计、接入手册、验收用例、路线图

设计与协议细节见 docs/架构与协议.md:已核实的线上契约、事件流的续传语义,以及网关为什么长成这样。

安全

见 SECURITY.md。harness 必须保持只监听 127.0.0.1;密钥存放在 ~/.dsh-mobile,权限 0600,永不入库。

许可证

MIT,见 LICENSE。
预览分享卡片长什么样 ↓GUIDchen/dsh-iphone-mobile
分享 · DeepSeek Harness Hub
GUIDchen/dsh-iphone-mobile

在 iPhone 上批准工具调用并查看流式回答

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部