export interface DaemonInfo {
    larkAppId: string;
    botName: string;
    /** Lark app avatar URL (from /bot/v3/info); absent until the open_id probe lands. */
    botAvatarUrl?: string;
    botIndex: number;
    ipcPort: number;
    pid: number;
    startedAt: number;
    lastHeartbeat: number;
    /**
     * open_ids of users the bot's allowedUsers list was resolved to (post-email
     * resolution). Used by dashboard's "Create new group" flow to pick a creator
     * bot whose scope contains the operator. Emails are stripped — only resolved
     * open_ids appear here. May be empty for bots with no allowlist configured.
     */
    resolvedAllowedUsers?: string[];
}
export type RegistryListener = (online: DaemonInfo[]) => void;
export interface DaemonRegistryOptions {
    refreshIntervalMs?: number;
}
/**
 * Watches the dashboard-daemons descriptor directory and exposes the
 * currently-online daemons (filtered by 90s heartbeat staleness).
 */
export declare class DaemonRegistry {
    private dir;
    private items;
    private listeners;
    private watcher?;
    private poller?;
    private refreshIntervalMs;
    constructor(dir: string, options?: DaemonRegistryOptions);
    start(): Promise<void>;
    stop(): void;
    list(): DaemonInfo[];
    getByAppId(id: string): DaemonInfo | undefined;
    on(fn: RegistryListener): () => void;
    private refresh;
}
//# sourceMappingURL=registry.d.ts.map