From 05e95346bd71f7dd2d7ced02f3f213854ca58e3d Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 1 Aug 2026 11:40:54 +0200 Subject: [PATCH] fix(models): split scoped catalog preparation --- src/agents/prepared-model-catalog.test.ts | 3 ++ src/agents/prepared-model-catalog.ts | 6 ++-- src/agents/prepared-model-runtime.facts.ts | 24 -------------- .../prepared-model-runtime.scoped-catalog.ts | 31 +++++++++++++++++++ ...pared-model-runtime.startup-static.test.ts | 3 +- 5 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 src/agents/prepared-model-runtime.scoped-catalog.ts diff --git a/src/agents/prepared-model-catalog.test.ts b/src/agents/prepared-model-catalog.test.ts index c80891facfa6..b2293b71412e 100644 --- a/src/agents/prepared-model-catalog.test.ts +++ b/src/agents/prepared-model-catalog.test.ts @@ -50,6 +50,9 @@ vi.mock("./prepared-model-runtime.js", () => { vi.mock("./prepared-model-runtime.facts.js", () => ({ isPreparedModelCatalogFull: (...args: unknown[]) => mocks.isFullCatalog(...args), +})); + +vi.mock("./prepared-model-runtime.scoped-catalog.js", () => ({ prepareScopedReadOnlyModelCatalog: (...args: unknown[]) => mocks.prepareScopedCatalog(...args), })); diff --git a/src/agents/prepared-model-catalog.ts b/src/agents/prepared-model-catalog.ts index c3911cee0555..6449032b0955 100644 --- a/src/agents/prepared-model-catalog.ts +++ b/src/agents/prepared-model-catalog.ts @@ -12,10 +12,7 @@ import type { ModelCatalogEntry, ModelCatalogSnapshot } from "./model-catalog.ty import { resolvePublishedModelCatalogOwner } from "./prepared-model-catalog-owner.js"; import { PreparedModelCatalogConfigReplacedError } from "./prepared-model-catalog.errors.js"; import type { ResolvedPublishedModelCatalogOwner } from "./prepared-model-catalog.types.js"; -import { - isPreparedModelCatalogFull, - prepareScopedReadOnlyModelCatalog, -} from "./prepared-model-runtime.facts.js"; +import { isPreparedModelCatalogFull } from "./prepared-model-runtime.facts.js"; import { acquireAgentRunPreparedModelRuntime, acquireReadOnlyPreparedModelRuntime, @@ -27,6 +24,7 @@ import { type PreparedModelRuntimeInput, type PreparedModelRuntimeSnapshot, } from "./prepared-model-runtime.js"; +import { prepareScopedReadOnlyModelCatalog } from "./prepared-model-runtime.scoped-catalog.js"; export type LoadPreparedModelCatalogParams = { agentId?: string; diff --git a/src/agents/prepared-model-runtime.facts.ts b/src/agents/prepared-model-runtime.facts.ts index 0e7c561c2657..5ba4b4f17414 100644 --- a/src/agents/prepared-model-runtime.facts.ts +++ b/src/agents/prepared-model-runtime.facts.ts @@ -500,30 +500,6 @@ export function isPreparedModelCatalogFull(snapshot: ModelCatalogSnapshot): bool return fullModelCatalogSnapshots.has(snapshot); } -/** Builds a request-scoped read-only catalog from configured and auth-candidate providers. */ -export async function prepareScopedReadOnlyModelCatalog( - input: PreparedModelRuntimeInput, - providerDiscoveryProviderIds: readonly string[], -): Promise { - const scopedInput = input.readOnly ? input : { ...input, readOnly: true }; - const { agentFacts, workspaceFacts } = await prepareWorkspaceBuildGroup([scopedInput], "static", { - providerDiscoveryProviderIds, - }); - const agentFactsForInput = agentFacts[0]; - if (!agentFactsForInput) { - throw new Error("scoped prepared model catalog facts are missing"); - } - const catalogSource = await prepareAgentCatalogSource( - agentFactsForInput, - workspaceFacts, - "static", - false, - ); - return ( - await prepareFullCatalogFacts(agentFactsForInput, workspaceFacts, "static", catalogSource) - ).modelCatalog; -} - function modelCatalogEntryKey(entry: Pick): string { return `${normalizeProviderId(entry.provider)}\0${entry.id.trim().toLowerCase()}`; } diff --git a/src/agents/prepared-model-runtime.scoped-catalog.ts b/src/agents/prepared-model-runtime.scoped-catalog.ts new file mode 100644 index 000000000000..d01704a80052 --- /dev/null +++ b/src/agents/prepared-model-runtime.scoped-catalog.ts @@ -0,0 +1,31 @@ +import type { ModelCatalogSnapshot } from "./model-catalog.types.js"; +import { + prepareAgentCatalogSource, + prepareFullCatalogFacts, + prepareWorkspaceBuildGroup, +} from "./prepared-model-runtime.facts.js"; +import type { PreparedModelRuntimeInput } from "./prepared-model-runtime.types.js"; + +/** Builds a request-scoped read-only catalog from configured and auth-candidate providers. */ +export async function prepareScopedReadOnlyModelCatalog( + input: PreparedModelRuntimeInput, + providerDiscoveryProviderIds: readonly string[], +): Promise { + const scopedInput = input.readOnly ? input : { ...input, readOnly: true }; + const { agentFacts, workspaceFacts } = await prepareWorkspaceBuildGroup([scopedInput], "static", { + providerDiscoveryProviderIds, + }); + const agentFactsForInput = agentFacts[0]; + if (!agentFactsForInput) { + throw new Error("scoped prepared model catalog facts are missing"); + } + const catalogSource = await prepareAgentCatalogSource( + agentFactsForInput, + workspaceFacts, + "static", + false, + ); + return ( + await prepareFullCatalogFacts(agentFactsForInput, workspaceFacts, "static", catalogSource) + ).modelCatalog; +} diff --git a/src/agents/prepared-model-runtime.startup-static.test.ts b/src/agents/prepared-model-runtime.startup-static.test.ts index 2a8520893180..b29ebb0099ab 100644 --- a/src/agents/prepared-model-runtime.startup-static.test.ts +++ b/src/agents/prepared-model-runtime.startup-static.test.ts @@ -163,7 +163,8 @@ vi.mock("../logging/subsystem.js", () => ({ const { getPreparedModelRuntimeSnapshot, refreshPreparedModelRuntimeSnapshots } = await import("./prepared-model-runtime.js"); -const { prepareScopedReadOnlyModelCatalog } = await import("./prepared-model-runtime.facts.js"); +const { prepareScopedReadOnlyModelCatalog } = + await import("./prepared-model-runtime.scoped-catalog.js"); const { resetPreparedModelRuntimeSnapshotsForTest } = await import("./prepared-model-runtime.test-support.js");