终端运行时
环境(environment)服务器持有 PTY、会话生命周期和保留的输出。每个客户端(client),包括桌面端渲染器,都通过环境连接接入。这样客户端可以重新连接,或共享一个正在运行的会话。渲染器的选择留在每个客户端本地,并不改变终端契约。
输出与保留
终端历史是增量的。PTY 回调追加新的数据块;实时事件(event)只携带这些数据块。若在每次回调时都物化或复制完整的回滚缓冲,输出成本会随保留的历史一起增长,因此快照和合并后的持久化才是物化边界。持久化把可变的历史缓冲区排入队列,并在写入执行时读取它的最新值。清除、重启和关闭必须先排空写入,再完成各自的生命周期边界。
每个终端的服务器历史上限为 5,000 行和 8 MiB UTF-8 文本,因此一条很长、尚未换行结束的行也不能绕过保留限制。驱逐会移除最旧的输出,且不拆开 Unicode 码点;实时输出不会被截断。即使数组压缩要到稍后才发生,也要立即释放已丢弃数据块的引用。客户端(client)缓冲区另有 512 KiB 上限。改动这条路径时,要用已满的回滚缓冲来测量吞吐。
恢复时只能读取当前或旧版历史文件中有界的尾部,跳过任何不完整的 UTF-8 前缀,并应用行数上限。在重写这份已按上限截断的文件之前,先关闭读取句柄。启动时若读取整份旧日志,就会使内存上限失效。
渲染器归属
Android 和 Web 使用同一套 libghostty-vt C ABI 来规定终端行为。平台适配器(adapter)负责绘制和输入集成,React 不进入终端帧。Web 适配器在每个浏览器标签页中共享一个 WebAssembly 实例,同时每个终端拥有并释放自己的句柄。规范的上游钉选是 native/libghostty-vt/VERSION;它一变更,原生产物和 Web 产物都必须重新构建。Web 把修订号嵌入构建信息,这样 ABI 检查无需第二处钉选就能发现偏差。
恢复回滚缓冲时,不得向当前 shell 发送终端应答。否则,历史中的设备查询会引发新的应答,在提示符处显示为杂乱内容。服务器会从保留的历史中去掉查询/应答流量,Web 渲染器在回放期间会断开自己的 PTY 写入器。修改保留逻辑或渲染器代码时,这两项保护都要保留。