/** * Audible cues + the iOS/Safari speech unlock — the browser-audio side effects the voice * hook fires, with none of its state. * * These were module-level functions inside `use-voice.ts`: they close over nothing from the * hook, take primitives, and touch only WebAudio / SpeechSynthesis. That makes them the one * part of that file with a genuinely narrow seam, so they live here instead of in front of * the orchestration a reader is actually trying to follow. * * All of them swallow their own errors. A cue is feedback, never a step in a turn — a locked * tab or an unsupported engine must degrade to "no sound", never to a thrown exception that * aborts the mic open or the send that was about to happen. */ /** * The "mic is live again" cue (#152). Unmuting by VOICE has no visual gesture behind it — * the user is not looking at the screen, which is the whole point of hands-free — so a * confirmation they can HEAR is the only signal that the command landed. Synthesised with * WebAudio rather than an asset so it ships with the SDK and needs no network fetch. * * Deliberately short and quiet: it fires immediately before the mic opens, and anything * longer would be captured as the start of the user's own turn. */ export declare function playStartCue(): void; /** * Unlock browser Text-to-Speech synchronously inside a user gesture. iOS/Safari * won't speak an utterance that's queued LATER (e.g. an async agent reply) unless * SpeechSynthesis was first invoked during a real tap — this is the "replied in text * but not voice" cause. Speaking an empty utterance on the toggle primes it. */ export declare function unlockSpeechSynthesis(): void; export declare function getAudioCtx(): AudioContext; /** Rising two-tone: "your turn" — the mic just opened. */ export declare function playListeningChime(): void; /** Falling two-tone: "got it" — the turn was sent, the agent is thinking. */ export declare function playThinkingChime(): void; //# sourceMappingURL=cues.d.ts.map