dsh-plugin-tether 0.1.18 → 0.1.20

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/CHANGELOG.md CHANGED
@@ -2,6 +2,32 @@
2
2
 
3
3
  本文件记录面向用户的变化。每个版本的这一节会原样作为该版本 Release 的说明。
4
4
 
5
+ ## 0.1.20
6
+
7
+ ### 修复
8
+
9
+ - **手机本地模式下发不出图**(0.1.14 起每一版都有)。附件入库时 dsh 会把目标目录的每一级祖先逐个 fsync,边界却取的是文件系统根,于是这个 walk 一定会走出 App 的沙箱。Android 上 `/data/user/0` 的权限是 `drwxrwx--x`,普通 App 只有 x 没有 r,而 fsync 一个目录必须先只读打开它 —— 于是恒 EACCES,界面报 `prompt rejected`,详情是 `EACCES: permission denied, open '/data/user/0'`。发消息不受影响:会话落盘那条路只 fsync 自己那两三层目录、从不往上 walk,所以只验发消息永远发现不了这个问题。现在打包运行时时把目录 fsync 改成「没权限就跳过这一级」。不损失 durability:App 能创建的目录都在沙箱内、照旧被 fsync,再往上全是本进程从未改动过的系统目录。
10
+
11
+ ### 变更
12
+
13
+ - **手机本地模式内置的 dsh 从 `0.1.5-rc.2` 升到 `0.2.0-rc.2`**。装上这一版后,第一次启动本地模式会重新解压运行时。dsh 0.2 换了会话记录的格式:手机上已有的会话打开后照常显示,再发消息时会迁到新格式,旧文件原样留着。真机上逐条验过——重新解压、旧会话打开与迁移、新建会话、发一条消息、发一张图。arm64 包因内置运行时变大,从约 71 MB 涨到约 78 MB;其余 ABI 不含运行时,体积不变。
14
+
15
+ ### English
16
+
17
+ Sending an image in local mode on the phone has never worked since 0.1.14. Ingesting an attachment fsyncs every ancestor of the target directory up to a boundary, and that boundary is the filesystem root — so the walk always leaves the app sandbox. On Android `/data/user/0` is `drwxrwx--x`, leaving an ordinary app with execute but no read, and fsyncing a directory requires opening it read-only first, so it always fails with `EACCES: permission denied, open '/data/user/0'` and the interface reports `prompt rejected`. Sending text was never affected, because session persistence only fsyncs its own two or three levels and never walks upward — which is exactly why testing only "send a message" could never surface it. Directory fsync now skips any level the app may not open; nothing durable is lost, since every directory the app can create is inside the sandbox and still gets fsynced, and everything above it is a system directory this process never touched.
18
+
19
+ The dsh bundled into Android local mode moves from `0.1.5-rc.2` to `0.2.0-rc.2`. The first local-mode start after this update unpacks the runtime again. dsh 0.2 changes the session record format: sessions already on the phone still open and display as before, and migrate to the new format the next time you send a message, with the old file left in place. Verified on a real device end to end — unpacking, opening and migrating an existing session, creating a new one, sending a message, and sending an image. The `arm64` APK grows from about 71 MB to about 78 MB because of the larger bundled runtime; the other ABIs carry no runtime and are unchanged.
20
+
21
+ ## 0.1.19
22
+
23
+ ### 修复
24
+
25
+ - **dsh 0.2 装不上这个插件**。dsh 从 0.1.7 起会按插件声明的兼容范围拦安装:范围没覆盖当前 runtime 就直接拒装,而本插件的范围到 0.1.7 族为止。npm 上 dsh 的默认版本现已是 0.2.0-rc.2,也就是说今天新装 dsh 的人拿到的就是 0.2,一律被拒。范围补上 0.2.0 与 0.2.1 两族。放宽之前 0.2.0-rc.2 与 0.2.1-alpha.1 都逐条实测过:插件加载与 sidecar、浏览器认证的 cookie 兑换与逐请求注入(以及不带 cookie 必须 401)、注入进界面的手机版式、三条路由与跨站栅栏(伪 Host / 跨站标记 / 跨源 Origin 全部 403)、目录选择器补丁、审批事件的透传、以及经 P2P 代理流取到的界面与电脑上直接打开的逐字一致。手机本地模式内置的 dsh 仍是 `0.1.5-rc.2`,这一版没动它。
26
+
27
+ ### English
28
+
29
+ dsh has refused to install plugins whose declared compatibility range does not cover the running dsh since 0.1.7, and this plugin's range stopped at the 0.1.7 family. npm now serves 0.2.0-rc.2 as dsh's default version, so anyone installing dsh today lands on 0.2 and is turned away. The range now covers the 0.2.0 and 0.2.1 families, after verifying both 0.2.0-rc.2 and 0.2.1-alpha.1 end to end: plugin load and sidecar startup, the browser-auth cookie exchange and per-request injection (including the 401 when the cookie is absent), the phone layout injected into the interface, the three plugin routes with their cross-site guard, the directory-picker patch, approval events, and the interface fetched through the proxy stream matching the one served locally byte for byte. The dsh bundled into Android local mode is still `0.1.5-rc.2`; this release does not change it.
30
+
5
31
  ## 0.1.18
6
32
 
7
33
  ### 修复
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
  <a href="../../releases"><img src="https://img.shields.io/github/downloads/zexadev/dsh-tether/total?style=flat&label=downloads&color=4D6BFE" alt="Downloads"></a>
18
18
  <a href="../../stargazers"><img src="https://img.shields.io/github/stars/zexadev/dsh-tether?style=flat&label=%E2%98%85&color=08C" alt="Stars"></a>
19
19
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-2EA44F?style=flat" alt="MIT"></a>
20
- <img src="https://img.shields.io/badge/dsh-0.1.0--rc.7%20%7C%20rc.8%20%7C%200.1.2%20%7C%200.1.5%20%7C%200.1.6%20%7C%200.1.7-4D6BFE?style=flat" alt="dsh 0.1.0-rc.7 | rc.8 | 0.1.2 | 0.1.5 | 0.1.6 | 0.1.7">
20
+ <img src="https://img.shields.io/badge/dsh-0.1.0--rc.7%20%7C%20rc.8%20%7C%200.1.2%20%7C%200.1.5%20%7C%200.1.6%20%7C%200.1.7%20%7C%200.2.0%20%7C%200.2.1-4D6BFE?style=flat" alt="dsh 0.1.0-rc.7 | rc.8 | 0.1.2 | 0.1.5 | 0.1.6 | 0.1.7 | 0.2.0 | 0.2.1">
21
21
  <img src="https://img.shields.io/badge/Android-4493F8?style=flat" alt="Android">
22
22
  <img src="https://img.shields.io/badge/iOS-beta-8E8E93?style=flat" alt="iOS beta">
23
23
  <a href="https://www.dsh.so/artifact/dsh-tether"><img src="https://www.dsh.so/badge/dsh-tether.svg" alt="dsh.so security scan"></a>
@@ -42,16 +42,16 @@ Reaching your own dev machine from a phone usually asks for one of two things: b
42
42
 
43
43
  If you only use your phone on the same Wi-Fi as your machine, you don't need any of this — a LAN setup is simpler.
44
44
 
45
- ### Compared with ds-harness-remote
45
+ ### Compared with similar projects
46
46
 
47
- The project most often compared with this one is [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote). Going by both READMEs:
47
+ The two projects most often compared with this one are [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote) and [chokwinlee/deepseek-harness-desktop](https://github.com/chokwinlee/deepseek-harness-desktop). Going by their READMEs:
48
48
 
49
- | | DSH Tether | ds-harness-remote |
50
- | --- | --- | --- |
51
- | Connection | Direct first (iroh hole-punching), relay only as fallback and it sees ciphertext only; no account, no server to run | Sign in to its service, then LAN → P2P → TURN → Relay in turn; a self-hosted relay is supported |
52
- | No machine around | Android local mode: DSH runs on the phone | — |
53
- | Clients | Android, iOS (beta) | PC, Android, Web; no native iOS app |
54
- | License | MIT | No license file in the repository |
49
+ | | DSH Tether | ds-harness-remote | DSH Desktop |
50
+ | --- | --- | --- | --- |
51
+ | Connection | Direct first (iroh hole-punching), relay only as fallback and it sees ciphertext only; no account, no server to run | Sign in to its service, then LAN → P2P → TURN → Relay in turn; a self-hosted relay is supported | Same Wi-Fi, or a Tailscale network you set up yourself |
52
+ | No machine around | Android local mode: DSH runs on the phone | — | — (its README states it runs no agent on the phone) |
53
+ | Clients | Android; iOS beta (an unsigned IPA you sign yourself) | PC, Android, Web; no native iOS app | Desktop, Android, and iPhone through a public TestFlight beta |
54
+ | License | MIT | No license file in the repository | MIT |
55
55
 
56
56
  ## Download and install
57
57
 
@@ -87,10 +87,10 @@ From then on the app connects by itself when you open it.
87
87
 
88
88
  Open the app → **Hosts** in the top bar → **Run on this phone**. The first start unpacks the runtime first (about 9 seconds measured); after that the DSH interface appears in about 2 seconds. Enter an API key in Settings and start talking.
89
89
 
90
- - **Install and go**: no Termux, no terminal, no commands, no root. Node 24 and the full dependency tree of dsh `0.1.5-rc.2` ship inside the APK and unpack offline on first start; after that only model API calls need the network.
90
+ - **Install and go**: no Termux, no terminal, no commands, no root. Node 24 and the full dependency tree of dsh `0.2.0-rc.2` ship inside the APK and unpack offline on first start; after that only model API calls need the network.
91
91
  - **No pairing**: dsh is on this phone, there is no remote end. Sessions, settings and workspaces live only on the phone and are entirely separate from what you see when connected to a machine; switching back and forth touches neither.
92
92
  - **Stays up**: while running there is a persistent notification (a foreground service), so backgrounding or locking the screen does not get the process reclaimed. If the process is killed anyway, the next launch restarts it; sessions are already on disk.
93
- - **Versioned with the app**: the bundled dsh upgrades with the app; currently `0.1.5-rc.2`.
93
+ - **Versioned with the app**: the bundled dsh upgrades with the app; currently `0.2.0-rc.2`.
94
94
  - Only the `arm64` APK carries local mode; iOS forbids child processes, so the iOS build has no such entry.
95
95
  - The phone has no bash and no full coreutils, so shell-dependent tools are incomplete; chat and file read/write are unaffected.
96
96
 
@@ -136,8 +136,8 @@ The Termux route still works if you prefer it: install dsh and this plugin insid
136
136
  - The app connects when you open it and holds no background connection — Android's doze would not let it anyway.
137
137
  - The interface on the phone is DSH's own; the narrow-screen fit comes from minimal injected styles, so a dsh layout change may need a follow-up here.
138
138
  - English and Chinese: the app follows your phone's system language, terminal output follows the computer's, and the part injected into the dsh interface follows dsh's own language setting. There is no separate language switch.
139
- - Local mode exists only in the `arm64` build, never on iOS; the phone lacks bash and a full coreutils, so shell-dependent tools are incomplete. The `arm64` APK is about 71 MB because of the bundled runtime; the others are about 32 MB.
140
- - Verified against dsh **`0.1.0-rc.7`**, **`0.1.0-rc.8`**, **`0.1.2`** (alpha and rc.1), **`0.1.5-alpha.1`**, **`0.1.5-rc.2`**, **`0.1.6-alpha.2`** and **`0.1.7-rc.2`**. dsh is in developer preview — check this line before assuming a newer dsh works. From 0.1.7 dsh refuses to install a plugin whose declared range does not cover it, so a version outside this line is a refusal at install time rather than a silent risk. The browser authentication dsh introduced in 0.1.2-alpha is handled entirely on the machine side; the phone app needs no update for it.
139
+ - Local mode exists only in the `arm64` build, never on iOS; the phone lacks bash and a full coreutils, so shell-dependent tools are incomplete. The `arm64` APK is about 78 MB because of the bundled runtime; the others are about 32 MB.
140
+ - Verified against dsh **`0.1.0-rc.7`**, **`0.1.0-rc.8`**, **`0.1.2`** (alpha and rc.1), **`0.1.5-alpha.1`**, **`0.1.5-rc.2`**, **`0.1.6-alpha.2`**, **`0.1.7-rc.2`**, **`0.2.0-rc.2`** and **`0.2.1-alpha.1`**. dsh is in developer preview — check this line before assuming a newer dsh works. From 0.1.7 dsh refuses to install a plugin whose declared range does not cover it, so a version outside this line is a refusal at install time rather than a silent risk. The browser authentication dsh introduced in 0.1.2-alpha is handled entirely on the machine side; the phone app needs no update for it.
141
141
 
142
142
  ## What has been verified
143
143
 
package/README.zh.md CHANGED
@@ -17,7 +17,7 @@
17
17
  <a href="../../releases"><img src="https://img.shields.io/github/downloads/zexadev/dsh-tether/total?style=flat&label=downloads&color=4D6BFE" alt="下载量"></a>
18
18
  <a href="../../stargazers"><img src="https://img.shields.io/github/stars/zexadev/dsh-tether?style=flat&label=%E2%98%85&color=08C" alt="Stars"></a>
19
19
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-2EA44F?style=flat" alt="MIT"></a>
20
- <img src="https://img.shields.io/badge/dsh-0.1.0--rc.7%20%7C%20rc.8%20%7C%200.1.2%20%7C%200.1.5%20%7C%200.1.6%20%7C%200.1.7-4D6BFE?style=flat" alt="dsh 0.1.0-rc.7 | rc.8 | 0.1.2 | 0.1.5 | 0.1.6 | 0.1.7">
20
+ <img src="https://img.shields.io/badge/dsh-0.1.0--rc.7%20%7C%20rc.8%20%7C%200.1.2%20%7C%200.1.5%20%7C%200.1.6%20%7C%200.1.7%20%7C%200.2.0%20%7C%200.2.1-4D6BFE?style=flat" alt="dsh 0.1.0-rc.7 | rc.8 | 0.1.2 | 0.1.5 | 0.1.6 | 0.1.7 | 0.2.0 | 0.2.1">
21
21
  <img src="https://img.shields.io/badge/Android-4493F8?style=flat" alt="Android">
22
22
  <img src="https://img.shields.io/badge/iOS-%E6%B5%8B%E8%AF%95%E7%89%88-8E8E93?style=flat" alt="iOS 测试版">
23
23
  <a href="https://www.dsh.so/artifact/dsh-tether"><img src="https://www.dsh.so/badge/dsh-tether.svg" alt="dsh.so 安全扫描"></a>
@@ -42,16 +42,16 @@ DSH Tether 把 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harnes
42
42
 
43
43
  如果你只在和电脑同一个 WiFi 下用手机,你并不需要这些——局域网方案更简单。
44
44
 
45
- ### 与 ds-harness-remote 的区别
45
+ ### 与同类项目的区别
46
46
 
47
- 同类里最常被拿来比的是 [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote)。按两边的 README 对照:
47
+ 同类里最常被拿来比的是 [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote) 和 [chokwinlee/deepseek-harness-desktop](https://github.com/chokwinlee/deepseek-harness-desktop)。按各自的 README 对照:
48
48
 
49
- | | DSH Tether | ds-harness-remote |
50
- | --- | --- | --- |
51
- | 建链 | 直连优先(iroh 打洞),失败才退回 relay,relay 只见密文;不用账号,不用架服务器 | 登录其服务后建链,LAN → P2P → TURN → Relay 逐级回退,也可自建 relay |
52
- | 没电脑时 | Android 本地模式,DSH 跑在手机上 | — |
53
- | 客户端 | Android、iOS(测试版) | PC、Android、Web,无 iOS 原生 App |
54
- | 许可证 | MIT | 仓库未附许可证 |
49
+ | | DSH Tether | ds-harness-remote | DSH Desktop |
50
+ | --- | --- | --- | --- |
51
+ | 建链 | 直连优先(iroh 打洞),失败才退回 relay,relay 只见密文;不用账号,不用架服务器 | 登录其服务后建链,LAN → P2P → TURN → Relay 逐级回退,也可自建 relay | 同一 Wi-Fi,或自己搭的 Tailscale |
52
+ | 没电脑时 | Android 本地模式,DSH 跑在手机上 | — | —(其 README 明确说不在手机上跑 agent) |
53
+ | 客户端 | Android;iOS 测试版(未签名 IPA,需自行签名) | PC、Android、Web,无 iOS 原生 App | 桌面端、Android,以及经公开 TestFlight 的 iPhone 版 |
54
+ | 许可证 | MIT | 仓库未附许可证 | MIT |
55
55
 
56
56
  ## 下载与安装
57
57
 
@@ -87,10 +87,10 @@ dsh plugin --profile web add .
87
87
 
88
88
  打开 App → 顶栏「主机」→ **在本机运行**。第一次要先解压运行时(实测约 9 秒),之后每次约 2 秒出现 dsh 的界面;在设置里填上 API Key 就能对话。
89
89
 
90
- - **装完即用**:不装 Termux、不开终端、不敲命令、不要 root。Node 24 与 dsh `0.1.5-rc.2` 的完整依赖树打在 APK 里,首次启动离线解压;之后只有调用模型 API 才需要网络。
90
+ - **装完即用**:不装 Termux、不开终端、不敲命令、不要 root。Node 24 与 dsh `0.2.0-rc.2` 的完整依赖树打在 APK 里,首次启动离线解压;之后只有调用模型 API 才需要网络。
91
91
  - **没有配对**:dsh 就在这台手机上,没有远端。会话、设置、工作区只存在手机里,和连电脑时看到的完全是两套,来回切换互不影响。
92
92
  - **常驻**:运行期间有一条常驻通知(前台服务),退后台、锁屏不会被系统收掉;进程真被杀了,下次打开 App 自动重起,会话已落盘不丢。
93
- - **版本随 App 走**:内置的 dsh 随 App 升级一起升,当前内置 `0.1.5-rc.2`。
93
+ - **版本随 App 走**:内置的 dsh 随 App 升级一起升,当前内置 `0.2.0-rc.2`。
94
94
  - 只有 `arm64` 的 APK 带本地模式;iOS 的沙箱不允许子进程,iOS 版没有这个入口。
95
95
  - 手机上没有 bash 和完整的 coreutils,依赖 shell 的工具用不全;对话、文件读写不受影响。
96
96
 
@@ -136,8 +136,8 @@ dsh plugin --profile web add .
136
136
  - App 打开时才连接,不在后台常驻——Android 的 doze 也留不住它。
137
137
  - 手机上的界面是 DSH 自己的,窄屏适配靠注入的最小样式完成;dsh 改版式时可能需要跟进。
138
138
  - 中英双语:App 界面跟随手机的系统语言;电脑终端上的输出跟随电脑的系统语言;注入 dsh 界面的那部分跟随 dsh 自己的语言设置。没有单独的语言开关。
139
- - 本地模式只有 `arm64` 包有,iOS 没有;手机上没有 bash 与完整 coreutils,依赖 shell 的工具用不全。arm64 包因内置运行时约 71 MB,其余包约 32 MB。
140
- - 已针对 dsh **`0.1.0-rc.7`**、**`0.1.0-rc.8`**、**`0.1.2`**(alpha 与 rc.1)、**`0.1.5-alpha.1`**、**`0.1.5-rc.2`**、**`0.1.6-alpha.2`** 与 **`0.1.7-rc.2`** 验证。dsh 处于 developer preview,换更新的 dsh 之前先看这一行。0.1.7 起 dsh 会拒绝安装声明范围没覆盖自己的插件,所以这一行之外的版本是装不上,而不是装上了埋雷。dsh 0.1.2-alpha 引入的浏览器认证完全在电脑侧处理,手机 App 无需更新。
139
+ - 本地模式只有 `arm64` 包有,iOS 没有;手机上没有 bash 与完整 coreutils,依赖 shell 的工具用不全。arm64 包因内置运行时约 78 MB,其余包约 32 MB。
140
+ - 已针对 dsh **`0.1.0-rc.7`**、**`0.1.0-rc.8`**、**`0.1.2`**(alpha 与 rc.1)、**`0.1.5-alpha.1`**、**`0.1.5-rc.2`**、**`0.1.6-alpha.2`**、**`0.1.7-rc.2`**、**`0.2.0-rc.2`** 与 **`0.2.1-alpha.1`** 验证。dsh 处于 developer preview,换更新的 dsh 之前先看这一行。0.1.7 起 dsh 会拒绝安装声明范围没覆盖自己的插件,所以这一行之外的版本是装不上,而不是装上了埋雷。dsh 0.1.2-alpha 引入的浏览器认证完全在电脑侧处理,手机 App 无需更新。
141
141
 
142
142
  ## 验证过什么
143
143
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-tether",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Mobile client for the DeepSeek Harness — use the dsh on your dev machine from your Android or iOS phone, remotely across networks, peer-to-peer over iroh with no server to set up (falls back to a relay that only sees ciphertext)",
5
5
  "keywords": [
6
6
  "dsh",
@@ -42,23 +42,24 @@
42
42
  },
43
43
  "androidRuntime": {
44
44
  "node": "24.18.0",
45
- "dsh": "0.1.5-rc.2"
45
+ "dsh": "0.2.0-rc.2",
46
+ "koffi": "3.3.0"
46
47
  }
47
48
  },
48
49
  "peerDependencies": {
49
- "@deepseek-ai/dsh-host-webserver": ">=0.1.0-rc.7 <0.1.1-0 || >=0.1.2-alpha.0 <0.1.3-0 || >=0.1.5-alpha.0 <0.1.8-0",
50
- "@deepseek-ai/dsh-user-approval": ">=0.1.0-rc.7 <0.1.1-0 || >=0.1.2-alpha.0 <0.1.3-0 || >=0.1.5-alpha.0 <0.1.8-0"
50
+ "@deepseek-ai/dsh-host-webserver": ">=0.1.0-rc.7 <0.1.1-0 || >=0.1.2-alpha.0 <0.1.3-0 || >=0.1.5-alpha.0 <0.1.8-0 || >=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-alpha.1 <0.2.2-0",
51
+ "@deepseek-ai/dsh-user-approval": ">=0.1.0-rc.7 <0.1.1-0 || >=0.1.2-alpha.0 <0.1.3-0 || >=0.1.5-alpha.0 <0.1.8-0 || >=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-alpha.1 <0.2.2-0"
51
52
  },
52
53
  "peerDependenciesMeta": {
53
54
  "@deepseek-ai/dsh-host-webserver": { "optional": true },
54
55
  "@deepseek-ai/dsh-user-approval": { "optional": true }
55
56
  },
56
57
  "optionalDependencies": {
57
- "dsh-tether-host-android-arm64": "0.1.18",
58
- "dsh-tether-host-darwin-arm64": "0.1.18",
59
- "dsh-tether-host-darwin-x64": "0.1.18",
60
- "dsh-tether-host-linux-arm64": "0.1.18",
61
- "dsh-tether-host-linux-x64": "0.1.18",
62
- "dsh-tether-host-win32-x64": "0.1.18"
58
+ "dsh-tether-host-android-arm64": "0.1.20",
59
+ "dsh-tether-host-darwin-arm64": "0.1.20",
60
+ "dsh-tether-host-darwin-x64": "0.1.20",
61
+ "dsh-tether-host-linux-arm64": "0.1.20",
62
+ "dsh-tether-host-linux-x64": "0.1.20",
63
+ "dsh-tether-host-win32-x64": "0.1.20"
63
64
  }
64
65
  }