openAgent

gitlab

The open source UNIVERSAL agent.

0 stars0 forksupdated 2d agodefault branch: dev
clonehttps://gitlab.com/bitzzdev/openAgent.git
AIagentautomationopen-sourceuniversal-agent
@ dev
export * as SecretRedactor from "./redactor"
const secretValues = new Set<string>()
const secretKeys = new Map<string, string>() // value -> keyName
export function register(secret: string, keyName?: string): void {
if (!secret || typeof secret !== "string" || secret.trim().length < 4) return
const 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) continue
const 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 input
let result = input
// Redact known registered secret values
for (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 patterns
for (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 obj
if (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 secrets
registerFromEnv()