Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
2a10a2b
chore(release): open dev at 2.89.0 before releasing 2.88.0 (#7263)
github-actions[bot] Oct 17, 2026
688b258
feat(compatibility): separate custom-tool grammar evidence from repre…
lidge-jun Oct 17, 2026
f443f49
fix(antigravity): show the Gemini 4 Argon quota group separately (#7283)
lidge-jun Oct 17, 2026
5f6a629
fix(vertex): honor project and location for API-key inference (#7266)
andrew05060414 Oct 17, 2026
d80dfcd
fix(google): preserve matched and orphan Vertex Argon tool images (#7…
Jossi02 Oct 17, 2026
c06ad25
feat(combos): let a combo set its catalog row description (#7229) (#7…
lidge-jun Oct 17, 2026
cb6a9a7
feat(responses): opt-in compression of outbound ChatGPT Responses req…
lidge-jun Oct 17, 2026
12760bb
feat(accounts): auto-pause repeated permanent account refusals (#7153)
lidge-jun Oct 17, 2026
649f36c
feat(providers): explicit single-model completion test (#7287)
lidge-jun Oct 17, 2026
db2cf95
feat(codex): opt-in OS desktop notification for low-quota protection …
lidge-jun Oct 17, 2026
d2c71eb
feat(combos): opt-in advisory quota signals for JEV decisions (P1) (#…
geunwoojun99 Oct 17, 2026
8640c2f
feat(messaging): add explicit enrolled Codex SSH peers (#6891)
phillipod Oct 18, 2026
d11f067
feat(anthropic): default prompt-cache TTL to 1h on first-party Anthro…
lidge-jun Oct 19, 2026
1c5e963
fix(service): never bake Claude first-party's own intercept proxy (#7…
scy7796 Oct 19, 2026
0a995db
fix(sidecar): map provider input overflow to context_length_exceeded …
lidge-jun Oct 19, 2026
421e4a6
ci(release): sign Windows binaries and MSI via SignPath (#7207) (#7356)
lidge-jun Oct 19, 2026
2339562
fix(responses): handle replayed hosted web-search history (#7250, #72…
lidge-jun Oct 19, 2026
cf1589f
chore(providers): remove opencode-free and migrate saved configs (#7351)
lidge-jun Oct 19, 2026
f7bdd8e
fix(combos): keep tool loops on one target and make failover history …
lidge-jun Oct 19, 2026
718692b
fix(combos): absorb community failover fixes (#7317, #7329, #7339, #7…
lidge-jun Oct 19, 2026
7ec6221
test(responses): register combo-tool-loop-pin in the core module inve…
lidge-jun Oct 19, 2026
cb669ee
test(windows): keep ACL subprocess work out of cache and registration…
lidge-jun Oct 19, 2026
ee3ad33
test(temp): let the final-EPERM quarantine see through Windows 8.3 TE…
lidge-jun Oct 19, 2026
955d8c2
test(combos): await the fallback lease release on both passthrough re…
lidge-jun Oct 19, 2026
c344c6c
test(temp): compare the default containment result through the native…
lidge-jun Oct 19, 2026
5250934
test(desktop): hold early client bytes in the socks5 egress fixture (…
lidge-jun Oct 19, 2026
93a9016
fix(launcher): scope an inherited transpiler cache to the Bun version…
lidge-jun Oct 19, 2026
7dfc141
fix(runtime): scope server children's transpiler cache and keep scopi…
lidge-jun Oct 19, 2026
52c326b
test(launcher): assert the scoped env and versioned bundled runtime i…
lidge-jun Oct 19, 2026
8b3a10b
release: promote dev 52c326b479 to main as 2.89.0
lidge-jun Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
170 changes: 168 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,11 @@ jobs:
dependency_cpu: arm64
smoke: false
runs-on: ${{ matrix.os }}
timeout-minutes: 25
# The Windows leg can wait up to an hour for a release-signing approval in SignPath.
timeout-minutes: ${{ matrix.target == 'bun-windows-x64' && 90 || 25 }}
permissions:
# actions: read lets the SignPath action read this job and download the unsigned artifact.
actions: read
contents: read
steps:
- name: Checkout
Expand All @@ -162,6 +165,23 @@ jobs:
- name: Setup project Bun
uses: ./.github/actions/setup-project-bun

# Windows Authenticode signing through SignPath Foundation (#7207). Decided before the build, so
# a broken SignPath configuration fails in seconds instead of after the build. The rules
# (no token: skip; partial configuration: fail; test-signing: dry runs only) live in
# scripts/ci/windows-signing-plan.sh, where tests/ci-workflows/release-windows-signing.test.ts
# exercises them.
- name: Decide Windows code signing
id: windows-signing
if: runner.os == 'Windows'
shell: bash
env:
SIGNPATH_CONFIGURED: ${{ secrets.SIGNPATH_API_TOKEN != '' }}
SIGNPATH_ORGANIZATION_ID: ${{ vars.SIGNPATH_ORGANIZATION_ID }}
SIGNPATH_PROJECT_SLUG: ${{ vars.SIGNPATH_PROJECT_SLUG }}
SIGNPATH_SIGNING_POLICY: ${{ vars.SIGNPATH_SIGNING_POLICY_SLUG }}
DRY_RUN: ${{ inputs.dry-run }}
run: bash scripts/ci/windows-signing-plan.sh

- name: Install dependencies
run: bun install --frozen-lockfile --os=${{ matrix.dependency_os }} --cpu=${{ matrix.dependency_cpu }}

Expand Down Expand Up @@ -201,6 +221,58 @@ jobs:
Invoke-WebRequest -UseBasicParsing http://127.0.0.1:10177/ | Out-Null
} finally { Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue }

# Signed after the smoke test and before the archive, so the zip and its checksum are built
# from the signed binary. The artifact holds ocx.exe alone at its root, which is the shape the
# windows-standalone-zip artifact configuration expects. The keyring addons beside it are
# third-party builds that the SignPath Foundation policy forbids signing with its certificate.
- name: Upload the unsigned Windows binary for signing
id: unsigned-ocx
if: steps.windows-signing.outputs.mode == 'sign'
continue-on-error: true
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: signpath-unsigned-${{ matrix.target }}
path: dist/standalone/${{ matrix.target }}/ocx.exe
if-no-files-found: error
retention-days: 1

# continue-on-error on every signing step: a SignPath outage, timeout or rejection must never
# fail a release. The apply step reads this outcome and keeps the unsigned binary with a
# warning. Under release-signing every request waits for a maintainer's manual approval in
# app.signpath.io, hence the hour.
- name: Sign the Windows binary through SignPath
id: sign-ocx
if: steps.windows-signing.outputs.mode == 'sign' && steps.unsigned-ocx.outcome == 'success'
continue-on-error: true
uses: signpath/github-action-submit-signing-request@f6d04783b4569d051e0c80105fe66e82819d0092 # v3.0
timeout-minutes: 65
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ vars.SIGNPATH_ORGANIZATION_ID }}
project-slug: ${{ vars.SIGNPATH_PROJECT_SLUG }}
signing-policy-slug: ${{ steps.windows-signing.outputs.policy }}
artifact-configuration-slug: windows-standalone-zip
github-artifact-id: ${{ steps.unsigned-ocx.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: 3600
output-artifact-directory: ${{ runner.temp }}/signpath-signed-ocx

- name: Swap in the verified signed Windows binary
if: steps.windows-signing.outputs.mode == 'sign'
continue-on-error: true
shell: pwsh
env:
STANDALONE_TARGET: ${{ matrix.target }}
SIGNPATH_OUTCOME: ${{ steps.sign-ocx.outcome }}
SIGNING_TRUST: ${{ steps.windows-signing.outputs.trust }}
run: |
./scripts/ci/apply-signed-windows-artifact.ps1 `
-Target "dist/standalone/$env:STANDALONE_TARGET/ocx.exe" `
-SignedDirectory (Join-Path $env:RUNNER_TEMP "signpath-signed-ocx") `
-SubmitOutcome "$env:SIGNPATH_OUTCOME" `
-Trust $env:SIGNING_TRUST


- name: Archive standalone release
shell: bash
env:
Expand Down Expand Up @@ -262,8 +334,11 @@ jobs:
sidecar-targets: x86_64-unknown-linux-gnu
artifact-suffixes: linux-x86_64.AppImage,linux-amd64.deb
runs-on: ${{ matrix.os }}
timeout-minutes: 45
# The Windows leg can wait up to an hour for a release-signing approval in SignPath.
timeout-minutes: ${{ matrix.target == 'x86_64-pc-windows-msvc' && 105 || 45 }}
permissions:
# actions: read lets the SignPath action read this job and download the unsigned artifact.
actions: read
contents: read
env:
# Whether this run holds the Developer ID material at all. A run without it still builds
Expand All @@ -278,6 +353,23 @@ jobs:
- name: Setup project Bun
uses: ./.github/actions/setup-project-bun

# Windows Authenticode signing through SignPath Foundation (#7207). Decided before the build, so
# a broken SignPath configuration fails in seconds instead of after the build. The rules
# (no token: skip; partial configuration: fail; test-signing: dry runs only) live in
# scripts/ci/windows-signing-plan.sh, where tests/ci-workflows/release-windows-signing.test.ts
# exercises them.
- name: Decide Windows code signing
id: windows-signing
if: runner.os == 'Windows'
shell: bash
env:
SIGNPATH_CONFIGURED: ${{ secrets.SIGNPATH_API_TOKEN != '' }}
SIGNPATH_ORGANIZATION_ID: ${{ vars.SIGNPATH_ORGANIZATION_ID }}
SIGNPATH_PROJECT_SLUG: ${{ vars.SIGNPATH_PROJECT_SLUG }}
SIGNPATH_SIGNING_POLICY: ${{ vars.SIGNPATH_SIGNING_POLICY_SLUG }}
DRY_RUN: ${{ inputs.dry-run }}
run: bash scripts/ci/windows-signing-plan.sh

# The desktop build takes its version from tauri.conf.json and Cargo.toml (the widget
# plist inherits it), not from package.json or this input, while the updater manifest is
# derived from the input. A mismatch ships an app that reports the previous version under a
Expand Down Expand Up @@ -485,6 +577,80 @@ jobs:
# diagnostics on the first attempt; Apple signing commands stay non-verbose.
run: bunx tauri ${{ runner.os == 'Linux' && '--verbose' || '' }} build --ci --target ${{ matrix.target }} --bundles ${{ matrix.bundles }} --config "${{ runner.os == 'Windows' && format('{0}/opencodex-msi.json', runner.temp) || '{}' }}"

# The Windows installer goes to SignPath after the build and before the asset rename, so the
# renamed asset, its checksum and its updater signature all describe the signed MSI. The
# windows-msi-zip artifact configuration signs every .exe inside the installer (the app and
# the bundled ocx.exe sidecar) and then the MSI itself.
- name: Locate the Windows installer for signing
id: windows-msi
if: steps.windows-signing.outputs.mode == 'sign'
continue-on-error: true
shell: bash
env:
DESKTOP_TARGET: ${{ matrix.target }}
run: |
set -euo pipefail
shopt -s nullglob
installers=("desktop/src-tauri/target/$DESKTOP_TARGET/release/bundle/msi/"*.msi)
if [ "${#installers[@]}" -ne 1 ]; then
echo "::warning::Expected one MSI to sign, found ${#installers[@]}; the installer ships unsigned."
exit 1
fi
echo "path=${installers[0]}" >> "$GITHUB_OUTPUT"

- name: Upload the unsigned Windows installer for signing
id: unsigned-msi
if: steps.windows-signing.outputs.mode == 'sign' && steps.windows-msi.outcome == 'success'
continue-on-error: true
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: signpath-unsigned-${{ matrix.target }}
path: ${{ steps.windows-msi.outputs.path }}
if-no-files-found: error
retention-days: 1

# continue-on-error, as for the standalone binary: an outage, timeout or rejection keeps the
# unsigned installer and its original updater signature.
- name: Sign the Windows installer through SignPath
id: sign-msi
if: steps.windows-signing.outputs.mode == 'sign' && steps.unsigned-msi.outcome == 'success'
continue-on-error: true
uses: signpath/github-action-submit-signing-request@f6d04783b4569d051e0c80105fe66e82819d0092 # v3.0
timeout-minutes: 65
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ vars.SIGNPATH_ORGANIZATION_ID }}
project-slug: ${{ vars.SIGNPATH_PROJECT_SLUG }}
signing-policy-slug: ${{ steps.windows-signing.outputs.policy }}
artifact-configuration-slug: windows-msi-zip
github-artifact-id: ${{ steps.unsigned-msi.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: 3600
output-artifact-directory: ${{ runner.temp }}/signpath-signed-msi

# Authenticode rewrites the MSI, so the Tauri updater signature made during the build no
# longer matches it. The apply script regenerates <msi>.sig over the signed bytes with the
# same key before swapping both in; verify-release then checks that signature against the
# final MSI and writes latest.json from it.
- name: Swap in the verified signed Windows installer
if: steps.windows-signing.outputs.mode == 'sign' && steps.windows-msi.outcome == 'success'
continue-on-error: true
shell: pwsh
env:
MSI_PATH: ${{ steps.windows-msi.outputs.path }}
SIGNPATH_OUTCOME: ${{ steps.sign-msi.outcome }}
SIGNING_TRUST: ${{ steps.windows-signing.outputs.trust }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: |
./scripts/ci/apply-signed-windows-artifact.ps1 `
-Target "$env:MSI_PATH" `
-SignedDirectory (Join-Path $env:RUNNER_TEMP "signpath-signed-msi") `
-SubmitOutcome "$env:SIGNPATH_OUTCOME" `
-Trust $env:SIGNING_TRUST `
-Installer `
-UpdaterSignature

- name: Verify the packaged universal macOS runtime
if: runner.os == 'macOS'
run: |
Expand Down
Loading
Loading