import type { CreateVoiceSessionRequest, VoiceMode, VoiceProviderRoute } from '@xopcai/realtime-protocol/voice'; import type { Config } from '../../config/schema.js'; import type { MediaUnderstandingProvider } from '../../media-understanding/types.js'; import type { ResolvedSpeechProvider } from '../tts/factory.js'; import type { TTSConfig } from '../tts/types.js'; import type { VoiceConversationContext } from './conversation-context.js'; import type { OmniTranscript } from './omniEngine.js'; import type { OmniRoute } from './omniRoute.js'; import type { VoiceAgentBroker } from './agentBroker.js'; export interface ResolvedStreamingStt { plugin: MediaUnderstandingProvider & Required>; model: string; apiKey?: string; baseUrl?: string; headers?: Record; language?: string; prompt?: string; route: VoiceProviderRoute; } export interface VoiceTicketClaim { sessionId: string; connectionEpoch: number; principalId: string; mode?: VoiceMode; request: CreateVoiceSessionRequest; inputMode: 'server_vad'; idleTimeoutMs: number; maxSessionMs: number; silenceDurationMs: number; stt?: ResolvedStreamingStt; omni?: OmniRoute; conversationSessionId?: string; tts?: ResolvedStreamingTts; config: Config; createdAt: number; expiresAt: number; } export interface ResolvedStreamingTts { provider: ResolvedSpeechProvider; config: TTSConfig; route: VoiceProviderRoute; } export interface VoiceRealtimeRuntimeOptions { isPrincipalActive?: (principalId: string) => boolean; recordOmniTranscript?: (conversationId: string, callId: string, entry: OmniTranscript, expectedTranscriptId: string) => Promise; getConversationContext?: (conversationId: string, expectedTranscriptId: string) => Promise; getSessionIdentity?: (conversationId: string) => Promise; getConfig: () => Config; sessionExists: (conversationId: string) => Promise; sessionBusy: (conversationId: string) => boolean; agentBroker: VoiceAgentBroker; recordInterruption: (entry: { conversationId: string; responseId: string; reason: 'barge_in' | 'client_cancelled'; generatedCharacters: number; interruptedDuring: 'thinking' | 'speaking'; }) => Promise; }