fix: model format normalization and explicit config cache bypass

- Add normalizeModelFormat() utility for string/object model handling
- Update subagent-resolver to handle both model formats
- Add explicitUserConfig flag to ModelResolutionResult
- Set explicitUserConfig: true when user model is found in pipeline

This fixes the issue where plugin-provided models fail cache validation
and fall through to random fallback models.
This commit is contained in:
Firstbober
2026-02-23 17:42:53 +01:00
parent 8f8b18c089
commit c2e89d5c83
4 changed files with 75 additions and 7 deletions
@@ -0,0 +1,46 @@
import { describe, it, expect } from "bun:test"
import { normalizeModelFormat } from "./model-format-normalizer"
describe("normalizeModelFormat", () => {
describe("string format input", () => {
it("splits provider/model format correctly", () => {
const result = normalizeModelFormat("opencode/glm-5-free")
expect(result).toEqual({ providerID: "opencode", modelID: "glm-5-free" })
})
it("handles provider with multiple slashes", () => {
const result = normalizeModelFormat("anthropic/claude-opus-4-6/max")
expect(result).toEqual({ providerID: "anthropic", modelID: "claude-opus-4-6/max" })
})
it("returns undefined for malformed string without separator", () => {
const result = normalizeModelFormat("invalid")
expect(result).toBeUndefined()
})
it("returns undefined for empty string", () => {
const result = normalizeModelFormat("")
expect(result).toBeUndefined()
})
})
describe("object format input", () => {
it("passthroughs object format unchanged", () => {
const input = { providerID: "opencode", modelID: "glm-5-free" }
const result = normalizeModelFormat(input)
expect(result).toEqual(input)
})
})
describe("edge cases", () => {
it("returns undefined for null", () => {
const result = normalizeModelFormat(null)
expect(result).toBeUndefined()
})
it("returns undefined for undefined", () => {
const result = normalizeModelFormat(undefined)
expect(result).toBeUndefined()
})
})
})