/** * @module gateway/web-call-activity * * "Is the user currently on a web voice call with this device?" * * The website's call path POSTs every spoken turn to the device's * /v1/chat/completions. The device's OWN microphone pipeline is listening at * the same time, and it classifies that same speech as addressed — so each * sentence started TWO full koi runs: one from the call, one from the mic. * * Runs serialize per session, so the duplicates stacked up behind each other: * * lane wait exceeded: lane=session:koi:main:main waitedMs=83345 queueAhead=10 * No reply from koi. (x14) * * The call's own turns then timed out waiting behind mic-triggered work, which * presents as the koi going silent on a call while everything looks healthy. * * The call is the better channel for speech that arrives during a call: it has * the conversation context and it streams back to the caller. So the mic path * stands down while a call is live, and this module is the shared signal. */ /** Called for every turn the website's call path posts to this device. */ export declare function markWebCallTurn(now?: number): void; /** True when a web call turn arrived recently enough to still be in progress. */ export declare function isWebCallActive(now?: number): boolean; /** * The cross-process answer: this process's own flag OR the state file another * process (the gateway) wrote. For code that runs outside the gateway — above * all the TUI's speaker output, which must stay silent while the browser is * the voice. */ export declare function isWebCallActiveAnywhere(now?: number): boolean; /** Test hook — the window is time-based, so tests need a way back to zero. */ export declare function __resetWebCallActivityForTest(): void; /** Test hook — point the cross-process mirror at a scratch file. */ export declare function __setWebCallStateFileForTest(path: string): void;