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

手机远程桌面 SuperAllenYao/dsh-m

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

用 iPhone 远程浏览会话、处理审批并接收推送

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · desktop
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 59 处,展示前 53 条)
  • 发起网络请求
    packages/dsh-m-link/client.js:210
    const response = await fetch(ADMIN_PATH, {
  • 发起网络请求
    packages/dsh-m-link/client.js:232
    const response = await fetch(DEPLOY_PATH, {
  • 写入剪贴板
    packages/dsh-m-link/client.js:311
    await navigator.clipboard.writeText(String(text ?? value));
  • 写入剪贴板
    packages/dsh-m-link/client.js:1046
    await navigator.clipboard.writeText(String(pairing?.payloadText ?? ""));
  • 读取本地文件
    packages/dsh-m-link/lib/apns.js:93
    if (!existsSync(resolved)) throw new Error('apns config file does not exist: ' + resolved);
  • 读取本地文件
    packages/dsh-m-link/lib/apns.js:94
    const text = readFileSync(resolved, 'utf8');
  • 读取本地文件
    packages/dsh-m-link/lib/apns.js:246
    if (!existsSync(keyFile)) {
  • 读取本地文件
    packages/dsh-m-link/lib/apns.js:256
    this.key = createPrivateKey({ key: readFileSync(keyFile), format: 'pem' });
  • 发起网络请求
    packages/dsh-m-link/lib/apns.js:327
    const request = client.request({
  • 写入本地文件
    packages/dsh-m-link/lib/audit.js:41
    mkdirSync(this.dir, { recursive: true });
  • 读取本地文件
    packages/dsh-m-link/lib/audit.js:48
    const size = statSync(this.file).size;
  • 写入本地文件
    packages/dsh-m-link/lib/audit.js:50
    renameSync(this.file, this.previous);
  • 写入本地文件
    packages/dsh-m-link/lib/audit.js:68
    appendFileSync(this.file, line + '\n', { mode: 0o600 });
  • 执行外部命令固定命令
    packages/dsh-m-link/lib/certs.js:35
    return execFileSync('openssl', args, { stdio: ['ignore', 'pipe', 'pipe'] });
  • 读取本地文件
    packages/dsh-m-link/lib/certs.js:66
    if (!existsSync(file)) return undefined;
  • 读取本地文件
    packages/dsh-m-link/lib/certs.js:68
    return JSON.parse(readFileSync(file, 'utf8'));
  • 读取本地文件
    packages/dsh-m-link/lib/certs.js:77
    const ca = new X509Certificate(readFileSync(caCert));
  • 读取本地文件
    packages/dsh-m-link/lib/certs.js:78
    const leaf = new X509Certificate(readFileSync(leafCert));
  • 写入本地文件
    packages/dsh-m-link/lib/certs.js:109
    writeFileSync(
  • 写入本地文件
    packages/dsh-m-link/lib/certs.js:144
    writeFileSync(extFile, leafExtensions(sans));
  • 写入本地文件
    packages/dsh-m-link/lib/certs.js:164
    mkdirSync(tlsDir, { recursive: true });
  • 读取本地文件
    packages/dsh-m-link/lib/certs.js:166
    existsSync(join(tlsDir, 'ca.key')) &&
  • 读取本地文件
    packages/dsh-m-link/lib/certs.js:167
    existsSync(join(tlsDir, 'ca.crt')) &&
  • 写入本地文件
    packages/dsh-m-link/lib/certs.js:216
    mkdirSync(tlsDir, { recursive: true });
  • 写入本地文件
    packages/dsh-m-link/lib/certs.js:233
    mkdirSync(tlsDir, { recursive: true });
  • 写入本地文件
    packages/dsh-m-link/lib/certs.js:237
    mkdirSync(archive, { recursive: true });
  • 发起网络请求
    packages/dsh-m-link/lib/contract.js:34
    response = await fetch(connectUrl, { method: 'GET', redirect: 'manual', signal: controller.signal });
  • 写入本地文件
    packages/dsh-m-link/lib/devices.js:100
    mkdirSync(this.dir, { recursive: true });
  • 读取本地文件
    packages/dsh-m-link/lib/devices.js:101
    if (!existsSync(this.file)) {
  • 读取本地文件
    packages/dsh-m-link/lib/devices.js:107
    parsed = JSON.parse(readFileSync(this.file, 'utf8'));
  • 写入本地文件
    packages/dsh-m-link/lib/devices.js:111
    renameSync(this.file, backup);
  • 写入本地文件
    packages/dsh-m-link/lib/devices.js:161
    mkdirSync(this.dir, { recursive: true });
  • 写入本地文件
    packages/dsh-m-link/lib/devices.js:171
    writeFileSync(tmp, JSON.stringify(payload, null, 2) + '\n', { mode: 0o600 });
  • 写入本地文件
    packages/dsh-m-link/lib/devices.js:172
    renameSync(tmp, this.file);
  • 写入本地文件
    packages/dsh-m-link/lib/host-identity.js:26
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    packages/dsh-m-link/lib/host-identity.js:29
    if (existsSync(file)) {
  • 读取本地文件
    packages/dsh-m-link/lib/host-identity.js:31
    record = JSON.parse(readFileSync(file, 'utf8'));
  • 写入本地文件
    packages/dsh-m-link/lib/host-identity.js:43
    writeFileSync(file, JSON.stringify(record, null, 2) + '\n', { mode: 0o600 });
  • 发起网络请求
    packages/dsh-m-link/lib/link-server.js:1000
    const response = await fetch(this.loopbackOrigin + '/api/session/list', {
  • 写入本地文件
    packages/dsh-m-link/lib/link-server.js:1287
    mkdirSync(this.dataDir, { recursive: true });
  • 读取本地文件
    packages/dsh-m-link/lib/link-server.js:1387
    key: readFileSync(certs.leafKey),
  • 读取本地文件
    packages/dsh-m-link/lib/link-server.js:1388
    cert: readFileSync(certs.leafCert),
  • 发起网络请求
    packages/dsh-m-link/lib/link-server.js:2204
    upstream = await fetch(target, { method: 'GET', headers, redirect: 'manual' });
  • 发起网络请求
    packages/dsh-m-link/lib/link-server.js:2858
    upstream = await fetch(target, { method: 'POST', headers, body: upstreamBody, redirect: 'manual' });
  • 发起网络请求
    packages/dsh-m-link/lib/link-server.js:3794
    const upstream = await fetch(this.loopbackOrigin + '/api/' + endpoint, {
  • 读取本地文件
    packages/dsh-m-link/lib/link-server.js:4028
    this.server.setSecureContext({ key: readFileSync(certs.leafKey), cert: readFileSync(certs.leafCert) });
  • 读取本地文件
    packages/dsh-m-link/lib/link-server.js:4043
    const lines = readFileSync(file, 'utf8').trim().split('\n').filter(Boolean);
  • 写入本地文件
    packages/dsh-m-link/lib/link-server.js:4318
    writeFileSync(
  • 执行外部命令固定命令
    packages/dsh-m-link/lib/qr.js:83
    child = execFile(
  • 读取本地文件
    packages/dsh-m-link/lib/qr.js:96
    const png = readFileSync(outPath);
  • 删除本地文件递归
    packages/dsh-m-link/lib/qr.js:107
    rmSync(dir, { recursive: true, force: true });
  • 读取本地文件
    packages/dsh-m-link/lib/tunnel.js:147
    const value = readFileSync(file, 'utf8').trim();
  • 发起网络请求
    packages/dsh-m-link/lib/upstream-peer.js:65
    const response = await fetch(connectUrl, { method: 'GET', redirect: 'manual' });
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

iPhone 远程接入 Mac 上的 DSH 桌面:TLS 桥接、自托管中继加原生 App,由 DeepSeek Harness + DS v4.1 flash 1017 研发。

README

由 DeepSeek 最新模型翻译生成
DSH-m 从 iPhone 远程接入 Mac 上的 DeepSeek Harness 桌面。 DSH-m 通过自托管、TLS 证书钉扎的桥接,把 iPhone App DSH-m 连接到 Mac 上的 DSH 桌面。你可以在手机上浏览工作区与会话、阅读实时数据流、处理审批与用户提问、接收推送通知,并远程切换会话的权限预设 —— 无论身处同一局域网,还是通过自己在公网部署的 relay。 状态 当前版本 v2.22.2(2026-11-01)。已交付的能力: - 本轮(v2.22.2):会话列表左滑按钮不再误闪——取消置顶的卡片回到分组位置、展开或收起工作区列表时,「置顶 / 归档」按钮不会先闪出来再被卡片盖住;按钮只在左滑时出现,点完收回即隐藏。 - 上一轮(v2.22.1):置顶 / 取消置顶动效重做——卡片沿同一条曲线连续让位,不再整屏弹跳或闪烁;列表底部置顶平滑下移、不留白;取消置顶的卡片回到分组位置;连续操作与动画中的列表刷新会立即让位给最新操作并接着播完。 - v2.21.1:Mac 端插件改为 DSH 标准插件安装(插件管理器安装、卸载、升级,重启不丢;安装包内置手机连接所需组件);修复升级新版 DSH 后插件不可用、手机连不上的问题。
展开完整文档(README 剩余 1 节)
DSH-m

从 iPhone 远程接入 Mac 上的 DeepSeek Harness 桌面。

DSH-m 通过自托管、TLS 证书钉扎的桥接,把 iPhone App DSH-m 连接到 Mac 上的 DSH 桌面。你可以在手机上浏览工作区与会话、阅读实时数据流、处理审批与用户提问、接收推送通知,并远程切换会话的权限预设 —— 无论身处同一局域网,还是通过自己在公网部署的 relay。

状态

当前版本 v2.22.2(2026-11-01)。已交付的能力:

- 本轮(v2.22.2):会话列表左滑按钮不再误闪——取消置顶的卡片回到分组位置、展开或收起工作区列表时,「置顶 / 归档」按钮不会先闪出来再被卡片盖住;按钮只在左滑时出现,点完收回即隐藏。
- 上一轮(v2.22.1):置顶 / 取消置顶动效重做——卡片沿同一条曲线连续让位,不再整屏弹跳或闪烁;列表底部置顶平滑下移、不留白;取消置顶的卡片回到分组位置;连续操作与动画中的列表刷新会立即让位给最新操作并接着播完。
- v2.21.1:Mac 端插件改为 DSH 标准插件安装(插件管理器安装、卸载、升级,重启不丢;安装包内置手机连接所需组件);修复升级新版 DSH 后插件不可用、手机连不上的问题。
- v2.21.0 六项:会话列表左滑重做为系统级手感(跟手、松手停住、右滑收起、点外/点卡片收起、整滑不误触);点置顶按「按钮先消失 → 卡片轻微回弹飞入并形变」播放、取消置顶立即归位且不再整屏闪烁;新建会话显示桌面端默认模型;运行中会话(含子代理)详情不闪退、滚动更跟手;列表卡片状态实时跟随;Mac 锁屏回来后约 1 秒自动重连。

导航

- iOS 原生导航:会话页的进入/返回走系统导航栈(NavigationStack,底层 UINavigationController)——左缘滑动返回与推入/弹出转场均为 Apple 官方动效;返回即时恢复常驻的工作区列表(无重建卡顿);子代理详情返回直接显示活的父会话。
- 消息列表滚动中也能稳定触发左缘返回(手势仲裁对齐系统原生行为)。
- 历史加载期间页面保持可交互:顶部加载进度条走动时也能自由上下滑动、随时返回,不用等加载结束。

连接与配对

- 任意网络扫码配对:同一 Wi-Fi 自动走最快的局域网直连,直连不通或在移动网络下自动走中继(8 位配对码 / 二维码 / 自动配对 payload),带吊销能力的设备注册表。
- 配对体验:桌面二维码可点击放大、不会过期失效;扫码失败可直接重扫,失败提示一句话可操作。
- 配对一次即可长期使用:手机以插件自签 CA 证书为信任锚,插件升级、证书重签(局域网 IP 变化 / 到期续期 / 手动轮换)、桌面端重启、切换网络都不需要重新配对;只有主动吊销设备或显式轮换 CA 才需要。
- 连接稳定:首次启动链路就绪即进入;断线自动恢复(单 WSS 传输与断线恢复 dsh-m/2、按 origin 复用的 keep-alive 连接池);待处理卡片在重连时不清空,重连后按事件 ID 幂等重投。
- 公网访问:在桌面设置页一键部署自托管 relay,部署后进程内激活隧道(无需重载插件)。
- 网络自适应:配对与连接都自动按当前网络选路径(直连优先、2 秒不通切中继);连接成功后自动学习 Mac 的最新端点;网络环境变化(Wi-Fi / 蜂窝 / 热点 / Mac 局域网 IP 变更)时自动换路并即时重拨,Wi-Fi↔蜂窝双向切换约 1 秒内恢复连接;同一 Wi-Fi 下冷启动约 1.6s 连上。
- 下行内容压缩:蜂窝网络下同样的内容传得更快、更省流量;连接冲突时的等待从 1.5 秒缩短到约 0.8 秒,弱网下自动放宽。

会话与交互

- 工作区 / 会话浏览与实时流;会话列表轻量投影,首屏更快。
- 会话卡片左滑快捷操作:置顶、归档(归档带二次确认弹窗;按钮为纯图标,紧凑不占宽)。
- 会话状态一眼看清:列表卡片状态行与详情右上角用同一套状态图标(等待审批 / 等待作答 / 进行中 / 出错 / 未开始 / 空闲 / 离线),等待类状态轻轻呼吸;某一轮开始或结束,列表卡片立刻变化并自动置顶,不需要下拉刷新。
- 分组「+」一键新建会话并直达;未发送输入自动存草稿,回到该工作区继续;新建的草稿会话固定排在列表顶部,创建后立刻可见(与桌面端一致);新建空白会话布局与有消息会话一致。
- 顶栏品牌与版本信息重排:版本号下沉第二行,两行与 logo 等高。
- 会话详情为一条平铺消息流(对齐 DSH 桌面端):无 turn 卡片与按轮折叠;推理与工具调用按「过程组」平铺展开——组头显示「N 步 · 运行中 / 已完成」,点一下收起整组,收起/展开时组头停在原位不动;模型思考时思考内容在组内逐字增长(点开可看全文),工具尚未开始先显示「准备运行命令…」;文件变更卡在流尾;每行独立懒加载,下拉加载的新消息立即可见;消息区采用系统级循环复用列表,几千条消息的超长会话也能流畅快速滚动——历史加载进行中快速滑动几乎不掉帧,超长消息整条一次成型,巨型过程组(上百步)展开收起同样顺滑。
- 大会话的历史加载更快:进入会话即取、边取边显示,下一页提前预取;跨网(蜂窝 / 中继)打开大会话,历史加载从约半分钟降到约 1.3 秒,打开后约 0.4 秒内就能看到内容。
- 子代理与工具调用视图;子代理入口常驻数量,只有真实运行中才播放边框流光,运行期间新启动的子代理即时计入。
- 审批与用户提问:底部交互面板强制作答,可向下折叠查看会话输出,右上角状态图标指示这一刻的会话状态(等待审批 / 等待作答 / 进行中 / 出错 / 未开始 / 空闲 / 离线),等待审批或作答时可重新展开底部面板;多题问答一题一页(上一题 / 下一题、进度、单选自动前进、返回保留草稿、跳过与提交校验);支持锁屏推送直接处理。
- 统一底部弹层(模型 / 权限 / 子代理 / 文件变更 / 思考 / 工具详情):从屏幕底部全宽弹出、高度随内容自适应并含底部安全区,按住顶部触摸条下滑即可收起。
- 手机上切换会话权限预设(只读 ↔ 工作区可写 ↔ 完全访问)。
- 手机上切换会话的模型与推理等级(下一次请求生效);面板只列出桌面端真实可切换的模型;桌面端切换模型后手机端会话页实时跟随,无需重新进入会话。
- 状态行与上下文窗口:会话权限 → 上下文容量 · 已用百分比(如 1M · 53%,四档颜色)→ 模型切换 → 子代理。

不包含:P2P 直连。公网访问依赖你自己部署的 relay。各版本的变更记录见 release notes。

仓库结构

| 路径 | 内容 |
| packages/dsh-m-link/ | macOS DSH 插件:3466 端口上的 TLS 桥接、配对、设备认证、透明远程桥接、APNs 发送、relay 部署引擎、桌面设置页 |
| packages/dsh-m-relay/ | 轻量 Go relay,用于公网访问(控制通道 + bridge 端口段) |
| apps/ios/ | SwiftUI iPhone App(DSHm)源码 |

源码仓库说明

本仓库只公开源代码、README 与 release notes。构建配置(XcodeGen 工程、package.json/go.mod)、资源文件、单元/E2E 测试、部署脚本与密钥配置均不在公开仓库内,因此不能直接从本仓库构建或运行测试。产品安装与使用请以 release notes 和官方发布渠道为准。

安全说明

- 配对后的手机对你的 Mac 拥有等同 owner 的控制权(可在会话中执行工具)。请把任何已配对设备视为受信设备;手机丢失后,立即在 设置 → DSH-m 手机连接 → 已配对设备 中吊销。
- 优先使用局域网或你自建的 relay。生产 profile 中保持 debug.enabled 关闭;不要在公开仓库或提交中放置 APNs 密钥(.p8)、隧道密钥或配对 payload。
- 手机以插件自签 CA 证书为信任锚(配对时固定),并校验服务端证书链与有效期;每台配对设备拥有独立密钥;已吊销设备会被以 auth/revoked 拒绝。

许可

MIT

DSH-m

从 iPhone 远程访问你的 DeepSeek Harness 桌面端。

DSH-m 通过自托管、TLS 固定的 bridge,把 iOS App DSH-m 连到你 Mac 上的 DSH 桌面端。你可以浏览工作区和会话、读取实时流、回应审批和用户提问、接收推送通知,还能远程切换会话的权限预设——在局域网内可以,通过你自建的公网 relay 也可以。

状态

当前版本 v2.22.1(2026-10-31)。目前已交付的功能:

- 本次发布:推理流式输出期间,会话和子代理会话详情可平滑滚动——滚动条和消息都不再闪烁;恢复为单一原生滚动条;滚动时流式尾部暂停,一秒内追上;向上滚动时继续加载更早的消息。

连接与配对

- 局域网配对(8 位码 / 二维码 / 自动配对 payload),设备注册表支持吊销。
- 配对一次,长期可用:手机把信任锚定在插件的自签 CA 证书上,因此插件升级、证书重签(局域网 IP 变化 / 到期续期 / 手动轮换)、桌面端重启和网络变化都不再需要重新配对;只有吊销设备或显式轮换 CA 才需要。
- 连接可靠:首次启动时链路一就绪,App 立即进入;断线后自动恢复(单一 WSS 传输,支持 dsh-m/2 续传,按 origin 维护 keep-alive 连接池);重连时不清空待处理卡片,而是按事件 ID 幂等重投。
- 公网访问:在桌面端设置页一键部署自托管 relay;隧道在进程内激活(无需重载插件)。
- 网络感知:每次连接成功后,App 都会学习 Mac 当前的端点;网络环境变化时(Wi-Fi / 蜂窝 / 热点 / Mac 局域网 IP 变化),自动挑选最快可达路径并立即重拨——Wi-Fi 与蜂窝之间切换约一秒恢复连接,同一 Wi-Fi 下冷启动约 1.6s 连上。
- 下行压缩:同样的内容在蜂窝网络下传得更快、更省流量;等待连接冲突的耗时从 1.5s 降到约 0.8s,弱网下自动放宽。

会话与交互
- 工作区 / 会话浏览支持实时流;会话列表的轻量投影让首屏加载更快。
- 左滑会话卡片即可置顶或归档(归档前会先确认;操作只有图标,所以保持紧凑)。
- 会话状态一眼可见:列表的状态行和详情页头部共用一套图标(等待批准 / 等待回答 / 运行中 / 出错 / 未开始 / 空闲 / 离线),等待状态会轻轻呼吸。一轮开始或结束时,列表卡片立刻变化并移到顶部——不用下拉刷新。
- 分组标题上的「+」新建会话并直接进入;未发送的输入会保留为草稿,新建的草稿会话停在列表顶部(与桌面端一致)。全新的空会话,布局和有消息的会话一样。
- 头部重新设计:版本号放在第二行,与 logo 齐平。
- 会话详情是一条扁平的消息流(与 DSH 桌面端一致):没有轮次卡片,也不按轮折叠;推理和工具调用平铺在过程分组里——分组标题显示「N 步 · 运行中 / 已完成」,点一下折叠分组,折叠或展开时标题位置纹丝不动。模型思考时,思考文本在分组里逐字增长(点一下可读全文),还没开始的工具显示「准备运行命令…」。文件变更卡片放在消息流末尾,每一行各自懒加载,所以长会话依然流畅,新翻页进来的消息立刻出现。
- 长会话加载历史更快:进入时就开始拉取内容并逐步展示,同时预取下一页;跨网络(蜂窝 / 中继)打开长会话,历史加载约 1.3s 而不是约半分钟,约 0.4s 内就能看到内容。
- 子代理和工具调用视图;子代理入口常驻显示数量,只在子代理真正运行时播放边框光束,会话打开期间启动的子代理会立即计入。
- 批准和用户提问:底部交互面板强制作答,可向下折叠以便阅读对话输出,右上角状态图标显示当前会话状态(等待批准 / 等待回答 / 运行中 / 出错 / 未开始 / 空闲 / 离线),处于等待状态时会重新展开;多问题提示词一次一页(上一题 / 下一题、进度、单选自动前进、草稿保留、跳过 / 提交校验);支持锁屏推送操作。
- 统一的底部弹层(模型 / 权限 / 子代理 / 文件变更 / 推理 / 工具详情):全宽面板从屏幕边缘升起,高度按内容加底部安全区自适应,向下拖动顶部把手即可关闭。
- 手机上可切换会话权限预设(只读 ↔ 工作区写入 ↔ 完全访问)。
- 会话内可切换模型与推理强度(从下一次请求起生效);面板只列出桌面端实际能切换的模型,桌面端切换模型后,应用会实时同步,无需重新打开会话。
- 状态行与上下文窗口:会话权限 → 上下文容量 · 已用百分比(例如 1M · 53%,四色分段)→ 模型切换 → 子代理。

不包含:点对点(P2P)直连。公网访问依赖你自己部署的中继。每个版本的变更记录见发布说明。

仓库结构

| 路径 | 说明 |
| packages/dsh-m-link/ | macOS DSH 插件:3466 端口上的 TLS 桥接、配对、设备认证、透明远程桥接、APNs 发送、中继部署引擎、桌面设置页 |
| packages/dsh-m-relay/ | 小型 Go 中继,用于公网访问(控制通道 + 桥接端口段) |
| docs/release-notes/ | 发布说明 |
| apps/ios/ | SwiftUI iPhone 应用(DSHm)源码 |

仅发布源码的仓库

本仓库只发布源码、README 和发布说明。构建配置(XcodeGen 工程、package.json/go.mod)、资源、单元/E2E 测试、部署脚本和密钥配置均未包含,因此仓库无法直接构建或测试。安装与使用请参考发布说明和官方分发渠道。

安全须知

- 已配对的手机对你的 Mac 拥有等同于机主的控制权(可以在你的会话里运行工具)。把任何已配对设备都当作可信设备;手机丢失后,立即在 Settings → DSH-m phone connection → Paired devices 中撤销。
- 优先使用局域网,或你自己掌控的中继。生产配置档中保持 debug.enabled 关闭;切勿把 APNs 密钥(.p8)、隧道密钥或配对载荷放进公开仓库或提交记录。
- 手机以插件的自签名 CA 证书为信任锚(配对时固定),并校验服务器证书链和有效期;每台配对设备各有自己的密钥;已撤销的设备会被拒绝,返回 auth/revoked。

许可证

MIT
预览分享卡片长什么样 ↓SuperAllenYao/dsh-m
分享 · DeepSeek Harness Hub
SuperAllenYao/dsh-m

用 iPhone 远程浏览会话、处理审批并接收推送

这是你的仓库?认领条目

回到顶部