package main import ( "context" "log" "os" "os/signal" "syscall" "github.com/geo-platform/tenant-api/internal/bootstrap" internalscheduler "github.com/geo-platform/tenant-api/internal/scheduler" tenantapp "github.com/geo-platform/tenant-api/internal/tenant/app" ) func main() { configPath := "configs/config.yaml" if p := os.Getenv("CONFIG_PATH"); p != "" { configPath = p } app, err := bootstrap.New(configPath) if err != nil { log.Fatalf("bootstrap: %v", err) } defer app.Close() generationCfg := app.Config.Generation generationCfg.StreamEnabled = false knowledgeSvc := tenantapp.NewKnowledgeService( app.DB, app.RetrievalProvider, app.VectorStore, app.ObjectStorage, app.LLM, app.Logger, app.Config.Retrieval, app.Config.LLM, 0, 0, ) promptRuleSvc := tenantapp.NewPromptRuleGenerationService( app.DB, app.LLM, app.RabbitMQ, knowledgeSvc, app.GenerationStreams, generationCfg, app.Config.LLM.MaxOutputTokens, ) monitoringCallbackService := tenantapp.NewMonitoringCallbackService( app.DB, app.MonitoringDB, app.RabbitMQ, app.LLM, app.Logger, ) ctx, cancel := context.WithCancel(context.Background()) defer cancel() internalscheduler.NewScheduleDispatchWorker(app.DB, app.RabbitMQ, promptRuleSvc, app.Logger, app.Config.Scheduler).Start(ctx) internalscheduler.NewMonitoringResultRecoveryWorker(app.MonitoringDB, monitoringCallbackService, app.Logger).Start(ctx) internalscheduler.NewMonitoringLeaseRecoveryWorker(app.MonitoringDB, app.Logger).Start(ctx) internalscheduler.NewMonitoringReceivedInspectionWorker(app.MonitoringDB, app.Logger).Start(ctx) internalscheduler.NewKnowledgeDeletedCleanupWorker(knowledgeSvc).Start(ctx) app.Logger.Info("scheduler started") quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit cancel() app.Logger.Info("scheduler shutting down...") }