import { Module } from "@nestjs/common"; import { APP_INTERCEPTOR, APP_GUARD } from "@nestjs/core"; import { ThrottlerModule } from "@nestjs/throttler"; import { BullModule } from "@nestjs/bullmq"; import { ThrottlerValkeyStorageService, ThrottlerApiKeyGuard } from "./common/throttler"; import { CsrfGuard } from "./common/guards/csrf.guard"; import { CsrfService } from "./common/services/csrf.service"; import { AppController } from "./app.controller"; import { AppService } from "./app.service"; import { CsrfController } from "./common/controllers/csrf.controller"; import { PrismaModule } from "./prisma/prisma.module"; import { DatabaseModule } from "./database/database.module"; import { AuthModule } from "./auth/auth.module"; import { ActivityModule } from "./activity/activity.module"; import { TasksModule } from "./tasks/tasks.module"; import { EventsModule } from "./events/events.module"; import { ProjectsModule } from "./projects/projects.module"; import { DomainsModule } from "./domains/domains.module"; import { IdeasModule } from "./ideas/ideas.module"; import { WidgetsModule } from "./widgets/widgets.module"; import { LayoutsModule } from "./layouts/layouts.module"; import { KnowledgeModule } from "./knowledge/knowledge.module"; import { UsersModule } from "./users/users.module"; import { WebSocketModule } from "./websocket/websocket.module"; import { LlmModule } from "./llm/llm.module"; import { LlmUsageModule } from "./llm-usage/llm-usage.module"; import { BrainModule } from "./brain/brain.module"; import { CronModule } from "./cron/cron.module"; import { AgentTasksModule } from "./agent-tasks/agent-tasks.module"; import { FindingsModule } from "./findings/findings.module"; import { AgentMemoryModule } from "./agent-memory/agent-memory.module"; import { ValkeyModule } from "./valkey/valkey.module"; import { BullMqModule } from "./bullmq/bullmq.module"; import { StitcherModule } from "./stitcher/stitcher.module"; import { TelemetryModule, TelemetryInterceptor } from "./telemetry"; import { RunnerJobsModule } from "./runner-jobs/runner-jobs.module"; import { JobEventsModule } from "./job-events/job-events.module"; import { JobStepsModule } from "./job-steps/job-steps.module"; import { CoordinatorIntegrationModule } from "./coordinator-integration/coordinator-integration.module"; import { FederationModule } from "./federation/federation.module"; import { CredentialsModule } from "./credentials/credentials.module"; import { MosaicTelemetryModule } from "./mosaic-telemetry"; import { SpeechModule } from "./speech/speech.module"; import { DashboardModule } from "./dashboard/dashboard.module"; import { TerminalModule } from "./terminal/terminal.module"; import { PersonalitiesModule } from "./personalities/personalities.module"; import { WorkspacesModule } from "./workspaces/workspaces.module"; import { AdminModule } from "./admin/admin.module"; import { TeamsModule } from "./teams/teams.module"; import { ImportModule } from "./import/import.module"; import { ConversationArchiveModule } from "./conversation-archive/conversation-archive.module"; import { RlsContextInterceptor } from "./common/interceptors/rls-context.interceptor"; @Module({ imports: [ // Rate limiting configuration ThrottlerModule.forRootAsync({ useFactory: () => { const ttl = parseInt(process.env.RATE_LIMIT_TTL ?? "60", 10) * 1000; // Convert to milliseconds const limit = parseInt(process.env.RATE_LIMIT_GLOBAL_LIMIT ?? "100", 10); return { throttlers: [ { ttl, limit, }, ], storage: new ThrottlerValkeyStorageService(), }; }, }), // BullMQ job queue configuration BullModule.forRoot({ connection: (() => { const url = new URL(process.env.VALKEY_URL ?? "redis://localhost:6379"); return { host: url.hostname, port: parseInt(url.port || "6379", 10), }; })(), }), TelemetryModule, PrismaModule, DatabaseModule, ValkeyModule, BullMqModule, StitcherModule, AuthModule, ActivityModule, TasksModule, EventsModule, ProjectsModule, DomainsModule, IdeasModule, WidgetsModule, LayoutsModule, KnowledgeModule, UsersModule, WebSocketModule, LlmModule, LlmUsageModule, BrainModule, CronModule, AgentTasksModule, FindingsModule, AgentMemoryModule, RunnerJobsModule, JobEventsModule, JobStepsModule, CoordinatorIntegrationModule, FederationModule, CredentialsModule, MosaicTelemetryModule, SpeechModule, DashboardModule, TerminalModule, PersonalitiesModule, WorkspacesModule, AdminModule, TeamsModule, ImportModule, ConversationArchiveModule, ], controllers: [AppController, CsrfController], providers: [ AppService, CsrfService, { provide: APP_INTERCEPTOR, useClass: TelemetryInterceptor, }, { provide: APP_INTERCEPTOR, useClass: RlsContextInterceptor, }, { provide: APP_GUARD, useClass: ThrottlerApiKeyGuard, }, { provide: APP_GUARD, useClass: CsrfGuard, }, ], }) export class AppModule {}