@lemoncat7/dsh-ssh 1.11.1 → 1.11.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.
Files changed (66) hide show
  1. package/README.md +22 -285
  2. package/docs/releases/1.11.2.md +13 -0
  3. package/docs/releases/1.11.3-style.1.md +10 -0
  4. package/docs/releases/1.11.3-style.2.md +9 -0
  5. package/docs/releases/1.11.3-style.3.md +7 -0
  6. package/docs/releases/1.11.3.md +25 -0
  7. package/docs/releases/1.2.0.md +25 -0
  8. package/docs/releases/1.4.3.md +13 -0
  9. package/docs/releases/1.4.4.md +9 -0
  10. package/docs/releases/1.4.5.md +10 -0
  11. package/docs/releases/1.4.6.md +13 -0
  12. package/docs/releases/1.5.0.md +15 -0
  13. package/docs/releases/1.5.1.md +10 -0
  14. package/docs/releases/1.5.2.md +9 -0
  15. package/docs/releases/1.5.3.md +8 -0
  16. package/docs/releases/1.6.0.md +8 -0
  17. package/docs/releases/1.7.0.md +16 -0
  18. package/docs/releases/README.md +14 -0
  19. package/docs/session-browser-state.md +10 -0
  20. package/docs/temporary-access.md +13 -2
  21. package/docs/usage.md +215 -0
  22. package/lib/client-api.d.ts +1 -0
  23. package/lib/client-api.d.ts.map +1 -1
  24. package/lib/client.d.ts.map +1 -1
  25. package/lib/client.js +219 -131
  26. package/lib/client.js.map +4 -4
  27. package/lib/explorer-state.d.ts +11 -0
  28. package/lib/explorer-state.d.ts.map +1 -0
  29. package/lib/explorer-state.js +17 -0
  30. package/lib/explorer-state.js.map +1 -0
  31. package/lib/local-workspace.d.ts.map +1 -1
  32. package/lib/local-workspace.js +13 -7
  33. package/lib/local-workspace.js.map +1 -1
  34. package/lib/locales/messages.d.ts +4 -0
  35. package/lib/locales/messages.d.ts.map +1 -1
  36. package/lib/locales/messages.js +4 -0
  37. package/lib/locales/messages.js.map +1 -1
  38. package/lib/main-panel-compat.d.ts.map +1 -1
  39. package/lib/main-panel-compat.js +6 -6
  40. package/lib/main-panel-compat.js.map +1 -1
  41. package/lib/remote-workspace-tree.d.ts.map +1 -1
  42. package/lib/remote-workspace-tree.js +6 -0
  43. package/lib/remote-workspace-tree.js.map +1 -1
  44. package/lib/sftp-client.d.ts.map +1 -1
  45. package/lib/sftp-client.js +37 -10
  46. package/lib/sftp-client.js.map +1 -1
  47. package/lib/sftp.d.ts +1 -0
  48. package/lib/sftp.d.ts.map +1 -1
  49. package/lib/sftp.js +18 -16
  50. package/lib/sftp.js.map +1 -1
  51. package/lib/temporary-access.d.ts.map +1 -1
  52. package/lib/temporary-access.js +60 -22
  53. package/lib/temporary-access.js.map +1 -1
  54. package/lib/temporary-consent.d.ts +9 -0
  55. package/lib/temporary-consent.d.ts.map +1 -0
  56. package/lib/temporary-consent.js +48 -0
  57. package/lib/temporary-consent.js.map +1 -0
  58. package/lib/temporary-task-access.d.ts +36 -0
  59. package/lib/temporary-task-access.d.ts.map +1 -0
  60. package/lib/temporary-task-access.js +61 -0
  61. package/lib/temporary-task-access.js.map +1 -0
  62. package/lib/text-preview.d.ts +7 -0
  63. package/lib/text-preview.d.ts.map +1 -0
  64. package/lib/text-preview.js +32 -0
  65. package/lib/text-preview.js.map +1 -0
  66. package/package.json +3 -1
package/README.md CHANGED
@@ -1,302 +1,39 @@
1
- # dsh-ssh
1
+ # DSH SSH
2
2
 
3
- > 当前版本 **1.11.0**,已验证宿主 **DSH 0.2.0-rc.2**(宿主仍为 RC)。Node.js **^22.19.0 或 >=24.0.0**。详见 [兼容说明](docs/dsh-020-compatibility.md) 和 [发布说明](docs/releases/1.11.0.md)。
3
+ 面向 DeepSeek Harness 的远端工作插件,将主机管理、浏览器终端、文件传输、代理和 AI 会话授权放在同一工作区。
4
4
 
5
- 面向 DeepSeek Harness 的远端工作插件。它把 SSH 会话管理、浏览器终端、FTP/FTPS/SFTP 文件传输、代理、端口转发和 AI 会话授权放在同一个 DSH 工作区里。
5
+ [![npm](https://img.shields.io/npm/v/%40lemoncat7%2Fdsh-ssh)](https://www.npmjs.com/package/@lemoncat7/dsh-ssh)
6
6
 
7
- 浏览器 UI、服务端运行时、会话授权边界和终端生命周期的职责说明见 [ARCHITECTURE.md](./ARCHITECTURE.md)。
7
+ ## 功能
8
8
 
9
- ## 兼容性
10
-
11
- 当前正式版 `1.11.0` 适配并验证 DeepSeek Harness `0.2.0-rc.2`,需要 Node.js `^22.19.0` 或 `>=24.0.0`。旧版 DSH `0.1.5` 请保留 `1.9.2`。详见 [1.11.0 更新说明](docs/releases/1.11.0.md)。
12
-
13
- ## 1.7.0 界面语言
14
-
15
- 新增中英双语界面:跟随 DSH 设置中的显示语言,切换时保留终端、表单、草稿与目录状态。旧宿主没有语言服务时仍显示中文。只翻译插件显示文案,不翻译用户内容、路径、协议、内部字段或持久化数据;服务端及上游返回的错误原文、Agent 工具描述暂保持原样。
16
-
17
- ## 1.7.0 终端旁 SFTP
18
-
19
- 目录上报初始化脚本的完整回显会自动隐藏,保留欢迎信息、执行错误及目录元数据;不清屏、不关闭终端回显。初始化异常时优先保留原始输出,避免误吞信息。
20
-
21
- 窄栏按实际宽度隐藏时间、大小等次要列,文件行提供直接下载按钮。默认跟随当前选中的终端目录,可在 SFTP 标题栏关闭跟随;预览文件、编辑路径、上传或确认删除时暂停,操作结束后再跟随。
22
-
23
- 新建的 Bash/Zsh/sh(含 dash/ash)终端会安装仅当前 shell 会话有效的目录上报钩子,不修改远端启动文件;探测有最多 5 秒超时,失败不阻止终端连接。已有终端需要重连;其他 shell 需要自行支持 OSC 7 或 OSC 1337 `CurrentDir`。跟随基于终端报告的目录,不猜测输入命令,也不持续执行远端轮询命令。路径栏的链条图标切换跟随,悬停可查看等待上报的说明;文件行下载与删除操作在悬停或键盘聚焦时显示,触屏保持可见。
24
-
25
- ## 1.6.0 文件预览与 Markdown 编辑
26
-
27
- 预览支持手动/自动刷新并保留滚动位置,新增隔离的静态 HTML 预览。Markdown 在手动模式下直接编辑正文,支持保存、快捷键、草稿恢复与版本冲突保护;自动模式只读,HTML 暂不支持编辑。详见 [更新说明](docs/releases/1.6.0.md)。
28
-
29
- ## 1.5.3 新版宿主适配与侧栏统一
30
-
31
- 支持原生多插件标签共存,统一右侧栏材质,修复终端滚动区及搜索框的主题样式干扰。权限和文件操作不变。详见 [更新说明](docs/releases/1.5.3.md)。
32
-
33
- ## 1.5.2 连接稳定性修复
34
-
35
- - SSH 错误监听保留至连接关闭,避免握手超时后的二次错误终止后端进程;同时处理连接取消及握手前关闭。
36
- - 匿名 FTP 表单明确提交标准用户名 `anonymous`,不携带私人密码。
37
- - 增加直连与 SOCKS5 无响应握手回归,以及匿名 FTP 新建、重开和修改的浏览器验证。
38
-
39
- ## 1.5.1 匿名 FTP 登录
40
-
41
- - FTP/FTPS 连接的身份认证可选择“匿名登录”,无需填写账号密码;服务器需开放匿名访问。
42
- - 测试连接、目录浏览、文件传输及配置同步保留匿名模式,代理与 TLS 规则不变。
43
- - 匿名连接使用 `anonymous` / `anonymous@`,不会发送私人凭据;切换匿名后清理此连接独立保存的密码,不删除共享凭据。
44
- - 原有连接默认保持账号密码认证。
45
-
46
- ## 1.5.0 工作台增强
47
-
48
- 主机操作依次为 SFTP、编辑、关闭全部终端、删除。关闭全部需一次确认,覆盖本工作台所有主机(含隐藏标签及连接中的终端),不影响其他浏览器窗口或主机配置;终端显示编号复用空缺,全部关闭后从 1 开始,内部连接标识不复用。
49
-
50
- GitHub 同步收到 HTTP 401 后会用账号接口复核,不删除凭据。确认授权被拒绝时暂停自动同步并保留失败时间;手动测试连接/同步成功或保存新授权后恢复。暂停状态跨重启保留,旧请求不会覆盖新授权状态。网络错误与授权拒绝分别报告;以前已被删除的 Token 仍需重新授权。
51
-
52
- - **同主机多个目录**:先挂载主机,再点选多个固定目录。目录旁会显示“已挂载”;可单独设定默认工作目录。右侧远端目录提供快捷切换,Agent 的 `ssh_list` 也会返回全部挂载目录。目录挂载不改变原有 SSH 权限范围。
53
- - **终端多标签与分屏**:`+` 新建标签;双屏支持左右/上下排列,增加分屏最多 4 个,桌面三/四屏按四宫格排列,窄屏上下排列。点击已显示的标签只切换焦点,不交换位置;其他标签或新标签仅替换当前选中窗格。命令与连接按钮作用于选中的终端。SFTP 可从主机标题栏收起/展开,保留目录视图与宽度。切换工作台内的页面、主机或标签不主动断开连接;关闭标签或退出工作台会释放对应连接。新标签使用当时选中的远端路径,不修改已经运行的终端。每主机最多 8 个标签,服务端最多 32 个运行中/连接中的浏览器终端。
54
- - **常用命令**:支持搜索、新建、编辑和删除;终端内点击“常用命令”选择后先预览,确认后仅在该终端执行。支持多行,不自动采集终端输入;勿保存密码、Token。开发版已接入 Gist 同步与备份,旧备份缺少命令集合时保留本机命令,显式删除仍参与智能合并。
55
- - **页面统一**:沿用文件传输页的标题栏、圆角、透明材质、字体和列表间距;终端仅在首次连接时创建,隐藏标签降低备用轮询频率。
56
-
57
- ## 1.4.6 更新
58
-
59
- - 修复 FTP 文件弹窗下载图标缺少尺寸与描边,导致“下载到本地”竖排、图标变形的问题。
60
- - 下载按钮保持单行并保留 44px 点击高度,补齐弹窗操作区边距;长文件名和路径在弹窗内换行,关闭按钮不被挤出。
61
- - 保持现有材质、配色及下载逻辑。94 项测试通过,浏览器回归覆盖手机、窄窗口和桌面的深浅主题及万条目录虚拟列表。
62
-
63
- ## 1.4.5 更新
64
-
65
- - 右侧文件栏新增目录弹窗,复用目录操作及文件预览,关闭后保留当前位置。
66
- - 完整文件名支持悬停和键盘聚焦提示,避免被滚动容器裁切。
67
- - 修复 SSH 拖动上传事件冒泡到会话附件的问题。
68
- - 本地目录新增原生文件管理器入口,检测环境支持,校验会话目录边界,不新增桌面端专属依赖。
69
-
70
- ## 1.4.4 更新
71
-
72
- - 文件传输列表所有条目均提供下载入口:文件直接下载,目录打包为 `.tar`。
73
- - 点击名称或输入路径后按需判断实际类型:目录进入,文件显示文件名和下载按钮,避免 FTP 文件被当成目录。
74
- - FTP 链接和未知类型仅在操作时解析;目录打包不递归跟随内部链接,保留大目录加载优化。
75
-
76
- ## 1.4.3 更新
77
-
78
- - 本地/远端目录路径栏支持输入文件路径直接预览,打开文件不会修改会话工作目录。
79
- - 新增 Agent 工具 `file_download_to_local`,默认下载到当前 DSH 会话目录,沿用文件端点授权与执行前确认,不覆盖已有文件。
80
- - 优化 FTP 大目录加载:复用名称排序比较器,不再逐项探测软链接;点击时确认是否能进入目录,递归传输仍不跟随软链接。
81
- - 修复已取消的 FTP 操作仍发出命令、产生未处理异常的问题。
82
-
83
- FTP 仍需接收服务器返回的完整目录列表;以上优化减少插件侧开销,不代表服务器或网络传输时间消失。
9
+ - SSH 主机与分组、固定目录、密码 / 私钥 / SSH Agent 认证,以及分组代理。
10
+ - 多标签与分屏终端,SFTP 目录浏览,FTP / FTPS / SFTP 跨端点文件传输。
11
+ - 文本、SQL、配置、图片、PDF 与静态 HTML 预览;无法安全预览或超限时提供下载。
12
+ - 按会话保留右栏标签、主机、目录、预览和滚动位置;打开面板定位当前挂载主机。
13
+ - 按会话授权的远端命令、AI 终端与文件工具,支持核验聊天授意后的临时 SSH 授权及指定看板任务授权。
14
+ - HTTP CONNECT、SOCKS5、SSH 跳板与端口转发,凭据库及加密 Gist 配置同步。
84
15
 
85
16
  ## 安装
86
17
 
87
- 本地目录路径栏的“打开文件管理器”复用 DSH 原生能力,打开的是 **DSH 运行所在电脑** 的当前会话目录,不是远程浏览器所在电脑。Docker 或无桌面环境不支持时会显示说明;SSH/FTP 远端目录仍在插件内浏览,不会传给本机文件管理器。目录弹窗支持原有文件操作和预览;完整文件名支持鼠标悬停和键盘聚焦查看。
18
+ 适配 DeepSeek Harness **0.2.0-rc.2**(宿主仍为 RC),需要 Node.js **^22.19.0 或 >=24.0.0**。其他宿主版本请先查阅[兼容说明](docs/dsh-020-compatibility.md)和对应版本的发布说明。
88
19
 
89
20
  ```bash
90
21
  dsh plugin --profile web add @lemoncat7/dsh-ssh@latest
91
22
  ```
92
23
 
93
- 安装或升级后重启对应的 DSH Profile。桌面端与 Docker 部署使用相同的插件包。
94
-
95
- ## 1.2.0 更新
96
-
97
- - 浏览器端按活动侧栏、连接编辑、主机树、SFTP、终端和共享 UI 分层;弹窗统一支持焦点锁定、Escape 关闭和焦点归还。
98
- - SSH 活动与端口转发状态改为完成后调度,后台页面自动降频,避免慢请求造成轮询重叠。
99
- - 新建与编辑连接按「连接信息 / 身份认证 / 连接路径」分组,并统一按钮、焦点、按压反馈和减少动态效果。
100
- - SSH 面板改为「主机 / 固定项目目录」树,主工作区同时展示左侧终端和右侧 SFTP。
101
- - 主机前的授权选择与底部「当前会话权限」共同控制 AI 可见范围,不再使用独立的会话注入检查器。
102
- - 每台主机可以保存多个固定远端目录;当前会话最多显式绑定其中一个,终端、SFTP 和 AI 命令共享该工作目录。选中后目录项会明确显示当前会话已固定到该路径。
103
- - 从固定远端目录新建会话时,会先选择会话归属的 DSH 本地项目;默认使用当前项目,其次使用最近项目,并明确区分本地项目路径与 SSH 远端工作目录。
104
- - 固定目录后的新增按钮通过 DSH 官方 Workspace 接口创建并直接打开新会话,同时写入对应主机、目录与权限绑定;成功后自动关闭 SSH 管理面板,目录下不展示历史会话清单。
105
- - 撤销主机访问会关闭该会话在对应主机上的 AI 终端;降级为仅命令会关闭全部交互终端。
106
-
107
- ## 能力
108
-
109
- - SSH 密码、私钥和 SSH Agent 认证
110
- - HTTP CONNECT、SOCKS5 和 SSH 跳板代理
111
- - 本地转发(`-L`)、远程转发(`-R`)和动态 SOCKS5 转发(`-D`)
112
- - 浏览器交互终端,支持输入、增量输出、窗口尺寸同步和主动断开
113
- - 当前会话右侧栏支持多个 AI 终端切换与键盘输入
114
- - SSH 活动右栏按会话分别保持展开状态、页签和所选主机;切换到未展开过的会话时不会自动打开,切回原会话会恢复
115
- - AI 调用 `ssh_terminal_open` 创建终端时,当前会话会自动展开 SSH 右栏并切换到新终端
116
- - SFTP 文件浏览、文本/图片/PDF 预览和流式下载;支持拖放上传、目录内移动、行末删除,并可从内嵌预览打开独立放大窗口
117
- - 文件预览使用组合刷新控件:左侧立即刷新,右侧“手动 / 自动”切换模式,默认手动;自动模式每 5 秒检查大小和修改时间,有变化才读取。文本/Markdown/HTML 刷新保留滚动位置,网络失败保留旧内容,隐藏时暂停自动检查,关闭预览取消请求。仅凭大小和时间无法识别保留这两项元数据的修改,此时可手动刷新。PDF 仅手动刷新,浏览器内置阅读器可能重置页码。
118
- - HTML/HTM 文件支持静态页面预览及源码切换。页面在禁用脚本、导航和表单能力的沙箱中显示,并通过 CSP 阻止外部资源请求;支持内联样式和 data 图片,不加载相邻 CSS/图片文件,不运行 JavaScript。大文件仍遵循 1 MB 预览限制,下载可获得原文件。
119
- - Markdown 手动刷新模式下可直接在正文编辑,使用“保存”或 Ctrl/Cmd + S 写回原文件;自动刷新模式只读。HTML 不支持编辑。未保存时禁止刷新及切换自动模式,离开时提示;草稿保存在当前浏览器标签页(不可用时退回内存),可下载或确认放弃。
120
- - 编辑限完整 UTF-8 `.md` 文件、最大 256 KB。前置元数据、嵌入 HTML、引用定义等暂不能安全往返转换的文档只读;普通标题、列表、表格等会以标准 Markdown 重新序列化,排版语法可能规范化。
121
- - 保存核对内容哈希并在临时文件写完后复核版本,不一致时保留草稿且拒绝覆盖;本地限制在会话工作区,SFTP 需服务器支持 OpenSSH 原子替换扩展。保留文件权限及所有者;无法安全替换时失败,不采用先删除原文件的回退方案。外部进程不参与文件锁,最终复核与替换之间仍存在极短的并发窗口。
122
- - 独立「文件传输」工作区,支持 2~4 个 FTP、FTPS 或 SFTP 窗格与多个任务页
123
- - FTP、显式 FTPS、隐式 FTPS;FTP 控制连接与每条被动数据连接统一支持 HTTP CONNECT 和 SOCKS5 代理
124
- - FTP/FTPS/SFTP 跨协议流式互传,不把完整文件暂存到 DSH 磁盘;支持多文件、递归目录、冲突策略、进度、取消和失败状态
125
- - 有序多主机跳板链,兼容已有单跳板配置
126
- - 独立密钥库集中保存常用用户名、密码和私钥,SSH 连接仅保存引用
127
- - 独立代理库集中保存 HTTP CONNECT 与 SOCKS5 代理,多台主机可复用同一连接路径
128
- - 按 DSH 会话授权连接;未勾选的主机对 AI 完全不可见
129
- - 普通分叉会话继承来源会话的 SSH、文件端点、权限和固定目录;运行中的终端与传输任务仍归原会话所有,子代理不会隐式继承用户授权
130
- - 保存固定远端项目目录,并从目录直接创建和打开新 DSH 会话
131
- - AI 可执行一次性命令,或打开、读取、操作和关闭独立的交互终端
132
- - 左侧远端区域提供右侧栏开关;目录页使用真实 SFTP 浏览远端文件,终端页使用单一终端画面观察并操作 AI 终端
133
- - 插件服务与 Web 客户端兼容 Windows、macOS 和 Linux,不依赖本机 `ssh` 或 `sftp` 命令
134
- - 首次连接主机指纹确认、输出上限、命令超时和公开端口绑定保护
135
- - GitHub Gist 跨设备配置同步,支持智能、本地优先和云端优先策略;主机、FTP/FTPS、项目目录、代理库、密钥库及其凭据均端到端加密
136
-
137
- ## 界面
138
-
139
- 侧栏入口名为「远端」,通过官方 `sidebar.footer.action` 注册。浏览器兼容层只把这个入口锚定到官方 Workspace 区域上方;它不会替换 `sidebar.workspaces`,锚点失效时会自动留在官方 Footer。远端标题右侧按钮与折叠栏图标负责开关 SSH 右侧栏;展开后的第一项「SSH 面板」进入完整管理工作区,它下面只显示当前 DSH 会话已授权的 SSH 连接。点击其中一台主机会打开右侧栏并直接切换到该远端。切换到其他会话会自动退出管理工作区,也可以使用工作区左上角的返回按钮。
140
-
141
- 管理工作区分成两部分:
142
-
143
- 1. 左侧远端树:点击主机只负责选中并展开固定目录,同时自动收起其他主机;右侧独立的「挂载 / 卸载」按钮决定当前 DSH 会话能否访问该主机,因此浏览终端不会意外改变 AI 权限。点击目录整行即可固定,再次点击已固定目录即可取消;每台主机最多固定一个目录。目录后的新增按钮直接创建并打开新会话。底部统一设置「仅命令 / 终端控制」与执行前确认。
144
- 2. 右侧工作区:默认把终端与当前主机或项目目录的 SFTP 左右并排展示,不需要在两个页面之间切换;SFTP 会等终端首次连接成功后再读取远端目录。拖动两栏之间的分隔线可以调整 SFTP 宽度,双击恢复默认,比例会保存在当前浏览器。另可进入端口转发、密钥库、代理库和设置。SFTP 支持浏览、预览、下载、行末删除,以及拖放或文件选择器触发的多文件顺序上传;文件拖进同一主机的目录时使用原生重命名完成移动,跨端点拖放才创建复制任务,拖回原目录不会产生任务。同名文件逐项确认跳过或覆盖,单文件上限为 512 MB。内嵌文件预览可通过下载旁的放大按钮打开独立预览窗口。
145
-
146
- 「文件传输」是独立工作区页签。每个任务页默认双窗格,可切换为 2~4 栏。每个窗格先显示统一的 SFTP、FTP、FTPS 连接列表,单击连接后才读取远端目录,并可随时返回连接列表。名称、大小和修改时间表头均可切换升降序,目录始终置顶。每个文件或目录行末在悬停或键盘聚焦时显示“下载到本地”和删除两个快捷按钮;文件直接流式下载,目录则实时归档为 `.tar`,两者都使用独立协议连接,不占用当前目录的浏览会话,也不会在 DSH 磁盘暂存完整内容。文件也可以拖到另一窗格或具体目录,或选中后使用“传送到下一栏”,因此键盘和触控环境不依赖拖拽。同一端点内拖入目录是移动,跨端点拖放是复制;目录不能移动到自身或子目录。浏览窗格复用自己的协议会话,传输任务使用独立连接,避免大文件占用目录浏览的控制通道;任务卡在执行时显示累计耗时,结束后固定显示总耗时和完成时刻。任务完成、失败或取消后只刷新对应目标目录,及时呈现完整或部分写入结果。每个文件或目录行末均可直接打开删除确认,目录采用有深度和数量上限的递归删除,且不会跟随符号链接。关闭页面不会中断服务端任务;DSH 进程停止时会统一取消并释放两端连接。
147
-
148
- 工作区使用插件内职责单一的自适应壳布局。宽容器使用双栏;窄于 820px 时远端树切换为左侧抽屉,窄于 520px 时进一步压缩 SFTP 次要信息和操作密度。响应式判断使用容器查询,因此手机、桌面分屏和 DSH 窄面板采用同一套行为。
149
-
150
- SSH 插件不会向聊天标题栏添加按钮。右侧栏统一从左侧「远端」区域打开;当前会话尚未授权主机时会显示引导。仅执行命令权限显示 SFTP 目录;终端控制权限同时显示 SFTP 目录和 AI 终端。多个终端通过紧凑标签切换,运行中的终端支持键盘输入。进入 SFTP 子目录时,该目录会同步成为后续 `ssh_exec` 与新终端的工作目录。
151
-
152
- 右侧栏的本地/远端目录和主机 SFTP 浏览器共用路径输入:输入目录并按 Enter 进入,输入文件路径并按 Enter 直接预览。支持绝对路径、相对当前目录的文件名,以及远端 `~/` 路径;文件名包含空格或没有扩展名也能识别。打开文件不会修改会话工作目录,返回时保留原浏览目录。路径不存在或无权访问时保留输入并显示错误;本地路径仍不能越出当前会话工作区。
153
-
154
- 新建和编辑连接的表单内提供「测试连接」。测试直接使用尚未保存的表单内容,可验证密钥库凭据、HTTP/SOCKS5 代理和有序跳板链;首次连接的主机指纹也在表单内确认。测试过程不会临时创建 Profile,也不会把凭据写入配置文件。
155
-
156
- ## AI 工具
157
-
158
- | 工具 | 用途 |
159
- | --- | --- |
160
- | `ssh_list` | 只列出当前 DSH 会话已授权的连接 |
161
- | `ssh_set_cwd` | 设置并验证当前会话在指定主机上的工作目录 |
162
- | `ssh_exec` | 执行一次性远端命令 |
163
- | `ssh_terminal_open` | 打开当前 Agent 独占的 SSH 终端 |
164
- | `ssh_terminal_send` | 向终端发送文本并等待输出稳定 |
165
- | `ssh_terminal_read` | 分页读取终端回滚缓冲区 |
166
- | `ssh_terminal_signal` | 写入 Ctrl-C / Ctrl-\\ / Ctrl-Z 终端控制字符 |
167
- | `ssh_terminal_close` | 关闭终端 |
168
- | `ssh_forward_list` | 列出已授权连接的转发规则 |
169
- | `ssh_forward_start` | 启动已有转发规则 |
170
- | `ssh_forward_stop` | 停止已有转发规则 |
171
- | `file_endpoint_list` | 只列出当前 DSH 会话明确授权的 FTP/FTPS/SFTP 端点 |
172
- | `file_directory_list` | 浏览已授权端点中的远端目录 |
173
- | `file_download_to_local` | 下载授权端点的文件到当前 DSH 会话目录,完成后返回实际保存路径 |
174
- | `file_transfer_start` | 启动端点之间的异步流式文件或目录传输 |
175
- | `file_transfer_status` | 查询当前会话拥有的传输任务进度 |
176
- | `file_transfer_cancel` | 取消当前会话拥有的传输任务 |
177
-
178
- 工具始终从 `exec.agent.session.id` 解析会话授权关系。SSH 命令权限与文件权限独立:文件端点必须单独授权,并选择“仅浏览”或“允许跨端传输”。模型不能通过参数绕过授权,也不能枚举其他 DSH 会话的主机、文件端点、终端或传输任务。覆盖目标文件不会被默认推断;`file_transfer_start` 默认使用 `fail` 冲突策略。文件浏览和端点间传输必须优先使用 `file_*` 工具,不允许通过 SSH 临时启动 HTTP 服务、开放端口或使用终端编码传输。若用户要求下载到浏览器本地,模型会直接提示在「SSH → 文件传输」选择文件并点击“下载到本地”。
179
-
180
- `file_download_to_local` 默认以原文件名保存到 `exec.agent.session.header.cwd`,即 DSH 当前会话目录,不是浏览器所在电脑的下载目录。可选 `localPath` 只能填写该目录内的相对文件路径,父目录须已存在;同名文件一律拒绝覆盖。此工具需要文件端点的传输权限,并沿用文件传输审批设置。支持 FTP、FTPS、SFTP 的普通文件,单文件最大 512 MiB、超时 5 分钟、最多同时下载两个文件;流式写入私有临时文件,完成后以排他方式提交正式文件,返回真实 `localPath` 和字节数。正常取消、断线或权限撤销会清理临时文件,不把部分内容作为成功结果。进程被强制终止时可能留下 `.dsh-download-*` 临时目录,但不会把它当成完整交付;重新调用可重试。目录下载仍使用浏览器入口或端点间传输工具。
181
-
182
- 「执行前确认」依赖 DSH 当前会话的审批策略:Workspace Write 的 Ask 策略会显示确认;Full Access 使用 Never 策略,不显示确认,并会直接拒绝被 SSH 插件标记为需要审批的操作。若希望在 Full Access 下直接执行 SSH,请关闭该开关。
183
-
184
- ### 终端中断与挂起
185
-
186
- `ssh_terminal_signal` 支持 `SIGINT`(Ctrl-C)、`SIGQUIT`(Ctrl-\\)和
187
- `SIGTSTP`(Ctrl-Z)。它将控制字符写入当前终端,由远端 PTY 行规程或前台
188
- 应用处理,返回 `inputWritten: true`,不代表已经确认 POSIX 信号投递。
189
- 原始模式或自定义 `stty` 控制字符可能改变其行为。
190
-
191
- 不支持 `SIGTERM` / `SIGKILL` / `SIGHUP`:SSH channel signal 不保证作用于
192
- 前台作业,甚至可能杀掉会话 shell。关闭终端请用 `ssh_terminal_close`。
193
- 宿主要求返回真实 `targetPgid` 的后端接口在无法验证远端前台进程组时明确报错,
194
- 不再返回伪造的 `{ delivered: true, targetPgid: 0 }`。取消发送使用 Ctrl-C 输入路径。
195
-
196
- ## 凭据与安全
197
-
198
- 普通连接资料保存在 `statePath` 指定的原子 JSON 文件中。以下敏感字段只写入 DSH `ctx.credentials` 的 `dsh-ssh/<profile-id>` Grant Record:
199
-
200
- - SSH 密码
201
- - 私钥
202
- - 私钥口令
203
- - 代理密码
204
- - FTP 密码
205
-
206
- 密钥库条目使用独立的 `dsh-ssh-vault/<credential-id>` Grant Record。SSH Profile 只保存 `credentialId`,不会复制或读回密钥库中的明文。仍被连接引用的密钥库条目不能删除。
207
-
208
- 代理库条目保存在状态文件中,代理密码使用独立的 `dsh-ssh-proxy/<proxy-id>` Grant Record。SSH Profile 选择常用代理后只保存 `proxyId`;仍被主机引用的代理不能删除。原有内联 HTTP/SOCKS5 配置继续兼容。
209
-
210
- FTP Profile 与 SSH Profile 分开保存。FTP Profile 自有密码使用 `dsh-ftp/<profile-id>` Grant Record,也可以引用已有的密码型密钥库条目。普通 FTP 会在界面中明确标记为未加密;FTPS 默认校验证书。FTP 仅使用被动模式,且忽略 PASV 响应中用于改变目标主机的地址,避免 FTP Bounce/SSRF。
211
-
212
- 管理 API 和 Web UI只返回是否配置以及字段名,不返回任何凭据值。默认拒绝非回环地址的端口监听;若确实需要监听 `0.0.0.0`,必须在「远端 → 设置」中显式开启。
213
-
214
- 首次连接会拒绝未知主机密钥并展示 SHA-256 指纹。用户确认后才把指纹写入 Profile,后续连接严格比对。
215
-
216
- ## GitHub Gist 配置同步
217
-
218
- 所有同步选项都位于「远端 → SSH 面板 → 设置」。默认使用 GitHub OAuth Device Flow:点击“连接 GitHub”后,插件先在 DSH 内显示一次性设备代码和复制按钮,用户再从同一授权窗口打开 GitHub 官方设备授权页并粘贴代码;access token 由服务端直接写入 DSH 凭据服务,不经过浏览器,也不会出现在同步状态文件中。Personal Access Token 仅保留在“高级授权设置”中作为备用。
219
-
220
- Device Flow 需要一个属于插件发布者的 GitHub OAuth App Client ID。Client ID 本身不是密钥,可公开分发;Client Secret 不得写入插件,而且此流程不需要 Client Secret。首次配置时:
221
-
222
- 1. 在 GitHub Developer Settings 创建 OAuth App。
223
- 2. 在 OAuth App 设置中启用 Device Flow。
224
- 3. 将 Client ID 填入“高级授权设置”,保存后即可使用“连接 GitHub”。
225
-
226
- 如果 DSH 所在网络不能直连 GitHub,可在同一页面的“本机运行设置”填写“GitHub 出站代理”并先执行网络测试。该地址只保存在本机 SSH 状态中,不参与 Gist 同步;支持 `http://` 与 `https://` 代理。留空时插件依次读取 `DSH_SSH_GITHUB_PROXY`、`HTTPS_PROXY` 和 `https_proxy`。设置页不会保存带账号密码的代理 URL,认证代理请通过 `DSH_SSH_GITHUB_PROXY` 环境变量配置。
227
-
228
- 授权只申请 `gist` scope。备用 classic personal access token 同样需要 `gist` scope;fine-grained token 是否可用取决于 GitHub 当前对 Gist 的权限支持。Gist ID 可以留空,首次同步时插件会自动创建一个私有 Gist。为避免主机地址等配置元数据公开,插件会拒绝公开 Gist。
229
-
230
- 同步范围:
231
-
232
- - SSH 主机、FTP/FTPS 连接与固定远端项目目录
233
- - 代理库及代理密码
234
- - 常用命令(名称与正文按配置元数据保存到私有 Gist,不自动识别或加密正文中的密码;不要在命令中嵌入密码、Token)
235
- - SSH 分组默认代理;从主机分组标题旁的编辑按钮配置,主机自身代理优先,没有设置时才回退分组代理,分组也没有代理时直连。只影响新连接,不修改主机自身配置,不影响 FTP 分组。被分组引用的代理不能直接删除。
236
- - 密钥库元数据,以及密码、私钥和私钥口令
237
- - 连接自身保存的 SSH/FTP 密码和内联代理密码
238
-
239
- 以下内容具有明确的本机边界,不会同步:
240
-
241
- - 当前 DSH 会话的主机/文件授权、权限和工作目录
242
- - 本机端口转发规则
243
- - 公开端口绑定、命令超时和最大输出限制
244
- - GitHub Token 与同步加密密码本身
245
-
246
- 敏感字段在离开 DSH 前使用同步加密密码经 scrypt 派生密钥,并通过 AES-256-GCM 加密;Gist 中不包含明文密码或私钥。同步加密密码最少 6 个字符,仍建议使用 12 个以上字符的独立密码。该密码无法从 Gist 恢复,新设备必须输入相同密码,丢失后只能重新建立同步配置。
247
-
248
- 三种策略只在两端同时发生变化时决定冲突方向:
249
-
250
- - `智能`:按每条配置的更新时间合并,并使用删除墓碑避免旧设备复活已删除条目。
251
- - `本地优先`:双方都修改时使用当前设备配置。
252
- - `云端优先`:双方都修改时使用 Gist 配置。
253
-
254
- 空白新设备第一次连接已有 Gist 时始终先安全拉取云端,不会因为选择“本地优先”而覆盖已有配置。自动同步会在插件启动后、本地可同步配置变化约 3 秒后以及后台每 5 分钟运行;任务串行执行,避免并发覆盖。
255
-
256
- 工作台共享每 5 秒一次的轻量版本检查,后台页面暂停,回到页面立即检查;仅数据改变时刷新主机、FTP、代理库、密钥库、分组配置及命令列表。手动同步完成后立即检查,不重建终端或编辑弹窗。旧版本不认识新增集合,跨设备使用这些功能时建议各端同时升级。
257
-
258
- 覆盖可能丢失的一侧之前,插件会在同一个 Gist 中创建显式备份文件,并按设置保留 0~50 份。该数量只控制 `dsh-ssh.backup.*.json` 文件;GitHub 自己维护的 Gist revision history 无法由插件裁剪。
259
-
260
- 设置页显示最近一次由 GitHub 返回的云端 Gist revision SHA(短格式展示,完整值保留在提示中)。创建、上传、下载、合并或连接测试都会刷新这个云端版本;它表示真实的 Gist 修订版本,不是固定的数据结构版本号。
261
-
262
- ## DSH 配置
263
-
264
- 安装包后,bundle 会插入默认配置:
265
-
266
- ```yaml
267
- - id: ssh
268
- name: '@lemoncat7/dsh-ssh'
269
- config:
270
- statePath: !!js dshHomePath('ssh/state.json')
271
- exposeWeb: true
272
- apiPrefix: /ssh-local/v1
273
- defaultCommandTimeoutMs: 30000
274
- maxOutputChars: 32000
275
- allowPublicBind: false
276
- ```
277
-
278
- 插件依赖当前 DSH 的 `credentials` 和 `tools` 服务。浏览器管理还需要 Web Profile 的 `webServer`;浏览器终端和 AI 终端由插件内部按所有者隔离管理,不依赖 Host Root 中不存在的 `terminals` 服务。
279
-
280
- ## 开发与打包
281
-
282
- ```bash
283
- npm install
284
- npm test
285
- npm pack --pack-destination dist
286
- ```
287
-
288
- 运行时要求 Node.js 22.19+ 或 Node.js 24+,并与 DSH `0.1.1-rc.2` 接口对齐。
24
+ 安装或升级后重启对应的 DSH Profile;`web` 请按实际使用的 Profile 调整。
289
25
 
290
- ## 终端隔离说明
26
+ 打开「远端 → SSH 面板」添加主机,测试连接并确认主机指纹。浏览主机不会自动授予 AI 访问权限;为当前会话挂载主机或文件端点,再选择命令、终端和传输权限。
291
27
 
292
- 浏览器终端和 AI 终端共享同一个连接 Profile 与凭据,但不是同一个终端实例:
28
+ ## 使用边界
293
29
 
294
- - 浏览器终端由插件的同源管理 API 持有,页面关闭或空闲超时后清理。
295
- - AI 终端由插件按 `sessionId` 分区持有。Web Profile 的官方 Terminal 服务位于每个 Agent Preset 的私有 Realm,主机插件不能跨 Realm 注册 Backend,因此插件使用相同的 owner-scoped 规则实现 SSH 终端隔离,并在插件卸载或进程退出时统一清理。
296
- - 浏览器终端与右侧「SSH 活动」共用独立终端传输层。输出优先使用支持断线续传的 SSE 长连接实时推送,只有浏览器或反向代理不支持流式响应时才退回 cursor 增量轮询。
297
- - 键盘输入按序号并发发送,由服务端按序写入 TTY;临时网络失败会使用同一序号重试,既减少 HTTP 往返造成的排队延迟,也避免并发输入乱序。
298
- - AI 终端创建事件通过按会话隔离的 SSE 事件流通知 Web 客户端。首次订阅不重放旧终端,断线重连会按事件游标补发遗漏事件。
30
+ 凭据由 DSH 凭据服务保存,管理界面不返回明文。SSH 与文件端点授权独立,文件下载到 DSH 会话目录不等于浏览器电脑。会话浏览状态仅在当前页面生命周期保留,不跨刷新。首次连接需确认指纹,公开端口监听默认拒绝。
299
31
 
300
- 这种边界避免浏览器用户和模型同时争用同一个 TTY,也遵守 DSH 不允许跨 Agent 共享终端的所有权规则。
32
+ ## 文档
301
33
 
302
- 会话授权模式会直接约束模型可见工具:选择「仅命令」时隐藏交互终端工具;选择「终端控制」时隐藏 `ssh_exec`,远端命令必须经 `ssh_terminal_open` / `ssh_terminal_send` 执行,因此输入和输出会显示在右侧 SSH 活动中。执行层会再次校验权限,不能通过直接调用绕过。
34
+ - [使用、工具与配置](docs/usage.md)
35
+ - [会话与文件浏览状态](docs/session-browser-state.md)
36
+ - [聊天临时授权与任务委派](docs/temporary-access.md)
37
+ - [架构与终端生命周期](ARCHITECTURE.md)
38
+ - [版本与发布说明](https://github.com/lemoncat7/dsh-ssh/releases)
39
+ - [发布维护约定](docs/releases/README.md)
@@ -0,0 +1,13 @@
1
+ # 1.11.2 · 会话状态与文件预览优化
2
+
3
+ 适配 DSH **0.2.0-rc.2**;需要 Node.js **^22.19.0 或 >=24.0.0**。
4
+
5
+ - 打开 SSH 工作台时保留左栏当前会话高亮。
6
+ - 优先选择当前会话挂载的主机,自动展开对应分组;普通刷新尊重手动折叠状态。
7
+ - 右栏按会话保留标签页、主机、浏览目录、文件预览和目录滚动位置,切换会话或关闭再打开不再初始化。状态仅在当前页面生命周期内保留,不跨浏览器刷新。
8
+ - 扩展 SQL、TXT、脚本、配置等文本预览;未知后缀也尝试识别 UTF-8 或带 BOM 的 UTF-16。过大、二进制或无法读取的文件显示下载入口。
9
+ - 文本预览上限 1 MiB,图片/PDF 上限 16 MiB。恢复预览重新鉴权,不缓存内容或授权,不改变主机、密钥和传输配置。
10
+
11
+ 验证:187 项测试通过;375px 和 1200px 隔离浏览器检查通过;线上修复部署后的服务健康、编译文件一致性和文本预览运行检查通过。
12
+
13
+ 详见 [会话工作台与文件浏览状态](../session-browser-state.md)。
@@ -0,0 +1,10 @@
1
+ # 1.11.3-style.1(本地体验版)
2
+
3
+ 适配 DeepSeek Harness 0.2.0-rc.2,沿用知识库 2.13.12 的交互风格。
4
+
5
+ - 统一按钮、表单、菜单和右侧活动页签的圆角、层次与短过渡。
6
+ - 管理弹窗采用居中圆角外框与内嵌内容区,窄屏保留边距,内容按需滚动;文件预览与终端布局不变。
7
+ - 保留键盘焦点反馈,尊重减少动态效果偏好;不增加加载依赖或持续动画。
8
+ - 不改变主机挂载、访问授权、文件传输及连接协议。
9
+
10
+ 浏览器回归脚本:`scripts/verify-workbench.mjs`。宿主 UI 测试依赖可通过 `DSH_UI_TEST_NODE_PATH` 指定独立目录(冒号分隔),不会加入插件运行依赖。
@@ -0,0 +1,9 @@
1
+ # 1.11.3-style.2(本地体验版)
2
+
3
+ 沿用知识库风格,继续统一表单密度。适配 DSH 0.2.0-rc.2。
4
+
5
+ - 搜索、配置输入、路径输入和下拉选择统一圆角、背景、边框、字号与箭头。
6
+ - 桌面单行控件 38px,窄屏 44px;弹窗内表单间距及操作区换行保持一致。
7
+ - 不修改 xterm 输入、文件编辑器、传输逻辑、开关或滑块。
8
+
9
+ 回归:187 项单元测试;375 / 1024 / 1600px 深浅色工作台浏览器检查,包含分屏、命令、挂载和关闭连接。
@@ -0,0 +1,7 @@
1
+ # 1.11.3-style.3 · 聊天临时授权(本地预览)
2
+
3
+ - 当前真实用户消息中的明确主机操作指令可建立临时授权,不再请求 DSH 审批弹窗。
4
+ - 不明确时展示完整范围后等待聊天确认,确认绑定原申请、10 分钟有效,不接受 Agent 自报授权。
5
+ - 与伙伴插件 2.8.4-style.4 联动:支持指定看板任务和执行者的一次执行授权,最长 60 分钟,不共享给其他任务、重试或验收者。
6
+ - 保留会话/轮次边界、主机指纹检查及取消撤销;不改变永久挂载、文件传输或端口转发权限。
7
+ - 适配 DSH 0.2.0-rc.2,无数据迁移。详细边界见 `docs/temporary-access.md`。
@@ -0,0 +1,25 @@
1
+ # 1.11.3 · 统一工作台交互与聊天临时授权
2
+
3
+ 适配 DeepSeek Harness **0.2.0-rc.2**;需要 Node.js **^22.19.0 或 >=24.0.0**。不改变现有宿主版本约束。
4
+
5
+ ## 工作台样式
6
+
7
+ - 与知识库工作区统一圆角按钮、输入框、搜索、下拉框及短动效;覆盖终端、主机、代理、文件传输和配置弹窗。
8
+ - 弹窗按视口居中、自适应宽高,统一头部、关闭入口和底部操作区;保留浅深主题、窄屏和减少动画支持。
9
+ - 不改变主机挂载、终端会话、凭据和文件传输行为。
10
+
11
+ ## 临时 SSH 授权
12
+
13
+ - 核验当前真实用户消息中的明确主机操作授意,不再强制请求独立审批弹窗。不会将 Agent 自报同意、旧聊天、工具输出或后台通知当成用户授权。
14
+ - 语义不明确时返回完整授权范围,在聊天中等待用户确认;短确认绑定原申请及主机配置,10 分钟内有效,不能改换目标或任务。
15
+ - 普通授权仅当前执行轮次有效;结束、停止、错误、释放或重启后失效,不改变永久挂载。
16
+ - 搭配伙伴插件 **2.8.4**,可为明确指定的看板任务和执行伙伴授权:任务暂不运行,授权通过后再提交;仅一次执行、最长 60 分钟,不自动共享给其他伙伴、验收者或重试。
17
+ - 临时授权只提供远端命令及工作目录,不自动开放文件传输、交互终端或端口转发。任务说明不是逐条命令沙箱;远端自行启动的后台程序不保证随本地撤销而退出。
18
+
19
+ ## 验证与升级
20
+
21
+ - 192 项测试通过;跨插件模拟验证用户授意、指定任务绑定、执行边界及撤销。
22
+ - 工作台浏览器回归覆盖 375 / 1024 / 1600 像素、浅深主题;功能代码与已部署的 `1.11.3-style.3` 试用版一致。
23
+ - 无数据迁移。升级插件并重启对应 Profile,刷新页面;临时授权不会跨重启恢复,旧受阻任务不会因升级自动重跑。
24
+
25
+ 使用说明:https://github.com/lemoncat7/dsh-ssh/blob/main/docs/temporary-access.md
@@ -0,0 +1,25 @@
1
+ 正式版更新:
2
+
3
+ - 重构 SSH 工作台,统一主机、终端、SFTP 与活动面板
4
+ - 支持主机固定远端目录,并在指定 DSH 空间创建对应会话
5
+ - 支持会话级主机挂载、固定目录和命令/终端权限控制
6
+ - SFTP 按终端连接延迟加载,支持拖拽上传、下载与文件预览
7
+ - 优化多终端复用、关闭和自动弹出活动面板的行为
8
+ - 统一桌面、移动端、模态弹窗、表单、滚动条和明暗主题样式
9
+ - 完成客户端架构拆分、轮询降频与跨平台兼容性整理
10
+
11
+ 验证:25 项自动化测试全部通过。
12
+
13
+ ## 从 README 迁入的历史说明
14
+
15
+ ## 1.2.0 更新
16
+
17
+ - 浏览器端按活动侧栏、连接编辑、主机树、SFTP、终端和共享 UI 分层;弹窗统一支持焦点锁定、Escape 关闭和焦点归还。
18
+ - SSH 活动与端口转发状态改为完成后调度,后台页面自动降频,避免慢请求造成轮询重叠。
19
+ - 新建与编辑连接按「连接信息 / 身份认证 / 连接路径」分组,并统一按钮、焦点、按压反馈和减少动态效果。
20
+ - SSH 面板改为「主机 / 固定项目目录」树,主工作区同时展示左侧终端和右侧 SFTP。
21
+ - 主机前的授权选择与底部「当前会话权限」共同控制 AI 可见范围,不再使用独立的会话注入检查器。
22
+ - 每台主机可以保存多个固定远端目录;当前会话最多显式绑定其中一个,终端、SFTP 和 AI 命令共享该工作目录。选中后目录项会明确显示当前会话已固定到该路径。
23
+ - 从固定远端目录新建会话时,会先选择会话归属的 DSH 本地项目;默认使用当前项目,其次使用最近项目,并明确区分本地项目路径与 SSH 远端工作目录。
24
+ - 固定目录后的新增按钮通过 DSH 官方 Workspace 接口创建并直接打开新会话,同时写入对应主机、目录与权限绑定;成功后自动关闭 SSH 管理面板,目录下不展示历史会话清单。
25
+ - 撤销主机访问会关闭该会话在对应主机上的 AI 终端;降级为仅命令会关闭全部交互终端。
@@ -22,3 +22,16 @@
22
22
  - 发布与本地部署使用同一个本地构建的安装包。
23
23
 
24
24
  FTP 协议仍需接收完整目录列表,服务器和网络耗时不属于本次优化消除的范围。
25
+
26
+ ## 从 README 迁入的历史说明
27
+
28
+ 以下为该版本当时的介绍,适用范围以该版为准,不作为当前使用指南。
29
+
30
+ ## 1.4.3 更新
31
+
32
+ - 本地/远端目录路径栏支持输入文件路径直接预览,打开文件不会修改会话工作目录。
33
+ - 新增 Agent 工具 `file_download_to_local`,默认下载到当前 DSH 会话目录,沿用文件端点授权与执行前确认,不覆盖已有文件。
34
+ - 优化 FTP 大目录加载:复用名称排序比较器,不再逐项探测软链接;点击时确认是否能进入目录,递归传输仍不跟随软链接。
35
+ - 修复已取消的 FTP 操作仍发出命令、产生未处理异常的问题。
36
+
37
+ FTP 仍需接收服务器返回的完整目录列表;以上优化减少插件侧开销,不代表服务器或网络传输时间消失。
@@ -0,0 +1,9 @@
1
+ # 1.4.4 · 历史发布说明
2
+
3
+ 以下内容从原 README 迁入,描述该版本当时的行为与验证范围。
4
+
5
+ ## 1.4.4 更新
6
+
7
+ - 文件传输列表所有条目均提供下载入口:文件直接下载,目录打包为 `.tar`。
8
+ - 点击名称或输入路径后按需判断实际类型:目录进入,文件显示文件名和下载按钮,避免 FTP 文件被当成目录。
9
+ - FTP 链接和未知类型仅在操作时解析;目录打包不递归跟随内部链接,保留大目录加载优化。
@@ -0,0 +1,10 @@
1
+ # 1.4.5 · 历史发布说明
2
+
3
+ 以下内容从原 README 迁入,描述该版本当时的行为与验证范围。
4
+
5
+ ## 1.4.5 更新
6
+
7
+ - 右侧文件栏新增目录弹窗,复用目录操作及文件预览,关闭后保留当前位置。
8
+ - 完整文件名支持悬停和键盘聚焦提示,避免被滚动容器裁切。
9
+ - 修复 SSH 拖动上传事件冒泡到会话附件的问题。
10
+ - 本地目录新增原生文件管理器入口,检测环境支持,校验会话目录边界,不新增桌面端专属依赖。
@@ -0,0 +1,13 @@
1
+ 正式版,适配 DSH **0.1.2-rc.1**。
2
+
3
+ - 修复 FTP 文件弹窗下载图标缺少尺寸与描边,导致“下载到本地”竖排、图标变形的问题。
4
+ - 下载按钮保持单行并保留 44px 点击高度,补齐弹窗操作区边距;长文件名和路径在弹窗内换行,关闭按钮不被挤出。
5
+ - 保持现有材质、配色及下载逻辑。94 项测试通过,浏览器回归覆盖手机、窄窗口和桌面的深浅主题及万条目录虚拟列表。
6
+
7
+ ## 从 README 迁入的历史说明
8
+
9
+ ## 1.4.6 更新
10
+
11
+ - 修复 FTP 文件弹窗下载图标缺少尺寸与描边,导致“下载到本地”竖排、图标变形的问题。
12
+ - 下载按钮保持单行并保留 44px 点击高度,补齐弹窗操作区边距;长文件名和路径在弹窗内换行,关闭按钮不被挤出。
13
+ - 保持现有材质、配色及下载逻辑。94 项测试通过,浏览器回归覆盖手机、窄窗口和桌面的深浅主题及万条目录虚拟列表。
@@ -13,3 +13,18 @@
13
13
  注意:旧版本已删除的 GitHub Token 需要重新授权一次。常用命令暂不参与 Gist 同步。
14
14
 
15
15
  验证:109 项测试通过,6 组响应式明暗主题浏览器检查通过。
16
+
17
+ ## 从 README 迁入的历史说明
18
+
19
+ 以下为该版本当时的介绍,适用范围以该版为准,不作为当前使用指南。
20
+
21
+ ## 1.5.0 工作台增强
22
+
23
+ 主机操作依次为 SFTP、编辑、关闭全部终端、删除。关闭全部需一次确认,覆盖本工作台所有主机(含隐藏标签及连接中的终端),不影响其他浏览器窗口或主机配置;终端显示编号复用空缺,全部关闭后从 1 开始,内部连接标识不复用。
24
+
25
+ GitHub 同步收到 HTTP 401 后会用账号接口复核,不删除凭据。确认授权被拒绝时暂停自动同步并保留失败时间;手动测试连接/同步成功或保存新授权后恢复。暂停状态跨重启保留,旧请求不会覆盖新授权状态。网络错误与授权拒绝分别报告;以前已被删除的 Token 仍需重新授权。
26
+
27
+ - **同主机多个目录**:先挂载主机,再点选多个固定目录。目录旁会显示“已挂载”;可单独设定默认工作目录。右侧远端目录提供快捷切换,Agent 的 `ssh_list` 也会返回全部挂载目录。目录挂载不改变原有 SSH 权限范围。
28
+ - **终端多标签与分屏**:`+` 新建标签;双屏支持左右/上下排列,增加分屏最多 4 个,桌面三/四屏按四宫格排列,窄屏上下排列。点击已显示的标签只切换焦点,不交换位置;其他标签或新标签仅替换当前选中窗格。命令与连接按钮作用于选中的终端。SFTP 可从主机标题栏收起/展开,保留目录视图与宽度。切换工作台内的页面、主机或标签不主动断开连接;关闭标签或退出工作台会释放对应连接。新标签使用当时选中的远端路径,不修改已经运行的终端。每主机最多 8 个标签,服务端最多 32 个运行中/连接中的浏览器终端。
29
+ - **常用命令**:支持搜索、新建、编辑和删除;终端内点击“常用命令”选择后先预览,确认后仅在该终端执行。支持多行,不自动采集终端输入;勿保存密码、Token。开发版已接入 Gist 同步与备份,旧备份缺少命令集合时保留本机命令,显式删除仍参与智能合并。
30
+ - **页面统一**:沿用文件传输页的标题栏、圆角、透明材质、字体和列表间距;终端仅在首次连接时创建,隐藏标签降低备用轮询频率。
@@ -0,0 +1,10 @@
1
+ # 1.5.1 · 历史发布说明
2
+
3
+ 以下内容从原 README 迁入,描述该版本当时的行为与验证范围。
4
+
5
+ ## 1.5.1 匿名 FTP 登录
6
+
7
+ - FTP/FTPS 连接的身份认证可选择“匿名登录”,无需填写账号密码;服务器需开放匿名访问。
8
+ - 测试连接、目录浏览、文件传输及配置同步保留匿名模式,代理与 TLS 规则不变。
9
+ - 匿名连接使用 `anonymous` / `anonymous@`,不会发送私人凭据;切换匿名后清理此连接独立保存的密码,不删除共享凭据。
10
+ - 原有连接默认保持账号密码认证。
@@ -0,0 +1,9 @@
1
+ # 1.5.2 · 历史发布说明
2
+
3
+ 以下内容从原 README 迁入,描述该版本当时的行为与验证范围。
4
+
5
+ ## 1.5.2 连接稳定性修复
6
+
7
+ - SSH 错误监听保留至连接关闭,避免握手超时后的二次错误终止后端进程;同时处理连接取消及握手前关闭。
8
+ - 匿名 FTP 表单明确提交标准用户名 `anonymous`,不携带私人密码。
9
+ - 增加直连与 SOCKS5 无响应握手回归,以及匿名 FTP 新建、重开和修改的浏览器验证。
@@ -9,3 +9,11 @@
9
9
  - 不修改 SSH/FTP 权限、认证和文件操作逻辑,无新增数据迁移。
10
10
 
11
11
  验证:123 项自动化测试通过;新版正式部署浏览器可打开工作区,无页面异常。未以发布检查代替真实远端连接验收。
12
+
13
+ ## 从 README 迁入的历史说明
14
+
15
+ 以下为该版本当时的介绍,适用范围以该版为准,不作为当前使用指南。
16
+
17
+ ## 1.5.3 新版宿主适配与侧栏统一
18
+
19
+ 支持原生多插件标签共存,统一右侧栏材质,修复终端滚动区及搜索框的主题样式干扰。权限和文件操作不变。详见 [更新说明](../../docs/releases/1.5.3.md)。
@@ -10,3 +10,11 @@
10
10
  - 编辑仅支持不超过 256 KiB 的完整 UTF-8 .md;含不支持结构的文档保持只读。外部程序不参与插件写锁,最终校验到替换间仍有极短并发窗口。
11
11
 
12
12
  验证:127 项自动测试通过;浏览器回归覆盖刷新、HTML 隔离、Markdown 保存、冲突与草稿恢复,以及移动端路径输入。
13
+
14
+ ## 从 README 迁入的历史说明
15
+
16
+ 以下为该版本当时的介绍,适用范围以该版为准,不作为当前使用指南。
17
+
18
+ ## 1.6.0 文件预览与 Markdown 编辑
19
+
20
+ 预览支持手动/自动刷新并保留滚动位置,新增隔离的静态 HTML 预览。Markdown 在手动模式下直接编辑正文,支持保存、快捷键、草稿恢复与版本冲突保护;自动模式只读,HTML 暂不支持编辑。详见 [更新说明](../../docs/releases/1.6.0.md)。
@@ -9,3 +9,19 @@
9
9
  - 隐藏精确匹配的初始化脚本回显,保留欢迎信息、错误和正常输出。初始化完成后停止过滤;超时、异常和关闭时保留未匹配内容。
10
10
 
11
11
  验证:141 项自动测试通过,含真实 Bash/dash PTY、分块回显、异常保留及目录上报测试;手机和桌面浏览器覆盖双语切换、窄栏、下载与目录跟随。
12
+
13
+ ## 从 README 迁入的历史说明
14
+
15
+ 以下为该版本当时的介绍,适用范围以该版为准,不作为当前使用指南。
16
+
17
+ ## 1.7.0 界面语言
18
+
19
+ 新增中英双语界面:跟随 DSH 设置中的显示语言,切换时保留终端、表单、草稿与目录状态。旧宿主没有语言服务时仍显示中文。只翻译插件显示文案,不翻译用户内容、路径、协议、内部字段或持久化数据;服务端及上游返回的错误原文、Agent 工具描述暂保持原样。
20
+
21
+ ## 1.7.0 终端旁 SFTP
22
+
23
+ 目录上报初始化脚本的完整回显会自动隐藏,保留欢迎信息、执行错误及目录元数据;不清屏、不关闭终端回显。初始化异常时优先保留原始输出,避免误吞信息。
24
+
25
+ 窄栏按实际宽度隐藏时间、大小等次要列,文件行提供直接下载按钮。默认跟随当前选中的终端目录,可在 SFTP 标题栏关闭跟随;预览文件、编辑路径、上传或确认删除时暂停,操作结束后再跟随。
26
+
27
+ 新建的 Bash/Zsh/sh(含 dash/ash)终端会安装仅当前 shell 会话有效的目录上报钩子,不修改远端启动文件;探测有最多 5 秒超时,失败不阻止终端连接。已有终端需要重连;其他 shell 需要自行支持 OSC 7 或 OSC 1337 `CurrentDir`。跟随基于终端报告的目录,不猜测输入命令,也不持续执行远端轮询命令。路径栏的链条图标切换跟随,悬停可查看等待上报的说明;文件行下载与删除操作在悬停或键盘聚焦时显示,触屏保持可见。
@@ -0,0 +1,14 @@
1
+ # 发布说明维护
2
+
3
+ [返回项目介绍](../../README.md) · [GitHub Releases](https://github.com/lemoncat7/dsh-ssh/releases)
4
+
5
+ README 只维护当前功能、安装方法、适用边界和文档入口,不逐版追加更新日志。详细配置放在使用文档中。
6
+
7
+ 每次发布:
8
+
9
+ 1. 在本目录维护 `<version>.md`,记录该版变更、兼容要求、迁移注意事项和实际验证范围;历史说明不代表当前行为。
10
+ 2. 将对应说明同步到 GitHub Release 正文,使用有效的绝对文档链接;不要只放一句更新摘要或指向 README。
11
+ 3. 核对版本标签、npm 版本与附件的一致性,优先使用已验证的同一安装包,不重新构建替换旧版本附件。
12
+ 4. 同一版本复用已有 Release;发布后检查不再遗留重复草稿。补发历史版本不能将它设成 Latest,撤回版本不能自动重新发布。
13
+
14
+ 本次从 README 迁出的历史段落保存在对应版本文件中。尚未正式发布的说明文件不代表该版本可用,请以 GitHub Release 和 npm 实际记录为准。
@@ -0,0 +1,10 @@
1
+ # 会话工作台与文件浏览状态
2
+
3
+ - SSH 工作台使用宿主的会话内容区域,不再作为全局主面板覆盖当前会话选择。切换会话或打开其他插件时,工作台仍按原有约定关闭。
4
+ - 打开工作台时,优先选择当前会话已挂载的主机,并展开已挂载主机所属的分组。未挂载分组默认折叠;用户手动收起分组后,普通数据刷新不会强行展开。
5
+ - 右栏分别记录每个会话的标签页、所选主机,以及每个“会话+主机”的浏览目录、打开文件和目录滚动位置。本地目录使用独立记录。关闭再打开、切换标签页或切换会话后恢复,但不跨浏览器刷新保存。
6
+ - 浏览状态只保留导航元信息,不缓存文件内容或权限,最多保留 128 个位置。恢复时重新请求目录和预览,继续经过服务端权限检查,不会自动修改会话工作目录。
7
+ - SQL、TXT、脚本、常见配置文件支持文本预览;未知后缀和无后缀文件也在大小限制内尝试识别。支持 UTF-8 与带 BOM 的 UTF-16;二进制、解码失败、读取不完整或预览失败时提供下载。UTF-16 文本不启用 UTF-8 Markdown 编辑。
8
+ - 文本预览上限为 1 MiB,图片/PDF 为 16 MiB;超过上限直接提供下载,不加载大文件正文。下载仍使用原有鉴权路径。
9
+
10
+ 验证命令:`npm test`;隔离浏览器脚本 `scripts/verify-session-state.mjs` 使用本地 HTTP 测试数据,不访问真实主机。可通过 `SSH_PLAYWRIGHT_MODULE` 和 `SSH_REACT_DOM_MODULES` 指定现有 Playwright、React DOM 的位置。