Add per-part PII/secrets detection for multimodal messages (#47)
authorStefan Gasser <redacted>
Sat, 17 Jan 2026 19:32:54 +0000 (20:32 +0100)
committerGitHub <redacted>
Sat, 17 Jan 2026 19:32:54 +0000 (20:32 +0100)
commit050273513d27dc4e97ffad6807122bde22199e61
tree418ff676a417eabd05c14a7f9f641072ba8aa298
parentc3d98b46b3ed927d568225c51e928826525d70f8
Add per-part PII/secrets detection for multimodal messages (#47)

Each text block in multimodal messages is now analyzed separately
rather than concatenating all text together. This enables precise
masking while preserving message structure.

Changes:
- Per-part detection for both PII and secrets
- Symmetric pii/ and secrets/ module structure
- Shared utilities in utils/message-transform.ts
- Rename "redact" → "mask" for consistency
- Centralize MaskResult, Span interfaces

Breaking changes:
- Header: X-PasteGuard-Secrets-Redacted → X-PasteGuard-Secrets-Masked
- Config: secrets_detection.action "redact" → "mask"
41 files changed:
config.example.yaml
docs/api-reference/chat-completions.mdx
docs/concepts/secrets-detection.mdx
docs/configuration/secrets-detection.mdx
src/config.ts
src/constants/languages.ts [new file with mode: 0644]
src/index.ts
src/pii/detect.test.ts [moved from src/services/pii-detector.test.ts with 79% similarity]
src/pii/detect.ts [moved from src/services/pii-detector.ts with 75% similarity]
src/pii/mask.test.ts [new file with mode: 0644]
src/pii/mask.ts [new file with mode: 0644]
src/routes/info.ts
src/routes/proxy.ts
src/secrets/detect.test.ts
src/secrets/detect.ts
src/secrets/mask.test.ts [new file with mode: 0644]
src/secrets/mask.ts [new file with mode: 0644]
src/secrets/multimodal.test.ts
src/secrets/patterns/api-keys.ts
src/secrets/patterns/env-vars.ts
src/secrets/patterns/private-keys.ts
src/secrets/patterns/tokens.ts
src/secrets/patterns/types.ts
src/secrets/patterns/utils.ts
src/secrets/redact.test.ts [deleted file]
src/secrets/redact.ts [deleted file]
src/services/decision.test.ts
src/services/decision.ts
src/services/language-detector.ts
src/services/masking.test.ts [deleted file]
src/services/masking.ts [deleted file]
src/services/stream-transformer.test.ts
src/services/stream-transformer.ts
src/test-utils/detection-results.ts [new file with mode: 0644]
src/utils/conflict-resolver.ts
src/utils/content.test.ts
src/utils/content.ts
src/utils/message-transform.test.ts [new file with mode: 0644]
src/utils/message-transform.ts [new file with mode: 0644]
src/utils/placeholders.test.ts [moved from src/constants/placeholders.test.ts with 93% similarity]
src/utils/placeholders.ts [moved from src/constants/placeholders.ts with 87% similarity]
git clone https://git.99rst.org/PROJECT