/** * 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; /** * 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