import { type DiscordClient } from "./discord-client.js"; import { type GuildBlueprintRequest } from "./guild-blueprint-service.js"; import { type GuildRecoveryAttestedBinding } from "./guild-recovery-attestation.js"; import type { GuildCommunityAuditResult } from "./guild-community-service.js"; import type { ScopePolicy } from "./policy.js"; import { type NormalizedDiscordRole } from "./role-administration-service.js"; import type { DiscordChannel, RequestOptions } from "./types.js"; export type GuildBlueprintCaptureStatus = "blocked" | "changed-during-capture" | "ready" | "review-required"; export type GuildBlueprintCaptureFindingCode = "AUTOMOD_UNKNOWN_EVIDENCE" | "BLUEPRINT_RESOURCE_LIMIT" | "BLUEPRINT_VALIDATION_FAILED" | "CAPTURE_CHANGED" | "CHANNEL_AMBIGUOUS_NAME" | "CHANNEL_FORUM_CONFIGURATION_OMITTED" | "CHANNEL_ORDER_OMITTED" | "CHANNEL_PARENT_OMITTED" | "CHANNEL_PERMISSION_OVERWRITES_OMITTED" | "CHANNEL_UNREPRESENTABLE" | "CHANNEL_UNSUPPORTED_TYPE" | "CHANNEL_UNKNOWN_EVIDENCE" | "COMMUNITY_EVIDENCE_OMITTED" | "CHANNEL_REFERENCE_UNRESOLVED" | "EXACT_CHANNEL_REFERENCE_RETAINED" | "EXACT_ROLE_REFERENCE_RETAINED" | "ONBOARDING_UNKNOWN_EVIDENCE" | "ONBOARDING_UNKNOWN_ENUM" | "ROLE_ADMINISTRATOR_OMITTED" | "ROLE_AMBIGUOUS_NAME" | "ROLE_COSMETICS_OMITTED" | "ROLE_MANAGED_OMITTED" | "ROLE_ORDER_OMITTED" | "ROLE_UNREPRESENTABLE" | "ROLE_REFERENCE_UNRESOLVED" | "ROLE_UNKNOWN_EVIDENCE" | "ROLE_UNKNOWN_PERMISSION_BITS" | "SCAFFOLD_BELOW_MINIMUM" | "SETTINGS_UNKNOWN_ENUM" | "SETTINGS_UNKNOWN_SYSTEM_FLAGS" | "WELCOME_SCREEN_UNAVAILABLE" | "WELCOME_SCREEN_UNKNOWN_EVIDENCE"; export interface GuildBlueprintCaptureFinding { code: GuildBlueprintCaptureFindingCode; message: string; resourceId: string | null; resourceType: "auto-moderation" | "capture" | "channel" | "community" | "role"; } export interface GuildBlueprintCaptureRequest { auditReason: string; guildId: string; operationKey: string; } export interface NormalizedGuildBlueprintCaptureRequest extends GuildBlueprintCaptureRequest { operationKeyHash: string; } export interface GuildBlueprintCaptureCoverage { autoModerationRules: { captured: number; returned: number; visibility: "connector-visible"; }; channels: { captured: number; returned: number; visibility: "discord-and-policy-bounded"; }; community: { captured: boolean; evidence: "complete" | "incomplete" | "unavailable"; liveEnabled: boolean | null; }; domains: readonly [ "structure", "profile", "settings", "community", "welcome-screen", "onboarding", "auto-moderation" ]; exactChannelReferences: number; exactRoleReferences: number; roles: { captured: number; returned: number; }; } export interface GuildBlueprintCapturePrivacy { activityPersistence: "none"; attachments: "not-read"; autoModerationExecutionEvents: "not-read"; components: "not-read"; memberProfiles: "connector-bot-identity-only"; messageContent: "not-read"; rawPayloads: "omitted"; recoveryAttestations: "transient-process-bound"; returnedText: "transient-caller-retained"; serverPersistence: "none"; webhooks: "not-read"; } export interface GuildBlueprintCaptureLimitations { atomicSnapshot: false; completeBackup: false; crossGuildPortable: false; messageRecovery: false; originalIdRestoration: false; rollback: false; } interface GuildBlueprintCaptureBaseResult { applicationId: string; botId: string; captureWindow: { completedAt: string; passes: 2; startedAt: string; stable: boolean; }; guildId: string; limitations: GuildBlueprintCaptureLimitations; operationKeyHash: string; privacy: GuildBlueprintCapturePrivacy; schemaVersion: number; freshPlanRequired: true; status: GuildBlueprintCaptureStatus; } export interface GuildBlueprintCaptureChangedResult extends GuildBlueprintCaptureBaseResult { blockers: readonly [GuildBlueprintCaptureFinding]; blueprint: null; captureDigest: null; coverage: null; omissions: readonly []; recoveryBindings: GuildRecoveryAttestedBinding[]; nextAction: "retry-capture"; plannerReady: false; status: "changed-during-capture"; } export interface GuildBlueprintCaptureBlockedResult extends GuildBlueprintCaptureBaseResult { blockers: GuildBlueprintCaptureFinding[]; blueprint: null; captureDigest: null; coverage: GuildBlueprintCaptureCoverage; omissions: GuildBlueprintCaptureFinding[]; recoveryBindings: GuildRecoveryAttestedBinding[]; nextAction: "resolve-blockers-and-recapture"; plannerReady: false; status: "blocked"; } export interface GuildBlueprintCaptureReadyResult extends GuildBlueprintCaptureBaseResult { blockers: readonly []; blueprint: GuildBlueprintRequest; captureDigest: string; coverage: GuildBlueprintCaptureCoverage; omissions: GuildBlueprintCaptureFinding[]; recoveryBindings: GuildRecoveryAttestedBinding[]; nextAction: "retain-blueprint-and-plan" | "review-or-edit-omissions-before-plan"; plannerReady: true; status: "ready" | "review-required"; } export type GuildBlueprintCaptureResult = GuildBlueprintCaptureBlockedResult | GuildBlueprintCaptureChangedResult | GuildBlueprintCaptureReadyResult; export interface GuildBlueprintCaptureServiceOptions { client: Pick; clock?: () => Date; community: { get(applicationId: string, botId: string, guildId: string, options?: RequestOptions): Promise; }; policy: ScopePolicy; recoveryAttestationKey?: Uint8Array; } export declare function normalizeGuildBlueprintCaptureRequest(request: GuildBlueprintCaptureRequest): NormalizedGuildBlueprintCaptureRequest; export declare function guildBlueprintChannelRecoveryStateDigest(channel: DiscordChannel): string; export declare function guildBlueprintRoleRecoveryStateDigest(role: NormalizedDiscordRole): string; export declare class GuildBlueprintCaptureService { #private; constructor(options: GuildBlueprintCaptureServiceOptions); assertCaptureAllowed(request: GuildBlueprintCaptureRequest): void; capture(applicationId: string, botId: string, request: GuildBlueprintCaptureRequest, options?: RequestOptions): Promise; } export {}; //# sourceMappingURL=guild-blueprint-capture-service.d.ts.map