// engine/local-first/sync-generator.ts — SPEC-047
// Generates sync protocol acceptance criteria for create_spec HU.md content.
/** Base sync protocol criteria applicable to all sync architectures. */
function getBaseSyncCriteria() {
    return [
        {
            title: 'Differential Sync',
            body: 'La sincronización envía solo las operaciones pendientes (no el documento completo) — bandwidth reducido en 90% vs estado completo en documentos con ediciones incrementales',
        },
        {
            title: 'Reconnection with Exponential Backoff',
            body: 'El protocolo soporta reconnection automática con exponential backoff — el cliente reintenta con delays de 1s, 2s, 4s, 8s hasta 60s máximo',
        },
        {
            title: 'Relay Mode (stateless server)',
            body: 'El servidor puede recibir cambios de múltiples clientes y retransmitir a otros clientes sin state completo (relay mode) — el estado autoritativo vive en los clientes',
        },
    ];
}
/** Security criteria for sync backends. */
function getSecurityCriteria() {
    return [
        {
            title: 'Authentication & Authorization',
            body: 'El servidor valida que el usuario tiene permisos sobre el documento antes de retransmitir cambios — un usuario no puede enviar operaciones de otro usuario',
        },
        {
            title: 'TLS in Transit',
            body: 'Los cambios en tránsito van sobre WebSocket con TLS (wss://) — sin excepciones para ningún entorno de producción',
        },
        {
            title: 'No Server Timestamp for Conflict Resolution',
            body: 'No se usa timestamp del servidor como fuente de verdad para conflictos — se usan CRDTs o vector clocks',
        },
    ];
}
/** Additional criteria for hosted/cloud sync backends. */
function getHostedBackendCriteria(syncBackend) {
    if (syncBackend === 'liveblocks') {
        return [
            {
                title: 'Liveblocks Room Authorization',
                body: 'Cada room de Liveblocks tiene una función de autorización que verifica el token JWT del usuario antes de permitir el acceso',
            },
        ];
    }
    if (syncBackend === 'electric-sql' || syncBackend === 'powersync') {
        return [
            {
                title: 'Partial Replication Rules',
                body: 'Las reglas de replicación parcial están definidas — un cliente solo descarga los documentos que tiene permiso de ver, no toda la base de datos',
            },
        ];
    }
    return [];
}
/** Format sync criteria as HU.md lines. */
export function formatSyncCriteriaAsLines(criteria) {
    const lines = ['', '## Sync Protocol', ''];
    for (const c of criteria) {
        lines.push(`- [ ] **${c.title}**: ${c.body}`);
    }
    lines.push('');
    return lines;
}
/**
 * Generate sync protocol criteria for a project.
 * Includes base differential sync, reconnection, and security criteria.
 */
export function generateSyncCriteria(syncBackend) {
    return [
        ...getBaseSyncCriteria(),
        ...getSecurityCriteria(),
        ...getHostedBackendCriteria(syncBackend),
    ];
}
//# sourceMappingURL=sync-generator.js.map