From ad0ff858b8d172fbab04fcbc4510ac9d9ce4de6e Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 2 Aug 2026 01:29:46 +0800 Subject: [PATCH] refactor(meeting): keep continuity abort internal --- src/meeting-bot/agent-consult.ts | 16 ++++++++++------ src/meeting-bot/realtime-engine.ts | 11 +++++++++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/meeting-bot/agent-consult.ts b/src/meeting-bot/agent-consult.ts index 4464679c42b3..63206e9f6d45 100644 --- a/src/meeting-bot/agent-consult.ts +++ b/src/meeting-bot/agent-consult.ts @@ -19,10 +19,11 @@ import type { MeetingAgentConsultSurface, MeetingPlatformRuntimeMetadata, } from "./platform-adapter-contract.js"; -import type { - MeetingAgentConsultParams, - MeetingRealtimeToolCallParams, - MeetingRuntimePlatform, +import { + readMeetingRealtimeToolAbortSignal, + type MeetingAgentConsultParams, + type MeetingRealtimeToolCallParams, + type MeetingRuntimePlatform, } from "./realtime-engine.js"; function resolveMeetingRealtimeTools( @@ -77,7 +78,8 @@ export function createMeetingRealtimeEngineBindings(params: { ...consult, }), tools: resolveMeetingRealtimeTools(params.config.realtime.toolPolicy), - handleToolCall: async (call) => + handleToolCall: async (call) => { + const abortSignal = readMeetingRealtimeToolAbortSignal(call.session); await handleMeetingRealtimeConsultToolCall({ surface, config: params.fullConfig, @@ -85,8 +87,10 @@ export function createMeetingRealtimeEngineBindings(params: { logger: params.logger, agentId: params.config.realtime.agentId, toolPolicy: params.config.realtime.toolPolicy, + abortSignal, ...call, - }), + }); + }, }; } diff --git a/src/meeting-bot/realtime-engine.ts b/src/meeting-bot/realtime-engine.ts index aa4c331d52a3..7e08a49bb362 100644 --- a/src/meeting-bot/realtime-engine.ts +++ b/src/meeting-bot/realtime-engine.ts @@ -67,7 +67,6 @@ export type MeetingAgentConsultParams = { export type MeetingRealtimeToolCallParams = { strategy: string; session: RealtimeVoiceBridgeSession; - abortSignal?: AbortSignal; event: RealtimeVoiceToolCallEvent; meetingSessionId: string; requesterSessionKey?: string; @@ -99,6 +98,13 @@ const MEETING_REALTIME_OUTPUT_MAX_PENDING_MS = 2_000; const MEETING_REALTIME_OUTPUT_MAX_WRITE_MS = 500; const MEETING_REALTIME_OUTPUT_MAX_PENDING_FRAMES = 256; const MEETING_REALTIME_CANCELLATION_RACE_DETAIL = "Cancellation failed: no active response found"; +const meetingRealtimeToolAbortSignals = new WeakMap(); + +export function readMeetingRealtimeToolAbortSignal( + session: RealtimeVoiceBridgeSession, +): AbortSignal | undefined { + return meetingRealtimeToolAbortSignals.get(session); +} export async function startMeetingRealtimeEngine(params: { config: MeetingRealtimeEngineConfig; @@ -647,6 +653,7 @@ export async function startMeetingRealtimeEngine(params: { }); const turnId = harness.ensureTurn(); const guardedSession = Object.create(session) as RealtimeVoiceBridgeSession; + meetingRealtimeToolAbortSignals.set(guardedSession, controller.signal); guardedSession.submitToolResult = (callId, result, options) => { if (controller.signal.aborted || epoch !== toolContinuityEpoch) { return; @@ -657,7 +664,6 @@ export async function startMeetingRealtimeEngine(params: { .handleToolCall({ strategy, session: guardedSession, - abortSignal: controller.signal, event, meetingSessionId: params.meetingSessionId, requesterSessionKey: params.requesterSessionKey, @@ -676,6 +682,7 @@ export async function startMeetingRealtimeEngine(params: { throw error; }) .finally(() => { + meetingRealtimeToolAbortSignals.delete(guardedSession); activeToolCalls.delete(controller); }); },