import { Locator, Page } from '@playwright/test';
/**
 * Voice tab helpers — Playwright bindings for the `AgentVoiceTab` component
 * from `@iblai/web-containers`.
 *
 * The Voice tab contains two sub-tabs:
 *   1. "Voice"              — provider + voice-picker, persisted via mentor settings
 *   2. "Call Configuration" — TTS / STT / LLM / video stack, persisted via the
 *                             `/call-configurations/` endpoint
 *
 * All UI strings mirror `AGENT_VOICE_TAB_LABELS` from
 * `@iblai/web-containers/next`. If a consumer renames a label via the
 * `labels` prop, override these constants per spec — don't edit this file.
 *
 * Selectors below use stable hooks only: `data-testid`, role + name, and
 * label-based queries. No CSS class selectors anywhere — the underlying
 * Tailwind classes are not part of the public contract.
 *
 * The helpers assume the Edit Mentor dialog is already open. Call
 * `switchToVoiceTab(page)` first; from then on every helper accepts either
 * the `Page` or the dialog `Locator`.
 */
export declare const VOICE_LABELS: {
    readonly tabName: "Voice";
    readonly headerTitle: "Voice";
    readonly subTabs: {
        readonly voice: "Voice";
        readonly callConfig: "Voice call";
    };
    readonly providers: {
        readonly browser: "Browser";
        readonly openai: "OpenAI";
        readonly google: "Google";
    };
    readonly voicePickerLabel: {
        readonly openai: "OpenAI Voice";
        readonly google: "Google Voice";
    };
    readonly saveVoiceButton: RegExp;
    readonly callConfigSaveCreate: "Save";
    readonly callConfigSaveUpdate: "Save changes";
    readonly callConfigResetButton: "Reset";
    readonly callConfigFields: {
        readonly mode: "Call style";
        readonly language: "Spoken language";
        readonly llmProvider: "AI provider";
        readonly ttsProvider: "Text-to-speech provider";
        readonly sttProvider: "Speech-to-text provider";
        readonly useFunctionCalling: "Look things up only when needed";
        readonly enableVideo: "Allow screen sharing on a call";
    };
    readonly modeOptions: {
        readonly realtime: "Live conversation";
        readonly inference: "Step-by-step";
    };
    readonly ttsOptions: {
        readonly openai: "OpenAI";
        readonly google: "Google";
        readonly elevenlabs: "ElevenLabs";
    };
    readonly llmOptions: {
        readonly openai: "OpenAI";
        readonly google: "Google";
        readonly anthropic: "Anthropic";
    };
};
export type VoiceProvider = keyof typeof VOICE_LABELS.providers;
export type CallMode = keyof typeof VOICE_LABELS.modeOptions;
export type TtsProvider = keyof typeof VOICE_LABELS.ttsOptions;
export type SttProvider = TtsProvider;
export type LlmProvider = keyof typeof VOICE_LABELS.llmOptions;
/**
 * Check whether the Voice tab is currently rendered in the Edit Mentor
 * dialog. Returns false instead of throwing so consumers can guard
 * conditionally rendered tabs.
 */
export declare function isVoiceTabVisible(page: Page): Promise<boolean>;
/**
 * Switch to the Voice tab. Assumes the Edit Mentor dialog is open.
 */
export declare function switchToVoiceTab(page: Page): Promise<void>;
/**
 * Switch between the Voice / Voice call sub-tabs.
 *
 * Note: "Screen share" used to live here as a third sub-tab but is now
 * a peer top-level tab in the edit-mentor modal. Use the helpers in
 * `screenshare-tab-helpers.ts` for it.
 */
export declare function switchToVoiceSubTab(scope: Page | Locator, sub: 'voice' | 'callConfig'): Promise<void>;
/**
 * Locator for one of the three provider cards on the "Voice" sub-tab.
 */
export declare function getVoiceProviderCard(scope: Page | Locator, provider: VoiceProvider): Locator;
/**
 * Click a provider card. The picker below changes shape based on the
 * selection (Browser → no picker; OpenAI / Google → searchable voice list).
 */
export declare function selectVoiceProvider(scope: Page | Locator, provider: VoiceProvider): Promise<void>;
export declare function expectVoiceProviderSelected(scope: Page | Locator, provider: VoiceProvider): Promise<void>;
/**
 * Open the modal voice picker for the active mentor-voice provider
 * (OpenAI or Google). The trigger renders the currently-picked voice on
 * the Voice sub-tab; clicking its "open" button opens a Dialog with
 * the searchable + paginated picker inside.
 *
 * The trigger root container exposes `data-testid="mentor-voice-trigger"`,
 * and the open button (inside it) is `mentor-voice-trigger-open`. The
 * inline play button is `mentor-voice-trigger-preview` — see
 * `previewMentorVoiceInline`.
 */
export declare function openMentorVoicePicker(scope: Page | Locator): Promise<void>;
/**
 * Open the modal voice picker inside the Call Configuration sub-tab.
 * Only present when an LLM provider has been chosen.
 */
export declare function openCallConfigVoicePicker(scope: Page | Locator): Promise<void>;
/**
 * Click the inline Play button on the mentor-voice trigger to preview
 * the currently-selected voice without opening the modal. Audio
 * playback isn't deterministically observable from Playwright, so this
 * just clicks and returns.
 */
export declare function previewMentorVoiceInline(scope: Page | Locator): Promise<void>;
/**
 * Same as `previewMentorVoiceInline`, but for the Call Configuration
 * voice trigger.
 */
export declare function previewCallConfigVoiceInline(scope: Page | Locator): Promise<void>;
/**
 * Assert that the trigger shows the given voice name (title-cased).
 * Useful for verifying that a previously-saved voice loads correctly.
 */
export declare function expectMentorVoiceTriggerShows(scope: Page | Locator, voiceName: string): Promise<void>;
export declare function expectCallConfigVoiceTriggerShows(scope: Page | Locator, voiceName: string): Promise<void>;
/**
 * Search the voice picker. Typing is debounced ~300ms inside the
 * component, so callers usually want to assert on the eventual results
 * (see `expectVoiceVisible`). When the picker lives inside the modal,
 * scope to the dialog: `searchVoices(page.getByTestId('voice-picker-modal'), 'al')`.
 *
 * Targets the input via `data-testid="voice-picker-search"` — a stable
 * hook that doesn't depend on the (overridable) placeholder copy and
 * avoids ReDoS-shaped placeholder regexes.
 */
export declare function searchVoices(scope: Page | Locator, query: string): Promise<void>;
/**
 * Locator for an individual voice row in the picker. Rows are
 * `role="radio"` with `aria-label` matching the voice name.
 */
export declare function getVoiceRow(scope: Page | Locator, voiceName: string): Locator;
export declare function expectVoiceVisible(scope: Page | Locator, voiceName: string): Promise<void>;
/**
 * Click a voice row to select it. Returns once the row reports
 * aria-checked=true.
 */
export declare function selectVoice(scope: Page | Locator, voiceName: string): Promise<void>;
/**
 * Click the inline preview button next to a voice. Returns immediately —
 * audio playback is async and not deterministically observable from
 * Playwright.
 */
export declare function previewVoice(scope: Page | Locator, voiceName: string): Promise<void>;
/**
 * Click the Save button on the Voice sub-tab. Asserts the button is
 * enabled first (a no-op on a pristine form would be a test bug).
 */
export declare function saveVoiceSettings(scope: Page | Locator): Promise<void>;
/**
 * Locator for the call configuration form, useful as a scope root for
 * subsequent helpers.
 */
export declare function getCallConfigForm(scope: Page | Locator): Locator;
export declare function expectCallConfigVisible(scope: Page | Locator): Promise<void>;
/**
 * Pick a call mode (realtime/inference). The TTS/STT selects below become
 * disabled in realtime mode — assert via `expectTtsSelectDisabled` if your
 * test cares.
 */
export declare function selectCallMode(scope: Page | Locator, mode: CallMode): Promise<void>;
export declare function setCallLanguage(scope: Page | Locator, code: string): Promise<void>;
export declare function selectLlmProvider(scope: Page | Locator, provider: LlmProvider): Promise<void>;
export declare function selectTtsProvider(scope: Page | Locator, provider: TtsProvider): Promise<void>;
export declare function selectSttProvider(scope: Page | Locator, provider: SttProvider): Promise<void>;
export declare function expectTtsSelectDisabled(scope: Page | Locator): Promise<void>;
export declare function expectSttSelectDisabled(scope: Page | Locator): Promise<void>;
export declare function setUseFunctionCallingEnabled(scope: Page | Locator, enabled: boolean): Promise<void>;
export declare function setEnableVideo(scope: Page | Locator, enabled: boolean): Promise<void>;
/**
 * Click the call-config Save button. The label switches between
 * "Create configuration" and "Save changes" depending on whether a config
 * exists; we match either.
 */
export declare function saveCallConfig(scope: Page | Locator): Promise<void>;
export declare function resetCallConfig(scope: Page | Locator): Promise<void>;
