@lemoncat7/dsh-ssh 1.11.7 → 1.14.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.
Files changed (97) hide show
  1. package/ARCHITECTURE.md +4 -0
  2. package/README.md +3 -0
  3. package/docs/releases/1.12.0.md +15 -0
  4. package/docs/releases/1.13.0.md +15 -0
  5. package/docs/releases/1.14.0.md +10 -0
  6. package/docs/third-party/react-bits.md +29 -0
  7. package/docs/usage.md +28 -1
  8. package/lib/api.d.ts.map +1 -1
  9. package/lib/api.js +22 -0
  10. package/lib/api.js.map +1 -1
  11. package/lib/client-api.d.ts +3 -0
  12. package/lib/client-api.d.ts.map +1 -1
  13. package/lib/client-api.js.map +1 -1
  14. package/lib/client.d.ts.map +1 -1
  15. package/lib/client.js +291 -185
  16. package/lib/client.js.map +4 -4
  17. package/lib/config-backup-panel.d.ts +2 -0
  18. package/lib/config-backup-panel.d.ts.map +1 -0
  19. package/lib/config-backup-panel.js +74 -0
  20. package/lib/config-backup-panel.js.map +1 -0
  21. package/lib/config-backup.d.ts +6 -0
  22. package/lib/config-backup.d.ts.map +1 -0
  23. package/lib/config-backup.js +142 -0
  24. package/lib/config-backup.js.map +1 -0
  25. package/lib/config.d.ts +2 -0
  26. package/lib/config.d.ts.map +1 -1
  27. package/lib/config.js +4 -0
  28. package/lib/config.js.map +1 -1
  29. package/lib/connection-policy.d.ts +6 -0
  30. package/lib/connection-policy.d.ts.map +1 -0
  31. package/lib/connection-policy.js +10 -0
  32. package/lib/connection-policy.js.map +1 -0
  33. package/lib/connector.d.ts +9 -1
  34. package/lib/connector.d.ts.map +1 -1
  35. package/lib/connector.js +39 -7
  36. package/lib/connector.js.map +1 -1
  37. package/lib/credentials.d.ts +2 -0
  38. package/lib/credentials.d.ts.map +1 -1
  39. package/lib/credentials.js +5 -0
  40. package/lib/credentials.js.map +1 -1
  41. package/lib/domain.d.ts +4 -0
  42. package/lib/domain.d.ts.map +1 -1
  43. package/lib/domain.js +3 -0
  44. package/lib/domain.js.map +1 -1
  45. package/lib/file-transfer-tools.d.ts +2 -1
  46. package/lib/file-transfer-tools.d.ts.map +1 -1
  47. package/lib/file-transfer-tools.js +8 -6
  48. package/lib/file-transfer-tools.js.map +1 -1
  49. package/lib/gist-sync.d.ts +3 -1
  50. package/lib/gist-sync.d.ts.map +1 -1
  51. package/lib/gist-sync.js +10 -3
  52. package/lib/gist-sync.js.map +1 -1
  53. package/lib/index.d.ts.map +1 -1
  54. package/lib/index.js +3 -0
  55. package/lib/index.js.map +1 -1
  56. package/lib/locales/messages.d.ts +448 -0
  57. package/lib/locales/messages.d.ts.map +1 -1
  58. package/lib/locales/messages.js +112 -0
  59. package/lib/locales/messages.js.map +1 -1
  60. package/lib/profile-editor.d.ts.map +1 -1
  61. package/lib/profile-editor.js +9 -2
  62. package/lib/profile-editor.js.map +1 -1
  63. package/lib/settings-pane.d.ts +2 -0
  64. package/lib/settings-pane.d.ts.map +1 -0
  65. package/lib/settings-pane.js +54 -0
  66. package/lib/settings-pane.js.map +1 -0
  67. package/lib/ssh-channel.d.ts +4 -0
  68. package/lib/ssh-channel.d.ts.map +1 -0
  69. package/lib/ssh-channel.js +37 -0
  70. package/lib/ssh-channel.js.map +1 -0
  71. package/lib/sync-panel.d.ts +4 -0
  72. package/lib/sync-panel.d.ts.map +1 -0
  73. package/lib/sync-panel.js +252 -0
  74. package/lib/sync-panel.js.map +1 -0
  75. package/lib/sync-stepper.d.ts +16 -0
  76. package/lib/sync-stepper.d.ts.map +1 -0
  77. package/lib/sync-stepper.js +42 -0
  78. package/lib/sync-stepper.js.map +1 -0
  79. package/lib/temporary-access.d.ts +2 -1
  80. package/lib/temporary-access.d.ts.map +1 -1
  81. package/lib/temporary-access.js +3 -3
  82. package/lib/temporary-access.js.map +1 -1
  83. package/lib/terminal-connection-pool.d.ts +16 -0
  84. package/lib/terminal-connection-pool.d.ts.map +1 -0
  85. package/lib/terminal-connection-pool.js +111 -0
  86. package/lib/terminal-connection-pool.js.map +1 -0
  87. package/lib/terminal.d.ts.map +1 -1
  88. package/lib/terminal.js +11 -10
  89. package/lib/terminal.js.map +1 -1
  90. package/lib/tool-entry.d.ts +11 -0
  91. package/lib/tool-entry.d.ts.map +1 -0
  92. package/lib/tool-entry.js +64 -0
  93. package/lib/tool-entry.js.map +1 -0
  94. package/lib/tools.d.ts.map +1 -1
  95. package/lib/tools.js +10 -12
  96. package/lib/tools.js.map +1 -1
  97. package/package.json +4 -2
package/ARCHITECTURE.md CHANGED
@@ -31,6 +31,10 @@ FTP LIST timestamps are retained as `modifiedAtText` when MLSD timestamps are un
31
31
  - `src/file-transfer-manager.ts` owns bounded asynchronous jobs, recursive scans, stream backpressure, progress, cancellation, and cleanup.
32
32
  - `src/session-file-download.ts` owns bounded foreground downloads into the owning session directory. It reuses protocol adapters, validates local boundaries, streams into private staging files, and publishes with an exclusive hard link so existing targets are never overwritten. Tool visibility, approval and live session authorization stay in `src/file-transfer-tools.ts`; downloads are not background transfer jobs.
33
33
  - `src/connector.ts`, `src/terminal.ts`, `src/sftp.ts`, and `src/forwards.ts` retain SSH-specific resources and cleanup.
34
+ - `src/connection-policy.ts` resolves inherited vs explicit connection deadlines without overwriting stored legacy custom values. `src/ssh-channel.ts` bounds channel opening/cancellation without killing shared transports.
35
+ - `src/terminal-connection-pool.ts` owns bounded, owner-scoped authentication leases for terminals only. Closing a lease never closes another shell. Connection configuration or vault revisions retire old entries; active leases drain, idle entries expire after 30 seconds. No command is transparently replayed after disconnect.
36
+ - `src/tool-entry.ts` is the sole model-facing `ssh` registration. Original definitions are kept as private operation implementations, discovered per current session and revalidated on execution. The host gates the entry; command/file pre-execute policies decode the selected operation without rewriting host execution identity. No additional tool schemas or long catalog are injected until requested. External name-based allowlists must authorize the new entry explicitly.
37
+ - `src/settings-pane.tsx` owns settings fetch, serialized field patches and save feedback separately from client composition.
34
38
 
35
39
  ### Browser features
36
40
 
package/README.md CHANGED
@@ -8,10 +8,13 @@
8
8
 
9
9
  - SSH 主机与分组、固定目录、密码 / 私钥 / SSH Agent 认证,以及分组代理。
10
10
  - 多标签与分屏终端,SFTP 目录浏览,FTP / FTPS / SFTP 跨端点文件传输。
11
+ - 可配置连接超时与主机覆盖值;可选终端 SSH 连接复用(默认关闭),新标签共享认证但保持独立 shell。
12
+ - AI 只加载一个 `ssh` 工具,通过 `list / describe / call` 按需发现、查询和执行操作,减少常驻工具上下文。
11
13
  - 文本、SQL、配置、图片、PDF 与静态 HTML 预览;无法安全预览或超限时提供下载。
12
14
  - 按会话保留右栏标签、主机、目录、预览和滚动位置;打开面板定位当前挂载主机。
13
15
  - 按会话授权的远端命令、AI 终端与文件工具,支持核验聊天授意后的临时 SSH 授权及指定看板任务授权。
14
16
  - HTTP CONNECT、SOCKS5、SSH 跳板与端口转发,凭据库及加密 Gist 配置同步。
17
+ - 设置中导入、导出密码加密的配置备份,导入前预览数量并作为新副本添加。
15
18
 
16
19
  ## 安装
17
20
 
@@ -0,0 +1,15 @@
1
+ # SSH 1.12.0
2
+
3
+ 同步从设置中独立为一级页面。智能同步、自动同步、冲突策略和备份数量直接显示在页面上;账号授权、同步空间和加密密码通过弹窗中的三步向导配置。
4
+
5
+ - 提供清晰的 Token 与浏览器授权入口,不再把首次授权必填项藏进高级设置。
6
+ - 使用基于 React Bits Stepper 适配的引导,支持返回修改、字段校验、错误重试、授权等待、键盘操作与减少动态效果。
7
+ - 已连接账号通过“管理配置”维护;切换工作台页面保留未保存的同步偏好。
8
+ - 账号验证独立于旧 Gist 的读取和解密,避免旧同步空间故障阻断重新授权。
9
+ - 自动更新同步状态;代理配置归入同步页,保存时保留当前实例的其他运行设置。
10
+ - 同步方式列表目前仅 GitHub Gist 可用,WebDAV、S3 明确标注尚未接入。
11
+ - 明确说明凭据加密范围:密码、私钥等凭据加密上传;主机地址等配置在非公开 Gist 中保持明文。
12
+
13
+ 验证:TypeScript/客户端构建,195 项回归测试(新增授权与存储故障解耦用例),375/1024/1600px 明暗主题共六组浏览器流程,包括空值阻止提交、授权失败重试、返回保留输入、保存失败重试、OAuth、同步策略和代理设置。
14
+
15
+ 界面测试使用隔离 API fixture,不连接或修改生产 SSH 主机,不触发真实 GitHub 同步。React Bits 授权声明见 `docs/third-party/react-bits.md`。
@@ -0,0 +1,15 @@
1
+ # SSH 1.13.0
2
+
3
+ 设置增加「配置导入与导出」。无需连接 GitHub,即可下载由密码保护的 JSON 备份,或解密文件、预览数量后导入。
4
+
5
+ - 整个备份文件使用 scrypt 派生密钥和 AES-256-GCM 加密,包含地址及凭据;密码至少 8 位,文件最大 1 MB。备份密码不会改变同步密码。
6
+ - 备份范围:SSH、FTP/FTPS、项目目录、密钥库、代理库、分组代理和常用命令。会话授权、端口转发、本机运行设置及 GitHub 授权不包含在备份中。
7
+ - 导入为独立副本,保留现有配置;重新建立凭据、代理、跳板与项目引用,分组使用独立名称。重复导入会产生另一份副本。
8
+ - 导入先验证密码、文件和引用,再写入凭据与配置;配置提交失败时清理新增凭据。导入与云同步排队执行,已开启的自动同步会处理新增条目。
9
+ - 自动同步卡片恢复完整留白:桌面左右 24px、上下 20px,窄屏 18px;说明可换行,开关不挤压文字。
10
+
11
+ 适配 DSH 0.2.1-rc.2,Node.js ^22.19.0 或 >=24.0.0。现有配置无需迁移,生产依赖未增加。
12
+
13
+ 验证:199 项测试通过,包含文件加密往返、错误密码、文件篡改、导入引用、冷启动读取、写入失败清理、云同步排队及 HTTP 管理请求保护。真实组件在 375/1024/1600px、深浅色共六组隔离浏览器流程通过,覆盖下载、密码校验、解密预览、确认导入与既有同步配置流程。
14
+
15
+ 浏览器测试使用隔离 API fixture,不修改生产 SSH 主机或触发真实 GitHub 同步。
@@ -0,0 +1,10 @@
1
+ # 1.14.0
2
+
3
+ 适配 DeepSeek Harness **0.2.1-rc.2**,Node.js **^22.19.0 或 >=24.0.0**。
4
+
5
+ - 修复 #5:设置中可调默认 SSH 连接超时,主机编辑器可独立覆盖;新建主机测试也生效。区分握手和已核验指纹后的认证超时。
6
+ - 可选终端连接复用,默认关闭。并发新建共享一次认证,独立 shell/目录/输出与关闭;会话隔离、空闲回收、配置/凭据变更失效、失败淘汰和取消保护。
7
+ - 原 20 个 SSH/文件操作收敛为 `ssh` 一个宿主工具,按需 `list / describe / call`,执行仍使用原参数校验、会话权限与审批政策。
8
+ - 设置保存串行合并,失败保留反馈,沿用插件现有布局与中英文文案。
9
+
10
+ 迁移注意:自定义工具白名单需将原 SSH/文件工具名改为 `ssh`。旧会话中的操作名称仍可作为 `tool` 参数,但不再独立注册。挂载与授权数据无需迁移。连接复用不加快第一次认证,且共享连接断开会影响其上的终端。
@@ -0,0 +1,29 @@
1
+ MIT + Commons Clause License Condition v1.0
2
+
3
+ Copyright (c) 2026 David Haz
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, and distribute the Software **as part of an application, website, or product**, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ ## Commons Clause Restriction
14
+
15
+ You may use this Software, including for any commercial purpose, **so long as you do not sell, sublicense, or redistribute the components themselves-whether alone, in a bundle, or as a ported version.**
16
+
17
+ The same restriction covers the React Bits tools (Background Studio, Texture Lab, Shape Magic, Center Stage, Sound Lab and any tools added later) and the sounds in the sound library. **You may not sell, sublicense, or redistribute the tools or the sounds themselves, or offer the tools or a substantially similar copy of them as a hosted service-whether alone, in a bundle, or as a ported version.**
18
+
19
+ What you make with the tools is yours to use. You can use exported code, images, videos, and audio files in any personal or commercial application, website, or product, including paid ones. **You may not sell or redistribute the exports on their own, either individually or as the product itself, such as a sound, texture, background, or template pack.**
20
+
21
+ ## No Warranty
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
package/docs/usage.md CHANGED
@@ -68,7 +68,15 @@ SSH 插件不会向聊天标题栏添加按钮。右侧栏统一从左侧「远
68
68
 
69
69
  ## AI 工具
70
70
 
71
- | 工具 | 用途 |
71
+ 从 1.14.0 起,对模型只注册 **`ssh`** 一个入口。下面的名称是内部操作名,不再是独立的宿主工具。先 `ssh({"action":"list"})` 查看当前会话允许的操作,再 `ssh({"action":"describe","tool":"ssh_exec"})` 获取参数,最后调用:
72
+
73
+ ```json
74
+ {"action":"call","tool":"ssh_exec","arguments":{"profileId":"实际已授权主机 ID","command":"pwd"}}
75
+ ```
76
+
77
+ 发现和说明不授予权限;每次执行仍验证所属会话、主机、文件端点及终端/任务所有权,命令与文件传输审批保持原设置。临时授权同样从此入口查询和执行。已有对话提到旧工具名时,将其放入 `tool` 字段,不要直接调用。自定义 Agent 工具白名单若写死旧名称,需改为 `ssh`;这是工具接口变化,而非自动扩展会话权限。
78
+
79
+ | 操作 | 用途 |
72
80
  | --- | --- |
73
81
  | `ssh_list` | 只列出当前 DSH 会话已授权的连接 |
74
82
  | `ssh_set_cwd` | 设置并验证当前会话在指定主机上的工作目录 |
@@ -174,6 +182,16 @@ Device Flow 需要一个属于插件发布者的 GitHub OAuth App Client ID。Cl
174
182
 
175
183
  ## DSH 配置
176
184
 
185
+ ### 连接超时与终端复用
186
+
187
+ 在「远端 → 设置」调整默认 SSH 连接超时(1000–120000 ms,默认 15000)。主机编辑器可跟随默认或单独覆盖,未保存主机的测试连接也使用相同设置。旧主机的非 15000 ms 自定义值保留;旧默认值跟随设置。命令执行超时与连接超时相互独立,不限制交互终端总时长。代理拨号、每跳 SSH 握手/认证分别有界,并不是整条跳板链的总耗时限制。
188
+
189
+ 认证慢的服务器可以设为 60000 ms。已核验指纹后超时会提示认证阶段等待,建议同时检查远端 DNS/PAM;增加等待时间不能修复服务端延迟。
190
+
191
+ 「复用终端 SSH 连接」默认关闭。开启后,同一浏览器管理范围或同一 AI 会话、同一主机的终端共享底层 SSH 认证连接;每个终端仍是独立 shell 和输出,AI 会话之间不共享连接。空闲 30 秒回收,每条连接最多 8 个终端,池最多 32 条连接;服务端 MaxSessions 更低时可能拒绝新增通道。共享连接失效会影响该连接上的终端,不自动重放命令。
192
+
193
+ 关闭复用或修改主机、指纹、凭据、代理配置后,新终端不再复用旧连接;已有终端继续运行至主动关闭/自然退出。测试连接、一次性命令、文件传输和端口转发保持独立连接。复用开关和默认超时属于本机设置,不随 Gist 同步。
194
+
177
195
  安装包后,bundle 会插入默认配置:
178
196
 
179
197
  ```yaml
@@ -213,3 +231,12 @@ npm pack --pack-destination dist
213
231
  这种边界避免浏览器用户和模型同时争用同一个 TTY,也遵守 DSH 不允许跨 Agent 共享终端的所有权规则。
214
232
 
215
233
  会话授权模式会直接约束模型可见工具:选择「仅命令」时隐藏交互终端工具;选择「终端控制」时隐藏 `ssh_exec`,远端命令必须经 `ssh_terminal_open` / `ssh_terminal_send` 执行,因此输入和输出会显示在右侧 SSH 活动中。执行层会再次校验权限,不能通过直接调用绕过。
234
+
235
+
236
+ ## 配置文件备份与迁移
237
+
238
+ 在「设置 → 配置导入与导出」中操作,无需 GitHub 账号。导出时输入至少 8 位密码并再次确认,浏览器会下载 JSON 文件。文件整体加密,主机地址、密码和私钥都不会明文保存;请同时保管好文件与密码。最大文件大小为 1 MB。
239
+
240
+ 导入时选择本插件导出的文件、输入密码,先解密查看各类条目数量,再确认导入。所有条目都作为独立副本添加,保留现有配置与授权;分组会使用独立名称,跳板、代理、凭据和项目的引用指向本次导入的副本。重复导入会再次创建副本。若已开启自动同步,新增条目会按当前同步策略同步。
241
+
242
+ 范围包括 SSH、FTP/FTPS、固定项目目录、密钥库、代理库、分组代理、常用命令。不包含会话授权、端口转发、本机运行设置或 GitHub 授权。备份密码独立于 Gist 同步密码。
package/lib/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAGA,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":"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"}
package/lib/api.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { exportConfiguration, previewConfiguration, importConfiguration } from './config-backup.js';
1
2
  import { randomBytes } from 'node:crypto';
2
3
  import { uploadEndpointFile } from './endpoint-upload.js';
3
4
  import { DownloadProgressStore } from './download-progress.js';
@@ -91,6 +92,19 @@ async function dispatch(req, res, prefix, runtime) {
91
92
  }
92
93
  if (method === 'GET' && segments[0] === 'health')
93
94
  return sendJson(res, 200, { ok: true, service: 'dsh-ssh', schemaVersion: 5 });
95
+ if (segments[0] === 'config-backup' && segments.length === 2 && method === 'POST') {
96
+ requireMutationHeader(req);
97
+ res.setHeader('Cache-Control', 'no-store');
98
+ const input = await readObject(req, 2_097_152);
99
+ if (segments[1] === 'export')
100
+ return sendJson(res, 200, { content: await runtime.gistSync.withConfigurationTransfer(() => exportConfiguration(runtime.store, runtime.credentials, input.passphrase)) });
101
+ if (segments[1] === 'preview')
102
+ return sendJson(res, 200, await previewConfiguration(input.content, input.passphrase));
103
+ if (segments[1] === 'import') {
104
+ await runtime.gistSync.withConfigurationTransfer(() => importConfiguration(runtime.store, runtime.credentials, input.content, input.passphrase));
105
+ return sendJson(res, 200, { ok: true });
106
+ }
107
+ }
94
108
  if (segments[0] === 'gist-sync') {
95
109
  if (segments.length === 1 && method === 'GET')
96
110
  return sendJson(res, 200, await runtime.gistSync.view());
@@ -102,6 +116,10 @@ async function dispatch(req, res, prefix, runtime) {
102
116
  requireMutationHeader(req);
103
117
  return sendJson(res, 200, await runtime.gistSync.testConnection());
104
118
  }
119
+ if (segments[1] === 'account' && segments[2] === 'test' && segments.length === 3 && method === 'POST') {
120
+ requireMutationHeader(req);
121
+ return sendJson(res, 200, await runtime.gistSync.testConnection(true));
122
+ }
105
123
  if (segments[1] === 'network' && segments[2] === 'test' && segments.length === 3 && method === 'POST') {
106
124
  requireMutationHeader(req);
107
125
  return sendJson(res, 200, await runtime.gistSync.testNetwork());
@@ -917,9 +935,13 @@ async function dispatch(req, res, prefix, runtime) {
917
935
  if (method === 'PUT') {
918
936
  requireMutationHeader(req);
919
937
  const body = await readObject(req);
938
+ if (body.reuseTerminalConnections !== undefined && typeof body.reuseTerminalConnections !== 'boolean')
939
+ throw Object.assign(new Error('reuseTerminalConnections must be boolean'), { status: 400 });
920
940
  const settings = {
921
941
  defaultSessionPermission: runtime.store.settings().defaultSessionPermission ?? 'exec',
922
942
  defaultRequireCommandApproval: runtime.store.settings().defaultRequireCommandApproval ?? true,
943
+ defaultConnectTimeoutMs: requireInteger(body.defaultConnectTimeoutMs ?? runtime.store.settings().defaultConnectTimeoutMs ?? 15_000, 'defaultConnectTimeoutMs', 1000, 120_000),
944
+ reuseTerminalConnections: body.reuseTerminalConnections ?? runtime.store.settings().reuseTerminalConnections ?? false,
923
945
  allowPublicBind: body.allowPublicBind === true,
924
946
  defaultCommandTimeoutMs: requireInteger(body.defaultCommandTimeoutMs, 'defaultCommandTimeoutMs', 1000, 300_000),
925
947
  maxOutputChars: requireInteger(body.maxOutputChars, 'maxOutputChars', 1000, 1_000_000),