/**
 * Content Approval Service for Marketing Team templates.
 *
 * Manages the approval workflow where marketing agents submit content
 * for human review. Content can be approved/rejected via:
 *   - Slack text replies ("approve" / "reject")
 *   - REST API endpoints
 *
 * This service is designed for the marketing team use case and is
 * separate from the F27 ToolApprovalQueue (which handles tool execution).
 *
 * @module content-approval-service
 */
import { ApprovalResolution, ContentApprovalRequest, ContentApprovalStatus, SubmitForApprovalOptions } from './content-approval.types.js';
/**
 * Service managing content approval requests for marketing teams.
 *
 * Follows singleton pattern. Stores approvals in memory with optional
 * Slack message tracking for interactive approval via text replies.
 */
export declare class ContentApprovalService {
    private static instance;
    private approvals;
    /**
     * Get or create the singleton instance.
     *
     * @returns Singleton instance
     */
    static getInstance(): ContentApprovalService;
    /**
     * Reset the singleton (for testing).
     */
    static resetInstance(): void;
    /**
     * Submit content for approval.
     *
     * @param options - Content submission details
     * @returns Created approval request
     * @throws Error if team has too many pending approvals
     */
    submit(options: SubmitForApprovalOptions): ContentApprovalRequest;
    /**
     * Approve a content request.
     *
     * @param approvalId - ID of the approval request
     * @param resolvedBy - Who approved (user ID or identifier)
     * @param feedback - Optional feedback or notes
     * @returns Updated approval request or null if not found
     */
    approve(approvalId: string, resolvedBy: string, feedback?: string): ContentApprovalRequest | null;
    /**
     * Reject a content request.
     *
     * @param approvalId - ID of the approval request
     * @param resolvedBy - Who rejected
     * @param feedback - Reason for rejection or edit instructions
     * @returns Updated approval request or null if not found
     */
    reject(approvalId: string, resolvedBy: string, feedback?: string): ContentApprovalRequest | null;
    /**
     * Resolve an approval request (approve or reject).
     *
     * @param resolution - Resolution details
     * @returns Updated request or null
     */
    resolve(resolution: ApprovalResolution): ContentApprovalRequest | null;
    /**
     * Get a specific approval request.
     *
     * @param approvalId - Approval ID
     * @returns The request or null
     */
    get(approvalId: string): ContentApprovalRequest | null;
    /**
     * Get all pending approvals for a team.
     *
     * @param teamId - Team ID
     * @returns Array of pending approval requests
     */
    getPendingByTeam(teamId: string): ContentApprovalRequest[];
    /**
     * Get all approvals for a team (all statuses).
     *
     * @param teamId - Team ID
     * @returns Array of all approval requests
     */
    getAllByTeam(teamId: string): ContentApprovalRequest[];
    /**
     * Get approval by Slack message timestamp (for Slack reply-based approval).
     *
     * @param channelId - Slack channel ID
     * @param messageTs - Slack message timestamp
     * @returns Matching approval request or null
     */
    getBySlackMessage(channelId: string, messageTs: string): ContentApprovalRequest | null;
    /**
     * Link a Slack message to an approval request (for tracking replies).
     *
     * @param approvalId - Approval ID
     * @param channelId - Slack channel where the approval message was posted
     * @param messageTs - Slack message timestamp
     * @returns Updated request or null
     */
    linkSlackMessage(approvalId: string, channelId: string, messageTs: string): ContentApprovalRequest | null;
    /**
     * Get counts by status for a team.
     *
     * @param teamId - Team ID
     * @returns Object with status counts
     */
    getStats(teamId: string): Record<ContentApprovalStatus, number>;
    /**
     * Format an approval request as a Slack message (plain text for MVP).
     *
     * @param request - The approval request to format
     * @returns Formatted message string ready for Slack
     */
    formatForSlack(request: ContentApprovalRequest): string;
    /**
     * Expire old pending approvals past the TTL.
     */
    private expireOldApprovals;
}
//# sourceMappingURL=content-approval.service.d.ts.map