const PATTERNS: Array<{ kind: string; re: RegExp }> = [ { kind: "openai-key", re: /\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/g }, { kind: "anthropic-key", re: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/g }, { kind: "aws-access-key", re: /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g }, { kind: "github-token", re: /\bgh[opsur]_[A-Za-z0-9]{36,}\b/g }, { kind: "github-pat", re: /\bgithub_pat_[A-Za-z0-9_]{40,}\b/g }, { kind: "google-api-key", re: /\bAIza[0-9A-Za-z_-]{35}\b/g }, { kind: "slack-token", re: /\bxox[bpsare]-[A-Za-z0-9-]{10,}\b/g }, { kind: "stripe-key", re: /\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{24,}\b/g }, { kind: "jwt", re: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g }, { kind: "bearer", re: /\bBearer\s+[A-Za-z0-9._-]{20,}/g }, { kind: "env-assign", re: /\b((?:[A-Z][A-Z0-9_]*)?(?:API[_-]?KEY|SECRET(?:[_-]?KEY)?|ACCESS[_-]?TOKEN|AUTH[_-]?TOKEN|PASSWORD|PASSWD|PRIVATE[_-]?KEY|CLIENT[_-]?SECRET)[A-Z0-9_]*)\s*[:=]\s*(["']?)([^\s"';|&]+)\2/gi, }, ]; export function redactSensitive(text: string): string { let out = text; for (const { kind, re } of PATTERNS) { if (kind === "env-assign") { out = out.replace(re, (_m, name, q, _val) => `${name}=${q}${q}`); } else { out = out.replace(re, ``); } } return out; }