using LazyBear.MCP.Services.Confluence; using LazyBear.MCP.Services.Jira; using LazyBear.MCP.Services.Kubernetes; using LazyBear.MCP.Services.Logging; using LazyBear.MCP.Services.Mcp; using LazyBear.MCP.Services.ToolRegistry; using LazyBear.MCP.TUI; using LazyBear.MCP.TUI.Components; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using RazorConsole.Core; // ── Общий логгер и один DI-контейнер для TUI + MCP ────────────────────────── var logSink = new InMemoryLogSink(); var host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddSingleton(logSink); services.AddSingleton(); // MCP-провайдеры services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Модули инструментов (добавь новый IToolModule — он появится в TUI) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // HTTP MCP endpoint запускаем в фоне, чтобы TUI оставался владельцем консоли services.AddHostedService(); // Глобальный читатель клавиш — единственный источник клавишных событий для TUI services.AddSingleton(); services.AddHostedService(sp => sp.GetRequiredService()); }) .ConfigureLogging(logging => { logging.ClearProviders(); logging.AddProvider(new InMemoryLoggerProvider(logSink)); }) .UseRazorConsole(hostBuilder => { hostBuilder.ConfigureServices(services => { services.Configure(options => { options.AutoClearConsole = true; options.EnableTerminalResizing = true; options.AfterRenderAsync = (_, _, _) => { try { Console.CursorVisible = false; } catch { // Ignore terminals that do not support CursorVisible. } try { Console.Write("\u001b[?25l"); Console.Out.Flush(); } catch { // Ignore terminals that do not support ANSI cursor control. } return Task.CompletedTask; }; }); }); }) .Build(); // ── Регистрируем модули один раз до старта TUI и web host ─────────────────── var registry = host.Services.GetRequiredService(); foreach (var module in host.Services.GetServices()) { registry.RegisterModule(module); } await host.RunAsync();