From 8c8b1e78b0f0292fc0ea677d716484a1d6365ae6 Mon Sep 17 00:00:00 2001 From: saridsa2 Date: Sat, 18 Apr 2026 05:29:56 +0530 Subject: [PATCH] feat: caller context cache invalidation endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CallerContextService: added invalidateCache(leadId) method - CallerResolutionController: POST /api/caller/invalidate-context endpoint — frontend calls after appointment mutations to bust stale AI context cache Co-Authored-By: Claude Opus 4.6 (1M context) --- src/caller/caller-context.service.ts | 7 +++++++ src/caller/caller-resolution.controller.ts | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/src/caller/caller-context.service.ts b/src/caller/caller-context.service.ts index ebc40ee..bc0e95d 100644 --- a/src/caller/caller-context.service.ts +++ b/src/caller/caller-context.service.ts @@ -78,6 +78,13 @@ export class CallerContextService { return ctx; } + async invalidateCache(leadId: string): Promise { + if (!leadId) return; + const cacheKey = `${CACHE_KEY_PREFIX}${leadId}`; + await this.session.deleteCache(cacheKey).catch(() => {}); + this.logger.log(`[CALLER-CTX] Cache invalidated for ${leadId}`); + } + // Fire-and-forget pre-warm — called from caller resolution // so the cache is hot when the AI stream fires seconds later. prewarm(leadId: string, patientId: string, auth: string): void { diff --git a/src/caller/caller-resolution.controller.ts b/src/caller/caller-resolution.controller.ts index aa7aa83..4ea3887 100644 --- a/src/caller/caller-resolution.controller.ts +++ b/src/caller/caller-resolution.controller.ts @@ -33,4 +33,13 @@ export class CallerResolutionController { return result; } + + @Post('invalidate-context') + async invalidateContext(@Body('leadId') leadId: string) { + if (!leadId) { + throw new HttpException('leadId is required', HttpStatus.BAD_REQUEST); + } + await this.callerContext.invalidateCache(leadId); + return { status: 'ok' }; + } }