dsh-mobile-plugin 0.5.20 → 0.5.22
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 +3 -12
- package/assets/pets/README.md +9 -0
- package/assets/pets/deepy-whale/attention.gif +0 -0
- package/assets/pets/deepy-whale/done.gif +0 -0
- package/assets/pets/deepy-whale/error.gif +0 -0
- package/assets/pets/deepy-whale/idle.gif +0 -0
- package/assets/pets/deepy-whale/pack.json +54 -0
- package/assets/pets/deepy-whale/sleeping.gif +0 -0
- package/assets/pets/deepy-whale/working-3.gif +0 -0
- package/assets/pets/deepy-whale/working.gif +0 -0
- package/extensions/README.md +64 -0
- package/extensions/catalog.json +1 -0
- package/lib/client.js +318 -27
- package/lib/impl.js +21 -1
- package/lib/mobile/approvals.js +22 -2
- package/lib/mobile/cli/acp.js +34 -20
- package/lib/mobile/cli/mobile.js +8 -1
- package/lib/mobile/cli/service.js +151 -10
- package/lib/mobile/extension-catalog.js +244 -0
- package/lib/mobile/local-images.js +10 -5
- package/lib/mobile/monitor.js +5 -2
- package/lib/mobile/pet-tools.js +215 -0
- package/lib/mobile/pets.js +559 -0
- package/lib/mobile/session-flags.js +61 -8
- package/lib/mobile/session-local-image.js +9 -1
- package/lib/mobile/stats-collect.cjs +15 -7
- package/lib/mobile/stats-ledger.cjs +44 -5
- package/lib/mobile/wechat-tools.js +257 -0
- package/lib/mobile/wechat.js +489 -0
- package/lib/panel/index.html +12 -11
- package/lib/relay/pairing-payload.cjs +13 -5
- package/lib/relay/snapshot-auth.js +82 -0
- package/lib/relay/status.js +3 -0
- package/lib/routes/control-plane.js +74 -3
- package/lib/routes/mobile-api.js +54 -1
- package/lib/session-cleanup.cjs +22 -7
- package/lib/sidecar-facade-worker.cjs +8 -0
- package/lib/tailcat/host-process.cjs +266 -0
- package/lib/tailcat/ingress.cjs +98 -0
- package/lib/tailcat/session.cjs +264 -0
- package/lib/tailcat/wiring.cjs +96 -0
- package/package.json +10 -1
package/README.md
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
<h3 align="center">AI-HUB 移动端插件</h3>
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
<img src="assets/banner.jpg" alt="AI-HUB:手机和平板上的 DSH 会话界面" width="760">
|
|
5
|
-
</p>
|
|
3
|
+

|
|
6
4
|
|
|
7
5
|
<p align="center">
|
|
8
6
|
<a href="https://app.wnluo.com/public/apps/14"><img alt="安卓 分发下载" src="https://img.shields.io/badge/%E5%AE%89%E5%8D%93-%E5%88%86%E5%8F%91%E4%B8%8B%E8%BD%BD-3DDC84?style=for-the-badge&logo=android&logoColor=white"></a>
|
|
@@ -22,12 +20,7 @@
|
|
|
22
20
|
|
|
23
21
|
**AI-HUB 的手机端插件。** 装在电脑这边,手机 App 就通过一条中转隧道或局域网配对连进你的 DSH —— 看会话、接着聊、管理文件和工作区,进度实时同步。它也可以脱离桌面外壳单独跑在服务器上,当作无头宿主用。
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
<picture>
|
|
27
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/WNLUO/dsh-mobile-plugin/main/assets/connection-dark.svg">
|
|
28
|
-
<img src="https://raw.githubusercontent.com/WNLUO/dsh-mobile-plugin/main/assets/connection-light.svg" alt="手机 App 经中转或局域网连到你电脑上的 DSH" width="720">
|
|
29
|
-
</picture>
|
|
30
|
-
</p>
|
|
23
|
+

|
|
31
24
|
|
|
32
25
|
手机连的是**你自己那台电脑上的 DSH**,不是某个云端服务。电脑不用公网 IP,也不用在路由器上开端口:插件从内网主动往外建一条隧道,手机沿这条路回来。
|
|
33
26
|
|
|
@@ -131,9 +124,7 @@ DSH 跑在电脑上,但我不是一直坐在电脑前。出门、在别的房
|
|
|
131
124
|
|
|
132
125
|
## 交流与反馈
|
|
133
126
|
|
|
134
|
-
|
|
135
|
-
<img src="assets/wechat-group.png" alt="企业微信群二维码" width="180">
|
|
136
|
-
</p>
|
|
127
|
+

|
|
137
128
|
|
|
138
129
|
扫上面的码进企业微信群。不方便的话发邮件到 <admin@wnluo.com> 或 <wnluo2@gmail.com>。用着顺手就给仓库点个 star,这是最实在的支持。
|
|
139
130
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# 内置宠物包
|
|
2
|
+
|
|
3
|
+
这个目录放**随插件发版走**的默认宠物(见 [`docs/pet-overlay.md`](../../../docs/pet-overlay.md) §1)。
|
|
4
|
+
|
|
5
|
+
- 每个包一个子目录,目录名就是包 id(`[a-z0-9][a-z0-9-]{0,63}`),里面一份 `pack.json`
|
|
6
|
+
加它引用的 `.gif` / `.png`。
|
|
7
|
+
- 这里的包**只读**:手机上删不掉,用户想要自己的一份,就用同一个 id 在
|
|
8
|
+
`$DSH_HOME/storages/mobile-plugin/pets/<id>/` 写一份 —— 用户那份会盖住这里的。
|
|
9
|
+
- 目录可以不存在、也可以是空的:宿主那边「少几个包」而已,不会报错,用户自己的包照常列。
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": 1,
|
|
3
|
+
"id": "deepy-whale",
|
|
4
|
+
"name": "Deepy 小鲸鱼",
|
|
5
|
+
"author": "DSH Mobile",
|
|
6
|
+
"license": "随本项目发布,可自由修改",
|
|
7
|
+
"canvas": {
|
|
8
|
+
"w": 52,
|
|
9
|
+
"h": 52
|
|
10
|
+
},
|
|
11
|
+
"anchor": {
|
|
12
|
+
"x": 28,
|
|
13
|
+
"baseline": 48
|
|
14
|
+
},
|
|
15
|
+
"states": {
|
|
16
|
+
"idle": {
|
|
17
|
+
"file": "idle.gif"
|
|
18
|
+
},
|
|
19
|
+
"working": {
|
|
20
|
+
"file": "working.gif"
|
|
21
|
+
},
|
|
22
|
+
"attention": {
|
|
23
|
+
"file": "attention.gif"
|
|
24
|
+
},
|
|
25
|
+
"done": {
|
|
26
|
+
"file": "done.gif"
|
|
27
|
+
},
|
|
28
|
+
"error": {
|
|
29
|
+
"file": "error.gif"
|
|
30
|
+
},
|
|
31
|
+
"sleeping": {
|
|
32
|
+
"file": "sleeping.gif"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"tiers": {
|
|
36
|
+
"working": [
|
|
37
|
+
{
|
|
38
|
+
"min": 3,
|
|
39
|
+
"file": "working-3.gif"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"min": 1,
|
|
43
|
+
"file": "working.gif"
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
"loop": [
|
|
48
|
+
"idle",
|
|
49
|
+
"working",
|
|
50
|
+
"attention",
|
|
51
|
+
"sleeping"
|
|
52
|
+
],
|
|
53
|
+
"sleepAfterMs": 60000
|
|
54
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 已审核的第三方扩展
|
|
2
|
+
|
|
3
|
+
这个目录随 `dsh-mobile-plugin` 的 npm 包一起发布。手机上「随插件发布」那一档扩展从这里读:
|
|
4
|
+
宿主只认 `catalog.json` 里登记的 slug,目录里有但没登记的一律不下发。
|
|
5
|
+
|
|
6
|
+
## 提交流程
|
|
7
|
+
|
|
8
|
+
1. 在 `extensions/<slug>/` 放扩展包:`manifest.json` 与 `index.html` 等,形状与 App 侧现有
|
|
9
|
+
扩展包一致(自包含、相对路径引用,不许外链)。目录名就是 slug,只认字母、数字、点、
|
|
10
|
+
下划线、横线,最长 64 个字符。**入口页固定叫 `index.html`**:手机打开扩展找的就是包目录
|
|
11
|
+
下这一层,`manifest.json` 里写 `main` 指到别的文件不生效。缺 `index.html` 的包宿主列清单
|
|
12
|
+
时会直接跳过,别等装到手机上才发现打不开。
|
|
13
|
+
2. 在 `extensions/catalog.json` 的 `packages` 里加一条,填 `slug`(必须与目录名一致)与
|
|
14
|
+
`description` / `author` / `releaseNotes`。
|
|
15
|
+
3. 提 PR 前在本地跑一遍自验:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
cd dsh-mobile-plugin
|
|
19
|
+
node --test test/extension-catalog.test.cjs # 宿主列包、入口页、取文件的判据
|
|
20
|
+
npm pack --dry-run # 看扩展目录是否真进了 npm 包
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
想按发版那套全量口径验(含「登记的扩展都带入口页」),跑 `node scripts/preflight-release.mjs`;
|
|
24
|
+
空清单时这几条都是绿的,第一个包进来才真正验得到。
|
|
25
|
+
4. 提 PR,一次只放一个包。合并即随下一次插件发版上架;从 `packages` 里删掉那一条即下架。
|
|
26
|
+
|
|
27
|
+
这个目录是随包发布的只读内容,宿主不会创建它,也不会写它。
|
|
28
|
+
|
|
29
|
+
## 审核口径
|
|
30
|
+
|
|
31
|
+
登记即视为已审核,所以审的是包本身,不是清单里的那几行字:
|
|
32
|
+
|
|
33
|
+
- 入口页第一屏能不能打开,页面有没有模仿系统界面骗用户填东西;
|
|
34
|
+
- 包里会不会往外发请求。页面从 `file://` 加载,CSP 挡外链,资源必须都在包里;
|
|
35
|
+
- `manifest.json` 声明的能力与实际行为对不对得上;
|
|
36
|
+
- 右栏入口的图标与名字像不像 App 自带的功能(叫「设置」「账户」这类直接打回);
|
|
37
|
+
- 体积:整包不超过 20 MB、不超过 200 个文件,单文件不超过 8 MB。缺 `manifest.json`、
|
|
38
|
+
缺 `index.html`、或体积超了,宿主都会静默跳过,包根本不会出现在手机上。
|
|
39
|
+
|
|
40
|
+
## 字段含义
|
|
41
|
+
|
|
42
|
+
`catalog.json` 的形状是 `{"packages": [{"slug": "...", "description": "...", "author": "...", "releaseNotes": "..."}]}`。
|
|
43
|
+
|
|
44
|
+
- `slug`(必填):包目录名,也是手机侧的身份。重复只认第一条,不合规的连读都不读。
|
|
45
|
+
- `description` / `author` / `releaseNotes`(可选):只收非空字符串,缺了或不是字符串一律
|
|
46
|
+
回 `null`。`author` 写显示名加一个能联系上的方式,下架时找得到人。
|
|
47
|
+
- **不要在这里写 `name`、`version`、`size`、`sha256`、`files`、`capabilities`**:文件清单与哈希
|
|
48
|
+
由宿主扫目录现算,名字、版本、能力从包自己的 `manifest.json` 读,填了也不认。
|
|
49
|
+
|
|
50
|
+
宿主下发给手机的一条 Package 还带这些从包里读出来的字段:`name`、`versionName`、
|
|
51
|
+
`apiVersion`、`capabilities`(从 `manifest.json` 收窄成字符串数组)、`size`、`fileCount`、
|
|
52
|
+
`files`(每项 `path` / `size` / `sha256`)。
|
|
53
|
+
|
|
54
|
+
## 取文件
|
|
55
|
+
|
|
56
|
+
`GET /api/mobile/v1/extension/catalog/file?slug=&path=` 按清单里的文件逐个字节下发
|
|
57
|
+
(base64 + sha256)。`path` 只能是包目录内的相对路径,绝对路径、`..`、resolve 之后越出包目录
|
|
58
|
+
的一律拒绝。没登记进 `catalog.json` 的 slug 取不到任何文件。
|
|
59
|
+
|
|
60
|
+
## 与本地开发包的区别
|
|
61
|
+
|
|
62
|
+
作者边写边看用 `$DSH_HOME/extension-dev`(作者电脑上的目录,走 `/extension/dev/*`),那条路
|
|
63
|
+
绕过审核,只能手动导入、界面标「本地」。这里是随插件 npm 包发布的正式来源,要上架就得走
|
|
64
|
+
上面的 PR 与审核。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"packages": []}
|