dsh-mini-remote 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,255 +1,299 @@
1
+ <div align="center">
2
+
1
3
  # 极简遥控器 · dsh-mini-remote
2
4
 
3
- [![npm](https://img.shields.io/npm/v/dsh-mini-remote)](https://www.npmjs.com/package/dsh-mini-remote)
4
- ![DSH plugin](https://img.shields.io/badge/DSH_plugin-dsh--plugin-blue)
5
- ![License](https://img.shields.io/badge/license-MIT-green)
5
+ <p align="center">
6
+ <img src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/promo.webp" alt="极简遥控器:手机上只留你的指令和它的结论,过程想看的时候再调出来" width="720" />
7
+ </p>
6
8
 
7
- [English](README.en.md)
9
+ **专为 DeepSeek Harness(DSH)用户打造的轻量级移动端遥控插件,解决外出离机时查看 Agent 运行状态与下发指令时界面冗余、注意力被大量中间过程绑架的痛点。**
8
10
 
9
- ![极简遥控器:手机上只留你的指令和它的结论,中间过程留在电脑上](https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/promo.webp)
11
+ [![npm](https://img.shields.io/npm/v/dsh-mini-remote)](https://www.npmjs.com/package/dsh-mini-remote)
12
+ [![Node.js](https://img.shields.io/badge/node-%5E22.19.0%20%7C%7C%20%3E%3D24.0.0-brightgreen)](https://nodejs.org/)
13
+ [![DSH](https://img.shields.io/badge/DSH-%3E%3D0.1.5--rc.2%20%3C0.3.0-blue)](https://github.com/deepseek-ai/DeepSeek-Harness)
14
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
10
15
 
11
- **你发一句话,手机上只收到它的结论。**
16
+ [English](README.en.md) · [简体中文](README.md)
12
17
 
13
- 工具调用、文件读写、子 Agent 调度、思考过程的正文,全都不上手机。这个插件是给「出门在外,只想发指令、等结论」这件事做的——一部手机、一个输入框、最新的一条回答,就这些。
18
+ </div>
14
19
 
15
- [这是什么](#这是什么) ・ [什么时候会用到它](#什么时候会用到它) ・ [安装](#安装) ・ [连上手机](#连上手机三条路选一条) ・ [手机上能做什么](#手机上能做什么) ・ [在飞书里遥控](#在飞书里遥控) ・ [常见问题](#常见问题) ・ [安全](#安全) ・ [为什么做这个插件](#为什么做这个插件)
20
+ <p align="center">
21
+ <a href="#背景与痛点">背景与痛点</a> ·
22
+ <a href="#核心特性">核心特性</a> ·
23
+ <a href="#效果预览">效果预览</a> ·
24
+ <a href="#桌面端远程窗口">远程窗口</a> ·
25
+ <a href="#快速上手">快速上手</a> ·
26
+ <a href="#使用示例与配置">使用示例与配置</a> ·
27
+ <a href="#开源协议">开源协议</a>
28
+ </p>
16
29
 
17
30
  ---
18
31
 
19
- ## 这是什么
20
-
21
- 一个 [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness)(DSH,一个用插件扩展的 AI agent 框架)插件。装上之后:
22
-
23
- - 手机上打开一个网页,上面只有一个输入框和最新的一条回答;
24
- - 你在手机上发的指令,直接交给电脑上正在跑的那个会话;
25
- - AI 干活的中间过程(工具调用、读写文件、子 Agent、思考正文)**一律不推给手机**;
26
- - 唯一会「说话」的是鲸鱼娘:模型在步骤之间自言自语的那一句,由她念出来,只进她的气泡。
27
-
28
- 界面长这样——深色和浅色两套,设置里随手换:
32
+ ## 背景与痛点
29
33
 
30
- <img width="290" alt="深色:一段对话,手机上只留你的指令和它的结论" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/screen-dark.png" /> <img width="290" alt="浅色:同一段对话,色调跟宣传图那张画统一" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/screen-light.png" />
34
+ 在日常使用桌面端或网页端 Agent 执行复杂工程任务时,一次交互往往涉及数分钟的深度思考、几十次文件读写与密集的工具链调用。现有的移动端远程方案通常选择将桌面端界面完整映射至手机屏,引发以下实际问题:
31
35
 
32
- 它**不是**:电脑端界面的备用屏。电脑上有的审批弹窗、文件 diff、工具调用链,默认那张页面上都没有——它刻意做得很少。(想要**整个**电脑端界面,设置里有一个默认关着的入口,见[手机上能做什么](#手机上能做什么)的最后一段。)
36
+ - **信息密度失衡**:大量原始推理细节、工具调用入参以及代码差异充满小屏,关键结论被淹没。
37
+ - **注意力过度消耗**:外出通勤、就餐或离机休憩时,用户核心诉求仅为确认当前轮次是否结束,并下达下一阶段指令,无暇逐行审查中间步骤。
38
+ - **网络与权限适配单一**:纯内网方案出差无法访问,中心化云端转发则引入额外的凭据托管风险。
33
39
 
34
- 别的手机端会把电脑上的执行过程原样搬过来,它反过来:**只把你要的那两句送过去**。这是它和它们最不一样的地方。
35
-
36
- ## 什么时候会用到它
37
-
38
- - **出门在外,任务还在跑。** 你人在外面,电脑在桌上跑着一轮任务;你只想掏出手机看一眼「跑完没有」,顺便把下一句交代过去。
39
- - **陪孩子、吃饭、散步的时候。** 手不想碰电脑,但脑子里冒出一个念头,想让它先干着。
40
- - **电脑在书房,人在客厅。** 不值得专门走回去,也不想把电脑端那一整屏过程搬到手机上看。
40
+ **极简遥控器**由此设计:手机界面默认仅保留「你的输入」与「AI 最终结论」,彻底屏蔽执行噪声;同时支持随时展开完整轨迹,将注意力支配权交还给用户。
41
41
 
42
42
  ---
43
43
 
44
- ## 安装
45
-
46
- ```powershell
47
- dsh plugin --profile web add dsh-mini-remote
48
- ```
49
-
50
- 装完**必须重启一次 DSH**(把 `dsh web` 那个窗口关掉重开),左栏才会多出「手机遥控」;重启后的启动日志里会打印手机访问地址和密码。
51
-
52
- 命令里的 `web` 是 DSH 的**配置档名**(profile)——就是 `~/.dsh/profiles/` 下面那个文件夹的名字,多数人的默认档就叫 `web`。不叫这个的话,把它换成你自己的。
53
-
54
- <details>
55
- <summary>从 GitHub 源码装、从本地目录装,以及它适配哪些 DSH 版本</summary>
56
-
57
- 也可以直接从 GitHub 装,这样锁的是源码:
58
-
59
- ```powershell
60
- dsh plugin --profile web add github:xingzhen199186/dsh-mini-remote
61
- ```
62
-
63
- 手上有源码目录的话,把目录指给它也一样:
64
-
65
- ```powershell
66
- dsh plugin --profile web add <你放源码的目录>
67
- ```
68
-
69
- **它适配哪些 DSH 版本。** 这个插件在 DSH **0.1.5-rc.2** 上开发,在 **0.1.7-rc.2** 上重新逐项核对过,**0.2.0 这一版就是在 0.2.0-rc.1 / 0.2.0-rc.2 上做出来的**(插件用到的那些接口,一个都没变,两端各跑了一遍全套检查);**低于 0.1.5 的版本没试过**,声明的上限是 **0.3.0**。`rc` 是官方给预览版编的号,DSH 目前整体还是开发者预览版,跨小版本可能有破坏性改动,所以比 0.2.0 更新的版本同样不保证。真遇上不兼容,症状一般是某一块入口不见了(比如顶栏那行模型),其余部分照常——插件是按「少了哪个服务就关掉哪块功能」写的,不会整个起不来。手机端那些界面适配另有一份清单和一个**升级自检**(`tools/structure-check.mjs`),升级完对着活界面逐条查一遍,就知道哪条被改坏了。
44
+ ## 核心特性
70
45
 
71
- 设置也是这样处理的:设置清单按 DSH 的标准方式声明,而在 0.1.5 那一代的库还没有相应能力,插件**照样装得上、功能照旧**,只是少了下面提到的「改完立即生效」。**0.1.7 这一代**上这条能力是齐的。
72
-
73
- </details>
46
+ - 🎛️ **三档按需呈现模式**:提供「单帧」(整屏仅留最新结论,极度清爽)、「聊天」(常规气泡对话流)与「完整」(按原有时序就地展开工具调用与文件差异,支持关键词检索)三档视图,随时无缝切换。
47
+ - 📱 **零安装的移动端**:手机端就是一个网页——扫码、用浏览器打开,就是全部。不装 App、不注册账号、不经过任何第三方服务器;可以「添加到主屏幕」,加完那个图标点开是全屏的。
48
+ - 🌐 **多通路安全连接**:内置本地局域网(LAN)、Tailscale 私网(支持 MagicDNS 与 HTTPS 证书)以及 Cloudflare 公网隧道(无公网 IP 场景)三种模式,各通道并存且独立提供二维码与访问口令。
49
+ - 🐬 **拟人化轻量状态流**:提取步骤之间的关键旁白由鲸鱼娘气泡念出,实时呈现队列刻度尺与计时进度,彻底过滤底层原始推理块。
50
+ - 💬 **飞书长连接双向遥控**:基于飞书开放平台 WebSocket 长连接直连桌面端,无需公网 IP 即可实现纯文本交互、选择题回复以及 `/会话` 切换。
51
+ - 🗂️ **移动端就地会话治理**:在移动端支持会话重命名、置顶排序、安全归档以及从指定轮次派生新会话(Fork),并明确提示待审批与待回答事件。
52
+ - 💻 **桌面端嵌入式「远程窗口」**:在 DSH 桌面端左侧栏提供「远程窗口」快捷入口,点击即在主面板中列出已配对的其他电脑,点一行就能把那一台的 DSH 电脑端界面嵌在面板里;再次点击同一行即可退出并返回原面板。跨机可用,配对步骤见下文「桌面端『远程窗口』」。
53
+ - 🔒 **严格的安全与防御边界**:所有接口均实施定长字符串口令校验,防范时序侧信道攻击;配置防暴力破解阈值(1 分钟内试错 5 次锁定 1 分钟);严禁移动端跨目录读取任意文件;配对信息仅限电脑本机回路读取。
74
54
 
75
55
  ---
76
56
 
77
- ## 连上手机:三条路,选一条
57
+ ## 效果预览
78
58
 
79
- 三条连接方式**同时存在**,选一条就行,也可以都开着。
59
+ ### 对话界面(单帧 / 聊天 / 完整)
80
60
 
81
- | 这条路 | 什么时候用 | 要装什么 | 代价 |
82
- | --- | --- | --- | --- |
83
- | **内网** | 手机和电脑在同一个 Wi-Fi,只在家里用 | 什么都不用装 | 一出家门就断 |
84
- | **Tailscale** | 出门也要连,地址还想固定 | 电脑和手机各装一个 Tailscale | 两边都要装一个 App |
85
- | **公网隧道** | 什么都不想装,任何网络都要能连 | 什么都不用装 | 地址每次重启都换;第一次要下一个约 50 MB 的组件 |
61
+ 移动端页面使用原生 JavaScript 开发,无前端构建负担,支持深海墨蓝(深色)与冰蓝宝蓝(浅色)两套高对比度主题。同一场对话有三种看法:单帧整屏只留最新一条结论,聊天把历史一条条排成气泡,完整再把每一轮的执行轨迹插回对话原位:
86
62
 
87
- 手机之外还有一条路:**飞书**(见[在飞书里遥控](#在飞书里遥控))。它不经过浏览器,上面这三条哪一条都不用开。
63
+ <div align="center">
64
+ <img width="290" alt="聊天(深色):一来一回排成气泡,一屏看得到多条历史" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/screen-chat-dark.png" />
65
+ <img width="290" alt="聊天(浅色):同一段对话的浅色版" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/screen-chat-light.png" />
66
+ </div>
88
67
 
89
- 打开 DSH 设置(侧边栏最下面)→ 左栏「手机遥控」。这一页上每条路都有一个二维码和一条链接,二维码底下那行小字写着**什么时候用这条**,看它就够了。
68
+ ### 设置面板与外观切换
90
69
 
91
- 插件的设置(默认模式、外部推送、端口、口令这些)也有一份标准声明,写在 DSH 的标准配置里同样认得。两处都写了同一项时,**以标准配置为准**。另有一条区别:**「默认模式」和「外部推送」改完立即生效、插件不重启**;端口、绑定地址、隧道、口令、历史条数这几样改完会让你重连一次——它们本来就得重新监听或重建,插件如实声明,不假装能热改。
70
+ 通过右上角设置随时切换呈现模式、外观主题与网络重连控制:
92
71
 
93
- ### 一、内网:只在家里用
72
+ <div align="center">
73
+ <img width="290" alt="设置(深色):显示模式三选一、外观选中深色" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/settings-dark.png" />
74
+ <img width="290" alt="设置(浅色):选中态和主按钮都跟着换成宝蓝" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/settings-light.png" />
75
+ </div>
94
76
 
95
- 手机和电脑连同一个 Wi-Fi 时,扫「内网」那个码就能用。**不需要任何额外安装**,最省事的一条。代价是出了门就连不上——手机一切到流量,这条就断了。
77
+ ### 执行动画状态
96
78
 
97
- ### 二、Tailscale:出门也能连,地址还固定
79
+ 任务运行中动态展示拟人化跑动状态、耗时计时器与排队刻度尺,消除不可知等待:
98
80
 
99
- 电脑和手机都装上 [Tailscale](https://tailscale.com)、登录同一个账号,配对页上就会自动多出这一条。地址固定,配一次以后不用再管。代价是两边都要装一个 App——如果你不介意装,**出门在外这条最稳**。
81
+ <div align="center">
82
+ <img width="290" alt="执行中(深色):鲸鱼娘正在跑、已计时 14 秒、队列刻度上排着一条" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/running-dark-phone.jpg" />
83
+ <img width="290" alt="执行中(浅色):同一次执行,鲸鱼娘正在跑、已计时 14 秒、排队中 1 条" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/running-light-phone.jpg" />
84
+ </div>
100
85
 
101
- 配对页上有一个开关,打开它还能多拿一个加密地址(形如 `https://你的电脑名.你的网络名.ts.net/`)。它和上面那条是**同一台电脑、同一条通道**,区别只在连接加不加密;不是第四条路,那条明文的照旧能用、也照旧显示。
86
+ ### 远程窗口(桌面端)
102
87
 
103
- 第一次开需要你在 Tailscale 的后台确认一次——那是整个网络级别的开关,插件代不了你点,所以配对页会把 Tailscale 给出的那条链接直接摆在你面前,点一下就过去。要是这台电脑还没登录 Tailscale,它会说清楚,并给你登录链接。
88
+ 不用切窗口,也不用远程桌面:在 DSH 桌面端左侧栏点「远程窗口」,把另一台电脑的 DSH 界面直接嵌在主面板里。顶上一行是「← 返回列表 / 这是哪一台 / 再试一次」,界面正常显示时它会自动收起,鼠标碰一下屏幕顶部才滑出来。
104
89
 
105
- ### 三、公网隧道:什么都不用装
90
+ <div align="center">
91
+ <img width="720" alt="远程窗口:主面板里嵌着另一台电脑的 DSH 界面,左侧栏「远程窗口」为选中态" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/remote-window.png" />
92
+ </div>
106
93
 
107
- 配对页最底下有个开关,打开它,Cloudflare 会给你一个公网网址(形如 `https://随机词.trycloudflare.com/`)。手机在任何网络下都能连,**不用装任何东西**。
94
+ ---
108
95
 
109
- 两个代价,先知道再决定:
96
+ ## 快速上手
110
97
 
111
- - **地址每次重启 DSH 都会换**,换了得回来重新扫一次码。
112
- - **第一次打开会慢**——它在下载一个五十兆左右的组件,只下这一次。这期间状态那行会显示「正在打开…」,那是正常的,不是卡死。注册偶尔会失败,插件会自动重试 3 次。
98
+ ### 环境依赖
113
99
 
114
- 打开之后**等半分钟再扫**。Cloudflare 需要一点时间把这个地址公布出去,太早扫会提示打不开——那不是坏了,是还没到时候。
100
+ 安装前请确认这台电脑满足以下条件:
115
101
 
116
- ### 关于「加密地址」,一次说清楚
102
+ - **Node.js**:`^22.19.0 || >=24.0.0`
103
+ - **DSH(DeepSeek Harness)**:`>=0.1.5-rc.2 <0.3.0`
104
+ - **操作系统**:Windows、macOS 或 Linux
117
105
 
118
- 上面两条路都可能给你一个 `https://` 地址,加密的是**连接本身**:地址栏上会出现 https 那把锁,路上传的东西是密的。这一点不挑路,两条给的都一样。
106
+ > ⚠️ **注意**:DSH 处于活跃迭代期,本插件核心功能在 `0.1.5-rc.2`、`0.1.7-rc.2`、`0.2.0-rc.1` 及 `0.2.0-rc.2` 上完成全量验证。对于低于 `0.1.5` 的历史版本未作兼容承诺;高于 `0.3.0` 的版本存在上游底层接口破坏风险 —— **这一版声明的上界就是 `0.3.0`**,DSH 升上去之后要先等插件跟进,别直接升。
119
107
 
120
- 区别在域名由谁解析:Tailscale 那条用的是形如 `你的电脑名.你的网络名.ts.net` 的域名,**它只在你的 Tailscale 网络内部解析得出**,靠手机客户端上的 MagicDNS——而**有些客户端没有这个能力**:HarmonyOS 上那个第三方客户端 MeshArc,它自己的说明里就写着「请用 Tailscale IP 地址」,那类手机上这条加密路走不通,不是设置没开。隧道那条用的是 Cloudflare 的域名,谁都能解析,不挑手机,代价是地址每次重启都会换。
108
+ ### 安装步骤
121
109
 
122
- ---
110
+ #### 途径一:DSH 桌面端图形化安装(推荐)
123
111
 
124
- ## 手机上能做什么
112
+ 1. 点击 DSH 顶部导航栏的「插件」按钮进入插件管理页面。
113
+ 2. 点击页面右上角的「添加插件」按钮打开对话框。
114
+ 3. 在输入框中输入插件包名 `dsh-mini-remote`(亦可输入 GitHub 仓库地址 `github:xingzhen199186/dsh-mini-remote` 或本地目录路径)。安装源保持默认的「npm 官方源」。
115
+ 4. 点击对话框底部的「安装」按钮完成安装。
125
116
 
126
- 打开链接就是全部界面:一个输入框,和最新的一条回复。
117
+ > ⚠️ **注意**:
118
+ > 1. **确认来源可信**:插件在本机以当前用户的完整权限运行,来源不明的插件可能损坏 DeepSeek Harness,或读取和泄露敏感数据。
119
+ > 2. **暂不支持自动更新**:插件安装后暂不支持自动更新。若需升级版本,请先卸载当前版本后再安装新版本。
127
120
 
128
- **发指令。** 打字发出去,AI 就在电脑上开始干活。
121
+ #### 途径二:从官方 npm 注册表安装(命令行)
129
122
 
130
- **等结论。** 跑的时候上面显示「运行中…」。这期间你可以接着发,指令会排队。任务结束,结论直接出现在页面上,同时响一声、震一下。
123
+ 在终端中执行对应的安装命令。命令中的 `web` 为 DSH 默认 Profile 名称,若使用自定义配置档,请替换为对应名称:
131
124
 
132
- **鲸鱼娘动画。** 电脑上的模型在步骤之间常会自言自语一句(「我先看一下这个文件」这类),这一句现在由鲸鱼娘念出来——说话的动作是新画的一张立绘,轮播会为它停一下,说完接着从停下的地方往下走。
133
-
134
- **两套外观,随手换。** 设置里有一行「外观」:**深色**、**浅色**(默认)、**跟随系统**。深色是深海墨蓝打底;浅色那套的色是从宣传图那张画上取的——近白的冰蓝地、深宝蓝的字,主按钮也换成同一个宝蓝。选哪套记在手机上,下次打开还是它。
125
+ ```powershell
126
+ dsh plugin --profile web add dsh-mini-remote
127
+ ```
135
128
 
136
- <img width="290" alt="设置(深色):显示模式与外观" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/settings-dark.png" /> <img width="290" alt="设置(浅色):选中态和主按钮都跟着换成宝蓝" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/settings-light.png" />
129
+ #### 途径三:从 GitHub 仓库直接安装
137
130
 
138
- **任务执行中的那一屏。** 她迈步跑着,进度条在走,队列里排着"跑完这轮就轮到它们"的几条。这一屏上没有工具调用、没有文件差异——只有"在跑"这件事本身。
131
+ ```powershell
132
+ dsh plugin --profile web add github:xingzhen199186/dsh-mini-remote
133
+ ```
139
134
 
140
- <img width="290" alt="执行中(深色,手机实拍):鲸鱼娘正在跑、已计时 15 秒" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/running-dark-phone.jpg" /> <img width="290" alt="执行中(浅色,手机实拍):鲸鱼娘正在跑、已计时 7 分 43 秒、队列排着一条" src="https://raw.githubusercontent.com/xingzhen199186/dsh-mini-remote/main/docs/running-light-phone.jpg" />
135
+ #### 途径四:本地目录安装(开发者调试)
141
136
 
142
- **三种显示模式。** 点右上角的 ⚙ 切换。「单帧」(默认)整屏只留最新一条回复,适合「我就想看这次的结果」;「聊天」是一来一回的气泡列表,适合连着追问好几轮;「完整」在聊天那一串里**把每一步过程插回原位**(和电脑端同一套长相),可以一层层点开看「这一步读了什么文件」,也能搜。用一阵子你会知道自己偏哪个。
137
+ ```powershell
138
+ dsh plugin --profile web add C:\path\to\dsh-mini-remote
139
+ ```
143
140
 
144
- **点开一个会话,能看到它之前聊过什么。** 在左边切到一个早就存在的会话,聊天模式会把之前的每一轮都列出来(你发过的指令、每一轮的结论),单帧模式只显示最后一条结论。**特别大的会话只给最近一段**:那种几万个事件的会话,整份读下来会把电脑上的 DSH 拖垮,所以只读末尾那一小段,并在最上面写明「这不是全部,只显示了最近一段」——你看到的那句话不是客套话,是实情。
141
+ ### 启动与服务确认
145
142
 
146
- **斜杠指令也能在手机上用。** 在输入框里打一个 `/`,上面就会列出这个会话能用的指令,接着打字按名字过滤,点一下就执行;要参数的会帮你填好、并告诉你它要什么。名单是电脑上 DSH 自己的那份(装了什么插件就有什么),执行结果在聊天里单独占一行,和 AI 说的话区分得开。打错的、不存在的指令会被明确拒绝并说明原因,**不会当成一句话发出去**。会话没在跑的时候没有指令可列,页面会直说。**指令这一版带不了附件**:你贴着的文件会留着,跟下一条普通消息一起发。
143
+ 1. 重启 DSH 服务(关闭当前 `dsh web` 窗口并重新运行)。
144
+ 2. 查看控制台启动日志,插件将输出初始化就绪信息、本机监听端口与动态访问令牌:
145
+ ```text
146
+ [dsh-mini-remote] 已启动:http://127.0.0.1:3090/mini?token=xxxxxxxxxxxx
147
+ ```
148
+ 3. 打开 DSH 桌面端界面,进入「设置」→ 左侧导航选择「手机遥控」,即可查看配对二维码与连接详情。
147
149
 
148
- **在手机上答题。** AI 问你「选哪个」(比如让你挑一个方案)时,问题会推到手机上,点一下就算答了——**一个一个答,答错了能回头改,选项里没有的也能自己打字**。手机不在跟前(锁屏、关了页面、断了网)就自动把问题还给电脑,那边照常弹窗。
150
+ > **手机端只有浏览器网页这一种形态。** 扫码用浏览器打开就是全部——没有独立的 App,也没有小程序。可以把这个页面「添加到主屏幕」:加完那个图标点开是全屏的,看着和 App 差不多,跑的仍然是浏览器;换一台手机、或者清掉浏览器数据,就回到重新扫码那一步。
151
+ >
152
+ > 反过来说,这个网页**也不挑设备**:在 PC 浏览器里打开同一个地址同样能用,而且能在里面开出完整的 DSH 电脑端界面——见「进阶设置:内嵌桌面端界面」。
149
153
 
150
- **顺手能改的三样。** 点顶栏那一行,换当前会话的模型和思考强度;切权限档位(仅可查看 / 工作区内修改 / 完全权限);浏览电脑上的目录,登记新的工作区和会话。
154
+ ---
151
155
 
152
- **默认看的是结论,不是过程。** 单帧和聊天这两个模式里没有工具调用链、没有文件 diff;唯一的例外是鲸鱼娘嘴里那一句自言自语——它只进气泡,不进回答区(见上面那一段)。想看过程,得自己切到「完整」模式。**系统层面的确认弹窗手机上点不了**(比如危险命令的审批),那类还得回电脑处理——手机上能答的是 AI 主动提给你的选择题,这两件事不一样。它的定位是一根遥控器:电视还得在那儿开着,遥控器才有用。
156
+ ## 使用示例与配置
153
157
 
154
- **想要整个电脑端界面,也搬得动(「进阶设置」)。** 设置页里有一项**默认关着**的「进阶设置」:打开它,下面会多出一行「电脑端界面」,点「打开」,电脑上那个完整的 DSH 页面就原样嵌在手机这半边,不跳转也不开新标签——改模型配置、装卸插件、翻会话记录这些手机页上没有的事,都能在这儿办。**它和上面那条定位正好相反**(一开,中间过程就全在屏幕上),所以默认关着:打开时页面会把后果说清楚(这个访问口令的权限会扩到整个电脑端设置面),要点两次确认;电脑端地址拿不到时,这一项不显示。
158
+ ### 连接通道对比与选型
155
159
 
156
- ---
160
+ 依据当前网络拓扑选择最合适的接入通路:
157
161
 
158
- ## 在飞书里遥控
162
+ | 通道类型 | 适用场景 | 依赖条件 | 特性与代价 |
163
+ | :--- | :--- | :--- | :--- |
164
+ | **局域网(LAN)** | 手机与电脑处于同一 Wi-Fi 子网 | 无额外客户端 | 配置即用;脱离当前局域网后立即断开 |
165
+ | **Tailscale** | 跨地域移动访问,要求网络地址稳定 | 电脑与手机均安装并登录 Tailscale | 固定私网 IP;可额外申请 Tailscale HTTPS 证书 |
166
+ | **公网隧道** | 无公网 IP 且不便安装任何额外客户端 | 需开启 Cloudflare 隧道开关 | 每次重启 DSH 自动更换临时二级域名;初次开启下载约 50 MB 运行组件 |
167
+ | **飞书长连接** | 仅依赖企业 IM,完全脱离浏览器 | 配置飞书自建应用机器人凭据 | 无需公网暴露,通过长连接双向收发,支持移动审批 |
159
168
 
160
- **在飞书里跟电脑上的会话对话**:你发一句,电脑上那个会话跑一轮,回答回到你那条消息下面,末尾另起一行写明这条回答出自哪个会话(形如「会话:部署脚本」;会话还没起名字就写「未命名会话」)。
169
+ ### 移动端页面操作指引
161
170
 
162
- 走的是飞书的**长连接**——由插件这边主动连到飞书、一直挂着,所以不需要公网地址、也不需要域名。它和手机页共用同一个会话绑定。
171
+ - **指令发送与排队**:在底部输入框输入文字并发送。若 Agent 正处于执行中,后续消息自动进入有序队列,并在刻度尺中高亮展示。
172
+ - **斜杠指令交互**:输入 `/` 呼出当前会话绑定的系统级指令列表,支持按键过滤与参数提示。
173
+ - **多选提问与确认**:当 Agent 发起选项询问时,页面弹出答题卡,支持点选、改选或自定义输入补充文本。
174
+ - **回到底部**:在长文本翻阅时,右下角自动浮出「回到底部」悬浮球(单帧模式下不触发)。
175
+ - **权限档位切换**:点击顶栏状态区,可在「仅可查看(read-only)」、「工作区内修改(workspace-write)」与「完全权限(danger-full-access)」之间切换。
163
176
 
164
- ### 怎么配
177
+ > ⚠️ **注意**:
178
+ > 1. 将权限档位提升至「完全权限」意味着 Agent 具备任意文件与系统级指令执行能力,请务必谨慎操作。
179
+ > 2. 系统底层触发的危险命令权限审批弹窗,属于电脑端 DSH 自己的安全边界——手机端没法直接批准,得回电脑上处理。
165
180
 
166
- 在[飞书开放平台](https://open.feishu.cn/)建一个企业自建应用(自己一个人用也是这个类型),从「凭证与基础信息」里拿到 App ID 和 App Secret。**建完先给它加上「机器人」能力,再发布一次版本**——漏了这步,飞书里搜不到这个机器人。订阅方式选「使用长连接接收事件」,添加事件 `im.message.receive_v1`;权限里只搜 `im.message` 这半段(带上后面的部分搜不出结果),勾三项:接收消息、以应用身份发消息、获取与发送单聊群组消息——**那个数字从 0 变成 3 就是勾对了**。能力、权限、事件改过任何一样,都要重新发布一次版本。最后回 DSH 设置页,在「手机遥控」的「飞书」那一块填上 App ID / App Secret,打开开关。
181
+ ### 进阶设置:内嵌桌面端界面(手机或 PC 网页)
167
182
 
168
- 每一步点哪个菜单、发布成功是什么标志,设置页里那个**默认收起**的「配置指引(飞书后台六步)」写着;上面这段只让你先知道一共要做几件事,不重复它的正文。
183
+ **手机遥控页不是只能在手机上用。** 在 PC 浏览器里打开同一个地址(扫码打开的那一条),界面一样能用——只是排版是按手机屏幕做的。而让这条路在 PC 上真正好用起来的,是设置里的「进阶设置」:它把完整的 DSH 电脑端界面嵌进来,于是不必额外去开一个 `dsh web`。
169
184
 
170
- ### 第一次发消息会被挡下,这是正常的
185
+ 怎么打开:
171
186
 
172
- 允许名单默认是空的,**两份都空着的时候谁都不认**,所以第一次给机器人发消息不会生效。插件会**在飞书里回你一句**,把你这边的编号(open_id,飞书认你的那串内部号)交给你,并说明该填到哪一格。照着填进「允许的 open_id」保存,再发一次就能用了。
187
+ 1. 点右上角设置,找到「进阶设置」那一行(提示语是「打开电脑上的 DSH 界面,改那些手机上没有的设置」),切到「开」。
188
+ 2. 它会再问你一次——**要点第二次才算开**。
189
+ 3. 下面随即多出一行「电脑端界面」(提示语「电脑端 dsh 完整页面」),点「打开」。
190
+ 4. 这一页里就嵌进一整屏完整的 DSH 电脑端界面:插件安装、模型配置、会话记录、全量日志都在里面。顶上那条横条可以退出、回到手机遥控页。
173
191
 
174
- 只处理**单聊**(你和这个机器人私聊);群里的消息这一版不看。
192
+ **它搬的是这台电脑自己的界面,不是另起一份。** 你在这里改的配置、发的对话,都发生在**这个 DSH 上**——桌面端和它处在同一个状态里。做法也不是"多开一个网页版":插件的服务端先按官方正门认证一次,然后把每个请求**实时转发**到本机那个界面(连实时的界面刷新都原样转,不攒批)。所以手机全程碰不到任何官方凭据。
175
193
 
176
- ### 在飞书里能做什么
194
+ > ⚠️ **注意**:
195
+ > 1. **这是一个权限开关,不是普通偏好。** 打开它,等于把这个令牌的访问面从"手机页暴露的那点事"扩到**整个电脑端设置面**——模型配置、凭据、插件装卸、会话记录全在内。所以它默认关,而且开着要点两次。
196
+ > 2. 嵌进来的就是电脑端原样的界面,手机窄屏下做了移动端适配;PC 浏览器上就是原样。
177
197
 
178
- **普通文字就是对当前会话说话。** 和手机页上发的是一样的。
198
+ ### 桌面端「远程窗口」
179
199
 
180
- **会话中途停下来问你的时候,飞书里会收到一条普通文字。** 选择题把选项列成 `1.` `2.`,审批写清要批哪个工具、哪条命令;回数字,或回「同意」「拒绝」,都算答复。回**「取消」**表示不拍板,这道题交回电脑处理。
200
+ **一句话**:在 B 电脑的 DSH 桌面端里,直接打开 A 电脑的 DSH 界面。
181
201
 
182
- **`/会话` 列出能切的会话**,当前那个标着「(当前)」;**`/会话 3`** 切到第 3 个,切完手机页也跟着变。**以 `/` 开头的一律当命令**,不会当成对提问的答复——飞书里这一版只有 `/会话` 这一条命令。
202
+ **它解决什么**:两台电脑各跑各的 DSH 时,想在一台上看另一台的界面,原来只有两条路——开个浏览器窗口(于是要在两套窗口之间来回切),或者上远程桌面(整块屏幕搬过来,分辨率和快捷键全是麻烦)。这个入口把「那一台」变成主面板里的一屏:点开就是它,再点一下回到原来的面板。
183
203
 
184
- **还没有的。** 带按钮的交互卡片;图片和文件;群聊;流式输出(回答是整段一次回来的,要等一会儿);同一时间只跑一轮。
204
+ #### 用起来是什么样
185
205
 
186
- ---
206
+ 1. 点左侧栏的「远程窗口」,主面板列出你配对过的电脑——一行一台,带名字、地址、最近一次连上的时间。
207
+ 2. 点其中一行,那一台的界面就嵌在面板里。
208
+ 3. 再点一下左侧栏那一行(点图标、点文字、点整行空白都算),退出,回到进入前那个面板。
187
209
 
188
- ## 常见问题
210
+ 界面正常显示时顶上那行横条会**自动收起**,鼠标碰一下屏幕顶部就滑出来。横条里是「← 返回列表」、这是哪一台、以及「再试一次」——出问题时它是唯一的出口(和换条路重试的入口),所以正在换票、出错、框一直没打开这几种状态下它**不会收起**,一直在。
189
211
 
190
- **扫码之后打不开。**
191
- 先看手机和电脑是不是同一个 Wi-Fi。
212
+ #### 安全上做了什么
192
213
 
193
- **出门扫「公网」那条打不开。**
194
- 等半分钟再试。还不行的话,配对页上会直接显示原因。最常见的一种是**电脑上开着代理或 VPN**——Clash 这类软件的「TUN 模式」会把隧道的连接掐断,进程看着好好的,其实一条连接都没建立起来,先把它关掉再试。还有一种:这条网络就是走不通 Cloudflare(国内时好时坏,不是你哪里配错了),那就别在公网上耗着,**改用 Tailscale 那条**。
214
+ - **凭据不过手**:打开窗口时,服务端当场签一张一次性票据(30 秒内有效、只能兑一次)。浏览器拿到的是这张票,**访问口令和长期凭据一个字节都不进浏览器**——既不留进浏览历史,也不进被嵌进来的那个页面。
215
+ - **只有带有效票据的页面才允许被嵌**:跨站嵌入默认禁止,带票的那一次才放开。外部页面即使拿到地址也进不来。
216
+ - **撤销是立即的**:在 A 的设置里撤销 B 这台设备之后,B 已经开着的窗口下一次请求就过不去,不需要等它自己断。
217
+ - **跟着 DSH 一起失效**:A 的 DSH 重启,那一屏的通行凭据自动作废,重新点一次就能再进。
195
218
 
196
- **显示「未连接」。**
197
- 手机切后台再回来经常会这样,页面会自己重连,等几秒;还不行就进设置点「重连」。
219
+ #### 跨机使用(两台电脑)
198
220
 
199
- **回复到了,但没声音。**
200
- 声音要你先碰过页面才会响,点一下就行。
221
+ 下面把被连的那台电脑叫 A,去连的那台叫 B。
201
222
 
202
- **手机上一直让我输密码。**
203
- 说明你打开的链接里没带密码(比如自己手打的地址)。回电脑上重新扫一次二维码就好。
223
+ **A 侧**
204
224
 
205
- **想换一个自己记得住的密码。**
206
- 在「设置 → 手机遥控」的密码那一块直接改,**至少 12 位**。改完要重启一次 DSH,重启之后手机上要重新扫一次码。
225
+ 1. **装本插件,版本不低于 `0.2.1`。**「远程窗口」是 `0.2.1` 才有的功能——B 连的是 A 上跑着的那份代码,A 装的是旧版,B 看到的就还是旧界面。
226
+ 2. 打开「设置 → 手机遥控 → 允许别的电脑连接」,把这个开关打开。它默认是关的;关着的时候,A 连配对请求也不受理。
227
+ 3. 在同一个设置页的「密码」那一块点「复制」,取出 A 的口令。
207
228
 
208
- ---
229
+ **B 侧**(在 B 的「设置 → 手机遥控」里操作)
209
230
 
210
- ## 安全
231
+ 要用的那一块叫「其他电脑」,在设置页靠下。它和上面那块「设备」正好相反:那块是「谁进得来」,这块是「我连得上谁」。
211
232
 
212
- **配对页上带着密码,别截图发出去。** 密码直接编在二维码里,扫完不用手敲——方便是方便,代价是谁拿到这张图谁就能进。
233
+ 1. 点「添加一台电脑」,摊开三个框。
234
+ 2. **那台电脑的地址(它「手机遥控」页那条,不带 `/mini`)**:填 A 的地址。这一格填什么最关键,见下面「地址填哪一条」。
235
+ 3. **那台电脑的口令(在它的「手机遥控」设置里复制)**:填 A 侧第 3 步复制来的那串。这一格是打码的。
236
+ 4. **给它起个名字(可留空,留空就用地址当名字)**:方便你在名单里认出是哪一台。
237
+ 5. 点「确认添加」。这一步会真的去 A 那边配一次对——成功之后 A 的设置页会多出一条「这台电脑」的记录,B 这边多出一行。
238
+ 6. 点名单里那一行。
213
239
 
214
- 除此之外:所有接口都要密码,密码比对用定长比较;同一来源一分钟错 5 次就挡一分钟;配对信息**只允许本机读取**,同一个 Wi-Fi 下的其他设备拿不到;公网隧道默认关着,要你自己在设置页里打开;手机看不到任何文件内容——挑工作区的时候只列文件夹名字,文件一个都不列、也不读。**唯一的例外是图片**:要让手机看到一张图(比如我截给你的界面图),那张图会被放进插件目录 `lib/art/`、名字以 `out-` 开头,页面按「带密码的图片通道」把它取出来——能被取到的只有这一类(是图片、且是这个前缀),正文、配置文件和别的东西仍然一个字都读不到,也不能列目录。**但有一件事要说清楚:手机上能切换 Agent 的权限档位。** 切到「完全权限」,Agent 就能改这台电脑上的任何文件。这条路径是开着的。
240
+ 名单每一行显示:名字、地址、`最近成功 <时刻>`(没连成过就是「还没有记录」),右边两枚按钮——**「重连」**重新取一次通行凭据,**「断开」**删掉这条配对。断开前会问你一次,并说明对面那台电脑上的记录**还留着**;要彻底收回,得去 A 那边把这一台撤销。
215
241
 
216
- ---
242
+ **地址填哪一条**
217
243
 
218
- ## 为什么做这个插件
244
+ - 填 A 的「手机遥控」页里那条地址(末尾不用带 `/mini`);**不要**填你在 A 上打开 DSH 界面时用的那条。
245
+ - **必须 `https://`。** 明文 `http://` 能配对、也能取到通行凭据,但框里是白的——那枚通行凭据在非 https 的地址上会被浏览器丢掉。
246
+ - 推荐走 Tailscale:在 A 上打开「HTTPS 地址(Tailscale)」开关,B 填 `https://<机器名>.<你的 tailnet>.ts.net`,**不用写端口**。地址固定,设一次就完事。
247
+ - 「公网访问」隧道那条地址每次重启都会变,不适合跨机。
219
248
 
220
- 初衷是因为现在 AGENT 任务执行一轮往往需要很久,而如果出门,则需要手机端来远程操作。
249
+ **怎么知道做对了**
221
250
 
222
- 但现有的手机端,会把 PC 的执行步骤非常还原地展现出来。你发一条指令,它可能要想上几分钟、读几十个文件、调好几次工具,最后才给你一个结论。如果出门或有事不在电脑前,实在没时间盯着手机看那么细致。
251
+ 点名单里那一行,框里出现那台电脑的界面。出问题时那一行底下会有说明——对面没开开关、被撤销了、连不上、地址填错,各有各的说法,照着改就行。
223
252
 
224
- 我并不认为那种方式不好。信息完整、过程可控,如果你要认真处理任务,它是对的。
253
+ **以后要收回某一台的权限**
225
254
 
226
- 但出门在外的时候,就我个人而言,我需要的是另一种东西——**更轻便、更少占用注意力的交互方式**。手机屏幕就那么大,出门时的精力也就那么多。而大部分时候我真正需要的只有一件事:**这一轮跑完了,该发下一条指令了**。而且大部分时间,即使在电脑上,我也很少会去仔细阅读 AI 做执行过程中的"自言自语"。
255
+ 在 A 的「设置 → 手机遥控 → 设备」那一块——就是列出「谁进得来」的那份名单,每行带「改名」和「撤销」——找到那台电脑,点「撤销」,再点「确认撤销」。**立即生效**:对面已经开着的窗口,下一次请求就过不去,不用等它自己断。
227
256
 
228
- 所以这个插件的界面做得相当「原始」:它完全省略了电脑网页端的执行步骤,只把 AI 最后的结论送到你面前。
257
+ ### 飞书机器人配置流程
229
258
 
230
- **某种意义上,它的存在,是为了让你更少地去看它。**
259
+ 1. 登录 [飞书开放平台](https://open.feishu.cn/) 创建企业自建应用。
260
+ 2. 记录「凭证与基础信息」中的 `App ID` 与 `App Secret`。
261
+ 3. 进入「添加应用能力」页面,添加「机器人」能力。
262
+ 4. 进入「事件与回调」页面,配置事件订阅方式为「使用长连接接收事件」,并添加 `im.message.receive_v1` 事件。
263
+ 5. 进入「权限管理」页面,检索并开通以下 3 项权限:
264
+ - 接收消息(`im:message:receive_v1`)
265
+ - 以应用身份发消息(`im:message:send_as_bot`)
266
+ - 获取与发送单聊、群组消息(`im:message.group_at_msg:readonly` 等对应集合)
267
+ 6. 创建并**发布应用版本**。
268
+ 7. 返回 DSH 桌面端「设置」→「手机遥控」→「飞书」栏目,填入凭证并启用开关。首次交互机器人将在单聊中返回用户的 `open_id`,将其复制填入白名单保存后即可正常通讯。
231
269
 
232
- 你可以更加自由地支配自己的时间,而不是当你和女儿玩耍时,抑或出游时,被困在那个小小的屏幕里。
270
+ ### 核心配置参数表
233
271
 
234
- ## 相关文档
272
+ 配置项支持在 DSH 标准配置文件中声明,亦可通过桌面端「手机遥控」界面配置:
235
273
 
236
- - [立绘与动画工艺](docs/character.md) —— 三个出图工具、共享提示词块、尺寸与验收口径。
237
- - [立绘基准帧(2026-09-28 定稿)](docs/art-refs/2026-09-28/) —— 九张帧图、全部提示词原文,
238
- 以及「以后改动画先对照它们」的规矩。
239
- - [变更记录](CHANGELOG.md) —— 每版改了什么、为什么。
274
+ | 参数项 | 数据类型 | 默认值 | 生效方式 | 说明 |
275
+ | :--- | :--- | :--- | :--- | :--- |
276
+ | `port` | `number` | `3090` | 重启生效 | 遥控服务监听的本地 HTTP 端口(冲突时自动顺延) |
277
+ | `token` | `string` | *(随机生成)* | 重启生效 | 访问口令(支持手动修改,长度不得低于 12 位) |
278
+ | `defaultMode` | `string` | `"minimal"` | 即时生效 | 移动端默认呈现视图:`"minimal"`、`"chat"`、`"full"` |
279
+ | `externalNotify` | `boolean` | `true` | 即时生效 | 任务完成时是否触发系统通知音效与设备震动 |
280
+ | `tunnel.enabled` | `boolean` | `false` | 重启生效 | 是否启用 Cloudflare 临时公网隧道 |
281
+ | `tailscale.serve` | `boolean` | `false` | 重启生效 | 是否尝试配置并监听 Tailscale 专有 HTTPS 证书通道 |
282
+ | `feishu.enabled` | `boolean` | `false` | 即时生效 | 是否开启飞书应用长连接双向通道 |
240
283
 
241
284
  ---
242
285
 
243
- ## 给维护者
286
+ ## 开源协议
244
287
 
245
- 升级 DSH 之后,跑一次 `node tools/structure-check.mjs`。它会逐条报出来:哪些还在、哪些已经失配、失配的那条要不要管。有失配时退出码是 1,以后能直接接进流程里。
246
-
247
- ---
288
+ 本项目采用 [MIT 许可证](LICENSE) 进行开源。
248
289
 
249
- ## 致谢
290
+ ### 相关文档与资源索引
250
291
 
251
- 这个插件在设计思路上参考过 [dsh-pocket](https://www.npmjs.com/package/dsh-pocket)(作者 shaobeichen)——尤其是「每条连接路径各配一条链接、一个二维码、一个密码」这种配置形态。
292
+ - [立绘与动画工艺规范](docs/character.md):记录图像生成工具、共享提示词模板、规格尺寸与验收标准。
293
+ - [立绘基准帧定义(2026-09-28 定稿)](docs/art-refs/2026-09-28/):归档标准帧原图与全量提示词基线。
294
+ - [版本变更历史](CHANGELOG.md):记录各阶段版本详细演进与问题修复依据。
295
+ - [项目代码仓库](https://github.com/xingzhen199186/dsh-mini-remote):GitHub 官方主页。
252
296
 
253
- ## 许可
297
+ ### 致谢
254
298
 
255
- MIT
299
+ 本项目在通道交互与配对界面设计上,参考了 [dsh-pocket](https://www.npmjs.com/package/dsh-pocket)(作者 @shaobeichen)在多路径独立二维码呈现方面的工程构思。