export interface TeamRosterBot {
    larkAppId: string;
    name: string;
    cliId: string;
    capability: string | null;
    hasTeamRole: boolean;
    /** Owner for grouping by person; null if unassigned. unionId is the key, name for display. */
    owner: {
        unionId?: string;
        openId?: string;
        name?: string;
    } | null;
}
export interface TeamRoster {
    team: {
        id: string;
        name: string;
        memberCount: number;
    };
    bots: TeamRosterBot[];
}
/** A currently-running bot from the live daemon registry (authoritative for
 *  "what's running" — unlike bots-info.json which is a racy, probe-lagged file). */
export interface LiveBot {
    larkAppId: string;
    botName?: string | null;
    cliId?: string;
}
/**
 * @param configOrder optional list of larkAppIds in bots.json (config) order;
 *   when given, the roster is sorted to match it (and the personal dashboard).
 * @param liveBots optional live daemon-registry bots. When given, the roster's
 *   bot set is THESE (authoritative — fixes an empty/stale bots-info.json
 *   showing no bots even though daemons are running), enriched with cliId from
 *   bots-info.json by larkAppId. When omitted, falls back to bots-info.json.
 */
export declare function buildTeamRoster(dataDir: string, teamId?: string, configOrder?: string[], liveBots?: LiveBot[]): TeamRoster;
//# sourceMappingURL=team-roster.d.ts.map