// engine/llm-security/owasp-llm-requirements.ts — SPEC-045
// Generates OWASP LLM Top 10 criteria for specs targeting LLM projects.
/** LLM01 — Prompt Injection: always required when LLM is detected */
function buildLlm01Criteria() {
    return {
        category: 'LLM01-prompt-injection',
        criterion: 'Toda entrada de usuario procesada por el LLM pasa por validación de intención — se rechaza input que contiene patrones de jailbreak conocidos (`ignore previous instructions`, `you are now`, `roleplay as`, `disregard your`, `new persona:`) o instrucciones de sistema embebidas marcadas con delimitadores de prompt',
        rationale: 'OWASP LLM01: Prompt injection es el vector de ataque más común contra LLMs; el 49% de sistemas son vulnerables',
        testable: true,
    };
}
/** LLM02 — Insecure Output Handling: always required when LLM is detected */
function buildLlm02Criteria() {
    return {
        category: 'LLM02-insecure-output',
        criterion: 'La salida del LLM nunca se inyecta directamente en queries SQL, comandos shell, evaluaciones de expresiones o HTML renderizado sin sanitización previa; toda salida que se ejecuta como código pasa por sandbox aislado o validación estricta contra schema JSON definido',
        rationale: 'OWASP LLM02: El output del LLM puede contener instrucciones maliciosas si no se sanitiza antes de ejecutarse',
        testable: true,
    };
}
/** LLM05 — Improper Tool Authorization: only when hasToolUse */
function buildLlm05Criteria() {
    return {
        category: 'LLM05-tool-authorization',
        criterion: 'Cada herramienta que el LLM puede invocar tiene un scope de permisos mínimos documentado en el spec; el LLM no puede invocar herramientas destructivas (`DELETE`, `DROP TABLE`, `rm -rf`, operaciones de escritura irreversibles) sin confirmación explícita del usuario en la sesión actual',
        rationale: 'OWASP LLM05: Sin autorización adecuada el LLM puede abusar de herramientas con consecuencias destructivas',
        testable: true,
    };
}
/** LLM06 — Sensitive Information Disclosure: only when hasRAG */
function buildLlm06Criteria() {
    return {
        category: 'LLM06-sensitive-disclosure',
        criterion: 'Los documentos indexados en el vectorstore son auditados para PII antes de la indexación; el sistema de retrieval respeta la ACL del documento original — un usuario autenticado no puede recuperar documentos de otro usuario via consulta semántica al vectorstore',
        rationale: 'OWASP LLM06: Los sistemas RAG pueden filtrar información sensible si no se controlan los permisos de retrieval',
        testable: true,
    };
}
/** LLM07 — System Prompt Leakage: always required when LLM is detected */
function buildLlm07Criteria() {
    return {
        category: 'LLM07-system-prompt-leakage',
        criterion: 'El system prompt no contiene credenciales, API keys, o lógica de negocio sensible — ' +
            'únicamente instrucciones de comportamiento; si incluye información sensible, ' +
            'se carga dinámicamente desde secrets manager en runtime. ' +
            'El sistema no expone system prompts en respuestas de error ni en logs',
        rationale: 'OWASP LLM07 2025: Los system prompts pueden ser extraídos por usuarios maliciosos; ' +
            'credenciales o lógica de negocio embebida quedan expuestas',
        testable: true,
    };
}
/** LLM09 — Misinformation: only when high-risk domain */
function buildLlm09Criteria() {
    return {
        category: 'LLM09-misinformation',
        criterion: 'El sistema incluye disclaimer explícito de que las respuestas son generadas por IA y pueden contener errores o información desactualizada; para decisiones en dominios críticos se requiere revisión humana antes de actuar',
        rationale: 'OWASP LLM09: En dominios de alto riesgo la desinformación del LLM puede tener consecuencias graves para usuarios',
        testable: true,
    };
}
/**
 * Generate OWASP LLM Top 10 criteria based on project detection.
 * LLM01+LLM02: always when LLM detected.
 * LLM05: only when hasToolUse.
 * LLM06: only when hasRAG.
 * LLM09: only when high-risk domain (euAiActRisk is high-risk or unacceptable).
 */
export function generateOwaspLlmCriteria(detection) {
    if (!detection.isLlmProject) {
        return [];
    }
    const criteria = [
        buildLlm01Criteria(),
        buildLlm02Criteria(),
        // LLM07 always required when LLM is detected
        buildLlm07Criteria(),
    ];
    if (detection.hasToolUse) {
        criteria.push(buildLlm05Criteria());
    }
    if (detection.hasRAG) {
        criteria.push(buildLlm06Criteria());
    }
    const isHighRiskDomain = detection.euAiActRisk === 'high-risk' || detection.euAiActRisk === 'unacceptable';
    if (isHighRiskDomain || detection.detectedHighRiskDomains.length > 0) {
        criteria.push(buildLlm09Criteria());
    }
    return criteria;
}
/**
 * Format OWASP LLM criteria as HU.md lines.
 */
export function formatOwaspCriteriaAsLines(criteria) {
    if (criteria.length === 0) {
        return [];
    }
    const lines = ['', '## OWASP LLM Top 10 Security Requirements', ''];
    for (const c of criteria) {
        const tag = c.category.split('-').slice(0, 1).join('').toUpperCase();
        lines.push(`- [ ] **[${tag}]** ${c.criterion}`);
    }
    lines.push('');
    return lines;
}
/**
 * Generate credential management criteria for LLM API keys.
 */
export function generateCredentialManagementCriteria() {
    return [
        '',
        '## LLM Credential Management',
        '',
        '- [ ] Las API keys de LLM rotan cada 90 días y se almacenan en secrets manager (AWS Secrets Manager, HashiCorp Vault, 1Password Secrets Automation) — nunca en `.env` commiteado al repositorio',
        '- [ ] Se configura rate limiting en el cliente LLM para prevenir prompt flooding (`max_requests_per_minute` configurado)',
        '- [ ] El token usage se registra por usuario/sesión en logs estructurados para detectar abuso y optimizar costos',
        '',
    ];
}
/** Vector DB names that trigger the embedding security section (SPEC-045 TD-P15-01) */
const VECTOR_DB_NAMES = ['pinecone', 'weaviate', 'qdrant', 'chroma', 'pgvector', 'milvus'];
/** Agentic AI framework names that trigger the agentic security section (SPEC-045 TD-P15-02) */
const AGENTIC_AI_FRAMEWORKS = [
    'langgraph',
    'crewai',
    'autogen',
    'semantic-kernel',
    'semantickernel',
];
/**
 * SPEC-045 TD-P15-01: Detect vector DB usage from project stack.
 */
export function hasVectorDbInStack(stack) {
    const lower = stack.map((s) => s.toLowerCase());
    return lower.some((s) => VECTOR_DB_NAMES.some((v) => s.includes(v)));
}
/**
 * SPEC-045 TD-P15-02: Detect agentic AI frameworks from project stack.
 */
export function hasAgenticAiInStack(stack) {
    const lower = stack.map((s) => s.toLowerCase());
    return lower.some((s) => AGENTIC_AI_FRAMEWORKS.some((f) => s.includes(f)));
}
/**
 * SPEC-045 TD-P15-01: Generate vector/embedding security criteria for RAG projects
 * that use vector DBs (Pinecone, Weaviate, Qdrant, Chroma, pgvector).
 */
export function generateVectorDbSecurityCriteria(stack) {
    if (!hasVectorDbInStack(stack)) {
        return [];
    }
    return [
        '',
        '## Vector DB & Embedding Security',
        '',
        '- [ ] Las embeddings no contienen PII sin cifrado — los documentos se anoninizan antes de generar embeddings',
        '- [ ] El acceso a vector DB está autenticado y tiene rate limiting — las queries de usuarios anónimos están bloqueadas',
        '- [ ] Las queries de similarity search tienen límite de resultados (top-k ≤ 100) para prevenir data exfiltration masiva',
        '',
    ];
}
/**
 * SPEC-045 TD-P15-02: Generate agentic AI security criteria (OWASP GenAI Top 10 2025)
 * when LangGraph, CrewAI, AutoGen, or Semantic Kernel is detected in the stack.
 */
export function generateAgenticAiSecurityCriteria(stack) {
    if (!hasAgenticAiInStack(stack)) {
        return [];
    }
    return [
        '',
        '## Agentic AI Security (OWASP GenAI 2025)',
        '',
        '- [ ] Agents tienen scope mínimo de herramientas (principle of least privilege) — cada agent solo puede invocar las herramientas explícitamente declaradas en su definición',
        '- [ ] Cada acción de agent sobre recursos externos requiere confirmación humana o audit log — las acciones destructivas son bloqueadas sin aprobación explícita',
        '- [ ] Los agent loops tienen límite de iteraciones (max steps configurado) — el sistema detiene al agent si supera el límite y notifica al usuario',
        '',
    ];
}
//# sourceMappingURL=owasp-llm-requirements.js.map