feat: companion 核心的人設注入、語氣、心情標記與互動記憶

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 13:27:34 +08:00
co-authored by Claude Sonnet 5.5
parent 030c599208
commit 83fd180872
10 changed files with 638 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
// 疑似金鑰:寫入互動記憶與注入內容前一律過濾
const PATTERNS: RegExp[] = [
/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g,
/\bsk-[A-Za-z0-9_-]{16,}/g,
/\b(?:ghp|gho|ghu|ghs|ghr|glpat|xox[baprs])[-_][A-Za-z0-9_-]{10,}/g,
/\bAKIA[0-9A-Z]{16}\b/g,
/\bBearer\s+[A-Za-z0-9._~+/=-]{16,}/gi,
/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,
/\b(?:api[_-]?key|secret|token|passwd|password|pwd)\s*[:=]\s*\S{6,}/gi,
/\b[A-Za-z0-9+/_-]{32,}={0,2}(?![A-Za-z0-9])/g,
]
export const REDACTED = '[已遮蔽]'
export function redactSecrets(text: string): string {
return PATTERNS.reduce((s, re) => s.replace(re, REDACTED), text)
}
export function hasSecret(text: string): boolean {
return redactSecrets(text) !== text
}