src / bootstrap.ts
src / bootstrap.ts
import "dotenv/config";
import { Config } from "./config/Config";
import { defaultConfigurationService } from "./config/ConfigurationService";
import { SearchEngine } from "./engine/SearchEngine";
import { HTTPClient } from "./http/HTTPClient";
import { ImageSearchEngine } from "./image_search/engine/ImageSearchEngine";
import { BingImageProvider } from "./image_search/providers/BingImageProvider";
import { DuckDuckGoImageProvider } from "./image_search/providers/DuckDuckGoImageProvider";
import { PexelsImageProvider } from "./image_search/providers/PexelsImageProvider";
import { SerpApiImageProvider } from "./image_search/providers/SerpApiImageProvider";
import { BraveProvider } from "./providers/BraveProvider";
import { DuckDuckGoProvider } from "./providers/DuckDuckGoProvider";
import { ExaProvider } from "./providers/ExaProvider";
import { FirecrawlSearchProvider } from "./providers/FirecrawlSearchProvider";
import { defaultProviderInstanceRegistry } from "./providers/ProviderInstanceRegistry";
import { SerperProvider } from "./providers/SerperProvider";
import { TavilyProvider } from "./providers/TavilyProvider";
import { Logger } from "./utils/Logger";
import { SiteAdapterRegistry } from "./adapters/SiteAdapterRegistry";
import { redditAdapter } from "./adapters/sites/RedditAdapter";
/**
* Shared bootstrap composition module.
* Initializes default search providers using centralized Config and configures central SearchEngine.
* Mapped from Python `server.py` server-level SearchEngine & Config initialization.
*/
Config.load();
SiteAdapterRegistry.register(redditAdapter);
export const defaultHttpClient = new HTTPClient({
timeoutSeconds: Config.getHttpTimeout(),
});
const httpClient = defaultHttpClient;
const duckduckgoWebProvider = new DuckDuckGoProvider({ httpClient });
const exaProvider = new ExaProvider({
keys: Config.getProviderKeys("exa"),
httpClient,
});
const tavilyProvider = new TavilyProvider({
keys: Config.getProviderKeys("tavily"),
httpClient,
});
const serperProvider = new SerperProvider({
keys: Config.getProviderKeys("serper"),
httpClient,
});
const braveProvider = new BraveProvider({
keys: Config.getProviderKeys("brave"),
httpClient,
});
const firecrawlProvider = new FirecrawlSearchProvider({
keys: Config.getProviderKeys("firecrawl"),
httpClient,
});
export const allWebProviders = [
duckduckgoWebProvider,
exaProvider,
tavilyProvider,
serperProvider,
braveProvider,
firecrawlProvider,
];
export const defaultSearchEngine = new SearchEngine(allWebProviders);
// Initialize all available image search providers
const duckduckgoImageProvider = new DuckDuckGoImageProvider({ httpClient });
const bingImageProvider = new BingImageProvider({ httpClient });
const serpapiImageProvider = new SerpApiImageProvider({
keys: Config.getProviderKeys("serpapi"),
httpClient,
});
const pexelsImageProvider = new PexelsImageProvider({
keys: Config.getProviderKeys("pexels"),
httpClient,
});
export const allImageProviders = [
duckduckgoImageProvider,
bingImageProvider,
serpapiImageProvider,
pexelsImageProvider,
];
export const defaultImageSearchEngine = new ImageSearchEngine(allImageProviders);
// Perform initial snapshot-based key synchronization across all auto-registered provider instances
defaultConfigurationService.syncAllProviders();
// Output concise Startup Health Summary
const registeredInstances = defaultProviderInstanceRegistry.getAll();
const webCount = registeredInstances.filter((p) => p.category === "web").length;
const imageCount = registeredInstances.filter((p) => p.category === "image").length;
Logger.info("[Config]", `=================================================`);
Logger.info("[Config]", `Browse Plugin initialized successfully`);
Logger.info("[Config]", ` Total Provider Instances Registered: ${registeredInstances.length}`);
Logger.info("[Config]", ` Web Search Providers: ${webCount} (${defaultSearchEngine.listProviders().join(", ")})`);
Logger.info("[Config]", ` Image Search Providers: ${imageCount} (${defaultImageSearchEngine.listProviders().join(", ")})`);
Logger.info("[Config]", ` Web Content Reader (read_webpage): Ready (30 MB LRU Memory Cache)`);
Logger.info("[Config]", ` Configuration Sources: LM Studio Settings GUI, Environment (.env)`);
Logger.info("[Config]", ` Initial Key Synchronization: Completed`);
Logger.info("[Config]", `=================================================`);
import "dotenv/config";
import { Config } from "./config/Config";
import { defaultConfigurationService } from "./config/ConfigurationService";
import { SearchEngine } from "./engine/SearchEngine";
import { HTTPClient } from "./http/HTTPClient";
import { ImageSearchEngine } from "./image_search/engine/ImageSearchEngine";
import { BingImageProvider } from "./image_search/providers/BingImageProvider";
import { DuckDuckGoImageProvider } from "./image_search/providers/DuckDuckGoImageProvider";
import { PexelsImageProvider } from "./image_search/providers/PexelsImageProvider";
import { SerpApiImageProvider } from "./image_search/providers/SerpApiImageProvider";
import { BraveProvider } from "./providers/BraveProvider";
import { DuckDuckGoProvider } from "./providers/DuckDuckGoProvider";
import { ExaProvider } from "./providers/ExaProvider";
import { FirecrawlSearchProvider } from "./providers/FirecrawlSearchProvider";
import { defaultProviderInstanceRegistry } from "./providers/ProviderInstanceRegistry";
import { SerperProvider } from "./providers/SerperProvider";
import { TavilyProvider } from "./providers/TavilyProvider";
import { Logger } from "./utils/Logger";
import { SiteAdapterRegistry } from "./adapters/SiteAdapterRegistry";
import { redditAdapter } from "./adapters/sites/RedditAdapter";
/**
* Shared bootstrap composition module.
* Initializes default search providers using centralized Config and configures central SearchEngine.
* Mapped from Python `server.py` server-level SearchEngine & Config initialization.
*/
Config.load();
SiteAdapterRegistry.register(redditAdapter);
export const defaultHttpClient = new HTTPClient({
timeoutSeconds: Config.getHttpTimeout(),
});
const httpClient = defaultHttpClient;
const duckduckgoWebProvider = new DuckDuckGoProvider({ httpClient });
const exaProvider = new ExaProvider({
keys: Config.getProviderKeys("exa"),
httpClient,
});
const tavilyProvider = new TavilyProvider({
keys: Config.getProviderKeys("tavily"),
httpClient,
});
const serperProvider = new SerperProvider({
keys: Config.getProviderKeys("serper"),
httpClient,
});
const braveProvider = new BraveProvider({
keys: Config.getProviderKeys("brave"),
httpClient,
});
const firecrawlProvider = new FirecrawlSearchProvider({
keys: Config.getProviderKeys("firecrawl"),
httpClient,
});
export const allWebProviders = [
duckduckgoWebProvider,
exaProvider,
tavilyProvider,
serperProvider,
braveProvider,
firecrawlProvider,
];
export const defaultSearchEngine = new SearchEngine(allWebProviders);
// Initialize all available image search providers
const duckduckgoImageProvider = new DuckDuckGoImageProvider({ httpClient });
const bingImageProvider = new BingImageProvider({ httpClient });
const serpapiImageProvider = new SerpApiImageProvider({
keys: Config.getProviderKeys("serpapi"),
httpClient,
});
const pexelsImageProvider = new PexelsImageProvider({
keys: Config.getProviderKeys("pexels"),
httpClient,
});
export const allImageProviders = [
duckduckgoImageProvider,
bingImageProvider,
serpapiImageProvider,
pexelsImageProvider,
];
export const defaultImageSearchEngine = new ImageSearchEngine(allImageProviders);
// Perform initial snapshot-based key synchronization across all auto-registered provider instances
defaultConfigurationService.syncAllProviders();
// Output concise Startup Health Summary
const registeredInstances = defaultProviderInstanceRegistry.getAll();
const webCount = registeredInstances.filter((p) => p.category === "web").length;
const imageCount = registeredInstances.filter((p) => p.category === "image").length;
Logger.info("[Config]", `=================================================`);
Logger.info("[Config]", `Browse Plugin initialized successfully`);
Logger.info("[Config]", ` Total Provider Instances Registered: ${registeredInstances.length}`);
Logger.info("[Config]", ` Web Search Providers: ${webCount} (${defaultSearchEngine.listProviders().join(", ")})`);
Logger.info("[Config]", ` Image Search Providers: ${imageCount} (${defaultImageSearchEngine.listProviders().join(", ")})`);
Logger.info("[Config]", ` Web Content Reader (read_webpage): Ready (30 MB LRU Memory Cache)`);
Logger.info("[Config]", ` Configuration Sources: LM Studio Settings GUI, Environment (.env)`);
Logger.info("[Config]", ` Initial Key Synchronization: Completed`);
Logger.info("[Config]", `=================================================`);