- AiGatewayService: punct unic de acces la modele (LiteLLM -> OpenRouter). Clasele de actiuni din blueprint 14.3 sunt aplicate hard: high_risk blocat permanent, material blocat pana exista coada de aprobare + idempotency; doar read_only si draft ruleaza. - Spotlighting (design doc Strat 1): continutul untrusted (date Apollo) e impachetat in <untrusted-data> cu instructiune de sistem ca e DATE, nu comenzi -- plus redactie PII deterministica (email/telefon/CNP) inainte sa plece catre provider extern. - ai_requests: adaugat action_class + context_manifest complet (nu doar hash) pentru audit; cost_usd_minor_units (integer) inlocuit cu cost_usd numeric(12,6) -- costurile reale sunt fractiuni de cent. - research-briefs: POST /draft genereaza un rezumat AI din datele Apollo fara sa salveze nimic (clasa draft -- userul revizuieste, apoi salveaza). - briefing: aiExplanation devine narativ real peste prioritizarea determinista; esecul AI intoarce null, nu strica briefingul. - teste: clase de actiuni blocate, spotlighting, redactie PII.
17 lines
806 B
TypeScript
17 lines
806 B
TypeScript
const EMAIL_PATTERN = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
|
|
const PHONE_PATTERN = /(?:\+?\d{1,3}[\s.-]?)?\(?\d{3,4}\)?[\s.-]?\d{3}[\s.-]?\d{3,4}\b/g;
|
|
// CNP romanesc: 1 cifra sex/secol + 6 cifre data + 6 cifre judet/secventa
|
|
const RO_CNP_PATTERN = /\b[12]\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{6}\b/g;
|
|
|
|
/**
|
|
* Redactie deterministica de PII inainte ca orice continut untrusted sa ajunga
|
|
* la un provider extern (blueprint 18: "PII redaction inainte de trimiterea
|
|
* catre API extern"). Regex, nu ML -- Strat 0/1 din design doc: determinist
|
|
* inainte de probabilistic.
|
|
*/
|
|
export function redactPii(text: string): string {
|
|
return text
|
|
.replace(EMAIL_PATTERN, '[EMAIL_REDACTED]')
|
|
.replace(RO_CNP_PATTERN, '[CNP_REDACTED]')
|
|
.replace(PHONE_PATTERN, '[PHONE_REDACTED]');
|
|
}
|