Skip to content

架构

Terminality 建立在纯 Rust MVVM 核心 libszt 之上,界面客户端可以替换。桌面端使用 Tauri 2 + React;移动端使用 React Native,并通过 UniFFI 生成 Swift / Kotlin 绑定。

进程模型

┌─ 一个桌面进程 ───────────────────────────────┐
│  libszt Context(共享)                        │
│  ├─ WorkspaceModel                            │
│  ├─ HostCatalogModel                          │
│  ├─ SessionRegistry                           │
│  ├─ Vault                                     │
│  ├─ SettingsModel                             │
│  ├─ QuickCommandModel                         │
│  └─ AsyncExecutor (Tokio)                     │
│                                               │
│  ┌─ 窗口 A ───────┐  ┌─ 窗口 B ───────┐      │
│  │ 标签页与分屏树  │  │ 标签页与分屏树  │      │
│  └────────────────┘  └────────────────┘      │
│                                               │
│  设置 | 连接库 | 新建主机 | tmux | 开源许可  │
└───────────────────────────────────────────────┘

一个进程、一个 libszt Context、多个原生窗口。对话窗口共享状态,但不拥有主窗口的标签页或窗格。

分层架构

React / React Native           展示层

@szt/libszt                    手写 TypeScript 门面

Tauri Commands / UniFFI       IPC 边界

libszt(纯 Rust)              行为核心
  ├─ ViewModels               界面状态、命令、事件
  ├─ Models                   领域状态与校验
  ├─ Services                 I/O、PTY、SSH、网络
  ├─ Binding Interface        类型化外语契约
  └─ Vault / Crypto           加密与持久化

Platform Adapters             PTY、Keychain、废纸篓、字体

MVVM 组件模型

作用示例
Model领域状态、校验、可序列化命令参数HostCatalogModelWorkspaceModel
ServiceI/O、编排、依赖注册Tmux Module、FileServiceOminiService
ViewModel面向界面的状态、命令、事件,并拥有键控子项WorkspaceViewModelSettingsViewModel

Rust 通过 TypeId 校验组件查找;外部客户端使用稳定、版本化的契约。ViewModel 门面手写完成,不依赖反射扫描或语法解析。

状态、命令与事件

rust
State<T>         // 可观察、有序投递、panic 隔离
ReadonlyState<T> // 只读订阅
Command<T>       // 可取消意图与类型化参数
Task<T>          // 可等待取消的异步执行
Event<T>         // 双向或只读事件,明确订阅所有权

异步运行时

生产异步命令通过通用 AsyncExecutor 在 Context 拥有的 Tokio reactor 上执行:

  • 任务协作响应可等待取消。
  • CancellationToken::try_commit 线性化不可逆副作用,任务不能先报告取消再在后台修改状态。
  • 即使最后一个所有者由工作任务释放,运行时也能安全关闭。

终端字节数据流

PTY reader
  → 有界队列(64 × 8 KiB)
  → 16 ms 或 32 KiB 批次
  → 原始 Tauri 二进制 Channel
  → xterm TerminalSurface(WebGL)

终端字节使用专用原始通道,而不是 JSON 或普通绑定协议。控制状态与意图使用不透明句柄和版本化 JSON 槽位。

绑定协议数据流

React Component
  → useViewModel("workspace")
  → WorkspaceViewModel(手写类型门面)
  → Tauri invoke / UniFFI
  → BindingRuntime
  → ViewModel.commands.handle(...)
  → 状态更新 → UI 重渲染

useViewModel("workspace") 通过手写 ViewModelMap 推导完整类型,原生契约通过校验后才会暴露。

运行时与持久状态

运行时(临时)持久化(SQLite 加密)
窗口、标签页、分屏、窗格主机档案
会话注册表与 PTY 子进程设置
滚动缓冲快捷命令
机器发现快照QCS 最近历史
命令编排器草稿凭据记录

关闭应用会销毁 Rust 会话注册表与 PTY 子进程;下次启动创建新的运行时布局。只有保险库继续存在。

支持目标

macOS 13+(Intel 与 Apple Silicon)· Windows 11 x64 · Ubuntu 22.04 / 24.04 x64(X11 与 Wayland)· iOS 16+ · Android 10+ ARM64

仅通过 CI 编译并不代表平台认证;正式发布仍需要在真实或虚拟设备上完成验收。

Terminality — 连接每个角落