import { AIProvider, fromModel } from "Enums/ApiProvider"; import type VaultkeeperAIPlugin from "main"; import { RegisterSingleton, RegisterTransient, Resolve } from "./DependencyService"; import { Services } from "./Services"; import { AIPrompt, type IPrompt } from "AIClasses/IPrompt"; import type { IAIClass } from "AIClasses/IAIClass"; import type { IConversationNamingService } from "AIClasses/IConversationNamingService"; import { Gemini } from "AIClasses/Gemini/Gemini"; import { GeminiConversationNamingService } from "AIClasses/Gemini/GeminiConversationNamingService"; import { StreamingMarkdownService } from "./StreamingMarkdownService"; import { FileSystemService } from "./FileSystemService"; import { ConversationFileSystemService } from "./ConversationFileSystemService"; import { ConversationHistoryModal } from "Modals/ConversationHistoryModal"; import { AIFunctionService } from "./AIFunctionService"; import { StreamingService } from "./StreamingService"; import { AIFunctionDefinitions } from "AIClasses/FunctionDefinitions/AIFunctionDefinitions"; import { WorkSpaceService } from "./WorkSpaceService"; import { ChatService } from "./ChatService"; import { ConversationNamingService } from "./ConversationNamingService"; import { VaultService } from "./VaultService"; import type { ITokenService } from "AIClasses/ITokenService"; import { GeminiTokenService } from "AIClasses/Gemini/GeminiTokenService"; import { StatusBarService } from "./StatusBarService"; import { ClaudeTokenService } from "AIClasses/Claude/ClaudeTokenService"; import { OpenAITokenService } from "AIClasses/OpenAI/OpenAITokenService"; import { ClaudeConversationNamingService } from "AIClasses/Claude/ClaudeConversationNamingService"; import { Claude } from "AIClasses/Claude/Claude"; import { OpenAIConversationNamingService } from "AIClasses/OpenAI/OpenAIConversationNamingService"; import { OpenAI } from "AIClasses/OpenAI/OpenAI"; import { SanitiserService } from "./SanitiserService"; import { VaultCacheService } from "./VaultCacheService"; import { UserInputService } from "./UserInputService"; import { SearchStateStore } from "Stores/SearchStateStore"; import { InputService } from "./InputService"; import { HTMLService } from "./HTMLService"; import { SettingsService, type IVaultkeeperAISettings } from "./SettingsService"; import { HelpModal } from "Modals/HelpModal"; import { EventService } from "./EventService"; import { DiffService } from "./DiffService"; import { AbortService } from "./AbortService"; export async function RegisterPlugin(plugin: VaultkeeperAIPlugin) { RegisterSingleton(Services.VaultkeeperAIPlugin, plugin); RegisterSingleton(Services.SettingsService, new SettingsService(await plugin.loadData() as Partial)); } export function RegisterDependencies() { RegisterSingleton(Services.EventService, new EventService()); RegisterSingleton(Services.AbortService, new AbortService()); RegisterSingleton(Services.StatusBarService, new StatusBarService()); RegisterSingleton(Services.HTMLService, new HTMLService()); RegisterSingleton(Services.SanitiserService, new SanitiserService()); RegisterSingleton(Services.DiffService, new DiffService()); RegisterSingleton(Services.VaultService, new VaultService()); RegisterSingleton(Services.VaultCacheService, new VaultCacheService()); RegisterSingleton(Services.SearchStateStore, new SearchStateStore()); RegisterSingleton(Services.UserInputService, new UserInputService()); RegisterSingleton(Services.WorkSpaceService, new WorkSpaceService()); RegisterSingleton(Services.FileSystemService, new FileSystemService()); RegisterSingleton(Services.ConversationFileSystemService, new ConversationFileSystemService()); RegisterSingleton(Services.ConversationNamingService, new ConversationNamingService()); RegisterSingleton(Services.IPrompt, new AIPrompt()); RegisterSingleton(Services.AIFunctionDefinitions, new AIFunctionDefinitions()); RegisterSingleton(Services.AIFunctionService, new AIFunctionService()); RegisterSingleton(Services.StreamingService, new StreamingService()); RegisterSingleton(Services.ChatService, new ChatService()); RegisterTransient(Services.StreamingMarkdownService, () => new StreamingMarkdownService()); RegisterTransient(Services.InputService, () => new InputService()); RegisterModals(); RegisterAiProvider(); } export function RegisterAiProvider() { const settingsService = Resolve(Services.SettingsService); const provider = fromModel(settingsService.settings.model); if (provider == AIProvider.Claude) { RegisterSingleton(Services.IAIClass, new Claude()); RegisterSingleton(Services.ITokenService, new ClaudeTokenService()); RegisterSingleton(Services.IConversationNamingService, new ClaudeConversationNamingService()); } else if (provider == AIProvider.Gemini) { RegisterSingleton(Services.IAIClass, new Gemini()); RegisterSingleton(Services.ITokenService, new GeminiTokenService()); RegisterSingleton(Services.IConversationNamingService, new GeminiConversationNamingService()); } else if (provider == AIProvider.OpenAI) { RegisterSingleton(Services.IAIClass, new OpenAI()); RegisterSingleton(Services.ITokenService, new OpenAITokenService()); RegisterSingleton(Services.IConversationNamingService, new OpenAIConversationNamingService()); } Resolve(Services.ChatService).resolveAIProvider(); Resolve(Services.ConversationNamingService).resolveNamingProvider(); } function RegisterModals() { RegisterTransient(Services.ConversationHistoryModal, () => new ConversationHistoryModal()); RegisterTransient(Services.HelpModal, () => new HelpModal()) }