/** * ExternalDataGuard * * Validates ALL external data before it enters LLM context. * Covers API responses, tool outputs, RAG results, file contents, * webhook payloads, and any other untrusted data source. * * This is an ARCHITECTURAL guard — it enforces boundaries on what * external data can reach the LLM, regardless of whether the LLM * itself has been compromised. Defense-in-depth at the data boundary. * * Threat model: * - Indirect prompt injection via API responses or RAG documents * - Context stuffing via oversized payloads * - Data exfiltration via embedded URLs in external content * - Secret/credential leakage through external data * - Poisoned data from compromised or unknown sources */ import { GuardLogger } from "../types"; export interface ExternalDataGuardConfig { /** Allowlist of trusted data sources (exact match or prefix) */ allowedSources?: string[]; /** Blocklist of known-bad data sources */ blockedSources?: string[]; /** Max characters of external content allowed (default: 50000) */ maxContentLength?: number; /** Scan content for prompt injection patterns (default: true) */ scanForInjection?: boolean; /** Detect leaked secrets, API keys, credentials (default: true) */ scanForSecrets?: boolean; /** Detect data exfiltration URLs in content (default: true) */ scanForExfiltration?: boolean; /** Require provenance metadata for all data (default: false) */ requireProvenance?: boolean; /** Optional logger */ logger?: GuardLogger; } export interface ExternalDataGuardResult { allowed: boolean; reason?: string; violations: string[]; /** Identified data source */ source?: string; /** Length of the content inspected */ contentLength: number; /** Specific threat categories detected */ threats: string[]; } export interface DataProvenance { /** Where the data came from (URL, service name, file path, etc.) */ source: string; /** Content type hint (e.g. "application/json", "text/html") */ contentType?: string; /** When the data was retrieved (ISO string or epoch ms) */ retrievedAt?: string | number; /** Max acceptable age in seconds before data is considered stale */ maxAgeSec?: number; } export declare class ExternalDataGuard { private config; constructor(config?: ExternalDataGuardConfig); /** * Validate external data before it enters LLM context. * * @param content - The raw external content (string or object) * @param provenance - Optional metadata about the data source */ validate(content: string | Record, provenance?: DataProvenance): ExternalDataGuardResult; /** * Validate a batch of external data items (e.g. multiple RAG chunks). * Returns individual results and a combined summary. */ validateBatch(items: Array<{ content: string | Record; provenance?: DataProvenance; }>): { results: ExternalDataGuardResult[]; allAllowed: boolean; totalThreats: number; }; private isBlockedSource; private isAllowedSource; private log; private safeStringify; }