const secretPatterns: { pattern: RegExp; replacement: string }[] = [ { pattern: /ghs_[A-Za-z0-9_]+/g, replacement: '[redacted]' }, { pattern: /github_pat_[A-Za-z0-9_]+/g, replacement: '[redacted]' }, { pattern: /sk-[A-Za-z0-9_-]+/g, replacement: '[redacted]' }, { pattern: /(client_secret|auth_secret|api_key|token|password)=([^ \n\r]+)/gi, replacement: '$1=[redacted]', }, ]; export const createRedactor = (values: string[]) => { const secrets = values.filter((value) => value.length >= 3); return (input: string) => { let output = input; for (const secret of secrets) { output = output.split(secret).join('[redacted]'); } for (const { pattern, replacement } of secretPatterns) { output = output.replace(pattern, replacement); } return output; }; }; export const truncate = (value: string, maxBytes: number) => { const buffer = Buffer.from(value); if (buffer.byteLength <= maxBytes) return value; return `${buffer.subarray(0, maxBytes).toString('utf8')}\n[truncated]`; };