From 110ef579e7adf7761abf17d37fbb343c450687e2 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Tue, 18 Aug 2026 15:42:04 +0900 Subject: [PATCH 1/2] release: v2.25.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f4e8bbd5c9..178d6a9c7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitkyc08/opencodex", - "version": "2.24.2", + "version": "2.25.0", "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code", "type": "module", "main": "./bin/package-main.mjs", From e2460240b8af6b9da5e5423ef8c8ac9b0133564a Mon Sep 17 00:00:00 2001 From: yzxcj797 Date: Tue, 18 Aug 2026 21:49:16 +0800 Subject: [PATCH 2/2] feat(catalog): durable auto_review_model config override MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With approvals_reviewer = auto_review, upstream resolves the review subagent's model from the current turn's auto_review_model_override catalog field, defaulting to codex-auto-review/gpt-5.6-luna. The only way to change it was hand-editing the generated catalog, which the next sync silently clobbers (#1225). A root key in ~/.codex/config.toml (auto_review_model = "provider/model") is now read at catalog-write time and stamped onto every entry — the single choke point all entries pass through — so the choice applies regardless of turn model and survives regeneration. Absent key leaves entries untouched. Tests cover root-key resolution (and table-scope isolation) plus the absent-key case. --- src/codex/catalog/sync.ts | 4 ++++ tests/catalog-auto-review-model.test.ts | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/catalog-auto-review-model.test.ts diff --git a/src/codex/catalog/sync.ts b/src/codex/catalog/sync.ts index 9ee2886028..0ad82cf168 100644 --- a/src/codex/catalog/sync.ts +++ b/src/codex/catalog/sync.ts @@ -1540,6 +1540,10 @@ function writeRetainedCatalogSync({ }); clampCatalogModelsToCodexSupport(catalog.models); + const autoReviewModel = configuredAutoReviewModel(); + if (autoReviewModel) { + catalog.models = catalog.models.map((entry) => ({ ...entry, auto_review_model_override: autoReviewModel })); + } const added = goEntries.length + accountBoundEntries.length; const content = `${JSON.stringify(catalog, null, 2)}\n`; // A byte-identical rewrite is not a catalog change, but every mtime-keyed reader diff --git a/tests/catalog-auto-review-model.test.ts b/tests/catalog-auto-review-model.test.ts new file mode 100644 index 0000000000..44ed22fbc1 --- /dev/null +++ b/tests/catalog-auto-review-model.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, test } from "bun:test"; +import { readRootTomlString } from "../src/codex/paths"; + +describe("auto_review_model config key (#1225)", () => { + test("readRootTomlString resolves the root-level key next to approvals_reviewer", () => { + const config = [ + 'approvals_reviewer = "auto_review"', + 'auto_review_model = "opencode-go/deepseek-v4-flash"', + "", + "[profiles.test]", + 'model = "gpt-5.6-luna"', + ].join("\n"); + expect(readRootTomlString(config, "auto_review_model")).toBe("opencode-go/deepseek-v4-flash"); + // Keys inside tables must not leak into root resolution. + expect(readRootTomlString(config, "model")).toBeNull(); + }); + + test("a config without the key resolves null (override stays untouched)", () => { + expect(readRootTomlString('model = "gpt-5.6-luna"\n', "auto_review_model")).toBeNull(); + }); +});