Skip to content

v0.0.33

Choose a tag to compare

@github-actions github-actions released this 07 Oct 10:44
· 500 commits to main since this release

v0.0.33 发版说明

发布日期:2026-10-07 | 基线版本:v0.0.32 | 提交范围:v0.0.32..HEAD

这是一版纯修复版:功能与 0.0.32 完全一致,没有增删,只修掉 0.0.32 发布后才暴露的三个问题
(Windows 随包 npm 缺失 / 思考板块缩放闪烁 / macOS 上 npm 路径被写死)。
如果你还没装 0.0.32,直接装本版即可;如果已经装了 0.0.32,强烈建议更新 —— 它带着下面第一个问题。


一、修了什么

1. 「开发工具 / 知识库」里的安装全部失败(打包版专属)

现象:0.0.32 的安装版里,凡是需要装东西的入口 —— 开发工具(浏览器自动化、命令行工具等)、
项目知识库的语义后端安装 —— 一律报错,典型提示是「内置 Node 缺少 npm」。

根因:打包时把随包内置的 npm 整个丢掉了。

项目会在安装包里带一份独立的 Node 运行时,好让你不装 Node 也能用这些能力。这份运行时里除了
node.exe,还有 node_modules/npm(npm 本体)。而打包工具 electron-builder 有一条硬规则:
它会无条件丢弃每个随包目录「根一级」的 node_modules(见 app-builder-lib/out/util/filter.js)。
resources/tools/node 这个目录的 node_modules 正好踩在这条规则上 ⇒ 打出来的应用里有 node.exe,
却没有 npm。所有依赖 npm 的安装动作自然全挂。

为什么之前没发现:开发态(你直接跑源码)是从项目目录里读这套工具的,npm 一直在,本地永远复现不出来;
macOS 侧的打包走的是另一条「整目录拷贝」的路,也不受影响。只有 Windows 打包版会中招,
而当时的打包后自检只检查了「node.exe 在不在」,从没检查过 npm —— 于是它报了「全部通过」。

修法:给随包目录补一条独立映射,让 npm 能被单独带出去:

{ "from": "resources/tools/node/node_modules", "to": "tools/node/node_modules" }

重打包实测:随包目录 106 MB(修复前 89 MB,与源目录一致)、node --version → v24.19.0、
npm --version → 11.17.0、npm help 正常输出。

防复发(两道闸,都落在仓库里):

  • 打包后自检(scripts/verify-packaged-tools.cjs,CI 会跑):从「断言 node.exe 存在」升级为
    断言 npm-cli.js 存在、并真的执行一次 npm --version。这条闸本该拦住 0.0.32,此前形同虚设。
  • 结构守卫【27】:新增一条硬断言 —— 只要随包目录带根级 node_modules,就必须配独立映射;
    同时把【29】的「随包源必须能由 CI 现场造出」判据泛化,姊妹映射按其父目录判定。

2. 思考板块缩小放大来回闪 / 明明在思考却不展开 / 上一块闪一下缩放

现象(你报的三条,其实是同一个根):

  • 深度思考时,思考板块经常缩小、放大来回闪,可头部明明一直写着「正在思考中」;
  • 出现**「不自动展开」**的情况;
  • 上一段思考已经输出完了,下一段出现时,它还会闪一下缩放。

根因:思考内容是引擎按大块下发的,块与块之间必然有间隙。而思考卡把「这一批吐完了」
误当成了「这一块结束了」⇒ 于是每批吐完就收一次浮窗(缩)、下一批到达再开一次(放)。
用组件级探针实测:单个思考块直播期间,放大 10 次、缩小 10 次,卡片状态在
展开 ⇄ 收起 之间反复横跳 —— 正是「来回闪」与「不自动展开」两条现象的直接来源;
第三条则是引擎侧自动收起时也播了缩放动画(你没做任何操作,却看到上一块缩了一下)。

修法(src/features/shared/ReasoningCard.tsx,四处):

  • 判定改口径:「这一批吐完了」不等于「这一块结束了」 —— 只要本块还在直播,就不收浮窗;
    收与不收只由「本块直播是否结束」这一个开关决定,不再逐批开关;
  • 卡片初值的「续播」标记同样按「本块是否还在直播」判定,避免完成态的卡被重挂时凭空开-缩一次;
  • 缩放动画只在你自己点收起时播;引擎侧自动收起改为静默消失(放大不受影响 —— 那是「开始直播」的反馈)。

修复后同一探针:1 次挂载 / 0 次卸载,整块保持展开,只在结束时收一次。

防复发:结构守卫【161】新增三条断言(3750 → 3759 净行),并逐条做过变异测试
—— 把任一处修复删掉,断言立刻变红。

3. macOS 上「开发工具 / 知识库」同样装不上(平台布局被写死)

现象:与第 1 条同一个用户可见症状(安装报「内置 Node 缺少 npm」),但原因不同、只在 mac 上出现。

根因:两个平台的随包 Node 是两种解包布局 ——

平台 解包方式 npm 实际位置
Windows 官方 zip node/node_modules/npm/
macOS 官方 tar.gz node/lib/node_modules/npm/

而应用自己的两处代码(runtime-ipc.ts 的开发工具装包、kb-embed-backend.ts 的知识库语义后端安装)
各自写死了 Windows 那一条路径;mac 侧的打包是「整目录拷贝」、不做任何布局归一化
⇒ mac 上这两个功能一律找不到 npm。这是「功能被阉割」,不是体验瑕疵。

修法:把路径解析下沉成唯一真相源 toolchain.bundledNpmCli(),按候选列表探测两种布局
(与同文件里已有的 bundledGit() 同型),两处消费方都改走它,不再各自复制路径字面量。

防复发:新增三条结构断言 —— ① 包内校验脚本必须按候选列表探测两种布局;
② 不许退回单平台硬编码;③ 「npm CLI 路径字面量在主进程源码里只许出现 1 次」
(下限钉 1 挡住「真相源被删」,上限钉 1 挡住「业务文件又抄一份」)。

顺带修掉一个我们自己引入的 CI 缺陷:包内校验脚本 verify-packaged-tools.cjs 是两平台共用的,
而它也被写死了 Windows 布局 ⇒ v0.0.33 的首轮 CI 里 mac 构建 job 直接失败。
已改成候选列表探测(这也正是本版重发的原因之一)。


二、macOS 适配审计(发版清单第 0 步)

用 node scripts/mac-audit.mjs v0.0.32 扫 v0.0.32..HEAD 的新增行(10 个文件、180 行新增),
命中 5 条,全部落在 exe 一类,且都在 scripts/ 的守卫/自检文件里:

命中 判读
scripts/guards/06-app-behavior.mjs:615 无害。断言里的注释,描述「Windows 包里 tools/node/node.exe 在、npm 不在」这件事本身
scripts/guards/06-app-behavior.mjs:644 无害。断言注释里引用 node.exe / bin/node 的既有平台分支写法
scripts/guards/09-structural.mjs:1498 无害。守卫基线记账注释
scripts/verify-packaged-tools.cjs:117 无害。包内校验脚本的注释
scripts/verify-packaged-tools.cjs:133 无害。同上,说明两种解包布局

win32 / darwin / ctrl-key / backslash / winpath / powershell / appdata 均 0 条。

扫描器内置正则自证门禁(8 条正则的正/负人造样本都必须符合预期,否则直接失败退出)——
本版自证 8/8 通过,所以上面的结果不是「0 命中式」的假通过(0 命中与「正则写坏了」在输出上完全一样)。

判读结论:无 macOS 真缺口。 本版的 mac 改动方向上就是修 mac 的
(把写死的平台路径改成按候选探测),扫描命中全是注释文字,不是代码里的平台硬编码。

附:本轮自查出的一个 mac 真缺口(已修,见「一、三」) ——
应用侧 runtime-ipc.ts / kb-embed-backend.ts 曾各自写死 Windows zip 布局的 npm 路径,
而 mac 是 tar.gz 布局 ⇒ mac 上「开发工具 / 知识库」装不上。
这类缺口平台敏感模式扫描器抓不到(它没有 .exe、没有 win32、没有反斜杠),
是逐条读代码读出来的 —— 也说明审计脚本不能替代人工判读。

mac 侧的两种情况要分清(别混为一谈):

  • 本版第 1 条(随包 npm 被 builder 剪掉):mac 不受影响 —— mac 打包由 build/copy-mac-tools.cjs
    做整目录拷贝,绕开了 electron-builder 那条 node_modules 剪枝规则,npm 本来就在。
    (也正因如此,0.0.32 那个问题只在 Windows 上暴露。)
  • 本版第 3 条(应用把 npm 路径写死成 Windows 布局):恰恰是 mac 的问题 ——
    文件在,但代码去找一个不存在的路径。两个平台的表现相同(都报「内置 Node 缺少 npm」),
    根因完全不同,所以两条都必须在同一版修掉。

三、macOS 首次打开(安装包未签名,Gatekeeper 会拦)

  1. 在「下载」里解压(别在「应用程序」里解压,会报错误 640);
    报 640 就用终端:cd ~/Downloads && ditto -x -k "<zip 文件名>" .
  2. 把 App 拖进「应用程序」(别在「下载」里直接双击运行 —— 那样会被挂到只读的临时卷上跑)
  3. 右键 → 打开(不要直接双击)
  4. 仍提示「已损坏」时,终端执行(把 App 图标拖进终端窗口,路径会自动填):
xattr -cr "/Applications/Codex Harness Desktop.app"

若终端回 xattr: No such file,说明该路径下没有 App —— 用 ls -d /Applications/Codex*Harness*.app 自查。
建议留 10 GB 磁盘空间(解压占一份,首次启动还要按需下载运行时/内核)。


四、安装包

平台 文件名
Windows 10/11 x64 Codex.Harness.Desktop-0.0.33-win-x64.exe
macOS Apple Silicon (M1-M4) Codex.Harness.Desktop-0.0.33-arm64-mac.zip
macOS Intel Codex.Harness.Desktop-0.0.33-x64-mac.zip

选哪个包:苹果菜单 →「关于本机」→ 芯片写 Apple M1/M2/M3/M4 选 arm64,写 Intel 选 x64。


五、本版怎么验的

  • 打包后自检放到了关键路径上:本版起,scripts/verify-packaged-tools.cjs 会真的执行一次
    随包 npm --version
    ,不再只看文件在不在 —— 这正是 0.0.32 漏掉的那一环。
  • 修复前后各打了一次真实 Windows 包并解包比对:tools/node 由 89 MB(缺 npm)变为 106 MB(与源一致),
    node --version / npm --version / npm help 逐一实跑通过。
  • 思考卡用组件级探针验收:真实浏览器多帧计数,修复前 10 放大 / 10 缩小,修复后 1 挂载 / 0 卸载。
  • mac 的 npm 布局用合成目录独立验过:造出 Windows zip 布局与 mac tar.gz 布局两种真实目录,
    断言候选列表各自命中;再加一个「两种都没有」的负对照必须返回空 —— 3/3 通过
    (这一步不能省:断言自己说「通过」不等于逻辑对,负对照才证明判据能被违反)。
  • 两条路径的来源逐条核对过:prepare-windows-tools.cjs(zip)与 prepare-mac-tools.cjs
    (tar.gz)里 npm 的实际位置,与代码里的候选列表逐字对齐。
  • npm run check 全链跑通(余项为沙箱环境限制,非本版引入)。

macOS 侧由 CI 的 macos-14(arm64)与 macos-15-intel(x64)两个 runner 产出,走同一份
build.files 与同一套域组合表,功能与 Windows 一致。