/**
 * Approval Notification Channels (W1.10 of F-NEW-PRODUCT-AGENT-VISIBILITY-CLUSTER-2026-05-12).
 *
 * Thomas directive 2026-05-12: "make sure in the UX/UI for the human in the
 * loop section we have the ability to email and/or send a text message to
 * the user for approval."
 *
 * Extends the existing approval-required pipeline (ApprovalRoute / ApprovalTicket
 * already shipped in packages/governance-server/src/approval-routing.ts) with
 * out-of-band notification fan-out: dashboard inbox (existing), email (new),
 * SMS (new). Per-reviewer channel preferences. Audit chain captures the
 * channel used.
 *
 * Transport adapters are pluggable so we can swap Resend ↔ SES ↔ SendGrid for
 * email and Twilio ↔ Vonage ↔ AWS-SNS for SMS without touching the dispatcher.
 *
 * @connexum/ai-governance  F-NEW-PRODUCT-APPROVAL-CHANNEL-EMAIL-SMS
 */
export type ApprovalChannel = 'dashboard' | 'email' | 'sms';
export interface ApprovalNotificationRecipient {
    /** Stable reviewer identity (e.g. SSO sub). */
    reviewerId: string;
    /** Display name for the notification body. */
    name: string;
    /** Email address (required when channels include 'email'). */
    email?: string;
    /** E.164 phone number (required when channels include 'sms'). */
    phoneE164?: string;
    /** Channels this reviewer wants notifications on. Defaults to ['dashboard']. */
    channels?: ApprovalChannel[];
}
export interface ApprovalNotificationContext {
    /** ApprovalTicket id (matches the existing dashboard route). */
    ticketId: string;
    /** Org / tenant that owns the ticket. */
    orgId: string;
    /** Agent attempting the action. */
    agentId: string;
    /** Tool name being gated. */
    toolName: string;
    /** Risk level annotation from the ApprovalTicket. */
    riskLevel: 'low' | 'medium' | 'high' | 'critical';
    /** Human-readable summary of the proposed action (sanitized). */
    summary: string;
    /** Approval / decision URL (signed link). */
    approveUrl: string;
    /** Deny URL (signed link). */
    denyUrl: string;
    /** ISO 8601 deadline for response before escalation. */
    slaDeadline: string;
}
export interface EmailSender {
    send(params: {
        to: string;
        subject: string;
        html: string;
        text: string;
    }): Promise<{
        ok: boolean;
        messageId?: string;
        error?: string;
    }>;
}
export interface SmsSender {
    send(params: {
        to: string;
        body: string;
    }): Promise<{
        ok: boolean;
        messageId?: string;
        error?: string;
    }>;
}
export interface NotificationOutcome {
    recipientId: string;
    channel: ApprovalChannel;
    delivered: boolean;
    providerMessageId?: string;
    error?: string;
}
export interface DispatcherOptions {
    /** Email adapter. Defaults to a NOOP that records but does not transmit. */
    emailSender?: EmailSender;
    /** SMS adapter. Defaults to a NOOP. */
    smsSender?: SmsSender;
    /** Dashboard sink — callback to enqueue an in-app notification. */
    dashboardSink?: (ctx: ApprovalNotificationContext, recipient: ApprovalNotificationRecipient) => void;
}
/**
 * Dispatcher that fans out approval notifications across the requested
 * channels. Returns one NotificationOutcome per (recipient, channel) pair.
 */
export declare class ApprovalChannelDispatcher {
    private readonly emailSender;
    private readonly smsSender;
    private readonly dashboardSink?;
    constructor(options?: DispatcherOptions);
    dispatch(ctx: ApprovalNotificationContext, recipients: ReadonlyArray<ApprovalNotificationRecipient>): Promise<NotificationOutcome[]>;
    private deliver;
}
//# sourceMappingURL=approval-notifications.d.ts.map