Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
8492315
chore(release): open dev at 2.81.0 before releasing 2.80.0 (#6705)
github-actions[bot] Oct 7, 2026
8c6e273
fix(deps): bump @modelcontextprotocol/sdk to 1.31.0 for GHSA-6qxp-vcc…
lidge-jun Oct 7, 2026
c48e46d
fix(cli): keep line breaks in logs explain text output (#6704)
WOULDU-pres Oct 7, 2026
42a571f
fix: demote developer to user for OrcaSAQ-2 leading-system template (…
Dolceandgabanna03aw Oct 7, 2026
3bffca3
fix(service): avoid Windows executable lookup in lease diagnostics (c…
lidge-jun Oct 7, 2026
bbd4e33
fix(codex): renew opted-in main credits before expiry (#6692) (#6669)
AiriDea Oct 7, 2026
3fca50c
fix(antigravity): rotate web-search validation refusals (#6710)
bi-boo Oct 7, 2026
52ebe52
fix(claude): stop re-attaching the token footer as a user turn (#6714)
lidge-jun Oct 7, 2026
f9b96b7
fix(kiro): surface a dead refresh token as needing re-auth (#6716)
lidge-jun Oct 7, 2026
bbab02a
test(oauth): count the web-search sidecar rotation site (#6717)
lidge-jun Oct 7, 2026
a12bb1f
feat(lifecycle): allow an explicit restart drain grace (carry #6703) …
lidge-jun Oct 8, 2026
1a8377d
fix(anthropic): preserve reported thinking token usage (#6721)
Ingwannu Oct 8, 2026
ab53742
fix(server): serve the desktop bundle's dashboard from an ocx the app…
sungyongcho Oct 8, 2026
a33de9b
fix(codex): stop refreshing pool accounts whose refresh grant is alre…
WOULDU-pres Oct 8, 2026
df54552
feat(messaging): add local Codex queued session messaging (#6544)
phillipod Oct 8, 2026
6a7632d
feat(qoder): bridge Codex-owned tools through MCP (#6289)
juzijia Oct 8, 2026
56f76fd
test(layout): compact layout.json registrations back under the line r…
lidge-jun Oct 8, 2026
c0f8165
fix(claude): close refused picker uploads and keep early replies inta…
lidge-jun Oct 8, 2026
18a8cda
feat(jev): allow arbitrary HTTPS decision endpoints (carry #6384) (#6…
lidge-jun Oct 8, 2026
13348ce
fix(auth): require independent sessions and expire revealed API keys …
lidge-jun Oct 8, 2026
8d30945
fix(runtime): ship Bun 1.4.2 and keep the CI test runner on 1.4.0 (#6…
lidge-jun Oct 8, 2026
b1e1735
fix(responses): relay undeclared passthrough tool calls on chat and a…
lidge-jun Oct 8, 2026
bf9ecf3
fix(catalog): keep Codex's auto-review model so reviews stop falling …
lidge-jun Oct 8, 2026
dfea21d
feat(clients): add native Command Code integration and catalog sync (…
lidge-jun Oct 8, 2026
aeebf11
feat: add Claude Haiku 5.5 pricing, catalog rows and request contract…
lidge-jun Oct 8, 2026
b6ec62a
test(claude): drain config-dir ACL hardening before removing picker-s…
lidge-jun Oct 8, 2026
89cad95
docs-site: mobile homepage polish, persistent GitHub link and star co…
lidge-jun Oct 8, 2026
4c4654e
fix(commandcode): bind restore requests to the selected client (#6755)
lidge-jun Oct 8, 2026
fcab4da
docs(commandcode): align provider copy and clean contract fixtures (#…
lidge-jun Oct 8, 2026
4222989
feat(anthropic): add anthropic2, an independent Anthropic account poo…
lidge-jun Oct 8, 2026
2f6a589
docs(devlog): close the anthropic2 account-pool unit (#6768)
lidge-jun Oct 8, 2026
53b8369
fix(spend): preserve v1 pool history with bounded physical-send accou…
lidge-jun Oct 8, 2026
54e6e26
Merge main into 2.81.0 promotion
lidge-jun Oct 8, 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
  •  
  •  
  •  
44 changes: 34 additions & 10 deletions .github/actions/setup-project-bun/action.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
name: Setup project Bun
description: >-
Install the Bun runtime for a job. Installs the version declared in
package.json (dependencies.bun), keeping the runtime SOT in one place so
version bumps only touch package.json and bun.lock.
Install the package.json Bun pin for a job's role: dependencies.bun for
runtime (default), or testRunnerBun for test-runner.

# Runtime 1.4.2 fixes #6684's Windows Bun.fetch stream truncation. The test runner
# stays on 1.4.0: #4821 reverted #4064 after 1.4.2's multi-file --isolate preload
# segfault; #6713 run 37631558263 reproduces it on Linux 1/4, macOS 2/2, Windows 9/9.
# Rejoin only after the upstream runner crash is fixed and a green lane=all
# dispatch proves the unified version; then delete testRunnerBun and this role input.
inputs:
role:
description: Bun role to install (runtime or test-runner).
required: false
default: runtime

outputs:
version:
Expand All @@ -15,14 +25,28 @@ runs:
- name: Resolve project Bun version
id: resolve
shell: bash
env:
BUN_ROLE: ${{ inputs.role }}
run: |
version="$(node -p "require('./package.json').dependencies.bun")"
if [ -z "$version" ]; then
echo "::error::Could not resolve Bun version from package.json"
exit 1
fi
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "Using Bun $version from package.json"
node <<'NODE'
const pkg = require('./package.json');
const role = process.env.BUN_ROLE;
let key;
let version;
switch (role) {
case 'runtime': key = 'dependencies.bun'; version = pkg.dependencies?.bun; break;
case 'test-runner': key = 'testRunnerBun'; version = pkg.testRunnerBun; break;
default:
console.error(`::error::Unknown Bun role: ${role}`);
process.exit(1);
}
if (typeof version !== 'string' || version !== version.trim() || !/^\d+\.\d+\.\d+$/.test(version)) {
console.error(`::error::Missing or invalid package.json ${key} for Bun role ${role}`);
process.exit(1);
}
require('node:fs').appendFileSync(process.env.GITHUB_OUTPUT, `version=${version}\n`);
console.log(`Using Bun ${version} from package.json ${key} (${role})`);
NODE

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
Expand Down
49 changes: 43 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,11 @@
printf 'Scheduled run: workflow from %s, testing dev at %s\n' "$GITHUB_SHA" "$sha" >> "$GITHUB_STEP_SUMMARY"
printf 'scheduled run tests dev at %s (workflow %s)\n' "$sha" "$GITHUB_SHA"

# Bun roles (#6713): runtime 1.4.2 fixes #6684's Windows Bun.fetch streaming;
# test-runner 1.4.0 avoids 1.4.2's multi-file --isolate preload segfault (#4821
# reverted #4064; run 37631558263: Linux 1/4, macOS 2/2, Windows 9/9).
# Rejoin after the upstream runner crash is fixed and a green lane=all dispatch
# proves the unified version, then delete testRunnerBun and the action's role input.
# The suite, split by file across four Linux runners.
#
# `scripts/ci/run-bun-test-batches.sh` assigns files to shards by the per-file
Expand Down Expand Up @@ -603,6 +608,8 @@

- name: Setup project Bun
uses: ./.github/actions/setup-project-bun
with:
role: test-runner # See the Bun roles contract above test.

# The GUI install is NOT optional here, however unrelated it looks to a
# test shard. Several files under tests/ import JSX-bearing modules from
Expand Down Expand Up @@ -649,6 +656,8 @@

- name: Setup project Bun
uses: ./.github/actions/setup-project-bun
with:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
Expand Down Expand Up @@ -689,6 +698,8 @@

- name: Setup project Bun
uses: ./.github/actions/setup-project-bun
with:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
Expand Down Expand Up @@ -725,6 +736,8 @@

- name: Setup project Bun
uses: ./.github/actions/setup-project-bun
with:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
Expand Down Expand Up @@ -824,6 +837,8 @@

- name: Setup project Bun
uses: ./.github/actions/setup-project-bun
with:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
Expand Down Expand Up @@ -893,6 +908,8 @@

- name: Setup project Bun
uses: ./.github/actions/setup-project-bun
with:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
Expand Down Expand Up @@ -1035,6 +1052,8 @@

- name: Setup project Bun
uses: ./.github/actions/setup-project-bun
with:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
Expand Down Expand Up @@ -1240,8 +1259,8 @@
run: bun run structure:check

# The composite Bun setup, run on each runner family it serves, when a change touches only the
# action (see the setup_action filter). One step past the action proves it installed the runtime
# package.json declares; nothing else runs, so this never grows into a suite.
# action (see the setup_action filter). Each role proves its resolved and installed
# version matches package.json; nothing else runs, so this never grows into a suite.
setup-action:
name: setup action ${{ matrix.os }}
needs: changes
Expand Down Expand Up @@ -1277,10 +1296,30 @@
exit 1
fi

- name: Setup project Bun test runner
id: bun-test-runner
uses: ./.github/actions/setup-project-bun
with:
role: test-runner

- name: Require the test runner package.json declares
Comment on lines +1299 to +1305
shell: bash
env:
RESOLVED: ${{ steps.bun-test-runner.outputs.version }}
run: |
set -euo pipefail
declared="$(node -p "require('./package.json').testRunnerBun")"
installed="$(bun --version)"
echo "declared=$declared resolved=$RESOLVED installed=$installed"
if [ "$RESOLVED" != "$declared" ] || [ "$installed" != "$declared" ]; then
echo "::error::setup-project-bun resolved '$RESOLVED' and installed '$installed', but package.json testRunnerBun declares '$declared'"
exit 1
fi

# The Rust remote-workspace helper, when a change touches it (see the remote_helper filter).
# Formatting once, then clippy and the crate's tests on each platform: the sandbox and the live
# confinement tests compile only on macOS and Windows, and Linux covers the protocol and stub.
remote-helper:

Check failure

Code scanning / CodeQL

Cache Poisoning via execution of untrusted code High

Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code from
needs.changes.outputs.checkout_ref
. (
workflow_dispatch
).
Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code from
needs.changes.outputs.checkout_ref
. (
schedule
).
name: remote helper ${{ matrix.os }}
needs: changes
if: needs.changes.outputs.remote_helper == 'true'
Expand Down Expand Up @@ -1432,12 +1471,10 @@
persist-credentials: false
ref: ${{ needs.changes.outputs.checkout_ref }}

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: 1.3.14
- name: Setup project Bun
uses: ./.github/actions/setup-project-bun

- name: Install dependencies

Check failure

Code scanning / CodeQL

Cache Poisoning via execution of untrusted code High

Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code from
needs.changes.outputs.checkout_ref
. (
workflow_dispatch
).
Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code from
needs.changes.outputs.checkout_ref
. (
schedule
).
run: |
bun install --frozen-lockfile
cd desktop
Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/dev-version-bump.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,13 @@ jobs:
persist-credentials: false

# The repository-owned composite action, not a hand-pinned setup-bun SHA: it
# resolves the Bun version from package.json so the runtime SOT stays in one
# place. An independently pinned action here would drift from every other job.
# selects package.json's test-runner pin even for this single-file test so
# validation follows the CI runner contract (see setup-project-bun/action.yml).
# This job edits version metadata; it does not compile a shipped runtime.
- name: Setup project Bun
uses: ./.github/actions/setup-project-bun
with:
role: test-runner

- name: Install dependencies
run: bun install --frozen-lockfile
Expand Down
8 changes: 6 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ For local development commands, architecture notes, and release workflow details
contributing guide above instead of duplicating instructions here.

Source development requires the `bun` CLI on your `PATH`. The published npm package bundles its own
Bun runtime for end users, but contributor commands such as `bun install`, `bun run test`, and
`bun run prepush` run from your local Bun installation.
Bun runtime for end users. Package scripts such as `bun run test` and `bun run prepush` may resolve
Bun through that bundled dependency.

## Pull request contract

Expand All @@ -61,6 +61,10 @@ A ready-for-review PR is the author's claim that the change is complete, underst

## Local validation and hooks

The suite uses Bun 1.4.0 (`testRunnerBun`) while the shipped runtime is 1.4.2.
`scripts/test.ts` finds a 1.4.0 binary on PATH or in `~/.bun/bin`, or uses
`OCX_TEST_RUNNER_BUN`; install that version locally if it is missing.

Run `bun run test` before review readiness. If the full local suite is too costly
for the task or available resources, run at least focused regression tests for
the changed behavior. Document the reason, commands, results, and remaining
Expand Down
7 changes: 6 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
# syntax=docker/dockerfile:1

# Keep the runtime aligned with package.json and pin the multi-platform image index.
ARG BUN_IMAGE=oven/bun:1.4.0@sha256:5ff609364c049b54eb0ff560ec96319729a972078ef2c755d758f0c6ef89c2d6
# Runtime 1.4.2 fixes #6684's Windows Bun.fetch streaming; CI tests stay on 1.4.0
# because 1.4.2 segfaults reloading preloads in multi-file --isolate (#4821;
# #6713 run 37631558263: Linux 1/4, macOS 2/2, Windows 9/9). Rejoin after the
# upstream crash fix passes a unified-version lane=all dispatch, then delete
# package.json's testRunnerBun pin and setup-project-bun's role input.
ARG BUN_IMAGE=oven/bun:1.4.2@sha256:9114c058aeae42162ee16dd5084b95fe9473970bb6bcb5b232ab1630f0546895

FROM ${BUN_IMAGE} AS manifest
WORKDIR /home/bun/app
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ OpenCodex tracks process-retained state in the categories below. Each has a docu
store, which is pinned and never evicted.
- **4 observed buffers** (translator accumulators, image/OAuth/Grok tails) are
monitored for in-flight byte pressure without eviction.
- **28 state-store registrations** handle expiry sweeps (60 s interval) and
- **31 state-store registrations** handle expiry sweeps (60 s interval) and
config-generation reconciliation so stale provider/account keys are removed.
- **Path and fingerprint memos** (workspace metadata, hardened identities, installation
salts, mode-hint capabilities) use insertion-order LRU caps (8–128 entries).
Expand Down Expand Up @@ -458,8 +458,8 @@ Acknowledging a report is not the same as triaging it, and no first-response tar

## Development

Source development requires the `bun` CLI on your `PATH`. This is separate from the published npm
package's bundled Bun runtime, which is used only by installed `ocx` commands.
Source development requires the `bun` CLI on your `PATH`. The published npm package bundles its own
Bun runtime for installed `ocx` commands; package scripts may also resolve Bun through that bundled dependency.

```bash
git clone https://github.com/lidge-jun/opencodex.git
Expand Down
28 changes: 14 additions & 14 deletions bun.lock

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

2 changes: 1 addition & 1 deletion desktop/src-tauri/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 desktop/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "opencodex-desktop"
version = "2.80.0"
version = "2.81.0"
description = "OpenCodex desktop shell"
authors = ["OpenCodex contributors"]
license = "MIT"
Expand Down
2 changes: 2 additions & 0 deletions desktop/src-tauri/src/provider_icons.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ macro_rules! svg {

const ALIASES: &[(&str, &str)] = &[
("anthropic", "claude-color.svg"),
("anthropic2", "claude-green.svg"),
("anthropic-apikey", "claude-color.svg"),
("claude-cli", "claude-color.svg"),
("azure-openai", "openai.svg"),
Expand Down Expand Up @@ -152,6 +153,7 @@ fn svg(file: &str) -> Option<&'static str> {
"bizrouter.svg" => svg!("bizrouter.svg"),
"cerebras.svg" => svg!("cerebras.svg"),
"claude-color.svg" => svg!("claude-color.svg"),
"claude-green.svg" => svg!("claude-green.svg"),
"cline-color.svg" => svg!("cline-color.svg"),
"cloudflare-ai-gateway-color.svg" => svg!("cloudflare-ai-gateway-color.svg"),
"commandcode-color.svg" => svg!("commandcode-color.svg"),
Expand Down
2 changes: 1 addition & 1 deletion desktop/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "OpenCodex",
"version": "2.80.0",
"version": "2.81.0",
"identifier": "com.opencodex.desktop",
"build": {
"frontendDist": "../ui",
Expand Down
Loading
Loading