visus-mcp 0.6.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +6 -1
- package/.env.status +7 -0
- package/CHANGELOG.md +65 -0
- package/CLAUDE.md +3 -0
- package/README.md +15 -7
- package/SECURITY.md +2 -0
- package/STATUS.md +203 -9
- package/dist/content-handlers/index.d.ts +36 -0
- package/dist/content-handlers/index.d.ts.map +1 -0
- package/dist/content-handlers/index.js +59 -0
- package/dist/content-handlers/index.js.map +1 -0
- package/dist/content-handlers/json-handler.d.ts +28 -0
- package/dist/content-handlers/json-handler.d.ts.map +1 -0
- package/dist/content-handlers/json-handler.js +116 -0
- package/dist/content-handlers/json-handler.js.map +1 -0
- package/dist/content-handlers/pdf-handler.d.ts +29 -0
- package/dist/content-handlers/pdf-handler.d.ts.map +1 -0
- package/dist/content-handlers/pdf-handler.js +77 -0
- package/dist/content-handlers/pdf-handler.js.map +1 -0
- package/dist/content-handlers/svg-handler.d.ts +35 -0
- package/dist/content-handlers/svg-handler.d.ts.map +1 -0
- package/dist/content-handlers/svg-handler.js +206 -0
- package/dist/content-handlers/svg-handler.js.map +1 -0
- package/dist/content-handlers/types.d.ts +42 -0
- package/dist/content-handlers/types.d.ts.map +1 -0
- package/dist/content-handlers/types.js +7 -0
- package/dist/content-handlers/types.js.map +1 -0
- package/dist/tools/fetch.d.ts.map +1 -1
- package/dist/tools/fetch.js +62 -4
- package/dist/tools/fetch.js.map +1 -1
- package/package.json +2 -1
- package/server.json +2 -2
- package/src/content-handlers/index.ts +72 -0
- package/src/content-handlers/json-handler.ts +137 -0
- package/src/content-handlers/pdf-handler.ts +91 -0
- package/src/content-handlers/svg-handler.ts +243 -0
- package/src/content-handlers/types.ts +44 -0
- package/src/tools/fetch.ts +69 -4
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -47
- package/.github/ISSUE_TEMPLATE/false_positive.md +0 -43
- package/.github/ISSUE_TEMPLATE/new_pattern.md +0 -49
- package/.github/ISSUE_TEMPLATE/security_report.md +0 -31
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -39
- package/.mcpregistry_github_token +0 -1
- package/.mcpregistry_registry_token +0 -1
- package/CONTRIBUTING.md +0 -329
- package/LINKEDIN-STRATEGY.md +0 -367
- package/ROADMAP.md +0 -221
- package/SECURITY-AUDIT-v1.md +0 -277
- package/SUBMISSION.md +0 -66
- package/TROUBLESHOOT-AUTH-20260322-2019.md +0 -291
- package/TROUBLESHOOT-BUILD-20260319-1450.md +0 -546
- package/TROUBLESHOOT-COGNITO-AUTH-20260324-2029.md +0 -415
- package/TROUBLESHOOT-COGNITO-JWT-20260324.md +0 -592
- package/TROUBLESHOOT-FETCH-20260320-1150.md +0 -168
- package/TROUBLESHOOT-JEST-20260323-1357.md +0 -139
- package/TROUBLESHOOT-LAMBDA-20260322-1945.md +0 -183
- package/TROUBLESHOOT-PLAYWRIGHT-20260321-1549.md +0 -217
- package/TROUBLESHOOT-SSL-20260320-1138.md +0 -171
- package/TROUBLESHOOT-STRUCTURED-20260320-1200.md +0 -246
- package/TROUBLESHOOT-TEST-20260320-0942.md +0 -281
- package/VISUS-CLAUDE-CODE-PROMPT.md +0 -324
- package/VISUS-PROJECT-PLAN.md +0 -205
- package/cdk.json +0 -73
- package/infrastructure/app.ts +0 -39
- package/infrastructure/stack.ts +0 -298
- package/jest.config.js +0 -33
- package/jest.setup.js +0 -9
- package/lambda-deploy/index.js +0 -81512
- package/lambda-deploy/index.js.map +0 -7
- package/lambda-package/browser/__mocks__/playwright-renderer.d.ts +0 -25
- package/lambda-package/browser/__mocks__/playwright-renderer.d.ts.map +0 -1
- package/lambda-package/browser/__mocks__/playwright-renderer.js +0 -119
- package/lambda-package/browser/__mocks__/playwright-renderer.js.map +0 -1
- package/lambda-package/browser/playwright-renderer.d.ts +0 -40
- package/lambda-package/browser/playwright-renderer.d.ts.map +0 -1
- package/lambda-package/browser/playwright-renderer.js +0 -214
- package/lambda-package/browser/playwright-renderer.js.map +0 -1
- package/lambda-package/browser/reader.d.ts +0 -31
- package/lambda-package/browser/reader.d.ts.map +0 -1
- package/lambda-package/browser/reader.js +0 -98
- package/lambda-package/browser/reader.js.map +0 -1
- package/lambda-package/index.d.ts +0 -18
- package/lambda-package/index.d.ts.map +0 -1
- package/lambda-package/index.js +0 -238
- package/lambda-package/index.js.map +0 -1
- package/lambda-package/lambda-handler.d.ts +0 -28
- package/lambda-package/lambda-handler.d.ts.map +0 -1
- package/lambda-package/lambda-handler.js +0 -257
- package/lambda-package/lambda-handler.js.map +0 -1
- package/lambda-package/package-lock.json +0 -7435
- package/lambda-package/package.json +0 -74
- package/lambda-package/runtime.d.ts +0 -50
- package/lambda-package/runtime.d.ts.map +0 -1
- package/lambda-package/runtime.js +0 -86
- package/lambda-package/runtime.js.map +0 -1
- package/lambda-package/sanitizer/elicit-runner.d.ts +0 -48
- package/lambda-package/sanitizer/elicit-runner.d.ts.map +0 -1
- package/lambda-package/sanitizer/elicit-runner.js +0 -100
- package/lambda-package/sanitizer/elicit-runner.js.map +0 -1
- package/lambda-package/sanitizer/framework-mapper.d.ts +0 -24
- package/lambda-package/sanitizer/framework-mapper.d.ts.map +0 -1
- package/lambda-package/sanitizer/framework-mapper.js +0 -342
- package/lambda-package/sanitizer/framework-mapper.js.map +0 -1
- package/lambda-package/sanitizer/hitl-gate.d.ts +0 -69
- package/lambda-package/sanitizer/hitl-gate.d.ts.map +0 -1
- package/lambda-package/sanitizer/hitl-gate.js +0 -101
- package/lambda-package/sanitizer/hitl-gate.js.map +0 -1
- package/lambda-package/sanitizer/index.d.ts +0 -63
- package/lambda-package/sanitizer/index.d.ts.map +0 -1
- package/lambda-package/sanitizer/index.js +0 -105
- package/lambda-package/sanitizer/index.js.map +0 -1
- package/lambda-package/sanitizer/injection-detector.d.ts +0 -34
- package/lambda-package/sanitizer/injection-detector.d.ts.map +0 -1
- package/lambda-package/sanitizer/injection-detector.js +0 -89
- package/lambda-package/sanitizer/injection-detector.js.map +0 -1
- package/lambda-package/sanitizer/patterns.d.ts +0 -30
- package/lambda-package/sanitizer/patterns.d.ts.map +0 -1
- package/lambda-package/sanitizer/patterns.js +0 -372
- package/lambda-package/sanitizer/patterns.js.map +0 -1
- package/lambda-package/sanitizer/pii-allowlist.d.ts +0 -49
- package/lambda-package/sanitizer/pii-allowlist.d.ts.map +0 -1
- package/lambda-package/sanitizer/pii-allowlist.js +0 -231
- package/lambda-package/sanitizer/pii-allowlist.js.map +0 -1
- package/lambda-package/sanitizer/pii-redactor.d.ts +0 -41
- package/lambda-package/sanitizer/pii-redactor.d.ts.map +0 -1
- package/lambda-package/sanitizer/pii-redactor.js +0 -213
- package/lambda-package/sanitizer/pii-redactor.js.map +0 -1
- package/lambda-package/sanitizer/severity-classifier.d.ts +0 -33
- package/lambda-package/sanitizer/severity-classifier.d.ts.map +0 -1
- package/lambda-package/sanitizer/severity-classifier.js +0 -113
- package/lambda-package/sanitizer/severity-classifier.js.map +0 -1
- package/lambda-package/sanitizer/threat-reporter.d.ts +0 -66
- package/lambda-package/sanitizer/threat-reporter.d.ts.map +0 -1
- package/lambda-package/sanitizer/threat-reporter.js +0 -163
- package/lambda-package/sanitizer/threat-reporter.js.map +0 -1
- package/lambda-package/tools/fetch-structured.d.ts +0 -51
- package/lambda-package/tools/fetch-structured.d.ts.map +0 -1
- package/lambda-package/tools/fetch-structured.js +0 -237
- package/lambda-package/tools/fetch-structured.js.map +0 -1
- package/lambda-package/tools/fetch.d.ts +0 -49
- package/lambda-package/tools/fetch.d.ts.map +0 -1
- package/lambda-package/tools/fetch.js +0 -131
- package/lambda-package/tools/fetch.js.map +0 -1
- package/lambda-package/tools/read.d.ts +0 -51
- package/lambda-package/tools/read.d.ts.map +0 -1
- package/lambda-package/tools/read.js +0 -127
- package/lambda-package/tools/read.js.map +0 -1
- package/lambda-package/tools/search.d.ts +0 -45
- package/lambda-package/tools/search.d.ts.map +0 -1
- package/lambda-package/tools/search.js +0 -220
- package/lambda-package/tools/search.js.map +0 -1
- package/lambda-package/types.d.ts +0 -167
- package/lambda-package/types.d.ts.map +0 -1
- package/lambda-package/types.js +0 -16
- package/lambda-package/types.js.map +0 -1
- package/lambda-package/utils/format-converter.d.ts +0 -39
- package/lambda-package/utils/format-converter.d.ts.map +0 -1
- package/lambda-package/utils/format-converter.js +0 -191
- package/lambda-package/utils/format-converter.js.map +0 -1
- package/lambda-package/utils/truncate.d.ts +0 -26
- package/lambda-package/utils/truncate.d.ts.map +0 -1
- package/lambda-package/utils/truncate.js +0 -54
- package/lambda-package/utils/truncate.js.map +0 -1
- package/lambda.zip +0 -0
- package/test-output.txt +0 -4
- package/tests/auth-smoke.test.ts +0 -480
- package/tests/elicit-runner.test.ts +0 -232
- package/tests/fetch-tool.test.ts +0 -922
- package/tests/hitl-gate.test.ts +0 -267
- package/tests/injection-corpus.ts +0 -338
- package/tests/pii-allowlist.test.ts +0 -282
- package/tests/reader.test.ts +0 -353
- package/tests/sanitizer.test.ts +0 -358
- package/tests/search.test.ts +0 -456
- package/tests/threat-reporter.test.ts +0 -334
- package/tsconfig.cdk.json +0 -35
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PII Allowlist Configuration
|
|
3
|
-
*
|
|
4
|
-
* Defines trusted phone numbers that should NOT be redacted from web content.
|
|
5
|
-
* Primarily for verified health authority and government emergency numbers.
|
|
6
|
-
*
|
|
7
|
-
* CRITICAL: Only add numbers that are:
|
|
8
|
-
* 1. Publicly published institutional/government numbers
|
|
9
|
-
* 2. Verified health/safety authorities
|
|
10
|
-
* 3. Not personal contact information
|
|
11
|
-
*/
|
|
12
|
-
export interface TrustedPhoneNumber {
|
|
13
|
-
/** Display name for logging */
|
|
14
|
-
name: string;
|
|
15
|
-
/** Normalized phone number variants (all formats this number might appear in) */
|
|
16
|
-
numbers: string[];
|
|
17
|
-
/** Optional: domains where this number is trusted (empty = trusted everywhere) */
|
|
18
|
-
trustedDomains?: string[];
|
|
19
|
-
/** Category for audit logging */
|
|
20
|
-
category: 'emergency' | 'health_authority' | 'government' | 'helpline';
|
|
21
|
-
}
|
|
22
|
-
export interface PIIAllowlistConfig {
|
|
23
|
-
/** When true, trusted numbers only preserved if source domain matches trustedDomains */
|
|
24
|
-
strictDomainMode: boolean;
|
|
25
|
-
/** List of verified trusted phone numbers */
|
|
26
|
-
trustedPhoneNumbers: TrustedPhoneNumber[];
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Normalize a phone number to digits-only format for comparison
|
|
30
|
-
*/
|
|
31
|
-
export declare function normalizePhoneNumber(phone: string): string;
|
|
32
|
-
/**
|
|
33
|
-
* Extract domain from URL (returns hostname without www.)
|
|
34
|
-
*/
|
|
35
|
-
export declare function extractDomain(url: string): string;
|
|
36
|
-
/**
|
|
37
|
-
* Built-in allowlist of verified health authority and emergency numbers
|
|
38
|
-
*/
|
|
39
|
-
export declare const DEFAULT_ALLOWLIST: PIIAllowlistConfig;
|
|
40
|
-
/**
|
|
41
|
-
* Check if a phone number should be allowlisted (not redacted)
|
|
42
|
-
*
|
|
43
|
-
* @param phoneNumber The phone number to check (in any format)
|
|
44
|
-
* @param sourceUrl Optional source URL for domain-scoped allowlisting
|
|
45
|
-
* @param config Optional custom config (defaults to DEFAULT_ALLOWLIST)
|
|
46
|
-
* @returns The trusted number entry if allowlisted, null otherwise
|
|
47
|
-
*/
|
|
48
|
-
export declare function isAllowlistedPhoneNumber(phoneNumber: string, sourceUrl?: string, config?: PIIAllowlistConfig): TrustedPhoneNumber | null;
|
|
49
|
-
//# sourceMappingURL=pii-allowlist.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pii-allowlist.d.ts","sourceRoot":"","sources":["../../src/sanitizer/pii-allowlist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,EAAE,WAAW,GAAG,kBAAkB,GAAG,YAAY,GAAG,UAAU,CAAC;CACxE;AAED,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBA+J/B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,GAAE,kBAAsC,GAC7C,kBAAkB,GAAG,IAAI,CA+C3B"}
|
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PII Allowlist Configuration
|
|
3
|
-
*
|
|
4
|
-
* Defines trusted phone numbers that should NOT be redacted from web content.
|
|
5
|
-
* Primarily for verified health authority and government emergency numbers.
|
|
6
|
-
*
|
|
7
|
-
* CRITICAL: Only add numbers that are:
|
|
8
|
-
* 1. Publicly published institutional/government numbers
|
|
9
|
-
* 2. Verified health/safety authorities
|
|
10
|
-
* 3. Not personal contact information
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* Normalize a phone number to digits-only format for comparison
|
|
14
|
-
*/
|
|
15
|
-
export function normalizePhoneNumber(phone) {
|
|
16
|
-
return phone.replace(/\D/g, '');
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Extract domain from URL (returns hostname without www.)
|
|
20
|
-
*/
|
|
21
|
-
export function extractDomain(url) {
|
|
22
|
-
try {
|
|
23
|
-
const parsedUrl = new URL(url);
|
|
24
|
-
return parsedUrl.hostname.replace(/^www\./, '').toLowerCase();
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return '';
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Built-in allowlist of verified health authority and emergency numbers
|
|
32
|
-
*/
|
|
33
|
-
export const DEFAULT_ALLOWLIST = {
|
|
34
|
-
strictDomainMode: false, // Default: trust globally, not domain-scoped
|
|
35
|
-
trustedPhoneNumbers: [
|
|
36
|
-
// Emergency Services
|
|
37
|
-
{
|
|
38
|
-
name: 'Emergency Services (911)',
|
|
39
|
-
numbers: ['911'],
|
|
40
|
-
category: 'emergency'
|
|
41
|
-
},
|
|
42
|
-
// Poison Control
|
|
43
|
-
{
|
|
44
|
-
name: 'Poison Control Center',
|
|
45
|
-
numbers: [
|
|
46
|
-
'18002221222',
|
|
47
|
-
'8002221222',
|
|
48
|
-
'1-800-222-1222',
|
|
49
|
-
'800-222-1222'
|
|
50
|
-
],
|
|
51
|
-
trustedDomains: [
|
|
52
|
-
'medlineplus.gov',
|
|
53
|
-
'cdc.gov',
|
|
54
|
-
'fda.gov',
|
|
55
|
-
'aapcc.org',
|
|
56
|
-
'poison.org',
|
|
57
|
-
'nih.gov',
|
|
58
|
-
'nlm.nih.gov'
|
|
59
|
-
],
|
|
60
|
-
category: 'health_authority'
|
|
61
|
-
},
|
|
62
|
-
// FDA MedWatch (adverse event reporting)
|
|
63
|
-
{
|
|
64
|
-
name: 'FDA MedWatch',
|
|
65
|
-
numbers: [
|
|
66
|
-
'18003321088',
|
|
67
|
-
'8003321088',
|
|
68
|
-
'1-800-332-1088',
|
|
69
|
-
'800-332-1088'
|
|
70
|
-
],
|
|
71
|
-
trustedDomains: [
|
|
72
|
-
'fda.gov',
|
|
73
|
-
'medlineplus.gov',
|
|
74
|
-
'cdc.gov',
|
|
75
|
-
'nih.gov'
|
|
76
|
-
],
|
|
77
|
-
category: 'health_authority'
|
|
78
|
-
},
|
|
79
|
-
// CDC INFO
|
|
80
|
-
{
|
|
81
|
-
name: 'CDC INFO',
|
|
82
|
-
numbers: [
|
|
83
|
-
'18002324636',
|
|
84
|
-
'8002324636',
|
|
85
|
-
'1-800-232-4636',
|
|
86
|
-
'800-232-4636'
|
|
87
|
-
],
|
|
88
|
-
trustedDomains: [
|
|
89
|
-
'cdc.gov',
|
|
90
|
-
'medlineplus.gov',
|
|
91
|
-
'nih.gov'
|
|
92
|
-
],
|
|
93
|
-
category: 'health_authority'
|
|
94
|
-
},
|
|
95
|
-
// SAMHSA National Helpline (substance abuse/mental health)
|
|
96
|
-
{
|
|
97
|
-
name: 'SAMHSA National Helpline',
|
|
98
|
-
numbers: [
|
|
99
|
-
'18006624357',
|
|
100
|
-
'8006624357',
|
|
101
|
-
'1-800-662-4357',
|
|
102
|
-
'800-662-4357'
|
|
103
|
-
],
|
|
104
|
-
trustedDomains: [
|
|
105
|
-
'samhsa.gov',
|
|
106
|
-
'medlineplus.gov',
|
|
107
|
-
'cdc.gov',
|
|
108
|
-
'nih.gov'
|
|
109
|
-
],
|
|
110
|
-
category: 'helpline'
|
|
111
|
-
},
|
|
112
|
-
// National Suicide Prevention Lifeline
|
|
113
|
-
{
|
|
114
|
-
name: 'National Suicide Prevention Lifeline',
|
|
115
|
-
numbers: [
|
|
116
|
-
'18002738255',
|
|
117
|
-
'8002738255',
|
|
118
|
-
'1-800-273-8255',
|
|
119
|
-
'800-273-8255',
|
|
120
|
-
'988' // New 3-digit code
|
|
121
|
-
],
|
|
122
|
-
trustedDomains: [
|
|
123
|
-
'suicidepreventionlifeline.org',
|
|
124
|
-
'samhsa.gov',
|
|
125
|
-
'medlineplus.gov',
|
|
126
|
-
'cdc.gov',
|
|
127
|
-
'nih.gov'
|
|
128
|
-
],
|
|
129
|
-
category: 'helpline'
|
|
130
|
-
},
|
|
131
|
-
// National Domestic Violence Hotline
|
|
132
|
-
{
|
|
133
|
-
name: 'National Domestic Violence Hotline',
|
|
134
|
-
numbers: [
|
|
135
|
-
'18007997233',
|
|
136
|
-
'8007997233',
|
|
137
|
-
'1-800-799-7233',
|
|
138
|
-
'800-799-7233'
|
|
139
|
-
],
|
|
140
|
-
trustedDomains: [
|
|
141
|
-
'thehotline.org',
|
|
142
|
-
'cdc.gov',
|
|
143
|
-
'medlineplus.gov',
|
|
144
|
-
'nih.gov'
|
|
145
|
-
],
|
|
146
|
-
category: 'helpline'
|
|
147
|
-
},
|
|
148
|
-
// Medicare
|
|
149
|
-
{
|
|
150
|
-
name: 'Medicare',
|
|
151
|
-
numbers: [
|
|
152
|
-
'18006331795',
|
|
153
|
-
'8006331795',
|
|
154
|
-
'1-800-633-1795',
|
|
155
|
-
'800-633-1795'
|
|
156
|
-
],
|
|
157
|
-
trustedDomains: [
|
|
158
|
-
'medicare.gov',
|
|
159
|
-
'cms.gov',
|
|
160
|
-
'medlineplus.gov',
|
|
161
|
-
'nih.gov'
|
|
162
|
-
],
|
|
163
|
-
category: 'government'
|
|
164
|
-
},
|
|
165
|
-
// Veterans Crisis Line
|
|
166
|
-
{
|
|
167
|
-
name: 'Veterans Crisis Line',
|
|
168
|
-
numbers: [
|
|
169
|
-
'18002738255',
|
|
170
|
-
'8002738255',
|
|
171
|
-
'1-800-273-8255',
|
|
172
|
-
'800-273-8255'
|
|
173
|
-
],
|
|
174
|
-
trustedDomains: [
|
|
175
|
-
'va.gov',
|
|
176
|
-
'veteranscrisisline.net',
|
|
177
|
-
'medlineplus.gov',
|
|
178
|
-
'nih.gov'
|
|
179
|
-
],
|
|
180
|
-
category: 'helpline'
|
|
181
|
-
}
|
|
182
|
-
]
|
|
183
|
-
};
|
|
184
|
-
/**
|
|
185
|
-
* Check if a phone number should be allowlisted (not redacted)
|
|
186
|
-
*
|
|
187
|
-
* @param phoneNumber The phone number to check (in any format)
|
|
188
|
-
* @param sourceUrl Optional source URL for domain-scoped allowlisting
|
|
189
|
-
* @param config Optional custom config (defaults to DEFAULT_ALLOWLIST)
|
|
190
|
-
* @returns The trusted number entry if allowlisted, null otherwise
|
|
191
|
-
*/
|
|
192
|
-
export function isAllowlistedPhoneNumber(phoneNumber, sourceUrl, config = DEFAULT_ALLOWLIST) {
|
|
193
|
-
const normalized = normalizePhoneNumber(phoneNumber);
|
|
194
|
-
const sourceDomain = sourceUrl ? extractDomain(sourceUrl) : '';
|
|
195
|
-
for (const trustedEntry of config.trustedPhoneNumbers) {
|
|
196
|
-
// Check if any variant of this trusted number matches
|
|
197
|
-
const matchesNumber = trustedEntry.numbers.some(variant => {
|
|
198
|
-
const normalizedVariant = normalizePhoneNumber(variant);
|
|
199
|
-
return normalized === normalizedVariant;
|
|
200
|
-
});
|
|
201
|
-
if (!matchesNumber) {
|
|
202
|
-
continue; // Number doesn't match, check next entry
|
|
203
|
-
}
|
|
204
|
-
// Number matches - now check domain restrictions
|
|
205
|
-
const hasDomainRestrictions = trustedEntry.trustedDomains && trustedEntry.trustedDomains.length > 0;
|
|
206
|
-
if (!hasDomainRestrictions) {
|
|
207
|
-
// No domain restrictions - trust globally
|
|
208
|
-
return trustedEntry;
|
|
209
|
-
}
|
|
210
|
-
// Has domain restrictions
|
|
211
|
-
if (config.strictDomainMode && !sourceUrl) {
|
|
212
|
-
// Strict mode requires domain match, but no URL provided
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
if (sourceUrl && trustedEntry.trustedDomains) {
|
|
216
|
-
// Check if source domain matches any trusted domain
|
|
217
|
-
const isDomainTrusted = trustedEntry.trustedDomains.some(trustedDomain => {
|
|
218
|
-
return sourceDomain.endsWith(trustedDomain);
|
|
219
|
-
});
|
|
220
|
-
if (isDomainTrusted) {
|
|
221
|
-
return trustedEntry;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
// In non-strict mode, trust the number even if domain doesn't match
|
|
225
|
-
if (!config.strictDomainMode) {
|
|
226
|
-
return trustedEntry;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return null; // No match found
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=pii-allowlist.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pii-allowlist.js","sourceRoot":"","sources":["../../src/sanitizer/pii-allowlist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoBH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,gBAAgB,EAAE,KAAK,EAAE,6CAA6C;IAEtE,mBAAmB,EAAE;QACnB,qBAAqB;QACrB;YACE,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,CAAC,KAAK,CAAC;YAChB,QAAQ,EAAE,WAAW;SACtB;QAED,iBAAiB;QACjB;YACE,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE;gBACP,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,cAAc;aACf;YACD,cAAc,EAAE;gBACd,iBAAiB;gBACjB,SAAS;gBACT,SAAS;gBACT,WAAW;gBACX,YAAY;gBACZ,SAAS;gBACT,aAAa;aACd;YACD,QAAQ,EAAE,kBAAkB;SAC7B;QAED,yCAAyC;QACzC;YACE,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE;gBACP,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,cAAc;aACf;YACD,cAAc,EAAE;gBACd,SAAS;gBACT,iBAAiB;gBACjB,SAAS;gBACT,SAAS;aACV;YACD,QAAQ,EAAE,kBAAkB;SAC7B;QAED,WAAW;QACX;YACE,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE;gBACP,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,cAAc;aACf;YACD,cAAc,EAAE;gBACd,SAAS;gBACT,iBAAiB;gBACjB,SAAS;aACV;YACD,QAAQ,EAAE,kBAAkB;SAC7B;QAED,2DAA2D;QAC3D;YACE,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE;gBACP,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,cAAc;aACf;YACD,cAAc,EAAE;gBACd,YAAY;gBACZ,iBAAiB;gBACjB,SAAS;gBACT,SAAS;aACV;YACD,QAAQ,EAAE,UAAU;SACrB;QAED,uCAAuC;QACvC;YACE,IAAI,EAAE,sCAAsC;YAC5C,OAAO,EAAE;gBACP,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,cAAc;gBACd,KAAK,CAAC,mBAAmB;aAC1B;YACD,cAAc,EAAE;gBACd,+BAA+B;gBAC/B,YAAY;gBACZ,iBAAiB;gBACjB,SAAS;gBACT,SAAS;aACV;YACD,QAAQ,EAAE,UAAU;SACrB;QAED,qCAAqC;QACrC;YACE,IAAI,EAAE,oCAAoC;YAC1C,OAAO,EAAE;gBACP,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,cAAc;aACf;YACD,cAAc,EAAE;gBACd,gBAAgB;gBAChB,SAAS;gBACT,iBAAiB;gBACjB,SAAS;aACV;YACD,QAAQ,EAAE,UAAU;SACrB;QAED,WAAW;QACX;YACE,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE;gBACP,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,cAAc;aACf;YACD,cAAc,EAAE;gBACd,cAAc;gBACd,SAAS;gBACT,iBAAiB;gBACjB,SAAS;aACV;YACD,QAAQ,EAAE,YAAY;SACvB;QAED,uBAAuB;QACvB;YACE,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE;gBACP,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,cAAc;aACf;YACD,cAAc,EAAE;gBACd,QAAQ;gBACR,wBAAwB;gBACxB,iBAAiB;gBACjB,SAAS;aACV;YACD,QAAQ,EAAE,UAAU;SACrB;KACF;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,SAAkB,EAClB,SAA6B,iBAAiB;IAE9C,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACtD,sDAAsD;QACtD,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACxD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACxD,OAAO,UAAU,KAAK,iBAAiB,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,SAAS,CAAC,yCAAyC;QACrD,CAAC;QAED,iDAAiD;QACjD,MAAM,qBAAqB,GAAG,YAAY,CAAC,cAAc,IAAI,YAAY,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAEpG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,0CAA0C;YAC1C,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,0BAA0B;QAC1B,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,yDAAyD;YACzD,SAAS;QACX,CAAC;QAED,IAAI,SAAS,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;YAC7C,oDAAoD;YACpD,MAAM,eAAe,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;gBACvE,OAAO,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAO,YAAY,CAAC;YACtB,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC7B,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,iBAAiB;AAChC,CAAC"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PII Redaction Engine
|
|
3
|
-
*
|
|
4
|
-
* Detects and redacts personally identifiable information (PII) from content
|
|
5
|
-
* to prevent leakage of sensitive data to the LLM.
|
|
6
|
-
*
|
|
7
|
-
* Redacts: emails, phone numbers, SSNs, credit cards, IP addresses
|
|
8
|
-
* Supports allowlisting of trusted institutional phone numbers (e.g., Poison Control)
|
|
9
|
-
*/
|
|
10
|
-
import { type PIIAllowlistConfig } from './pii-allowlist.js';
|
|
11
|
-
export interface PIIRedactionResult {
|
|
12
|
-
content: string;
|
|
13
|
-
pii_types_redacted: string[];
|
|
14
|
-
pii_allowlisted: Array<{
|
|
15
|
-
type: string;
|
|
16
|
-
value: string;
|
|
17
|
-
reason: string;
|
|
18
|
-
}>;
|
|
19
|
-
content_modified: boolean;
|
|
20
|
-
metadata: {
|
|
21
|
-
redaction_counts: Record<string, number>;
|
|
22
|
-
allowlist_counts: Record<string, number>;
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Redact PII from content
|
|
27
|
-
*
|
|
28
|
-
* @param content Content to redact PII from
|
|
29
|
-
* @param sourceUrl Optional source URL for domain-scoped allowlisting
|
|
30
|
-
* @param allowlistConfig Optional custom allowlist config
|
|
31
|
-
*/
|
|
32
|
-
export declare function redactPII(content: string, sourceUrl?: string, allowlistConfig?: PIIAllowlistConfig): PIIRedactionResult;
|
|
33
|
-
/**
|
|
34
|
-
* Check if content contains any PII (without redacting)
|
|
35
|
-
*/
|
|
36
|
-
export declare function containsPII(content: string): boolean;
|
|
37
|
-
/**
|
|
38
|
-
* Get list of PII types detected (without redacting)
|
|
39
|
-
*/
|
|
40
|
-
export declare function detectPIITypes(content: string): string[];
|
|
41
|
-
//# sourceMappingURL=pii-redactor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pii-redactor.d.ts","sourceRoot":"","sources":["../../src/sanitizer/pii-redactor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE;QACR,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC1C,CAAC;CACH;AAuID;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,eAAe,GAAE,kBAAsC,GACtD,kBAAkB,CA2DpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAYpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAcxD"}
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PII Redaction Engine
|
|
3
|
-
*
|
|
4
|
-
* Detects and redacts personally identifiable information (PII) from content
|
|
5
|
-
* to prevent leakage of sensitive data to the LLM.
|
|
6
|
-
*
|
|
7
|
-
* Redacts: emails, phone numbers, SSNs, credit cards, IP addresses
|
|
8
|
-
* Supports allowlisting of trusted institutional phone numbers (e.g., Poison Control)
|
|
9
|
-
*/
|
|
10
|
-
import { isAllowlistedPhoneNumber, DEFAULT_ALLOWLIST } from './pii-allowlist.js';
|
|
11
|
-
/**
|
|
12
|
-
* PII detection patterns with validators
|
|
13
|
-
*/
|
|
14
|
-
const PII_PATTERNS = [
|
|
15
|
-
// Email addresses
|
|
16
|
-
{
|
|
17
|
-
type: 'EMAIL',
|
|
18
|
-
name: 'email',
|
|
19
|
-
regex: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g,
|
|
20
|
-
validator: (match) => {
|
|
21
|
-
// Basic email validation
|
|
22
|
-
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(match);
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
// Phone numbers (US and international formats)
|
|
26
|
-
{
|
|
27
|
-
type: 'PHONE',
|
|
28
|
-
name: 'phone',
|
|
29
|
-
regex: /(\+\d{1,3}[\s-]?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}\b/g,
|
|
30
|
-
validator: (match) => {
|
|
31
|
-
// Remove non-digits and check length
|
|
32
|
-
const digits = match.replace(/\D/g, '');
|
|
33
|
-
return digits.length >= 10 && digits.length <= 15;
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
// US Social Security Numbers
|
|
37
|
-
{
|
|
38
|
-
type: 'SSN',
|
|
39
|
-
name: 'ssn',
|
|
40
|
-
regex: /\b\d{3}[-\s]?\d{2}[-\s]?\d{4}\b/g,
|
|
41
|
-
validator: (match) => {
|
|
42
|
-
const digits = match.replace(/\D/g, '');
|
|
43
|
-
// Basic SSN format check (9 digits)
|
|
44
|
-
if (digits.length !== 9)
|
|
45
|
-
return false;
|
|
46
|
-
// Reject invalid SSN patterns
|
|
47
|
-
if (digits === '000000000')
|
|
48
|
-
return false;
|
|
49
|
-
if (digits.startsWith('000'))
|
|
50
|
-
return false;
|
|
51
|
-
if (digits.startsWith('666'))
|
|
52
|
-
return false;
|
|
53
|
-
if (digits.startsWith('9'))
|
|
54
|
-
return false;
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
// Credit card numbers (13-19 digits with optional separators)
|
|
59
|
-
// Matches: 4-4-4-4 (Visa/MC), 4-6-5 (AmEx), or continuous digits
|
|
60
|
-
{
|
|
61
|
-
type: 'CC',
|
|
62
|
-
name: 'credit_card',
|
|
63
|
-
regex: /\b(?:\d{4}[\s-]?\d{6}[\s-]?\d{5}|\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4,7}|\d{13,19})\b/g,
|
|
64
|
-
validator: (match) => {
|
|
65
|
-
const digits = match.replace(/\D/g, '');
|
|
66
|
-
if (digits.length < 13 || digits.length > 19)
|
|
67
|
-
return false;
|
|
68
|
-
return luhnCheck(digits);
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
// IPv4 addresses
|
|
72
|
-
{
|
|
73
|
-
type: 'IP',
|
|
74
|
-
name: 'ipv4',
|
|
75
|
-
regex: /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g,
|
|
76
|
-
validator: (match) => {
|
|
77
|
-
// Exclude common non-PII patterns like version numbers
|
|
78
|
-
if (match.startsWith('0.0.0'))
|
|
79
|
-
return false;
|
|
80
|
-
if (match.startsWith('255.255.255'))
|
|
81
|
-
return false;
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
// IPv6 addresses (simplified pattern)
|
|
86
|
-
{
|
|
87
|
-
type: 'IP',
|
|
88
|
-
name: 'ipv6',
|
|
89
|
-
regex: /\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b/g,
|
|
90
|
-
validator: () => true
|
|
91
|
-
},
|
|
92
|
-
// US Passport numbers
|
|
93
|
-
{
|
|
94
|
-
type: 'PASSPORT',
|
|
95
|
-
name: 'passport',
|
|
96
|
-
regex: /\b[A-Z]{1,2}\d{6,9}\b/g,
|
|
97
|
-
validator: (match) => {
|
|
98
|
-
// Basic format: 1-2 letters + 6-9 digits
|
|
99
|
-
return /^[A-Z]{1,2}\d{6,9}$/.test(match);
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
// Driver's license patterns (varies by state, general pattern)
|
|
103
|
-
{
|
|
104
|
-
type: 'DL',
|
|
105
|
-
name: 'drivers_license',
|
|
106
|
-
regex: /\b[A-Z]{1,2}\d{5,8}\b/g,
|
|
107
|
-
validator: (match) => {
|
|
108
|
-
// Overlap with passport, but keep for completeness
|
|
109
|
-
return /^[A-Z]{1,2}\d{5,8}$/.test(match);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
];
|
|
113
|
-
/**
|
|
114
|
-
* Luhn algorithm for credit card validation
|
|
115
|
-
*/
|
|
116
|
-
function luhnCheck(digits) {
|
|
117
|
-
let sum = 0;
|
|
118
|
-
let alternate = false;
|
|
119
|
-
for (let i = digits.length - 1; i >= 0; i--) {
|
|
120
|
-
let n = parseInt(digits.charAt(i), 10);
|
|
121
|
-
if (alternate) {
|
|
122
|
-
n *= 2;
|
|
123
|
-
if (n > 9) {
|
|
124
|
-
n = n - 9;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
sum += n;
|
|
128
|
-
alternate = !alternate;
|
|
129
|
-
}
|
|
130
|
-
return sum % 10 === 0;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Redact PII from content
|
|
134
|
-
*
|
|
135
|
-
* @param content Content to redact PII from
|
|
136
|
-
* @param sourceUrl Optional source URL for domain-scoped allowlisting
|
|
137
|
-
* @param allowlistConfig Optional custom allowlist config
|
|
138
|
-
*/
|
|
139
|
-
export function redactPII(content, sourceUrl, allowlistConfig = DEFAULT_ALLOWLIST) {
|
|
140
|
-
const piiTypesRedacted = new Set();
|
|
141
|
-
const redactionCounts = {};
|
|
142
|
-
const allowlistCounts = {};
|
|
143
|
-
const piiAllowlisted = [];
|
|
144
|
-
let sanitizedContent = content;
|
|
145
|
-
for (const pattern of PII_PATTERNS) {
|
|
146
|
-
const matches = Array.from(sanitizedContent.matchAll(pattern.regex));
|
|
147
|
-
for (const match of matches) {
|
|
148
|
-
const matchedText = match[0];
|
|
149
|
-
// Apply validator if present
|
|
150
|
-
if (pattern.validator && !pattern.validator(matchedText)) {
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
// Check allowlist for phone numbers
|
|
154
|
-
if (pattern.type === 'PHONE') {
|
|
155
|
-
const allowlistedEntry = isAllowlistedPhoneNumber(matchedText, sourceUrl, allowlistConfig);
|
|
156
|
-
if (allowlistedEntry) {
|
|
157
|
-
// This is a trusted number - DO NOT redact
|
|
158
|
-
piiAllowlisted.push({
|
|
159
|
-
type: pattern.type,
|
|
160
|
-
value: matchedText,
|
|
161
|
-
reason: `Trusted ${allowlistedEntry.category}: ${allowlistedEntry.name}`
|
|
162
|
-
});
|
|
163
|
-
allowlistCounts[pattern.name] = (allowlistCounts[pattern.name] || 0) + 1;
|
|
164
|
-
continue; // Skip redaction
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// Redact the PII
|
|
168
|
-
sanitizedContent = sanitizedContent.replace(matchedText, `[REDACTED:${pattern.type}]`);
|
|
169
|
-
piiTypesRedacted.add(pattern.name);
|
|
170
|
-
redactionCounts[pattern.name] = (redactionCounts[pattern.name] || 0) + 1;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return {
|
|
174
|
-
content: sanitizedContent,
|
|
175
|
-
pii_types_redacted: Array.from(piiTypesRedacted),
|
|
176
|
-
pii_allowlisted: piiAllowlisted,
|
|
177
|
-
content_modified: sanitizedContent !== content,
|
|
178
|
-
metadata: {
|
|
179
|
-
redaction_counts: redactionCounts,
|
|
180
|
-
allowlist_counts: allowlistCounts
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Check if content contains any PII (without redacting)
|
|
186
|
-
*/
|
|
187
|
-
export function containsPII(content) {
|
|
188
|
-
for (const pattern of PII_PATTERNS) {
|
|
189
|
-
const matches = Array.from(content.matchAll(pattern.regex));
|
|
190
|
-
for (const match of matches) {
|
|
191
|
-
if (!pattern.validator || pattern.validator(match[0])) {
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Get list of PII types detected (without redacting)
|
|
200
|
-
*/
|
|
201
|
-
export function detectPIITypes(content) {
|
|
202
|
-
const detected = new Set();
|
|
203
|
-
for (const pattern of PII_PATTERNS) {
|
|
204
|
-
const matches = Array.from(content.matchAll(pattern.regex));
|
|
205
|
-
for (const match of matches) {
|
|
206
|
-
if (!pattern.validator || pattern.validator(match[0])) {
|
|
207
|
-
detected.add(pattern.name);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
return Array.from(detected);
|
|
212
|
-
}
|
|
213
|
-
//# sourceMappingURL=pii-redactor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pii-redactor.js","sourceRoot":"","sources":["../../src/sanitizer/pii-redactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Severity Classification Engine
|
|
3
|
-
*
|
|
4
|
-
* Maps injection pattern categories to standardized severity levels.
|
|
5
|
-
* Used for threat reporting and compliance documentation.
|
|
6
|
-
*/
|
|
7
|
-
export type Severity = 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
|
|
8
|
-
export type OverallSeverity = Severity | 'CLEAN';
|
|
9
|
-
/**
|
|
10
|
-
* Classify severity for a single pattern category
|
|
11
|
-
*/
|
|
12
|
-
export declare function classifySeverity(patternCategory: string): Severity;
|
|
13
|
-
/**
|
|
14
|
-
* Interface for a threat finding
|
|
15
|
-
*/
|
|
16
|
-
export interface Finding {
|
|
17
|
-
pattern_category: string;
|
|
18
|
-
severity: Severity;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Aggregate severity across multiple findings
|
|
22
|
-
* Returns the highest severity level found, or CLEAN if no findings
|
|
23
|
-
*/
|
|
24
|
-
export declare function aggregateSeverity(findings: Finding[]): OverallSeverity;
|
|
25
|
-
/**
|
|
26
|
-
* Count findings by severity level
|
|
27
|
-
*/
|
|
28
|
-
export declare function countBySeverity(findings: Finding[]): Record<Severity, number>;
|
|
29
|
-
/**
|
|
30
|
-
* Get emoji for severity level (for Markdown reports)
|
|
31
|
-
*/
|
|
32
|
-
export declare function getSeverityEmoji(severity: Severity | OverallSeverity): string;
|
|
33
|
-
//# sourceMappingURL=severity-classifier.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"severity-classifier.d.ts","sourceRoot":"","sources":["../../src/sanitizer/severity-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC9D,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AA2DjD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,QAAQ,CAElE;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,eAAe,CAatE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAa7E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,MAAM,CAS7E"}
|