简介
OxideTerm 是一款跨平台 SSH 终端客户端和本地终端模拟器,将原生性能与现代界面完美结合。基于 Tauri 2.0(Rust 后端)和 React 19(TypeScript 前端)构建,生成 25–40 MB 的轻量级原生二进制文件,无 Electron 开销。
为什么选择 OxideTerm?
Section titled “为什么选择 OxideTerm?”| 痛点 | OxideTerm 的解决方案 |
|---|---|
| SSH 客户端无法做本地 Shell | 混合引擎:本地 PTY(zsh/bash/fish/pwsh/WSL2)+ 远程 SSH 同窗运行 |
| 断线重连 = 丢失一切 | 优雅期重连:断线前先探测旧连接 30 秒——你的 vim/htop/yazi 可以幸存 |
| 远程文件编辑需要 VS Code Remote | 内置 IDE:CodeMirror 6 基于 SFTP,30+ 语言,可选约 1 MB 远程 Agent |
| SSH 连接无法复用 | 连接复用:终端、SFTP、转发、IDE 共享一个 SSH 连接,引用计数连接池 |
| SSH 库依赖 OpenSSL | russh 0.54:纯 Rust SSH,编译链接 ring——零 C 依赖 |
| 100+ MB 的 Electron 应用 | Tauri 2.0:原生 Rust 后端,25–40 MB 二进制 |
| AI 被锁定在单一供应商 | OxideSens:40+ 工具、MCP 协议、RAG 知识库——兼容 OpenAI/Ollama/DeepSeek/任意兼容 API |
OxideTerm 采用 双平面架构,将低延迟的终端 I/O 与管理命令分离:
┌─────────────────────────────────────┐│ 前端 (React 19) ││ xterm.js 6 (WebGL) + 18 stores │└──────────┬──────────────┬───────────┘ │ Tauri IPC │ WebSocket(二进制) │ (JSON) │ 每会话独立端口┌──────────▼──────────────▼───────────┐│ 后端 (Rust) ││ NodeRouter → SshConnectionRegistry ││ Wire Protocol v1 ││ [Type:1][Length:4][Payload:n] │└─────────────────────────────────────┘| 平面 | 传输方式 | 用途 |
|---|---|---|
| 数据平面 | WebSocket(二进制) | 终端 I/O — Type-Length-Payload 帧格式,无 JSON/Base64,热路径零开销 |
| 控制平面 | Tauri IPC(JSON) | 管理操作:连接、SFTP、端口转发、配置、AI 聊天 |
每个 SSH 会话拥有独立的 WebSocket 端口,首帧即进行一次性、有时限的令牌认证。前端通过 nodeId 寻址所有资源——后端 NodeRouter 原子解析,因此 SSH 重连(底层 connectionId 变更)不会破坏 SFTP、IDE 或端口转发。
| 层次 | 技术 | 说明 |
|---|---|---|
| 框架 | Tauri 2.0 | 原生二进制,25–40 MB |
| 运行时 | Tokio + DashMap 6 | 全异步,无锁并发映射 |
| SSH | russh 0.54 (ring) | 纯 Rust,零 C 依赖,SSH Agent |
| 本地 PTY | portable-pty 0.8 | 功能门控,Windows 使用 ConPTY |
| 前端 | React 19.1 + TypeScript 5.8 | Vite 7, Tailwind CSS 4 |
| 状态管理 | Zustand 5 | 18 个专用 Store |
| 终端 | xterm.js 6 + WebGL | GPU 加速,60 fps+ |
| 编辑器 | CodeMirror 6 | 30+ 语言模式 |
| 加密 | ChaCha20-Poly1305 + Argon2id | AEAD + 内存硬化 KDF(256 MB) |
| 存储 | redb 2.1 | 嵌入式键值数据库 |
| 国际化 | i18next 25 | 11 种语言 × 22 个命名空间 |
| 插件 | ESM 运行时 | 冻结 PluginContext + 24 UI Kit |
| CLI | JSON-RPC 2.0 | Unix Socket / Named Pipe |
| 类别 | 功能 |
|---|---|
| 终端 | 本地 PTY(zsh/bash/fish/pwsh/WSL2)、SSH 远程、分屏、广播输入、会话录制/回放(asciicast v2)、自适应渲染(120 Hz+ 加速 / 60 Hz 正常 / 1–15 Hz 空闲)、命令面板(⌘K)、禅模式、30+ 主题 + 自定义编辑器 |
| SSH 与认证 | 连接池与复用、ProxyJump(无限跳数)+ 拓扑图、优雅期自动重连。认证:密码、SSH 密钥(RSA/Ed25519/ECDSA)、SSH Agent、证书、键盘交互 2FA、Known Hosts TOFU |
| SFTP | 双面板浏览器、拖放、智能预览(图片/视频/音频/代码/PDF/Hex/字体)、传输队列 + 进度 & ETA、书签、压缩包解压 |
| IDE 模式 | CodeMirror 6,30+ 语言,文件树 + Git 状态,LRU 多标签管理,冲突解决(mtime 锁定),集成终端。可选远程 Agent(10+ 架构) |
| 端口转发 | 本地 (-L)、远程 (-R)、动态 SOCKS5 (-D),无锁消息传递 I/O,重连自动恢复,死亡报告,智能远程端口检测 |
| AI (OxideSens) | 内联面板(⌘I)+ 侧边栏聊天,终端缓冲区捕获(单/全面板),多源上下文(IDE/SFTP/Git),40+ 自主工具,MCP 服务集成,RAG 知识库(BM25 + 向量混合搜索),流式 SSE |
| 插件 | 运行时 ESM 加载,18 个 API 命名空间,24 个 UI Kit 组件,冻结 API + Proxy ACL,熔断器,错误自动禁用 |
| CLI | oxt 伴侣工具:JSON-RPC 2.0,Unix Socket / Named Pipe |
| 安全 | .oxide 加密导出(ChaCha20-Poly1305 + Argon2id 256 MB)、OS 钥匙串、Touch ID(macOS)、主机密钥 TOFU、zeroize 内存清除 |
| 国际化 | 11 种语言:EN、简体中文、繁體中文、日本語、한국어、FR、DE、ES、IT、PT-BR、VI |
SSH 连接池
Section titled “SSH 连接池”OxideTerm 使用基于 DashMap 的引用计数 SshConnectionRegistry,提供无锁并发访问:
- 一个连接,多个消费者 — 终端、SFTP、端口转发和 IDE 共享一个物理 SSH 连接——无冗余 TCP 握手
- 每连接状态机 —
connecting → active → idle → link_down → reconnecting - 生命周期管理 — 可配置空闲超时(5m / 15m / 30m / 1h / 永不),15 秒 keepalive 间隔,心跳失败检测
- 级联传播 — 跳板机故障 → 所有下游节点自动标记为
link_down并同步状态
18 个 Zustand Store
Section titled “18 个 Zustand Store”前端通过 18 个专用 Zustand Store 管理状态:
| Store | 职责 |
|---|---|
sessionTreeStore | 用户意图(会话树结构、连接流程) |
appStore | 连接状态事实(connections Map,后端状态镜像) |
localTerminalStore | 本地 PTY 生命周期 |
ideStore | IDE 模式状态 |
reconnectOrchestratorStore | 自动重连流水线编排 |
transferStore | SFTP 传输队列 |
pluginStore | 插件运行时状态 |
profilerStore | 资源分析器 |
aiChatStore | OxideSens AI 聊天状态 |
agentStore | 远程 Agent 管理 |
ragStore | RAG 知识搜索状态 |
settingsStore | 应用设置 |
broadcastStore | 广播输入到多个终端面板 |
commandPaletteStore | 命令面板状态 |
eventLogStore | 连接生命周期事件日志 |
launcherStore | 平台应用启动器 |
recordingStore | 会话录制与回放 |
updateStore | 自动更新生命周期 |