dsh-over-ssh 0.2.1 → 0.2.3

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
@@ -19,6 +19,12 @@ npm i && npm run build
19
19
  dsh plugin --profile web add /绝对路径/dsh-over-ssh
20
20
  ```
21
21
 
22
+ > **GUI 安装提示**:pnpm 会问是否允许安装脚本,列表里是 `ssh2` 与 `cpu-features`:允许后重试即可。
23
+ > 它们是 `ssh2` 传输的可选原生加速,拒绝会让 pnpm 中止本次安装(插件源码本身没有安装脚本)。
24
+ >
25
+ > 0.2.2 及更早在运行中的页面上启用插件时出现过 `2 entries did not activate`(`workingDirectory` /
26
+ > `fileReferences` 链);0.2.3 删掉了那条私有域克隆链(审计 0134),不再需要为它重启。
27
+
22
28
  **远端终端**要额外配一次 `terminalController.Config.shell`——`Config.shell` 是静态单值,连哪台只能由 wrapper 运行时决定:
23
29
 
24
30
  | 装法 | 指向 |
@@ -35,6 +41,39 @@ shell:
35
41
 
36
42
  不配也能用,只是 Web 终端永远开在本地(远程文件、远端执行、`@` 补全不受影响)。
37
43
 
44
+ ## 0.2.3 更新
45
+
46
+ > 下面这些内容相对 npm 上的 **0.2.2** 一起生效。
47
+
48
+ - **热启用不再失败**:移除私有域里对平台 `@deepseek-ai/dsh-file-reference-local` 的克隆与 `localFileReferences` 桥:
49
+ 根作用域的 `file-references` 本来就自己实现本地有界走查,那份克隆没有消费者。效果是启用插件时
50
+ 不再出现 `2 entries did not activate`(`workingDirectory` / `fileReferences` 等待链),热启用可以直接
51
+ 完成,不必为它完整重启。
52
+ - 组合层因此只剩 6 个条目(原 8 个):私有域只保留 `fs-sandbox` 克隆 + `localFs` 桥,本地写入围栏仍由
53
+ 平台沙箱执行。
54
+ - 文件引用补全复查(审计 0135):单个远端来源失败只降级该来源,不再让整个 `@` 补全失败;缓存命中后
55
+ 的取消仍按取消处理;Windows 本地根的反斜杠路径参与文件名/深度排序;符号链接目录按目录处理,只有
56
+ 指向根内的链接会被展开(根外链接只列链接本身,不把工作区外的文件带进 `@`),并带环检测与 Windows
57
+ 忽略目录大小写处理;打字快于一次走查时,同根并发调用共享一次树枚举、不再重复扫树(探针:6 次击键
58
+ = 1 次走查)。
59
+ - LSP 复查(审计 0136):`remote_lsp` 的 `server` 支持带空格的路径(引号切分,`"/opt/my tools/server" --stdio`,
60
+ 未闭合引号明确报错);宿主 `lsp.read` 每轮只取 256 KiB,不再吃满代理 2 MiB 默认块;客户端卡片的初始
61
+ 焦点与 Tab 集合跳过不可见控件。
62
+ - 回收站与锁(审计 0137):索引记录父子关系,**还原父会话会连带还原子会话**(失败留在垃圾并回报);
63
+ 会话/回收站锁加心跳,跨设备大目录 copy 超过 60 s 也不会被当成陈旧锁抢走;缺 `entryId` 的回收站条目
64
+ 现在可见但不可操作并说明原因;连接被删除后编辑对话框不再提交请求。
65
+ - 构建:删掉的宿主入口产物会被清理,不再随包发出(0.2.3 首次打包曾多带一个 `local-bridge-refs.js`)。
66
+ - 其余行为不变;远端 `@`、本地 `@`、文件工具、会话面板均未改动。
67
+
68
+ ## 0.2.2 更新
69
+
70
+ - 「添加目录」按会话作用域显示与删除,fork 子会话继承父会话的目录且立即可见。
71
+ - 会话面板:删除/还原/清理都有确认与部分失败说明;运行中的会话拒绝删除;回收站条目显示标题与删除时间。
72
+ - SSH 传输:连接闪断后自动重建(不再永久超时);版本守卫会校验摘要来源,损坏/缺失的摘要不再当守卫。
73
+ - 宿主 HTTP:请求体超限、路径含 NUL、根外访问返回 400 而不是 500;`?workspace=` 单独给出时也生效。
74
+ - 性能:会话面板刷新的日志头读取加签名缓存(31 会话冷 17 ms → 热 1.3–3.7 ms);`GET /roots` 与
75
+ `user-roots.json` 读取走 stat 短路;`?session=` 过滤先过滤后投影。
76
+
38
77
  ## 发布说明
39
78
 
40
79
  包里带了两个平台的 Tier 2 代理二进制(纯静态,远端零依赖)。源码在配套的 Go 仓库
@@ -45,10 +84,10 @@ shell:
45
84
 
46
85
  | 平台 | 字节 | sha256 |
47
86
  |---|---|---|
48
- | linux-amd64 | 4,944,032 | `fd5a5d6f8be07e786cc7c34a1aad8e2f040f1de3b7f124e739d2209df5ab5038` |
49
- | linux-arm64 | 4,653,216 | `202f4be3d1c1d98ccae27b9ccaa4879fa148c741981063f8be98689674b3ad2e` |
87
+ | linux-amd64 | 4,944,032 | `a1272e45a8213d4725a9eb91f9d08f1b5f460623e38730abef735c4569339d8d` |
88
+ | linux-arm64 | 4,653,216 | `1a8c20619fc335f6135a87e4f854a30a93a5d227e867fbf0eee1820f36840cf4` |
50
89
 
51
- - 代理版本:`0.2.1-e019f2d`
90
+ - 代理版本:`0.2.3-e019f2d`
52
91
  - 源码提交:`e019f2d`(Go 仓 `dsh-over-ssh-agent` 的这个提交)
53
92
  - 清单原文:包内 `agents/agent-manifest.json`
54
93
  - 核对:`sha256sum agents/<平台>/dsh-over-ssh-agent` 与上表比对;按上面的提交检出 Go 仓后
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-11-05T23:45:29.528Z",
4
- "agentVersion": "0.2.1-e019f2d",
3
+ "generatedAt": "2026-11-07T05:49:15.687Z",
4
+ "agentVersion": "0.2.3-e019f2d",
5
5
  "sourceCommit": "e019f2d",
6
6
  "artifacts": [
7
7
  {
8
8
  "platform": "linux-amd64",
9
9
  "path": "linux-amd64/dsh-over-ssh-agent",
10
- "sha256": "fd5a5d6f8be07e786cc7c34a1aad8e2f040f1de3b7f124e739d2209df5ab5038",
10
+ "sha256": "a1272e45a8213d4725a9eb91f9d08f1b5f460623e38730abef735c4569339d8d",
11
11
  "bytes": 4944032
12
12
  },
13
13
  {
14
14
  "platform": "linux-arm64",
15
15
  "path": "linux-arm64/dsh-over-ssh-agent",
16
- "sha256": "202f4be3d1c1d98ccae27b9ccaa4879fa148c741981063f8be98689674b3ad2e",
16
+ "sha256": "1a8c20619fc335f6135a87e4f854a30a93a5d227e867fbf0eee1820f36840cf4",
17
17
  "bytes": 4653216
18
18
  }
19
19
  ]
package/cordis.patch.yml CHANGED
@@ -12,10 +12,14 @@
12
12
  # ctx.fs ← dsh-over-ssh/fs(多根路由)
13
13
  # ctx.fileReferences ← dsh-over-ssh/file-references(多根 @ 补全)
14
14
  #
15
- # 私有域(isolate: fs / fileReferences):
15
+ # 私有域(isolate: fs):
16
16
  # ctx.fs ← @deepseek-ai/dsh-fs-sandbox(**原版**,继续服务本地路径)
17
- # ctx.fileReferences ← @deepseek-ai/dsh-file-reference-local(**原版**)
18
- # 两个 bridge 把域内实例以 localFs / localFileReferences 暴露给根作用域。
17
+ # 一个 bridge 把域内实例以 localFs 暴露给根作用域。
18
+ #
19
+ # 文件引用**不再克隆平台实现**:根作用域的 dsh-over-ssh/file-references 自己实现了本地有界走查
20
+ # (见 integration/fs/file-reference-provider.ts),平台侧的 localFileReferences 没有任何消费者。
21
+ # 2026-11-07 审计 0134 删掉了那条克隆链:它让私有域多等一个 workingDirectory 服务,而 DSH 热启用
22
+ # 时这个依赖会短暂缺失,表现为「启用失败:2 entries did not activate」。
19
23
  #
20
24
  # 为什么是「接管」而不是「共存」:`ctx.fs` 是 Cordis 单例服务,同一隔离作用域只能有一个提供方,
21
25
  # 再注册第二个会抛 `service "fs" has been registered`。`isolate` 让原版实现能在私有域里继续跑,
@@ -24,8 +28,9 @@
24
28
  # 已实测的前提(cordis 0.2.1-rc.2):域内 `fs` 解析到域内实例;根 `fs` 不受影响;可以同时存在多个域;
25
29
  # 根作用域的消费者能注入到域内 bridge 暴露出来的 `localFs`。任何一条不成立这套组合都不成立。
26
30
  #
27
- # 这两组行必须**同时**生效或同时不生效:只禁用核心行而不启用本插件的行,会让 `ctx.fs` /
28
- # `ctx.fileReferences` 无人提供,所有文件能力一起失效。
31
+ # `ctx.fs` 与 `ctx.fileReferences` 两级都要有提供方:核心 fs-sandbox / file-reference-local 被本包
32
+ # 禁用后,根作用域由 dsh-over-ssh/fs 与 dsh-over-ssh/file-references 接管;本地路径的写入围栏由私有域
33
+ # 里那份原版 fs-sandbox 经 localFs 桥接执行。
29
34
  #
30
35
  # 还原:禁用整个 bundle。不要只删其中一行。
31
36
  #
@@ -57,19 +62,12 @@
57
62
  group: true
58
63
  isolate:
59
64
  fs: true
60
- fileReferences: true
61
65
  config:
62
66
  - id: 远程工作区-平台沙箱副本
63
67
  name: '@deepseek-ai/dsh-fs-sandbox'
64
- - id: 远程工作区-平台文件引用副本
65
- name: '@deepseek-ai/dsh-file-reference-local'
66
- # 两个 bridge 分开:file-reference-local 依赖 workingDirectory(在下游),不能和 fs 挤在同一行。
67
68
  - id: 远程工作区-桥接fs
68
69
  name: dsh-over-ssh/local-bridge
69
70
  inject: [fs]
70
- - id: 远程工作区-桥接文件引用
71
- name: dsh-over-ssh/local-bridge-refs
72
- inject: [fileReferences]
73
71
 
74
72
  # 根作用域的提供方。两个入口都是「路由型」:本地路径与远端路径由同一套表分发。
75
73
  - id: 远程工作区-路由fs