fix(core): harden model selection edges (#30987)

This commit is contained in:
Kit Langton 2026-06-05 12:28:32 -04:00 committed by GitHub
commit 3151e2246a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 50 additions and 15 deletions

View file

@ -281,6 +281,34 @@ describe("CatalogV2", () => {
}),
)
it.effect("ignores a configured default on a disabled provider", () =>
Effect.gen(function* () {
const catalog = yield* Catalog.Service
const disabledProvider = ProviderV2.ID.make("disabled")
const enabledProvider = ProviderV2.ID.make("enabled")
const disabledModel = ModelV2.ID.make("configured")
const fallbackModel = ModelV2.ID.make("fallback")
const transform = yield* catalog.transform()
yield* transform((catalog) => {
catalog.provider.update(disabledProvider, (provider) => {
provider.enabled = false
})
catalog.model.update(disabledProvider, disabledModel, () => {})
catalog.provider.update(enabledProvider, (provider) => {
provider.enabled = { via: "custom", data: {} }
})
catalog.model.update(enabledProvider, fallbackModel, () => {})
catalog.model.default.set(disabledProvider, disabledModel)
})
expect(Option.getOrUndefined(yield* catalog.model.default())).toMatchObject({
providerID: enabledProvider,
id: fallbackModel,
})
}),
)
it.effect("small model prefers small keyword candidates before cost scoring", () =>
Effect.gen(function* () {
const catalog = yield* Catalog.Service

View file

@ -356,12 +356,23 @@ describe("SessionV2.create", () => {
expect(
Array.from(yield* session.events({ sessionID: created.id }).pipe(Stream.take(1), Stream.runCollect)),
).toMatchObject([{ event: { type: "session.next.model.switched", data: { model } } }])
}),
)
it.effect("persists repeated switches as distinct durable Session events", () =>
Effect.gen(function* () {
const session = yield* SessionV2.Service
const created = yield* session.create({ location })
const model = ModelV2.Ref.make({ id: ModelV2.ID.make("sonnet"), providerID: ProviderV2.ID.anthropic })
yield* session.switchModel({ sessionID: created.id, model })
yield* session.switchModel({ sessionID: created.id, model })
const { db } = yield* Database.Service
expect(
yield* db.select().from(EventTable).where(eq(EventTable.aggregate_id, created.id)).all().pipe(Effect.orDie),
).toHaveLength(2)
).toHaveLength(3)
expect(yield* session.get(created.id)).toMatchObject({ model })
}),
)