/** * One background poller per key, shared by every subscriber. * * The app's daemon runs one session per window, and each window used to poll * its repo on its own: git status every 5s, GitHub issue/PR counts every 60s, * CI every 15–60s. Two windows on the same repo did all of it twice. Here the * first subscriber for a key starts the poller, later ones join it (and get * the last value at once), and the last one to leave stops it. */ /** A running poller: `refresh` asks for a check now, `stop` ends it for good. */ export interface Poller { refresh(): void | Promise; stop(): void; } export interface SharedSubscription { /** Check now (e.g. after an agent run). Shared: one check serves every subscriber. */ refresh(): void; /** Leave. The poller stops when its last subscriber leaves. */ unsubscribe(): void; } export interface SharedPolls { subscribe(key: string, listener: (value: T) => void): SharedSubscription; /** Number of running pollers. */ size(): number; } export declare function createSharedPolls(start: (key: string, publish: (value: T) => void) => Poller): SharedPolls; /** * Fixed-cadence poller: first check after `firstDelayMs`, then every * `intervalMs` after the previous check settles. `fetch` returning null (or * throwing) publishes nothing, so subscribers keep their last-known value. */ export declare function startIntervalPoll(opts: { fetch: () => Promise; publish: (value: T) => void; firstDelayMs: number; intervalMs: number; }): Poller;