
rcarmo 发布 rexweb:基于 webterm 的 Rex 兼容终端服务器
来源标题:Rcarmo/rexweb: A rex-compatible server, but based on rcarmo/webterm
开发者 rcarmo 推出实验项目 rexweb,用 Go 服务器和基于 webterm、ghostty-web 的浏览器客户端提供持久化、沙箱化的终端会话,并仿照 Rex 实现会话、标签和嵌套分屏管理。该项目目前仅支持 macOS,shell 隔离依赖 /usr/bin/sandbox-exec,需要 Go 1.24 及 Bun 1.3.13 以上版本本地构建运行。项目与 Superlogical Rex 无关。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
这是我自己做的一个实验,目的是理解 Rex 终端复用器的终端,并用一个 Go 服务器和基于我的 webterm 组件与 ghostty-web 构建的浏览器客户端,提供持久化、沙箱化的终端会话。
和 Rex 一样,你可以在一个受 Rex 启发的界面里管理会话、标签页和嵌套分屏。实时调整窗格大小,用 ⌘K / Ctrl+K 切换会话,用 ⇧⌘P / Ctrl+Shift+P 打开命令面板,Web UI 会跟随系统的浅色或深色外观。
服务器目前运行在 macOS 上,shell 隔离依赖 /usr/bin/sandbox-exec。它支持的协议子集在 SPEC.md 中有说明。当然,这个项目与 Superlogical Rex 无关(我只是它的粉丝,但我更喜欢 Web 界面,所以大部分是基于 webterm 做的)。
目前请在 macOS 上本地构建并运行。安装 Go 1.24 或更高版本、Bun 1.3.13 或更高版本、Git 和 make(随 Xcode Command Line Tools 提供),然后克隆仓库: git clone https://github.com/rcarmo/rexweb.git cd rexweb make install-dev make build bin/rexweb 打开 http://127.0.0.1:8080。服务器会启动或重新连接到会话守护进程,当守护进程没有会话时会创建一个默认 shell。
Bun 会下载我固定版本的 ghostty-web fork,包括其编译好的 JavaScript 和 WASM,然后直接将其 vendor 进来。
在能够发布到 Linux 之前,CI 处于禁用状态。一旦 CI 和发布流程可用,你就可以从 GitHub Releases 下载对应平台的二进制压缩包,用 SHA256SUMS 校验其 SHA-256 摘要,解压后从解压目录运行 bin/rexweb。压缩包会包含前端,因此运行时既不需要 Go 也不需要 Bun。
请保持压缩包的目录结构不变。默认的 -web-dir web/dist 是相对于工作目录的。要从其他目录启动,请提供绝对的 -web-dir 路径。当前的 macOS 打包产物是未签名、未公证的二进制文件。
由于我讨厌运行本地 agent,但又不得不把它和官方 Rex Beta 一起测试,所以我不得不把它沙箱化,每个 shell 都启动在账户主目录之外的一个私有工作区中。HOME 和 TMPDIR 指向该工作区内部。macOS 沙箱会阻止对外网络访问,以及工作区和允许的系统路径之外的文件内容。启动时会在接受会话之前验证隔离是否生效。信任边界参见 SECURITY.md。
目前,网关和守护进程是独立的进程。停止网关会让会话继续运行;重新打开网关会重新连接到同一个守护进程。停止守护进程会结束它的 shell。布局和保留的输出存放在守护进程内存中,每个窗格最多保留 512 KiB 的近期输出。工作区文件会一直保留,直到你删除它们;默认位置是临时存储。
未来,我希望把它变成一个仅支持 Linux 的服务器,因为对我来说,Rex 的价值与其说是拥有一个好的原生桌面终端,不如说是提供一种体面的方式来管理会话并重新连接它们(所以除了 Web,我也在考虑 mosh,不过目前那只是空想)。
影响 shell 创建的选项会在新守护进程启动时生效:
在账户主目录之外的现有私有目录中使用 zsh。
bin/rexweb -shell /bin/zsh -workspace /private/tmp/my-terminal-workspace
使用独立的守护进程和工作区。
mkdir -m 700 /private/tmp/my-rexweb-run bin/rexweb -session-socket /private/tmp/my-rexweb-run/session.sock 对于前台管理的守护进程,在另一个终端中运行 bin/rexweb -serve-sessions,然后启动网关。覆盖时,两个命令要使用相同的绝对 -session-socket 路径。用 Ctrl-C 停止前台守护进程。
对于自动启动的守护进程,找到在其 socket 旁边持有 daemon.lock 的 PID,并向该 PID 发送 SIGTERM。在 macOS 上,默认目录是 $HOME/Library/Caches/rexweb;查看那里的 daemon.log 以获取其工作区路径。在停止守护进程之前请确认 socket 路径,因为这样做会结束它的会话。
运行 bin/rexweb -help 查看选项,运行 bin/rexweb -version 查看构建信息。Web UI 使用 8080 端口。我用于互操作测试的可选原生 Rex 端点使用单独的端口,约定为 7297,并且不提供 Web UI。
要在启动新守护进程时启用原生客户端: bin/rexweb -rex-listen 127.0.0.1:7297 Rex 端点仅限回环地址,默认禁用,且不进行身份验证。协议和保留细节参见 SPEC.md。
在 Rex Beta.app 中将 http://127.0.0.1:7297 添加为远程主机。兼容性已针对 Rex 0.1.0-preview.14、应用构建 1925、控制 API 修订版 12 进行测试。会话、标签页、平铺分屏和终端流式传输在该子集内可以正常工作。每个窗格同一时间支持一个实时查看者。
不支持原生流恢复、浮动窗格、Lua 配置、远程身份验证和完整的自动化 API,说实话这些对我用处不大,所以我不太可能去实现完整的功能集。
make build # Go 可执行文件和浏览器 bundle make test # Go 和前端单元测试 make check # TypeScript、布局测试、go vet 和 Go 测试 make race # Go 竞态检测器 make smoke # 沙箱化 PTY、重连、原生协议和守护进程启动 make release # 两个 macOS 压缩包、校验和以及解压包的冒烟测试 make clean # 删除构建和发布输出 make release 使用 VERSION 在 dist/ 中构建本地压缩包。计划的 GitHub 草稿发布工作流参见 RELEASING.md,变更指南参见 CONTRIBUTING.md。
项目代码采用 MIT 许可证,版权归 Rui Carmo 所有,2026 年。捆绑的依赖和字体保留各自的许可证。THIRD_PARTY_NOTICES.md 记录了它们的来源和声明;副本包含在发布压缩包和构建好的前端中。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。