import type { ExtensionContext } from "@earendil-works/pi-coding-agent"; import type { AssistantMessage } from "@earendil-works/pi-ai"; import type { CodexConversionConfig } from "../../adapter/activation/config.ts"; import type { CodexVoiceController } from "../controller.ts"; import { type LanTakeoverOffer } from "./takeover.ts"; import type { PreparedRealtimeContext } from "../controller/start.ts"; export interface CodexLanVoiceServerStatus { running: boolean; urls: string[]; browserAttached: boolean; } export declare class CodexLanVoiceServerController { private readonly voice; private readonly getConfig; private readonly sendUserMessage; private readonly agentDir; private readonly hasWebSearch; private server; private pendingAssistantText; private operation; private takeoverReservation; constructor(voice: CodexVoiceController, getConfig: () => CodexConversionConfig, sendUserMessage: (text: string, ctx: ExtensionContext) => void, agentDir: string, hasWebSearch?: () => boolean); status(): CodexLanVoiceServerStatus; hasActiveConversation(): boolean; hasActiveVoice(): boolean; prepareTakeover(ctx: ExtensionContext): Promise<{ offer: LanTakeoverOffer; verify: (value: unknown) => Promise; release: () => void; cancel: () => Promise; start: (port: number, context: PreparedRealtimeContext, inputMuted: boolean, alternateVoice: boolean) => Promise; }>; releaseForTakeover(ctx: ExtensionContext, offer: LanTakeoverOffer, releaseAudio: (beforeStop?: () => Promise) => Promise, verify: (proof: { port: number; token: string; }) => Promise): Promise; setEnabled(enabled: boolean, ctx: ExtensionContext): Promise; stop(ctx?: ExtensionContext): Promise; agentStarted(): void; uiPromptStarted(title?: string): void; uiPromptEnded(agentRunning: boolean): void; assistantMessage(message: AssistantMessage): void; agentSettled(): void; private stopCurrent; private enqueue; }