Skip to content

v0.0.41

Choose a tag to compare

@github-actions github-actions released this 12 Oct 10:25
· 207 commits to main since this release

v0.0.41 发版说明(Codex Harness Desktop)

本版主题:语音播报收干净(停止真停 + 每回合限长 + 状态条重做),外加工具链在线更新与自动化通道修正。

版本号说明(请先看这条):本版是 0.0.41 而不是 0.0.40。
0.0.40 的构建流程曾被取消,GitHub 上那个 Release 没有上传任何安装包(下载链接全部 404),
因此没有任何人拿到过 0.0.40。为避免「同名 Release 退回草稿、应用内更新器永远收不到这一版」,
本版顺延为 0.0.41 直接发布。上一版实际可用的是 0.0.39。


一、修了什么

1. 语音播报:点「停止」现在真的停

现象:按了「停止」之后播报还在继续;模型越是勤快插播,越按不住。

根因:stopPlayback() 过去只掐断了「此刻正在响的音频」和「队列里已排好的」,但三条入口仍然活着:

# 漏掉的东西 后果
① speakLiveRef 没清 下一句正文 delta 到达,照常合成照常念
② 自动播报计数器没重置 「单回合工具调用 > 10 次 / 同一处返工 ≥2 次」硬规则下一帧又命中,把本回合重新标成「念正文」
③ 模型的插播工具不受管 模型再调一次 voice_announce,toolSpeak 分支无条件入链

修法:引入静音闩锁。按停时同时掐掉上面三条,之后所有播报(正文实时 / 工具插播 / 结束播报稿)在唯一入口被拦下。闩锁只在两个地方解除:

  • 状态条上的「恢复」按钮(按停后状态条常驻,不再 1.6 秒自动消失);
  • 用户把「语音播报」总开关重新打开。

⛔ 刻意不跟回合结束自动解除——用户按停的语义是「我现在不想听」,下一回合又自动开口等于白按。

2. 语音播报:每回合限长(不再一直播下去)

现象:播报动辄一两分钟。

根因:原先只有「队列长度」上限,而正文朗读是一条无界流——只要触发一次全文朗读(模型主动要求,或命中上面那条硬规则),正文吐多少念多少,队列永远不满,背压形同虚设。

修法:

  • 新增每回合 160 字总预算(三种播报共用),超出不再念,并顺手关掉本回合的正文朗读;
  • 播报稿上限 240 → 120 字(硬顶 600 → 220);
  • 插播工具上限 120 → 80 字;
  • 引擎侧指令同步收紧(~80 → ~50 字),并写明「超出的部分根本不念」——从源头把长度收住。

3. 语音播报状态条视觉重做

用户反馈「这个语音播报真的有点丑」,逐条整改(其中两条是真 bug):

  • ⛔ 停止按钮漏了 appearance: none —— 全站没有 color-scheme 声明,暗色下原生 <button> 由浏览器按浅色 UA 绘制,在深色胶囊上就是一块突兀的白疙瘩;
  • ⛔ 条子宽度被写死至少 280px —— 没有正文时就是一条空胶囊 ⇒ 改为贴合内容;
  • 点击区 22 → 32px(原先偏难点中);字号 11.5 → 12px;
  • 底色 --bg → --panel(输入框本身就是 --bg,同色会与输入框糊成一块);
  • 文案去掉重复的「正在」二字(呼吸圆点 + 喇叭图标已表达),补键盘焦点环与「减弱动效」支持。

4. 技能 / 插件 / 自动化工具在线更新

设置页新增检查更新与更新按钮:

  • nuphus(桌面自动化)与 browser-skill(浏览器自动化):走「用户配置的 registry → 国内镜像 → 官方源」依次尝试;
  • 技能:按内容指纹逐文件比对(SHA256),只提示真正有变化的部分;
  • 插件:按版本号比较。

5. 浏览器 / 桌面自动化改走命令行通道

现象:任务跑到一半自己断了,且伴随 unsupported call 报错。

根因:当前引擎版本(0.157 起)把内置 MCP 工具延迟暴露给模型——工具列表里看得到,一调用就报不支持。此前指令却把 browser_* 写成「首选」、命令行写成「兜底」,弱模型(deepseek 系)不会去核对工具列表,直接照首选调 ⇒ 失败 ⇒ 换招重试 ⇒ 整个回合耗死在工具选择上。

修法:主线改为命令行通道(playwright-cli / nuphus-call),并明确要求失败立即切换、不要重试、不要反复换通道。

6. 更新源按产品线隔离

同一个仓库里有两条产品线的发布,而 GitHub 的「最新发布」是按发布时间算的:

产品线 版本标签 安装包名前缀
Codex Harness Desktop(本产品) v* Codex.Harness.Desktop-*
Codex Harness Assistant(云助手) cloud-v* CodexHarnessAssistant-*

本版起桌面版只认自己的产品线(版本标签 + 安装包前缀都过滤),云助手的版本再新也不会被当成本产品的更新提示(此前会误报「有新版本 0.0.3」,装上去的却是云助手)。

7. 引擎升级到 0.162.1

npm 声明与实际二进制版本对齐,防止重装时被回退到旧引擎。

8. 移除了「回合没干完就收工」的宿主自动接手

上一轮加过这个自动接手(判定回合结尾像是要收工时,宿主自动续发一轮)。实测它会把正常完成的长报告误判成「宣布下一步」,于是任务跑完后宿主又多发一轮,用户看到凭空多出来的消息。误判的代价大于漏判,已整条删除,只保留提示词层的回合连续性规则。


二、mac 适配审计结论

审计脚本:node scripts/mac-audit.mjs v0.0.39,范围为本版新增行(历史实证:真缺口都在新增行里)。

命中 7 条,逐条判读后真缺口 0 条。

命中类别 条数 判读
exe 3 automation-policy.ts:21 是注释里说明实测枚举用的 nuphus-mcp.exe,非可执行路径;updates.ts 两条位于平台分支内——mac 走 darwin 分支(取 *-mac-<arch>.zip),.exe 那条在 else 里,mac 走不到。
backslash 2 skills-market.ts 的两处是归一化写法:一处用 [\\/] 正则同时吃两种分隔符,另一处显式 replace(/\\/g, "/") 把展示路径转成正斜杠 —— 正是为跨平台写的。
powershell 1 developer-instructions.ts 的提示词文本,且原文就限定 on Windows PowerShell,未对 mac 承诺任何行为。
ctrl-key 1 同为提示词文本,且同一句里已写明跨平台写法:Ctrl+V on Windows, Cmd+V on macOS — never hardcode one platform。
win32 / darwin / winpath / appdata 0 平台门控、Windows 绝对路径硬编码、环境变量直读均无命中。

⛔ 脚本自带正则自证(0 命中与「正则写坏了」输出完全相同),本次逐条读过命中行原文,不是只看计数。


三、安装

Windows:下载 Codex.Harness.Desktop-0.0.41-win-x64.exe → 双击安装(覆盖安装无需先卸载,安装器会自动关闭旧版)。

macOS:下载对应芯片的 zip(Apple 芯片 arm64、Intel x64)→ 解压 → 把 Codex Harness.app 拖进「应用程序」。

首次打开若提示无法验证开发者:

  1. 打开终端,输入 xattr -cr (末尾有空格);
  2. 把 app 图标拖进终端——会自动补全路径(用户往往不知道自己的路径,写死的老文案会再次被带出来);
  3. 回车执行,再双击 app 即可。

错误码 640 = 「无法验证开发者」,是 Gatekeeper 拦的,不是包损坏。

注意:electron-builder 在 mac x64 上产出的资产名不带 x64(形如 …-mac.zip),CI 会强制规范化为带架构名的形式,否则 Intel 用户永远匹配不到资产(症状是静默「已是最新」)。


四、已知问题

  • 工具链(Node / Python / rg)按需下载的服务端分发目录仍在准备中:MCP / 脚本类能力可能降级(引擎与对话不受影响)。
  • 语音播报在通话中仍由通话链路负责朗读(电话里必须把回复念出来),与本次的播报开关、静音闩锁互不干扰。