Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
9fbe3ea
feat: add default-on live-voice override for the karlorz fork
karlorz Oct 16, 2026
0417a03
Merge pull request #1 from karlorz/feat/fork-karlorz-npm-cpa-voice
karlorz Oct 16, 2026
3e1debe
feat: lock in-app Updates to karlorz/codex-host (#2)
karlorz Oct 16, 2026
a27d307
fix: treat numeric fork counters as GitHub and npm latest
karlorz Oct 16, 2026
beca52c
chore: prepare v0.13.2-2
karlorz Oct 16, 2026
635d958
docs: record shipped v0.13.2-2 fork release path
karlorz Oct 16, 2026
ff7fe5b
feat: hide Codex usage warning and lift the usage send gate
karlorz Oct 17, 2026
8575adf
chore: prepare v0.13.2-3
karlorz Oct 17, 2026
c9da99a
Revert "feat: hide Codex usage warning and lift the usage send gate"
karlorz Oct 17, 2026
1600305
merge: sync upstream v0.13.3 and take #542 usage-gate
karlorz Oct 17, 2026
b9c4c9e
docs: retarget fork versioning to upstream 0.13.3
karlorz Oct 17, 2026
b7a8ca1
fix: treat hyphenated fork counters such as 0.13.3-0-1 as latest
karlorz Oct 17, 2026
2cc7102
feat: add Host-owned external Harness live voice
karlorz Oct 17, 2026
3d1e804
fix: drop unused import in external sandbox test
karlorz Oct 17, 2026
7472cc8
chore: prepare v0.13.3-0
karlorz Oct 17, 2026
5d6ac77
test: allow smol-toml in the Host runtime bundle
karlorz Oct 17, 2026
710f767
feat: send Grok Desktop session rules through ACP _meta.rules
karlorz Oct 17, 2026
f9b57f3
fix: recover leftover Desktop Controller after a failed launch
karlorz Oct 17, 2026
c489384
test: isolate Claude Code discovery from host Homebrew
karlorz Oct 17, 2026
58ebea2
docs: count fork tags as v0.13.3-1, v0.13.3-2
karlorz Oct 17, 2026
2409457
chore: prepare v0.13.3-1
karlorz Oct 17, 2026
5cd3f8e
feat: project Grok Imagine files as Desktop imageGeneration
karlorz Oct 18, 2026
2f3467f
fix: assign Grok generatedImage only when present
karlorz Oct 18, 2026
8dcc59c
docs: recover ChatGPT snag without losing session state
karlorz Oct 18, 2026
ade2220
chore: prepare v0.13.3-2
karlorz Oct 18, 2026
228ecc8
feat: restore hide Codex usage warning and send gate
karlorz Oct 18, 2026
0a7fc3c
fix: keep settings Back available without native history
karlorz Oct 18, 2026
9749ffa
chore: prepare v0.13.3-3
karlorz Oct 18, 2026
87e321f
fix: keep voice handoffs and chat updates flowing after hangup
karlorz Oct 18, 2026
bcca771
chore: prepare v0.13.3-4
karlorz Oct 18, 2026
9fdf2c8
fix(voice): route native Desktop live-voice calls through the configu…
karlorz Oct 19, 2026
c9d93d3
fix(voice): disable Zod JIT in the voice overlay
karlorz Oct 19, 2026
6d0f651
docs: preserve live voice when syncing upstream
karlorz Oct 19, 2026
7966dbc
fix(voice): forward chat task results and settle completed scouts
karlorz Oct 19, 2026
6a4a563
chore: prepare v0.13.3-5
karlorz Oct 19, 2026
e61494a
feat: preserve native Chat voice across conversations
karlorz Oct 20, 2026
d4d75af
feat: persist live voice integration settings
karlorz Oct 20, 2026
d0e2dd2
fix: preserve read-only subagent views and child models
karlorz Oct 20, 2026
40f3cb5
feat: restart managed Desktop and clarify voice settings
karlorz Oct 20, 2026
62d5f87
fix: wait for controller process exit during restart
karlorz Oct 20, 2026
2ac0e7a
fix: keep console restart confirmation readable
karlorz Oct 20, 2026
25ead85
fix: bound acknowledged controller shutdown on restart
karlorz Oct 20, 2026
cc19024
fix: select native Chat draft after voice starts
karlorz Oct 20, 2026
44399a1
test: keep native voice fixture return type explicit
karlorz Oct 20, 2026
d4a7ada
feat: unify Desktop and console voice settings
karlorz Oct 20, 2026
0b08625
fix: wait for native Chat voice connection before navigation
karlorz Oct 20, 2026
cbe9382
fix: select server-backed Chat after voice session starts
karlorz Oct 20, 2026
9217274
fix: restore native Chat voice without forced navigation
karlorz Oct 20, 2026
12925b2
fix: select adopted Chat voice drafts without early server navigation
karlorz Oct 20, 2026
9d91006
fix: route external voice from native request metadata
karlorz Oct 20, 2026
9039cb4
fix: forward Grok effort and recognize patched CLI launchers
karlorz Oct 20, 2026
8ca19cc
Merge branch 'debug-grok-grokgod-shim'
karlorz Oct 20, 2026
5d2f17f
refactor: simplify voice metadata header lookup
karlorz Oct 21, 2026
fa0e4fa
chore: prepare v0.13.3-6
karlorz Oct 21, 2026
1c11d3c
test: write restart descriptors with private storage permissions
karlorz Oct 21, 2026
96159a0
feat: project Grok MCP elicitation and persist Always allow
karlorz Oct 21, 2026
fc57ec0
feat: add CodexHost setting for Grok Computer Use
karlorz Oct 21, 2026
ba43791
fix: enable Grok Computer Use checkbox after settings load
karlorz Oct 21, 2026
5c03aa3
fix: restyle Grok Computer Use as an inspector card
karlorz Oct 21, 2026
10ba06b
ci: add daily Sparkle pin check for Desktop voice patches
karlorz Oct 22, 2026
a882c71
docs: define fork upstream sync runbook
karlorz Oct 22, 2026
5ee4c59
feat: preserve Work gateway voice and Grok browser intent
karlorz Oct 22, 2026
d177edf
merge: sync upstream while preserving fork voice and IAB contracts
karlorz Oct 22, 2026
a4baee0
test: keep compat-daily pin tests on node:test
karlorz Oct 22, 2026
8c82a99
Merge pull request #6 from karlorz/sync/upstream-2026-10-22
karlorz Oct 22, 2026
7ccf541
fix: pin Work gateway voice to Desktop 26.1016.61520
karlorz Oct 22, 2026
c74fa51
fix: wait for official Codex recovery on first Host start
karlorz Oct 22, 2026
1fbe8fd
test: cover first-start official recovery without unhandledRejection
karlorz Oct 22, 2026
26af370
fix: project Work voice for official Codex when composer-mode storage…
karlorz Oct 22, 2026
5c52d01
refactor: share Grok settings writes and Voice gateway labels
karlorz Oct 22, 2026
16fff89
fix: fail closed for unavailable native Chat voice
karlorz Oct 22, 2026
1d4bdd4
fix: route explicit Codex Work voice through gateway
karlorz Oct 22, 2026
8996664
fix: qualify Chat voice bindings for Desktop 61520
karlorz Oct 22, 2026
9c0c2ae
test: use portable URLs for compat workflow imports
karlorz Oct 22, 2026
e79abf0
fix: place native Chat voice immediately before Send
karlorz Oct 23, 2026
382c0b2
fix: preserve voice readiness across Renderer reinjection
karlorz Oct 23, 2026
51429f7
fix: bind Chat voice to its inner composer provider
karlorz Oct 23, 2026
3fe78e5
fix: preserve native Chat voice contrast and home layout
karlorz Oct 23, 2026
23bca77
fix: match Chat voice action spacing to native voice mode
karlorz Oct 23, 2026
71b3d86
fix: qualify Desktop 62342 voice bindings
karlorz Oct 23, 2026
0d64c8a
fix: retain Chat draft selection across prewarmed voice startup
karlorz Oct 23, 2026
ab88f4e
ci: allow manual validation runs
karlorz Oct 23, 2026
1edc7c3
Update computer-use-settings.md
karlorz Oct 23, 2026
5598884
chore: prepare v0.13.3-7
karlorz Oct 23, 2026
bcd2350
Merge upstream main while preserving fork voice integration
karlorz Oct 24, 2026
f96a428
test: preserve written links alongside voice transcripts
karlorz Oct 24, 2026
a42d92a
fix: preserve Grok reply identity and voice Markdown
karlorz Oct 24, 2026
8d68cf6
merge: include upstream v0.14.0 release baseline
karlorz Oct 24, 2026
28a1110
chore: prepare v0.14.0-0
karlorz Oct 24, 2026
f126394
wip: restore overlay queued follow-up text after interrupt
karlorz Oct 25, 2026
6eb2f4d
fix: emit Desktop text_elements on Host queued follow-ups
karlorz Oct 25, 2026
89efd78
feat: qualify Desktop 26.1021.31345 Chat voice and Settings
karlorz Oct 25, 2026
c78a294
test: cover Settings dictation restoration on 26.1021.31345
karlorz Oct 25, 2026
3c1e774
docs: describe Settings dictation restoration on 26.1021.31345
karlorz Oct 25, 2026
606fce2
fix: restore voice settings and existing Codex calls after restart
karlorz Oct 25, 2026
1aacd23
chore: prepare v0.14.0-1
karlorz Oct 25, 2026
4e5ac70
merge: include queued follow-up recovery in v0.14.0-1
karlorz Oct 25, 2026
ed9e9a6
test: align voice paths and follow-up manager fixtures
karlorz Oct 25, 2026
3cb5c3d
fix: keep queued follow-up message identity immutable
karlorz Oct 25, 2026
0dbe6e0
fix: retain Work voice with hidden Chat composers
karlorz Oct 25, 2026
422f1c4
chore: prepare v0.14.0-2
karlorz Oct 25, 2026
7b5a84a
fix: qualify Windows native voice with product version and platform p…
karlorz Oct 25, 2026
c66d9f9
chore: prepare v0.14.0-3
karlorz Oct 25, 2026
4257f64
fix: keep acknowledged Controller shutdown attached to live PIDs
karlorz Oct 25, 2026
f20f4ee
fix: make daily compatibility reporting accurate
karlorz Oct 26, 2026
b86e085
docs: add voice, question, and subagent rows to the Harness matrix
karlorz Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .agents/skills/codexhost-release/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ description: 发布 codexhost 正式版、预览版,编写或确认 Release No
- `.github/workflows/release-packages.yml` 与 `.github/workflows/ci.yml`
- `packages/repository-automation/src/release.mjs`
- `docs/operations/repository-maintenance.md`
- 本仓库若是 fork `karlorz/codex-host`:先读 [fork versioning](../../../docs/operations/fork-versioning.md)(`0.13.3-0` / `0.13.3-1`…,控制台版本同源),再读本 Skill 的上游渠道表
- 涉及更新提示时:`packages/update-manager/src/github-release.ts`

源码和工作流是执行行为的依据。发现指南与当前实现不一致时,说明差异;不要假装已有不支持的发布能力。
Expand All @@ -38,6 +39,8 @@ description: 发布 codexhost 正式版、预览版,编写或确认 Release No

用户意图不清楚时,先问清两个渠道的目标。最终执行前明确报告版本、npm dist-tag、GitHub 状态与是否提示更新。

在 `karlorz/codex-host` 上,上表的 BytePioneer npm `@codexhost/cli` / 正式 GitHub latest **不适用**。Fork 标签跟随当前 upstream 版本加计数器(upstream 为 `0.13.3` 时用 `v0.13.3-0`、`v0.13.3-1`,不要写成 `0.13.3-cpa.1`)。不向 `upstream` 推送。Fork **必须**把同一版本发布为 `@karlorz/codexhost-cli@latest`(及对应平台包),并把 `karlorz/codex-host` 上的 GitHub Release 标成 latest,这样 Settings 的 `npm install -g @karlorz/codexhost-cli@latest` 和 in-app Update 才指向 fork。禁止发布 `@codexhost/*`。`Release packages` 已启用,Trusted Publisher 指向 `karlorz/codex-host`;数字计数(如 `0.13.3-0`、`0.13.3-1`)由工作流发成 npm `latest` + GitHub latest。控制台「codexhost 版本」必须与该准备版本一致。`gh pr create` / `gh release` 必须带 `-R karlorz/codex-host`。规则全文:[fork versioning](../../../docs/operations/fork-versioning.md)。

## 2. 检查现场与验证

1. 检查工作区、当前分支、远端与已有标签;快进同步 `main`,不覆盖无关修改。
Expand Down
6 changes: 3 additions & 3 deletions .agents/skills/codexhost-release/references/release-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
| 稳定 SemVer,默认发布 | `latest` | 正式 Release、latest |
| 稳定 SemVer,手动发布且 `github_prerelease=true` | `latest` | Prerelease、非 latest |

静默预览发行用于“小修复让用户自行下载,但不推送更新提示”:npm 正常发布到 `latest`,GitHub 标记为 Prerelease。当前更新检查读取 GitHub 正式 latest Release,不读取 npm dist-tag;预览发行仍公开可下载。SemVer 预发布则在 npm 使用 `next`,用户需显式安装 `@codexhost/cli@next`。
静默预览发行用于“小修复让用户自行下载,但不推送更新提示”:npm 正常发布到 `latest`,GitHub 标记为 Prerelease。当前更新检查读取 GitHub 正式 latest Release,不读取 npm dist-tag;预览发行仍公开可下载。SemVer 预发布则在 npm 使用 `next`,用户需显式安装 `@karlorz/codexhost-cli@next`。

## 发布步骤

Expand Down Expand Up @@ -104,7 +104,7 @@ Composer 增加 Harness 命令按钮和模型搜索。Grok 支持自动或手动
### npm

```bash
npm install -g @codexhost/cli
npm install -g @karlorz/codexhost-cli
codexhost
```

Expand Down Expand Up @@ -178,7 +178,7 @@ Tag 推送后,GitHub Actions 会自动:
- 校验 Tag、npm 版本和 Cargo Workspace 版本一致。
- 构建 Windows x64/arm64 EXE。
- 构建 macOS x64/arm64 DMG。
- 发布 macOS、Windows、Linux 的 x64/arm64 共六个平台 npm 包和 `@codexhost/cli` 元包。
- 发布 macOS、Windows、Linux 的 x64/arm64 共六个平台 npm 包和 `@karlorz/codexhost-cli` 元包。
- 根据版本及手动发布输入创建公开 GitHub Release Prerelease 或正式 Release;`test` 渠道不创建 GitHub Release。
- GitHub Release 只上传四个安装包,不上传 npm tarball。

Expand Down
12 changes: 7 additions & 5 deletions .agents/skills/codexhost-update-impact-audit/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ Read the current call sites and follow each surface independently from discovery
- sidebar decoration;
- settings entry;
- Fork;
- Codex usage gate (`renderer-codex-usage-gate.ts`, driven by `renderComposerAgentControl`'s external-submission readiness);
- Codex usage gate (`renderer-codex-usage-gate.ts`, driven by `renderComposerAgentControl`'s usage-gate allowance for Codex or a ready external Adapter);
- Host create and subsequent-Turn routing.

Prefer unique semantic candidates plus ownership checks. Record fail-closed behavior for absent or ambiguous candidates. Keep source relocation separate from an actual anchor or ownership change.
Expand Down Expand Up @@ -126,9 +126,11 @@ Use `tools/renderer-binding/run.mjs` only when a clean controlled lifecycle, rel

The runner does not accept the `.app` directory. A controlled flow may verify Agent switching, stale-prewarm clearing, new Thread creation, title behavior, or Fork. State clearly when user interaction or creation boundaries were not exercised.

For a requested live-voice fix on an already running Desktop, use the narrow live voice-hook refresh in [cpa-live-voice-desktop-hook.md](../../../docs/operations/cpa-live-voice-desktop-hook.md#live-voice-hook-debug-on-a-running-desktop) to validate the current document without a full Desktop restart. Keep the read-only probe first and skip mutation during an active or unknown call.

### Codex usage gate probe

This surface lets an external Harness submit while the ChatGPT-signed-in Codex subscription is out of usage by projecting `false` for one Composer's two Desktop usage-gate subscriptions. It depends on private React/state-library internals, so check it on every update. `npm run audit:codex-desktop` reports its structure as the `codex-usage-gate` surface (see `tools/codex-desktop-contract-audit/README.md`); `codex-usage-account-gate-dormant` means the audit ran without a ChatGPT sign-in whose Account gate reads usage. The audit does not verify behavior.
This surface lets a Composer submit while the ChatGPT-signed-in Codex subscription is out of usage by projecting `false` for one Composer's two Desktop usage-gate subscriptions. It depends on private React/state-library internals, so check it on every update. `npm run audit:codex-desktop` reports its structure as the `codex-usage-gate` surface (see `tools/codex-desktop-contract-audit/README.md`); `codex-usage-account-gate-dormant` means the audit ran without a ChatGPT sign-in whose Account gate reads usage. The audit does not verify behavior.

Bundle evidence (evidence only, not contracts): the Composer owner combines `submitDisabled` from an Account rate-limit selector (`authMethod !== "chatgpt"` early return, then `rate_limit.allowed === false`, gated to host `local`) and a reserve `hardBlocked` selector. Confirm both still exist and still feed `submitDisabled`, and that no new Account-wide usage blocker was added beside them. If Desktop now exempts external models/Threads or stops blocking in the Renderer, report that the module can be removed.

Expand All @@ -141,7 +143,7 @@ Manual read-only live probe, when the audit surface is not `no-impact` or its co

With codexhost running and an external Agent selected, bound gates show an instance `getSnapshot` of `() => false` for both hooks. The Agent control's hover title shows the "cannot separate from Codex usage" message when binding failed.

Behavioral check requires a ChatGPT account that is out of Codex usage; API-key sign-in never triggers the gate. With non-empty text and an external Agent, Send is enabled in a new draft and an existing Thread; after switching to Codex it returns to disabled. Do not submit a message unless the user asks. Remove any temporary text without touching text the user typed. Report `unverified` when no exhausted account is available.
Behavioral check requires a ChatGPT account that is out of Codex usage; API-key sign-in never triggers the gate. With non-empty text, Send and Enter are enabled in a new draft, an existing Thread, and a Codex Thread. Do not submit a message unless the user asks. Remove any temporary text without touching text the user typed. Report `unverified` when no exhausted account is available.

Completion criterion: no surface receives a live verdict from bundle inspection alone.

Expand All @@ -161,7 +163,7 @@ For a requested fix:
1. Add a regression test that models the observed DOM, Fiber, API-shape, visual relationship, or routing boundary.
2. Run it red for the observed reason.
3. Make one minimal production change in the owning module.
4. Run it green and repeat the relevant live probe.
4. Run it green and repeat the relevant live probe. For a requested live-voice fix, use the same narrow refresh linked under Controlled probe.

A test that proves only that a control exists or a mock was called does not prove visual alignment, ownership, or routing.

Expand Down Expand Up @@ -205,5 +207,5 @@ Do not bury the answer in the evidence. “Frontend changed” and “codexhost
- Declaring Host routing, title creation, or Fork healthy without exercising that boundary.
- Updating multiple controls before isolating the failed ownership contract.
- Reformatting, resetting, staging, or overwriting unrelated work while investigating.
- Declaring the Codex usage gate healthy from a Codex-selected, empty, API-key-signed-in, or not-exhausted Composer; only the external Agent path with exhausted ChatGPT usage exercises it.
- Declaring the Codex usage gate healthy from an empty, API-key-signed-in, or not-exhausted Composer; exhausted ChatGPT usage on a new draft, existing Thread, or Codex Thread exercises it.
- Checking only the Send button's DOM `disabled`; Desktop also guards Enter and the submit function with the same `submitDisabled`.
14 changes: 14 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: CI

on:
workflow_dispatch:
pull_request:
paths-ignore:
- "docs/**"
Expand Down Expand Up @@ -92,6 +93,19 @@ jobs:
--exclude 'packages/renderer-extension/test/**'
--exclude 'tools/gate-claude-code/run.test.mjs'

# Asset pairs and export contracts differ even when About versions match.
- name: Test Windows native voice profiles
if: runner.os == 'Windows'
run: >
npx vitest run --config tests/vitest.config.js
packages/renderer-extension/test/renderer-voice-assets.test.ts
packages/renderer-extension/test/renderer-client-owned-voice.test.ts
packages/renderer-extension/test/renderer-native-chat-voice.test.ts
packages/renderer-extension/test/renderer-voice-settings.test.ts
packages/renderer-extension/test/renderer-voice-start-capability.test.ts
packages/renderer-extension/test/renderer-external-voice-launch.test.ts
packages/renderer-extension/test/renderer-voice-capability.test.ts

# Rust formatting is already covered by the Linux x64 formatting step.
- name: Check Rust
run: >
Expand Down
180 changes: 180 additions & 0 deletions .github/workflows/compat-daily.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
name: Compat Daily

# Compare macOS ChatGPT/Codex Desktop Sparkle latest to Renderer voice pins.
# Opens one GitHub issue per surface when a pin is behind. Does not download the .app.

on:
schedule:
- cron: "17 7 * * *"
workflow_dispatch:
push:
branches: [main]
paths:
- tools/compat-daily/**
- .github/workflows/compat-daily.yml
- packages/renderer-extension/src/renderer-client-owned-voice.ts
- crates/platform/src/asar_metadata.rs
- crates/platform/src/installation.rs
- packages/renderer-extension/src/renderer-voice-assets.ts
- packages/renderer-extension/src/renderer-native-chat-voice-assets.ts
- packages/renderer-extension/src/renderer-native-chat-voice.ts
- packages/renderer-extension/src/renderer-voice-start-capability.ts
pull_request:
paths:
- tools/compat-daily/**
- .github/workflows/compat-daily.yml
- packages/renderer-extension/src/renderer-client-owned-voice.ts
- crates/platform/src/asar_metadata.rs
- crates/platform/src/installation.rs
- packages/renderer-extension/src/renderer-voice-assets.ts
- packages/renderer-extension/src/renderer-native-chat-voice-assets.ts
- packages/renderer-extension/src/renderer-native-chat-voice.ts
- packages/renderer-extension/src/renderer-voice-start-capability.ts

permissions:
contents: read

jobs:
pins:
name: macOS voice release pins
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: read
issues: write
steps:
- uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: .node-version

- name: Unit-test pin parser
run: node --test tools/compat-daily/run.test.mjs

- name: Compare Sparkle latest to voice pins
id: compare
run: |
set -o pipefail
node tools/compat-daily/run.mjs | tee compat-daily.json

- name: Open or update issues on pin drift
if: failure() && steps.compare.outcome == 'failure' && github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const report = JSON.parse(fs.readFileSync('compat-daily.json', 'utf8'));
if (report.error) return;
const findings = Array.isArray(report.findings) ? report.findings : [];
if (findings.length === 0) return;
const owner = context.repo.owner;
const repo = context.repo.repo;
const runUrl = `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`;
for (const name of ['compat-broken', 'bug']) {
try {
await github.rest.issues.getLabel({ owner, repo, name });
} catch (error) {
if (error.status !== 404) throw error;
await github.rest.issues.createLabel({
owner,
repo,
name,
color: name === 'bug' ? 'd73a4a' : 'e4e669',
description: name === 'bug' ? 'Something is broken' : 'compat-daily Desktop pin drift',
});
}
}

const { data: open } = await github.rest.issues.listForRepo({
owner,
repo,
state: 'open',
labels: 'compat-broken',
per_page: 100,
});
for (const finding of findings) {
const dup = open.find((issue) => issue.title === finding.title);
const body = [
finding.detail,
'',
`- macOS Desktop: \`${report.latest?.version ?? 'unknown'}\` build \`${report.latest?.build ?? 'unknown'}\``,
`- Event: \`${context.eventName}\``,
`- Checked commit: \`${context.sha}\` (\`${context.ref}\`)`,
`- Run: ${runUrl}`,
'',
'Auto-opened by `.github/workflows/compat-daily.yml` on this repository.',
].join('\n');
if (dup) {
await github.rest.issues.createComment({
owner,
repo,
issue_number: dup.number,
body: `macOS pin drift re-failed ${new Date().toISOString().slice(0, 10)} — ${runUrl}\n\nChecked commit: \`${context.sha}\` (\`${context.ref}\`)`,
});
} else {
await github.rest.issues.create({
owner,
repo,
title: finding.title,
labels: ['compat-broken', 'bug'],
body,
});
}
}

- name: Comment on matching voice pins
if: always() && (steps.compare.outcome == 'success' || steps.compare.outcome == 'failure') && github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const report = JSON.parse(fs.readFileSync('compat-daily.json', 'utf8'));
if (report.error || !report.latest || !report.pins) return;
const { recoveredPinIssues } = await import(`${process.env.GITHUB_WORKSPACE}/tools/compat-daily/run.mjs`);
const owner = context.repo.owner;
const repo = context.repo.repo;
const issues = await github.paginate(github.rest.issues.listForRepo, {
owner, repo, state: 'open', labels: 'compat-broken', per_page: 100,
});
for (const issue of recoveredPinIssues(report, issues)) {
const marker = `<!-- compat-daily:matched:${issue.surface}:${issue.version} -->`;
const comments = await github.paginate(github.rest.issues.listComments, {
owner, repo, issue_number: issue.number, per_page: 100,
});
if (comments.some(comment => comment.user?.type === 'Bot' && comment.body?.includes(marker))) continue;
await github.rest.issues.createComment({
owner, repo, issue_number: issue.number,
body: `${marker}\nThe macOS ${issue.surface} pin is now ${issue.version}, matching this issue's tracked Desktop target or the current macOS Sparkle release. Current macOS Sparkle: ${report.latest.version}. Any newer version drift is reported separately. This check does not verify microphone capture, connected audio or conversation lifecycle; the issue remains open for acceptance review.\n\nChecked commit: \`${context.sha}\` (\`${context.ref}\`)\nRun: ${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`,
});
}

windows-msix:
name: Windows MSIX metadata and voice contracts
runs-on: windows-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: .node-version
cache: npm
- uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.97.1
- uses: Swatinem/rust-cache@v2
with:
save-if: ${{ github.ref == 'refs/heads/main' }}
- run: npm ci --prefer-offline
- name: Test bounded ASAR metadata
run: cargo test --locked -p codexhost-platform asar_metadata
- name: Test MSIX identity and product detection
run: cargo test --locked -p codexhost-platform installation::windows_tests
- name: Build TypeScript
run: npm run build:typescript
- name: Test platform profile selection and bootstrap
run: >
npx vitest run --config tests/vitest.config.js
packages/renderer-extension/test/renderer-voice-assets.test.ts
packages/desktop-control/test/cpa-live-voice-hook.test.ts
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ default-members = [
resolver = "3"

[workspace.package]
version = "0.14.0"
version = "0.14.0-3"
edition = "2024"
rust-version = "1.97.1"
publish = false
Loading
Loading