export interface ClientAdminRow { accountId: string; /** Empty/undefined ⇒ absent. Set-but-not-live ⇒ dangling. */ managingAdminUserId?: string; } export interface AccountAdminCensus { total: number; assigned: number; absent: number; dangling: number; absentIds: string[]; danglingIds: string[]; } /** Pure reconcile: classify each client account against the live house admin * set. A row with no managingAdminUserId is `absent`; a row whose id is not in * `liveHouseAdminUserIds` is `dangling`; otherwise `assigned`. Deterministic * and IO-free so the boundaries are unit-testable. */ export declare function reconcileAccountAdminCensus(clients: ClientAdminRow[], liveHouseAdminUserIds: string[]): AccountAdminCensus; /** The census line. Offender ids are logged in full (not truncated) so each * correlates directly with an account dir; `-` marks an empty list so every * field is present and greppable. Healthy: `absent=0 dangling=0`. */ export declare function formatCensusLine(c: AccountAdminCensus): string; export interface AccountAdminCensusDeps { accountsRoot: string; logger: (line: string) => void; } /** Run one census pass and log a single line. Filesystem-only and best-effort: * an unreadable accounts root yields `total=0` rather than throwing. */ export declare function emitAccountAdminCensus(deps: AccountAdminCensusDeps): void; export interface AccountAdminCensusAudit { start(): void; stop(): void; } /** Standing periodic census. Unref'd interval so it never holds the process * open; each tick re-emits best-effort. */ export declare function createAccountAdminCensus(deps: AccountAdminCensusDeps & { intervalMs: number; }): AccountAdminCensusAudit; //# sourceMappingURL=account-admin-census.d.ts.map