Skip to content

Releases: tendhearth/wechat-cc

Desktop desktop-v1.6.5

Choose a tag to compare

@github-actions github-actions released this 31 Aug 15:44

wechat-cc desktop v1.6.5

Date: 2026-08-31
Tag: desktop-v1.6.5(配套 CLI tag v1.6.5)
Scope: 表情包在线搜索 + 匿名社交层主链路打通 + 一批"看起来在工作、其实早就坏了"的基础设施修复。

升级即直接重装,状态目录不动、无需重新扫码。

这是自 v1.4.0(2026-08-18)以来第一个三平台齐全的版本 —— v1.6.1 起
CI 构建因更新签名密钥缺失而必挂,1.6.1/1.6.2/1.6.4 只能在维护者的 Mac 上
手工构建,Windows 用户始终没有可用安装包。本版起 CI 恢复出包。

表情包:在线搜索

CC 现在能在本地表情库不够用时上网找图(GIPHY 源,可插拔),并按 K 收敛
策略优先本地、逐步补齐;新增候选挑选与反馈学习,发失败后会释放冷却而不是
把这一轮浪费掉。

匿名社交层:双 NAT 的两台机器第一次能真正牵上线

这一层的加密、内容盲、二跳中转早就造好了,但主链路上断着两环,双 NAT
场景(也就是信箱传输存在的理由)始终走不通:

  • 揭晓走信箱:对端没有 url 时,主动揭晓此前直接放弃(标注 deferred),
    于是两台 NAT 后的机器能互看明信片却永远牵不上线。现在异步投递,互揭
    判定改为从本地两行推出;对端先揭晓时它的 handle 从"丢弃"改为"立即落盘"
    —— 旧实现靠同步响应补送,而信箱没有这次补送。
  • 二跳转发不再 push-only:朋友的朋友在 NAT 后同样收得到转发的心愿。
  • mailbox 轮询挂死:超时定时器只包住请求、没覆盖响应体读取,对端发了
    头卡住 body 就永久挂死(真机实测一次卡满 11 分钟)。影响配对、社交发送、
    轮询三条路径。
  • 社交往来开始落 a2a_events(亲密度排序此前在读一张永远空的表);给
    proto v1 对端发心愿时留下告警(此前版本不兼容是纯静默);委派超时从
    300s 降到 240s(hand 侧 Bun 上限 255s,原值会让超时被误报成"连不上")。
  • 新增信箱元数据暴露面的特征测试:内容盲一直有测试守,元数据边界此前
    一条都没有。

后台 LLM 用量:静止状态归零

伴侣记忆的三个清扫器此前对"判过但结论是不动"的库存每 25 分钟原样重判,
静止时也固定烧约 280 次调用/天。现在每次判定记录内容指纹,库存没变就零
调用跳过;并新增后台调用前的网络预检(端点不可达就跳过,不再冷启动一个
注定撞网的 CLI)。真机实测:agy 启动次数 111 次/天 → 0。

副作用是修掉了"重启电脑后浏览器老弹 Google 登录页"——那从来不是登录丢失,
是网络未就绪时 agy 误触了交互式 OAuth。

可靠性 / 修复

  • agy 的 32 个微信工具首次真正接通:命名空间里的冒号让 agy 按
    ^[a-zA-Z0-9_-]{1,64}$ 拒收了全部工具,provider 上线以来一直靠纯文本
    兜底(拒收 32 → 0 真机验证)。
  • launchd 启动的 daemon 保留运行时 PATH;daemon 识别自身不再依赖进程表查询。
  • wechat-cc doctor 新增卫星仓库检查:plugins/* 是被 gitignore 的符号
    链接,主仓库不会提醒隔壁仓库有未推提交(一个插件仓库曾因此分叉六周)。

工程基础设施(不影响功能,但影响以后每一次发版)

三条早已失效的反馈信号同时恢复:

  • dev CI 近 100 次推送全红 —— 元凶是一行:测试夹具把假路径写死成
    /tmp,而 Linux 的 tmpdir() 恰好就是 /tmp,断言恒假(macOS 一直绿)。
  • e2e / e2e-browser 长期红 —— 前者是文案人话化后测试正则没跟着改;
    后者 19 条红全部源于 8-24 的界面重构(日志收进「后厨」、客户回顾并入
    待办),功能一个没丢,是测试没跟着搬家。顺带补上了待办的 e2e(它接替
    了客户回顾却零覆盖)。
  • CI 构建自 v1.6.1 必挂 —— 更新签名私钥现挂在带必需审批的
    release-signing 环境上(私钥能让所有已安装 app 自动运行任意代码,不
    适合放仓库级 secret);Windows 的 PE 子系统翻转改为幂等(Bun 已修好
    --windows-hide-console,旧断言反而把构建挂了)。

wechat-cc 1.6.2

Choose a tag to compare

@ggshr9 ggshr9 released this 27 Aug 02:52
7d2803f

随身 CC(手机随身页 + 出门也能用)、换大脑不断片、设置面板远程一键开关、大脑区排障化。

Desktop desktop-v1.3.8

Choose a tag to compare

@github-actions github-actions released this 14 Aug 16:55
9ba455a

wechat-cc desktop v1.3.8

Date: 2026-08-14
Tag: desktop-v1.3.8
Scope: Knowledge Kernel — the owner's knowledge moves from ..-reading plugin sidecars into a daemon-owned in-process substrate. Plus a styled macOS installer window. No dashboard UI changes.

Upgrading is a straight reinstall — the state directory (~/.claude/channels/wechat/) is untouched, so no QR re-scan.

What changed

Knowledge Kernel (the bulk of this release)

The understanding layer used to be three Python plugins (wxfacts, wxperson, wxgraph) reaching across .. into each other and into wxvault's decrypted output. That's gone. The daemon now owns a knowledge substrate directly:

  1. Phase 0/1 — substrate + semantic search. source.db + semantic.db behind an admin-only Knowledge API, a source adapter that decodes and normalises wxvault's output once (WAL-safe immutable open), an in-process indexer driving a plain Python embed subprocess over JSONL, and TS cosine + FTS + RRF search with provenance built in. Vectors are isolated by model_id, so mixed-dimension corruption is structurally impossible.

  2. Agent-facing search. A knowledge_search MCP tool (admin-only) plus query embedding on /v1/knowledge/search. One daemon-owned singleton embedder serves both the indexer and the query path, so index and query always embed with the same model by construction. The prompt bullet is gated on the embedder actually being available.

  3. Graph layer in-process. A numeric-faithful port of wxgraph's closeness / edges / owner-resolution / queries, reading source in-process; graph.db rebuilds on the cycle. Enriched source now covers all message types plus kind / is_group / mentions / contacts.

  4. Facts + person layers in-process. Agent-driven fact extraction and the unified person brief move off wxfacts / wxperson; companion-ingest auto-extraction is re-pointed at the in-process FactsApi.

  5. Consumers re-pointed off the retired plugins. The agent-social grounded judge now does an in-process kernel fact fetch fed to cheapEval — provider-agnostic, no subprocess spawn, no tier hack. distillOwnerKnowledge (the knowledge.md social-state digest) moves onto FactsApi.findFacts + GraphQueryApi.topContacts, fixing a silent knowledge.md regression introduced by the plugin retirement.

  6. Hardening. upsertFact merge uses || rather than ?? for kind / related_contact / time_ref, so re-recording an empty string no longer clobbers a filled value. The social judge's grounding call is wrapped so a synchronously-throwing ground() degrades to "judge runs blind" instead of escaping — fail-closed, safety-critical.

Upgrade crash on databases from a pre-merge dev build (issue #79)

A database that ran the customer-review feature branch before it merged stores user_version=21 meaning "customer-review analysis metadata applied", while the released migration runner reads 21 as "social forwarding hop applied" and resumes at v22 — which ALTERs social_relay, a table that database never created. The daemon then crash-looped on boot with no such table: social_relay.

The runner now detects that specific state before the migration loop and rewinds to the fork point so the normal v19–v28 migrations rebuild what is missing, preserving the customer-review rows already written. It could not be an appended migration: the crash happens at v22, so the loop never reaches one.

Scope, because the issue overstates it: installs that only ever ran published releases are unaffected — migrations v1–v21 are byte-identical between desktop-v1.3.2 and today apart from one comment's wording. Only databases that passed through the pre-merge branch build carry the mismatch.

A new guard pins the schema each released migration produces, so a branch cut from a stale base fails in CI rather than on a user's machine.

codex: stop refusing a CLI that is only a patch ahead

Two independent fixes for "I upgraded codex and wechat-cc stopped talking to it":

  1. The SDK auto-realign never ran. It spawns bun add to match the bundled SDK to your CLI, but spawned a bare bun and relied on PATH — and the daemon runs with a minimal launchd/systemd PATH that does not include ~/.bun/bin. Every attempt failed with bun not found on PATH. bun is now resolved by absolute path across the same install locations the codex binary already searched.
  2. The version gate was too strict. It required exact equality, so a CLI that self-updated 0.144.5 → 0.144.7 lost the codex provider entirely. Measured across four real dispatches — every combination of SDK/CLI 0.144.4 and 0.144.5, both mismatch directions — a patch gap does not break the wire protocol. The gate now tolerates patch differences within the same major.minor. Minor and major gaps stay refused (the original silent-failure report was a minor gap), and prereleases still require exact equality.

The standalone installer OpenAI recommends self-updates on startup, so this happened to users without them doing anything.

federated source (opt-in)

wechat-cc can expose a slim federated_query-only MCP surface to hearth, gated behind an explicit consent grant (authorize/deauthorize/status CLI, 0700 state dir, 0600 grant file, operator-token minting scoped to the grant). Off unless you authorize it.

agent-social

Seeker-side discover and forward fan-out are now ranked by peer interaction closeness (recency + volume + reciprocity, read from the existing a2a_events log) instead of an arbitrary slice(0, 5). Pseudonymous — no wxid involved, observability data only. Eligibility filters and the disclosure gate are unchanged.

memory-infra Phase 1 (off by default)

wechat-cc can distill its WeChat knowledge into a hearth ChangePlan and push it into hearth's markdown vault over MCP, with hearth governing validation / apply / citations / audit. Feature-detected and opt-in: hearth_enabled=false is the default and means zero behaviour change.

macOS installer

The .dmg now opens to a real install window — background artwork, 660×400, app on the left, Applications on the right — instead of a bare Finder listing. Root cause of the old bare dmg: tauri-bundler appends --skip-jenkins to bundle_dmg.sh whenever CI=true, which skipped the entire Finder/AppleScript step that applies background and icon positions.

First-launch instructions changed. The bundle is ad-hoc signed and not notarised, and "right-click → Open" stopped working for unnotarised apps in macOS 15. The real path is System Settings → Privacy & Security → Open Anyway. The dmg background says so, in Chinese and English.

Notes

  • Retired plugins. wxfacts, wxperson and wxgraph no longer supply tools; their capabilities are in-process. wxvault is unaffected and still required.
  • Semantic search availability. knowledge_search and the corresponding prompt bullet appear only when the embedder is genuinely available; without it the rest of the kernel still works.
  • Windows / Linux. No platform-specific changes this release; bundles are rebuilt against the current CLI.

Install

Platform File First launch
macOS (Apple Silicon) *.dmg Drag to Applications, then System Settings → Privacy & Security → Open Anyway (once)
Windows (x64) .exe (NSIS) or .msi SmartScreen → More info → Run anyway
Linux (x64) .deb / .rpm No warning

Desktop desktop-v1.3.7

Choose a tag to compare

@github-actions github-actions released this 28 Jul 08:07
f807703
release: desktop v1.3.7 — 一个 dev server + 客户回顾工作台 (#78)

## 面向用户

**客户回顾工作台**(莫秀文)—— 从本机微信归档里抽取"承诺"(如"我周五前把方案发你"),标出有聊天依据的待办,可确认/修订。需要
wxvault 插件。
**桌面水族箱陪伴交互**(莫秀文)。
**文件搜索收紧**:agent 的文件搜索不再默认搜 `~/Documents` 等目录,必须传明确路径。这是行为变更 ——
如果你习惯让它"帮我找预算表",现在需要说清楚在哪找。

## 安全与稳定(本次发布前评审所修)

`45a5211`(60 文件/8238 行)此前从未经过第二双眼睛。发布前做了三方独立评审(daemon 核心 / API 权限层 /
桌面前端),共修复 19 条:

- **admin operator token 曾进入 webview 的 JS 堆** —— 此前它被刻意关在 Rust 宿主里。新增
`customer_review_api` 宿主命令把它关回去,并删掉 CLI 的 `--operator` 口子。(降成 trusted
的方案经查危险:普通聊天会话就是 trusted 级。)
- **daemon 启动被 wxvault MCP 握手拖住**,无超时、部分路径抛错会让 daemon 直接退出 ——
最坏两分钟微信侧失联。
- **`api.js` 把整个桌面所有 POST 变成失败即重发**(含超时)—— 会导致同一封笔友信投递两次、记忆综合跑两遍。
- 客户回顾自身:静默截断成最旧 2000 条却报成功、一句话两个承诺丢一个、分析中重启永久卡死、未结承诺超 40
条炸掉整次分析、wxvault 快照被钉死在启动那一刻。
- 前端:wxvault 没装被说成"稍后再试"(永远不会好)、改到一半的草稿被其它操作冲掉、重新分析失败时毫无反应。

## 开发者

`dev-server.ts` 与 `test-shim.ts` 合并为一个 dev server,四个显式入口:`dev`(Tauri
应用)/ `dev:web`(浏览器 + 真 CLI + 真 daemon)/ `dev:mock`(Playwright)/
`dev:unsafe`。浏览器模式默认只转发已知只读的 CLI 命令(`dev-guard`),`/__invoke` 拒绝跨站。

## 验证

CI 三平台绿;全量 3993 通过;`bunx tsc --noEmit` 干净;`cargo check`
通过;customer-review e2e 8/8;desktop Playwright 与合并前逐条一致。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: 莫秀文 <moxiuwen@moxiuwendeMacBook-Pro.local>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

桌面 v1.3.5 — 全异步发现 + 笔友信箱

Choose a tag to compare

@github-actions github-actions released this 23 Jul 10:42
91b1c32

wechat-cc 桌面 v1.3.5

⚠️ 重要:社交发现需全网升级

本版起,匿名社交发现协议升级到 v2——同步回音已退役,回音改走异步 /a2a/echo老版本(v1)的求方对新版收方收不到任何回音。如果你在用社交/觅食功能,请确保配对的朋友也升级到本版,否则派出去的心愿收不到回应。

新增

  • 全异步发现(discovery-over-mailbox):心愿(seek→echo)全面异步化。双 NAT 的配对朋友现在能互相收到心愿了——发现全链路 NAT 容忍。收方快速确认、后台判断匹配,不再让请求挂着等。
  • 笔友信箱:觅食台新增 ✉️ 信箱区块——已牵线的笔友列表、点开看往来信、直接回信(信件内容中间人看不到,端到端加密)。

修复

  • 觅食台配对/心愿的多处真机问题:信道卡点击、回信草稿被刷新吞掉、已结束心愿的显示、派心愿的判断超时。
  • 社交读取权限修复(此前部分读操作在真机上被误挡)。
  • 信件发送失败重试不再可能重复投递。
  • 语音判断在插件未就绪的机器上不再空跑(诚实回落)。

安装包:macOS(Apple Silicon .dmg)、Windows(.exe / .msi)、Linux(.deb / .rpm)。

Desktop desktop-v1.3.2

Choose a tag to compare

@github-actions github-actions released this 17 Jul 13:47
f54a579

Desktop v1.3.2

自 v1.3.1(07-08)以来的两个大批次(PR #67 / #68):

亮点

  • 觅食台社交栈:异步觅食脊椎(非阻塞 seek、行驱动双向互揭、/a2a/reveal)+ 转发跳(朋友的朋友,介绍人代理揭晓)+ P1/P2 状态与读面
  • 安全修复:社交 echoes 揭晓前脱敏、seen-intent 防 DoS 去重、文件搜索显式根目录
  • companion 全家桶:拆条回复、主动关心+校准、表情包、daily hunt、persona 养成、onboarding
  • 语音:app 内语音进出(STT/TTS)、会话通道分离
  • 记忆:core-memory 注入、知识摄取引擎、memory gardener
  • provider:openai-compatible + Gemini 后端、provider 无关的 grounded judge
  • 可靠性:连接归属检测(杀假连接)、心跳锁、WAL 重启重试、bootstrap 合成根拆分、A2A proto_version
  • 分发:桌面包强制捆绑 wxvault、MSI 兼容、sidecar 随 CLI 编译

安装包:macOS (aarch64 dmg) / Windows (exe + msi) / Linux (deb + rpm),均已捆绑 wxvault 插件。

Desktop desktop-v1.3.1

Choose a tag to compare

@github-actions github-actions released this 08 Jul 13:32
fix(desktop): allow the daemon origin in CSP connect-src — plugins/Ag…

v0.5.17

Choose a tag to compare

@ggshr9 ggshr9 released this 11 May 15:18
ed34cc3

v0.5.17 — AI provider failure modes: real-user "Not logged in" leak, codex version trap, /reset recovery

Date: 2026-05-11
Tag: v0.5.17 + desktop-v0.5.17
Scope: Patch release driven by a single user-reported screenshot — the WeChat bot was replying with the literal string "Not logged in · Please run /login" as if it were the AI's answer. Excavation surfaced two distinct failure modes plus the absence of any user-facing recovery affordance. Both modes now have structural fixes; users get a recovery surface for the residual cases.
Predecessor: v0.5.16 — four real-user reports, four surgical fixes


TL;DR

Three classes of failure addressed, plus the missing recovery surface:

  1. claude provider leaks the OAuth-stale sentinel as a chat reply — long-running stream-json subprocess holds tokens from startup, the user's interactive claude rotates keychain credentials underneath, the daemon's subprocess can't refresh and emits the binary's "Please run /login" text as assistant content. Verified by inspecting the binary's string table. Provider now intercepts and routes a structured errorCode: 'auth_failed' to the coordinator; coordinator suppresses the leak and self-heals via session release. Covers all four dispatch paths (solo, parallel, chatroom speaker, chatroom moderator).
  2. codex CLI ↔ SDK protocol mismatch silent no-reply — a globally-installed codex CLI at a version different from the bundled SDK silently emits events the SDK can't decode, every dispatch returns empty assistantText, no reply ever reaches the user. The fix in find-codex-binary from v0.5.6 only worked for plugin installs; the desktop installer still hit this. Boot now compares codex --version against the bundled @openai/codex version and refuses to register the provider on mismatch — loud [BOOT] log instead of silent failure.
  3. SessionManager.sweepIdle() was dead config — the method existed but was never called from production paths, so idleEvictMs: 30 * 60_000 did nothing. Wired to a 60 s setInterval. Long turns are protected by an in-flight counter so a mid-stream dispatch isn't killed by the timer.
  4. Recovery affordance/reset (/重置) drops every registered provider's session for the current chat; next message starts fresh. /health ai shows per-provider session age. wechat-cc doctor now reports the installed claude --version and codex --version.

What changed

1. claude auth-fail sentinel interception

  • 7a52114 fix(provider): stop leaking claude "Not logged in" as chat reply + wire idle sweep (PR #32 first commit)
    Provider intercepts assistant text matching Please run \/login or Not logged in and emits { kind: 'error', code: 'auth_failed', message } instead. Coordinator's dispatchSolo branches on summary.errorCode === 'auth_failed' to suppress the fallback-reply path and send one neutral notice (AI 暂时不可用,请在 wechat-cc 桌面端检查并重新连接) throttled to ≤ 1/hour/chat. SessionManager.sweepIdle() finally wired to a 60s setInterval (the method existed but was never called from production paths). .unref() so the timer never holds the event loop.

  • 65660ac fix(p1.5): four review findings — self-heal, in-flight safety, sentinel coverage, codex version gate
    Round-1 review surfaced four real issues. Coordinator now releases the session on auth_failed so busy chats self-heal automatically (without this, a chat that keeps bumping lastUsedAt never goes idle and stays broken for the full window). SessionManager.sweepIdle skips sessions with an in-flight dispatch (long turns no longer killed mid-stream). AUTH_FAIL_RE broadened to catch the split-chunk case where the SDK emits "Not logged in" and "/login" as separate assistant events. Bootstrap refuses to register codex when codex --version ≠ bundled @openai/codex version.

  • 2793404 fix(p1.6): two round-2 review findings — semver prerelease + close-propagates contract
    Round-2 review caught the SEMVER regex silently mangling 0.128.0-rc.1 to 0.128.0. Widened to capture optional -prerelease. Added a regression test pinning the close()-propagates-to-iterator contract that the in-flight counter relies on.

2. /both, /chat, and moderator coverage

  • 94c7bcb fix: plug auth_failed in /both + /chat paths, harden moderator, Tauri bundle probe (PR #33)
    Post-merge audit of PR #32 found only dispatchSolo was reading errorCode. /both (parallel) and /chat (chatroom) had the same gap — provider correctly intercepted the leakage but coordinator didn't release the failing session, so a stale-credential provider stayed cached for 30 min with every dispatch silently producing no reply from that side. The chatroom moderator's own haiku-4-5 call shared the same credential chain and silently degraded to alternation when stale. All four paths (solo, parallel, chatroom speaker, chatroom moderator) now intercept consistently. find-codex-binary derives the macOS .app/Contents/Resources/ path from process.execPath and probes a bundled codex shim first when available — code-level wiring ready for the build-system follow-up that ships @openai/codex inside the Tauri bundle.

3. Admin recovery commands

  • e9698bc feat(admin/doctor): /reset + /health ai in-chat, plus CLI version probe (PR #32 second commit)
    In-chat operator affordances. /reset (and the Chinese alias /重置) iterates the registry and calls sessionManager.release(alias, provider) + sessionStore.delete(alias) so the next dispatch starts from clean state. /health ai lists per-provider session age — pure bookkeeping inspection, no token. wechat-cc doctor adds a probeBinaryVersion helper that runs claude --version and codex --version via spawnSync (3s cap) and surfaces both in the report — gives support flows a one-glance signal for the SDK↔CLI mismatch trap.

4. Acceptance script

  • 2ced13e + 213f2dc test(acceptance): end-to-end harness for the four manual-acceptance checks + typecheck fix
    Self-contained smoke at scripts/acceptance-p0p1.ts. Boots an isolated daemon (does not touch production state), exercises each user-facing path: auth_failed sentinel never leaks; coordinator releases session + sends throttled notice; /reset / /health ai operate against real bootstrap-wired SessionManager; codex version mismatch refusal at boot. PR #33 extended to seven scenarios covering /both, /chat speaker, and chatroom moderator. Not wired into CI — operator-grade smoke for re-verification when refactoring this area.

How to apply

After updating to v0.5.17:

  • You don't need to do anything for the common case. The daemon now auto-recycles a stale session on the next message; most users won't see any user-visible signal of the underlying recovery.
  • If you see ⚠ AI 暂时不可用... — most likely transient; the daemon is mid-recycle. Send /reset if it doesn't resolve on retry, or check wechat-cc doctor for the underlying status.
  • If wechat-cc doctor shows codex at a version different from the bundled SDK — the BOOT log will refuse to register codex. Run npm i -g @openai/codex@<expected-version> (the boot log includes the exact version), or remove the older codex from PATH. Restart the daemon.

Behind the scenes

A look at the iteration depth: this release went through four review rounds (P0 → P1.5 → P1.6 → P1.7) before reaching merge, with one Claude code-reviewer and one Codex independent reviewer agreeing on findings at each step. The cycle surfaced:

  • Round 1 (P0 → P1.5): four issues the P0 fix didn't cover — most critically, the coordinator wasn't releasing the session on auth_failed, so a busy chat could never self-heal (lastUsedAt keeps bumping → sweepIdle never fires).
  • Round 2 (P1.5 → P1.6): SEMVER regex silently mangling prerelease versions, plus a contract-level concern about the in-flight counter that turned out to hold in practice for our providers (regression test pins the contract for future provider rewrites).
  • Round 3 (P1.6 → P1.7): only the solo dispatch path was covered — /both, /chat, and the moderator's own query had the same structural gap.

The "cc-connect reset_on_idle_mins" pattern was the design north star — explicitly chose idle-reset + reactive interception over spawn-per-dispatch after surveying how chenhg5/cc-connect and similar projects on GitHub handle the same class of problem. Keeps warm-start performance; reactive interception + auto-release covers the busy-chat edge case.

What's still pending

  • Desktop dashboard "AI 状态" tile + Reset / Sign-in buttons — separate UI-focused PR. The internal-api routes will land alongside the Vue rendering.
  • Tauri build-config to ship @openai/codex in Resources — the find-codex probe is ready; needs a per-platform bundle entry in tauri.conf.json.
  • WarmQuery pool — only if measured cold-start ever shows up in real usage.
  • haiku-eval empty-response handling — not auth-related; rate-limit/network-empty case currently silently degrades to alternation. Reviewer flagged as a separate class of failure to address later.

Tests

  • 17 new unit tests across the release line, all TDD'd (RED before GREEN, except one tests-after regression-pinning test in P1.6 which is flagged in its commit message).
  • 1654/1655 vitest pass (the 1 send-reply preflight network timeout fails on master too — pre-existing flake, unrelated).
  • typecheck clean.
  • 9/9 playwright e2e green (apps/desktop/playwright).
  • 23/23 acceptance harness assertions pass against the host's live codex 0.125 ↔ SDK 0.128 mismatch.

Desktop desktop-v0.5.17

Choose a tag to compare

@github-actions github-actions released this 12 May 05:11
ed34cc3
Auto-mirrored from v0.5.17

Desktop desktop-v0.5.16

Choose a tag to compare

@github-actions github-actions released this 11 May 00:16
Desktop v0.5.16 — four real-user reports + cumulative v0.5.15 silence…