7.9 KiB
7.9 KiB
hatty 核心特性深度调研:串口、SSH 与 Block 式交互架构
本文档记录了关于 串口通信(Serial Port)、SSH 远程主机连接 以及 Block 式终端交互(块状卡片交互) 的技术可行性、底层原理、业界主流实现及在 hatty 终端中的落地路线。
1. 串口(Serial Port)与 SSH 会话架构调研
1.1 核心结论
当前基于 Node.js (Electron) + xterm.js 的架构,不仅完全支持串口与 SSH,而且相比纯 C/Rust 原生终端,在实现复杂度、生态成熟度以及跨平台支持上具备明显优势。
xterm.js 本质上是标准 ANSI/VT100 字符流渲染器,它与底层传输媒介完全解耦,只需实现统一的 Session 接口,即可无缝承载多种数据流。
┌────────────────────────────────────────────────────────┐
│ 统一前端界面 (hatty) │
│ 多标签页 / 分屏树 / WebGL 硬件加速 / 状态栏 │
└───────────────────────────▲────────────────────────────┘
│ 统一 IPC 字符流 (data, write, resize)
┌───────────────────────────▼────────────────────────────┐
│ 会话调度抽象层 (Session Manager) │
├───────────────────┬────────────────────┬───────────────┤
│ 1. 本地 PTY 会话 │ 2. 远程 SSH 会话 │ 3. 硬件串口会话│
│ (node-pty) │ (ssh2) │ (serialport) │
└───────────────────┴────────────────────┴───────────────┘
1.2 硬件串口支持方案(Serial Port / COM / /dev/ttyUSB*)
- 核心依赖:Node.js 原生模块
serialport(跨平台支持 Linux、macOS、Windows)。 - 关键能力:
- 设备自动枚举与热插拔:调用
SerialPort.list()自动枚举/dev/ttyUSB0、/dev/ttyACM0等设备及其硬件 VID/PID。 - 波特率与通信参数配置:支持常见波特率(
9600、115200、921600、1500000等)、数据位、停止位与奇偶校验。 - 数据管道流式打通:
- 串口接收数据直接通过 IPC 推送至
xterm.write(data); - 终端按键输入通过
port.write(data)写入串口硬件。
- 串口接收数据直接通过 IPC 推送至
- 设备自动枚举与热插拔:调用
- 应用场景:单片机调试(STM32 / ESP32 / Arduino)、嵌入式 Linux 开发板(U-Boot 启动日志、Kernel Console)、路由器网络设备运维。
1.3 远程 SSH 会话支持方案
- 两种落地形式:
- 基础命令行模式:借助本地 PTY,直接在终端中敲入
ssh user@host即可使用(当前开箱即用)。 - 集成式主机管理器(类似 Termius / Tabby):
- 引入
ssh2纯 JS/Node 驱动库。 - 主机簿管理:保存 IP、端口、用户名、私钥/密码、跳板机(ProxyJump)配置。
- 断线自动重连。
- 集成 SFTP 传输:侧边栏可视化浏览远程文件系统,支持文件直接拖拽上传/下载。
- 引入
- 基础命令行模式:借助本地 PTY,直接在终端中敲入
2. Block 式终端交互(块状终端)深度调研
2.1 传统流式终端 vs. Block 式现代终端
| 维度 | 传统流式终端 (Stream-based) | Block 式现代终端 (Block-based) |
|---|---|---|
| 本质模型 | 无状态的 2D 字符网格,纯文本覆盖更新 | 结构化对象列表,每个命令为一个独立封闭卡片 |
| 命令边界 | 终端不知道命令从哪一行开始、哪一行结束 | 严格识别命令起止行、输出区域与退出状态 |
| 状态感知 | 无法感知上一条命令的耗时和执行结果 | 精准显示执行耗时(如 ⏱ 120ms)与退出码(✔ 0 / ✘ 127) |
| 交互能力 | 只能靠鼠标手动拖选文本,容易误选提示符 | 一键复制该命令输出、重新运行、折叠输出、AI 诊断 |
| 代表产品 | Alacritty, Kitty, GNOME Terminal | Warp, Wave Terminal |
2.2 核心底层技术机制
A. 语义转义序列(OSC 133 / FTCS 协议)
行业公认的标准协议(FinalTerm 规范,现为 iTerm2、VS Code、Warp 采纳)。通过 Shell 钩子向 PTY 输出不可见的 ANSI 控制序列标记生命周期:
ESC ] 133 ; A ST:提示符开始(Prompt Start)ESC ] 133 ; B ST:命令输入开始(Command Start)ESC ] 133 ; C ST:输出开始(Output Start / Executed)ESC ] 133 ; D [; exitcode] ST:输出结束(Command Finished),携带命令真实退出码。
B. Shell 钩子自动注入(Shell Hooks)
在终端启动子进程时,通过环境变量或临时脚本注入:
- Bash:配置
PROMPT_COMMAND与trap ... DEBUG。 - Zsh:配置
preexec()(捕获命令字符串)与precmd()(捕获$?状态)。 - Fish:注册
fish_prompt与fish_preexec事件。
C. 输入区与输出区解耦(Detached Input Editor)
- 传统终端中,输入框与文字网格混杂在一起;
- 现代 Block 终端将屏幕底部的输入框做成独立的现代富文本编辑器(支持多行缩进、鼠标定位光标、语法高亮、Tab 智能补全);
- 用户按回车后,将输入内容打包推入上方的 Block 历史卡片流中。
D. 全屏 TUI 程序平滑退避(Fallback)
- 当检测到进入备用屏幕序列(
\x1b[?1049h,如运行vim、htop、less)时,自动退出 Block 卡片流模式,无缝切入标准 2D 终端网格; - 退出全屏程序时(
\x1b[?1049l),自动切回 Block 交互。
3. 业界代表产品与技术路线
- Warp(商业闭源标杆):
- 技术栈:Rust + 自研 GPU UI 渲染引擎。
- 特色:Block 块式交互开创者,卡片式展示,内置 Warp AI 可直接读取当前 Block 的错误日志进行诊断。
- Wave Terminal(开源代表,Apache 2.0):
- 技术栈:Electron + xterm.js + Go(与
hatty技术栈高度契合)。 - 特色:卡片不仅能展示命令输出,还能在 Block 内部内嵌网页渲染、Markdown 预览、代码编辑器与图像。
- 技术栈:Electron + xterm.js + Go(与
- VS Code 终端 Shell Integration(轻量级标杆):
- 技术栈:TypeScript + xterm.js。
- 特色:轻量接入 OSC 133,在滚动条上标记红/蓝状态圆点,支持命令导航与快捷复制输出。
4. hatty 落地实施路线规划
阶段一:轻量级 Block 标记与浮动操作栏(推荐 MVP 方案)
- 在
pty-manager.cjs中为 Bash/Zsh 注入 20 行极简 Shell 钩子脚本(输出 OSC 133 信号)。 - 在
terminal-view.js中使用xterm.parser.registerOscHandler(133, ...)捕获命令起止行与退出码。 - 当鼠标悬停在对应命令输出区域时,浮现微交互操作栏:
- 📋 复制命令 / 📑 只复制命令输出
- ⏱ 命令执行耗时(如
142ms) - 🟢/🔴 执行状态徽章(
0/1) - 🤖 AI 解释报错按钮
阶段二:全功能卡片式 Block 与独立输入栏(进阶重构方案)
- 界面转变为由卡片流(
div.block-card)构成的滚动容器。 - 底部提供常驻的独立现代输入框,具备语法高亮与多行编辑。
- 动态检测
Alt Screen,在运行vim/htop时自适应无缝切换。
阶段三:多源会话管理器(串口 + SSH)
- 抽象
SessionManager,提供统一的输入输出管道。 - 接入
serialport模块,新增“硬件串口调试”标签页。 - 接入
ssh2模块,新增“SSH 主机管理与 SFTP”支持。