export type ProjectUser = {
    id: string;
    email: string;
    name: string;
    permissionLevel: string;
    roleId: string | null;
    role: string | null;
    teams: string[];
};
export default class UserManager {
    private readonly config;
    private readonly authenticator;
    private readonly env;
    private readonly logger;
    constructor(config: {
        projectId: number | string;
    });
    private headers;
    listForProject(): Promise<ProjectUser[]>;
    /** Raw project-users list (one call, no enrichment). Failures surface to the caller. */
    private requestUsers;
    private toProjectUser;
    /**
     * Resolve a project user by email for the edit path. Returns undefined when no
     * user matches; transport/API failures throw. The role/teams are read in `strict`
     * mode (never degraded): the edit reassigns the role and replaces the teams from
     * these values, so a failed read must abort the edit, not silently wipe them.
     */
    findByEmail(email: string): Promise<ProjectUser | undefined>;
    editUser(userId: string, currentPermissionLevel: string, currentRoleId: string | null, changes: {
        roleId?: string;
        teamIds?: string[];
        permissionLevel?: string;
    }): Promise<void>;
    private fetchTeams;
    private fetchRole;
}
//# sourceMappingURL=user-manager.d.ts.map