docs: settle the GPUI client plan and the development baseline

The plan pins gpui-kit 0.7.3 (locked to gpui-pre 0.3.9) as the client
stack, keeps the backend untouched behind the existing HTTP/WS API, and
ships the client for Windows, macOS and Linux. The dev baseline records
the verified versions, the knowledge sources that outrank memory, the
entry-point skeleton, and the platform facts the next sessions must not
relitigate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
weidu12123andClaude Fable 5 committed 2026-10-17 17:02:46 +08:00
1 parent a868ce9a57
commit ff160f41ca
3 files changed
+278 -2

No files matched your search

+139
View File
@@ -0,0 +1,139 @@
# GPUI 原生 Windows 客户端方案
> 2026-10-17 调研结论。本文是 `docs/plan.md` 的展开,边界修改见文末「对 plan.md 的修改」。
---
## 结论
| 决策 | 选择 | 依据 |
|---|---|---|
| GPUI 分发 | crates.io `gpui-kit = "0.7.3"`(内部精确锁定 `gpui-pre =0.3.9`) | 本机 Windows 11 实测:一次编译通过(1m55s),窗口正常打开 |
| 组件库 | gpui-kit(含 gpui-component) | 75+ 组件、Dock/DataTable/Tree/VirtualList/Editor 齐备、Apache-2.0、Longbridge Pro 生产验证 |
| 终端渲染 | `alacritty_terminal 0.26` + 自写 GPUI Element | 四个参照项目全部走这条路;后端已有同版本解析器与字节环 |
| 后端集成 | GPUI 客户端走 HTTP/WS 连现有 axum 守护进程,后端零改动 | 一份实现、两个前端;现有 API 已覆盖全部板块 |
| 产物 | `vps-switch`(守护进程,Linux/Windows 无头)+ `vps-switch-gpui`(Windows / macOS / Linux 三平台客户端) | 受众优先:能构建的平台都构建,与 shell-rs / tty7 的发布矩阵一致 |
**不 fork GPUI、不打补丁。** 参照项目里只有 shell-rs 是零 fork 路线,它已在生产用 gpui-kit 0.6.1 做了完整 SSH 客户端;我们的 spike 在本机复现了同样的可行性。
---
## 四个参照项目的路线对照(2026-10-17 实测克隆)
| 项目 | 星数 | 许可 | GPUI 来源 | 组件库 | 规模 |
|---|---|---|---|---|---|
| [shell-rs](https://github.com/since2006/shell-rs) | 334 | **GPL-3.0** | crates.io `gpui-kit 0.6.1` | gpui-kit | 13.3 万行,终端模块 1.5 万行 |
| [tty7](https://github.com/l0ng-ai/tty7) | 1263 | **Apache-2.0** | Zed git rev(钉 commit) | gpui-component 自维护分支 | 34 万行,终端 5.7 万行 |
| [pebrel](https://github.com/Kuddev/pebrel) | 3418 | **GPL-3.0** | 自维护 `Kuddev/zed` fork(v1.16.1 + 一串补丁) | gpui-component fork 0.5.2 | 终端核心约 1 万行 |
| [oxideterm](https://github.com/AnalyseDeCircuit/oxideterm) | 1681 | **GPL-3.0** | vendor 整套 `gpui-ce` 进仓库 | 自建 UI | 90 个 crate |
**许可证事实:四个项目里只有 tty7 是 Apache-2.0,可以直接借鉴代码(保留声明);其余三个是 GPL-3.0,只能读架构、不能抄代码。** 这条约束把 tty7 抬到「第一参照」:它的守护进程模型、终端渲染、托盘实现都可以合法移植。
**它们分叉的原因**(说明为什么我们不能照抄任何一家):
- pebrel / oxideterm 需要上游没有的东西(DirectWrite 字体内存所有权、虚拟窗口测试、混合 DPI 修复),选择了 fork/vendor,代价是每次上游变更都要手工合并。
- tty7 需要 gpui-component 的未发布修改,选了 git 分支;GPUI 本体钉 Zed commit 而非 gpui-pre,因为它的 `alacritty_terminal` 也是自己的 fork,不能跟周更快照绑死。
- shell-rs 什么都不需要改,所以用 crates.io 版本,交给 gpui-kit 的周更节奏管理升级。
**vps-switch 属于 shell-rs 这一档**:我们没有任何必须改 GPUI 本体的需求。如果后期发现确实需要(例如 IME bug 必须在平台层修),再升级到 tty7 模式(钉 Zed rev),这是渐进的,不影响现在的选型。
---
## 生态事实(决定维护成本的硬数据)
- `gpui-pre` 是 Longbridge(huacnlee)把 Zed 每周快照重发到 crates.io 的系列:0.3.9 = 2026-10-12,Apache-2.0,月下载 10.5 万,是事实上唯一的可用分发。crates.io 上 `gpui` 这个名字的 Zed 官方版本停在 2025-10 的 0.2.2,结构已过时(早于平台拆分),不能用。
- gpui-kit 0.7.3(2026-10-12),周更节奏,**精确锁 `=0.3.9`**(它曾经用 caret 被周更打崩过,现在 CI 强制精确 pin)。升级 GPUI 必须跟它一起走。
- 0.7.x 仍有 breaking change(`Table`→`DataTable` 等),**锁死具体版本升级,不自动跟周更**。
- Zed 官方 2026 年把 GPUI 开发降级为「只做 Zed 用得到的部分」,社区需求一律指向 fork。这对我们意味着:**上游不会替我们修任何东西**,所有平台层缺口要么自己补、要么靠 gpui-kit 这个已被生态接受的通道。
- Zed 的终端 crate 不可复用:GPL-3.0 且与编辑器深度耦合(不在 crates.io,不独立发布)。
---
## 架构
### 进程模型
```
vps-switch-gpui.exe (GPUI 客户端)
│ HTTP REST + 二进制 WS(127.0.0.1:18800,回环免 Key)
▼
vps-switch.exe (守护进程:axum + SQLite + russh + alacritty Term + MCP)
│
├── 本机 PTY(portable-pty + 随包 ConPTY)
└── 远端 SSH(russh,连接池 + 跳板)
```
- **后端零改动。** 现有 26 个 REST 端点 + 终端二进制 WS(0x00 实时 / 0x01 输入 / 0x02 回放)+ SSE 事件,覆盖全部五大板块与 MCP。
- **客户端启动时自动拉起守护进程**(若 127.0.0.1:18800 无响应),沿用现有 `--minimized` 启动参数与数据目录解析(`%APPDATA%\vps-switch\data`)。
- 终端状态仍是「后端权威 + 客户端第二份解析」:后端 `Term` 保证 pane 保活与回放,客户端 `alacritty_terminal` 把 WS 字节流渲染出来。这与现在浏览器里 xterm.js 的地位完全相同。
- 旧 Windows 桌面壳(`src/desktop.rs`,tao + wry + tray-icon)在 GPUI 客户端达到可用后退役;退役之前两者并存,互不干扰。
- **客户端三平台同一份代码**:GPUI 与 gpui-kit 原生支持 Windows / macOS / Linux,shell-rs(零 fork 的 gpui-kit 路线)与 tty7 都已发布三平台产物。需要平台专用代码的只有托盘(原生 / StatusNotifierItem)与自启(注册表 / LaunchAgent / systemd user unit)。
### 客户端模块(`gpui/` 目录,独立 binary)
| 模块 | 内容 | 复用的后端 |
|---|---|---|
| `workspace` | DockArea 布局:左主机树 / 中工作台 / 右详情,标签页与分屏 | — |
| `hosts` | 主机树(Tree)、增删改(Dialog)、连接测试 | `/api/hosts*` |
| `terminal` | alacritty_terminal 解析 + 自写 Element 渲染 + 输入编码 | `/api/ws/terminal/:pane_id`、`/api/terminals` |
| `files` | 双栏 DataTable、CodeMirror 对应物(gpui-kit 内置 Editor) | `/api/files/*` |
| `inspector` | 探针仪表盘(gpui-kit Chart:Line/Bar/Area) | `/api/hosts/:id/inspect` |
| `settings` | 设置四分类 | `/api/settings*` |
| `tray` | 托盘图标 + 右键主机列表秒开终端 | — |
| `app` | 单实例(CLI socket)、自启、窗口状态持久化 | — |
### 终端渲染(关键实现细节,来自四个项目的共识)
1. 解析线程持有 `alacritty_terminal::Term`,UI 线程定时(16ms)批量取快照,**锁内只做快照、锁外做颜色解析与绘制**(pebrel 契约)。
2. 每行一次 `shape_line`,`force_width` 传**单格宽度**而非行宽(shell-rs 的实测教训:传行宽会把首字符之后全部推向右边)。
3. 背景色按连续区间合并成矩形,不逐格画。
4. 字形原点 = `列号 × cell_width`,不允许布局引擎移动字形(等宽字体正确性的前提)。
5. 连字默认关闭(逐格塑形),后续作为可选特性(pebrel 的做法:同样式相邻 ASCII 合并塑形再映射回固定列号)。
---
## Windows 风险清单(按严重度,全部要在 M0 验证)
| # | 风险 | 事实 | 应对 |
|---|---|---|---|
| 1 | **中文 IME** | zed#56327(2026-05 开,标记 needs repro,2026-10 仍未修):IME 组合态下 WM_KEYDOWN 未被抑制,可能重复插入或干扰输入 | M0 第一项实测。若复现:在 spike 里接 Win32 `WM_IME_*` 自管组合文本;若平台层限制无法绕开,再考虑钉 Zed rev 自修(升级到 tty7 模式) |
| 2 | **GPU 要求** | 这是 GPUI 框架自身的限制,所有 GPUI 应用(含四个参照项目)完全一样。Windows 要求 DirectX 11 兼容 GPU,**官方文档明确虚拟机里用模拟适配器「能工作、仅性能下降」**;仅纯 Basic Display Adapter 环境可能打不开。Linux 需要 Vulkan,缺驱动报 `NoSupportedDeviceFound`,装驱动可解(软件渲染未文档化)。macOS 全系 Metal,无此问题 | 发布说明写明 GPU 要求。重点自测用户的云电脑场景(虚拟机) |
| 3 | 托盘 | GPUI 上游无内置(托盘 PR #44047 被官方以「无 Zed 用例」关闭);`gpui-tray 0.1.4`(2026-09-20)可用 | 三平台各一套:Windows/macOS 原生 + Linux StatusNotifierItem(tty7 的 `src/ui/tray/` 共 1150 行,Apache-2.0 可移植) |
| 4 | 窗口透明/毛玻璃 | 未知:GPUI 有 `transparent` 选项,Windows 上亚克力/模糊效果未验证 | M0 验证。退路:纯色深/浅主题(gpui-kit 内置 20+ 主题),毛玻璃作为后续增强 |
| 5 | 字体 | DirectWrite 走系统 shaping/光栅化,无需 font-kit,中文回退正常(Zed 自身每日验证) | 低风险,M0 顺带验证 |
---
## 分阶段计划(每阶段可独立验收)
- **M0 可行性收尾(1 天)**:已完成的编译 + 开窗 ✅。待验证:中文输入、托盘、透明窗口、Dock 布局骨架、终端 Element 画 5000 格。
- **M1 骨架(3–5 天)**:workspace + DockArea + 主机树 + 设置页只读;客户端连守护进程读真实数据。
- **M2 终端**:alacritty_terminal 解析 + Element 渲染 + 输入 + resize + 重连回放;手用终端零注入的既有纪律沿用。
- **M3 文件**:双栏 DataTable + 传输队列 + 内置 Editor。
- **M4 探针**:仪表盘图表。
- **M5 平台**:托盘、自启、单实例、窗口状态、独立终端窗口。
- **M6 收尾**:退役旧桌面壳;打包三平台 —— Windows(Inno Setup,沿用现有流程)、macOS(arm64 + x64 dmg;签名/公证需要 Apple Developer 账号,先做未签名版)、Linux(AppImage,随包 X11/Wayland 依赖);GitHub Actions 发版流水线(tag 触发、matrix 三平台、产物 + SHA256SUMS);旧桌面壳退役、发版。
每个里程碑验收用真实机队(vip-hk 等)与真实界面,不用代理指标。
---
## 不做的事(防蔓延)
- 不 fork GPUI、不打补丁(除非 M0 的 IME 验证证明必须)。
- 不学 tty7 的 agent 集成、mobile、remote workspace;不学 oxideterm 的插件/wasm/云同步。
- 不引入 IDE 能力(LSP/补全/diff 视图)——内置 Editor 只用来看和改配置文件。
- Vue 前端不追求与 GPUI 对齐:它降级为「浏览器控制台 + Linux 服务器管理界面」,功能完整但不再加新交互。
- 概念数不增加:客户端/守护进程是既有架构的显式化,不引入新名词。
---
## 对 plan.md 的修改(待拍板)
边界一句话改为:
> **一个轻量级 VPS 管理工具:先把 VPS 仓库、终端、文件浏览器、文件上传下载、探针五大核心板块做到极致,最后将这些现成链路加上护栏工具化为 MCP Server。交付两个产物:GPUI 原生的桌面客户端(Windows / macOS / Linux,`vps-switch-gpui`)与无头的守护进程(`vps-switch`,Linux/Windows),两者共用同一后端与同一套 HTTP/WS API。**
技术栈表「桌面壳」一行改为:
> | 桌面壳 | GPUI(gpui-kit 0.7.3 / gpui-pre 0.3.9) | Windows 客户端;Linux 无头服务不带壳 |
+137
View File
@@ -0,0 +1,137 @@
# GPUI 开发基线(知识防老化)
> 2026-10-17 建立。**目的:任何后续会话/开发者动手前先读本文,不要凭记忆写 GPUI 代码。**
> GPUI 在 2026 年变化极快(`gpui-kit` 这个名字 2026-09 才从 `gpui-component` 改来;GPUI 本体在 crates.io 上只到 2025-10 的 0.2.2,结构已过时)。训练数据里的"GPUI 知识"大概率是错的。
> 方案见 `docs/gpui-client.md`,本文是可执行的事实基线与纪律。
---
## 1. 版本基线(写死,不 auto-update)
| 项 | 版本 | 说明 |
|---|---|---|
| `gpui-kit` | **`=0.7.3`** | crates.io,Apache-2.0。一个依赖带出 GPUI + 组件 + 图标 |
| `gpui-pre` 系列 | **`=0.3.9`**(gpui-kit 内部锁定) | 不要在 `Cargo.toml` 里自己写,也不要 `cargo update` 它 |
| Rust | **1.99.1**(`rust-toolchain.toml` 钉住) | gpui-pre 0.3.x 用了 1.94 后才稳定的 std API;1.95 编不过 |
| `alacritty_terminal` | **0.26** | 与后端 `Cargo.toml` 同版本 |
| 镜像 | rsproxy(`sparse+https://rsproxy.cn/index/`) | 本机与 CI 都配 |
**升级纪律**:
- `gpui-kit` 0.7.x 仍有 breaking change(`Table`→`DataTable`、`Divider`→`Separator` 等都发生过)。**升级 = 一次明确的工程任务**:读 [gpui-kit releases](https://gpui-kit.com/releases) → 全量编译 → 修 breaking → 真机验收。绝不混在日常改动里。
- `gpui-pre` 由 gpui-kit 精确锁定,**每升一版 gpui-kit 才动一次**。曾经有人用 caret 依赖被周更打崩(gpui-kit #3156),CI 现在强制精确 pin。
- 升级后第一件事:跑本机 spike(见 §8)验证编译与开窗,再跑 IME 手测。
---
## 2. 知识来源优先级(不要凭记忆)
写任何 GPUI/gpui-kit 代码前,按此顺序核实 API:
1. **本地源码**(已下载,最可靠):
- `~/.cargo/registry/src/*/gpui-component-0.7.3/`
- `~/.cargo/registry/src/*/gpui-base-0.7.3/`
- `~/.cargo/registry/src/*/gpui-pre-0.3.9/src/`
2. **组件文档**:https://gpui-kit.com/component/<name>.md ;索引 https://gpui-kit.com/docs/components
3. **官方 AI skills**(含编码规范与设计规范,shell-rs 把它当规范用):`npx skills add longbridge/gpui-kit`
4. **参照项目**(本地克隆,见 §7)——读架构可以,代码注意许可证。
**反面模式**(记忆里出现过、实际已过时的说法):
- ❌ "crates.io 上的 gpui 可以直接用" —— 0.2.2 结构过时(早于平台拆分),不可用。
- ❌ "stable Rust 1.90+ 就够" —— 那是 2025-12 的信息;现在需要 ≥1.98,本项目钉 1.99.1。
- ❌ "gpui-terminal 有个 358 行的现成实现可以依赖" —— 已停更近一年,API 对不上当前 GPUI,只能读思路。
- ❌ "Zed 官方会处理平台问题" —— 2026-02 起官方只做 Zed 用得到的部分,社区需求一律指向 fork。上游不会替我们修任何东西。
---
## 3. 已验证的入口骨架(本机编译 + 开窗通过)
```rust
use gpui_kit::component::input::*;
use gpui_kit::component::*;
use gpui_kit::*;
fn main() {
gpui_kit::application().run(move |cx| {
gpui_kit::init(cx); // 必须先调用,再使用任何组件
gpui_kit::open_window(WindowOptions::default(), cx, |window, cx| {
cx.new(|cx| MyView::new(window, cx))
})
.expect("Failed to open window");
});
}
```
- `gpui_kit::open_window` 自动挂 `Root`(对话框/toast 的宿主),不要自己再包一层。
- 完整可用样例:`E:\1shell4.7\gpui-spike\src\main.rs`(含 Input 与 Button,中文占位符验证过)。
- 带 `Root`、单实例、设置加载、Store 注入的生产级骨架:`E:\1shell4.7\gpui-refs\shell-rs\src\main.rs`(147 行,GPL,读结构不抄代码)。
---
## 4. 工程模式(从 shell-rs AGENTS.md 提炼,已被生产验证)
- **一个命令一个处理器**:按钮、菜单、快捷键全部派发 `actions.rs` 里的 action,由 Workspace 统一处理。不写临时闭包直接改状态。
- **状态经 Entity 流动**:mutator 在 Entity 方法里「改内存 → 写库 → notify」;消费方 `cx.observe`。**渲染回调内不得读取其他实体**,只能传普通快照(渲染闭包运行在 render 过程中,重入会 panic 或死锁)。
- **焦点规则**:`dispatch_action` 只沿焦点元素的祖先链走。工作区内部必须有东西持有焦点;**永远不要聚焦根节点**(对话框层是它的子元素,祖先持焦点会让对话框的焦点陷阱失效)。标题栏按钮用 `FocusHandle::dispatch_action` 派发。
- **对话框关闭后焦点会丢**(gpui-component 既有行为):这是上游行为不是 bug,别花时间修。
- **彩色 SVG 不能用 `Icon`**:`svg()` 走 `paint_svg`,整图当遮罩单色上色。彩色要 `img()`(光栅化成位图)。
- **gpui-kit 的 Scrollable 不是就地在原元素加滚动条**:它重建外层 div。滚动区内先放一层 `v_flex().w_full()` 再写内容(否则子块按内容宽度收缩,宽度参差)。
- **无头 UI 测试**:`gpui-kit` 的 `test-support` feature + `gpui_kit::test::TestWindowExt`(真实 Workspace 在无头窗口里渲染,`click`/`input`/`find` 驱动)。每个里程碑的验收都要有这类测试,别只靠肉眼看窗口。
- 尺寸:`px(..)` 只用于 API 要求 `Pixels` 的地方;其余用 `cx.theme()` token 与 rem 助手。
---
## 5. 终端渲染要点(四个参照项目的共识)
1. **解析线程 + UI 定时批量刷新**:解析线程持有 `alacritty_terminal::Term`;UI 线程 ~16ms 取一次快照。锁内只做快照(拷贝成纯数据),**锁外做颜色解析与绘制**。
2. **每行一次 `shape_line`**;`force_width` 传**单格宽度**——传行宽会把首字符之后全部推向右边(shell-rs 实测教训,源码里有注释)。
3. **背景按连续区间合并**成矩形,不逐格画。
4. **字形原点 = `列号 × cell_width`**,不允许布局引擎移动字形。连字默认关(逐格塑形)。
5. 输入编码在 UI 侧完成(`Keystroke` → 按终端模式编码字节),协议回复/鼠标报告/IME 预编辑不走通用输入路径。
6. 后端已有同版本 `alacritty_terminal` 与 2MiB 字节环;客户端收 WS 字节流(0x00 实时 / 0x01 输入 / 0x02 整份回放),**0x02 要重置再重建**(`\x1bc` 或清屏),这是浏览器端踩过的坑(commit `a868ce9`)。
---
## 6. 平台事实
| 平台 | GPU | 托盘 | 字体 | IME |
|---|---|---|---|---|
| Windows | DX11 兼容;虚拟机用模拟适配器**能工作**(官方文档原话),纯 Basic Display Adapter 可能打不开 | 无内置;`gpui-tray 0.1.4` 或移植 tty7 `src/ui/tray/native.rs`(148 行) | DirectWrite,走系统 | **风险**:zed#56327 中文 IME 未修,M0 必须手测 |
| macOS | 全系 Metal,无问题 | 原生 NSStatusItem | 系统 | NSTextInputClient 语义,正常 |
| Linux | 需要 Vulkan;缺驱动报 `NoSupportedDeviceFound`,装驱动可解;无文档化软件渲染 | StatusNotifierItem(tty7 `sni.rs`) | fontconfig | X11/Wayland 输入法框架 |
- 发布说明必须写明 GPU 要求。
- 三平台自启:注册表 `HKCU\...\Run` / LaunchAgent `plist` / systemd user unit。
---
## 7. 参照项目(本地克隆,`E:\1shell4.7\gpui-refs\`)
| 目录 | 项目 | 许可证 | 能做什么 |
|---|---|---|---|
| `tty7/` | l0ng-ai/tty7(1263★) | **Apache-2.0** | **唯一可以抄代码的**:托盘、守护进程模型、终端渲染、IME 处理,保留版权声明即可 |
| `shell-rs/` | since2006/shell-rs(334★) | GPL-3.0 | 零 fork gpui-kit 路线的完整工程样板,**只读结构与文档** |
| `pebrel/` | Kuddev/pebrel(3418★) | GPL-3.0 | 渲染契约、逐格塑形思路,只读 |
| `oxideterm/` | AnalyseDeCircuit/oxideterm(1681★) | GPL-3.0 | vendor GPUI 的做法(我们不采用),只读 |
**纪律**:GPL 项目一行代码都不能复制进 vps-switch。Apache-2.0 的 tty7 可以移植,保留其版权声明。
---
## 8. Spike(每次升级 gpui-kit 后重跑)
`E:\1shell4.7\gpui-spike\`(仓库外,独立 cargo 工程):
- `cargo build` 通过 = 工具链与版本兼容。
- `cargo run` 出窗口 + 在输入框里打中文 = 开窗与 IME 验证。
- 内存参考:debug 构建窗口进程约 74MB。
- 未验证、需要补的:托盘、透明窗口、Dock 布局、终端 Element 画 5000 格、macOS/Linux 本机构建。
---
## 9. 调研过程教训(避免重复浪费)
- **不开子 agent 做调研**:2026-10-17 四个并行 agent 烧掉约 40 万 token 并撞 429 配额全部失败。读文件自己读,每次让 agent 报告结论会把上下文翻倍。
- **先跑通再写文档**:方案里每个"可行"都要有本机实测支撑(编译、开窗)。
- **验收用真实界面**,不用代理指标(抓包/日志)。
+2 -2
View File
@@ -8,7 +8,7 @@
## 边界
**一个轻量级 VPS 管理工具:先把 VPS 仓库、终端、文件浏览器、文件上传下载、探针五大核心板块做到极致,最后将这些现成链路加上护栏工具化为 MCP Server。**
**一个轻量级 VPS 管理工具:先把 VPS 仓库、终端、文件浏览器、文件上传下载、探针五大核心板块做到极致,最后将这些现成链路加上护栏工具化为 MCP Server。交付两个产物:GPUI 原生的桌面客户端(Windows / macOS / Linux,`vps-switch-gpui`)与无头的守护进程(`vps-switch`,Linux/Windows),两者共用同一后端与同一套 HTTP/WS API。**
设计准则:
@@ -109,5 +109,5 @@
| Web 服务与实时通信 | `axum` | REST API + 终端二进制 WebSocket + 状态/探针/传输进度 SSE |
| 本地存储 | `rusqlite`(bundled) | 单文件 SQLite + 凭据加密存储 |
| MCP 协议 | `rmcp`(≥ 1.4.0) | 板块六接入,支持 stdio 与 Streamable HTTP |
| 桌面壳 | Tauri 2 | 桌面窗口与托盘 + headless 同一二进制双模式 |
| 桌面壳 | GPUI(`gpui-kit` 0.7.3,内部锁 `gpui-pre` 0.3.9) | GPUI 原生桌面客户端(Windows / macOS / Linux);Linux 无头服务不带壳。详见 `docs/gpui-client.md` |
| 前端 | Vue 3 + TypeScript + Tailwind CSS + xterm.js(WebGL)+ CodeMirror 6 | 轻量、响应迅速、围绕五大板块打造精致 UI |