import type { ManagedSession } from "../../types"; import type { ExpoPushContent, ExpoPushSender } from "./expoPushSender"; import { type AttentionKind } from "./notificationCopy"; /** * The payload, and why it is this thin. * * It says *which* session wants attention, never *what* the agent said. The * published privacy policy states notification payloads exclude prompts, * terminal output, credentials and conversation content, so `lastOutput` (raw * PTY output) and `sessionName` (derived from the user's first message) are * both deliberately absent — carrying them is what made the Live Activity * payload diverge from that text (RonenMars/threadbase-mobile#636). * * `projectName` and `sessionId` stay: mobile needs the session id to route the * tap, and a notification that cannot say which project it is about is not * actionable. * * There is no `serverId` here on purpose. Which server the app files this one * under is per registered token, so `ExpoPushSender` adds it per recipient. * The streamer's own hostname is not a substitute: the app keys servers by a * hash of their URL and cannot resolve a hostname. */ export declare function waitingInputMessage(session: Pick, kind?: AttentionKind): ExpoPushContent; export declare class WaitingInputNotifier { private readonly sender; /** Sessions with a turn the user started that has not yet been answered. */ private openTurn; /** Sessions with a prompt (gate or question) already pushed and still open. */ private openPrompt; /** Sessions that have reached a prompt at least once, so they did start. */ private readySeen; /** * Sessions whose going idle has already been looked at, so a repeat emit is * not read as a second death. Cleared when the session is alive again. */ private idleHandled; constructor(sender: ExpoPushSender); /** * React to a session status change. * * Fire-and-forget by design: a push must never delay or fail a session * transition, so this returns a promise the caller may ignore and every error * is logged rather than propagated. */ onStatusChange(session: ManagedSession, previousStatus?: string): Promise; /** * A permission gate or question opened (`open`) or closed on this session. * Fire-and-forget like onStatusChange. */ onPrompt(session: Pick, kind: "permission" | "question", open: boolean): Promise; private push; } //# sourceMappingURL=waitingInputNotifier.d.ts.map