From 622afb04a539e2296ad5637c7e7e997cefe6b433 Mon Sep 17 00:00:00 2001 From: redshift <213178690+1ftredsh@users.noreply.github.com> Date: Wed, 6 May 2026 20:29:40 +0800 Subject: [PATCH] fix: sync bootstrapped providers into store so providers list is complete After bootstrapProviders runs, newly discovered URLs (e.g. privateprovider.xyz) were only known to the ModelManager cache and never written into the store's baseUrlsList. This caused `providers list` and `models -m ` to show different sets of providers. Now the bootstrap step merges any new URLs into the store so both commands draw from the same source of truth. Co-Authored-By: Claude Sonnet 4 --- src/daemon/index.ts | 2 +- src/daemon/models.ts | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/daemon/index.ts b/src/daemon/index.ts index 9b6de7a..0810551 100644 --- a/src/daemon/index.ts +++ b/src/daemon/index.ts @@ -52,7 +52,7 @@ async function main(): Promise { // Create shared ProviderManager for consistent failure tracking across all requests const providerManager = new ProviderManager(providerRegistry, store); const { ensureProvidersBootstrapped, getRoutstr21Models, getModelProviders } = - createModelService(modelManager); + createModelService(modelManager, store); const walletClient = createCocodClient({ cocodPath: config.cocodPath }); const walletAdapter = await createWalletAdapter({ diff --git a/src/daemon/models.ts b/src/daemon/models.ts index ede63be..abb0999 100644 --- a/src/daemon/models.ts +++ b/src/daemon/models.ts @@ -1,4 +1,4 @@ -import { ModelManager } from "@routstr/sdk"; +import { ModelManager, type SdkStore } from "@routstr/sdk"; import type { ExposedModel } from "./types"; import { logger } from "../utils/logger"; @@ -16,7 +16,7 @@ export type ModelWithProviders = ExposedModel & { providers: ModelProviderInfo[]; }; -export function createModelService(modelManager: ModelManager) { +export function createModelService(modelManager: ModelManager, store: SdkStore) { let providerBootstrapPromise: Promise | null = null; const ensureProvidersBootstrapped = (): Promise => { @@ -26,6 +26,22 @@ export function createModelService(modelManager: ModelManager) { const providers = await modelManager.bootstrapProviders(false); logger.log(`Bootstrapped ${providers.length} providers`); await modelManager.fetchModels(providers); + + // Sync discovered providers into the store so `providers list` reflects + // the same set that the model manager knows about. + const { baseUrlsList, setBaseUrlsList } = store.getState(); + const existing = new Set(baseUrlsList); + const merged = [ + ...baseUrlsList, + ...providers.filter((url) => !existing.has(url)), + ]; + if (merged.length !== baseUrlsList.length) { + setBaseUrlsList(merged); + logger.log( + `Synced ${merged.length - baseUrlsList.length} new provider(s) into store`, + ); + } + logger.log("Provider bootstrap complete."); })().catch((error) => { logger.error("Provider bootstrap failed:", error);