/**
 * Sync Executor
 *
 * Applies content changes to the CMS based on a calculated diff.
 * Supports dry-run mode and progress reporting.
 */
import type { ManagementClient } from '../../client/management/types';
import type { LocalContent, LocalFooterContent } from '../content/reader';
import type { OutputContext } from '../output';
import type { ContentDiff, FooterDiff } from './diff';
import type { BlockFieldExtensionsMap } from '../../config/types';
/**
 * Format API errors with detailed field validation info when available.
 */
export declare function formatApiError(error: unknown): string;
export interface SyncOptions {
    /** If true, don't actually make changes */
    dryRun: boolean;
    /** Custom block field extensions from config (for validation) */
    blockFieldExtensions?: BlockFieldExtensionsMap;
}
export interface SyncResult {
    entries: {
        created: number;
        updated: number;
        deleted: number;
        failed: number;
        published: number;
        unpublished: number;
    };
    pages: {
        created: number;
        updated: number;
        failed: number;
        published: number;
        unpublished: number;
    };
    blocks: {
        created: number;
        updated: number;
        deleted: number;
        failed: number;
    };
    navigation: {
        created: number;
        updated: number;
        failed: number;
    };
    settings: {
        updated: number;
        failed: number;
    };
    forms: {
        created: number;
        updated: number;
        failed: number;
    };
    footer: {
        updated: number;
        failed: number;
    };
    errors: Array<{
        resource: string;
        identifier: string;
        error: string;
    }>;
    warnings: string[];
}
export interface FooterSyncResult {
    diff: FooterDiff | null;
    synced: boolean;
    error?: string;
}
/**
 * Sync footer content from local to CMS.
 *
 * Footer is synced separately from other content because:
 * - It's a single entity (not a collection)
 * - It requires pulling remote state first for comparison
 *
 * @param client - Management client
 * @param localFooter - Local footer content from footer.json
 * @param options - Sync options (dryRun)
 * @returns Footer sync result with diff and status
 */
export declare function syncFooter(client: ManagementClient, localFooter: LocalFooterContent, options: SyncOptions): Promise<FooterSyncResult>;
/**
 * Execute a sync plan based on calculated diff.
 *
 * @param client - Management client
 * @param diff - Calculated content diff
 * @param local - Local content
 * @param options - Sync options (dryRun)
 * @param output - Output context for progress reporting
 * @returns Sync result with counts and errors
 */
export declare function executeSyncPlan(client: ManagementClient, diff: ContentDiff, local: LocalContent, options: SyncOptions, output: OutputContext): Promise<SyncResult>;
/**
 * Format sync result for display.
 */
export declare function formatSyncResult(result: SyncResult, dryRun: boolean): string;
