openAgent
gitlabThe open source UNIVERSAL agent.
clone
https://gitlab.com/bitzzdev/openAgent.gitAIagentautomationopen-sourceuniversal-agent
export * as SecretRedactor from "./redactor"const secretValues = new Set<string>()const secretKeys = new Map<string, string>() // value -> keyNameexport function register(secret: string, keyName?: string): void {if (!secret || typeof secret !== "string" || secret.trim().length < 4) returnconst trimmed = secret.trim()secretValues.add(trimmed)if (keyName) {secretKeys.set(trimmed, keyName)}}export function registerFromEnv(): void {for (const [key, value] of Object.entries(process.env)) {if (!value || typeof value !== "string" || value.length < 4) continueconst upper = key.toUpperCase()if (upper.includes("KEY") ||upper.includes("TOKEN") ||upper.includes("SECRET") ||upper.includes("PASSWORD") ||upper.includes("AUTH")) {register(value, key)}}}// Common credential pattern detectors (OpenAI, Anthropic, GitHub, Slack, AWS, generic tokens)const sensitivePatterns = [/(?:Bearer\s+)([a-zA-Z0-9_\-\.]{16,})/gi,/(?:sk-[a-zA-Z0-9_\-]{20,})/gi,/(?:ghp_[a-zA-Z0-9]{36})/gi,/(?:gho_[a-zA-Z0-9]{36})/gi,/(?:ghu_[a-zA-Z0-9]{36})/gi,/(?:ghs_[a-zA-Z0-9]{36})/gi,/(?:ghr_[a-zA-Z0-9]{36})/gi,/(?:xox[baprs]-[0-9a-zA-Z]{10,48})/gi,/(?:AKIA[0-9A-Z]{16})/gi,]export function redact(input: string): string {if (!input || typeof input !== "string") return inputlet result = input// Redact known registered secret valuesfor (const secret of secretValues) {if (result.includes(secret)) {const keyName = secretKeys.get(secret)const replacement = keyName ? `[REDACTED:${keyName}]` : "[REDACTED]"result = result.replaceAll(secret, replacement)}}// Redact known sensitive patternsfor (const pattern of sensitivePatterns) {result = result.replace(pattern, (match) => {if (match.startsWith("Bearer ")) {return "Bearer [REDACTED]"}return "[REDACTED]"})}return result}export function redactObject<T>(obj: T): T {if (obj === null || obj === undefined) return objif (typeof obj === "string") {return redact(obj) as unknown as T}if (Array.isArray(obj)) {return obj.map((item) => redactObject(item)) as unknown as T}if (typeof obj === "object") {const copy = { ...obj } as Record<string, unknown>for (const [k, v] of Object.entries(copy)) {const upper = k.toUpperCase()if ((upper.includes("PASSWORD") ||upper.includes("SECRET") ||upper.includes("TOKEN") ||upper.includes("KEY")) &&typeof v === "string") {copy[k] = "[REDACTED]"} else {copy[k] = redactObject(v)}}return copy as unknown as T}return obj}// Initialize redactor with process.env secretsregisterFromEnv()