import { Module } from '@nestjs/common'; import { APP_GUARD } from '@nestjs/core'; import { HealthController } from './health/health.controller.js'; import { ConfigModule } from './config/config.module.js'; import { DatabaseModule } from './database/database.module.js'; import { AuthModule } from './auth/auth.module.js'; import { BrainModule } from './brain/brain.module.js'; import { AgentModule } from './agent/agent.module.js'; import { ChatModule } from './chat/chat.module.js'; import { ConversationsModule } from './conversations/conversations.module.js'; import { ProjectsModule } from './projects/projects.module.js'; import { MissionsModule } from './missions/missions.module.js'; import { TasksModule } from './tasks/tasks.module.js'; import { CoordModule } from './coord/coord.module.js'; import { MemoryModule } from './memory/memory.module.js'; import { LogModule } from './log/log.module.js'; import { SkillsModule } from './skills/skills.module.js'; import { PluginModule } from './plugin/plugin.module.js'; import { McpModule } from './mcp/mcp.module.js'; import { AdminModule } from './admin/admin.module.js'; import { CommandsModule } from './commands/commands.module.js'; import { PreferencesModule } from './preferences/preferences.module.js'; import { GCModule } from './gc/gc.module.js'; import { HarnessModule } from './harness/harness.module.js'; import { ReloadModule } from './reload/reload.module.js'; import { WorkspaceModule } from './workspace/workspace.module.js'; import { QueueModule } from './queue/queue.module.js'; import { FederationModule } from './federation/federation.module.js'; import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'; import { loadConfig } from '@mosaicstack/config'; import { resolveGatewayConfigPath } from './env.js'; // Federation (step-ca client, enrollment, federation verbs) is only wired for // tier 'federated' — CaService hard-requires STEP_CA_* at construction, which // must not gate standalone/local boots (docker-compose.federated.yml: the // federation profile "must not start in non-federated dev"). The gateway // entrypoint loads env.ts before evaluating this module so dotenv-backed tier // configuration is visible here. const federationEnabled = loadConfig(resolveGatewayConfigPath()).tier === 'federated'; @Module({ imports: [ ThrottlerModule.forRoot([{ name: 'default', ttl: 60_000, limit: 60 }]), ConfigModule, DatabaseModule, AuthModule, BrainModule, AgentModule, ChatModule, ConversationsModule, ProjectsModule, MissionsModule, TasksModule, CoordModule, MemoryModule, LogModule, SkillsModule, PluginModule, McpModule, AdminModule, PreferencesModule, CommandsModule, GCModule, HarnessModule, QueueModule, ReloadModule, WorkspaceModule, ...(federationEnabled ? [FederationModule] : []), ], controllers: [HealthController], providers: [ { provide: APP_GUARD, useClass: ThrottlerGuard, }, ], }) export class AppModule {}