diff --git a/src/cli/config-manager/bun-install.ts b/src/cli/config-manager/bun-install.ts index f24e77fa26..e763941a6a 100644 --- a/src/cli/config-manager/bun-install.ts +++ b/src/cli/config-manager/bun-install.ts @@ -1,4 +1,4 @@ -import { getConfigDir } from "./config-context" +import { getOpenCodeConfigDir } from "../../shared" const BUN_INSTALL_TIMEOUT_SECONDS = 60 const BUN_INSTALL_TIMEOUT_MS = BUN_INSTALL_TIMEOUT_SECONDS * 1000 @@ -17,7 +17,7 @@ export async function runBunInstall(): Promise { export async function runBunInstallWithDetails(): Promise { try { const proc = Bun.spawn(["bun", "install"], { - cwd: getConfigDir(), + cwd: getOpenCodeConfigDir({ binary: "opencode" }), stdout: "inherit", stderr: "inherit", }) @@ -39,7 +39,7 @@ export async function runBunInstallWithDetails(): Promise { return { success: false, timedOut: true, - error: `bun install timed out after ${BUN_INSTALL_TIMEOUT_SECONDS} seconds. Try running manually: cd ${getConfigDir()} && bun i`, + error: `bun install timed out after ${BUN_INSTALL_TIMEOUT_SECONDS} seconds. Try running manually: cd ${getOpenCodeConfigDir({ binary: "opencode" })} && bun i`, } } diff --git a/src/cli/model-fallback-requirements.ts b/src/cli/model-fallback-requirements.ts index f3f43e60ba..1f1e9d78ca 100644 --- a/src/cli/model-fallback-requirements.ts +++ b/src/cli/model-fallback-requirements.ts @@ -23,7 +23,7 @@ export const CLI_AGENT_MODEL_REQUIREMENTS: Record = { }, oracle: { fallbackChain: [ - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "high" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro", variant: "high" }, { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, ], @@ -45,7 +45,7 @@ export const CLI_AGENT_MODEL_REQUIREMENTS: Record = { "multimodal-looker": { fallbackChain: [ { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-flash" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex" }, { providers: ["zai-coding-plan"], model: "glm-4.6v" }, { providers: ["kimi-for-coding"], model: "k2p5" }, { providers: ["opencode"], model: "kimi-k2.5-free" }, @@ -58,7 +58,7 @@ export const CLI_AGENT_MODEL_REQUIREMENTS: Record = { { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, { providers: ["kimi-for-coding"], model: "k2p5" }, { providers: ["opencode"], model: "kimi-k2.5-free" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "high" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro" }, ], }, @@ -67,13 +67,13 @@ export const CLI_AGENT_MODEL_REQUIREMENTS: Record = { { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, { providers: ["kimi-for-coding"], model: "k2p5" }, { providers: ["opencode"], model: "kimi-k2.5-free" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "high" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro", variant: "high" }, ], }, momus: { fallbackChain: [ - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "medium" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "medium" }, { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro", variant: "high" }, ], @@ -83,7 +83,7 @@ export const CLI_AGENT_MODEL_REQUIREMENTS: Record = { { providers: ["kimi-for-coding"], model: "k2p5" }, { providers: ["opencode"], model: "kimi-k2.5-free" }, { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-sonnet-4-5" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro" }, ], }, @@ -117,7 +117,7 @@ export const CLI_CATEGORY_MODEL_REQUIREMENTS: Record = fallbackChain: [ { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro", variant: "high" }, { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex" }, ], requiresModel: "gemini-3-pro", }, @@ -138,7 +138,7 @@ export const CLI_CATEGORY_MODEL_REQUIREMENTS: Record = "unspecified-high": { fallbackChain: [ { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "high" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro" }, ], }, diff --git a/src/shared/migration.test.ts b/src/shared/migration.test.ts index 7846cc7258..ecc8655afb 100644 --- a/src/shared/migration.test.ts +++ b/src/shared/migration.test.ts @@ -525,7 +525,13 @@ describe("MODEL_VERSION_MAP", () => { // then: Should contain correct mapping expect(MODEL_VERSION_MAP["anthropic/claude-opus-4-5"]).toBe("anthropic/claude-opus-4-6") }) -}) + + test("maps openai/gpt-5.3 to openai/gpt-5.3-codex", () => { + // given/when: Check MODEL_VERSION_MAP + // then: bare gpt-5.3 should migrate to gpt-5.3-codex + expect(MODEL_VERSION_MAP["openai/gpt-5.3"]).toBe("openai/gpt-5.3-codex") + }) +} describe("migrateModelVersions", () => { test("#given a config with gpt-5.2-codex model #when migrating model versions #then does not overwrite with non-existent gpt-5.3-codex", () => { @@ -559,6 +565,22 @@ describe("migrateModelVersions", () => { expect(prometheus.model).toBe("anthropic/claude-opus-4-6") }) + + test("replaces bare openai/gpt-5.3 with openai/gpt-5.3-codex", () => { + // given: Agent config with bare gpt-5.3 (non-codex) + const agents = { + momus: { model: "openai/gpt-5.3", variant: "medium" }, + } + + // when: Migrate model versions + const { migrated, changed } = migrateModelVersions(agents) + + // then: Model should be updated to codex variant + expect(changed).toBe(true) + const momus = migrated["momus"] as Record + expect(momus.model).toBe("openai/gpt-5.3-codex") + expect(momus.variant).toBe("medium") + }) test("leaves unknown model strings untouched", () => { // given: Agent config with unknown model const agents = { diff --git a/src/shared/migration/model-versions.ts b/src/shared/migration/model-versions.ts index b3df8cdd2e..a32f576dbe 100644 --- a/src/shared/migration/model-versions.ts +++ b/src/shared/migration/model-versions.ts @@ -8,6 +8,7 @@ export const MODEL_VERSION_MAP: Record = { "anthropic/claude-opus-4-5": "anthropic/claude-opus-4-6", "anthropic/claude-sonnet-4-5": "anthropic/claude-sonnet-4-6", + "openai/gpt-5.3": "openai/gpt-5.3-codex", } function migrationKey(oldModel: string, newModel: string): string { diff --git a/src/shared/model-requirements.test.ts b/src/shared/model-requirements.test.ts index 2991775eb8..9b30609cf6 100644 --- a/src/shared/model-requirements.test.ts +++ b/src/shared/model-requirements.test.ts @@ -7,19 +7,19 @@ import { } from "./model-requirements" describe("AGENT_MODEL_REQUIREMENTS", () => { - test("oracle has valid fallbackChain with gpt-5.2 as primary", () => { + test("oracle has valid fallbackChain with gpt-5.3-codex as primary", () => { // given - oracle agent requirement const oracle = AGENT_MODEL_REQUIREMENTS["oracle"] // when - accessing oracle requirement - // then - fallbackChain exists with gpt-5.2 as first entry + // then - fallbackChain exists with gpt-5.3-codex as first entry expect(oracle).toBeDefined() expect(oracle.fallbackChain).toBeArray() expect(oracle.fallbackChain.length).toBeGreaterThan(0) const primary = oracle.fallbackChain[0] expect(primary.providers).toContain("openai") - expect(primary.model).toBe("gpt-5.2") + expect(primary.model).toBe("gpt-5.3-codex") expect(primary.variant).toBe("high") }) @@ -137,18 +137,18 @@ describe("AGENT_MODEL_REQUIREMENTS", () => { expect(primary.variant).toBe("max") }) - test("momus has valid fallbackChain with gpt-5.2 as primary", () => { + test("momus has valid fallbackChain with gpt-5.3-codex as primary", () => { // given - momus agent requirement const momus = AGENT_MODEL_REQUIREMENTS["momus"] // when - accessing Momus requirement - // then - fallbackChain exists with gpt-5.2 as first entry, variant medium + // then - fallbackChain exists with gpt-5.3-codex as first entry, variant medium expect(momus).toBeDefined() expect(momus.fallbackChain).toBeArray() expect(momus.fallbackChain.length).toBeGreaterThan(0) const primary = momus.fallbackChain[0] - expect(primary.model).toBe("gpt-5.2") + expect(primary.model).toBe("gpt-5.3-codex") expect(primary.variant).toBe("medium") expect(primary.providers[0]).toBe("openai") }) diff --git a/src/shared/model-requirements.ts b/src/shared/model-requirements.ts index 9a795ba76a..5a8cf24efa 100644 --- a/src/shared/model-requirements.ts +++ b/src/shared/model-requirements.ts @@ -30,7 +30,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { }, oracle: { fallbackChain: [ - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "high" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro", variant: "high" }, { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, ], @@ -54,7 +54,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { fallbackChain: [ { providers: ["opencode"], model: "kimi-k2.5-free" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-flash" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex" }, { providers: ["zai-coding-plan"], model: "glm-4.6v" }, { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5-nano" }, ], @@ -62,7 +62,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { prometheus: { fallbackChain: [ { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "high" }, { providers: ["opencode"], model: "kimi-k2.5-free" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro" }, ], @@ -71,13 +71,13 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { fallbackChain: [ { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, { providers: ["opencode"], model: "kimi-k2.5-free" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "high" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro", variant: "high" }, ], }, momus: { fallbackChain: [ - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "medium" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "medium" }, { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro", variant: "high" }, ], @@ -86,7 +86,7 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { fallbackChain: [ { providers: ["opencode"], model: "kimi-k2.5-free" }, { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-sonnet-4-6" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex" }, ], }, } @@ -118,7 +118,7 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { fallbackChain: [ { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro", variant: "high" }, { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex" }, ], requiresModel: "gemini-3-pro", }, @@ -139,7 +139,7 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { "unspecified-high": { fallbackChain: [ { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, - { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.2", variant: "high" }, + { providers: ["openai", "github-copilot", "opencode"], model: "gpt-5.3-codex", variant: "high" }, { providers: ["google", "github-copilot", "opencode"], model: "gemini-3-pro" }, ], },