test: fix stale expectations after gpt-5.5 model promotion

Updates test expectations across agent, cli, shared, plugin, and tools tests

to match gpt-5.5 as the new default for oracle, hephaestus, and deep agents.

Includes snapshot updates for model-fallback tests.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-04-24 16:17:44 +09:00
parent 6b46b9b4be
commit 708891dabe
11 changed files with 129 additions and 132 deletions
+7 -7
View File
@@ -23,7 +23,7 @@ describe("getHephaestusPromptSource", () => {
expect(source3).toBe("gpt-5-4");
});
test("returns 'gpt-5-4' for gpt-5.5 models", () => {
test("returns 'gpt-5-5' for gpt-5.5 models", () => {
// given
const model1 = "openai/gpt-5.5";
const model2 = "openai/gpt-5-5";
@@ -35,9 +35,9 @@ describe("getHephaestusPromptSource", () => {
const source3 = getHephaestusPromptSource(model3);
// then
expect(source1).toBe("gpt-5-4");
expect(source2).toBe("gpt-5-4");
expect(source3).toBe("gpt-5-4");
expect(source1).toBe("gpt-5-5");
expect(source2).toBe("gpt-5-5");
expect(source3).toBe("gpt-5-5");
});
test("returns 'gpt-5-3-codex' for GPT 5.3 Codex models", () => {
@@ -113,7 +113,7 @@ describe("getHephaestusPrompt", () => {
expect(prompt).toContain("<tool_usage_rules>");
});
test("GPT 5.5 model returns GPT-5.4 optimized prompt", () => {
test("GPT 5.5 model returns GPT-5.5 optimized prompt", () => {
// given
const model = "openai/gpt-5.5";
@@ -122,8 +122,8 @@ describe("getHephaestusPrompt", () => {
// then
expect(prompt).toContain("You build context by examining");
expect(prompt).toContain("Never chain together bash commands");
expect(prompt).toContain("<tool_usage_rules>");
expect(prompt).toContain("Forbidden stops");
expect(prompt).toContain("Three-attempt failure protocol");
});
test("GPT 5.3-codex model returns GPT-5.3 prompt", () => {
+7 -7
View File
@@ -196,8 +196,8 @@ describe("createBuiltinAgents with model overrides", () => {
// #when
const agents = await createBuiltinAgents([], {}, undefined, TEST_DEFAULT_MODEL, undefined, undefined, [], undefined, undefined)
// #then - oracle resolves via connected cache fallback to openai/gpt-5.4 (not system default)
expect(agents.oracle.model).toBe("openai/gpt-5.4")
// #then - oracle resolves via connected cache fallback to openai/gpt-5.5 (not system default)
expect(agents.oracle.model).toBe("openai/gpt-5.5")
expect(agents.oracle.reasoningEffort).toBe("medium")
expect(agents.oracle.thinking).toBeUndefined()
cacheSpy.mockRestore?.()
@@ -223,14 +223,14 @@ describe("createBuiltinAgents with model overrides", () => {
const providerModelsSpy = spyOn(connectedProvidersCache, "readProviderModelsCache").mockReturnValue(null)
const fetchSpy = spyOn(shared, "fetchAvailableModels").mockResolvedValue(new Set())
const overrides = {
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5" },
}
// #when
const agents = await createBuiltinAgents([], overrides, undefined, TEST_DEFAULT_MODEL, undefined, undefined, [], undefined, undefined)
// #then
expect(agents.oracle.model).toBe("openai/gpt-5.4")
expect(agents.oracle.model).toBe("openai/gpt-5.5")
expect(agents.oracle.reasoningEffort).toBe("medium")
expect(agents.oracle.textVerbosity).toBe("high")
expect(agents.oracle.thinking).toBeUndefined()
@@ -524,7 +524,7 @@ describe("createBuiltinAgents without systemDefaultModel", () => {
// #then - connected cache enables model resolution despite no systemDefaultModel
expect(agents.oracle).toBeDefined()
expect(agents.oracle.model).toBe("openai/gpt-5.4")
expect(agents.oracle.model).toBe("openai/gpt-5.5")
cacheSpy.mockRestore?.()
providerModelsSpy.mockRestore()
fetchSpy.mockRestore()
@@ -541,7 +541,7 @@ describe("createBuiltinAgents without systemDefaultModel", () => {
// #then
expect(agents.oracle).toBeDefined()
expect(agents.oracle.model).toBe("openai/gpt-5.4")
expect(agents.oracle.model).toBe("openai/gpt-5.5")
} finally {
fetchSpy.mockRestore()
cacheSpy.mockRestore()
@@ -689,7 +689,7 @@ describe("createBuiltinAgents with requiresProvider gating (hephaestus)", () =>
// #then
expect(agents.hephaestus).toBeDefined()
expect(agents.hephaestus.model).toBe("openai/gpt-5.4")
expect(agents.hephaestus.model).toBe("openai/gpt-5.5")
} finally {
cacheSpy.mockRestore()
fetchSpy.mockRestore()
@@ -209,7 +209,7 @@ exports[`generateModelConfig single native provider uses OpenAI models when only
"model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -233,7 +233,7 @@ exports[`generateModelConfig single native provider uses OpenAI models when only
"variant": "medium",
},
"oracle": {
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -255,7 +255,7 @@ exports[`generateModelConfig single native provider uses OpenAI models when only
"variant": "xhigh",
},
"deep": {
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -297,7 +297,7 @@ exports[`generateModelConfig single native provider uses OpenAI models with isMa
"model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -321,7 +321,7 @@ exports[`generateModelConfig single native provider uses OpenAI models with isMa
"variant": "medium",
},
"oracle": {
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -343,7 +343,7 @@ exports[`generateModelConfig single native provider uses OpenAI models with isMa
"variant": "xhigh",
},
"deep": {
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -526,7 +526,7 @@ exports[`generateModelConfig all native providers uses preferred models from fal
"model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -584,7 +584,7 @@ exports[`generateModelConfig all native providers uses preferred models from fal
"variant": "max",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -645,7 +645,7 @@ exports[`generateModelConfig all native providers uses preferred models from fal
"variant": "high",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -744,7 +744,7 @@ exports[`generateModelConfig all native providers uses preferred models with isM
"model": "openai/gpt-5.4-mini-fast",
},
"hephaestus": {
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -802,7 +802,7 @@ exports[`generateModelConfig all native providers uses preferred models with isM
"variant": "max",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -863,7 +863,7 @@ exports[`generateModelConfig all native providers uses preferred models with isM
"variant": "high",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -957,7 +957,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on
"model": "opencode/claude-haiku-4-5",
},
"hephaestus": {
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
"metis": {
@@ -1004,7 +1004,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on
"variant": "max",
},
],
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -1077,7 +1077,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on
"variant": "high",
},
],
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -1179,7 +1179,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is
"model": "opencode/claude-haiku-4-5",
},
"hephaestus": {
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
"metis": {
@@ -1226,7 +1226,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is
"variant": "max",
},
],
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -1299,7 +1299,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is
"variant": "high",
},
],
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -1400,7 +1400,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when
"model": "github-copilot/gpt-5-mini",
},
"hephaestus": {
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
"metis": {
@@ -1441,7 +1441,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when
"variant": "max",
},
],
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -1502,7 +1502,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when
"variant": "high",
},
],
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -1581,7 +1581,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with
"model": "github-copilot/gpt-5-mini",
},
"hephaestus": {
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
"metis": {
@@ -1622,7 +1622,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with
"variant": "max",
},
],
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -1683,7 +1683,7 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with
"variant": "high",
},
],
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -1897,7 +1897,7 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen
"model": "anthropic/claude-haiku-4-5",
},
"hephaestus": {
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
"metis": {
@@ -1956,7 +1956,7 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen
"variant": "max",
},
],
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -2048,7 +2048,7 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen
"variant": "high",
},
],
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -2176,11 +2176,11 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"hephaestus": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -2238,7 +2238,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"oracle": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "high",
},
{
@@ -2250,7 +2250,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"variant": "max",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -2318,7 +2318,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"deep": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
{
@@ -2330,7 +2330,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb
"variant": "high",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -2653,11 +2653,11 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
"hephaestus": {
"fallback_models": [
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
],
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -2733,7 +2733,7 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
"oracle": {
"fallback_models": [
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "high",
},
{
@@ -2753,7 +2753,7 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
"variant": "max",
},
],
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -2858,7 +2858,7 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
"deep": {
"fallback_models": [
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
{
@@ -2878,7 +2878,7 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider
"variant": "high",
},
],
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -3051,15 +3051,15 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"hephaestus": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -3168,11 +3168,11 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"oracle": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "high",
},
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "high",
},
{
@@ -3200,7 +3200,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"variant": "max",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -3342,11 +3342,11 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"deep": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
{
@@ -3374,7 +3374,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe
"variant": "high",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -3602,15 +3602,15 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"hephaestus": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -3719,11 +3719,11 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"oracle": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "high",
},
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "high",
},
{
@@ -3751,7 +3751,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"variant": "max",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -3893,11 +3893,11 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"deep": {
"fallback_models": [
{
"model": "github-copilot/gpt-5.4",
"model": "github-copilot/gpt-5.5",
"variant": "medium",
},
{
"model": "opencode/gpt-5.4",
"model": "opencode/gpt-5.5",
"variant": "medium",
},
{
@@ -3925,7 +3925,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is
"variant": "high",
},
],
"model": "openai/gpt-5.4",
"model": "openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -4147,7 +4147,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"model": "vercel/minimax/minimax-m2.7-highspeed",
},
"hephaestus": {
"model": "vercel/openai/gpt-5.4",
"model": "vercel/openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -4223,7 +4223,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"model": "vercel/zai/glm-5",
},
],
"model": "vercel/openai/gpt-5.4",
"model": "vercel/openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -4299,7 +4299,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"variant": "high",
},
],
"model": "vercel/openai/gpt-5.4",
"model": "vercel/openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -4437,7 +4437,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"model": "vercel/minimax/minimax-m2.7-highspeed",
},
"hephaestus": {
"model": "vercel/openai/gpt-5.4",
"model": "vercel/openai/gpt-5.5",
"variant": "medium",
},
"librarian": {
@@ -4513,7 +4513,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"model": "vercel/zai/glm-5",
},
],
"model": "vercel/openai/gpt-5.4",
"model": "vercel/openai/gpt-5.5",
"variant": "high",
},
"prometheus": {
@@ -4589,7 +4589,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
"variant": "high",
},
],
"model": "vercel/openai/gpt-5.4",
"model": "vercel/openai/gpt-5.5",
"variant": "medium",
},
"quick": {
@@ -98,7 +98,7 @@ describe("generateOmoConfig - model fallback system", () => {
//#then
expect((result.agents as Record<string, { model: string; variant?: string }>).sisyphus.model).toBe("openai/gpt-5.4")
expect((result.agents as Record<string, { model: string; variant?: string }>).sisyphus.variant).toBe("medium")
expect((result.agents as Record<string, { model: string }>).oracle.model).toBe("openai/gpt-5.4")
expect((result.agents as Record<string, { model: string }>).oracle.model).toBe("openai/gpt-5.5")
expect((result.agents as Record<string, { model: string }>)['multimodal-looker'].model).toBe("openai/gpt-5.4")
})
@@ -138,7 +138,7 @@ describe("generateOmoConfig - model fallback system", () => {
variant: "medium",
},
])
expect(categories.deep.model).toBe("openai/gpt-5.4")
expect(categories.deep.model).toBe("openai/gpt-5.5")
expect(categories.deep.fallback_models).toEqual([
{
model: "anthropic/claude-opus-4-7",
+6 -6
View File
@@ -461,11 +461,11 @@ describe("generateModelConfig", () => {
const result = generateModelConfig(config)
// #then
expect(result.agents?.hephaestus?.model).toBe("openai/gpt-5.4")
expect(result.agents?.hephaestus?.model).toBe("openai/gpt-5.5")
expect(result.agents?.hephaestus?.variant).toBe("medium")
})
test("Hephaestus falls back to Copilot GPT-5.4 when only Copilot is available", () => {
test("Hephaestus falls back to Copilot GPT-5.5 when only Copilot is available", () => {
// #given
const config = createConfig({ hasCopilot: true })
@@ -474,7 +474,7 @@ describe("generateModelConfig", () => {
// #then
expect(result.agents?.hephaestus).toEqual({
model: "github-copilot/gpt-5.4",
model: "github-copilot/gpt-5.5",
variant: "medium",
})
})
@@ -487,7 +487,7 @@ describe("generateModelConfig", () => {
const result = generateModelConfig(config)
// #then
expect(result.agents?.hephaestus?.model).toBe("opencode/gpt-5.4")
expect(result.agents?.hephaestus?.model).toBe("opencode/gpt-5.5")
expect(result.agents?.hephaestus?.variant).toBe("medium")
})
@@ -656,8 +656,8 @@ describe("generateModelConfig", () => {
// #when generateModelConfig is called
const result = generateModelConfig(config)
// #then hephaestus should be created with gateway-routed gpt-5.4
expect(result.agents?.hephaestus?.model).toBe("vercel/openai/gpt-5.4")
// #then hephaestus should be created with gateway-routed gpt-5.5
expect(result.agents?.hephaestus?.model).toBe("vercel/openai/gpt-5.5")
})
test("native providers take priority over gateway", () => {
+17 -17
View File
@@ -103,7 +103,7 @@ describe("mergeConfigs", () => {
it("should deep merge agents", () => {
const base = createConfig({
agents: {
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5" },
},
});
@@ -116,7 +116,7 @@ describe("mergeConfigs", () => {
const result = mergeConfigs(base, override);
expect(result.agents?.oracle).toMatchObject({ model: "openai/gpt-5.4" });
expect(result.agents?.oracle).toMatchObject({ model: "openai/gpt-5.5" });
expect(result.agents?.oracle?.temperature).toBe(0.5);
expect(result.agents?.explore).toMatchObject({ model: "anthropic/claude-haiku-4-5" });
});
@@ -183,7 +183,7 @@ describe("parseConfigPartially", () => {
it("should return the full config when everything is valid", () => {
const rawConfig = {
agents: {
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5" },
momus: { model: "openai/gpt-5.4" },
},
disabled_hooks: ["comment-checker"],
@@ -192,7 +192,7 @@ describe("parseConfigPartially", () => {
const result = parseConfigPartially(rawConfig);
expect(result).not.toBeNull();
expect(result!.agents?.oracle).toMatchObject({ model: "openai/gpt-5.4" });
expect(result!.agents?.oracle).toMatchObject({ model: "openai/gpt-5.5" });
expect(result!.agents?.momus).toMatchObject({ model: "openai/gpt-5.4" });
expect(result!.disabled_hooks).toEqual(["comment-checker"]);
});
@@ -206,7 +206,7 @@ describe("parseConfigPartially", () => {
it("should preserve valid agent overrides when another section is invalid", () => {
const rawConfig = {
agents: {
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5" },
momus: { model: "openai/gpt-5.4" },
prometheus: {
permission: {
@@ -227,7 +227,7 @@ describe("parseConfigPartially", () => {
it("should preserve valid agents when a non-agent section is invalid", () => {
const rawConfig = {
agents: {
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5" },
},
disabled_hooks: ["not-a-real-hook"],
};
@@ -235,7 +235,7 @@ describe("parseConfigPartially", () => {
const result = parseConfigPartially(rawConfig);
expect(result).not.toBeNull();
expect(result!.agents?.oracle).toMatchObject({ model: "openai/gpt-5.4" });
expect(result!.agents?.oracle).toMatchObject({ model: "openai/gpt-5.5" });
expect(result!.disabled_hooks).toEqual(["not-a-real-hook"]);
});
});
@@ -286,7 +286,7 @@ describe("parseConfigPartially", () => {
it("should ignore unknown keys and return valid sections", () => {
const rawConfig = {
agents: {
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5" },
},
some_future_key: { foo: "bar" },
};
@@ -294,7 +294,7 @@ describe("parseConfigPartially", () => {
const result = parseConfigPartially(rawConfig);
expect(result).not.toBeNull();
expect(result!.agents?.oracle).toMatchObject({ model: "openai/gpt-5.4" });
expect(result!.agents?.oracle).toMatchObject({ model: "openai/gpt-5.5" });
expect((result as Record<string, unknown>)["some_future_key"]).toBeUndefined();
});
});
@@ -344,7 +344,7 @@ describe("loadPluginConfig", () => {
tempDirs.push(rootDir)
mkdirSync(userConfigDir, { recursive: true })
mkdirSync(projectConfigDir, { recursive: true })
writeFileSync(legacyConfigPath, JSON.stringify({ agents: { oracle: { model: "openai/gpt-5.4" } } }))
writeFileSync(legacyConfigPath, JSON.stringify({ agents: { oracle: { model: "openai/gpt-5.5" } } }))
process.env.OPENCODE_CONFIG_DIR = userConfigDir
@@ -357,8 +357,8 @@ describe("loadPluginConfig", () => {
// then
expect(existsSync(legacyConfigPath)).toBe(false)
expect(existsSync(backupConfigPath)).toBe(true)
expect(readFileSync(canonicalConfigPath, "utf-8")).toContain('"openai/gpt-5.4"')
expect(reloadedConfig.agents?.oracle?.model).toBe("openai/gpt-5.4")
expect(readFileSync(canonicalConfigPath, "utf-8")).toContain('"openai/gpt-5.5"')
expect(reloadedConfig.agents?.oracle?.model).toBe("openai/gpt-5.5")
})
it("should still load config from legacy path when migration fails", async () => {
@@ -372,7 +372,7 @@ describe("loadPluginConfig", () => {
tempDirs.push(rootDir)
mkdirSync(userConfigDir, { recursive: true })
mkdirSync(projectConfigDir, { recursive: true })
writeFileSync(legacyConfigPath, JSON.stringify({ agents: { oracle: { model: "openai/gpt-5.4" } } }))
writeFileSync(legacyConfigPath, JSON.stringify({ agents: { oracle: { model: "openai/gpt-5.5" } } }))
// Make the directory read-only so migration write fails
// (simulates Windows file lock / permission issues)
@@ -395,7 +395,7 @@ describe("loadPluginConfig", () => {
}
// then - should still load the config from legacy path
expect(config.agents?.oracle?.model).toBe("openai/gpt-5.4")
expect(config.agents?.oracle?.model).toBe("openai/gpt-5.5")
})
it("should load migrated legacy project config on the first load", async () => {
@@ -410,7 +410,7 @@ describe("loadPluginConfig", () => {
tempDirs.push(rootDir)
mkdirSync(userConfigDir, { recursive: true })
mkdirSync(projectConfigDir, { recursive: true })
writeFileSync(legacyConfigPath, JSON.stringify({ agents: { oracle: { model: "openai/gpt-5.4" } } }))
writeFileSync(legacyConfigPath, JSON.stringify({ agents: { oracle: { model: "openai/gpt-5.5" } } }))
process.env.OPENCODE_CONFIG_DIR = userConfigDir
@@ -421,7 +421,7 @@ describe("loadPluginConfig", () => {
// then
expect(existsSync(legacyConfigPath)).toBe(false)
expect(existsSync(canonicalConfigPath)).toBe(true)
expect(config.agents?.oracle?.model).toBe("openai/gpt-5.4")
expect(config.agents?.oracle?.model).toBe("openai/gpt-5.5")
})
it("should preserve explicit user git_master settings when project config omits git_master", async () => {
@@ -449,7 +449,7 @@ describe("loadPluginConfig", () => {
join(projectConfigDir, "oh-my-openagent.jsonc"),
JSON.stringify({
agents: {
hephaestus: { model: "openai/gpt-5.4" },
hephaestus: { model: "openai/gpt-5.5" },
},
})
)
+2 -6
View File
@@ -1557,9 +1557,7 @@ describe("disable_omo_env pass-through", () => {
const lastCall =
createBuiltinAgentsMock.mock.calls[createBuiltinAgentsMock.mock.calls.length - 1]
expect(lastCall).toBeDefined()
const disableOmoEnv = Array.isArray(lastCall)
? lastCall[lastCall.length - 1]
: undefined
const disableOmoEnv = Array.isArray(lastCall) ? lastCall[12] : undefined
expect(disableOmoEnv).toBe(true)
})
@@ -1594,9 +1592,7 @@ describe("disable_omo_env pass-through", () => {
const lastCall =
createBuiltinAgentsMock.mock.calls[createBuiltinAgentsMock.mock.calls.length - 1]
expect(lastCall).toBeDefined()
const disableOmoEnv = Array.isArray(lastCall)
? lastCall[lastCall.length - 1]
: undefined
const disableOmoEnv = Array.isArray(lastCall) ? lastCall[12] : undefined
expect(disableOmoEnv).toBe(false)
})
})
+3 -3
View File
@@ -113,9 +113,9 @@ describe("resolveVariantForModel", () => {
})
test("returns correct variant for openai provider (hephaestus agent)", () => {
// #given hephaestus has openai/gpt-5.4 with variant "medium" in its chain
// #given hephaestus has openai/gpt-5.5 with variant "medium" in its chain
const config = {} as OhMyOpenCodeConfig
const model = { providerID: "openai", modelID: "gpt-5.4" }
const model = { providerID: "openai", modelID: "gpt-5.5" }
// #when
const variant = resolveVariantForModel(config, "hephaestus", model)
@@ -191,7 +191,7 @@ describe("resolveVariantForModel", () => {
test("returns correct variant for oracle agent with openai", () => {
// given
const config = {} as OhMyOpenCodeConfig
const model = { providerID: "openai", modelID: "gpt-5.4" }
const model = { providerID: "openai", modelID: "gpt-5.5" }
// when
const variant = resolveVariantForModel(config, "oracle", model)
+8 -8
View File
@@ -39,7 +39,7 @@ describe("migrateAgentNames", () => {
test("preserves current agent names unchanged", () => {
// given: Config with current agent names
const agents = {
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5-preview" },
librarian: { model: "google/gemini-3-flash" },
explore: { model: "opencode/gpt-5-nano" },
}
@@ -49,7 +49,7 @@ describe("migrateAgentNames", () => {
// then: Current names should remain unchanged
expect(changed).toBe(false)
expect(migrated["oracle"]).toEqual({ model: "openai/gpt-5.4" })
expect(migrated["oracle"]).toEqual({ model: "openai/gpt-5.5-preview" })
expect(migrated["librarian"]).toEqual({ model: "google/gemini-3-flash" })
expect(migrated["explore"]).toEqual({ model: "opencode/gpt-5-nano" })
})
@@ -620,7 +620,7 @@ describe("migrateModelVersions", () => {
test("leaves unknown model strings untouched", () => {
// given: Agent config with unknown model
const agents = {
oracle: { model: "openai/gpt-5.4", temperature: 0.5 },
oracle: { model: "openai/gpt-5.5-preview", temperature: 0.5 },
}
// when: Migrate model versions
@@ -629,7 +629,7 @@ describe("migrateModelVersions", () => {
// then: Config should remain unchanged
expect(changed).toBe(false)
const oracle = migrated["oracle"] as Record<string, unknown>
expect(oracle.model).toBe("openai/gpt-5.4")
expect(oracle.model).toBe("openai/gpt-5.5-preview")
})
test("handles agent config with no model field", () => {
@@ -665,7 +665,7 @@ describe("migrateModelVersions", () => {
const agents = {
sisyphus: { model: "openai/gpt-5.4-codex" },
prometheus: { model: "anthropic/claude-opus-4-5" },
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5-preview" },
}
// when: Migrate model versions
@@ -675,7 +675,7 @@ describe("migrateModelVersions", () => {
expect(changed).toBe(true)
expect((migrated["sisyphus"] as Record<string, unknown>).model).toBe("openai/gpt-5.4-codex")
expect((migrated["prometheus"] as Record<string, unknown>).model).toBe("anthropic/claude-opus-4-7")
expect((migrated["oracle"] as Record<string, unknown>).model).toBe("openai/gpt-5.4")
expect((migrated["oracle"] as Record<string, unknown>).model).toBe("openai/gpt-5.5-preview")
})
test("handles empty object", () => {
@@ -1083,7 +1083,7 @@ describe("migrateConfigFile with backup", () => {
const rawConfig: Record<string, unknown> = {
agents: {
"multimodal-looker": { model: "anthropic/claude-haiku-4-5" },
oracle: { model: "openai/gpt-5.4" },
oracle: { model: "openai/gpt-5.5-preview" },
"my-custom-agent": { model: "google/gemini-3.1-pro" },
},
}
@@ -1099,7 +1099,7 @@ describe("migrateConfigFile with backup", () => {
const agents = rawConfig.agents as Record<string, Record<string, unknown>>
expect(agents["multimodal-looker"].model).toBe("anthropic/claude-haiku-4-5")
expect(agents.oracle.model).toBe("openai/gpt-5.4")
expect(agents.oracle.model).toBe("openai/gpt-5.5-preview")
expect(agents["my-custom-agent"].model).toBe("google/gemini-3.1-pro")
})
+7 -7
View File
@@ -7,19 +7,19 @@ import {
} from "./model-requirements"
describe("AGENT_MODEL_REQUIREMENTS", () => {
test("oracle has valid fallbackChain with gpt-5.4 as primary", () => {
test("oracle has valid fallbackChain with gpt-5.5 as primary", () => {
// given - oracle agent requirement
const oracle = AGENT_MODEL_REQUIREMENTS["oracle"]
// when - accessing oracle requirement
// then - fallbackChain exists with gpt-5.4 as first entry
// then - fallbackChain exists with gpt-5.5 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.4")
expect(primary.model).toBe("gpt-5.5")
expect(primary.variant).toBe("high")
})
@@ -323,19 +323,19 @@ describe("CATEGORY_MODEL_REQUIREMENTS", () => {
expect(primary.providers[0]).toBe("openai")
})
test("deep has valid fallbackChain with gpt-5.4 as primary", () => {
test("deep has valid fallbackChain with gpt-5.5 as primary", () => {
// given - deep category requirement
const deep = CATEGORY_MODEL_REQUIREMENTS["deep"]
// when - accessing deep requirement
// then - fallbackChain exists with gpt-5.4 as first entry, medium variant
// then - fallbackChain exists with gpt-5.5 as first entry, medium variant
expect(deep).toBeDefined()
expect(deep.fallbackChain).toBeArray()
expect(deep.fallbackChain.length).toBeGreaterThan(0)
const primary = deep.fallbackChain[0]
expect(primary.variant).toBe("medium")
expect(primary.model).toBe("gpt-5.4")
expect(primary.model).toBe("gpt-5.5")
expect(primary.providers).toContain("openai")
expect(primary.providers).toContain("github-copilot")
})
@@ -597,7 +597,7 @@ describe("ModelRequirement type", () => {
})
describe("requiresModel field in categories", () => {
test("deep category no longer has requiresModel (gpt-5.4 is widely available)", () => {
test("deep category no longer has requiresModel (gpt-5.5 is widely available)", () => {
// given
const deep = CATEGORY_MODEL_REQUIREMENTS["deep"]
+7 -6
View File
@@ -33,6 +33,7 @@ const TEST_AVAILABLE_MODELS = new Set([
"anthropic/claude-haiku-4-5",
"google/gemini-3.1-pro",
"google/gemini-3-flash",
"openai/gpt-5.5",
"openai/gpt-5.4",
"openai/gpt-5.3-codex",
])
@@ -68,7 +69,7 @@ describe("sisyphus-task", () => {
models: {
anthropic: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5"],
google: ["gemini-3.1-pro", "gemini-3-flash"],
openai: ["gpt-5.4", "gpt-5.3-codex"],
openai: ["gpt-5.5", "gpt-5.4", "gpt-5.3-codex"],
},
connected: ["anthropic", "google", "openai"],
updatedAt: "2026-01-01T00:00:00.000Z",
@@ -108,7 +109,7 @@ describe("sisyphus-task", () => {
// when / #then
expect(category).toBeDefined()
expect(category.model).toBe("openai/gpt-5.4")
expect(category.model).toBe("openai/gpt-5.5")
expect(category.variant).toBe("medium")
})
@@ -2553,7 +2554,7 @@ describe("sisyphus-task", () => {
models: {
anthropic: ["claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5"],
google: ["gemini-3.1-pro", "gemini-3-flash"],
openai: ["gpt-5.4", "gpt-5.3-codex"],
openai: ["gpt-5.5", "gpt-5.4", "gpt-5.3-codex"],
"kimi-for-coding": ["k2p5"],
},
connected: ["anthropic", "google", "openai", "kimi-for-coding"],
@@ -4111,11 +4112,11 @@ describe("sisyphus-task", () => {
)
// then - should resolve via AGENT_MODEL_REQUIREMENTS fallback chain for oracle
// oracle fallback chain: gpt-5.4 (openai) > gemini-3.1-pro (google) > claude-opus-4-7 (anthropic)
// Since openai is in connectedProviders, should resolve to openai/gpt-5.4
// oracle fallback chain: gpt-5.5 (openai) > gemini-3.1-pro (google) > claude-opus-4-7 (anthropic)
// Since openai is in connectedProviders, should resolve to openai/gpt-5.5
expect(promptBody.model).toBeDefined()
expect(promptBody.model.providerID).toBe("openai")
expect(promptBody.model.modelID).toContain("gpt-5.4")
expect(promptBody.model.modelID).toContain("gpt-5.5")
}, { timeout: 20000 })
})