@lemoncat7/dsh-ssh 1.14.1 → 1.16.19

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 (109) hide show
  1. package/README.md +14 -2
  2. package/docs/compatibility-0.2.2-rc.1.md +13 -0
  3. package/docs/releases/1.15.0.md +16 -0
  4. package/docs/releases/1.16.0.md +19 -0
  5. package/docs/releases/1.16.1.md +7 -0
  6. package/docs/releases/1.16.10.md +8 -0
  7. package/docs/releases/1.16.11.md +5 -0
  8. package/docs/releases/1.16.12.md +9 -0
  9. package/docs/releases/1.16.13.md +7 -0
  10. package/docs/releases/1.16.14.md +7 -0
  11. package/docs/releases/1.16.15.md +5 -0
  12. package/docs/releases/1.16.16.md +5 -0
  13. package/docs/releases/1.16.17.md +5 -0
  14. package/docs/releases/1.16.18.md +5 -0
  15. package/docs/releases/1.16.19.md +21 -0
  16. package/docs/releases/1.16.2.md +7 -0
  17. package/docs/releases/1.16.3.md +11 -0
  18. package/docs/releases/1.16.4.md +10 -0
  19. package/docs/releases/1.16.5.md +9 -0
  20. package/docs/releases/1.16.6.md +7 -0
  21. package/docs/releases/1.16.7.md +7 -0
  22. package/docs/releases/1.16.8.md +19 -0
  23. package/docs/releases/1.16.9.md +7 -0
  24. package/lib/api.d.ts.map +1 -1
  25. package/lib/api.js +19 -1
  26. package/lib/api.js.map +1 -1
  27. package/lib/client-api.d.ts +1 -0
  28. package/lib/client-api.d.ts.map +1 -1
  29. package/lib/client-api.js.map +1 -1
  30. package/lib/client.d.ts.map +1 -1
  31. package/lib/client.js +382 -143
  32. package/lib/client.js.map +4 -4
  33. package/lib/commands-panel.js +1 -1
  34. package/lib/commands-panel.js.map +1 -1
  35. package/lib/domain.d.ts +3 -0
  36. package/lib/domain.d.ts.map +1 -1
  37. package/lib/domain.js +2 -0
  38. package/lib/domain.js.map +1 -1
  39. package/lib/file-transfer-tools.js +4 -3
  40. package/lib/file-transfer-tools.js.map +1 -1
  41. package/lib/file-transfer-workspace.d.ts.map +1 -1
  42. package/lib/file-transfer-workspace.js +4 -4
  43. package/lib/file-transfer-workspace.js.map +1 -1
  44. package/lib/host-action-menu.d.ts +10 -0
  45. package/lib/host-action-menu.d.ts.map +1 -0
  46. package/lib/host-action-menu.js +32 -0
  47. package/lib/host-action-menu.js.map +1 -0
  48. package/lib/host-select.d.ts +9 -0
  49. package/lib/host-select.d.ts.map +1 -0
  50. package/lib/host-select.js +92 -0
  51. package/lib/host-select.js.map +1 -0
  52. package/lib/locales/messages.d.ts +216 -0
  53. package/lib/locales/messages.d.ts.map +1 -1
  54. package/lib/locales/messages.js +54 -0
  55. package/lib/locales/messages.js.map +1 -1
  56. package/lib/profile-editor.d.ts.map +1 -1
  57. package/lib/profile-editor.js +4 -1
  58. package/lib/profile-editor.js.map +1 -1
  59. package/lib/remote-workspace-tree.d.ts +4 -0
  60. package/lib/remote-workspace-tree.d.ts.map +1 -1
  61. package/lib/remote-workspace-tree.js +97 -34
  62. package/lib/remote-workspace-tree.js.map +1 -1
  63. package/lib/settings-pane.js +1 -1
  64. package/lib/settings-pane.js.map +1 -1
  65. package/lib/sftp-client.d.ts +3 -1
  66. package/lib/sftp-client.d.ts.map +1 -1
  67. package/lib/sftp-client.js +11 -10
  68. package/lib/sftp-client.js.map +1 -1
  69. package/lib/sftp-path-mapping.d.ts +9 -0
  70. package/lib/sftp-path-mapping.d.ts.map +1 -0
  71. package/lib/sftp-path-mapping.js +36 -0
  72. package/lib/sftp-path-mapping.js.map +1 -0
  73. package/lib/sftp.js +1 -1
  74. package/lib/sftp.js.map +1 -1
  75. package/lib/split-icon.d.ts +4 -0
  76. package/lib/split-icon.d.ts.map +1 -0
  77. package/lib/split-icon.js +5 -0
  78. package/lib/split-icon.js.map +1 -0
  79. package/lib/sync-panel.js +1 -1
  80. package/lib/sync-panel.js.map +1 -1
  81. package/lib/terminal-desk-state.d.ts +71 -0
  82. package/lib/terminal-desk-state.d.ts.map +1 -0
  83. package/lib/terminal-desk-state.js +205 -0
  84. package/lib/terminal-desk-state.js.map +1 -0
  85. package/lib/terminal-desk.d.ts +16 -0
  86. package/lib/terminal-desk.d.ts.map +1 -0
  87. package/lib/terminal-desk.js +197 -0
  88. package/lib/terminal-desk.js.map +1 -0
  89. package/lib/terminal-session.d.ts +5 -1
  90. package/lib/terminal-session.d.ts.map +1 -1
  91. package/lib/terminal-session.js +52 -18
  92. package/lib/terminal-session.js.map +1 -1
  93. package/lib/terminal-transport.d.ts.map +1 -1
  94. package/lib/terminal-transport.js +7 -4
  95. package/lib/terminal-transport.js.map +1 -1
  96. package/lib/terminal-workspace-state.d.ts +45 -0
  97. package/lib/terminal-workspace-state.d.ts.map +1 -0
  98. package/lib/terminal-workspace-state.js +110 -0
  99. package/lib/terminal-workspace-state.js.map +1 -0
  100. package/lib/terminal-workspace.d.ts +2 -1
  101. package/lib/terminal-workspace.d.ts.map +1 -1
  102. package/lib/terminal-workspace.js +43 -19
  103. package/lib/terminal-workspace.js.map +1 -1
  104. package/lib/terminal.d.ts +10 -3
  105. package/lib/terminal.d.ts.map +1 -1
  106. package/lib/terminal.js +33 -4
  107. package/lib/terminal.js.map +1 -1
  108. package/lib/tools.js.map +1 -1
  109. package/package.json +35 -34
package/README.md CHANGED
@@ -7,7 +7,8 @@
7
7
  ## 功能
8
8
 
9
9
  - SSH 主机与分组、固定目录、密码 / 私钥 / SSH Agent 认证,以及分组代理。
10
- - 多标签与分屏终端,SFTP 目录浏览,FTP / FTPS / SFTP 跨端点文件传输。
10
+ - 独立的「主机与项目」首页,支持卡片/列表、搜索、双击打开终端;AI 挂载单独操作。
11
+ - 跨主机统一多标签,每个标签内独立选择单屏、左右两屏、上下两屏或四格布局;离开工作台保留连接,返回或刷新恢复当前浏览器标签页内的终端与布局。SFTP 目录浏览,FTP / FTPS / SFTP 跨端点文件传输。
11
12
  - 可配置连接超时与主机覆盖值;可选终端 SSH 连接复用(默认关闭),新标签共享认证但保持独立 shell。
12
13
  - AI 只加载一个 `ssh` 工具,通过 `list / describe / call` 按需发现、查询和执行操作,减少常驻工具上下文。
13
14
  - 文本、SQL、配置、图片、PDF 与静态 HTML 预览;无法安全预览或超限时提供下载。
@@ -18,7 +19,7 @@
18
19
 
19
20
  ## 安装
20
21
 
21
- 最低支持 DeepSeek Harness **0.2.1-rc.2**,已通过 **0.2.1-rc.5** 构建与回归测试(宿主仍为 RC),需要 Node.js **^22.19.0 或 >=24.0.0**。其他宿主版本请先查阅[兼容说明](docs/dsh-021-compatibility.md)和对应版本的发布说明。
22
+ 当前版本 **1.16.19**,支持 DeepSeek Harness **0.2.2-rc.1**(宿主仍为 RC),需要 Node.js **>=24.9.0**。请查阅[兼容说明](docs/compatibility-0.2.2-rc.1.md)及[本版更新](docs/releases/1.16.19.md)。
22
23
 
23
24
  ```bash
24
25
  dsh plugin --profile web add @lemoncat7/dsh-ssh@latest
@@ -40,3 +41,14 @@ dsh plugin --profile web add @lemoncat7/dsh-ssh@latest
40
41
  - [架构与终端生命周期](ARCHITECTURE.md)
41
42
  - [版本与发布说明](https://github.com/lemoncat7/dsh-ssh/releases)
42
43
  - [发布维护约定](docs/releases/README.md)
44
+
45
+
46
+ ## DSH 0.2.2-rc.1
47
+
48
+ 1.14.2 支持 DSH 0.2.2-rc.1,要求 Node.js >=24.9.0。[兼容说明](docs/compatibility-0.2.2-rc.1.md)。
49
+
50
+ ### 工作台终端保留
51
+
52
+ 离开工作台只停止页面订阅,返回时恢复当前会话的主机、标签、分屏及服务端保留的输出;刷新页面也可恢复。记录保存在当前浏览器标签页的 sessionStorage,不保存密码或终端正文。缩减布局时选择保留的终端,确认后关闭其余连接;关闭标签或关闭全部终端也会先确认;关闭失败会保留未成功关闭的窗格并提示错误。
53
+
54
+ 终端有输出或页面订阅时保持连接。离开后连续 30 分钟没有输入、输出或订阅会回收,因此无输出的长任务仍建议使用 tmux/screen。服务重启、网络中断或回收后无法恢复原进程;页面提示重新连接,不自动重跑命令。服务端输出缓冲有上限,较早输出可能截断。
@@ -0,0 +1,13 @@
1
+ # DSH 0.2.2-rc.1 兼容性
2
+
3
+ 插件版本:1.14.2。目标宿主:官方 @deepseek-ai/dsh@0.2.2-rc.1;Node.js >=24.9.0。
4
+
5
+ 按新提示词文本组装类型适配;独立文件工具使用条件注册,执行权限继续由原操作校验。插件未维护独立PTC SSH helper,不复制旧协议2实现。
6
+
7
+ 此版本面向0.2.2-rc.1;回退宿主时请同时恢复升级前插件包和数据快照,不让旧宿主写入新宿主迁移后的数据。验证结果见部署仓库 COMPATIBILITY-022-RC1-20261105.md。
8
+
9
+ ## 专项复核
10
+
11
+ 旧版不可直接宣称兼容。0.2.2 的 `system-prompt/assemble` 使用不含工具列表的 `PromptPresentation`;独立文件工具的旧过滤逻辑会访问不存在的 `tools`。候选版已用条件注册控制可见性,并保留现代提示词中的文件访问与交付说明。正常统一 `ssh` 入口仍在插件内部管理子操作,其他插件不经它转调。
12
+
13
+ 专项复核修复了迁移中独立文件工具模式可能漏掉访问说明的问题;增加不含 `tools` 的提示词对象回归断言,确认没有向提示词补造工具列表。完整构建及 209 项测试再次通过(`ssh-verified-tests.log`)。页面打开、窄屏检查通过;尚未进行生产远程主机的端到端连接验收。
@@ -0,0 +1,16 @@
1
+ # 1.15.0
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ - 修复 #7:离开 SSH 工作台不再删除远端终端;返回及刷新恢复同一浏览器标签页、同一会话内的主机、终端标签与分屏,重新接入服务端输出。
6
+ - 明确关闭/断开才删除连接,失败保留引用并显示错误;处理连接未建立就离开或关闭的竞争,避免遗失后台连接。
7
+ - 恢复连接时更新输入代次和序号,拒绝旧页面迟到输入,防止按键被重复输入去重逻辑吞掉。此逻辑仅影响手动工作台终端,AI 终端授权保持原行为。
8
+ - 有输出或活动订阅时不会被 30 分钟空闲计时回收;离开且无活动满 30 分钟仍会回收。持续无输出的后台任务请用 tmux/screen。
9
+ - 修复已建立 SSE 在终端失效后无限重连的问题;短暂重连未恢复则以游标轮询核实终端状态。失效连接提示手动重连,不自动重新执行命令。
10
+ - React StrictMode 恢复时避免重复初始化终端造成的异步视口报错。
11
+
12
+ ## 验证与边界
13
+
14
+ 覆盖生命周期、真实 HTTP 接管协议、输入去重与旧代次拒绝、连接中关闭、回收时钟、存储恢复及会话隔离。浏览器隔离验收覆盖 StrictMode、离开/返回、刷新、分屏、恢复输入、关闭失败重试与失效不重跑;模拟远端接口,不向真实主机发送测试命令。
15
+
16
+ 升级需要重启 Profile,现存 SSH 通道会随重启断开;本次能力不提供跨服务重启的远端进程恢复。sessionStorage 不含凭据或终端输出,服务端输出缓存有界,过早输出可能截断。已有 SSH 主机、凭据和授权配置无需迁移。
@@ -0,0 +1,19 @@
1
+ # 1.16.0 — 主机管理与终端工作区分离
2
+
3
+ 支持 DeepSeek Harness **0.2.2-rc.1**,Node.js **>=24.9.0**;依赖与授权边界不变。
4
+
5
+ ## 界面与交互
6
+
7
+ - 第一页为「主机与项目」,支持卡片/列表、分组和主机/项目路径搜索。单击选择,双击或 Enter 打开终端;触屏也可使用明确的打开按钮。
8
+ - 不同主机共用终端标签栏,支持新建、切换、关闭、分屏及键盘导航。终端页不再常驻主机侧栏。
9
+ - AI 挂载使用独立按钮,选择主机和打开终端不会授予 AI 权限。授权摘要可展开查看与修改。
10
+ - 删除工具页重复的标题区:操作移到搜索栏、终端标签栏和文件路径附近;保留提示、错误、状态与连接控制。
11
+ - 文件面板跟随当前终端标签的主机,可独立浏览目录;支持仅浏览文件,不自动创建 shell。窄窗口可在终端与文件面板间切换。
12
+
13
+ ## 迁移与边界
14
+
15
+ 当前浏览器标签页内的旧终端记录自动合并到统一标签栏;配置、凭据和 AI 授权不变。离开工作台保留连接,明确关闭才断开;关闭失败保留标签。服务重启后无法恢复原 SSH 进程,不自动重跑命令。
16
+
17
+ ## 验证
18
+
19
+ 使用 DSH 0.2.2-rc.1 依赖构建,运行完整串行测试。真实 React/xterm 组件浏览器验证覆盖双击复用、跨主机切换与分屏、键盘导航、授权隔离、离开与刷新恢复、关闭失败重试、仅文件模式和 390px 窄屏;远端 API 使用隔离模拟,不向真实主机发送测试命令。
@@ -0,0 +1,7 @@
1
+ # 1.16.1 — 主机与项目容器
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 「主机与项目」内容区改为完整的大卡片,边距、圆角、边框与阴影沿用文件传输工作区。搜索、操作按钮、权限提示、主机列表和底部说明都放在同一底板内;底板采用随深浅色主题变化的实色,避免壁纸干扰阅读。交互逻辑保持原样。
6
+
7
+ 验证:构建、浏览器原有交互回归、深浅色和390px窄屏布局,检查容器背景不透明以及列表内部滚动。
@@ -0,0 +1,8 @@
1
+ # 1.16.10 — 终端操作栏精简
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ - 顶部移除 AI 挂载摘要和更多菜单;新建、左右分屏、上下分屏、SFTP 均为带提示的图标按钮。
6
+ - 底栏连接信息固定在左侧,点击打开连接详情;命令、连接/断开固定在右侧,窄屏长信息自动省略。
7
+ - 分屏按钮支持切换方向,再点已选方向恢复单窗,保留其他标签和连接。关闭终端仍使用标签上的关闭入口。
8
+ - 沿用上一版背景卡片,文件独立浏览仍可通过新建连接弹窗进入。
@@ -0,0 +1,5 @@
1
+ # 1.16.11 — 终端底栏左右位置调整
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 根据确认后的布局,命令、连接/断开按钮放在底栏左侧,连接信息放在右侧并右对齐,点击信息仍打开连接详情。窄屏优先保留操作按钮,过长的信息省略。键盘顺序与视觉顺序保持一致。
@@ -0,0 +1,9 @@
1
+ # 1.16.12 — 每个标签独立分屏
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 终端标签独立拥有窗格和布局。左右分屏在当前窗格右侧创建连接,上下分屏在当前窗格下方创建连接,可混合拆分至四个窗格,不增加标签、不引用其他标签。点击窗格切换操作目标,命令、连接/断开和 SFTP 跟随当前窗格。
6
+
7
+ 每个窗格可单独关闭;关闭标签会关闭其中所有连接,失败的窗格保留以便重试。切换标签及刷新保留各自布局;旧版每个标签迁移为独立单窗格,保留连接标识,不自动重跑命令。
8
+
9
+ 保留命令/连接在左、连接信息在右的底栏布局。
@@ -0,0 +1,7 @@
1
+ # 1.16.13 — 固定分屏与保留终端选择
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 每个标签提供单屏、左右两屏、上下两屏、四格布局,取消递归拆分和窗格关闭按钮。同数量切换只调整布局;缩减时选择保留的终端,确认后关闭其余连接,取消不执行。关闭失败保留失败终端并提示。
6
+
7
+ SFTP右侧增加红色关闭全部按钮,确认后处理所有标签,包括隐藏终端。底栏按钮统一32px高度与上下6px留白,加强底色和边框;保留按钮在左、连接信息在右。恢复文件目录默认跟随对应终端,手动取消后切换窗格仍保留该窗格的选择。
@@ -0,0 +1,7 @@
1
+ # 1.16.14 — 底栏危险操作与 SFTP 目录映射
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 关闭所有终端改为底栏最左侧红色文字按钮,与命令区分隔;断开也使用红色。选择保留终端弹窗使用单层表面,移除厚重外框和选中描边。
6
+
7
+ 主机支持显式配置终端→SFTP路径前缀映射,仅作用于终端文件面板的初始目录与自动跟随,手动SFTP路径和文件操作仍使用SFTP实际路径。目录不存在返回带路径的404;跟随失败保留最后成功列表,并提示核对目录根映射。
@@ -0,0 +1,5 @@
1
+ # 1.16.15 — 文件传输入口整理
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 移除文件传输顶部重复的 FTP 管理与会话访问入口,将会话访问及授权数量放到连接列表标题右侧、FTP 管理左侧。保持原有 FTP/FTPS 授权弹窗、连接管理与传输行为,窄屏标题省略避免挤压按钮。
@@ -0,0 +1,5 @@
1
+ # 1.16.16 — 工作台页面统一卡片背景
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 常用命令、端口转发、密钥库、代理库、同步和设置统一采用与主机、终端和文件传输一致的整块卡片材质、圆角、边框及外侧留白;长页面在卡片内部滚动。保留工具按钮、说明提示及同步页面驻留行为。
@@ -0,0 +1,5 @@
1
+ # 1.16.17 — 可搜索主机选择器
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 新建终端及端口转发共用可输入筛选的主机选择器,可按名称、地址、用户名、分组和标签匹配,展示主机名称与地址。支持键盘选择、空结果提示、点击外部关闭,弹出列表不被卡片或弹窗裁切。输入搜索词不会被当作连接目标;新建终端搜索未选定时禁止连接。
@@ -0,0 +1,5 @@
1
+ # 1.16.18 — 新建终端紧邻标签
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 新建终端加号紧邻终端标签右侧,分屏与SFTP操作保持靠右。标签较多时标签区横向滚动,加号始终保留在可见位置。
@@ -0,0 +1,21 @@
1
+ # 1.16.19 — 终端分屏、主机搜索与工作台界面完善
2
+
3
+ 本次正式发布包含自 **1.16.8** 以来已部署验证的更新。支持 DeepSeek Harness **0.2.2-rc.1**,需要 Node.js **>=24.9.0**。
4
+
5
+ ## 终端与文件
6
+
7
+ - 每个终端标签拥有独立窗格,支持单屏、左右两屏、上下两屏与四格;缩减时选择保留的终端并确认关闭其余连接,同数量切换方向保留连接。
8
+ - 新建终端加号紧邻标签右侧。分屏与 SFTP 按钮保持靠右;底栏左侧依次为关闭所有终端、命令、断开,连接信息靠右且可点击查看详情。
9
+ - 关闭所有终端覆盖隐藏标签;关闭失败保留未成功关闭的连接。保留窗格选择弹窗减轻边框与阴影。
10
+ - 新建终端与端口转发共用可搜索主机选择器,可按名称、地址、用户名、分组和标签筛选。支持键盘操作、无匹配提示,列表不被卡片或弹窗裁切。搜索文字不会直接作为连接目标。
11
+ - 恢复默认跟随终端目录,保留各窗格手动关闭跟随的选择。主机支持显式配置终端到 SFTP 的路径前缀映射,适用于 NAS 虚拟目录根与终端路径不同的情况;映射仅作用于终端文件面板初始目录和自动跟随。
12
+ - 目录不存在统一返回 404;跟随失败保留上次成功列表并显示原因,首次加载失败后也可跟随新的有效目录恢复。
13
+
14
+ ## 工作台与侧栏
15
+
16
+ - 主机、终端、文件传输及后续工具页面统一整块卡片背景,保留说明与操作入口;长设置页在卡片内滚动。
17
+ - 移除文件传输顶部重复的 FTP 管理入口,连接列表标题右侧依次为会话访问和 FTP 管理。
18
+ - 远端分组默认收起,展开按钮覆盖右侧快捷按钮以外的整行区域,支持鼠标与键盘。
19
+ - 主机与项目搜索下方说明主要用于给当前 AI 会话挂载主机与项目目录,访问范围由会话权限控制,同时保留手动终端用途说明。
20
+
21
+ 已完成自动测试与桌面、窄屏浏览器验证,包括分屏保留选择、关闭失败恢复、目录映射、主机搜索及侧栏交互。生产运行仍支持 DSH 0.2.2-rc.1;插件版本为正式版。
@@ -0,0 +1,7 @@
1
+ # 1.16.2 — 对齐文件传输的卡片材质
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 修正1.16.1将主机与项目底板做成不透明白板的问题。保留完整大卡片布局,背景、透明度、毛玻璃、边框、圆角和阴影直接使用文件传输工作区的相同主题变量。功能交互不变。
6
+
7
+ 验证:构建及浏览器检查,对比两页容器在深浅主题下的实际计算样式。
@@ -0,0 +1,11 @@
1
+ # 1.16.3 — 主机目录与操作收拢
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ - 当前会话权限改由工具栏按钮打开弹窗设置,保留保存状态与错误反馈。
6
+ - 主机默认隐藏操作,悬停/键盘焦点显示挂载、单双击说明和更多菜单;触屏保留可见入口。打开终端、编辑、删除及新增固定目录收进更多菜单。
7
+ - 单击主机展开或收起固定目录,双击打开终端并恢复双击前的展开状态;不会隐式改变 AI 授权。
8
+ - 当前会话已挂载主机所在分组默认展开,其余分组收起;当前页面手动选择优先于普通刷新。
9
+ - 主机更多菜单使用浏览器 popover 顶层,避免卡片裁切和主题层叠覆盖,并支持边缘避让、键盘导航和 Escape 关闭。
10
+
11
+ 验证覆盖上述交互、窄屏触屏、权限弹窗保存、菜单顶层命中及跨主机终端回归。
@@ -0,0 +1,10 @@
1
+ # 1.16.4 — 紧凑主机与固定目录
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ - 主机信息和悬停操作置于同一排,保留两行名称/地址;悬停提示复用地址行,不另占一排。
6
+ - 固定目录采用相同的悬停模式,仅在右侧保留挂载与更多菜单。名称和路径各一行,长文本省略;完整路径通过悬停提示查看。已挂载/默认目录不再额外增加一行。
7
+ - 目录的打开终端、默认目录、新会话及编辑操作收进顶层菜单;所有菜单项统一图标列。
8
+ - SSH 菜单在插件内部强制自己的背景、边框、字体、圆角、按钮、焦点和图标样式,抵御外部全局菜单样式覆盖,不依赖或修改任何主题插件。
9
+
10
+ 验证包含长路径、已挂载目录、桌面/390px、悬停显示、菜单图标、目录编辑入口,以及注入全局!important规则后菜单计算样式保持一致。
@@ -0,0 +1,9 @@
1
+ # 1.16.5 — 主机内部固定目录列表
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ - 固定目录改为主机卡片内部的紧凑子列表,统一缩进、顶部细分隔线及圆角悬停;取消目录逐行硬边框和挂载后的整块高亮,保留两行信息及同排悬停操作。
6
+ - 空列表使用单行「添加固定目录」入口。焦点框改为内描边,强制去除外扩阴影;目录区预留内边距并限制绘制边界,避免悬停/选中时遮住主机标题。
7
+ - 展开不再向上位移动画;主机卡片顶部与子列表边界衔接。顶层更多菜单与目录编辑弹窗继续可用。
8
+
9
+ 验证覆盖空列表悬停/键盘选中、外部焦点样式覆盖、添加入口打开关闭、长路径、桌面/窄屏与既有交互回归。
@@ -0,0 +1,7 @@
1
+ # 1.16.6 — 已挂载目录置灰
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 已挂载的固定目录以灰色、降低透明度的名称、路径及图标区分;卸载后恢复。操作区不随信息区一起置灰,保留卸载、更多操作和打开终端的能力。沿用当前挂载按钮及单击选择/双击打开行为。
6
+
7
+ 验证挂载后置灰、卸载恢复、已挂载初始状态及操作按钮可用,保留布局和已有交互。
@@ -0,0 +1,7 @@
1
+ # 1.16.7 — 主机展开状态高亮
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 仅调整主机行:展开时保留灰色选中底色,收起后清除常驻底色和选中侧线;收起状态仍有正常悬停反馈。主机被选中或挂载不再使已收起的行保持选中底色。目录的选中、挂载灰显与操作行为不变。
6
+
7
+ 验证:已挂载/未挂载主机展开与收起,移开鼠标但保留焦点后常驻灰色消失,以及原有目录和终端交互回归。
@@ -0,0 +1,19 @@
1
+ # 1.16.8 — 主机与项目、统一终端工作区
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 本次推送包含自 1.15.0 以来的工作区调整,1.16.0–1.16.7 为此前逐步部署验证的迭代记录。
6
+
7
+ - 「主机与项目」独立为第一页,支持卡片/列表与搜索;主机单击展开固定目录、双击打开终端,默认展开已有挂载的分组。
8
+ - 不同主机共用终端标签栏,支持分屏、切换及恢复;文件面板跟随当前标签,也可单独浏览文件。移除各工具重复标题,扩大操作区域。
9
+ - 会话权限改用弹窗。主机与固定目录采用紧凑布局,挂载和更多操作在悬停时显示;更多菜单统一图标并独立约束样式。
10
+ - 固定目录作为主机内的子列表展示,挂载后灰显;空目录入口的焦点边框不会遮挡主机。主机展开保留高亮,收起后清除高亮。
11
+ - 旧终端记录自动迁移;选择主机和打开终端不会授予 AI 权限。离开页面保留连接,关闭失败保留标签,服务重启后不自动重跑命令。
12
+
13
+ ## 本轮悬停修复
14
+
15
+ 主机行区分鼠标点击后残留的DOM焦点与键盘焦点:鼠标移开即隐藏操作按钮和提示、恢复地址,不要求再点击其他地方。键盘focus-visible、已打开的更多菜单仍可显示操作;触屏保留常显入口。
16
+
17
+ 沿用1.16.7的展开高亮/收起清除高亮。目录样式、挂载灰显及交互不变。
18
+
19
+ 验证鼠标展开/收起后移开、保留焦点时按钮隐藏、键盘Tab显示、菜单打开状态以及触屏操作。
@@ -0,0 +1,7 @@
1
+ # 1.16.9 — 终端与文件背景卡片
2
+
3
+ 支持 DSH **0.2.2-rc.1**,Node.js **>=24.9.0**。
4
+
5
+ 「终端与文件」使用与「主机与项目」「文件与传输」一致的整块背景卡片:共用背景材质、边框、圆角和阴影。标签栏、终端、文件面板和底部状态栏统一收在卡片内,顶部标签栏不再重复叠加背景。
6
+
7
+ 保持现有终端配色、分屏、文件区伸缩与连接行为;不增加标题或内容内边距。
package/lib/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,EAAwB,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAKrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrC,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAIzE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,sBAAsB,CAAA;AAG7E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAA+B,MAAM,4BAA4B,CAAA;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAGtE,OAAO,EAAwB,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAG5F,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAYhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE;QACd,IAAI,EAAE,QAAQ,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KACzE,GAAG,MAAM,IAAI,CAAA;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,CAAA;IACf,WAAW,EAAE,kBAAkB,CAAA;IAC/B,QAAQ,EAAE,eAAe,CAAA;IACzB,SAAS,EAAE,YAAY,CAAA;IACvB,QAAQ,EAAE,cAAc,CAAA;IACxB,SAAS,EAAE,sBAAsB,CAAA;IACjC,WAAW,EAAE,iBAAiB,CAAA;IAC9B,cAAc,EAAE,gBAAgB,CAAA;IAChC,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,iBAAiB,CAAA;IACxB,SAAS,EAAE,mBAAmB,CAAA;IAC9B,YAAY,EAAE,sBAAsB,CAAA;IACpC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACjD,yBAAyB,CAAC,IAAI,yBAAyB,GAAG,SAAS,CAAA;CACpE;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,IAAI,CAwB3G"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,EAAwB,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAKrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrC,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAIzE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,sBAAsB,CAAA;AAG7E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAA+B,MAAM,4BAA4B,CAAA;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAGtE,OAAO,EAAwB,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAG5F,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAYhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE;QACd,IAAI,EAAE,QAAQ,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KACzE,GAAG,MAAM,IAAI,CAAA;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,CAAA;IACf,WAAW,EAAE,kBAAkB,CAAA;IAC/B,QAAQ,EAAE,eAAe,CAAA;IACzB,SAAS,EAAE,YAAY,CAAA;IACvB,QAAQ,EAAE,cAAc,CAAA;IACxB,SAAS,EAAE,sBAAsB,CAAA;IACjC,WAAW,EAAE,iBAAiB,CAAA;IAC9B,cAAc,EAAE,gBAAgB,CAAA;IAChC,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,iBAAiB,CAAA;IACxB,SAAS,EAAE,mBAAmB,CAAA;IAC9B,YAAY,EAAE,sBAAsB,CAAA;IACpC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACjD,yBAAyB,CAAC,IAAI,yBAAyB,GAAG,SAAS,CAAA;CACpE;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,IAAI,CAwB3G"}
package/lib/api.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { normalizeSftpPathMappings } from './sftp-path-mapping.js';
1
2
  import { exportConfiguration, previewConfiguration, importConfiguration } from './config-backup.js';
2
3
  import { randomBytes } from 'node:crypto';
3
4
  import { uploadEndpointFile } from './endpoint-upload.js';
@@ -512,6 +513,18 @@ async function dispatch(req, res, prefix, runtime) {
512
513
  if (id !== undefined && segments[2] === 'sftp') {
513
514
  requiredProfile(runtime.store, id);
514
515
  const operation = segments[3];
516
+ if (method === 'PUT' && operation === 'path-mappings' && segments.length === 4) {
517
+ requireMutationHeader(req);
518
+ const mappings = normalizeSftpPathMappings((await readObject(req)).mappings);
519
+ await runtime.store.update(state => {
520
+ const profile = state.profiles.find(profile => profile.id === id);
521
+ if (!profile)
522
+ throw httpError(404, 'profile not found');
523
+ profile.sftpPathMappings = mappings;
524
+ profile.updatedAt = Date.now();
525
+ });
526
+ return sendJson(res, 200, { mappings });
527
+ }
515
528
  if (method === 'PUT' && operation === 'markdown' && segments.length === 4) {
516
529
  requireMutationHeader(req);
517
530
  return sendJson(res, 200, await saveSftpMarkdown(runtime.connector, id, parseMarkdownSave(await readObject(req, 2_097_152))));
@@ -970,10 +983,15 @@ async function dispatch(req, res, prefix, runtime) {
970
983
  subscribe: listener => terminal.subscribeOutput(listener),
971
984
  });
972
985
  }
986
+ if (id !== undefined && method === 'POST' && segments[2] === 'attach') {
987
+ requireMutationHeader(req);
988
+ const body = await readObject(req);
989
+ return sendJson(res, 200, runtime.terminals.get(id).attach(requireText(body.profileId, 'profileId', 200)));
990
+ }
973
991
  if (id !== undefined && method === 'POST' && segments[2] === 'input') {
974
992
  requireMutationHeader(req);
975
993
  const body = await readObject(req);
976
- runtime.terminals.get(id).writeOrdered(optionalInteger(body.sequence, 0, Number.MAX_SAFE_INTEGER), requireRawText(body.text, 'text', 100_000));
994
+ runtime.terminals.get(id).writeOrdered(optionalInteger(body.sequence, 0, Number.MAX_SAFE_INTEGER), requireRawText(body.text, 'text', 100_000), body.inputEpoch === undefined ? undefined : requireText(body.inputEpoch, 'inputEpoch', 200));
977
995
  return sendJson(res, 204, undefined);
978
996
  }
979
997
  if (id !== undefined && method === 'POST' && segments[2] === 'resize') {