import type { ActivityStore } from "./activity-log.js"; import { type DiscordClient } from "./discord-client.js"; import { type OperationStore } from "./operation-store.js"; import { type DiscordPermissionName } from "./permissions.js"; import type { ScopePolicy } from "./policy.js"; import { type NormalizedDiscordRole } from "./role-administration-service.js"; import { type RoleIconFileReview } from "./role-icon-file.js"; import type { RequestOptions } from "./types.js"; export declare const ROLE_CONFIGURATION_REQUEST_FIELDS: readonly ["grantPermissions", "hoist", "mentionable", "name", "permissions", "primaryColor", "revokePermissions", "roleIcon", "secondaryColor", "tertiaryColor"]; export type RoleConfigurationRequestField = typeof ROLE_CONFIGURATION_REQUEST_FIELDS[number]; export declare const ROLE_CONFIGURATION_CHANGED_FIELDS: readonly ["colors", "hoist", "mentionable", "name", "permissions", "roleIcon"]; export type RoleConfigurationChangedField = typeof ROLE_CONFIGURATION_CHANGED_FIELDS[number]; export declare const ROLE_HOLOGRAPHIC_COLORS: Readonly<{ primaryColor: 11127295; secondaryColor: 16759788; tertiaryColor: 16761760; }>; export interface RoleConfigurationRequest { auditReason: string; grantPermissions?: readonly DiscordPermissionName[]; guildId: string; hoist?: boolean; mentionable?: boolean; name?: string; operationKey: string; permissions?: readonly DiscordPermissionName[]; primaryColor?: number; revokePermissions?: readonly DiscordPermissionName[]; roleIcon?: RoleConfigurationIconRequest; roleId: string; secondaryColor?: number | null; tertiaryColor?: number | null; } export type RoleConfigurationIconRequest = { kind: "clear"; } | { filePath: string; kind: "local-image"; } | { kind: "unicode"; value: string; }; export type RoleConfigurationObservedIcon = { kind: "image"; imageHash: string; } | { kind: "none"; } | { kind: "unicode"; value: string; }; export type RoleConfigurationDesiredIcon = RoleConfigurationObservedIcon | { contentDigest: string; kind: "local-image"; }; export interface NormalizedRoleConfigurationRequest extends RoleConfigurationRequest { grantPermissions: DiscordPermissionName[]; operationKeyHash: string; permissions?: DiscordPermissionName[]; requestedFields: RoleConfigurationRequestField[]; revokePermissions: DiscordPermissionName[]; } export interface RoleConfigurationChange { after: unknown; before: unknown; field: RoleConfigurationChangedField; } export interface RoleConfigurationPermissionEvidence { botAdministrator: boolean; botEffectivePermissionNames: DiscordPermissionName[]; botEffectivePermissions: string; botHighestRoleIds: string[]; botHighestRolePosition: number; botRoleIds: string[]; desiredPermissionSubset: boolean; guildManageRoles: true; permissionChangeRequired: boolean; postChangeBotEffectivePermissionNames: DiscordPermissionName[]; postChangeBotEffectivePermissions: string; postChangeGuildManageRoles: true; targetBelowBot: true; targetHeldByBot: boolean; } export interface RoleConfigurationPlan { applicationId: string; auditReason: string; botId: string; changedFields: RoleConfigurationChangedField[]; changes: RoleConfigurationChange[]; createdAt: string; current: NormalizedDiscordRole; currentRoleIcon: RoleConfigurationObservedIcon; desired: NormalizedDiscordRole; desiredRoleIcon: RoleConfigurationDesiredIcon; digest: string; grantedPermissions: DiscordPermissionName[]; guild: { features: string[]; id: string; name: string; ownerId: string; }; highRiskGrantedPermissions: DiscordPermissionName[]; highRiskRevokedPermissions: DiscordPermissionName[]; memberCount: number; nameCollisionRoleIds: string[]; operationKeyHash: string; permission: RoleConfigurationPermissionEvidence; privacy: { memberIdentities: "not-fetched"; persistence: "content-free-only"; rawPayloads: "omitted"; text: "transient"; }; roleIconFile: { contentDigest: string; review: RoleIconFileReview; } | null; requestedFields: RoleConfigurationRequestField[]; requestedGrantPermissions: DiscordPermissionName[]; requestedPermissions: DiscordPermissionName[] | null; requestedRevokePermissions: DiscordPermissionName[]; revokedPermissions: DiscordPermissionName[]; risks: string[]; roleId: string; schemaVersion: number; status: "already-current" | "planned"; warnings: string[]; verificationMode: "exact" | "response-bound-image-hash"; writeRequired: boolean; } export interface RoleConfigurationResult { activityId: string | null; guildId: string; inventoryMatched: boolean; memberCount: number; memberCountsMatched: boolean; observed: NormalizedDiscordRole; operationKeyHash: string; planDigest: string; readbackMatched: boolean; responseMatched: boolean; roleId: string; schemaVersion: number; status: "already-current" | "completed" | "completed-with-drift"; verification: "drift" | "match" | "not-required"; } export interface RoleConfigurationServiceClient extends Pick { } export interface RoleConfigurationServiceOptions { activityStore: ActivityStore; client: RoleConfigurationServiceClient; clock?: () => Date; fileRoots: readonly string[]; operationStore: OperationStore; planKey?: Uint8Array; policy: Pick; randomId?: () => string; } export declare function normalizeRoleConfigurationRequest(request: RoleConfigurationRequest): NormalizedRoleConfigurationRequest; export declare class RoleConfigurationService { #private; constructor(options: RoleConfigurationServiceOptions); plan(applicationId: string, botId: string, request: RoleConfigurationRequest, options?: RequestOptions): Promise; reconcilePlan(applicationId: string, botId: string, request: RoleConfigurationRequest, options?: RequestOptions): Promise; execute(applicationId: string, botId: string, request: RoleConfigurationRequest, expectedDigest: string, options?: RequestOptions): Promise; } //# sourceMappingURL=role-configuration-service.d.ts.map