import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent"; import type { CodexConversionConfig } from "../../adapter/activation/config.ts"; import { type RealtimeInitialMessageItem } from "../context.ts"; import { type VoiceState } from "./support.ts"; import type { CodexRealtimePeer } from "../conversation/peer.ts"; import type { TransferredVoiceControls } from "../handoff-contract.ts"; import type { CodexRealtimeConversation } from "../conversation/session.ts"; import type { CodexVoiceSessionMessages } from "../session-messages.ts"; import type { CodexVoiceMode } from "../ui.ts"; export interface RealtimePeerPlan { createPeer(): CodexRealtimePeer; onActive?(session: CodexRealtimeConversation, peer: CodexRealtimePeer): void; onInactive?(session: CodexRealtimeConversation, error: Error, resuming: boolean): void; onStatus?(status: string): void; onTransferred?(peer: CodexRealtimePeer, controls: TransferredVoiceControls): void; onTransferEnded?(peer: CodexRealtimePeer, error?: Error): void; onStopped?(): void; } export interface VoiceControllerRuntime { state: VoiceState; alternateVoice?: boolean; context?: ExtensionContext | undefined; config?: CodexConversionConfig | undefined; announcedMode?: CodexVoiceMode | undefined; startGeneration: number; startAbortController?: AbortController | undefined; voiceStatus: string; inputTooQuiet: boolean; realtimePeerPlan?: RealtimePeerPlan | undefined; } export interface PreparedRealtimeContext { initialItems: RealtimeInitialMessageItem[] | undefined; summary?: string | undefined; } export declare function prepareControllerRealtimeContext(options: { pi: ExtensionAPI; ctx: ExtensionContext; config: CodexConversionConfig; signal?: AbortSignal | undefined; onSummaryStatus?: ((active: boolean) => void) | undefined; sourceLeafId?: string | undefined; forceSummary?: boolean | undefined; }): Promise; export declare function startControllerMode(options: { pi: ExtensionAPI; runtime: VoiceControllerRuntime; messages: CodexVoiceSessionMessages; ctx: ExtensionContext; config: CodexConversionConfig; mode: CodexVoiceMode; realtimePeerPlan?: RealtimePeerPlan | undefined; resume?: boolean | undefined; alternateVoice?: boolean | undefined; inputMuted?: boolean | undefined; preparedRealtimeContext?: PreparedRealtimeContext | undefined; signal?: AbortSignal | undefined; prepareRealtimePrompt(ctx: ExtensionContext): string | undefined; stopCurrent(): Promise; finishCurrentDictation(): Promise; onError(error: Error, session?: CodexRealtimeConversation | undefined): void; onEndCall(session: CodexRealtimeConversation): void; onDrop(session: CodexRealtimeConversation, error: Error): void; onStatus(status: string): void; }): Promise;