diff --git a/src/resources/extensions/sf/codebase-generator.ts b/src/resources/extensions/sf/codebase-generator.ts index 4e8ce0176..3f42d8858 100644 --- a/src/resources/extensions/sf/codebase-generator.ts +++ b/src/resources/extensions/sf/codebase-generator.ts @@ -681,7 +681,7 @@ export function ensureCodebaseMapFresh( const existingDescriptions = parseCodebaseMap(existing); const ageMs = metadata ? now - Date.parse(metadata.generatedAt) : Number.POSITIVE_INFINITY; const staleReason = - !metadata ? "missing-metadata" + !metadata ? undefined // no metadata = manually maintained by research agent, never auto-overwrite : metadata.fingerprint !== fingerprint ? "files-changed" : metadata.fileCount !== listed.files.length ? "file-count-changed" : metadata.truncated !== listed.truncated ? "truncation-changed" diff --git a/src/resources/extensions/sf/preferences-models.ts b/src/resources/extensions/sf/preferences-models.ts index 2d43b8a79..d3fe8d303 100644 --- a/src/resources/extensions/sf/preferences-models.ts +++ b/src/resources/extensions/sf/preferences-models.ts @@ -12,7 +12,7 @@ import { join } from "node:path"; import type { DynamicRoutingConfig } from "./model-router.js"; import { defaultRoutingConfig } from "./model-router.js"; import type { TokenProfile, InlineLevel } from "./types.js"; -import { getProviders, getModels } from "@singularity-forge/pi-ai"; +import { getProviders, getModels, getEnvApiKey } from "@singularity-forge/pi-ai"; import { selectByBenchmarks } from "./benchmark-selector.js"; import type { @@ -97,6 +97,7 @@ function resolveAutoBenchmarkPickForUnit( const candidates: Array<{ provider: string; id: string }> = []; for (const provider of getProviders()) { if (allowed && !allowed.includes(provider.toLowerCase())) continue; + if (!getEnvApiKey(provider)) continue; for (const model of getModels(provider)) { if (!isProviderModelAllowed(provider, model.id, prefs?.provider_model_allow)) continue; candidates.push({ provider, id: model.id });