# ssh-terminal
**Repository Path**: mingjianyeying/ssh-terminal
## Basic Information
- **Project Name**: ssh-terminal
- **Description**: A modern cross-platform SSH client with session management and terminal emulation
- **Primary Language**: TypeScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: https://shenjianz.github.io/ssh-terminal/
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-02-25
- **Last Updated**: 2026-02-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SSH Terminal








一个基于 Tauri + React 的现代化 SSH 终端客户端应用,提供跨平台的 SSH 连接管理、AI 辅助、SFTP 文件管理等功能。
**[功能特性](#-特性)** • **[快速开始](#-快速开始)** • **[技术栈](#-技术栈)** • **[架构设计](#-架构设计)** • **[开发指南](#-开发指南)**
## 📸 应用截图


## 🚀 快速开始
### 环境要求
- **Node.js** 18+
- **pnpm** 10.14.0+
- **Rust** 1.70+
- **系统 SSH 客户端**(Windows 需要 Git Bash 或 WSL)
### 安装依赖
```bash
pnpm install
```
### 开发模式
启动开发服务器(同时运行前端和后端):
```bash
pnpm tauri dev
```
这将:
1. 启动 Vite 开发服务器(端口 1420)
2. 启动 Tauri 应用窗口
3. 启用热模块替换(HMR)
### 前端开发(仅开发前端)
```bash
pnpm dev
```
### 生产构建
构建生产版本:
```bash
pnpm tauri build
```
构建产物位于 `src-tauri/target/release/bundle/` 目录。
## 🐳 Docker 服务器部署
如果你需要部署 ssh-terminal-server(后端服务),可以使用 Docker 快速部署。
### 前置要求
- Docker 已安装
- 服务器可访问互联网(用于拉取镜像)
### 快速部署步骤
#### 1. 创建数据目录
```bash
# Linux
mkdir -p /data/ssh-terminal-server/data
chmod -R 755 /data/ssh-terminal-server
```
#### 2. 创建 Docker 网络
```bash
docker network create ssh-terminal-net
```
#### 3. 部署 Redis(如已安装可跳过)
```bash
docker run -d \
--name Redis7 \
--network ssh-terminal-net \
-p 6379:6379 \
redis:7 \
redis-server --requirepass your_password
```
> ⚠️ 请将 `your_password` 替换为强密码
#### 4. 部署 ssh-terminal-server
```bash
docker run -d \
--name ssh-terminal \
--restart unless-stopped \
-p 6236:3000 \
-e SERVER__HOST=0.0.0.0 \
-e SERVER__PORT=3000 \
-e DATABASE__TYPE=sqlite \
-e DATABASE__PATH=/data/app.db \
# ⚠️ 改成你的 Redis 容器名或地址
-e REDIS__HOST=Redis7 \
# ⚠️ Redis 端口(一般不用改)
-e REDIS__PORT=6379 \
# ⚠️ 改成你的 Redis 密码
-e REDIS__PASSWORD=your_password \
# ⚠️ 强烈建议改成你自己的随机密钥
-e AUTH__JWT_SECRET=9f7d3c365454dsfsasa8f28544b5e6d7a \
-e AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES=15 \
-e AUTH__REFRESH_TOKEN_EXPIRATION_DAYS=7 \
# ==================== 邮件配置(可选) ====================
# 是否启用邮件功能(用于发送验证码)
# - false: 不启用邮件验证
# - true: 启用邮件验证,用户注册时必须输入验证码
-e EMAIL__ENABLED=false \
# SMTP 服务器配置
-e EMAIL__SMTP_HOST=smtp.163.com \
-e EMAIL__SMTP_PORT=465 \
-e EMAIL__SMTP_USERNAME=your-email@163.com \
-e EMAIL__SMTP_PASSWORD=your-app-password \
# 发件人信息
-e EMAIL__FROM_NAME="SSH Terminal" \
-e EMAIL__FROM_EMAIL=your-email@163.com \
# Worker 配置(仅异步模式使用)
-e EMAIL__WORKER_POOL_SIZE=10 \
-e EMAIL__WORKER_TIMEOUT_SECONDS=10 \
# ⚠️ 本机持久化目录
-v /data/ssh-terminal-server/data:/data \
--network ssh-terminal-net \
registry.cn-hangzhou.aliyuncs.com/pull-image/ssh-terminal-server:latest
```
> ⚠️ **邮件配置提示**:
> - 对于 QQ/163 等邮箱,需要使用"授权码"而不是登录密码
> - 获取方式:邮箱设置 → 账户 → POP3/SMTP 服务 → 生成授权码
> - Gmail 需要启用"两步验证"并生成"应用专用密码"
> - 常用 SMTP 服务器:
> - 163邮箱: smtp.163.com, 端口 465 (SSL) 或 994 (SSL)
> - QQ邮箱: smtp.qq.com, 端口 465 (SSL) 或 587 (STARTTLS)
> - Gmail: smtp.gmail.com, 端口 587 (STARTTLS) 或 465 (SSL)
> - Outlook: smtp-mail.outlook.com, 端口 587 (STARTTLS)
### 环境变量说明
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `SERVER__HOST` | 服务器监听地址 | `0.0.0.0` |
| `SERVER__PORT` | 服务器监听端口 | `3000` |
| `DATABASE__TYPE` | 数据库类型 | `sqlite` |
| `DATABASE__PATH` | 数据库文件路径 | `/data/app.db` |
| `REDIS__HOST` | Redis 主机地址 | `localhost` |
| `REDIS__PORT` | Redis 端口 | `6379` |
| `REDIS__PASSWORD` | Redis 密码 | - |
| `AUTH__JWT_SECRET` | JWT 签名密钥 | - |
| `AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES` | 访问令牌过期时间(分钟) | `15` |
| `AUTH__REFRESH_TOKEN_EXPIRATION_DAYS` | 刷新令牌过期时间(天) | `7` |
| `EMAIL__ENABLED` | 是否启用邮件功能 | `false` |
| `EMAIL__SMTP_HOST` | SMTP 服务器地址 | - |
| `EMAIL__SMTP_PORT` | SMTP 服务器端口 | - |
| `EMAIL__SMTP_USERNAME` | SMTP 用户名 | - |
| `EMAIL__SMTP_PASSWORD` | SMTP 密码/授权码 | - |
| `EMAIL__FROM_NAME` | 发件人名称 | `SSH Terminal` |
| `EMAIL__FROM_EMAIL` | 发件人邮箱地址 | - |
| `EMAIL__WORKER_POOL_SIZE` | Worker 连接池大小 | `10` |
| `EMAIL__WORKER_TIMEOUT_SECONDS` | Worker 超时时间(秒) | `10` |
### 验证部署
第一次启动后,查看容器日志:
```bash
docker logs -f ssh-terminal
```
重点检查以下信息:
- ✅ `Redis 连接成功`
- ✅ `SQLite 初始化成功`
- ✅ `Server started`
执行健康检查:
```bash
curl http://localhost:6236/info
```
### 常用操作
#### 查看日志
```bash
docker logs -f ssh-terminal
```
#### 更新镜像
```bash
docker pull registry.cn-hangzhou.aliyuncs.com/pull-image/ssh-terminal-server:1.0.0
docker stop ssh-terminal
docker rm ssh-terminal
# 重新运行部署命令
```
## ✨ 特性
### 🖥️ 核心功能
- **多会话管理** - 支持同时管理多个 SSH 连接,使用标签页切换
- **终端模拟** - 基于 xterm.js 提供完整的终端模拟体验
- **会话持久化** - 保存 SSH 连接配置,方便快速重连
- **主题支持** - 支持 8 种终端主题(One Dark、Dracula、Nord、Tokyo Night、Monokai、GitHub Light、Solarized Light/Dark)
- **音效系统** - 操作反馈音效
- **主机密钥验证** - 自动检测并提示主机密钥确认
### 🔧 高级特性
- **心跳保活** - 可配置的心跳间隔(0-120秒)防止连接断开
- **会话分组** - 支持将会话按分组组织
- **快速连接** - 临时连接不保存配置
- **连接实例与配置分离** - 一个配置可以创建多个连接实例
- **加密存储** - 使用 AES-256-GCM 加密保存密码和密钥
- **快捷键系统** - 完整的快捷键绑定和自定义功能
- **russh 纯 Rust 后端** - 除了系统 SSH,还支持纯 Rust 实现的 SSH 客户端,提供更好的跨平台兼容性
- **本地数据库存储** - 使用 SQLite 存储会话配置、用户资料等数据
### ☁️ 云同步功能
- **多设备同步** - 支持在不同设备间同步 SSH 会话、用户资料等数据
- **增量同步** - 只同步变更的数据,提高同步效率
- **冲突检测与解决** - 自动检测数据冲突,提供多种解决策略(保留服务器、保留本地、保留两者)
- **自动同步** - 可配置的自动同步间隔
- **离线支持** - 本地数据持久化,离线时仍可正常使用
### 👤 用户认证
- **账号系统** - 支持用户注册、登录、登出
- **多账号切换** - 支持在多个账号间快速切换
- **Token 认证** - 基于 JWT 的安全认证机制(Access Token + Refresh Token)
- **本地匿名模式** - 未登录时可使用本地模式,数据仅保存在本地
- **用户资料管理** - 支持头像上传、用户信息编辑
- **账号删除** - 支持删除账号及相关数据
### 📹 视频录制系统
- **视频录制** - 使用 Canvas.captureStream 捕获终端画面
- 支持 WebM (VP9/VP8) 和 MP4 (H.264) 格式
- 三种质量预设:Low (500 kbps)、Medium (2 Mbps)、High (5 Mbps)
- 使用 WebGL 渲染器提高性能
- **音频录制** - 支持麦克风和扬声器同步录制
- 麦克风录制:单声道,48kHz 采样率,支持回声消除、噪声抑制
- 扬声器录制:Windows WASAPI Loopback Recording,2.0x 音量增益补偿
- **事件录制** - 记录所有终端交互事件(input/output/resize/metadata)
- **录制控制** - 支持 2 秒倒计时、暂停/恢复
- **录制管理** - 录制文件保存、加载、删除、导出
- **回放功能** - 基于事件的回放引擎,支持变速播放
### 🤖 AI 智能助手
- **自然语言转命令** - 用自然语言描述需求,AI 自动生成命令
- **命令解释** - 选中命令后 AI 提供详细解释和用法说明
- **错误分析** - AI 分析终端错误并提供解决方案
- **AI 对话界面** - 独立的 AI 聊天页面,支持多轮对话和历史记录
- **会话历史管理** - 按服务器分组管理 AI 对话历史
- **多 AI Provider 支持** - 支持 OpenAI、Ollama、Qwen、文心一言等多个 AI 服务商
- **AI 缓存池** - 智能 Provider 缓存和负载均衡
- **流式响应** - 支持 AI 流式输出,提升交互体验
### 📁 SFTP 文件管理
- **双面板文件浏览器** - 类似 WinSCP 的双面板界面
- **文件上传下载** - 支持文件和文件夹的传输
- **远程文件操作** - 支持删除、重命名、移动等操作
- **文件预览** - 支持文本文件预览
### 🎬 录制功能
- **终端录制** - 录制终端操作为视频
- **视频导出** - 支持多种格式导出(GIF、MP4、WebM)
- **录制管理** - 管理和回放录制内容
### 📱 跨平台支持
- **桌面端** - Windows、macOS、Linux
- **移动端适配** - 响应式设计,支持移动设备
- **触摸优化** - 移动端专门的交互优化
### 🔨 开发者工具(仅开发模式)
- **DOM to SVG** - 选择页面元素并导出为 SVG 矢量图形([使用文档](./docs/DOM_TO_SVG.md))
## 📚 文档
- **[快捷键列表](./docs/Shortcuts.md)** - 所有快捷键及其生效范围
- **[DOM to SVG 使用指南](./docs/DOM_TO_SVG.md)** - 开发者工具使用文档
## 🏗️ 技术栈
### 前端技术栈
- **React 19** - 最新的 React 版本,支持现代特性
- **TypeScript 5.8+** - 完整的类型安全支持
- **shadcn/ui** - 基于 Radix UI 的美观、可访问的 UI 组件库
- **Tailwind CSS 4.0** - 实用优先的 CSS 框架
- **Zustand** - 轻量级状态管理库
- **React Router 7** - 前端路由管理
- **xterm.js** - 终端模拟器核心库
- **React Hook Form + Zod** - 表单管理和验证
### 后端技术栈
- **Rust** - 高性能、安全的系统编程语言
- **Tauri 2.0** - 跨平台桌面应用框架
- **tokio** - 异步运行时
- **portable-pty** - 跨平台 PTY 支持
- **serde** - 序列化/反序列化
- **aes-gcm + argon2** - 加密存储
- **russh** - 纯 Rust SSH 实现
### 后端服务器技术栈 (ssh-terminal-server)
- **Rust** - 高性能后端开发语言
- **Axum 0.7** - 现代异步 Web 框架
- **SeaORM 1.1** - 异步 ORM 框架
- **Redis 0.27** - Refresh Token 缓存
- **JWT 9.x** - JSON Web Token 认证
- **Argon2 0.5** - 密码哈希算法
- **tracing** - 结构化日志框架
- **数据库支持** - SQLite / MySQL / PostgreSQL
### 开发工具
- **pnpm** - 快速、节省磁盘空间的包管理器
- **Vite** - 现代化的前端构建工具
- **ESLint** - 代码质量检查和格式化
### AI & 音频
- **OpenAI / Anthropic API** - AI 服务提供商
- **Web Audio API** - 音频录制和处理
- **Web Speech API** - 语音识别
### 其他依赖
- **axios** - HTTP 请求库
- **date-fns** - 日期处理
- **clsx / tailwind-merge** - CSS 类名工具
## 🏛️ 架构设计
### 整体架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Frontend (React 19) │
├─────────────────────────────────────────────────────────────────┤
│ Pages: │
│ Terminal | SessionManager | Settings | AIChatPage | SftpManager│
│ ↓ ↓ ↓ ↓ ↓ │
│ Components: │
│ Layout Session Settings AI SFTP │
│ (Sidebar, -QuickConnect -AI -Chat -DualPane │
│ TopBar) -SessionCard -Terminal -Command -FileList │
│ -EditDialog -Keybindings -History │
│ Terminal SSH Recording Mobile │
│ -TabBar -HostKey -Controls -MobileLayout │
│ -XTerm -Confirm -Export -SessionList │
│ -Status -Manager │
│ ↓ │
│ Store (Zustand): │
│ - sessionStore (会话管理) │
│ - terminalStore (终端实例管理) │
│ - terminalConfigStore (配置管理) │
│ - aiStore (AI 状态管理) │
│ ↓ │
│ Lib & Utils: │
│ - historyManager (AI 历史管理) │
│ - AudioCaptureManager (音频录制) │
│ - sounds (音效系统) │
└────────────────────────┬──────────────────────────────────────────┘
│ Tauri IPC Commands
↓
┌─────────────────────────────────────────────────────────────────┐
│ Backend (Rust + Tauri 2.0) │
├─────────────────────────────────────────────────────────────────┤
│ Commands Layer: │
│ - session.rs (会话管理命令) │
│ - terminal.rs (终端操作命令) │
│ - storage.rs (持久化命令) │
│ ↓ │
│ SSH Manager Layer: │
│ - SSHManager (管理 Session 和 Connection) │
│ ↓ │
│ SSH Backend Layer: │
│ - SSHBackend (抽象 trait) │
│ - SystemSSHBackend (系统 SSH 实现) │
│ - portable-pty (跨平台 PTY 支持) │
│ ↓ │
│ Storage Layer: │
│ - Storage (加密存储管理) │
│ - AES-256-GCM 加密 │
└─────────────────────────────────────────────────────────────────┘
↑
│ External APIs
↓
┌─────────────────────────────────────────────────────────────────┐
│ Backend Server (ssh-terminal-server) │
├─────────────────────────────────────────────────────────────────┤
│ API Endpoints: │
│ - POST /auth/register - 用户注册 │
│ - POST /auth/login - 用户登录 │
│ - POST /auth/refresh - 刷新 Token │
│ - GET /api/user/profile - 获取用户资料 │
│ - PUT /api/user/profile - 更新用户资料 │
│ - GET /api/ssh/sessions - 获取 SSH 会话列表 │
│ - POST /api/ssh/sessions - 创建 SSH 会话 │
│ - POST /api/sync - 数据同步 │
│ - POST /api/sync/resolve-conflict - 解决冲突 │
│ ↓ │
│ Services: │
│ - AuthService (认证服务) │
│ - SyncService (同步服务) │
│ ↓ │
│ Repositories: │
│ - UserRepository (用户数据访问) │
│ - UserProfileRepository (用户资料数据访问) │
│ - SshSessionRepository (SSH 会话数据访问) │
│ ↓ │
│ Storage: │
│ - SQLite/MySQL/PostgreSQL (数据库) │
│ - Redis (Refresh Token 缓存) │
└─────────────────────────────────────────────────────────────────┘
↑
│ External APIs
↓
┌─────────────────────────────────────────────────────────────────┐
│ External Services │
├─────────────────────────────────────────────────────────────────┤
│ - OpenAI API - Ollama API - Qwen API - Wenxin API │
│ - SSH Servers - SFTP Servers │
└─────────────────────────────────────────────────────────────────┘
### 认证流程
```
┌──────────────┐
│ 用户登录 │
└──────┬───────┘
↓
┌─────────────────────┐
│ POST /auth/login │
│ (邮箱 + 密码) │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 验证密码 (Argon2) │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 生成 Access Token │
│ (15分钟过期) │
│ 生成 Refresh Token │
│ (7天过期) │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ Refresh Token 存入 │
│ Redis Set │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 返回 Token 对 │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 后续请求携带 │
│ Access Token │
└─────────────────────┘
```
### 同步流程
```
┌──────────────┐
│ 手动/自动同步 │
└──────┬───────┘
↓
┌─────────────────────┐
│ POST /api/sync │
│ (携带 Access Token) │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 1. 检查用户状态 │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 2. 冲突检测 │
│ (对比 last_sync_at) │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 3. Push 阶段 │
│ - 上传用户资料 │
│ - 上传 SSH 会话 │
│ - 处理删除操作 │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 4. Pull 阶段 │
│ - 拉取更新的数据 │
│ - 增量同步 │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 5. 返回同步结果 │
│ - 更新的数据 │
│ - 冲突信息 │
└─────────────────────┘
```
### 数据流
#### SSH 连接流
```
用户操作 → React 组件 → Zustand Store → Tauri Command → SSH Manager → SSH Backend → SSH Server
↓ ↑
界面更新 ← Tauri Event (ssh-output-{id}) ← SSH Reader ← PTY ← SSH Process ←──────────┘
```
#### AI 交互流
```
用户输入 → AI 组件 → aiStore → API 调用 → AI Provider (OpenAI/Claude/...)
↓ ↑
界面更新 ← AI 响应 ← AI Provider ← HTTP 请求 ←─────────────────────────────────────┘
```
### 核心概念
1. **Session(会话配置)** - 保存的 SSH 连接配置,包含主机、端口、用户名等信息
2. **Connection(连接实例)** - 基于 Session 创建的实际连接,一个 Session 可以创建多个 Connection
3. **TerminalTab(终端标签页)** - 前端展示的终端标签,每个标签对应一个 Connection
4. **AI Conversation(AI 对话)** - AI 聊天会话,支持多轮对话和历史记录
5. **AI Provider(AI 服务商)** - 支持多个 AI 服务提供商,可配置和切换
### 数据库架构
#### 客户端本地数据库 (SQLite)
```
src-tauri/data/app.db
├── user_auth # 用户认证表
│ ├── id (PK)
│ ├── email # 邮箱
│ ├── password_hash # 密码哈希
│ ├── device_id # 设备ID(用于加密)
│ ├── created_at
│ └── deleted_at
│
├── ssh_sessions # SSH 会话表
│ ├── id (PK)
│ ├── user_id # 用户ID(关联 user_auth)
│ ├── name # 会话名称
│ ├── host # 主机地址
│ ├── port # 端口
│ ├── username # 用户名
│ ├── auth_method # 认证方式
│ ├── password_encrypted # 加密密码
│ ├── private_key_encrypted # 加密私钥
│ ├── group_name # 分组名称
│ ├── server_ver # 服务器版本号
│ ├── client_ver # 客户端版本号
│ ├── last_sync_at # 最后同步时间
│ ├── created_at
│ └── deleted_at
│
├── user_profiles # 用户资料表
│ ├── id (PK)
│ ├── user_id # 用户ID(关联 user_auth)
│ ├── username # 用户名
│ ├── bio # 简介
│ ├── avatar_base64 # 头像(Base64)
│ ├── phone # 电话
│ ├── qq # QQ号
│ ├── wechat # 微信号
│ ├── server_ver # 服务器版本号
│ ├── client_ver # 客户端版本号
│ ├── last_sync_at # 最后同步时间
│ ├── created_at
│ └── deleted_at
│
├── app_settings # 应用设置表
│ ├── id (PK)
│ ├── server_url # 服务器地址
│ ├── auto_sync_enabled # 自动同步开关
│ ├── sync_interval_minutes # 同步间隔
│ ├── language # 语言设置
│ └── updated_at
│
└── sync_state # 同步状态表
├── id (PK)
├── last_sync_at # 最后同步时间
├── pending_count # 待同步数量
└── conflict_count # 冲突数量
```
#### 服务器数据库 (SQLite/MySQL/PostgreSQL)
```
ssh-terminal-server 数据库
├── users # 用户表
│ ├── id (PK, 10位数字)
│ ├── email # 邮箱(唯一)
│ ├── password_hash # Argon2 密码哈希
│ ├── created_at
│ └── deleted_at
│
├── user_profiles # 用户资料表
│ ├── id (PK)
│ ├── user_id (FK → users.id)
│ ├── username # 用户名
│ ├── bio # 简介
│ ├── avatar_base64 # 头像
│ ├── phone # 电话
│ ├── qq # QQ号
│ ├── wechat # 微信号
│ ├── server_ver # 服务器版本号
│ ├── client_ver # 客户端版本号
│ ├── last_sync_at # 最后同步时间
│ ├── created_at
│ └── deleted_at
│
└── ssh_sessions # SSH 会话表
├── id (PK)
├── user_id (FK → users.id)
├── name # 会话名称
├── host # 主机地址
├── port # 端口
├── username # 用户名
├── auth_method # 认证方式
├── password_encrypted # 加密密码
├── private_key_encrypted # 加密私钥
├── passphrase_encrypted # 加密私钥密码
├── group_name # 分组名称
├── server_ver # 服务器版本号
├── client_ver # 客户端版本号
├── last_sync_at # 最后同步时间
├── created_at
└── deleted_at
```
### 数据同步策略
1. **版本控制** - 每条记录维护 `server_ver` 和 `client_ver` 两个版本号
2. **冲突检测** - 比较记录的 `updated_at` 和版本号判断冲突
3. **增量同步** - 只同步 `last_sync_at` 之后变更的数据
4. **软删除** - 使用 `deleted_at` 字段标记删除,支持数据恢复
## 🤖 AI 功能详解
### 支持的 AI Provider
- **OpenAI** - GPT-4、GPT-3.5 等模型
- **Ollama** - 本地大模型部署
- **Qwen (通义千问)** - 阿里云大模型服务
- **Wenxin (文心一言)** - 百度大模型服务
- **其他兼容 OpenAI API 的服务**
### AI 功能模块
1. **自然语言转命令 (NL to Command)**
- 在终端中按快捷键或点击按钮打开对话框
- 输入自然语言描述(如"查看当前目录下所有文件")
- AI 生成对应的 Shell 命令
- 可直接插入终端或复制到剪贴板
2. **命令解释器**
- 选中终端中的命令
- 调用 AI 解释命令的作用和参数
- 提供使用示例和注意事项
3. **错误分析器**
- 当终端出现错误时选中错误信息
- AI 分析错误原因
- 提供解决方案和修复建议
4. **AI 对话界面**
- 独立的全屏聊天界面
- 支持多轮对话和上下文理解
- 按服务器自动分组对话历史
- 支持语音输入
### AI 配置
在设置页面的 AI 标签中配置:
- 选择 AI Provider
- 输入 API Key
- 选择模型
- 调整参数(温度、最大 tokens 等)
## ⌨️ 快捷键系统
应用支持完整的快捷键绑定和自定义功能。
### 默认快捷键
| 功能 | Windows/Linux | macOS |
|------|---------------|-------|
| 新建连接 | `Ctrl+N` | `Cmd+N` |
| 关闭标签 | `Ctrl+W` | `Cmd+W` |
| 切换标签 | `Ctrl+Tab` | `Cmd+Tab` |
| 快速连接 | `Ctrl+Shift+K` | `Cmd+Shift+K` |
| 打开设置 | `Ctrl+,` | `Cmd+,` |
| NL 转命令 | `Ctrl+Shift+A` | `Cmd+Shift+A` |
| 复制 | `Ctrl+Shift+C` | `Cmd+Shift+C` |
| 粘贴 | `Ctrl+Shift+V` | `Cmd+Shift+V` |
> 查看完整快捷键列表:[快捷键文档](./docs/Shortcuts.md)
### 自定义快捷键
1. 打开设置页面
2. 进入"快捷键"标签
3. 点击快捷键项右侧的编辑按钮
4. 按下新的快捷键组合
5. 点击保存
## 🎬 录制功能详解
### 录制架构
```
用户点击录制
↓
2 秒倒计时
↓
┌─────────────────────┐
│ 1. TerminalRecorder │ - 记录终端事件
│ (input/output) │
├─────────────────────┤
│ 2. VideoRecorder │ - 捕获 Canvas 画面
│ canvas.captureStream(30) │
│ MediaRecorder (WebM/MP4) │
├─────────────────────┤
│ 3. AudioCaptureManager │ - 捕获音频
│ 麦克风 + 扬声器 │
│ AudioContext 混合 │
└─────────────────────┘
↓
停止录制
↓
保存录制文件 (JSON) + 视频文件
```
### 录制质量设置
| 质量 | 视频码率 | 音频质量 | 适用场景 |
|------|----------|----------|----------|
| Low | 500 kbps | Low | 长时间录制、存储空间有限 |
| Medium | 2 Mbps | Medium | 日常使用、平衡质量和大小 |
| High | 5 Mbps | High | 演示、教学、需要高质量 |
### 音频录制配置
- **采样率**:48 kHz
- **通道数**:单声道
- **音频缓冲区**:300 个音频包(约 5 秒)
- **音频包大小**:960 样本(20ms @ 48kHz)
- **扬声器音量增益**:2.0x(补偿 WASAPI Loopback 音量较低)
### 录制文件格式
- **录制文件**:JSON 格式,包含所有终端事件
- **视频文件**:WebM (VP9/VP8) 或 MP4 (H.264)
- **音频**:嵌入到视频文件中
### 回放功能
- 支持基于事件的回放
- 可调节播放速度(0.5x、1x、1.5x、2x)
- 暂停/恢复播放
- 跳转到任意时间点
## 🎨 主题系统
项目支持多种终端主题,使用 CSS 变量实现主题切换:
- **One Dark** - 经典的深色主题
- **Dracula** - 优雅的深色主题
- **Nord** - 北欧风格的深色主题
- **Tokyo Night** - 现代深色主题
- **Monokai** - 经典的代码编辑器主题
- **GitHub Light** - GitHub 浅色主题
- **Solarized Light** - Solarized 浅色主题
- **Solarized Dark** - Solarized 深色主题
主题配置位于 `src/config/themes.ts`。
## 🔐 安全特性
### 加密存储
会话密码和密钥使用 AES-256-GCM 加密存储:
- 使用 Argon2 密码派生函数生成加密密钥
- 每个会话使用唯一的随机 nonce
- 支持密码和密钥两种认证方式
### 主机密钥验证
自动检测 SSH 主机密钥变化,并在首次连接或密钥变化时提示用户确认。
## 🛠️ 开发指南
### 添加新的 shadcn/ui 组件
```bash
npx shadcn@latest add [component-name]
```
示例:
```bash
npx shadcn@latest add toast
```
### 添加新的 Tauri 命令
1. 在 `src-tauri/src/commands/` 中创建或编辑命令文件
2. 使用 `#[tauri::command]` 宏标记函数
3. 在 `src-tauri/src/lib.rs` 的 `invoke_handler` 中注册命令
4. 在前端使用 `invoke('command_name', { params })` 调用
示例:
```rust
// src-tauri/src/commands/example.rs
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
```
```typescript
// 前端调用
import { invoke } from '@tauri-apps/api/core';
const message = await invoke('greet', { name: 'World' });
```
### 添加新的页面
1. 在 `src/pages/` 创建页面组件
2. 在 `src/App.tsx` 的 `Routes` 中添加路由
3. 在侧边栏添加导航链接(如果需要)
### 修改主题
编辑 `src/config/themes.ts` 中的主题配置,或添加新主题。
## 📝 代码规范
### 前端 (React + TypeScript)
- **组件命名**:使用 PascalCase(如 `MainLayout.tsx`)
- **文件命名**:使用 PascalCase(组件)、camelCase(工具函数)
- **类型定义**:使用 `interface` 定义对象类型,使用 `type` 定义联合类型
- **导入顺序**:
1. React 相关
2. 第三方库
3. 本地组件(使用 `@/` 别名)
4. 本地工具函数和类型
- **使用 shadcn/ui 组件**:优先使用 `src/components/ui/` 中的组件
- **状态管理**:使用 Zustand 进行全局状态管理,遵循单一数据源原则
### 后端 (Rust)
- **命名风格**:遵循 Rust 命名规范
- 类型、结构体、枚举:PascalCase
- 函数、变量、模块:snake_case
- 常量:SCREAMING_SNAKE_CASE
- **错误处理**:使用 `Result` 和自定义错误类型(定义在 `error.rs`)
- **异步编程**:使用 `async/await` 和 `tokio` 运行时
- **Tauri 命令**:
- 使用 `#[tauri::command]` 宏标记命令函数
- 命令参数和返回值必须实现 `serde::Serialize` 和 `serde::Deserialize`
- 在 `lib.rs` 中注册命令
### Git 提交规范
使用清晰的提交信息:
```
():