@chatpanel/pii
v0.2.14
Published
The canonical ChatPanel privacy engine — reversible PII redaction + pseudonymization with local entity detection. Pure, dependency-free ESM shared by the ChatPanel extension, gateway, and bridge.
Maintainers
Readme
chatpanel-pii
The canonical ChatPanel privacy engine — reversible PII redaction + pseudonymization with local entity detection. Pure, dependency-free ESM. This is the single source of truth shared by the ChatPanel extension, gateway, and bridge: a privacy feature added here is picked up by all of them.
import { createVault, redactText, restoreText, detectEntities } from '@chatpanel/pii';
const vault = createVault();
const safe = redactText('email [email protected]', vault, { tier: 'basic' });
// → 'email [[EMAIL_1]]'
restoreText(safe, vault);
// → 'email [email protected]'The model only ever sees opaque, stable placeholders like [[PERSON_1]] /
[[EMAIL_2]], so it can still reason about who said what without seeing the
real values — and they're reconstructed locally on the way back.
What's inside
| Module | Exports | Role |
|--------|---------|------|
| pii-redact.js | createVault, redactText, restoreText, restoreWithAliases, vaultToJSON/vaultFromJSON, hasToken | deterministic redact/restore + the per-conversation vault |
| pii-detect.js | detectEntities, normalizeEntities, EXTRACT_SYS, … | local entity detection (any HTTP NER endpoint, or a local OpenAI-compatible LLM) |
| pipeline.js | redactOutbound, makeStreamRestorer, restore, restoreDeep, redactResult, effectiveTier, gatedDictionary, gatedScope | pure turn orchestration + the free/Pro tier, scope, and dictionary gating |
Import the barrel (@chatpanel/pii) or a submodule
(@chatpanel/pii/pii-redact.js).
Tiers
basic— deterministic regex: emails, phones, IPs, cards (Luhn), SSNs, API keys, plus a small user dictionary.full— basic + entity-aware: detected people / orgs / locations and an unlimited custom dictionary.effectiveTier(cfg, isPro)downgradesfull→basicfor non-Pro callers, so consumers enforce free/Pro identically.
A dictionary entry with an alias pseudonymizes (permanent substitution the
model and the user both see); without one it redacts to a reversible token.
Design notes
- Pure + dependency-free so it unit-tests trivially and runs identically in a browser extension, a Node proxy, and a CLI bridge.
- Reversibility is best-effort: if a model paraphrases a placeholder instead of echoing it, that reference won't restore — but the privacy guarantee (the real value never left the device) always holds.
License
Source-available under the same license as the rest of ChatPanel — see LICENSE.
