/** * `SourceSelector` — owns the runtime demotion/re-promotion state for the * doorbell's wake source (Q3=D policy). Emits exactly one FR-006 `source=…` * stderr line per transition. * * Contract: `specs/978-summary-generacy-cockpit/contracts/source-selector.md`. */ export type SourceMode = 'smee-attempt' | 'smee-active' | 'poll-fallback'; export type SourceReason = 'startup-no-channel' | 'startup-smee-selected' | 'startup-smee-failed' | 'smee-runtime-lost' | 'smee-re-promoted'; export interface SourceSelectorOptions { initial: 'smee-attempt' | 'poll-fallback'; stderr: { write(chunk: string): boolean | void; }; logger?: { warn: (msg: string) => void; info?: (msg: string) => void; }; demoteAfterConsecutiveFailures?: number; demoteAfterMsWithoutSuccess?: number; rePromoteIntervalMs?: number; now?: () => number; } export type ModeChangeCallback = (next: SourceMode, reason: SourceReason) => void; export declare const DEFAULT_DEMOTE_AFTER_FAILURES = 5; export declare const DEFAULT_DEMOTE_AFTER_MS_WITHOUT_SUCCESS = 90000; export declare const DEFAULT_RE_PROMOTE_INTERVAL_MS = 300000; export declare class SourceSelector { private _current; private consecutiveReconnectFailures; private lastSuccessfulConnectAt; private demotedAt; private rePromoteTimer; private elapsedTicker; private modeChangeCbs; private stopped; private readonly initialWasSmee; private readonly demoteAfterFailures; private readonly demoteAfterMsWithoutSuccess; private readonly rePromoteIntervalMs; private readonly now; private readonly stderr; private readonly logger?; private pendingRePromoteEmit; constructor(options: SourceSelectorOptions); get currentSource(): SourceMode; onModeChange(cb: ModeChangeCallback): void; onReconnectAttempt(failedAttempts: number): void; onReconnectSuccess(): void; /** Refresh liveness on inbound SSE bytes (keepalive comments or payloads). */ onSseBytes(): void; /** Startup `startSmeeMode` returned `transient-fail`: transition to the live * poll-fallback bridge so `rePromoteTimer` arms and stdout keeps flowing. */ markStartupSmeeFailed(): void; observeElapsed(): void; stop(): void; private transition; private tickRePromote; private writeLine; } //# sourceMappingURL=source-selector.d.ts.map