@hyzyn/dsh-tty 0.10.3 → 0.12.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/README.md +55 -2
- package/client.js +1852 -38
- package/lib/index.d.ts +11 -0
- package/lib/index.js +156 -8
- package/lib/index.js.map +1 -1
- package/lib/probe.d.ts +42 -0
- package/lib/probe.js +274 -0
- package/lib/probe.js.map +1 -0
- package/lib/sftp.d.ts +52 -2
- package/lib/sftp.js +197 -12
- package/lib/sftp.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -21,7 +21,14 @@ xterm.js 全交互终端(node-pty 真实 PTY,WebGL 渲染器加速),支
|
|
|
21
21
|
面板头部压缩为「标签行 + SSH 连接栏」两行;0.10.0 起支持**会话持久化
|
|
22
22
|
(tmux)**——「持久终端」标签由 tmux server(专用 socket)托管,断线保活
|
|
23
23
|
超时、甚至宿主重启后重开标签即按名接回原现场(正在跑的程序原样存活),
|
|
24
|
-
SSH 侧同理(远程 tmux
|
|
24
|
+
SSH 侧同理(远程 tmux);0.12.0 起做了一轮**界面视觉 overhaul**——样式表
|
|
25
|
+
独立成 `client-src/tty.css` 并引入 `--tt-*` 令牌层(圆角/控件高度/间距/
|
|
26
|
+
动效统一,颜色全部派生自 DSH 皮肤 token,明暗主题自动跟随)、图标全面矢量
|
|
27
|
+
化、遮罩/toast/SFTP/连接栏等交互面重排,并新增 `pnpm preview` 截图回归
|
|
28
|
+
工具(见「开发」);0.11.0 起支持 **SSH 连接测试**——设置卡片连接簿
|
|
29
|
+
条目行内「测试」与 SSH 连接对话框「试连」,按 TCP → 主机密钥(TOFU)→
|
|
30
|
+
认证 逐段诊断连接(见下文 SSH 连接);SFTP 传输增加**可视化进度条**
|
|
31
|
+
(上传/下载百分比,服务端直传为不定进度脉冲,见下文 SFTP)。
|
|
25
32
|
|
|
26
33
|

|
|
27
34
|
|
|
@@ -148,6 +155,17 @@ subsystem,宿主半体 `src/sftp.ts`):
|
|
|
148
155
|
用 mkdir parents 逐级补齐)、**下载**(POST → 浏览器 Blob
|
|
149
156
|
→ `<a download>`)、**新建目录**、**重命名**(行内编辑器)、**删除**
|
|
150
157
|
(🗑 二次点击确认,目录带 `recursive` 整目录删除);
|
|
158
|
+
- **传输进度条(0.11.0)**:底部状态行右侧新增细进度条 + 百分比——上传按
|
|
159
|
+
XHR 流式进度(多文件带 `i/n · 文件名` 标签);下载改为流式读
|
|
160
|
+
`response.body`,按响应 `content-length` 实时算百分比(无长度时降级为已传
|
|
161
|
+
字节文本);
|
|
162
|
+
- **取消传输(0.12.0)**:进度条右侧 ✕——**上传**中断在途 XHR(批次里剩余
|
|
163
|
+
文件一并跳过);**下载**用 `AbortController` 打断流式读取;**双栏 ⇨/⇦
|
|
164
|
+
直传**改为服务端任务化(start 返回 jobId → 400ms 轮询真实字节进度 → ✕ 打
|
|
165
|
+
cancel 中止),不再是一个打不断的同步 HTTP 请求。取消后**半截文件自动
|
|
166
|
+
删除**(上传的远端残留文件 / 下载的本机残留文件;清理失败只记日志),状态行
|
|
167
|
+
走「已取消」而非红色失败态;关闭文件浏览对话框也会收掉在途传输,不留
|
|
168
|
+
「看不见但还在写远端」的后台搬运;
|
|
151
169
|
- **连接管理**:懒连接池——首次操作才建 SSH 连接,空闲 120 秒自动回收,
|
|
152
170
|
断开后下次操作自动重连;连接簿条目在每次(重)连接时实时解析(改密码
|
|
153
171
|
后自动用新凭证);TOFU 与终端会话/隧道共用同一份 `hostKeys` 钉扎,指纹
|
|
@@ -262,6 +280,15 @@ tmux server(专用 socket `dsh-tty`,与用户自己的 tmux 完全隔离)
|
|
|
262
280
|
导入」(0.4.1)**:一键解析 `~/.ssh/known_hosts` 把已有主机指纹批量
|
|
263
281
|
预填充(连接簿里的主机名还会用于还原 `|1|` hashed 条目,非默认端口按
|
|
264
282
|
`[host]:port` 解析);
|
|
283
|
+
- **连接测试(0.11.0)**:设置卡片连接簿条目行内「测试」按钮,SSH 连接
|
|
284
|
+
对话框另有「试连」按钮——两者都只做**链路诊断**(不建会话、不占
|
|
285
|
+
`maxSessions` 名额、不开 shell):先 TCP 预检(DNS + 建连,失败分类为
|
|
286
|
+
拒绝/超时/DNS/不可达),再 ssh2 握手做主机密钥 TOFU 比对,最后完成
|
|
287
|
+
认证。结果逐段展示:成功显示耗时与「主机密钥匹配 / 已记录」;失败给出
|
|
288
|
+
具体阶段原因(如「认证被拒绝:所有认证方式均失败」「主机密钥不匹配」
|
|
289
|
+
附已记录与本次指纹 + 重置指引)。**连接簿条目「测试」** 完整 TOFU:首测
|
|
290
|
+
即把新指纹记录进 `hostKeys`(与真实连接同语义);**对话框「试连」** 只
|
|
291
|
+
比对不落盘(草稿未入库不建立钉扎)。
|
|
265
292
|
- **计入 `maxSessions` 并发上限**;关断与本地会话一致:标签 ✕ / `kill`
|
|
266
293
|
帧关闭 ssh2 channel,`exit` 帧照常带回退出码 / 信号。
|
|
267
294
|
|
|
@@ -284,6 +311,7 @@ tmux server(专用 socket `dsh-tty`,与用户自己的 tmux 完全隔离)
|
|
|
284
311
|
| `sftpStyle` | `dialog` | SFTP 文件浏览界面风格:`dialog` 单窗体(远程目录 + 上传/下载/拖拽)/ `dual` 双栏(左本机 / 右远程,行内 `⇨/⇦` 宿主服务端直传);重新打开 SFTP 生效 |
|
|
285
312
|
| `persistence` | `off` | 会话持久化:`off` 会话随宿主生死(默认);`tmux` 开启后**所有新开的标签默认由 tmux server 托管**、可跨宿主重启恢复(需本机/远程安装 tmux);SSH 对话框可对单次连接取消 |
|
|
286
313
|
| `endOnPageClose` | `false` | 页面(最后一个连接)断开且保活期结束时,是否连 tmux 持久会话一起结束。默认 `false` = 留存可恢复;`true` = 页面关了就不保活(保活期内刷新仍可无缝接回) |
|
|
314
|
+
| `sftpLimits` | `{maxDownloadMb: 1024, maxUploadMb: 2048, maxUploadFiles: 1000}` | SFTP 传输限制(浏览器侧保护,均为 **0 = 不限**):`maxDownloadMb` 单文件下载上限(超限中止并提示用双栏 `⇦`/终端 scp)、`maxUploadMb` 单文件上传上限、`maxUploadFiles` 一次批量/拖拽上传的文件数上限;大文件请走双栏 `⇨/⇦` 服务端直传(字节不经过浏览器,不占内存) |
|
|
287
315
|
|
|
288
316
|
## 帧协议(/api/dsh-tty/ws,JSON 文本帧;v3 = 单连接多会话 + 断线重连)
|
|
289
317
|
|
|
@@ -322,11 +350,36 @@ pnpm --filter @hyzyn/dsh-tty integration # 集成测试:真实插件 × 真
|
|
|
322
350
|
pnpm --filter @hyzyn/dsh-tty live # 对运行中的 dsh web 做存活冒烟
|
|
323
351
|
pnpm --filter @hyzyn/dsh-tty tui # TUI 冒烟:vim/nano 全屏渲染
|
|
324
352
|
pnpm --filter @hyzyn/dsh-tty ssh-smoke # SSH 冒烟:内存 SSH server(ssh2.Server)× 真实 spawnSsh 端到端(需先 build)
|
|
353
|
+
pnpm --filter @hyzyn/dsh-tty preview # 视觉预览:headless Chrome 逐场景截图(见下)
|
|
325
354
|
```
|
|
326
355
|
|
|
327
|
-
浏览器半体源码在 `client-src/index.js
|
|
356
|
+
浏览器半体源码在 `client-src/index.js`,样式表独立成 `client-src/tty.css`(由
|
|
357
|
+
esbuild 的 text loader 内联进 `client.js`)。构建产物 `client.js`(含 xterm 内核),
|
|
328
358
|
改客户端后需重新 `pnpm build` 并刷新页面(可能需硬刷新)。
|
|
329
359
|
|
|
360
|
+
### 视觉预览 / 截图回归(`scripts/preview.mjs`)
|
|
361
|
+
|
|
362
|
+
改样式不该靠「刷新页面看一眼」:脚本把 `client.js` 装进一个纯静态夹具页
|
|
363
|
+
(`scripts/preview/harness.html` + `mock-host.js` 伪造的 DSH 宿主:module
|
|
364
|
+
loader / fetch / WebSocket),用 headless Chrome 把 14 个界面状态逐个渲染并
|
|
365
|
+
截图到 `packages/tty/.preview/shots/`:
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
node scripts/preview.mjs # 全场景
|
|
369
|
+
node scripts/preview.mjs local menu ssh # 指定场景
|
|
370
|
+
node scripts/preview.mjs --list # 列出场景
|
|
371
|
+
node scripts/preview.mjs --theme=light # 浅色主题
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
覆盖:本地终端 / 多标签 + SSH 连接栏 / 「+」菜单 / SSH 对话框(新建、编辑)/
|
|
375
|
+
设置卡片 / SFTP(单窗体、双栏)/ 最小化徽标 / 退出与错误遮罩 / 隧道弹层 /
|
|
376
|
+
搜索框 / toast。夹具还会把 `--dsw-*` 皮肤变量与真实界面一并渲染,因此能验
|
|
377
|
+
「明暗主题切换后是否还有白色面板」这类问题。产物目录 `.preview/` 已 gitignore。
|
|
378
|
+
|
|
379
|
+
> 夹具需要 Chrome/Chromium(默认找 playwright 缓存的 Chrome for Testing,
|
|
380
|
+
> 也可用 `CHROME_PATH` 指定)。若宿主环境限制了 Chrome 的沙箱(子进程被
|
|
381
|
+
> 拒),需要放开后运行,否则浏览器起不来。
|
|
382
|
+
|
|
330
383
|
## 已知限制
|
|
331
384
|
|
|
332
385
|
- **resize 为内部耦合**:DSH 的 `spawnTerminal` handle 未暴露 resize,
|