Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
736fa50
chore(release): open dev at 2.94.0 before releasing 2.93.0 (#7795)
github-actions[bot] Oct 27, 2026
dd8bf1d
fix(claude): report a timed-out first-party rollback as incomplete (#…
lidge-jun Oct 27, 2026
f94e95c
feat(responses): preserve structural tool turns (#7561)
Platinum-Scripts Oct 27, 2026
42549ba
feat(providers): add Runcrate to the free directory (#7726)
heydryft Oct 27, 2026
15b38cb
chore(ci): take every Bun pin from package.json (#7818)
lidge-jun Oct 27, 2026
2b5148b
fix(xai): publish the subscription lane's widest context rung for Gro…
andrew05060414 Oct 27, 2026
9a757f5
perf(google): avoid rescanning fragmented SSE records (#7766)
luvs01 Oct 27, 2026
e72f5d6
fix(claude): expire idle picker uploads while preserving backpressure…
luvs01 Oct 27, 2026
962546a
fix(openai-chat): preserve native Mistral thinking on replay (#7814)
adaurban Oct 27, 2026
1fe3dd7
fix(windows): preserve bounded ACL failure diagnostics (#7773)
luvs01 Oct 27, 2026
d9f594b
feat(integrations): refresh connected Hermes configs after catalog ch…
rafaelmoreiraai Oct 27, 2026
04f1988
fix(claude): preserve append-only client tool discovery on opted-in R…
gitrvc-hub Oct 27, 2026
d519ab0
fix(responses): frame retained requests before portable compaction ch…
lidge-jun Oct 27, 2026
e25be53
fix(combos): scope cooldown reprobes to reserving request (#7764)
luvs01 Oct 27, 2026
377fa52
test(providers): fix ASL server fixture cleanup and budgets (#7778)
luvs01 Oct 27, 2026
98e6f0c
fix(google): honor Retry-After floor and recognize the Cloud Code Ass…
lidge-jun Oct 27, 2026
102ccee
fix(providers): guard MiniMax seed refresh by destination (#7829)
lidge-jun Oct 27, 2026
1112f5b
fix(qoder): forward Qoder CN images through shared coding-agent proje…
chilung-cgu Oct 27, 2026
4118b90
feat(codex): add confirmed POSIX CLI updates and durable job status (…
luvs01 Oct 27, 2026
41bd7e4
fix(startup): verify live Desktop recovery before CLI cold start (#7797)
luvs01 Oct 27, 2026
95cfa30
fix(windows): support long compaction recovery paths (#7823)
lidge-jun Oct 27, 2026
0c32c81
fix(claude): expose native Fast selectors with 1M context (#7748)
jbamlee Oct 27, 2026
e04aae0
fix(anthropic): align Claude Code 2.1.280 OAuth profile and isolate s…
lidge-jun Oct 27, 2026
ba880df
fix(codex): isolate pooled installation IDs, scrub turn-state on acco…
lidge-jun Oct 27, 2026
1d91861
fix(google,cursor): isolate Antigravity session/replay and Cursor H2 …
lidge-jun Oct 27, 2026
f4a3312
fix(oauth): harden multi-account pool cooldowns, affinity eviction, a…
lidge-jun Oct 27, 2026
48a0f9e
fix(zed): relay OpenAI tool calls instead of ending on the first sent…
andrew05060414 Oct 27, 2026
c4dbcc0
fix(service): explain elevated scheduler uninstall failures on Window…
lidge-jun Oct 27, 2026
7deb359
fix(logs): preserve replay refusal attribution on WebSocket ingress (…
lidge-jun Oct 27, 2026
a5ecb91
test(messaging): reserve distinct remote fixture ports (#7820)
lidge-jun Oct 27, 2026
611f403
docs(gui): clarify subagent spawn_agent fill behavior in order hint (…
chilung-cgu Oct 27, 2026
3481ace
fix(chat): deliver upstream raw reasoning to Chat clients without a g…
lidge-jun Oct 27, 2026
c5c2196
fix(antigravity): request quota summary with the CLI fingerprint so A…
junhoi-pk Oct 27, 2026
343c87b
fix(antigravity): consolidate multi-account discovery and model-denia…
lidge-jun Oct 27, 2026
8145d52
fix(responses): enforce required tools in native combo streams (#7831)
lidge-jun Oct 28, 2026
38fcb22
fix(server): reclaim inbound body capacity with a configurable budget…
oocheol Oct 28, 2026
dc0ed96
docs(agents): treat lane=all as a batched dev check, not a per-PR gat…
lidge-jun Oct 28, 2026
a09e882
fix(cli): attest connected-stop preflight reads (#7762)
luvs01 Oct 28, 2026
d9ae8e5
fix(anthropic): keep pool session affinity across restarts and transi…
lidge-jun Oct 28, 2026
0fc96b0
feat(claude): label routed /v1/models rows from modelDisplayNames (#7…
david-wang-0 Oct 28, 2026
ce608ab
docs: keep the provider configuration reference under the file-size c…
lidge-jun Oct 28, 2026
338bcf5
fix(codex): preserve native source priority behind featured subagent …
lidge-jun Oct 28, 2026
86da613
fix(codex): keep native main available after keyring migration (#7774)
luvs01 Oct 28, 2026
b33fc56
feat(cli): add `ocx codex` launcher mirroring `ocx claude` (#7346)
garysassano Oct 28, 2026
6bc511d
fix(windows): gate config and Desktop writer phases on config-root AC…
lidge-jun Oct 28, 2026
abc932d
fix(desktop): provide paired authority for compatibility controls (#7…
luvs01 Oct 28, 2026
f7b4fd6
feat(link): Windows Remote Link Children and Child credential/connect…
lidge-jun Oct 28, 2026
a4e4cda
test: stop rebinding released loopback ports (#7847)
lidge-jun Oct 28, 2026
504417f
fix: land ten small jsonc, search, retry, plain-data and stream fixes…
lidge-jun Oct 28, 2026
0eb5897
fix(responses): recognize exact case-insensitive media types (#7768)
luvs01 Oct 28, 2026
96f2f47
feat(codex): restore LazyCodex role models from a change history (#7693)
LilMGenius Oct 28, 2026
4bf5728
fix(dsh): export a known output limit as `maxTokens` (#7763)
daisylovekris Oct 28, 2026
e1976da
fix(advisor): preserve captured caller admission scope (#7718)
luvs01 Oct 28, 2026
1997c69
fix(openai-chat): keep captured usage on an invalid negotiated comple…
xubenqiang Oct 28, 2026
fb22d05
test: isolate Windows fixture children from the account-wide runtime …
lidge-jun Oct 28, 2026
8178745
feat(codex): add proof-bound Windows CLI update planning (#7596)
luvs01 Oct 28, 2026
4cdcb50
perf(tooling): use Bun 1.4.4 native type checking (#7632)
luvs01 Oct 28, 2026
a18de03
feat(clients): add T3 Code as an export and integration client (#7529)
stevyhacker Oct 28, 2026
c0014da
fix(codex): validate macOS app trust at execution boundaries (#7758)
luvs01 Oct 28, 2026
4b2fc8d
test: assert the specific refusal gate in the fixture preload tests (…
lidge-jun Oct 28, 2026
f26d6e8
fix(responses): preserve combo replay-refusal attribution (#7864)
lidge-jun Oct 28, 2026
aef4b6a
Kiro: drop the private final answer when a real tool call shares the …
hedging8563 Oct 28, 2026
d67fedd
docs(responses): register and document citation replay coverage (#7865)
lidge-jun Oct 28, 2026
6f0d5eb
fix: Stream completion-stable canonical apply_patch input (#7506)
Platinum-Scripts Oct 28, 2026
a7072ec
fix(quota-pool): compute pooled windows from held account rows (#7862)
lidge-jun Oct 28, 2026
08d80f2
fix(link): restore local routing when a Link Child stops (#7736)
luvs01 Oct 28, 2026
3ca9927
fix(router,combos): hop and cool provider on upstream account quota e…
omar391 Oct 28, 2026
4db8772
fix(gui): avoid quota refresh failures from paused accounts (#7628)
chilung-cgu Oct 28, 2026
f209d42
feat(dashboard): revocable server-side remembered device sessions (#7…
x3M3x Oct 28, 2026
07161c5
fix(clients): reject drive-less rooted Windows path overrides (#7824)
lidge-jun Oct 28, 2026
cd26e92
test: stop restarting the proxy per row in the bearer admission matri…
lidge-jun Oct 28, 2026
7a1565b
fix(cli): recheck live ownership before journal recovery (#7851)
lidge-jun Oct 28, 2026
63820c4
feat(codex): add protected Windows CLI update job storage (#7626) (#7…
luvs01 Oct 28, 2026
100ab90
fix: disable header-arrival deadline for local upstreams by default (…
eschcam Oct 28, 2026
713fdfb
fix(config): keep a protected recovery copy before persisting the ope…
lidge-jun Oct 28, 2026
86b8216
test(claude): isolate first-party desktop lifecycle locks (#7868)
lidge-jun Oct 28, 2026
c655484
feat(codex): apply Windows CLI updates with owned transactions (#7648…
luvs01 Oct 28, 2026
3b8414d
feat(integrations): add opt-in alias naming for Hermes and Command Co…
lidge-jun Oct 28, 2026
f716508
feat(shadow-call): add per-source interception toggles (#7760)
robin-bially Oct 28, 2026
f9e7d93
fix(update): preserve service-home authority during recovery (#7154)
luvs01 Oct 28, 2026
492c1a1
ci: bound frozen installs and retry only deadline stalls (#7870)
lidge-jun Oct 28, 2026
fdc6dd8
fix(windows): admit local config writer phases after config-root ACL …
lidge-jun Oct 28, 2026
1f84057
test(claude): isolate the remaining Desktop lifecycle-lock fixtures (…
lidge-jun Oct 28, 2026
5b70174
test: bound desktop compatibility fixture port recovery (#7897)
lidge-jun Oct 28, 2026
508349e
fix(ci): rerun interrupted postinstalls after install timeout (#7898)
lidge-jun Oct 28, 2026
e7778fe
fix(ci): keep the bun install command non-empty for macOS bash 3.2 (#…
lidge-jun Oct 28, 2026
6ed7d6e
test: copy macOS bundle binary in remote workspace fixture (#7901)
lidge-jun Oct 28, 2026
12c0ec6
fix(windows): verify private lifecycle runtime roots before ACL propa…
lidge-jun Oct 28, 2026
83062fc
test: expose Windows recovery proof state and drain failed fixtures (…
lidge-jun Oct 28, 2026
7eab243
fix(windows): recover interrupted Codex CLI child publication (#7909)
lidge-jun Oct 28, 2026
b46db27
test: separate recovery PID evidence and budget cold Windows fetches …
lidge-jun Oct 28, 2026
be6b6b9
test: stub the owner-ACL verifier in mocked config-root fixtures and …
lidge-jun Oct 28, 2026
f5a5e5b
test: partition Windows apply coverage and refresh shard weights (#7917)
lidge-jun Oct 28, 2026
f29091a
fix(restart): retire drained parent ownership and preserve bind scope…
luvs01 Oct 28, 2026
53a98e9
fix(codex): address Windows updater release and observation reviews (…
luvs01 Oct 28, 2026
b383b1f
test(link): give Windows Child HTTP non-deadline scenarios a realisti…
lidge-jun Oct 28, 2026
b16bc09
ci(windows): refresh weights and spread suite over eleven shards (#7923)
lidge-jun Oct 28, 2026
e7b8cdf
docs: generate a client support matrix from the client registries (#7…
lidge-jun Oct 28, 2026
640a40f
test(claude): make CONNECT upstream failure deterministic (#7929)
lidge-jun Oct 28, 2026
06ec878
test(service): stabilize native recovery fixture compilation (#7930)
lidge-jun Oct 29, 2026
386c3bb
docs: lead with one local gateway for every coding tool (#7925)
lidge-jun Oct 29, 2026
d2a3186
fix(gui): show provider connection and model tests on the served dash…
lidge-jun Oct 29, 2026
8eb970d
fix(claude): fail native Messages streams that end before message_sto…
lidge-jun Oct 29, 2026
9c33e46
ci(macos): split suite across four weighted shards (#7926)
lidge-jun Oct 29, 2026
d2c1bac
release: promote frozen tip 9c33e4658b7b180ec8dd20f0e6a21daf3699f76e …
lidge-jun Oct 29, 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
  •  
  •  
  •  
91 changes: 38 additions & 53 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ on:
# Nightly safety net. The Windows shards run on a pull request only when the
# changes job judges it Windows-sensitive, so anything that slips past that
# filter must still be caught within a day: a scheduled run requests the full
# lane=all matrix (nine Windows shards and the macOS control included).
# lane=all matrix (eleven Windows shards and the macOS control included).
#
# GitHub runs schedules from the DEFAULT branch, which is main, so this
# trigger activates only once this file reaches main by promotion, and the
Expand Down Expand Up @@ -235,7 +235,7 @@ jobs:
# Push, dispatch and schedule run both regardless; see the docker/keyring filters.
docker: ${{ steps.narrow.outputs.docker }}
keyring: ${{ steps.narrow.outputs.keyring }}
# Whether this pull request needs the nine Windows shards: the windows path
# Whether this pull request needs the Windows shards: the windows path
# filter below OR an added src/tests line naming a Windows marker. Computed
# by scripts/ci/windows-sensitive-diff.sh, which validates its input and
# treats the diff as data.
Expand Down Expand Up @@ -428,7 +428,7 @@ jobs:
- 'package.json'
- 'bun.lock'
- '.github/workflows/ci.yml'
# Paths whose change selects the nine Windows suite shards on a pull
# Paths whose change selects the Windows suite shards on a pull
# request. These carry the Windows service, update, shim, intercept,
# ACL and process code, and the harness every Windows shard runs.
# scripts/ci/windows-sensitive-diff.sh adds the content markers.
Expand Down Expand Up @@ -696,10 +696,7 @@ jobs:
# gui/package.json. Without this the affected shards die on
# `Cannot find module 'react/jsx-dev-runtime'` while the other shards pass.
- name: Install dependencies
run: |
bun install --frozen-lockfile
cd gui
bun install --frozen-lockfile
run: bash scripts/ci/bun-install-frozen.sh . gui

# Nor is the build. Tests that fetch the served dashboard read the session
# bootstrap meta tags out of `gui/dist/index.html`, so without a build the
Expand Down Expand Up @@ -734,7 +731,7 @@ jobs:
with:
role: test-runner # See the Bun roles contract above test.
- name: Install dependencies and build the GUI the tests serve
run: bun install --frozen-lockfile && cd gui && bun install --frozen-lockfile && bun run build
run: bash scripts/ci/bun-install-frozen.sh . gui && cd gui && bun run build
- name: Test the files this pull request reaches
run: bash scripts/ci/run-changed-tests.sh

Expand All @@ -760,10 +757,7 @@ jobs:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
bun install --frozen-lockfile
cd gui
bun install --frozen-lockfile
run: bash scripts/ci/bun-install-frozen.sh . gui

- name: Build GUI
run: |
Expand Down Expand Up @@ -802,10 +796,7 @@ jobs:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
bun install --frozen-lockfile
cd gui
bun install --frozen-lockfile
run: bash scripts/ci/bun-install-frozen.sh . gui

- name: Build GUI
run: |
Expand Down Expand Up @@ -840,10 +831,7 @@ jobs:
role: test-runner # See the Bun roles contract above test.

- name: Install dependencies
run: |
bun install --frozen-lockfile
cd gui
bun install --frozen-lockfile
run: bash scripts/ci/bun-install-frozen.sh . gui

- name: GUI lint
if: needs.changes.outputs.gui == 'true'
Expand Down Expand Up @@ -897,29 +885,29 @@ jobs:
run: bun run src/cli/index.ts help

platform-macos:
name: macos ${{ matrix.shard }}/3
name: macos ${{ matrix.shard }}/4
needs: changes
# Never on pull requests: macOS legs run after merge, on push to
# main/preview, and on dispatch and the schedule.
if: github.event_name != 'pull_request'
runs-on: macos-latest
# Three shards. Unsharded, this job was the critical path on every green dev
# push (mean 14.9 min against a 4.7 min Linux maximum; devlog
# 260905_test_modularization_and_windows/003), so it was split in two. The
# suite then outgrew two halves: across seventeen dev dispatches from
# 2026-10-04 to 10-12 the slower half's test step went from 867s to 1155s,
# and run 38214884055 cancelled macos 2/2 at this cap with 68 files left
# while every test it had run was passing (#6978). Replaying the duration
# assignment against those runs' measured per-file times puts the slowest of
# three shards at 635-796s of tests, about 14 minutes with setup. The cap
# stays 20: the suite needs another shard, not a longer wait, and a wedged
# shard (#4956) is still cut off as early as before. The full-membership
# control runs the same bounded batches without sharding on explicit dispatch.
# Four shards. Three replaced two after run 38214884055 hit this cap with
# 68 files left and no failing tests (#6978). The suite outgrew three too:
# run 40727740334 took 13.1-16.4m, 40743681086 12.7-13.7m, and
# 40756291846 15.0-17.1m. In dev lane=all run 40766068492 (b16bc0978b),
# macos 1/3 (123090588998) reached batch 73/88 and macos 2/3
# (123090589363) batch 93/93 before this cap cancelled them, with no failing
# tests. The cap stays 20: the suite needs another shard, not a longer wait,
# and a wedged shard (#4956) is still cut off as early as before. Four suite
# shards + control + widget/bundle request six macOS jobs for five runner
# slots: one queues, and each run pays one extra shard's setup overhead.
# The full-membership control runs the same bounded batches without sharding
# on explicit dispatch.
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3]
shard: [1, 2, 3, 4]
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
Expand Down Expand Up @@ -965,7 +953,7 @@ jobs:

- name: Test in fresh-process batches
env:
TEST_SHARD: ${{ matrix.shard }}/3
TEST_SHARD: ${{ matrix.shard }}/4
BUN_TEST_FILE_SCOPE: all
BUN_TEST_BATCH_SIZE: '12'
BUN_TEST_PARALLEL: '1'
Expand Down Expand Up @@ -1077,7 +1065,7 @@ jobs:
# each landed with green pull-request CI while breaking Windows, which is why
# that dispatch is part of merging a Windows-sensitive pull request.
platform-windows:
name: windows ${{ matrix.shard }}/9
name: windows ${{ matrix.shard }}/11
needs: [changes, select-windows-runner]
if: >-
github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' && (github.event.inputs.lane == '' || github.event.inputs.lane == 'all')
Expand Down Expand Up @@ -1108,21 +1096,18 @@ jobs:
# test deadline and all six shards, but left the whole batch and cleanup a
# 30-minute bound.
#
# Six shards then grew into the 30-minute ceiling too. Across seven lane=all
# dispatches the six shard totals were 114.3-133.2 minutes. The worst observed
# shard imbalance was 1.43x its dispatch's per-shard average. Eight shards leave
# no margin: 133.2 / 8 * 1.43 * 1.25 = 29.8 minutes after the already-observed
# 25% run-to-run slowdown. Nine gives 133.2 / 9 * 1.43 * 1.25 = 26.5 minutes.
# Keep the 30-minute bound and pay for three more concurrent runners plus their
# repeated checkout/install/build setup so test work, rather than the ceiling,
# shrinks. The per-batch timeout below is independent: it aborts a stuck Bun
# process but adds no delay to a healthy one, so calibrating it does not change
# this total-work projection.
# Nine shards also reached the ceiling: run 40756291846 cancelled 7/9 at batch
# 49/60; run 40743681086's successful shards took 22.1-29.5 minutes. Refreshing
# Windows weights from completed primary batches in both runs puts test work
# at 24.36/21.92/19.93 minutes with 9/10/11 shards. With the observed 2.4-minute
# maximum setup, eleven projects ~22.4 minutes; 25% test variance makes ~27.3.
# Pay for two extra setups (~3.3 runner-minutes at the older run's mean), keep
# the 30-minute job bound and all tests, and leave batch deadlines independent.
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9]
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
steps:
- name: Show selected runner
shell: bash
Expand Down Expand Up @@ -1202,7 +1187,7 @@ jobs:
# and service-manager guard before the lock boundary.
shell: bash
env:
TEST_SHARD: ${{ matrix.shard }}/9
TEST_SHARD: ${{ matrix.shard }}/11
BUN_TEST_FILE_SCOPE: all
BUN_TEST_BATCH_SIZE: "6"
BUN_TEST_BATCH_TIMEOUT_SECONDS: "480"
Expand Down Expand Up @@ -1341,7 +1326,7 @@ jobs:
# aggregate reported success while nothing had read the change (#5001).
#
# Running the gate directly here, rather than adding `structure/**` to `ci`,
# keeps a prose edit from starting nine Windows shards and two macOS shards for
# keeps a prose edit from starting the Windows shards and macOS shards for
# a check that takes seconds. It runs whenever `structure/` changes, including
# alongside a `src/` change where the suite covers it too; a duplicate of a
# seconds-long check is not worth a condition that could be wrong.
Expand Down Expand Up @@ -1893,7 +1878,7 @@ jobs:
if [ -z "$LANE" ] || [ "$LANE" = "all" ] || [ "$LANE" = "macos-control" ]; then
dispatch=requested
fi
# Only the default/all lane requests the nine Windows suite shards.
# Only the default/all lane requests the Windows suite shards.
if [ -z "$LANE" ] || [ "$LANE" = "all" ]; then
windows=requested
fi
Expand Down Expand Up @@ -1965,10 +1950,10 @@ jobs:
# started: five successes and one skipped leg roll up to `success`. No matrix here
# carries a per-leg `if:`, so a leg can only be skipped when its whole job is, which
# the expectation table above already catches. What that table cannot catch is a
# matrix that produced FEWER legs than the nine a dispatch is run to read, so count
# them by name. The nine Windows legs are the entire output of that dispatch.
# matrix that produced FEWER legs than the eleven a dispatch is run to read, so count
# them by name. The eleven Windows legs are the entire output of that dispatch.
if [ "$windows" = requested ]; then
shards=9
shards=11
# `filter=latest` (the default) is the latest execution of each job in the run,
# which is what a human reading the run sees. Asking for one ATTEMPT instead would
# fail every partial re-run: "Re-run failed jobs" puts only the repaired shard in
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/cleanup-orphaned-workflows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ jobs:
persist-credentials: false

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: 1.4.2
# The repository composite reads package.json dependencies.bun from the
# checkout above, so this job cannot drift from the runtime pin.
uses: ./.github/actions/setup-project-bun

- name: Remove stale workflow histories
env:
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/deploy-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ jobs:
with:
path: ./docs-site
node-version: 22
package-manager: bun@latest
# Must equal package.json dependencies.bun (asserted in ci-workflows.test.ts).
package-manager: bun@1.4.4

deploy:
needs: build
Expand Down
16 changes: 15 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ it binds you regardless of which mechanism is within reach.

```bash
bun install
bun run typecheck # bun x tsc --noEmit (strict)
bun run typecheck # bun check --no-script --noEmit (strict)
bun run test:changed # import-graph tests against the resolved `dev` merge base
bun run test # full tests/ suite (default before review)
bun run lint:gui # GUI eslint
Expand Down Expand Up @@ -375,6 +375,20 @@ than nudged.
add `ci:full` for changes it cannot see (subprocesses, files read as data, generated output).
- Full cross-platform (macOS/Windows) CI runs **only** via manual
`workflow_dispatch` and on push to `main`/`preview` (release lines).
- A manual `lane=all` dispatch is a **batch check on `dev`**, never a per-PR gate.
One run is about 32 jobs (11 Windows, at least 6 macOS, 15 Linux) and six runner-hours, and the
account has only five macOS slots (a macOS job can queue), so per-PR dispatches starve
every other check. On 2026-10-27, parallel agent lanes dispatched 48 of them in twelve hours (about 13,000
runner-minutes). The queue passed 200 runs, and ordinary PR checks waited hours to start.
- Merge a pull request, including a Windows- or macOS-sensitive one, on its green PR
CI. After a batch of merges, run one `gh workflow run ci.yml --ref dev` as described
under "Batched merges". If it is red, stop merging and fix `dev` from that batch.
- Do not dispatch `lane=all` for a PR branch unless a maintainer explicitly asks for it
on that PR. Even then, run it once, on the exact head about to merge. Never re-dispatch
because the head moved (an `origin/dev` merge or a review fix), and never rerun to
green. Cancel your own superseded dispatches with `gh run cancel`.
- Every description edit or label change starts three event-gate workflows. Batch those
edits, and keep the number of agents working pull requests in parallel small.
- **Never** add a `dev` push trigger, or `pull_request` runs for macOS/Windows
jobs, to any workflow. PRs that change this policy will be closed.

Expand Down
35 changes: 27 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<p align="center">
<img src="assets/banner.png" alt="opencodex — universal provider proxy for Codex, Claude Code, Claude Desktop and Grok Build" width="100%">
<img src="assets/banner.png" alt="opencodex — one local gateway for Codex, Claude Code, Claude Desktop, Grok Build and more" width="100%">
</p>

<h3 align="center">make codex open!</h3>
<p align="center"><b>Universal provider proxy for OpenAI Codex, Claude Code, Claude Desktop &amp; Grok Build</b><br>
Two commands, and every one of them runs any LLM you point it at.</p>
<h3 align="center">One local gateway for your AI coding tools and models.</h3>
<p align="center"><b>Use the models you choose with Codex, Claude Code, Claude Desktop and Grok Build,<br>
and connect OpenCode, Pi, Qoder, WorkBuddy, Kilo, Cline, T3 Code and more through managed configs.</b><br>
<a href="https://opencodex.me/reference/client-support/">See every supported tool →</a></p>

<p align="center">
<a href="https://x.com/claudeebum"><img src="https://img.shields.io/badge/%40claudeebum-000000?logo=x&logoColor=white" alt="Follow @claudeebum on X"></a>
Expand Down Expand Up @@ -80,10 +81,12 @@ Sol drives the session and calls a Kimi K3 subagent.
<a href="README.md">English</a> · <a href="readme/README.fr.md">Français</a> · <a href="readme/README.ko.md">한국어</a> · <a href="readme/README.zh-CN.md">简体中文</a> · <a href="readme/README.zh-TW.md">繁體中文</a> · <a href="readme/README.ru.md">Русский</a> · <a href="readme/README.ja.md">日本語</a> · <a href="readme/README.tr.md">Türkçe</a> · 📖 <a href="https://opencodex.me/"><b>Full documentation →</b></a>
</p>

opencodex is a lightweight local proxy that translates Codex's Responses API into whatever your
provider speaks — streaming, tool calls, reasoning tokens, images, in both directions. Use Claude,
Gemini, Grok, GLM, DeepSeek, Kimi, Qwen, Ollama, or any other LLM with Codex, Claude Code, Claude
Desktop, and Grok Build. It can also manage a **ChatGPT account pool** for Codex auth: add accounts,
opencodex is a lightweight local gateway between your coding tools and your model providers. It
accepts the Responses, Chat Completions and Anthropic Messages APIs and translates each request into
whatever your provider speaks, carrying streaming, tool calls, reasoning and images where the client,
model and provider support them. Use Claude, Gemini, Grok, GLM, DeepSeek, Kimi, Qwen, Ollama and other
providers with Codex, Claude Code, Claude Desktop, Grok Build and the tools listed on the
[client support page](https://opencodex.me/reference/client-support/). It can also manage a **ChatGPT account pool** for Codex auth: add accounts,
refresh their quotas in the dashboard, and let new sessions auto-route to the lowest-usage healthy
account while existing threads stay pinned to the account that started them.

Expand All @@ -102,6 +105,22 @@ Open **http://localhost:10100** and configure everything in the web dashboard
(40+ built-ins, or any OpenAI-compatible endpoint), pick models, manage accounts. `ocx gui`
re-opens the dashboard at any time.

### Connect your tool

Connect the tool you already use:

| Tool | How to connect |
|---|---|
| Codex | Turn on the Codex switch on the dashboard's **Connect** page, then run `codex` as usual. On a local listener this points Codex's built-in provider at the proxy. From the terminal, run `ocx init` before adding providers in the dashboard and accept its Codex prompt. |
| Claude Code | With the `claude` CLI installed, run `ocx claude`. It starts the proxy if needed and launches Claude Code through it. |
| Claude Desktop | Run `ocx claude desktop`. On a new install it sets up the gateway profile for the whole app; an existing first-party setup is kept, and `ocx claude desktop apply --gateway` switches explicitly. See the [Claude Code guide](https://opencodex.me/guides/claude-code/). Fully quit and reopen Claude Desktop after a switch. |
| Grok Build | On a local listener with Grok integration enabled, `ocx start` registers the models when `~/.grok` exists; pick an `ocx-*` model in Grok Build. Remote setups: see the [Grok Build guide](https://opencodex.me/guides/grok-build/). After adding providers, restart the proxy (or run `ocx ensure` when Codex autostart is enabled) to refresh the list. |
| Tools with a managed integration | Use the dashboard **Connect** page, or `ocx integration client enable --client <id>`. |
| Any other tool | Set a custom OpenAI-compatible base URL of `http://localhost:10100/v1`, or an Anthropic base URL of `http://localhost:10100`. |

The [client support page](https://opencodex.me/reference/client-support/) lists which path each tool has
and which protocol it speaks.

<details>
<summary><b>Desktop app (beta)</b></summary>

Expand Down
Loading
Loading