T3 移动终端原生模块
这个本地 Expo 模块负责移动应用的原生终端表面。
JavaScript 契约有意保持很小:
- 来自原生表面的输入以
{ data: string }发出 - 来自原生表面的尺寸变化以
{ cols: number, rows: number }发出 - 远程 PTY 输出由现有的
WsRpcClient.terminalRPC 流交付
iOS 实现使用随仓库提供的 GhosttyKit.xcframework,它由 VVTerm 的 Ghostty custom-I/O 与 live-padding 分支构建。T3TerminalView 拥有一个 libghostty 表面,并使用这一回调 I/O 模型:
- 为该进程初始化 libghostty 一次
- 每个原生视图创建一个 Ghostty 应用和一个表面
- 用
ghostty_surface_feed_data把远程输出送入该表面 - 用写入回调把用户输入送回 JS
- 通过
onResize发出 Ghostty 测得的终端尺寸
Android 用上游的 libghostty-vt 实现同一视图契约,负责终端状态、解析、重排和回滚缓冲。Android Canvas 视图渲染 JNI 桥产生的紧凑快照,因此 React Native 界面和 RPC 代码保持平台中立。
随仓库提供的 Ghostty 修订和许可详情见 THIRD_PARTY_NOTICES.md。
重新构建 GhosttyKit
已签入的 GhosttyKit.xcframework 由 Yash Singh 的 Ghostty 分叉在修订 cf8edc23f3a6a87a96e41a90013e89e987d34980 上构建。把 GHOSTTY_SOURCE_DIR 设为 https://github.com/Yash-Singh1/ghostty 的一份克隆,并检出该修订(纳入仓库时为 t3code/custom-io-ordered-feed 分支,基于 VVTerm 的 vvterm/custom-io-padding 分支)。
apps/mobile/modules/t3-terminal/scripts/build-libghostty-ios16.sh该脚本用 Zig 0.16.0 构建 Ghostty,对 iOS 归档执行 strip,并只替换 ios-arm64 和 ios-arm64-simulator 切片。必须安装 Xcode 的 Metal 工具链;如果 metal 失败,请运行 xcodebuild -downloadComponent MetalToolchain。
为 Android 重新构建 libghostty-vt
已签入的 Android 共享库和头文件,钉选到仓库根目录 native/libghostty-vt/VERSION 中记录的修订。设置 ANDROID_NDK_HOME 后运行:
apps/mobile/modules/t3-terminal/scripts/build-libghostty-android.sh该脚本会在需要时下载 Zig 0.15.2,检出已钉选的上游 Ghostty 修订,并以 16 KB 页大小支持重新构建全部四个 Android ABI。