Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ See [SPONSORS.md](./SPONSORS.md).
<td width="180"><a href="https://www.packyapi.com/register?aff=k5KT"><img src="assets/sponsors/packycode.png" alt="PackyCode" width="150"></a></td>
<td>Thanks to <a href="https://www.packyapi.com/register?aff=k5KT">PackyCode</a> for sponsoring this project! PackyCode is a stable, high-performance API relay provider, offering relay services for Claude Code, Codex, Gemini, and more. With automatic failover, smart routing, and unlimited concurrency, it turns AI into a real productivity tool. <a href="https://www.packyapi.com/register?aff=k5KT">Register via this link</a> and get started! Pick <code>PackyCode</code> in the Add provider picker or run <code>ocx provider add packycode</code>.<br><sub>PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。<a href="https://www.packyapi.com/register?aff=k5KT">点此链接注册</a>,立即开始使用!</sub></td>
</tr>
<tr>
<td width="180"><a href="https://tokenlab.sh/r/OPENCODEX"><picture><source media="(prefers-color-scheme: dark)" srcset="assets/sponsors/tokenlab-dark.png"><img src="assets/sponsors/tokenlab-light.png" alt="TokenLab" width="150"></picture></a></td>
<td>Thanks to <a href="https://tokenlab.sh/r/OPENCODEX">TokenLab</a> for sponsoring this project! TokenLab gives coding agents one API key for leading models, supporting OpenAI Responses and Chat Completions, Anthropic Messages, and Gemini's native API formats, with streaming and tool calling. It also provides an MCP server and agent Skills for easy integration. Choose your delivery mode and pay as you go. Pick <code>TokenLab</code> in the Add provider picker or run <code>ocx provider add tokenlab</code>.<br><sub>TokenLab 为编程智能体提供统一的多模型 API,一枚 API Key 即可接入主流模型,支持 OpenAI Responses、Chat Completions、Anthropic Messages 和 Gemini 原生 API 格式,以及流式输出和工具调用。同时提供 MCP 服务器和 Agent Skills,方便接入现有工作流;交付模式可选,按量付费。</sub></td>
</tr>
</tbody>
</table>

Expand Down
9 changes: 4 additions & 5 deletions SPONSORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ sponsor receives:
policy. A second-language blurb (for example Chinese) may run alongside the English one.
- A built-in provider preset (`ocx provider add <id>`) shipped in a public npm release,
listed near the top of the provider picker in the dashboard and CLI and marked as a sponsor
there. (The registry field and picker ordering that back this land with the first sponsor
preset; today the picker follows registry order.)
there. The dashboard picker, `ocx init` and `ocx provider presets` list sponsor rows Main
before Standard, then alphabetically by label, an order no sponsor can buy.
- A detailed entry on the [providers page](https://opencodex.me/guides/providers/) of the docs
site.
- Maintenance: if a release breaks the preset or its adapter, the maintainer fixes it; issues
Expand All @@ -66,9 +66,8 @@ and the placements themselves:
The README says nothing else about sponsorship; tiers, pricing, and contact channels live only on
this page.

The translated READMEs under [`readme/`](./readme) carry one linking line right after their
own quick-start block instead of duplicating the section, so a sponsor change is one edit in
English.
The translated READMEs under [`readme/`](./readme) carry the same sponsor section, with each
row's thanks line and blurb translated, so a sponsor change updates every README together.

## Pricing

Expand Down
Binary file added assets/sponsors/tokenlab-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/tokenlab-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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.71.0-preview.20260929"
version = "2.72.0-preview.20260930"
description = "OpenCodex desktop shell"
authors = ["OpenCodex contributors"]
license = "MIT"
Expand Down
3 changes: 3 additions & 0 deletions desktop/src-tauri/src/provider_icons.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ const ALIASES: &[(&str, &str)] = &[
("orcarouter", "orcarouter.svg"),
("orcarouter-oauth", "orcarouter.svg"),
("packycode", "packycode.svg"),
("tokenlab", "tokenlab.svg"),
("parallel", "parallel.svg"),
("sambanova", "sambanova.svg"),
("scaleway", "scaleway.svg"),
Expand Down Expand Up @@ -131,6 +132,7 @@ fn paint(file: &str) -> &'static str {
| "packycode.svg"
| "siliconflow.svg"
| "synthetic.svg"
| "tokenlab.svg"
| "vercel-ai-gateway-color.svg"
| "zenmux.svg" => "mask",
"baseten.svg" | "kilo.svg" | "sambanova.svg" | "venice.svg" | "zai.svg" => "plate",
Expand Down Expand Up @@ -200,6 +202,7 @@ fn svg(file: &str) -> Option<&'static str> {
"stepfun-color.svg" => svg!("stepfun-color.svg"),
"synthetic.svg" => svg!("synthetic.svg"),
"together.svg" => svg!("together.svg"),
"tokenlab.svg" => svg!("tokenlab.svg"),
"umans.svg" => svg!("umans.svg"),
"venice.svg" => svg!("venice.svg"),
"vercel-ai-gateway-color.svg" => svg!("vercel-ai-gateway-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.71.0-preview.20260929",
"version": "2.72.0-preview.20260930",
"identifier": "com.opencodex.desktop",
"build": {
"frontendDist": "../ui",
Expand Down
18 changes: 18 additions & 0 deletions devlog/_fin/260929_release_2_71_0/032_wp3_results.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# 032 wp3 results: landed on dev

| Step | Evidence |
|---|---|
| Screenshots | pr-assets 947e869c8b (`260929-release-2-71-0/request-pacing.png`, `cursor-installer.png`), fast-forward from ea1749154d |
| PR | #6224 `chore(release): integrate six reviewed PRs for 2.71.0`, head dcfbb2f708 |
| PR-event CI | Cross-platform CI 36525839698 success; Service lifecycle 36525839767 success; React Doctor 36525839694, PR hygiene, Enforce PR target branch success |
| Full-lane CI | Cross-platform CI workflow_dispatch 36526719414 (lane all) success: 39 jobs success, 1 skipped; includes windows 1/9-9/9 (the pull_request event skips the Windows matrix, ci.yml:835-839) and macos control |
| Head totals | 80 check-runs: 74 success, 6 skipped by design, 0 failed |
| Policy | `scripts/ci/assert-mergeable-review.sh --maintainer-integration 6224`: OK; decision recorded in PR comment 5884552184 |
| Merge | `gh pr merge 6224 --admin --merge --match-head-commit dcfbb2f708` -> dev d161c0e83e; all six land commits and four fixes are ancestors of dev |
| Source PRs | #6206 #6201 #6209 #6094 #5905 #6198 closed with a comment naming the land commit; issue #6208 closed with the #6209 commit |

Note: windows 8/9 passed in 36526719414, including the 32-profile transaction case that failed
the dev tip in 36499924172, now under BULK_DURABLE_IO_BUDGET_MS.

Candidate for 040: dev d161c0e83e (version sources 2.71.0).

Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ that merge commit is informative; the gating runs are on the promotion SHAs.

1. Pre-move dev: `gh workflow run dev-version-bump.yml --ref main -f intended-version=2.71.0 -f mode=pre-move`;
the opened PR must change only the four version sources to 2.72.0 (package.json,
desktop/src-tauri/Cargo.toml, Cargo.lock, tauri.conf.json); merge it with --admin --merge
--match-head-commit.
desktop/src-tauri/Cargo.toml, Cargo.lock, tauri.conf.json); merge it with --admin --squash
--match-head-commit (as #6213).
2. Preview: branch `codex/promote-preview-2-71-0` from the candidate, `git merge -s ours origin/preview`,
`bun scripts/release-version-sources.ts sync 2.71.0-preview.20260929`, commit, PR to preview,
merge commit. Wait for push-event Cross-platform CI and Service lifecycle success on the
Expand All @@ -28,4 +28,3 @@ Guards: verify preview tree differs from candidate only in the four version sour
equals the candidate. A failing promotion run is fixed through dev and re-promoted. If a release
run fails after npm acknowledged publication, re-dispatch with resume-after-npm-publish=true and the
same expected-sha; never republish.

59 changes: 59 additions & 0 deletions devlog/_fin/260929_release_2_71_0/041_wp4_execution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# 041 wp4 execution: release 2.71.0

Previous D (wp3): #6224 merged, dev d161c0e83e; final CI green including windows 1-9. Direction
unchanged: release that candidate exactly as 040 (same shape as 2.70.0: #6211/#6212/#6213).

Revalidated at wp4 P: dev d161c0e83e (package 2.71.0), preview aa3a8dda16 (2.70.0-preview.20260929),
main 53834ff47b (2.70.0); npm latest=2.70.0, preview=2.70.0-preview.20260929. Candidate C =
d161c0e83ea8a88027b2cef28c125ff3c1f29f8a.

## Order and parallelism

1. Pre-move dispatch (runs on GitHub, ~1 min):
`gh workflow run dev-version-bump.yml -R lidge-jun/opencodex --ref main -f intended-version=2.71.0 -f mode=pre-move`
-> PR `codex/dev-version-2.72.0`. Accept only if its files are exactly the four version sources and
each reads 2.72.0. Its PR CI runs while steps 2-3 proceed; merge it (`--admin --squash
--match-head-commit`, as #6213) once its Cross-platform CI and gates are green. It is merged
before any release dispatch; the stable dispatch strictly requires it (release-preflight.sh
assert-ahead), and doing it first for both keeps one order.
2. Preview branch (managed worktree, clean tree):
```sh
git switch -c codex/promote-preview-2.71.0 d161c0e83ea8a88027b2cef28c125ff3c1f29f8a
git merge -s ours refs/remotes/canon/preview -m "Merge preview into 2.71.0-preview.20260929 promotion"
bun scripts/release-version-sources.ts sync 2.71.0-preview.20260929
git commit -am "chore(release): 2.71.0-preview.20260929"
git diff --name-only d161c0e83e HEAD # must list exactly the four version sources
bun scripts/release-version-sources.ts # check mode: all sources 2.71.0-preview.20260929
```
Push, PR to preview titled "release: 2.71.0-preview.20260929", body as #6211 (plus the two
pr-assets screenshots because the union touches gui/), merge with `--admin --merge
--match-head-commit`.
3. Main branch:
```sh
git switch -c codex/promote-main-2.71.0 d161c0e83ea8a88027b2cef28c125ff3c1f29f8a
git merge -s ours refs/remotes/canon/main -m "Merge main into 2.71.0 promotion"
git diff --quiet d161c0e83e HEAD # tree equals the candidate
```
Push, PR to main titled "release: 2.71.0", body as #6212 plus screenshots, merge the same way.
4. Gate per promotion SHA (the merge commits on preview and main): push-event Cross-platform CI and
Service lifecycle both `success` (release.yml checks both). A red run is diagnosed; a flake with
evidence may be rerun once; a real defect is fixed on dev and re-promoted.
5. Dispatch, preview first:
`gh workflow run release.yml -R lidge-jun/opencodex --ref preview -f version=2.71.0-preview.20260929 -f tag=preview -f dry-run=false -f expected-sha=<preview merge sha>`
then after it succeeds:
`gh workflow run release.yml -R lidge-jun/opencodex --ref main -f version=2.71.0 -f tag=latest -f dry-run=false -f expected-sha=<main merge sha>`
On a failure after npm acknowledged publication: same inputs plus `-f resume-after-npm-publish=true`.
6. Verify: `npm view @bitkyc08/opencodex dist-tags --json` (latest=2.71.0, preview=2.71.0-preview.20260929),
`npm view @bitkyc08/opencodex@2.71.0 gitHead` = main merge sha, `gh release view v2.71.0` (not
prerelease, asset count as v2.70.0 = 25), `gh release view v2.71.0-preview.20260929` (prerelease),
latest.json from the v2.71.0 release reports 2.71.0 with signed platforms.
7. Outcome: 090_outcome.md, move the unit to devlog/_fin/260929_release_2_71_0, docs PR to dev from
a branch on the pre-moved dev tip; merge after its gates.

Merging promotion PRs is owner-authorized in this session ("배포까지 완료"). enforce-target flags
promotion PRs as wrong base by design (2.70.0 precedent); that check is not required for preview/main.

D11 (architect, wp4, ALIGNED): release.yml:847-867 accepts only a push-event ci.yml run on the exact
SHA (a PR run does not count); package.json is in both ci.yml push paths (:51) and
service-lifecycle.yml push paths (:19), so both gating runs fire on each promotion merge commit;
release-preflight.sh enforces dev strictly ahead, so the pre-move PR merges first.
38 changes: 38 additions & 0 deletions devlog/_fin/260929_release_2_71_0/090_outcome.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# 090 Outcome: 2.71.0 released

Published 2026-09-29 (KST). GitHub releases `v2.71.0` and `v2.71.0-preview.20260929` exist with 25
assets each; npm accepted both publications with signed provenance.

Six reviewed PRs landed on dev with author credit, the Windows timeout that had turned the dev tip
red was fixed, and the whole set was released as 2.71.0 and 2.71.0-preview.20260929.

| Step | Evidence |
|---|---|
| Integration | #6224 merged to dev as d161c0e83e (merge commit). Land commits: df951bc2ee #6206 (Ingwannu), 6d7af977a4 #6201 (luvs01), 21ccf35dbe #6209 (Jio Kim), e3fcf3e43c #6094 (Brad Hallett), 2b0ac07170 #5905 (halysondev), febc16d2a4 #6198 (luvs01); follow-ups 9155880950, 7b875559dd, 917db156de, 441aeb179e. Details in 032. |
| Local regression | 022: all gates exit 0; full-suite failures proven pre-existing at dev 37ad7e771b. |
| Final CI | #6224 head dcfbb2f708: Cross-platform CI pull_request 36525839698, workflow_dispatch lane=all 36526719414 (windows 1-9), Service lifecycle 36525839767, all success; 0 failed check-runs. |
| dev pre-move | Dev version bump run 36529404555 opened #6226; its PR checks were approval-gated (bot-authored, as #6213), so the version tests and typecheck ran locally on its head 316750815c (209 pass) before `--admin --squash`; dev 69ce312097 reads 2.72.0. |
| Preview | #6227 merged as fd346e2489 (tree = candidate + four version sources at 2.71.0-preview.20260929). Push Cross-platform CI 36529530341 and Service lifecycle 36529530333 success. Release run 36531705017 success; npm `preview=2.71.0-preview.20260929`, gitHead fd346e2489, provenance attestation present. |
| Stable | #6228 merged as 8a005dd98f (tree equal to the candidate). Push Cross-platform CI 36529537253 and Service lifecycle 36529537201 success. Release run 36533478070 success; npm publish acknowledged (`+ @bitkyc08/opencodex@2.71.0`, sigstore log 2995422874); GitHub release `v2.71.0` not prerelease, 25 assets; latest.json reports 2.71.0 with 5 signed platforms. |
| Source PRs | #6206 #6201 #6209 #6094 #5905 #6198 closed with landing comments; issue #6208 closed. |

## Notes

- The pull_request event skips the Windows matrix (ci.yml:835-839); a workflow_dispatch run on the
integration head covered windows 1-9 before merge.
- The promotion PRs' own pull_request CI runs (36529486815, 36529483354) were cancelled to free
runners after both promotions merged; the push runs on the same trees gate the release.
- The registry smoke step warned on both releases because npm took a few minutes to serve the new
versions; no republish was attempted.
- The installed proxy, service and desktop app on this machine were not updated.

## What did not improve / open follow-ups

- Local full `bun run test` on a loaded macOS host is not a clean signal: a claude-integration
server test can hang and cascade into `SpendLedgerOwnerError` for the rest of its worker, and
`tests/service/shutdown-launcher.test.ts` fails and leaves orphan proxies. Both reproduce at dev
37ad7e771b; they deserve their own issue.
- Optional hardening noted by reviewers and not built here: a response-size cap and redirect policy
for the Cursor manifest fetch (#5905), strict single-[3] TBS parsing in picker-ca (#6201), extra
subprocess tests for #6209, localized copies of the cli.md priority note.

13 changes: 13 additions & 0 deletions devlog/_plan/260929_tokenlab_sponsor/000_roadmap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# TokenLab — preset merge and third Standard sponsor

TokenLab (TOKENLAB AI INC.) signed up as a Standard sponsor on 2026-09-29 (DocuSign envelope sent
21:08 KST; USD 1,200 / 3 months, term starts at the npm release that ships the preset). Two units:

| Doc | Work phase | Outcome |
|-----|-----------|---------|
| [010](./010_merge_6221.md) | wp1 | #6221 (fork `hedging8563`, ordinary API-key preset) merged into `dev` on green exact-head CI |
| [020](./020_sponsor_pr.md) | wp2 | Separate maintainer PR: sponsor field, dashboard sponsor surface, README row #3, docs, assets |

The sponsor PR stays unmerged for owner review. The Responses-first proposal in TokenLab's asset pack
(`integration-notes.md`) is out of scope for both units: it changes the upstream protocol and needs
its own evidence and PR.
37 changes: 37 additions & 0 deletions devlog/_plan/260929_tokenlab_sponsor/010_merge_6221.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# 010 — Merge #6221 (TokenLab API-key preset)

## State at plan time

- Head repo `hedging8563/opencodex`, branch `codex/tokenlab-provider`, draft, `maintainerCanModify`.
- Branch updated onto `dev` with `gh pr update-branch` → head `6a9e571202`.
- Fork runs `Cross-platform CI` (36566988054) and `React Doctor` (36566988033) approved by the maintainer.
- Admission gap recorded in the PR body: routing/resale authorization evidence. The owner's
sponsorship agreement with the operator (§2.2: sourcing and delivery mode are TokenLab's
responsibility, not audited or guaranteed by opencodex) is the maintainer decision that closes it;
no upstream endorsement claim is added.

## Steps

0. Head moved to `fb565b7c48`: the `dev` union failed `docs-provider-preset-counts` (16 assertions,
localized 99/82 counts). Recounted the anchored lines; the test passes locally 18/18.
1. Wait for every required check on `6a9e571202` to complete successfully. A red, skipped or
older-head result blocks merge; fix forward only if the failure is in this diff.
2. Mark the PR ready (`gh pr ready 6221`).
3. Post a maintainer-integration comment: owner instruction, exact head SHA, check list, and the
admission decision above.
4. Squash-merge with the admin bypass (`gh pr merge 6221 --squash --admin`); the squash keeps the
PR author as commit author.
5. Verify `dev` contains the squash commit and `src/providers/registry/entries-extended.ts` carries
the `tokenlab` entry.

## Not in this unit

Sponsor field, README, logos — see 020.

## Outcome (2026-09-29)

Merged as `f6cddd7d69` at 12:51 UTC from head `fb565b7c48`: 24 checks passed, 7 skipped by path
conditions (Cross-platform CI 36567400620, React Doctor). CodeRabbit's assertive review found nothing
actionable. The readiness gate re-drafted the PR on `ready`; the maintainer ticked the last two boxes
after that review and recorded it on the PR. A full local `bun run test` cannot run from a worktree
under `~/.codex`: the harness refuses to delete temporary directories inside the real Codex home.
Loading
Loading