Implements three-tier garbage collection for agent sessions: - SessionGCService.collect() for immediate per-session cleanup on destroySession() - SessionGCService.sweepOrphans() for daily cron sweep of orphaned Valkey keys - SessionGCService.fullCollect() for cold-start aggressive cleanup via OnModuleInit - /gc slash command wired into CommandExecutorService + registered in CommandRegistryService - SESSION_GC_CRON (daily 4am) added to CronService - GCModule provides Valkey (ioredis via @mosaic/queue) and is imported by AgentModule, LogModule, CommandsModule, AppModule - 8 Vitest unit tests covering all three GC tiers Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
32 lines
859 B
TypeScript
32 lines
859 B
TypeScript
import { Module, type OnApplicationShutdown, Inject } from '@nestjs/common';
|
|
import { createQueue, type QueueHandle } from '@mosaic/queue';
|
|
import { SessionGCService } from './session-gc.service.js';
|
|
import { REDIS } from './gc.tokens.js';
|
|
|
|
const GC_QUEUE_HANDLE = 'GC_QUEUE_HANDLE';
|
|
|
|
@Module({
|
|
providers: [
|
|
{
|
|
provide: GC_QUEUE_HANDLE,
|
|
useFactory: (): QueueHandle => {
|
|
return createQueue();
|
|
},
|
|
},
|
|
{
|
|
provide: REDIS,
|
|
useFactory: (handle: QueueHandle) => handle.redis,
|
|
inject: [GC_QUEUE_HANDLE],
|
|
},
|
|
SessionGCService,
|
|
],
|
|
exports: [SessionGCService],
|
|
})
|
|
export class GCModule implements OnApplicationShutdown {
|
|
constructor(@Inject(GC_QUEUE_HANDLE) private readonly handle: QueueHandle) {}
|
|
|
|
async onApplicationShutdown(): Promise<void> {
|
|
await this.handle.close().catch(() => {});
|
|
}
|
|
}
|