import type { IEmailDomainConfig } from '@push.rocks/smartmta'; import { EmailDomainDoc } from '../db/documents/classes.email-domain.doc.js'; import type { IEmailDomain, IEmailDnsRecord, IEmailDomainRemoteIngress, IEmailDomainOperationError, TEmailDomainLifecycleStatus } from '../../dist_ts_interfaces/data/email-domain.js'; export interface IEmailDomainManagerActionResult { success: boolean; message?: string; lifecycleStatus?: TEmailDomainLifecycleStatus; code?: string; errors?: IEmailDomainOperationError[]; retryAt?: string; capability?: 'supported' | 'unsupported'; domain?: IEmailDomain; records?: IEmailDnsRecord[]; provisioned?: number; } export interface IManagedDkimRepairResult { repairedDomainIds: string[]; repairedConfiguredDomains: string[]; failedConfiguredDomains: string[]; failedDomainIds: string[]; } /** * Persists managed email domains and projects them into SmartMTA. DNS mutation * is delegated exclusively to MailDnsSync. */ export declare class EmailDomainManager { private dcRouter; private baseEmailDomains; private failedBaseDkimDomainNames; private mutationChain; /** Explicit upstream capability marker; absence is deliberately fail-closed. */ private get selectorCorrectSigningCapability(); constructor(dcRouterRef: any); setBaseEmailDomains(domains: IEmailDomainConfig[] | undefined): void; private get dkimCreator(); start(): Promise; stop(): Promise; supportsSelectorCorrectSigning(): boolean; private runMutationExclusive; getAll(): Promise; getById(id: string): Promise; getByDomain(domainName: string): Promise; ensureEmailDomainForDomainName(domainName: string): Promise; createEmailDomain(opts: { linkedDomainId: string; subdomain?: string; dkimSelector?: string; dkimKeySize?: number; rotateKeys?: boolean; rotationIntervalDays?: number; remoteIngress?: IEmailDomainRemoteIngress; }): Promise; updateEmailDomain(id: string, changes: { rotateKeys?: boolean; rotationIntervalDays?: number; rateLimits?: IEmailDomain['rateLimits']; remoteIngress?: IEmailDomainRemoteIngress | null; }): Promise; deleteEmailDomain(id: string): Promise; getRequiredDnsRecords(id: string): Promise; provisionDnsRecords(id: string): Promise; validateDns(id: string): Promise; getOutboundReadiness(domainName: string): Promise<{ ready: boolean; reason?: string; edgeIds: string[]; selector?: string; }>; /** * Caller-owned repair for legacy managed domains. SmartMTA remains in * validation-only mode; dcrouter explicitly owns any required key creation. */ repairManagedDkimBeforeEmailStart(): Promise; /** Retry a previously failed managed-domain repair when its bounded retry is due. */ repairManagedDkimIfDue(id: string, now?: number): Promise; private repairManagedDkimDocument; private ensureValidatedDkimMaterial; requestDkimRotation(id: string): Promise; /** Called by the reconciler before planning so scheduled external rotation is durable first. */ stageDkimRotationIfDue(id: string): Promise; private stageDkimRotation; private normalizeRemoteIngressPin; private normalizeRotationIntervalDays; private extractDkimPublicKey; private getActiveDkim; private invalidateReconciliation; private invalidateDkimReconciliation; private capabilityError; private unsupportedResult; private hasDnsMutationFailure; private resultForDoc; private docToInterface; private isDomainAlreadyConfigured; private findLinkedDnsDomain; private buildManagedDomainConfigs; syncManagedDomainsToRuntime(optionsArg?: { excludeDkimRepairFailures?: boolean; }): Promise; private hasDkimRepairFailure; }