refactor(core): let plugins pin small models via catalog draft

Move copilot utility-model preference out of core selection into the
github-copilot plugin by exposing catalog.model.small set/get/remove on
the transform draft.
This commit is contained in:
Aiden Cline 2026-07-12 21:21:41 -05:00
commit d3bdc98457
6 changed files with 49 additions and 14 deletions

View file

@ -393,7 +393,7 @@ describe("CatalogV2", () => {
}),
)
it.effect("small model prefers picker-disabled copilot utility models", () =>
it.effect("small model prefers a plugin-configured small model override", () =>
Effect.gen(function* () {
const catalog = yield* Catalog.Service
const providerID = ProviderV2.ID.githubCopilot
@ -403,14 +403,11 @@ describe("CatalogV2", () => {
model.family = ModelV2.Family.make("gpt-mini")
model.time.released = Date.now()
})
catalog.model.update(providerID, ModelV2.ID.make("gpt-4o-mini"), (model) => {
model.enabled = false
model.time.released = Date.now() - 1000
})
catalog.model.update(providerID, ModelV2.ID.make("gpt-5.4-nano"), (model) => {
model.enabled = false
model.time.released = Date.now() - 2000
})
catalog.model.small.set(providerID, ModelV2.ID.make("gpt-5.4-nano"))
})
expect((yield* catalog.model.small(providerID))?.id).toBe(ModelV2.ID.make("gpt-5.4-nano"))

View file

@ -178,6 +178,12 @@ export function catalogHost(catalog: Catalog.Interface): PluginContext["catalog"
set: (providerID, modelID) =>
draft.model.default.set(ProviderV2.ID.make(providerID), ModelV2.ID.make(modelID)),
},
small: {
get: (providerID) => draft.model.small.get(ProviderV2.ID.make(providerID)),
set: (providerID, modelID) =>
draft.model.small.set(ProviderV2.ID.make(providerID), ModelV2.ID.make(modelID)),
remove: (providerID) => draft.model.small.remove(ProviderV2.ID.make(providerID)),
},
},
}),
),