import type { ActivityStore } from "./activity-log.js"; import { type BotProfileImageFileReview } from "./bot-profile-file.js"; import type { DiscordClient } from "./discord-client.js"; import { type OperationStore } from "./operation-store.js"; import type { ScopePolicy } from "./policy.js"; import type { RequestOptions } from "./types.js"; export declare const BOT_PROFILE_FIELDS: readonly ["avatar", "banner", "username"]; export type BotProfileField = typeof BOT_PROFILE_FIELDS[number]; export type BotProfileImageChange = { action: "clear"; } | { action: "set"; filePath: string; }; export interface BotProfileChangeRequest { acknowledgeApplicationWideChange: true; avatar?: BotProfileImageChange; banner?: BotProfileImageChange; operationKey: string; reviewReason: string; username?: string; } export interface NormalizedBotProfileChangeRequest { acknowledgeApplicationWideChange: true; avatar?: BotProfileImageChange; banner?: BotProfileImageChange; operationKeyHash: string; reviewReason: string; username?: string; } export interface BotProfileImageState { animated: boolean; present: boolean; } export interface BotProfilePresentation { avatar: BotProfileImageState; banner: BotProfileImageState; username: string; } export interface BotProfileAuditResult { applicationId: string; botId: string; privacy: BotProfilePrivacyProjection; profile: BotProfilePresentation; responseUnknownFieldCount: number; schemaVersion: number; status: "ok"; } export type BotProfilePlanFileReview = Omit; export interface BotProfilePlanFile { contentDigest: string; review: BotProfilePlanFileReview; } export interface BotProfilePrivacyProjection { omittedFields: readonly [ "application-payload", "avatar-hash", "banner-hash", "file-paths", "image-bytes", "raw-operation-key", "raw-user-payload" ]; persistence: "content-free-records-only"; } export interface BotProfileChangePlan { applicationId: string; botId: string; changedFields: BotProfileField[]; createdAt: string; current: BotProfilePresentation; desired: BotProfilePresentation; digest: string; effect: "change" | "none"; files: { avatar: BotProfilePlanFile | null; banner: BotProfilePlanFile | null; }; operationKeyHash: string; privacy: BotProfilePrivacyProjection; requestedFields: BotProfileField[]; responseUnknownFieldCount: number; reviewReason: string; risks: string[]; schemaVersion: number; status: "already-current" | "planned"; verification: { applicationIdentity: "exact"; imageByteEquality: "not-observable"; mutationResponse: "strict-current-bot-profile"; readback: "independent-exact-editable-state"; }; warnings: string[]; writeRequired: boolean; } export interface BotProfileChangeResult { activityId: string | null; applicationId: string; botId: string; changedFields: BotProfileField[]; observed: BotProfilePresentation; operationKeyHash: string; planDigest: string; schemaVersion: number; status: "already-current" | "completed"; } export interface BotProfileServiceClient { getCurrentApplication: DiscordClient["getCurrentApplication"]; getCurrentBotProfile: DiscordClient["getCurrentBotProfile"]; modifyCurrentBotProfile: DiscordClient["modifyCurrentBotProfile"]; } export interface BotProfileServiceOptions { activityStore: ActivityStore; client: BotProfileServiceClient; clock?: () => Date; fileRoots: readonly string[]; operationStore: OperationStore; planKey?: Uint8Array; policy: Pick; randomId?: () => string; } export declare function normalizeBotProfileChangeRequest(request: BotProfileChangeRequest): NormalizedBotProfileChangeRequest; export declare class BotProfileService { #private; constructor(options: BotProfileServiceOptions); get(applicationId: string, botId: string, options?: RequestOptions): Promise; plan(applicationId: string, botId: string, request: BotProfileChangeRequest, options?: RequestOptions): Promise; execute(applicationId: string, botId: string, request: BotProfileChangeRequest, expectedDigest: string, options?: RequestOptions): Promise; } //# sourceMappingURL=bot-profile-service.d.ts.map