raguard 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -0
- package/dist/index.d.mts +123 -0
- package/dist/index.d.ts +123 -0
- package/dist/index.js +896 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +890 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/hashing.ts","../src/models.ts","../src/config.ts","../src/detectors/base.ts","../src/utils/math.ts","../src/utils/embeddings.ts","../src/detectors/consensus.ts","../src/detectors/anomaly.ts","../src/detectors/reputation.ts","../src/detectors/index.ts","../src/raguard.ts","../src/index.ts"],"names":["Recommendation","membersA","membersB","s"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Content fingerprinting and text analysis utilities.\n */\n\nimport { createHash } from \"crypto\";\n\n/** Generate a random 12-char hex ID. */\nexport function randomId(): string {\n const bytes = new Uint8Array(6);\n // Use crypto.getRandomValues in Node 18+\n if (typeof globalThis.crypto !== \"undefined\" && globalThis.crypto.getRandomValues) {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/** SHA-256 hash of normalized text. */\nexport function contentHash(text: string): string {\n const normalized = text.toLowerCase().replace(/\\s+/g, \" \").trim();\n return createHash(\"sha256\").update(normalized).digest(\"hex\");\n}\n\n/** Extract n-grams from text. */\nexport function extractNgrams(text: string, n: number = 3): Set<string> {\n const words = text.toLowerCase().replace(/[^\\w\\s]/g, \"\").split(/\\s+/);\n const ngrams = new Set<string>();\n for (let i = 0; i <= words.length - n; i++) {\n ngrams.add(words.slice(i, i + n).join(\" \"));\n }\n return ngrams;\n}\n\n/** Jaccard similarity between two sets of n-grams. */\nexport function ngramOverlap(text1: string, text2: string, n: number = 3): number {\n const ngrams1 = extractNgrams(text1, n);\n const ngrams2 = extractNgrams(text2, n);\n if (ngrams1.size === 0 && ngrams2.size === 0) return 0;\n\n let intersection = 0;\n for (const ng of ngrams1) {\n if (ngrams2.has(ng)) intersection++;\n }\n\n const union = ngrams1.size + ngrams2.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\n/** Extract domain from URL string. */\nexport function extractDomain(url: string): string | null {\n try {\n const match = url.match(/https?:\\/\\/(?:www\\.)?([^/]+)/i);\n return match ? match[1].toLowerCase() : null;\n } catch {\n return null;\n }\n}\n\n/** Suspicious content patterns. */\nconst PROMOTIONAL_PATTERNS = [\n /\\bbest\\s+ever\\b/i,\n /\\b100%\\s+(?:safe|secure|guaranteed)\\b/i,\n /\\bact\\s+now\\b/i,\n /\\blimited\\s+time\\b/i,\n /\\bfree\\s+(?:download|trial|offer)\\b/i,\n /\\bclick\\s+here\\b/i,\n];\n\nconst REPETITION_THRESHOLD = 3;\n\nexport interface SuspiciousPatterns {\n promotional: boolean;\n repetitive: boolean;\n unicodeAnomalies: boolean;\n score: number;\n}\n\n/** Detect suspicious patterns in text. */\nexport function detectSuspiciousPatterns(text: string): SuspiciousPatterns {\n // Promotional language\n const promotional = PROMOTIONAL_PATTERNS.some((p) => p.test(text));\n\n // Repetition detection (same sentence repeated)\n const sentences = text.split(/[.!?]+/).filter((s) => s.trim().length > 10);\n const sentenceSet = new Set(sentences.map((s) => s.trim().toLowerCase()));\n const repetitive =\n sentences.length > 0 &&\n sentences.length - sentenceSet.size >= REPETITION_THRESHOLD;\n\n // Unicode anomalies (homoglyphs, RTL marks, zero-width chars)\n const unicodeAnomalies = /[\\u200B-\\u200F\\u2028-\\u202F\\uFEFF]/.test(text);\n\n let score = 0;\n if (promotional) score += 0.3;\n if (repetitive) score += 0.4;\n if (unicodeAnomalies) score += 0.3;\n\n return { promotional, repetitive, unicodeAnomalies, score: Math.min(score, 1) };\n}\n","/**\n * Core data models — the shared contract between SDK, server, and integrations.\n */\n\nimport { randomId } from \"./utils/hashing\";\n\nexport enum Recommendation {\n PROCEED = \"proceed\",\n CITE_WITH_WARNING = \"cite_with_warning\",\n BLOCK = \"block\",\n}\n\nexport interface DocumentInput {\n content: string;\n metadata?: Record<string, unknown>;\n doc_id?: string;\n}\n\nexport class Document {\n content: string;\n metadata: Record<string, unknown>;\n doc_id: string;\n\n constructor(input: DocumentInput | string) {\n if (typeof input === \"string\") {\n this.content = input;\n this.metadata = {};\n this.doc_id = randomId();\n } else {\n this.content = input.content;\n this.metadata = input.metadata ?? {};\n this.doc_id = input.doc_id ?? randomId();\n }\n }\n}\n\nexport interface DetectorResult {\n detectorName: string;\n riskScore: number;\n flaggedIndices: number[];\n details: Record<string, unknown>;\n}\n\nexport interface ScanResult {\n safe: boolean;\n overallRiskScore: number;\n recommendation: Recommendation;\n flaggedDocuments: number[];\n detectors: Record<string, DetectorResult>;\n scanId: string;\n latencyMs: number;\n documentsScanned: number;\n}\n\nexport interface ScanOptions {\n query?: string;\n}\n","/**\n * Configuration and thresholds for RAGuard.\n */\n\nexport interface ConsensusConfig {\n similarityThreshold: number;\n minClusterSize: number;\n weightSimilarity: number;\n weightSourceDiversity: number;\n weightTemporal: number;\n weightLexical: number;\n}\n\nexport interface AnomalyConfig {\n contamination: number;\n minRelevanceScore: number;\n}\n\nexport interface ReputationConfig {\n unknownDomainScore: number;\n metadataWeight: number;\n contentQualityWeight: number;\n}\n\nexport interface RAGuardConfig {\n riskThreshold: number;\n warningThreshold: number;\n enabledDetectors: string[];\n consensus: ConsensusConfig;\n anomaly: AnomalyConfig;\n reputation: ReputationConfig;\n}\n\nexport const DEFAULT_CONFIG: RAGuardConfig = {\n riskThreshold: 0.7,\n warningThreshold: 0.4,\n enabledDetectors: [\n \"consensus_clustering\",\n \"semantic_anomaly\",\n \"source_reputation\",\n ],\n consensus: {\n similarityThreshold: 0.75,\n minClusterSize: 2,\n weightSimilarity: 0.4,\n weightSourceDiversity: 0.3,\n weightTemporal: 0.2,\n weightLexical: 0.1,\n },\n anomaly: {\n contamination: 0.1,\n minRelevanceScore: 0.3,\n },\n reputation: {\n unknownDomainScore: 0.4,\n metadataWeight: 0.2,\n contentQualityWeight: 0.15,\n },\n};\n\nexport function mergeConfig(\n overrides: Partial<RAGuardConfig> | undefined\n): RAGuardConfig {\n if (!overrides) return { ...DEFAULT_CONFIG };\n\n return {\n riskThreshold: overrides.riskThreshold ?? DEFAULT_CONFIG.riskThreshold,\n warningThreshold:\n overrides.warningThreshold ?? DEFAULT_CONFIG.warningThreshold,\n enabledDetectors:\n overrides.enabledDetectors ?? [...DEFAULT_CONFIG.enabledDetectors],\n consensus: { ...DEFAULT_CONFIG.consensus, ...overrides.consensus },\n anomaly: { ...DEFAULT_CONFIG.anomaly, ...overrides.anomaly },\n reputation: { ...DEFAULT_CONFIG.reputation, ...overrides.reputation },\n };\n}\n","/**\n * Abstract base class for all RAGuard detectors.\n */\n\nimport type { DetectorResult, Document } from \"../models\";\n\nexport interface DetectOptions {\n query?: string;\n embeddings?: number[][];\n queryEmbedding?: number[][];\n}\n\nexport abstract class BaseDetector {\n abstract readonly name: string;\n\n abstract detect(\n documents: Document[],\n options?: DetectOptions\n ): DetectorResult;\n}\n","/**\n * Math utilities — cosine similarity, matrix operations, etc.\n */\n\n/** Dot product of two vectors. */\nexport function dot(a: number[], b: number[]): number {\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n sum += a[i] * b[i];\n }\n return sum;\n}\n\n/** L2 norm of a vector. */\nexport function norm(a: number[]): number {\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n sum += a[i] * a[i];\n }\n return Math.sqrt(sum);\n}\n\n/** Cosine similarity between two vectors. */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n const d = dot(a, b);\n const na = norm(a);\n const nb = norm(b);\n if (na === 0 || nb === 0) return 0;\n return d / (na * nb);\n}\n\n/** Pairwise cosine similarity matrix for a set of vectors. */\nexport function cosineSimilarityMatrix(vectors: number[][]): number[][] {\n const n = vectors.length;\n const matrix: number[][] = Array.from({ length: n }, () =>\n new Array(n).fill(0)\n );\n\n // Pre-compute norms\n const norms = vectors.map(norm);\n\n for (let i = 0; i < n; i++) {\n matrix[i][i] = 1.0;\n for (let j = i + 1; j < n; j++) {\n const sim =\n norms[i] === 0 || norms[j] === 0\n ? 0\n : dot(vectors[i], vectors[j]) / (norms[i] * norms[j]);\n matrix[i][j] = sim;\n matrix[j][i] = sim;\n }\n }\n\n return matrix;\n}\n\n/** Mean of an array. */\nexport function mean(arr: number[]): number {\n if (arr.length === 0) return 0;\n return arr.reduce((a, b) => a + b, 0) / arr.length;\n}\n\n/** Standard deviation of an array. */\nexport function std(arr: number[]): number {\n if (arr.length === 0) return 0;\n const m = mean(arr);\n const variance = arr.reduce((sum, x) => sum + (x - m) ** 2, 0) / arr.length;\n return Math.sqrt(variance);\n}\n\n/** Clamp a value between min and max. */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","/**\n * TF-IDF based text vectorization.\n *\n * Provides lightweight document embeddings without requiring ML model downloads.\n * Uses TF-IDF (Term Frequency-Inverse Document Frequency) to create vector\n * representations of text for similarity comparison.\n */\n\n/** Tokenize text into normalized words. */\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 1);\n}\n\n/** Compute term frequency for a list of tokens. */\nfunction termFrequency(tokens: string[]): Map<string, number> {\n const tf = new Map<string, number>();\n for (const token of tokens) {\n tf.set(token, (tf.get(token) ?? 0) + 1);\n }\n // Normalize by total tokens\n const total = tokens.length;\n if (total > 0) {\n for (const [key, val] of tf) {\n tf.set(key, val / total);\n }\n }\n return tf;\n}\n\n/** Build vocabulary and IDF values from a corpus. */\nfunction buildIdf(\n tokenizedDocs: string[][]\n): { vocab: string[]; idf: Map<string, number> } {\n const docFreq = new Map<string, number>();\n const n = tokenizedDocs.length;\n\n for (const tokens of tokenizedDocs) {\n const unique = new Set(tokens);\n for (const token of unique) {\n docFreq.set(token, (docFreq.get(token) ?? 0) + 1);\n }\n }\n\n const idf = new Map<string, number>();\n const vocab: string[] = [];\n\n for (const [term, df] of docFreq) {\n // Skip terms that appear in all docs (no discriminating power)\n // or appear only once (noise)\n if (df < n && df > 0) {\n idf.set(term, Math.log((n + 1) / (df + 1)) + 1);\n vocab.push(term);\n }\n }\n\n // Sort vocab for consistent ordering\n vocab.sort();\n\n return { vocab, idf };\n}\n\n/**\n * Encode texts into TF-IDF vectors.\n *\n * Returns normalized vectors suitable for cosine similarity computation.\n */\nexport function encodeTexts(texts: string[]): number[][] {\n const tokenizedDocs = texts.map(tokenize);\n const { vocab, idf } = buildIdf(tokenizedDocs);\n\n if (vocab.length === 0) {\n // Fallback: return zero vectors\n return texts.map(() => new Array(1).fill(0));\n }\n\n const vectors: number[][] = [];\n\n for (const tokens of tokenizedDocs) {\n const tf = termFrequency(tokens);\n const vec = new Array(vocab.length).fill(0);\n\n for (let i = 0; i < vocab.length; i++) {\n const term = vocab[i];\n const tfVal = tf.get(term) ?? 0;\n const idfVal = idf.get(term) ?? 0;\n vec[i] = tfVal * idfVal;\n }\n\n // L2 normalize\n let normVal = 0;\n for (const v of vec) normVal += v * v;\n normVal = Math.sqrt(normVal);\n\n if (normVal > 0) {\n for (let i = 0; i < vec.length; i++) {\n vec[i] /= normVal;\n }\n }\n\n vectors.push(vec);\n }\n\n return vectors;\n}\n","/**\n * Consensus Clustering Detector — detects Hallucination Propagation Chains (HPCs).\n *\n * Catches attackers who plant multiple fake documents that all \"agree\" with each other\n * by finding suspiciously tight clusters of semantically similar documents.\n */\n\nimport type { DetectorResult, Document } from \"../models\";\nimport type { ConsensusConfig } from \"../config\";\nimport { cosineSimilarityMatrix, mean } from \"../utils/math\";\nimport { extractDomain, ngramOverlap } from \"../utils/hashing\";\nimport { encodeTexts } from \"../utils/embeddings\";\nimport { BaseDetector, type DetectOptions } from \"./base\";\n\n/**\n * Simple agglomerative clustering with average linkage.\n * Returns an array of cluster labels (one per document).\n */\nfunction agglomerativeClustering(\n distanceMatrix: number[][],\n distanceThreshold: number\n): number[] {\n const n = distanceMatrix.length;\n\n // Each point starts as its own cluster\n const clusterOf = Array.from({ length: n }, (_, i) => i);\n const clusters = new Map<number, number[]>();\n for (let i = 0; i < n; i++) {\n clusters.set(i, [i]);\n }\n\n // Average linkage: merge closest clusters until threshold exceeded\n while (clusters.size > 1) {\n let minDist = Infinity;\n let mergeA = -1;\n let mergeB = -1;\n\n const keys = Array.from(clusters.keys());\n for (let i = 0; i < keys.length; i++) {\n for (let j = i + 1; j < keys.length; j++) {\n const membersA = clusters.get(keys[i])!;\n const membersB = clusters.get(keys[j])!;\n\n // Average linkage distance\n let totalDist = 0;\n let count = 0;\n for (const a of membersA) {\n for (const b of membersB) {\n totalDist += distanceMatrix[a][b];\n count++;\n }\n }\n const avgDist = totalDist / count;\n\n if (avgDist < minDist) {\n minDist = avgDist;\n mergeA = keys[i];\n mergeB = keys[j];\n }\n }\n }\n\n if (minDist > distanceThreshold || mergeA === -1) break;\n\n // Merge B into A\n const membersB = clusters.get(mergeB)!;\n const membersA = clusters.get(mergeA)!;\n for (const idx of membersB) {\n membersA.push(idx);\n clusterOf[idx] = mergeA;\n }\n clusters.delete(mergeB);\n }\n\n // Normalize labels to 0..K-1\n const labelMap = new Map<number, number>();\n let nextLabel = 0;\n const labels = new Array(n);\n for (let i = 0; i < n; i++) {\n const cluster = clusterOf[i];\n // Walk up to find the root cluster\n let root = cluster;\n while (!clusters.has(root)) {\n // Find which cluster absorbed this one\n for (const [key, members] of clusters) {\n if (members.includes(i)) {\n root = key;\n break;\n }\n }\n break;\n }\n if (!labelMap.has(root)) {\n labelMap.set(root, nextLabel++);\n }\n labels[i] = labelMap.get(root)!;\n }\n\n return labels;\n}\n\nexport class ConsensusClusteringDetector extends BaseDetector {\n readonly name = \"consensus_clustering\";\n\n private similarityThreshold: number;\n private minClusterSize: number;\n private wSim: number;\n private wSrc: number;\n private wTemp: number;\n private wLex: number;\n\n constructor(config: ConsensusConfig) {\n super();\n this.similarityThreshold = config.similarityThreshold;\n this.minClusterSize = config.minClusterSize;\n this.wSim = config.weightSimilarity;\n this.wSrc = config.weightSourceDiversity;\n this.wTemp = config.weightTemporal;\n this.wLex = config.weightLexical;\n }\n\n detect(documents: Document[], options?: DetectOptions): DetectorResult {\n if (documents.length < this.minClusterSize) {\n return {\n detectorName: this.name,\n riskScore: 0,\n flaggedIndices: [],\n details: { reason: \"too_few_documents\" },\n };\n }\n\n // 1. Embed all documents\n const embeddings =\n options?.embeddings ?? encodeTexts(documents.map((d) => d.content));\n\n // 2. Compute pairwise cosine similarity\n const simMatrix = cosineSimilarityMatrix(embeddings);\n\n // 3. Build distance matrix\n const n = documents.length;\n const distMatrix: number[][] = Array.from({ length: n }, () =>\n new Array(n).fill(0)\n );\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n distMatrix[i][j] = i === j ? 0 : Math.max(0, Math.min(2, 1 - simMatrix[i][j]));\n }\n }\n\n // 4. Agglomerative clustering\n const labels = agglomerativeClustering(\n distMatrix,\n 1 - this.similarityThreshold\n );\n\n // 5. Find suspicious clusters (size >= minClusterSize)\n const clusterCounts = new Map<number, number>();\n for (const label of labels) {\n clusterCounts.set(label, (clusterCounts.get(label) ?? 0) + 1);\n }\n\n const suspiciousClusters = new Map<number, number>();\n for (const [clusterId, count] of clusterCounts) {\n if (count >= this.minClusterSize) {\n suspiciousClusters.set(clusterId, count);\n }\n }\n\n if (suspiciousClusters.size === 0) {\n return {\n detectorName: this.name,\n riskScore: 0,\n flaggedIndices: [],\n details: { clusters_found: 0 },\n };\n }\n\n // 6. Score each suspicious cluster\n const clusterScores: Record<string, unknown>[] = [];\n const allFlagged: Set<number> = new Set();\n\n for (const [clusterId, size] of suspiciousClusters) {\n const members = labels\n .map((label, idx) => (label === clusterId ? idx : -1))\n .filter((idx) => idx >= 0);\n\n for (const m of members) allFlagged.add(m);\n\n const simUniformity = this.intraClusterSimilarity(simMatrix, members);\n const sourceDiversity = this.sourceDiversity(documents, members);\n const temporalScore = this.temporalClustering(documents, members);\n const lexicalScore = this.lexicalOverlap(documents, members);\n\n const clusterRisk =\n this.wSim * simUniformity +\n this.wSrc * (1 - sourceDiversity) +\n this.wTemp * temporalScore +\n this.wLex * lexicalScore;\n\n clusterScores.push({\n cluster_id: clusterId,\n size,\n members,\n risk_score: Math.round(clusterRisk * 10000) / 10000,\n similarity_uniformity: Math.round(simUniformity * 10000) / 10000,\n source_diversity: Math.round(sourceDiversity * 10000) / 10000,\n temporal_clustering: Math.round(temporalScore * 10000) / 10000,\n lexical_overlap: Math.round(lexicalScore * 10000) / 10000,\n });\n }\n\n const overallRisk = Math.max(\n ...clusterScores.map((cs) => cs.risk_score as number)\n );\n\n return {\n detectorName: this.name,\n riskScore: Math.min(overallRisk, 1.0),\n flaggedIndices: Array.from(allFlagged).sort((a, b) => a - b),\n details: {\n clusters_found: suspiciousClusters.size,\n clusters: clusterScores,\n },\n };\n }\n\n private intraClusterSimilarity(\n simMatrix: number[][],\n members: number[]\n ): number {\n if (members.length < 2) return 0;\n const sims: number[] = [];\n for (let i = 0; i < members.length; i++) {\n for (let j = i + 1; j < members.length; j++) {\n sims.push(simMatrix[members[i]][members[j]]);\n }\n }\n return sims.length > 0 ? mean(sims) : 0;\n }\n\n private sourceDiversity(documents: Document[], members: number[]): number {\n if (members.length === 0) return 1;\n const sources = new Set<string>();\n let unknownCount = 0;\n\n for (const idx of members) {\n const source = documents[idx].metadata.source as string | undefined;\n if (source) {\n const domain = extractDomain(source);\n sources.add(domain ?? \"__unknown__\");\n } else {\n unknownCount++;\n }\n }\n\n if (unknownCount > 0) sources.add(\"__unknown__\");\n return sources.size / members.length;\n }\n\n private temporalClustering(documents: Document[], members: number[]): number {\n const dates: Date[] = [];\n\n for (const idx of members) {\n const dateStr =\n (documents[idx].metadata.date as string) ??\n (documents[idx].metadata.published_date as string);\n if (dateStr) {\n try {\n const d = new Date(dateStr);\n if (!isNaN(d.getTime())) dates.push(d);\n } catch {\n continue;\n }\n }\n }\n\n if (dates.length < 2) return 0;\n\n dates.sort((a, b) => a.getTime() - b.getTime());\n const spanDays =\n (dates[dates.length - 1].getTime() - dates[0].getTime()) / 86400000;\n\n if (spanDays <= 1) return 1.0;\n if (spanDays <= 7) return 0.7;\n if (spanDays <= 30) return 0.3;\n return 0;\n }\n\n private lexicalOverlap(documents: Document[], members: number[]): number {\n if (members.length < 2) return 0;\n const overlaps: number[] = [];\n for (let i = 0; i < members.length; i++) {\n for (let j = i + 1; j < members.length; j++) {\n overlaps.push(\n ngramOverlap(documents[members[i]].content, documents[members[j]].content)\n );\n }\n }\n return overlaps.length > 0 ? mean(overlaps) : 0;\n }\n}\n","/**\n * Semantic Anomaly Detector — detects documents that deviate from baselines.\n *\n * Catches poisoned documents by identifying:\n * 1. Statistical outliers via distance-based anomaly detection\n * 2. Documents with low query relevance but high inter-similarity (coordinated injection)\n * 3. Contradiction signals between documents\n */\n\nimport type { DetectorResult, Document } from \"../models\";\nimport type { AnomalyConfig } from \"../config\";\nimport {\n cosineSimilarity,\n cosineSimilarityMatrix,\n mean,\n std,\n clamp,\n} from \"../utils/math\";\nimport { encodeTexts } from \"../utils/embeddings\";\nimport { BaseDetector, type DetectOptions } from \"./base\";\n\n/** Patterns that indicate contradictions. */\nconst NEGATION_PATTERNS = [\n /\\bhowever\\b/i,\n /\\bbut\\b/i,\n /\\bon the contrary\\b/i,\n /\\bactually\\b.*\\bnot\\b/i,\n /\\bfalse\\b/i,\n /\\bincorrect\\b/i,\n /\\bcontradicts?\\b/i,\n /\\bdespite\\b.*\\bclaims?\\b/i,\n /\\bis not\\b/i,\n /\\bare not\\b/i,\n /\\bwas not\\b/i,\n /\\bnever\\b/i,\n /\\bno evidence\\b/i,\n];\n\n/**\n * Distance-based outlier detection.\n *\n * For each point, computes its average distance to all other points.\n * Points that are much further from others (z-score based) are flagged as outliers.\n * Returns scores where negative = outlier, positive = inlier (matching sklearn convention).\n */\nfunction distanceBasedOutlierScores(\n embeddings: number[][],\n contamination: number\n): number[] {\n const n = embeddings.length;\n const simMatrix = cosineSimilarityMatrix(embeddings);\n\n // Average distance from each point to all others\n const avgDistances: number[] = [];\n for (let i = 0; i < n; i++) {\n let totalDist = 0;\n for (let j = 0; j < n; j++) {\n if (i !== j) totalDist += 1 - simMatrix[i][j];\n }\n avgDistances.push(totalDist / (n - 1));\n }\n\n const m = mean(avgDistances);\n const s = std(avgDistances);\n\n if (s === 0) {\n return new Array(n).fill(0.1);\n }\n\n // Z-score based: higher distance = more anomalous = more negative score\n const scores = avgDistances.map((d) => -(d - m) / s);\n\n // Adjust so that approximately `contamination` fraction is negative\n const sorted = [...scores].sort((a, b) => a - b);\n const cutoffIdx = Math.max(0, Math.floor(n * contamination) - 1);\n const cutoff = sorted[cutoffIdx];\n\n return scores.map((s) => s - cutoff);\n}\n\nexport class SemanticAnomalyDetector extends BaseDetector {\n readonly name = \"semantic_anomaly\";\n\n private contamination: number;\n private minRelevanceScore: number;\n\n constructor(config: AnomalyConfig) {\n super();\n this.contamination = config.contamination;\n this.minRelevanceScore = config.minRelevanceScore;\n }\n\n detect(documents: Document[], options?: DetectOptions): DetectorResult {\n if (documents.length < 3) {\n return {\n detectorName: this.name,\n riskScore: 0,\n flaggedIndices: [],\n details: { reason: \"too_few_documents_for_anomaly_detection\" },\n };\n }\n\n // 1. Embed documents\n const embeddings =\n options?.embeddings ?? encodeTexts(documents.map((d) => d.content));\n\n // 2. Outlier detection\n const outlierScores = distanceBasedOutlierScores(\n embeddings,\n Math.min(this.contamination, (documents.length - 1) / documents.length)\n );\n\n // 3. Query relevance check\n let relevanceScores: number[] | null = null;\n const lowRelevanceFlags: number[] = [];\n\n if (options?.query) {\n const queryEmb =\n options.queryEmbedding?.[0] ??\n encodeTexts([options.query])[0];\n\n relevanceScores = embeddings.map((emb) => cosineSimilarity(emb, queryEmb));\n\n for (let i = 0; i < relevanceScores.length; i++) {\n if (relevanceScores[i] < this.minRelevanceScore) {\n lowRelevanceFlags.push(i);\n }\n }\n }\n\n // 4. Contradiction detection\n const contradictionScores = this.detectContradictions(documents);\n\n // 5. Coordinated injection check\n const coordinatedFlags = this.checkCoordinatedInjection(\n embeddings,\n relevanceScores\n );\n\n // Combine signals\n const flagged = new Set<number>();\n const docRisks = new Array(documents.length).fill(0);\n\n // Outlier contribution\n for (let i = 0; i < outlierScores.length; i++) {\n if (outlierScores[i] < 0) {\n const anomalyStrength = Math.abs(outlierScores[i]);\n docRisks[i] += anomalyStrength * 0.4;\n if (anomalyStrength > 0.3) flagged.add(i);\n }\n }\n\n // Contradiction contribution\n for (let i = 0; i < contradictionScores.length; i++) {\n docRisks[i] += contradictionScores[i] * 0.3;\n }\n\n // Low relevance contribution\n for (const i of lowRelevanceFlags) {\n docRisks[i] += 0.15;\n flagged.add(i);\n }\n\n // Coordinated injection\n for (const i of coordinatedFlags) {\n docRisks[i] += 0.25;\n flagged.add(i);\n }\n\n // Normalize\n for (let i = 0; i < docRisks.length; i++) {\n docRisks[i] = clamp(docRisks[i], 0, 1);\n }\n\n const overallRisk = Math.max(...docRisks);\n\n return {\n detectorName: this.name,\n riskScore: Math.min(overallRisk, 1.0),\n flaggedIndices: Array.from(flagged).sort((a, b) => a - b),\n details: {\n outlier_scores: outlierScores.map((s) => Math.round(s * 10000) / 10000),\n contradiction_scores: contradictionScores.map(\n (s) => Math.round(s * 10000) / 10000\n ),\n relevance_scores: relevanceScores?.map(\n (s) => Math.round(s * 10000) / 10000\n ) ?? null,\n coordinated_injection_indices: coordinatedFlags,\n per_document_risk: docRisks.map(\n (r: number) => Math.round(r * 10000) / 10000\n ),\n },\n };\n }\n\n private detectContradictions(documents: Document[]): number[] {\n return documents.map((doc) => {\n const text = doc.content.toLowerCase();\n const contradictionCount = NEGATION_PATTERNS.filter((p) =>\n p.test(text)\n ).length;\n const wordCount = Math.max(text.split(/\\s+/).length, 1);\n const density = contradictionCount / (wordCount / 100);\n return Math.min(density * 0.2, 1.0);\n });\n }\n\n private checkCoordinatedInjection(\n embeddings: number[][],\n relevanceScores: number[] | null\n ): number[] {\n if (!relevanceScores) return [];\n\n const lowRelevance = relevanceScores\n .map((s, i) => (s < 0.4 ? i : -1))\n .filter((i) => i >= 0);\n\n if (lowRelevance.length < 2) return [];\n\n const subEmbeddings = lowRelevance.map((i) => embeddings[i]);\n const simMatrix = cosineSimilarityMatrix(subEmbeddings);\n\n const flagged: number[] = [];\n for (let i = 0; i < lowRelevance.length; i++) {\n let maxSim = 0;\n for (let j = 0; j < lowRelevance.length; j++) {\n if (i !== j) maxSim = Math.max(maxSim, simMatrix[i][j]);\n }\n if (maxSim > 0.8) flagged.push(lowRelevance[i]);\n }\n\n return flagged;\n }\n}\n","/**\n * Source Reputation Detector — scores document trustworthiness based on provenance.\n *\n * Checks:\n * 1. Source domain against known-good/known-bad lists\n * 2. Metadata completeness (well-sourced docs have dates, authors, titles)\n * 3. Content quality signals (promotional language, Unicode anomalies, repetition)\n */\n\nimport type { DetectorResult, Document } from \"../models\";\nimport type { ReputationConfig } from \"../config\";\nimport { extractDomain, detectSuspiciousPatterns } from \"../utils/hashing\";\nimport { BaseDetector, type DetectOptions } from \"./base\";\n\n/** Curated high-trust domains. */\nconst TRUSTED_DOMAINS: Record<string, number> = {\n // Security vendors\n \"crowdstrike.com\": 0.95, \"mandiant.com\": 0.95, \"paloaltonetworks.com\": 0.9,\n \"fortinet.com\": 0.9, \"sentinelone.com\": 0.9, \"trendmicro.com\": 0.9,\n \"kaspersky.com\": 0.85, \"sophos.com\": 0.9, \"elastic.co\": 0.85,\n // Government / standards\n \"nist.gov\": 0.95, \"cisa.gov\": 0.95, \"nvd.nist.gov\": 0.95,\n \"mitre.org\": 0.95, \"us-cert.gov\": 0.95,\n // Major tech\n \"microsoft.com\": 0.9, \"google.com\": 0.9, \"aws.amazon.com\": 0.9,\n \"cloud.google.com\": 0.9, \"docs.github.com\": 0.85,\n // Academic / research\n \"arxiv.org\": 0.85, \"ieee.org\": 0.9, \"acm.org\": 0.9,\n \"usenix.org\": 0.9, \"springer.com\": 0.85,\n // AI / ML specific\n \"openai.com\": 0.85, \"anthropic.com\": 0.85, \"huggingface.co\": 0.8,\n \"langchain.com\": 0.8, \"llamaindex.ai\": 0.8,\n // Known documentation\n \"docs.python.org\": 0.9, \"stackoverflow.com\": 0.75,\n \"wikipedia.org\": 0.7,\n};\n\nconst LOW_TRUST_PATTERNS = [\n \"blogspot.com\", \"wordpress.com\", \"medium.com\", \"substack.com\",\n \"pastebin.com\", \"hastebin.com\",\n];\n\nconst EXPECTED_METADATA_FIELDS = [\"source\", \"author\", \"date\", \"title\"];\n\nexport class SourceReputationDetector extends BaseDetector {\n readonly name = \"source_reputation\";\n\n private unknownDomainScore: number;\n private metadataWeight: number;\n private contentQualityWeight: number;\n private trustedDomains: Record<string, number>;\n\n constructor(\n config: ReputationConfig,\n customTrustedDomains?: Record<string, number>\n ) {\n super();\n this.unknownDomainScore = config.unknownDomainScore;\n this.metadataWeight = config.metadataWeight;\n this.contentQualityWeight = config.contentQualityWeight;\n this.trustedDomains = { ...TRUSTED_DOMAINS, ...customTrustedDomains };\n }\n\n detect(documents: Document[], _options?: DetectOptions): DetectorResult {\n if (documents.length === 0) {\n return {\n detectorName: this.name,\n riskScore: 0,\n flaggedIndices: [],\n details: { reason: \"no_documents\" },\n };\n }\n\n const docReputations: Record<string, unknown>[] = [];\n const flagged: number[] = [];\n\n for (let i = 0; i < documents.length; i++) {\n const rep = this.scoreDocument(documents[i]);\n docReputations.push(rep);\n if ((rep.reputation_score as number) < 0.4) {\n flagged.push(i);\n }\n }\n\n const minRep = Math.min(\n ...docReputations.map((r) => r.reputation_score as number)\n );\n const overallRisk = 1.0 - minRep;\n\n return {\n detectorName: this.name,\n riskScore: Math.min(overallRisk, 1.0),\n flaggedIndices: flagged,\n details: {\n per_document_reputation: docReputations,\n },\n };\n }\n\n private scoreDocument(doc: Document): Record<string, unknown> {\n const domainScore = this.domainScore(doc);\n const metadataScore = this.metadataCompleteness(doc);\n const qualityScore = this.contentQuality(doc);\n\n const domainWeight = 1.0 - this.metadataWeight - this.contentQualityWeight;\n const finalScore =\n domainWeight * domainScore +\n this.metadataWeight * metadataScore +\n this.contentQualityWeight * qualityScore;\n\n return {\n reputation_score: Math.round(finalScore * 10000) / 10000,\n domain_score: Math.round(domainScore * 10000) / 10000,\n metadata_score: Math.round(metadataScore * 10000) / 10000,\n quality_score: Math.round(qualityScore * 10000) / 10000,\n domain: this.getDomain(doc),\n };\n }\n\n private domainScore(doc: Document): number {\n const domain = this.getDomain(doc);\n if (!domain) return this.unknownDomainScore;\n\n // Exact match\n if (domain in this.trustedDomains) {\n return this.trustedDomains[domain];\n }\n\n // Parent domain (e.g., \"blog.google.com\" -> \"google.com\")\n const parts = domain.split(\".\");\n if (parts.length > 2) {\n const parent = parts.slice(-2).join(\".\");\n if (parent in this.trustedDomains) {\n return this.trustedDomains[parent] * 0.9;\n }\n }\n\n // Low-trust patterns\n for (const pattern of LOW_TRUST_PATTERNS) {\n if (domain.includes(pattern)) return 0.3;\n }\n\n return this.unknownDomainScore;\n }\n\n private getDomain(doc: Document): string | null {\n const source =\n (doc.metadata.source as string) ?? (doc.metadata.url as string) ?? \"\";\n return source ? extractDomain(source) : null;\n }\n\n private metadataCompleteness(doc: Document): number {\n const present = EXPECTED_METADATA_FIELDS.filter(\n (field) => doc.metadata[field]\n ).length;\n return present / EXPECTED_METADATA_FIELDS.length;\n }\n\n private contentQuality(doc: Document): number {\n if (!doc.content.trim()) return 0;\n\n const patterns = detectSuspiciousPatterns(doc.content);\n const penalty =\n (patterns.promotional ? 0.4 : 0) +\n (patterns.repetitive ? 0.3 : 0) +\n (patterns.unicodeAnomalies ? 0.3 : 0);\n\n return Math.max(1.0 - penalty, 0);\n }\n}\n","/**\n * Detection engines for identifying adversarial documents in RAG pipelines.\n */\n\nexport { BaseDetector } from \"./base\";\nexport type { DetectOptions } from \"./base\";\nexport { ConsensusClusteringDetector } from \"./consensus\";\nexport { SemanticAnomalyDetector } from \"./anomaly\";\nexport { SourceReputationDetector } from \"./reputation\";\n\nimport type { BaseDetector } from \"./base\";\nimport type { RAGuardConfig } from \"../config\";\nimport { ConsensusClusteringDetector } from \"./consensus\";\nimport { SemanticAnomalyDetector } from \"./anomaly\";\nimport { SourceReputationDetector } from \"./reputation\";\n\ntype DetectorFactory = (config: RAGuardConfig) => BaseDetector;\n\nexport const DETECTOR_REGISTRY: Record<string, DetectorFactory> = {\n consensus_clustering: (config) =>\n new ConsensusClusteringDetector(config.consensus),\n semantic_anomaly: (config) =>\n new SemanticAnomalyDetector(config.anomaly),\n source_reputation: (config) =>\n new SourceReputationDetector(config.reputation),\n};\n","/**\n * RAGuard SDK — the main entry point for scanning RAG documents.\n *\n * Usage:\n * // Local mode (open-source, no API key needed)\n * const guard = new RAGuard();\n * const result = await guard.scan(docs, { query: \"What is CVE-2024-1234?\" });\n * const safeDocs = await guard.filter(docs, { query: \"What is CVE-2024-1234?\" });\n *\n * // Hosted API mode (coming soon)\n * const guard = new RAGuard({ apiKey: \"rg_live_xxxxx\" });\n */\n\nimport {\n Document,\n Recommendation,\n type DocumentInput,\n type ScanResult,\n type ScanOptions,\n type DetectorResult,\n} from \"./models\";\nimport { type RAGuardConfig, mergeConfig } from \"./config\";\nimport { DETECTOR_REGISTRY, type BaseDetector } from \"./detectors\";\nimport { encodeTexts } from \"./utils/embeddings\";\nimport { randomId } from \"./utils/hashing\";\n\nexport interface RAGuardOptions {\n apiKey?: string;\n config?: Partial<RAGuardConfig>;\n detectors?: string[];\n apiUrl?: string;\n}\n\nexport class RAGuard {\n private config: RAGuardConfig;\n private detectors: BaseDetector[];\n\n constructor(options?: RAGuardOptions) {\n // API mode — coming soon\n if (options?.apiKey) {\n throw new Error(\n \"RAGuard API mode is coming soon! For now, use local mode (no API key needed):\\n\\n\" +\n \" const guard = new RAGuard(); // local mode\\n\" +\n ' const result = await guard.scan(docs, { query: \"...\" });\\n\\n' +\n \"Follow https://www.raguard.deepseal.ai for API launch updates.\"\n );\n }\n\n this.config = mergeConfig(options?.config);\n\n // Override enabled detectors if specified\n if (options?.detectors) {\n this.config.enabledDetectors = options.detectors;\n }\n\n this.detectors = this.initDetectors();\n }\n\n private initDetectors(): BaseDetector[] {\n const instances: BaseDetector[] = [];\n for (const name of this.config.enabledDetectors) {\n const factory = DETECTOR_REGISTRY[name];\n if (!factory) {\n throw new Error(\n `Unknown detector: ${name}. Available: ${Object.keys(DETECTOR_REGISTRY).join(\", \")}`\n );\n }\n instances.push(factory(this.config));\n }\n return instances;\n }\n\n /**\n * Scan documents for adversarial threats.\n *\n * @param documents - Array of documents (Document objects, plain objects, or strings).\n * @param options - Scan options including the original query.\n * @returns ScanResult with risk scores, flagged documents, and recommendation.\n */\n async scan(\n documents: (Document | DocumentInput | string)[],\n options?: ScanOptions\n ): Promise<ScanResult> {\n const start = performance.now();\n const normalized = RAGuard.normalizeDocuments(documents);\n return this.scanLocal(normalized, options?.query, start);\n }\n\n /**\n * Convenience method: scan and return only safe documents.\n *\n * @param documents - Array of documents to scan.\n * @param options - Scan options including the original query.\n * @returns Array of documents that passed all safety checks.\n */\n async filter(\n documents: (Document | DocumentInput | string)[],\n options?: ScanOptions\n ): Promise<Document[]> {\n const normalized = RAGuard.normalizeDocuments(documents);\n const result = await this.scan(normalized, options);\n const flaggedSet = new Set(result.flaggedDocuments);\n return normalized.filter((_, i) => !flaggedSet.has(i));\n }\n\n private scanLocal(\n documents: Document[],\n query: string | undefined,\n startTime: number\n ): ScanResult {\n // Pre-compute embeddings once (shared across detectors)\n const embeddings = encodeTexts(documents.map((d) => d.content));\n const queryEmbedding = query ? encodeTexts([query]) : undefined;\n\n // Run all detectors\n const detectorResults: Record<string, DetectorResult> = {};\n const allFlagged = new Set<number>();\n\n for (const detector of this.detectors) {\n const result = detector.detect(documents, {\n query,\n embeddings,\n queryEmbedding,\n });\n detectorResults[detector.name] = result;\n for (const idx of result.flaggedIndices) {\n allFlagged.add(idx);\n }\n }\n\n // Aggregate risk score (max across detectors)\n const riskScores = Object.values(detectorResults).map((r) => r.riskScore);\n const overallRisk = riskScores.length > 0 ? Math.max(...riskScores) : 0;\n\n // Determine recommendation\n let recommendation: Recommendation;\n if (overallRisk >= this.config.riskThreshold) {\n recommendation = Recommendation.BLOCK;\n } else if (overallRisk >= this.config.warningThreshold) {\n recommendation = Recommendation.CITE_WITH_WARNING;\n } else {\n recommendation = Recommendation.PROCEED;\n }\n\n const latencyMs = performance.now() - startTime;\n\n return {\n safe: overallRisk < this.config.warningThreshold,\n overallRiskScore: Math.round(overallRisk * 10000) / 10000,\n recommendation,\n flaggedDocuments: Array.from(allFlagged).sort((a, b) => a - b),\n detectors: detectorResults,\n scanId: randomId() + randomId(),\n latencyMs: Math.round(latencyMs * 100) / 100,\n documentsScanned: documents.length,\n };\n }\n\n /**\n * Normalize various input formats into Document objects.\n */\n static normalizeDocuments(\n documents: (Document | DocumentInput | string)[]\n ): Document[] {\n return documents.map((doc) => {\n if (doc instanceof Document) return doc;\n if (typeof doc === \"string\") return new Document(doc);\n if (typeof doc === \"object\" && doc !== null) {\n if (\"content\" in doc) {\n return new Document(doc as DocumentInput);\n }\n if (\"page_content\" in doc) {\n // LangChain Document format\n return new Document({\n content: (doc as Record<string, unknown>).page_content as string,\n metadata: (doc as Record<string, unknown>).metadata as Record<string, unknown> | undefined,\n });\n }\n throw new Error(\n `Object must have 'content' or 'page_content' key: ${JSON.stringify(doc)}`\n );\n }\n throw new TypeError(`Unsupported document type: ${typeof doc}`);\n });\n }\n}\n","/**\n * RAGuard — Security middleware for RAG pipelines.\n */\n\nexport { RAGuard } from \"./raguard\";\nexport type { RAGuardOptions } from \"./raguard\";\n\nexport {\n Document,\n Recommendation,\n type DocumentInput,\n type DetectorResult,\n type ScanResult,\n type ScanOptions,\n} from \"./models\";\n\nexport {\n type RAGuardConfig,\n type ConsensusConfig,\n type AnomalyConfig,\n type ReputationConfig,\n DEFAULT_CONFIG,\n} from \"./config\";\n\nexport const VERSION = \"0.0.0\";\n"]}
|