diff --git a/apps/server/src/provider/ModelManifest.test.ts b/apps/server/src/provider/ModelManifest.test.ts index 7933f8e2e962..73a0169b64f9 100644 --- a/apps/server/src/provider/ModelManifest.test.ts +++ b/apps/server/src/provider/ModelManifest.test.ts @@ -547,7 +547,7 @@ describe("ModelManifest service", () => { ), ); - it.live("does not fetch when provider update checks are disabled", () => + it.live("fetches the remote manifest when provider update checks are disabled", () => Effect.gen(function* () { let fetchCount = 0; const service = yield* make.pipe( @@ -558,9 +558,12 @@ describe("ModelManifest service", () => { }), ), ); - assert.deepStrictEqual(yield* service.refresh, BUNDLED_MODEL_MANIFEST); - assert.deepStrictEqual(yield* service.forceRefresh, BUNDLED_MODEL_MANIFEST); - assert.strictEqual(fetchCount, 0); + assert.deepStrictEqual(yield* service.refresh, REMOTE_MANIFEST); + assert.strictEqual(fetchCount, 1); + // Explicit refresh (Settings → Providers → Refresh provider status) + // uses the same path and must stay independent of the CLI check switch. + assert.deepStrictEqual(yield* service.forceRefresh, REMOTE_MANIFEST); + assert.strictEqual(fetchCount, 2); }).pipe( Effect.scoped, Effect.provide( diff --git a/apps/server/src/provider/ModelManifest.ts b/apps/server/src/provider/ModelManifest.ts index d1af1086e750..4d0ee6e53577 100644 --- a/apps/server/src/provider/ModelManifest.ts +++ b/apps/server/src/provider/ModelManifest.ts @@ -31,7 +31,6 @@ import * as Semaphore from "effect/Semaphore"; import { HttpClient, HttpClientResponse } from "effect/unstable/http"; import { ServerConfig } from "../config.ts"; -import * as ServerSettings from "../serverSettings.ts"; import { hasValidClaudeManifestAdapters } from "./ClaudeModelManifest.ts"; import bundledManifestJson from "./model-manifest.json" with { type: "json" }; import { ProviderCompatibilityPolicy } from "./providerCompatibility.ts"; @@ -340,7 +339,6 @@ export const make = Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; const path = yield* Path.Path; const config = yield* ServerConfig; - const settingsService = yield* ServerSettings.ServerSettingsService; const httpClient = yield* HttpClient.HttpClient; const serviceScope = yield* Effect.scope; @@ -385,15 +383,8 @@ export const make = Effect.gen(function* () { if (!force && isWithin(fetchedAtMs, MANIFEST_TTL_MS)) return manifest; if (!force && isWithin(lastAttemptMs, MANIFEST_RETRY_MS)) return manifest; - // The same switch that gates provider CLI update checks. It stops network - // fetches only: a manifest already cached on disk from an earlier fetch - // stays in effect, since the setting is about phoning home, not about - // discarding data the server already holds. - const settings = yield* settingsService.getSettings.pipe( - Effect.catchCause(() => Effect.succeed(null)), - ); - if (settings !== null && !settings.enableProviderUpdateChecks) return manifest; - + // Catalog refresh is independent of Settings → Provider update checks. + // That switch only gates CLI version lookups. lastAttemptMs = now; const fetched = yield* httpClient.get(MODEL_MANIFEST_URL).pipe( Effect.flatMap(HttpClientResponse.filterStatusOk),