using Microsoft.Extensions.DependencyInjection; using Journal.Core.Repositories; using Journal.Core.Services.Ai; using Journal.Core.Services.Config; using Journal.Core.Services.Database; using Journal.Core.Services.Entries; using Journal.Core.Services.Fragments; using Journal.Core.Services.Lists; using Journal.Core.Services.Logging; using Journal.Core.Services.Sidecar; using Journal.Core.Services.Speech; using Journal.Core.Services.Todos; using Journal.Core.Services.Vault; namespace Journal.Core; public static class ServiceCollectionExtensions { public static IServiceCollection AddFragmentServices(this IServiceCollection services) { services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddTransient(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(provider => { var config = provider.GetRequiredService().Current; if (!string.Equals(config.AiProvider, "python-sidecar", StringComparison.OrdinalIgnoreCase)) return new DisabledAiService(config.AiProvider); try { return new PythonSidecarAiService(config); } catch (Exception ex) { return new DisabledAiService( provider: "python-sidecar", message: $"Python AI sidecar unavailable: {ex.Message}", healthy: false); } }); services.AddSingleton(provider => { var config = provider.GetRequiredService().Current; try { return new PythonSidecarSpeechService(config); } catch (Exception ex) { return new DisabledSpeechBridgeService( provider: "python-sidecar", message: $"Python speech sidecar unavailable: {ex.Message}"); } }); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); return services; } }