hope2333.github.io / wiki

Push261104


Push261104 — 终端修复与 wrapper 双代补齐

GitHub Release · 中文版 · English · Español · 日本語 · 繁體中文

概览

这批不是"又发几个版本",而是修两类静默失效——界面正常、服务正常,只有真正用到终端或按键时才暴露。

wrapper 两代均为每版 deb + pacman 双格式。共 118 个资产:4 个 native + 110 个 wrapper 包 + 两份校验和清单。

两个修复的根因

v2 PTY 起不来。 POST /api/pty 恒返 500 ERR_DLOPEN_FAILED。TUI、serve、Web UI 全部正常,只有开终端(TUI 内 pane、远程客户端连 PTY、/goal 一类操作)失败。根因是内嵌的 librust_pty 是 glibc 构建,bionic 没有 libpthread.so.0。

musl + 符号 shim 这条路试过并放弃:能 dlopen,但 Bun 在 POST /api/pty 时 SIGSEGV@0x0——musl 的运行时预期远超 shim 能覆盖的符号数。最终改为为本机直接编译:host 即 aarch64-linux-android,把 bun-pty 的 Rust crate 编成 bionic 件(540 KB),只需补 termios 0.2.2 的 android cfg 与静态链接 libunwind.a。

v1 TUI 只显示不能操作。 进去就吐 ^[]10;rgb:…、^[[?1016;0$y,鼠标点击回显成 0;108;22M。不是解析器问题:启动器为了捕获 SIGSEGV 崩溃 stderr,把 TUI 放在后台进程组,它永远拿不到终端前台权,raw 模式设不上(stty 实测 isig icanon echo 全开)——按键要回车才送达,终端对启动探测的应答被 tty 回显成垃圾。

修法是启动器改前台运行(崩溃记录与退出码不变),另加一条等长的二进制守卫,把 opentui 的 CPR 守卫泛化成"出现第二个 ESC 就丢弃"。

wrapper 补齐与两个管线缺陷

v2 wrapper 此前只有 2.0.23–2.0.27,v1 只有 1.18.32–1.19.4。本次补齐到两代各自连续:

补齐时修掉两个真实缺陷:

  1. family-v2-wrapper 从不获取 glibc tarball——它只"期望"文件已存在,2.1.x/2.2.x 因此全线 RC=2。现改为缺件时自动 npm pack。
  2. wrapper-native 硬编码包内路径 package/bin/opencode,而 2.0.19–2.0.22 的布局不同,tar 直接失败。现有回退查找并把实际成员名打印出来。

同时清理了此前误命名的 opencode1-wrapper_2.1.* / 2.2.*(v2 版本被 v1 脚本打包)。

验收

平台 判据 结果
Android 9 / kernel 3.18.140 POST /api/pty 返回真实 zsh 进程 通过
Android 9 / kernel 3.18.140 serve / TUI / 键入 / 15 秒回归 通过
Android 16 / kernel 6.6.118 --version、serve 启动、POST /api/pty 返回运行中进程 通过
全平台 v1 stty 读数 -icanon、键入免回车、首屏无 rgb: 垃圾 通过
构建门 每个 v2 wrapper 的 --version 必须精确等于目标版本 43/43
资产对账 远端 digest 与本地 sha256sum 逐条比对 116/116,0 缺 0 错

安装

curl -fsSL https://hope2333.github.io/repo/install.sh | sh -s -- --install opencode

pacman -S opencode     # v2 主线(或 opencode-wrapper)
pacman -S opencode1    # v1 主线(与 v2 并存)
pacman -U opencode-2.2.5-2-aarch64.pkg.tar.xz
pacman -U opencode1-1.19.4-2-aarch64.pkg.tar.xz

已知问题