import type { ActivityStore } from "./activity-log.js"; import { type ThreadChangeAction } from "./constants.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 { RequestOptions } from "./types.js"; interface ThreadChangeRequestBase { action: ThreadChangeAction; auditReason: string; guildId: string; operationKey: string; threadId: string; } export type ThreadChangeRequest = ThreadChangeRequestBase & ({ action: "add-member"; userId: string; } | { action: "archive"; } | { action: "join"; } | { action: "leave"; } | { action: "lock"; } | { action: "remove-member"; userId: string; } | { action: "rename"; name: string; } | { action: "set-auto-archive-duration"; autoArchiveDuration: number; } | { action: "set-invitable"; enabled: boolean; } | { action: "set-slowmode"; rateLimitPerUser: number; } | { action: "unarchive"; } | { action: "unlock"; }); interface NormalizedThreadChangeRequestBase { action: ThreadChangeAction; auditReason: string; guildId: string; operationKeyHash: string; threadId: string; } export type NormalizedThreadChangeRequest = NormalizedThreadChangeRequestBase & ({ action: "add-member"; userId: string; } | { action: "archive"; } | { action: "join"; } | { action: "leave"; } | { action: "lock"; } | { action: "remove-member"; userId: string; } | { action: "rename"; name: string; } | { action: "set-auto-archive-duration"; autoArchiveDuration: number; } | { action: "set-invitable"; enabled: boolean; } | { action: "set-slowmode"; rateLimitPerUser: number; } | { action: "unarchive"; } | { action: "unlock"; }); export interface ThreadStateView { archived: boolean; autoArchiveDuration: number; guildId: string; id: string; invitable: boolean | null; locked: boolean; name: string; ownerId: string; parentId: string; rateLimitPerUser: number; type: "announcement" | "private" | "public"; unknownFieldCount: number; unknownMetadataFieldCount: number; } export interface ThreadMembershipView { isMember: boolean; joinedAt: string | null; unknownFieldCount: number; userId: string; } export interface ThreadGovernancePermissionEvidence { administrator: boolean; allowed: boolean; appliedRoleIds: string[]; effectivePermissionNames: DiscordPermissionName[]; effectivePermissions: string; guildOwner: boolean; missingPermissions: DiscordPermissionName[]; requestedPermissions: DiscordPermissionName[]; unknownPermissionBits: "0"; warnings: string[]; } export interface ThreadPrivacyProjection { embeddedGuildMembers: "never-requested"; enumeration: "none"; omittedFields: readonly string[]; persistence: "content-free-outcomes-only"; rawPayloadExposed: false; } export interface ThreadStateAuditResult { applicationId: string; botId: string; connectorMembership: ThreadMembershipView; guild: { id: string; name: string; ownerId: string; }; parent: { id: string; name: string; type: number; }; permission: ThreadGovernancePermissionEvidence; privacy: ThreadPrivacyProjection; schemaVersion: number; status: "ok"; thread: ThreadStateView; warnings: string[]; } export interface ThreadMembershipAuditResult extends ThreadStateAuditResult { member: { id: string; username: string; }; membership: ThreadMembershipView; targetPermission: ThreadGovernancePermissionEvidence; } export interface ThreadChangePlan extends Omit { action: ThreadChangeAction; auditReason: string; authorizationBasis: "already-current" | "connector-owner" | "manage-threads" | "member-send" | "self-membership"; createdAt: string; desired: { field: "archived" | "autoArchiveDuration" | "invitable" | "locked" | "membership" | "name" | "rateLimitPerUser"; value: boolean | number | string; }; digest: string; member: { id: string; username: string; } | null; membership: ThreadMembershipView | null; operationKeyHash: string; risks: string[]; status: "already-current" | "planned"; targetPermission: ThreadGovernancePermissionEvidence | null; warnings: string[]; writeRequired: boolean; } export type ThreadGovernanceDriftField = "archived" | "auto-archive-duration" | "invitable" | "locked" | "name" | "rate-limit-per-user"; export interface ThreadChangeResult { action: ThreadChangeAction; activityId: string | null; driftFields: ThreadGovernanceDriftField[]; guildId: string; observedMembership: ThreadMembershipView | null; observedThread: ThreadStateView; operationKeyHash: string; planDigest: string; schemaVersion: number; status: "already-current" | "completed" | "completed-with-drift"; targetUserId: string | null; threadId: string; verification: "drift" | "match" | "not-required"; } export interface ThreadGovernanceServiceOptions { activityStore: ActivityStore; client: Pick; clock?: () => Date; operationStore: OperationStore; planKey?: Uint8Array; policy: ScopePolicy; randomId?: () => string; } export declare function normalizeThreadChangeRequest(request: ThreadChangeRequest): NormalizedThreadChangeRequest; export declare function assertThreadAuditInput(guildId: string, threadId: string): void; export declare function assertThreadMembershipInput(guildId: string, threadId: string, userId: string): void; export declare class ThreadGovernanceService { #private; constructor(options: ThreadGovernanceServiceOptions); getState(applicationId: string, botId: string, guildId: string, threadId: string, options?: RequestOptions): Promise; getMembership(applicationId: string, botId: string, guildId: string, threadId: string, userId: string, options?: RequestOptions): Promise; plan(applicationId: string, botId: string, request: ThreadChangeRequest, options?: RequestOptions): Promise; execute(applicationId: string, botId: string, request: ThreadChangeRequest, expectedDigest: string, options?: RequestOptions): Promise; } export {}; //# sourceMappingURL=thread-governance-service.d.ts.map