@zhangfengshun/dsh-remote-ssh 1.2.0

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 ADDED
@@ -0,0 +1,68 @@
1
+ # Changelog
2
+
3
+ 本文件的版本号与 `package.json` 的 `version` 保持一致。每个版本对应一个 Cordis Package 快照(`pkg-N`)。
4
+
5
+ ## [1.2.0] — 中英文双语
6
+ ### 新增
7
+ - **界面国际化**:Client 半边接入 `ctx.locale`,注册 `dsh-remote-ssh` 命名空间的 `zh` / `en` 词典,所有界面文案(页签标题、设置小节、文件/终端页签、添加工作区弹窗)跟随 DSH 设置中的语言自动切换。
8
+ - 模型工具 `description` 与远程工作区 `README.md` 改为中英双语。
9
+ - **会话切换状态记忆**:「远程文件」页签记住已选工作区/连接、浏览目录与打开的文件,「远程终端」页签记住已选连接与已打开的终端(按 `sessionId` 分桶,模块级存活)。切换到其它会话再切回时不再丢失选择。
10
+ ### 变更
11
+ - **包名改为作用域包 `@zhangfengshun/dsh-remote-ssh`**(npm 上无作用域的 `dsh-remote-ssh` 已被占用)。
12
+ - 清理开发者使用痕迹:设置表单占位符改为通用示例(`login.example.com`、`your-username`、`~/.ssh/id_rsa` 等),移除特定超算厂商信息。
13
+ - 文档修正:README 中已移除的「远程连接」侧边栏页签描述更新为当前「远程文件 / 远程终端」两个页签 + 设置页小节。
14
+ - 设置面板栏目名改为「🖥️ 远程连接 / 🖥️ Remote Connections」,并隐藏壳层对第三方栏目硬编码的齿轮图标(CSS 定位最后一个导航项)。
15
+ ### 修复
16
+ - 「添加工作区」弹窗在打开时重新拉取连接配置,避免在设置中新建连接后、弹窗下拉里看不到该连接(此前 `useProfiles` 仅在挂载时拉取一次)。
17
+
18
+ ## [1.1.0] — 原生远程工作区
19
+ ### 重大变更
20
+ - 移除 better-sidebar 的「远程连接」页签;连接配置改由 DSH 设置页「远程连接」小节统一管理。
21
+ - 接管 DSH 原生「添加工作区」流程(`directoryFlow` 槽位,优先级 -100 覆盖内置本地目录选择器),提供「本地目录 / 远程目录」两选。
22
+ ### 新增
23
+ - 创建远程工作区时:在本地生成镜像目录(`~/.dsh/remote-workspaces/<id>`),注册进原生 `workspaceRegistry`,远程工作区直接出现在原生工作区列表、按原生流程创建会话。
24
+ - 远程工作区元数据(`profileId` / `remotePath` / `mirrorPath`)持久化到 settings;删除时同步清理原生注册与镜像目录。
25
+ - 「远程文件」页签:选中远程工作区后可编辑其**默认目录**(`remotePath`),保存后打开该工作区即进入该目录。
26
+ - 「添加工作区 → 选择本地/远程目录」改用原生 `Modal` 弹窗(与本地目录浏览器一致),不再内联渲染。
27
+ - 本地目录选择改用 DSH `browse` 能力(`workspaces.listDirectory`)在弹窗内浏览,不再依赖不可用的原生对话框。
28
+ - 修复远程目录浏览:`remoteRoot` 以 `~` 开头时正确展开为家目录(此前 `cd '~'` 会失败导致「读取目录失败」)。
29
+ - 模型工具**会话感知**:在远程工作区会话中,`remote_ssh_ls/cat/write/exec` 无需 `profileId`,自动使用该工作区的连接与目录(相对路径基于 `remotePath` 解析,`remote_ssh_exec` 自动 `cd` 到远程目录)。
30
+ - `remote_ssh_profiles` 增加 `currentRemote` 字段,返回当前会话所属远程工作区上下文。
31
+ - 创建远程工作区时在镜像目录写入 `README.md`,提示模型使用 `remote_ssh_*` 工具操作远程文件与终端。
32
+ - 「添加工作区」弹窗宽度默认 690px(原约 460px 的 1.5 倍),右下角可拖拽手动调整宽度。
33
+
34
+ ## [1.0.0] — 静态插件版
35
+ ### 重大变更
36
+ - 从动态 Cordis 插件重构为**静态 DSH Web 插件包**(durable settings 必需),安装到 profile。
37
+ ### 新增
38
+ - 连接配置 + 远程工作区持久化到 DSH `settings` 命名空间 `dsh-remote-ssh`(密码 `role('secret')` 脱敏)。
39
+ - 通过 `ctx.betterSidebar.registerTab` 注册「远程文件 / 远程终端 / 远程连接」三个侧边栏页签。
40
+ - DSH 设置页新增「远程连接」小节(`settings.section`)管理连接配置。
41
+ - 远程工作区:选择远程目录创建 / 打开 / 删除(与本地工作区选目录体验一致)。
42
+ - Host 暴露 `/remote-ssh/api/*` HTTP JSON API(Client 通过 fetch 调用,替代动态插件的 `host.call`)。
43
+ - 5 个模型工具改为 `ctx.tools.register(defineTool(...))` 注册。
44
+
45
+ ## [0.5.0] — 2025-XX-XX(pkg-5)
46
+ ### 修复
47
+ - 文件列举:`find -printf` 用 `%Y`(跟随软链接取目标类型),软链接目录在文件树中按目录导航(适配家目录软链接,如 `run -> /data/run01/<user>`)。
48
+
49
+ ## [0.4.0] — 2025-XX-XX(pkg-4)
50
+ ### 修复
51
+ - 模型工具渲染:`remote_ssh_exec` 成功时优先显示 stdout,`remote_ssh_write` 成功时显示「已写入」——不再被首次连接时 ssh 写入 stderr 的 `Permanently added ... to known hosts` 警告掩盖。
52
+
53
+ ## [0.3.0] — 2025-XX-XX(pkg-3)
54
+ ### 修复
55
+ - 移除 `-o LogLevel=ERROR`,使 ssh 的致命错误(连接被拒绝、主机密钥校验失败、认证失败等)原样返回给界面与模型工具。
56
+ - `runRemote` 在「非零退出且 stdout/stderr 均为空」时合成兜底错误信息 `ssh 退出码 N`,避免出现空泛的 `failed`。
57
+
58
+ ## [0.2.0] — 2025-XX-XX(pkg-2)
59
+ ### 新增
60
+ - 5 个模型可调用工具:`remote_ssh_profiles`、`remote_ssh_exec`、`remote_ssh_ls`、`remote_ssh_cat`、`remote_ssh_write`。
61
+ - Host 逻辑重构为可复用函数(`resolveProfile` / `remoteListDir` / `remoteReadFile` / `remoteWriteFile`),RPC 与工具共用同一套连接配置存储。
62
+
63
+ ## [0.1.0] — 2025-XX-XX(pkg-1)
64
+ ### 新增
65
+ - 右侧侧边栏面板(`shell.overlay` 槽位):连接 / 文件 / 终端三个页签。
66
+ - 连接配置管理(名称 / host / 端口 / 用户 / 认证方式 / 远程根目录),密钥与密码(sshpass)认证,测试连接。
67
+ - 远程文件浏览(进入目录 / 返回上级 / 打开查看 / 内嵌编辑并保存)。
68
+ - `ssh -tt` 集成远程终端(多开、关闭、输出流式回显)。
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 dsh-remote-ssh contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,158 @@
1
+ # @zhangfengshun/dsh-remote-ssh
2
+
3
+ 类 **VSCode Remote-SSH** 的 **DeepSeek Harness(DSH)** Web 插件:通过 SSH 连接远程超算 / 服务器,在 DSH 中完成远程工作区、远程文件浏览 / 编辑、集成远程终端,并让模型可以直接读写远程文件、执行远程命令。
4
+
5
+ 界面与工具描述均支持**中英文双语**,跟随 DSH 设置中的语言自动切换。
6
+
7
+ ## 功能特性
8
+
9
+ | 能力 | 说明 |
10
+ | --- | --- |
11
+ | 🔌 远程连接 | SSH 连接超算 / 服务器,密钥认证(推荐)或密码认证(需本机 `sshpass`),内置「测试连接」 |
12
+ | 🗂️ 远程文件 | 在 better-sidebar「远程文件」页签浏览 / 打开 / 编辑 / 保存远程文件 |
13
+ | 💻 远程终端 | 在 better-sidebar「远程终端」页签打开 `ssh -tt` 集成终端,支持多终端并发 |
14
+ | 🌐 远程工作区 | 选择远程目录创建**原生工作区**(本地镜像目录 + 原生注册),一键打开进入远程环境 |
15
+ | 🤖 模型工具 | 5 个 `remote_ssh_*` 工具,模型可读写远程文件、执行远程命令;在远程工作区会话中免填连接参数 |
16
+ | 🌍 国际化 | 界面文案 + 工具描述中英双语,通过 `ctx.locale` 跟随 DSH 语言设置自动切换 |
17
+ | 🧠 会话记忆 | 切换会话后,「远程文件」「远程终端」页签记住已选连接、浏览目录、打开的文件与终端 |
18
+
19
+ ## 安装
20
+
21
+ ### 本地 / 开发安装
22
+
23
+ ```bash
24
+ dsh plugin --profile <name> add /absolute/path/to/dsh-remote-ssh
25
+ ```
26
+
27
+ ### 发布后安装
28
+
29
+ ```bash
30
+ dsh plugin --profile <name> add @zhangfengshun/dsh-remote-ssh@1.2.0
31
+ ```
32
+
33
+ > ⚠️ 安装后需**重启 DSH** 才生效;后续仅修改 Client 半边时刷新浏览器即可。
34
+
35
+ ## 快速开始
36
+
37
+ 1. 安装插件并重启 DSH。
38
+ 2. 打开 **设置 → 🖥️ 远程连接**,添加一条连接(主机 / 端口 / 用户名 / 密钥或密码),点「测试连接」验证。
39
+ 3. 在侧边栏打开 **🗂️ 远程文件** 或 **💻 远程终端** 页签使用。
40
+ 4. 需要把远程目录当作工作区时:走 DSH 原生「添加工作区」流程,在弹窗中选择「**选择远程目录…**」。
41
+
42
+ ## 使用指南
43
+
44
+ ### 1. 添加远程连接
45
+
46
+ 设置 → 🖥️ 远程连接,填写:
47
+
48
+ | 字段 | 说明 |
49
+ | --- | --- |
50
+ | 名称 | 自定义显示名 |
51
+ | 主机 | SSH 主机名或 IP(如 `login.example.com`) |
52
+ | 端口 | SSH 端口,默认 `22` |
53
+ | 用户名 | 登录用户 |
54
+ | 认证方式 | `密钥`(推荐)或 `密码` |
55
+ | 密钥路径 / 密码 | 私钥路径(如 `~/.ssh/id_rsa`)或登录密码 |
56
+ | 远程根目录 | 远程默认目录,默认 `~` |
57
+
58
+ 连接配置持久化在 DSH 设置命名空间 `dsh-remote-ssh` 中(密码字段 `role('secret')` 脱敏)。
59
+
60
+ ### 2. 远程文件(🗂️)
61
+
62
+ - 选择**远程工作区**或**连接配置**,浏览远程目录;
63
+ - 点击文件即可打开并编辑,保存后写回远程;
64
+ - 已选连接 / 目录 / 打开的文件在**切换会话后自动恢复**。
65
+
66
+ ### 3. 远程终端(💻)
67
+
68
+ - 选择连接配置,点「新建终端」打开 `ssh -tt` 交互式终端;
69
+ - 支持同时打开多个终端,会话切换后终端列表自动恢复(终端本体在宿主进程存活,恢复后继续回显)。
70
+
71
+ ### 4. 远程工作区(🌐)
72
+
73
+ 1. 打开 DSH 原生「添加工作区」流程;
74
+ 2. 选择「**选择远程目录…**」→ 选择连接 → 浏览并选择远程目录;
75
+ 3. 插件在本地生成镜像目录 `~/.dsh/remote-workspaces/<id>` 并注册进原生工作区列表(标题 `🌐 <名称>`);
76
+ 4. 从工作区创建会话后,会话工作目录即该镜像目录,模型工具自动感知对应的远程连接与目录。
77
+
78
+ ### 5. 模型工具(🤖)
79
+
80
+ 插件向模型注册 5 个工具,模型可直接操作远程环境:
81
+
82
+ | 工具 | 用途 |
83
+ | --- | --- |
84
+ | `remote_ssh_profiles` | 列出已保存连接配置;返回当前会话的远程工作区上下文 |
85
+ | `remote_ssh_exec` | 在远程主机执行命令(返回 stdout / stderr / exitCode) |
86
+ | `remote_ssh_ls` | 列举远程目录 |
87
+ | `remote_ssh_cat` | 读取远程文本文件(base64 传输,二进制安全) |
88
+ | `remote_ssh_write` | 写入远程文件(覆盖写入) |
89
+
90
+ **会话感知**:当会话是从远程工作区创建时,模型调用这些工具可**不填** `profileId` / `host` / `user` 等连接参数,自动复用该工作区的连接,相对路径基于该工作区远程目录解析。
91
+
92
+ ## 目录结构
93
+
94
+ ```
95
+ dsh-remote-ssh/
96
+ ├── package.json # npm 元数据 + dsh.bundle / dsh.client 声明
97
+ ├── cordis.patch.yml # bundle 挂载补丁(install 时加入 profile bundle 栈)
98
+ ├── lib/
99
+ │ ├── index.js # Host 半边(SSH + settings + 5 个工具 + HTTP API)
100
+ │ └── client.js # Client 半边(better-sidebar 页签 + 设置小节 + i18n)
101
+ ├── LICENSE
102
+ ├── CHANGELOG.md
103
+ └── README.md
104
+ ```
105
+
106
+ ## 架构
107
+
108
+ ```
109
+ 浏览器 (Client 半边) Node 进程 (Host 半边)
110
+ ┌───────────────────────────────┐ fetch ┌──────────────────────────────────┐
111
+ │ ctx.betterSidebar.registerTab │ ──────▶ │ ctx.webServer /remote-ssh/api/* │
112
+ │ · 远程文件 / 远程终端 │ ◀────── │ · SSH:listDir/readFile/… │
113
+ │ ctx.slots: settings.section │ JSON │ · settings:profiles/workspaces │
114
+ │ · DSH 设置页「远程连接」 │ │ · terminals:ssh -tt 管道 │
115
+ └───────────────────────────────┘ │ ctx.tools:5 个 remote_ssh_* │
116
+ └───────────────┬──────────────────┘
117
+ │ SSH
118
+ 远程超算 / 服务器
119
+ ```
120
+
121
+ 关键设计:
122
+
123
+ - **免 shell 引号转义**:远程命令通过 `subprocess.spawn({ argv })` 以参数数组调起 `ssh.exe`,避免引号 / 空格问题。
124
+ - **二进制安全读文件**:远程 `base64 -w0` 输出,Host 用 `Buffer` 解码为 UTF-8。
125
+ - **写文件走 stdin**:远程 `cat > <file>`,内容经子进程 stdin 传入。
126
+ - **文件列举**:`find -printf '%Y\t%f\t%s\n'`(`%Y` 跟随软链接取目标类型,适配超算家目录软链接)。
127
+ - **终端**:`ssh -tt` 分配远程 PTY,本地管道转发,客户端 HTTP 轮询回显(无 `node-pty` 依赖,Windows 可用)。
128
+ - **国际化**:Client 接入 `ctx.locale`,注册 `zh` / `en` 词典,界面与工具描述跟随 DSH 语言自动切换。
129
+
130
+ ## 已知限制
131
+
132
+ 1. **终端非本地 PTY**:走 `ssh -tt` 管道通道(跨平台可用);`vim` / `htop` 等全屏程序体验受限,后续可接入 `terminals.registerBackend` + `node-pty` 真 PTY。
133
+ 2. **文件操作依赖 GNU 工具**(`find -printf`、`base64 -w0`):目标为 Linux 超算时通用。
134
+ 3. **密码认证需本机 `sshpass`**(Windows 默认没有);密钥认证无此依赖。
135
+ 4. **无大文件上传 / 下载**:当前读 / 写为文本流,可后续加 `scp` / `sftp`。
136
+ 5. **镜像目录对内置文件工具不可见**:远程工作区的本地镜像目录是注册占位,模型对远程文件应使用 `remote_ssh_*` 工具(镜像目录内已放置说明文件)。
137
+
138
+ ## 路线图
139
+
140
+ - [ ] 真 PTY 终端(`terminals.registerBackend` + `node-pty`)
141
+ - [ ] `scp` / `sftp` 上传下载
142
+ - [ ] 从 `~/.ssh/config` 自动导入连接
143
+ - [ ] ProxyJump / 跳板机、SSH config 复用
144
+ - [ ] 密码凭据走 `credentials` 服务(避免明文进 argv)
145
+
146
+ ## 许可证
147
+
148
+ [MIT](./LICENSE)
149
+
150
+ ---
151
+
152
+ ## ❤️ 七夕快乐
153
+
154
+ 本项目是送给 **zhangyi** 的七夕礼物。
155
+
156
+ 愿它像连接起一台台远方的超算一样,也把我们紧紧连在一起。七夕快乐 ❤️
157
+
158
+ —— 2026 年 8 月 18 日
@@ -0,0 +1,7 @@
1
+ # @zhangfengshun/dsh-remote-ssh bundle patch
2
+ #
3
+ # 通过官方 CLI 安装时会依据此声明把 `@zhangfengshun/dsh-remote-ssh` 追加到 profile 的 bundle 栈:
4
+ # dsh plugin --profile <name> add @zhangfengshun/dsh-remote-ssh@<version>
5
+ - insert:
6
+ - id: remote-ssh
7
+ name: '@zhangfengshun/dsh-remote-ssh'