# RSSH 最有特色的不是"SSH 连接管理"，而是把普通终端数据流变成可操作的结构化工作台

## 别再拿"连接管理"比了

打开任何 SSH 客户端的对比页面，看到的都是一样的清单：

- 多协议支持（SSH / Mosh / Telnet）
- 跳板机 / ProxyJump
- 密钥同步
- 团队共享
- 会话录制
- 多标签 / 分屏

这些都是 1990 年代解决完的问题。SSH 协议本身是 1995 年的，OpenSSH 1999 年的。

**"连接管理"是个红海。** Termius、Tabby、SecureCRT、Xshell、PuTTY、iTerm2 + ssh —— 谁都能列出来一份长得差不多的功能表。比来比去无非是 UI 漂不漂亮、价格收不收、跨不跨平台。

如果 rssh 只是又一个"漂亮的 SSH 连接管理器"，那它没什么意思 —— 这事不值得在 2025 年重做一遍。

## 但连上之后，字节流仍然是字节流

连上之后会发生什么？

```
本地客户端 ←———— byte stream ————→ 远程 shell
```

字节进来，渲染到屏幕上。字节出去，回到 shell stdin。**所有 SSH 客户端在"连上之后"做的事，就是把这条字节流摆在你面前。**

然后你开始干活：

- 你想找 5 分钟前那条 `tail -1000 prod.log` 的输出从哪儿开始 —— 滚轮往上滚
- 你想把这段错误堆栈贴到 Slack —— 复制下来粘过去，里面带一堆 ANSI 颜色码乱码
- 你想问 AI "这个 OOM 是什么原因" —— 切到浏览器，粘进 Chat 窗口，AI 看到 ANSI 重绘垃圾
- 你想知道"昨天下午我都跑了哪些命令" —— 翻 history，但 history 没有输出，scrollback 又翻不到那么久之前
- 你想把这条命令的输出收起来，先看下面那条 —— 没辙，只能继续滚屏

这些痛点和"连接管理"完全没关系。你已经"连上"了 —— 连接管理它的使命已经完成了。

**问题在于：连上之后那条字节流，仍然只是字节流。**

每个 SSH 客户端都假装看不到这件事。Termius 给你更漂亮的连接列表；Tabby 给你更多的主题；iTerm2 给你分屏 —— 但每个人都默认接受了"我面前是一条字节流，我自己用眼睛和滚轮处理它"。

## RSSH 的赌注：把字节流变成对象

rssh 押的是另一件事：

> **"连接"是工具，"连上之后能干什么"才是产品。**

这条字节流不应该停留在"字节流"的抽象上。它应该被切成可操作的结构化单元 —— 然后你能选中、能复制、能折叠、能让 AI 处理、能审计。

这不是给 SSH 客户端加几个"功能"。这是换抽象。

### 字节流 → 命令块

每次按 Enter，rssh 在 `src/lib/terminal/command-blocks.ts` 里切一刀。每一刀之间的字节，被打包成 `CommandBlock` 对象：

```ts
interface CommandBlock {
  id: number;
  color: string;
  start: IMarker;   // xterm.js 内部行追踪对象
  end: IMarker | null;
}
```

整个文件 117 行。规则一句话：**Enter 一刀切，切完每段一个对象。**

不用在服务器上装 shell 集成（zsh hook、bash PROMPT_COMMAND 那一类）。第一次连上别人的堡垒机、别人的 k8s pod、别人的 Docker 容器，立刻就有色条 —— 因为这一刀不在远端切，在本地 xterm.js 数据流上切。

色条是这把刀最浅的可视化 —— 它告诉你"块"这个对象的存在。但色条不是重点，**这个对象本身才是。**

### 一旦有了对象，UI 变成工作台

把对象点出来：

| 在字节流抽象里 | 在块对象抽象里 |
|---|---|
| 找上一条命令的输出 → 滚轮 + 眼睛 | 点色条 |
| 复制带 ANSI 的乱码 → 手动清理 | "复制为纯文本" / "复制为图片" |
| 折叠输出 → 做不到 | buffer splice，真的抽走（`folds.ts` 304 行）|
| 问 AI 关于一条命令 → 网页里粘字节 | LLM 工具直接取这条命令的脱敏输出 |
| 审计某条命令 → 翻 scrollback / shell history | 块级审计记录 |

UI 不再是"展示字节流的窗口"，是"操作命令对象的工作台"。

右键点击色条弹一个菜单 —— 折叠、复制为文本、复制为图片。每一条都是对"这个块"的操作。这是工作台该有的样子：**对象 + 对该对象的操作。**

Excel 是工作台 —— 单元格是对象。Photoshop 是工作台 —— 图层是对象。VS Code 是工作台 —— 文件 / 符号是对象。

终端 40 年来都不是工作台 —— 因为它的"对象"被默认成了字节。

### AI 是工作台的自然消费者

LLM 是 rssh 在工作台之上挂的第一个"自动化用户"。

`src-tauri/src/ai/session.rs` 的执行模型：

```
LLM 决定跑 `top -bn1`
  ↓
rssh 生成 sentinel uuid
  ↓
把 `top -bn1; echo "<sentinel>:$?"` 粘到活动终端
  ↓
前端监听字节流找 sentinel
  ↓
sentinel 之前的字节 = 这条命令的块
  ↓
脱敏 + 截断 + 推回 LLM
```

LLM 不需要看字节流。它看到的就是工作台的对象：**一条命令的退出码、一段已脱敏的输出。**

人和 LLM 看到的是同一个对象。审计日志里记的也是同一个对象。脱敏在这个对象的边界上一次性完成（`src-tauri/src/ai/sanitize.rs`），不是字节级 hook，不是事后日志过滤。

**LLM 是工作台的第一个非人类用户。** 别人是 SSH 客户端 + AI Chat 是两个东西，中间用户当搬运工；rssh 是 AI 在工作台里和你共用同一组对象。

### 工作台 vs 终端

定义一下，免得滑回功能列表：

- **终端（terminal）**：显示字节流的窗口。输入字节、输出字节，是 SSH 协议的视觉端点。
- **工作台（workbench）**：操作结构化对象的界面。对象之上可挂操作、可挂自动化、可挂审计。

按这个定义：

- iTerm2 + ssh = 终端
- Termius = 漂亮的终端 + 漂亮的连接管理
- Warp = 工作台（代价：要侵入服务器装 shell 集成）
- **rssh = 工作台（不侵入服务器）**

这才是 rssh 真正区别于同类产品的地方。不是"我支持 Mosh"，不是"我的密钥同步是端到端加密"，不是"我有 Android 客户端" —— 这些都是连接管理类目下的事。

rssh 的赌注是：**连接管理已经做完了，工作台还没做。** SSH 客户端 40 年没有进化的方向，就在这里。

## 派生路径：工作台之上还能挂什么

一旦"块"是对象，下一步挂什么都顺理成章：

- **挂可视化** —— 色条（已有）
- **挂渲染器** —— 纯文本复制、PNG 复制（已有）
- **挂 buffer 操作** —— 折叠（已有）
- **挂自动化用户** —— AI 排障（已有）
- **挂审计** —— 块级日志（已有）
- 接下来还能挂什么？块标签 / 块搜索 / 块到 markdown / 块到 Jupyter cell / 块 → CI 复现脚本 ……

每一条都不是"再加一个功能"。每一条都是给这个对象再加一个消费者。

**这是工作台的复利。** 终端没有这个复利 —— 因为终端没有对象。

## 不必鼓吹连接管理

rssh 当然也做连接管理。host key 直接读写系统 `~/.ssh/known_hosts`（不自建数据库）、配置加密后推到你自己的 GitHub 私有仓库（不走 rssh 服务器，因为 rssh 没有服务器）、profile 在 GUI 和 CLI 共享一个 SQLite。

这些都是工程默认值。连接管理我不打算和谁比 —— 别人能做的我都做，做不到的也不构成 rssh 的卖点。

**rssh 的卖点是连上之后那条字节流的可操作性。** 工作台。这是过去 30 年 SSH 客户端集体跳过的题。

---

**一句话**：SSH 客户端 40 年都在比"怎么连上"，rssh 押的是"连上之后字节流值不值钱"。
