import type { ActivityStore } from "./activity-log.js"; import { type AttachmentFileReview } from "./attachment-file.js"; import { type ComponentLayoutInput, type NormalizedComponentLayout } from "./component-layout.js"; import type { DiscordClient } from "./discord-client.js"; import { InteractionLimiter } from "./interaction-limiter.js"; import { type DirectMessageAction, type DirectMessageOperationReceipt, type DirectMessageReceiptStage, type OperationStore } from "./operation-store.js"; import type { ScopePolicy } from "./policy.js"; import type { RequestOptions } from "./types.js"; import { type WriteCoordinator } from "./write-coordination.js"; export type DirectMessageChangeRequest = DirectMessageDeleteRequest | DirectMessageEditRequest | DirectMessageReplyRequest | DirectMessageSendRequest; interface DirectMessageRequestBase { action: DirectMessageAction; operationKey: string; recipientId: string; reviewReason: string; } export interface DirectMessageTextBody { content: string; kind: "text"; } export interface DirectMessageComponentBody { components: readonly ComponentLayoutInput[]; kind: "components-v2"; } export interface DirectMessageAttachmentBody { content?: string; description?: string; filePath: string; filename?: string; kind: "attachment"; } export type DirectMessageBody = DirectMessageAttachmentBody | DirectMessageComponentBody | DirectMessageTextBody; export type DirectMessageEditableBody = DirectMessageComponentBody | DirectMessageTextBody; export interface DirectMessageSendRequest extends DirectMessageRequestBase { acknowledgeExpectedRecipientContact: true; action: "send"; message: DirectMessageBody; } export interface DirectMessageReplyRequest extends DirectMessageRequestBase { acknowledgeExpectedRecipientContact: true; action: "reply"; channelId: string; message: DirectMessageBody; replyToMessageId: string; } export interface DirectMessageEditRequest extends DirectMessageRequestBase { action: "edit"; channelId: string; message: DirectMessageEditableBody; messageId: string; } export interface DirectMessageDeleteRequest extends DirectMessageRequestBase { acknowledgeIrreversibleDeletion: true; action: "delete"; channelId: string; messageId: string; } export type NormalizedDirectMessageChangeRequest = NormalizedDirectMessageDeleteRequest | NormalizedDirectMessageEditRequest | NormalizedDirectMessageReplyRequest | NormalizedDirectMessageSendRequest; interface NormalizedDirectMessageRequestBase { action: DirectMessageAction; operationKeyHash: string; recipientId: string; reviewReason: string; } export interface NormalizedDirectMessageTextBody { content: string; kind: "text"; } export interface NormalizedDirectMessageComponentBody { components: NormalizedComponentLayout; kind: "components-v2"; } export interface NormalizedDirectMessageAttachmentBody { content: string | null; description: string | null; filePath: string; filename: string; kind: "attachment"; } export type NormalizedDirectMessageBody = NormalizedDirectMessageAttachmentBody | NormalizedDirectMessageComponentBody | NormalizedDirectMessageTextBody; export type NormalizedDirectMessageEditableBody = NormalizedDirectMessageComponentBody | NormalizedDirectMessageTextBody; export interface NormalizedDirectMessageSendRequest extends NormalizedDirectMessageRequestBase { acknowledgeExpectedRecipientContact: true; action: "send"; message: NormalizedDirectMessageBody; } export interface NormalizedDirectMessageReplyRequest extends NormalizedDirectMessageRequestBase { acknowledgeExpectedRecipientContact: true; action: "reply"; channelId: string; message: NormalizedDirectMessageBody; replyToMessageId: string; } export interface NormalizedDirectMessageEditRequest extends NormalizedDirectMessageRequestBase { action: "edit"; channelId: string; message: NormalizedDirectMessageEditableBody; messageId: string; } export interface NormalizedDirectMessageDeleteRequest extends NormalizedDirectMessageRequestBase { acknowledgeIrreversibleDeletion: true; action: "delete"; channelId: string; messageId: string; } export type DirectMessageType = "chat-input-command" | "context-menu-command" | "default" | "reply"; export type DirectMessagePresentation = "single-attachment" | "static-components-v2" | "text" | "unsupported-rich"; export interface DirectMessageView { attachment: { description: string | null; filename: string; id: string; sizeBytes: number; } | null; attachmentCount: number; author: "connector" | "recipient"; authorId: string; channelId: string; componentCount: number; componentLayout: NormalizedComponentLayout | null; componentPreview: string | null; content: string; editedTimestamp: string | null; embedCount: number; flags: number; id: string; mentionEveryone: boolean; mentionedRoleCount: number; mentionedUserCount: number; pinned: boolean; presentation: DirectMessagePresentation; reactionCount: number; replyToMessageId: string | null; stickerCount: number; timestamp: string; type: DirectMessageType; } export interface DirectMessagePage { channelId: string; messages: DirectMessageView[]; nextBeforeMessageId: string | null; recipientId: string; schemaVersion: number; } export interface DirectMessagePlan { action: DirectMessageAction; applicationId: string; botId: string; channel: { exactOneToOne: true; id: string; unknownFieldCount: number; } | null; createdAt: string; current: DirectMessageView | null; desired: { linkOrigins: string[]; linkUrls: string[]; message: NormalizedDirectMessageBody | null; preview: string | null; replyToMessageId: string | null; }; digest: string; effect: "change" | "none"; file: (AttachmentFileReview & { description: string | null; filename: string; maxBytes: number; }) | null; mentionPolicy: { parse: readonly []; repliedUser: false; roles: readonly []; users: readonly []; }; operationKeyHash: string; privacy: { omittedFields: readonly [ "attachment-bytes", "attachment-urls", "avatars", "generated-component-ids", "local-file-paths", "profile-names", "raw-discord-objects", "raw-operation-key" ]; persistence: "content-free-records-only"; }; rateLimit: { globalWritesPerMinute: number; minimumRecipientIntervalMs: number; }; recipient: { bot: false; eligible: true; id: string; system: false; unknownFieldCount: number; }; reviewReason: string; risks: string[]; schemaVersion: number; status: "already-current" | "planned"; warnings: string[]; writeRequired: boolean; } export type DirectMessageVerificationReason = "message-drifted" | "operation-failed" | "operation-not-found" | "operation-pending" | "operation-uncertain" | "receipt-target-mismatch" | "request-mismatch" | "verified"; export interface DirectMessageVerificationResult { action: DirectMessageAction; activityId: string | null; channelId: string | null; messageId: string | null; operationKeyHash: string; planDigest: string | null; readbackMatched: boolean; reason: DirectMessageVerificationReason; receiptStage: DirectMessageReceiptStage | null; receiptStatus: DirectMessageOperationReceipt["status"] | null; recipientId: string; requestMatched: boolean; schemaVersion: number; status: "blocked" | "drifted" | "not-found" | "verified"; timestamp: string | null; } export interface DirectMessageChangeResult { action: DirectMessageAction; activityId: string | null; channelId: string | null; messageId: string | null; operationKeyHash: string; planDigest: string; recipientId: string; recovered: boolean; schemaVersion: number; status: "already-current" | "completed"; } export interface DirectMessageServiceClient { createDirectAttachmentMessage: DiscordClient["createDirectAttachmentMessage"]; createDirectMessage: DiscordClient["createDirectMessage"]; createDirectComponentMessage: DiscordClient["createDirectComponentMessage"]; createDirectMessageChannel: DiscordClient["createDirectMessageChannel"]; deleteDirectMessage: DiscordClient["deleteDirectMessage"]; editDirectMessage: DiscordClient["editDirectMessage"]; editDirectComponentMessage: DiscordClient["editDirectComponentMessage"]; getCurrentApplication: DiscordClient["getCurrentApplication"]; getCurrentUser: DiscordClient["getCurrentUser"]; getDirectMessage: DiscordClient["getDirectMessage"]; getDirectMessageChannel: DiscordClient["getDirectMessageChannel"]; getDirectMessageUser: DiscordClient["getDirectMessageUser"]; listDirectMessages: DiscordClient["listDirectMessages"]; } export interface DirectMessageServiceOptions { activityStore: ActivityStore; attachmentMaxBytes?: number; attachmentRoots?: readonly string[]; client: DirectMessageServiceClient; clock?: () => Date; limiter?: InteractionLimiter; operationStore: OperationStore; planKey?: Uint8Array; policy: ScopePolicy; randomId?: () => string; verificationKey: Uint8Array; writeCoordinator: WriteCoordinator; } export declare function normalizeDirectMessageChangeRequest(request: DirectMessageChangeRequest): NormalizedDirectMessageChangeRequest; export declare function directMessageVerificationKey(token: string): Uint8Array; export declare function directMessageRequestDigest(key: Uint8Array, applicationId: string, botId: string, request: NormalizedDirectMessageChangeRequest): string; export declare class DirectMessageService { #private; constructor(options: DirectMessageServiceOptions); list(applicationId: string, botId: string, recipientId: string, channelId: string, options?: { beforeMessageId?: string; limit?: number; request?: RequestOptions; }): Promise; get(applicationId: string, botId: string, recipientId: string, channelId: string, messageId: string, options?: RequestOptions): Promise; plan(applicationId: string, botId: string, request: DirectMessageChangeRequest, options?: RequestOptions): Promise; verify(applicationId: string, botId: string, requestValue: DirectMessageChangeRequest, options?: RequestOptions): Promise; execute(applicationId: string, botId: string, requestValue: DirectMessageChangeRequest, expectedDigest: string, options?: RequestOptions): Promise; } export {}; //# sourceMappingURL=direct-message-service.d.ts.map