@dotsetlabs/tollgate 0.2.0 → 0.2.2

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.
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Output Validation Types
3
+ *
4
+ * Type definitions for the enhanced output validation system that scans
5
+ * tool responses for sensitive data, PII, credentials, and injection attempts.
6
+ *
7
+ * @module analyzers/output-validation-types
8
+ */
9
+ /**
10
+ * Action to take when a pattern matches in output content.
11
+ *
12
+ * - `block`: Prevent the response from being returned entirely
13
+ * - `redact`: Replace matched content with a placeholder
14
+ * - `warn`: Log a warning but allow the response through
15
+ * - `log`: Silently log for auditing without affecting response
16
+ */
17
+ export type OutputValidationAction = 'block' | 'redact' | 'warn' | 'log';
18
+ /**
19
+ * Severity level for output validation matches.
20
+ */
21
+ export type OutputValidationSeverity = 'low' | 'medium' | 'high' | 'critical';
22
+ /**
23
+ * A configurable output validation pattern.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const ssnPattern: OutputValidationPattern = {
28
+ * name: 'ssn',
29
+ * pattern: /\b\d{3}-\d{2}-\d{4}\b/,
30
+ * action: 'redact',
31
+ * severity: 'critical',
32
+ * category: 'pii',
33
+ * replacement: '[SSN REDACTED]',
34
+ * };
35
+ * ```
36
+ */
37
+ export interface OutputValidationPattern {
38
+ /** Unique identifier for the pattern */
39
+ name: string;
40
+ /** Regex pattern or string to match */
41
+ pattern: RegExp | string;
42
+ /** Action to take when pattern matches */
43
+ action: OutputValidationAction;
44
+ /** Severity level of the match */
45
+ severity?: OutputValidationSeverity;
46
+ /** Category for grouping (pii, credential, injection, etc.) */
47
+ category?: string;
48
+ /** Human-readable description */
49
+ description?: string;
50
+ /** Replacement text for redaction (default: '[REDACTED]') */
51
+ replacement?: string;
52
+ /** Whether this pattern is enabled (default: true) */
53
+ enabled?: boolean;
54
+ }
55
+ /**
56
+ * PII detection configuration.
57
+ *
58
+ * Each PII type can be set to an action or disabled.
59
+ */
60
+ export interface PIIDetectionConfig {
61
+ /** Social Security Numbers (US format: XXX-XX-XXXX) */
62
+ ssn?: OutputValidationAction | false;
63
+ /** Credit card numbers (with Luhn validation) */
64
+ creditCard?: OutputValidationAction | false;
65
+ /** Phone numbers (various formats) */
66
+ phone?: OutputValidationAction | false;
67
+ /** Email addresses */
68
+ email?: OutputValidationAction | false;
69
+ /** IPv4 addresses */
70
+ ipAddress?: OutputValidationAction | false;
71
+ /** Bank account numbers (contextual) */
72
+ bankAccount?: OutputValidationAction | false;
73
+ /** Date of birth patterns */
74
+ dateOfBirth?: OutputValidationAction | false;
75
+ /** Driver's license numbers */
76
+ driversLicense?: OutputValidationAction | false;
77
+ /** Passport numbers */
78
+ passport?: OutputValidationAction | false;
79
+ /** Street addresses (limited accuracy) */
80
+ address?: OutputValidationAction | false;
81
+ }
82
+ /**
83
+ * Full configuration for output validation.
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * const config: OutputValidationConfig = {
88
+ * enabled: true,
89
+ * patterns: [
90
+ * { name: 'custom_key', pattern: /MY_SECRET_\w+/, action: 'redact' }
91
+ * ],
92
+ * pii: {
93
+ * ssn: 'redact',
94
+ * creditCard: 'redact',
95
+ * email: 'warn',
96
+ * },
97
+ * credentials: true,
98
+ * injection: true,
99
+ * };
100
+ * ```
101
+ */
102
+ export interface OutputValidationConfig {
103
+ /** Enable/disable output validation (default: true) */
104
+ enabled: boolean;
105
+ /** Custom patterns to match */
106
+ patterns?: OutputValidationPattern[];
107
+ /** PII detection settings */
108
+ pii?: PIIDetectionConfig;
109
+ /** Enable built-in credential detection (default: true) */
110
+ credentials?: boolean;
111
+ /** Enable built-in injection detection (default: true) */
112
+ injection?: boolean;
113
+ /** Maximum content length to scan (default: 1MB) */
114
+ maxContentLength?: number;
115
+ /** Default action for matches without specified action */
116
+ defaultAction?: OutputValidationAction;
117
+ }
118
+ /**
119
+ * A single match found during output validation.
120
+ */
121
+ export interface OutputValidationMatch {
122
+ /** Pattern name that matched */
123
+ pattern: string;
124
+ /** Category of the pattern (pii, credential, injection, custom) */
125
+ category: string;
126
+ /** Action taken for this match */
127
+ action: OutputValidationAction;
128
+ /** The matched content */
129
+ matchedContent: string;
130
+ /** Replacement used for redaction (if applicable) */
131
+ replacement?: string;
132
+ /** Position in the original content */
133
+ position: {
134
+ start: number;
135
+ end: number;
136
+ };
137
+ /** Severity of the match */
138
+ severity: OutputValidationSeverity;
139
+ }
140
+ /**
141
+ * Result of output validation.
142
+ */
143
+ export interface OutputValidationResult {
144
+ /** Whether the response is allowed through */
145
+ allowed: boolean;
146
+ /** Whether the content was modified (redacted) */
147
+ modified: boolean;
148
+ /** Original content before any transformations */
149
+ originalContent: string;
150
+ /** Transformed content (if modified) */
151
+ transformedContent?: string;
152
+ /** All matches found */
153
+ matches: OutputValidationMatch[];
154
+ /** Summary of actions taken */
155
+ summary: {
156
+ blocked: number;
157
+ redacted: number;
158
+ warned: number;
159
+ logged: number;
160
+ };
161
+ /** Processing time in milliseconds */
162
+ processingTimeMs: number;
163
+ }
164
+ /**
165
+ * Default output validation configuration.
166
+ */
167
+ export declare const DEFAULT_OUTPUT_VALIDATION_CONFIG: OutputValidationConfig;
168
+ /**
169
+ * Built-in pattern categories.
170
+ */
171
+ export declare const OUTPUT_VALIDATION_CATEGORIES: {
172
+ readonly PII: "pii";
173
+ readonly CREDENTIAL: "credential";
174
+ readonly INJECTION: "injection";
175
+ readonly EXFILTRATION: "exfiltration";
176
+ readonly CUSTOM: "custom";
177
+ };
178
+ export type OutputValidationCategory = typeof OUTPUT_VALIDATION_CATEGORIES[keyof typeof OUTPUT_VALIDATION_CATEGORIES];
179
+ //# sourceMappingURL=output-validation-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-validation-types.d.ts","sourceRoot":"","sources":["../../src/analyzers/output-validation-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Output Validation Types
3
+ *
4
+ * Type definitions for the enhanced output validation system that scans
5
+ * tool responses for sensitive data, PII, credentials, and injection attempts.
6
+ *
7
+ * @module analyzers/output-validation-types
8
+ */
9
+ // ============================================================================
10
+ // Default Configuration
11
+ // ============================================================================
12
+ /**
13
+ * Default output validation configuration.
14
+ */
15
+ export const DEFAULT_OUTPUT_VALIDATION_CONFIG = {
16
+ enabled: true,
17
+ patterns: [],
18
+ pii: {
19
+ ssn: 'redact',
20
+ creditCard: 'redact',
21
+ phone: 'warn',
22
+ email: 'log',
23
+ ipAddress: 'log',
24
+ },
25
+ credentials: true,
26
+ injection: true,
27
+ maxContentLength: 1024 * 1024, // 1MB
28
+ defaultAction: 'redact',
29
+ };
30
+ // ============================================================================
31
+ // Built-in Categories
32
+ // ============================================================================
33
+ /**
34
+ * Built-in pattern categories.
35
+ */
36
+ export const OUTPUT_VALIDATION_CATEGORIES = {
37
+ PII: 'pii',
38
+ CREDENTIAL: 'credential',
39
+ INJECTION: 'injection',
40
+ EXFILTRATION: 'exfiltration',
41
+ CUSTOM: 'custom',
42
+ };
43
+ //# sourceMappingURL=output-validation-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-validation-types.js","sourceRoot":"","sources":["../../src/analyzers/output-validation-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA0NH,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAA2B;IACpE,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,EAAE;IACZ,GAAG,EAAE;QACD,GAAG,EAAE,QAAQ;QACb,UAAU,EAAE,QAAQ;QACpB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,KAAK;KACnB;IACD,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,IAAI;IACf,gBAAgB,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM;IACrC,aAAa,EAAE,QAAQ;CAC1B,CAAC;AAEF,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;IACxC,GAAG,EAAE,KAAK;IACV,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,cAAc;IAC5B,MAAM,EAAE,QAAQ;CACV,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * PII Detector
3
+ *
4
+ * Detects Personally Identifiable Information (PII) in text content:
5
+ * - Social Security Numbers (SSN)
6
+ * - Credit Card Numbers (with Luhn validation)
7
+ * - Phone Numbers (US and international formats)
8
+ * - Email Addresses
9
+ * - IP Addresses
10
+ * - And more...
11
+ *
12
+ * @module analyzers/pii-detector
13
+ */
14
+ import type { PIIDetectionConfig, OutputValidationMatch, OutputValidationSeverity } from './output-validation-types.js';
15
+ interface PIIPattern {
16
+ name: string;
17
+ pattern: RegExp;
18
+ severity: OutputValidationSeverity;
19
+ replacement: string;
20
+ validator?: (match: string) => boolean;
21
+ }
22
+ /**
23
+ * Built-in PII patterns with validation functions.
24
+ */
25
+ declare const PII_PATTERNS: Record<string, PIIPattern>;
26
+ /**
27
+ * Luhn algorithm for credit card validation.
28
+ */
29
+ declare function luhnValidate(cardNumber: string): boolean;
30
+ /**
31
+ * Detects PII in text content based on configuration.
32
+ */
33
+ export declare class PIIDetector {
34
+ private config;
35
+ constructor(config?: PIIDetectionConfig);
36
+ /**
37
+ * Update the configuration.
38
+ */
39
+ configure(config: PIIDetectionConfig): void;
40
+ /**
41
+ * Detect all PII matches in content.
42
+ */
43
+ detect(content: string): OutputValidationMatch[];
44
+ /**
45
+ * Remove overlapping matches, keeping the more specific/lengthy one.
46
+ */
47
+ private deduplicateMatches;
48
+ /**
49
+ * Apply redactions to content.
50
+ */
51
+ applyRedactions(content: string, matches: OutputValidationMatch[]): string;
52
+ }
53
+ /**
54
+ * Export Luhn validator for testing.
55
+ */
56
+ export { luhnValidate };
57
+ /**
58
+ * Export PII patterns for testing.
59
+ */
60
+ export { PII_PATTERNS };
61
+ //# sourceMappingURL=pii-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii-detector.d.ts","sourceRoot":"","sources":["../../src/analyzers/pii-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACR,kBAAkB,EAClB,qBAAqB,EAErB,wBAAwB,EAC3B,MAAM,8BAA8B,CAAC;AAOtC,UAAU,UAAU;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1C;AAED;;GAEG;AACH,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAoI5C,CAAC;AAMF;;GAEG;AACH,iBAAS,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAwBjD;AAMD;;GAEG;AACH,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,GAAE,kBAAuB;IAI3C;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAI3C;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,EAAE;IA0DhD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,MAAM;CAoB7E;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * PII Detector
3
+ *
4
+ * Detects Personally Identifiable Information (PII) in text content:
5
+ * - Social Security Numbers (SSN)
6
+ * - Credit Card Numbers (with Luhn validation)
7
+ * - Phone Numbers (US and international formats)
8
+ * - Email Addresses
9
+ * - IP Addresses
10
+ * - And more...
11
+ *
12
+ * @module analyzers/pii-detector
13
+ */
14
+ import { OUTPUT_VALIDATION_CATEGORIES } from './output-validation-types.js';
15
+ /**
16
+ * Built-in PII patterns with validation functions.
17
+ */
18
+ const PII_PATTERNS = {
19
+ ssn: {
20
+ name: 'Social Security Number',
21
+ // Matches XXX-XX-XXXX format (most common)
22
+ pattern: /\b\d{3}-\d{2}-\d{4}\b/g,
23
+ severity: 'critical',
24
+ replacement: '[SSN REDACTED]',
25
+ validator: (match) => {
26
+ // Basic SSN validation: not all zeros in any group
27
+ const parts = match.split('-');
28
+ if (parts[0] === '000' || parts[1] === '00' || parts[2] === '0000') {
29
+ return false;
30
+ }
31
+ // Area numbers 900-999 and 666 are invalid
32
+ const area = parseInt(parts[0], 10);
33
+ if (area >= 900 || area === 666) {
34
+ return false;
35
+ }
36
+ return true;
37
+ },
38
+ },
39
+ ssnCompact: {
40
+ name: 'Social Security Number (no dashes)',
41
+ // 9 consecutive digits (less reliable, requires context)
42
+ pattern: /\bSSN[:\s]*(\d{9})\b/gi,
43
+ severity: 'critical',
44
+ replacement: '[SSN REDACTED]',
45
+ },
46
+ creditCard: {
47
+ name: 'Credit Card Number',
48
+ // Major card types: Visa, MasterCard, Amex, Discover, etc.
49
+ pattern: /\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12}|3(?:0[0-5]|[68][0-9])[0-9]{11})\b/g,
50
+ severity: 'critical',
51
+ replacement: '[CARD REDACTED]',
52
+ validator: luhnValidate,
53
+ },
54
+ creditCardSpaced: {
55
+ name: 'Credit Card Number (spaced)',
56
+ // Cards with spaces or dashes between groups
57
+ pattern: /\b(?:4[0-9]{3}[-\s]?[0-9]{4}[-\s]?[0-9]{4}[-\s]?[0-9]{4}|5[1-5][0-9]{2}[-\s]?[0-9]{4}[-\s]?[0-9]{4}[-\s]?[0-9]{4}|3[47][0-9]{2}[-\s]?[0-9]{6}[-\s]?[0-9]{5})\b/g,
58
+ severity: 'critical',
59
+ replacement: '[CARD REDACTED]',
60
+ validator: (match) => luhnValidate(match.replace(/[-\s]/g, '')),
61
+ },
62
+ phone: {
63
+ name: 'Phone Number',
64
+ // US phone formats: (XXX) XXX-XXXX, XXX-XXX-XXXX, XXX.XXX.XXXX, +1XXXXXXXXXX
65
+ pattern: /\b(?:\+?1[-.\s]?)?\(?[2-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g,
66
+ severity: 'medium',
67
+ replacement: '[PHONE REDACTED]',
68
+ },
69
+ email: {
70
+ name: 'Email Address',
71
+ pattern: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g,
72
+ severity: 'low',
73
+ replacement: '[EMAIL REDACTED]',
74
+ },
75
+ ipAddress: {
76
+ name: 'IP Address (IPv4)',
77
+ pattern: /\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,
78
+ severity: 'low',
79
+ replacement: '[IP REDACTED]',
80
+ validator: (match) => {
81
+ // Filter out version numbers like 1.2.3.4 in code
82
+ const octets = match.split('.').map(n => parseInt(n, 10));
83
+ // Private and loopback ranges are less sensitive
84
+ if (octets[0] === 127 || octets[0] === 10) {
85
+ return false; // Don't flag localhost/private
86
+ }
87
+ if (octets[0] === 192 && octets[1] === 168) {
88
+ return false; // Private range
89
+ }
90
+ return true;
91
+ },
92
+ },
93
+ dateOfBirth: {
94
+ name: 'Date of Birth',
95
+ // MM/DD/YYYY or MM-DD-YYYY format with DOB context
96
+ pattern: /\b(?:DOB|D\.O\.B\.?|Date of Birth|Born)[:\s]*(\d{1,2}[-/]\d{1,2}[-/]\d{2,4})\b/gi,
97
+ severity: 'high',
98
+ replacement: '[DOB REDACTED]',
99
+ },
100
+ passport: {
101
+ name: 'Passport Number',
102
+ // US passport: starts with letter, 8-9 digits
103
+ pattern: /\b(?:passport|passport\s*#?|passport\s*no\.?)[:\s]*([A-Z]?\d{8,9})\b/gi,
104
+ severity: 'critical',
105
+ replacement: '[PASSPORT REDACTED]',
106
+ },
107
+ driversLicense: {
108
+ name: 'Drivers License',
109
+ // Format varies by state, catch with context
110
+ pattern: /\b(?:DL|driver'?s?\s*license|license\s*#?)[:\s]*([A-Z0-9]{6,15})\b/gi,
111
+ severity: 'high',
112
+ replacement: '[DL REDACTED]',
113
+ },
114
+ bankAccount: {
115
+ name: 'Bank Account Number',
116
+ // Account numbers with context
117
+ pattern: /\b(?:account|acct|account\s*#?|bank\s*account)[:\s]*(\d{8,17})\b/gi,
118
+ severity: 'critical',
119
+ replacement: '[ACCOUNT REDACTED]',
120
+ },
121
+ routingNumber: {
122
+ name: 'Bank Routing Number',
123
+ pattern: /\b(?:routing|ABA|routing\s*#?)[:\s]*(\d{9})\b/gi,
124
+ severity: 'high',
125
+ replacement: '[ROUTING REDACTED]',
126
+ validator: (match) => {
127
+ // ABA routing number checksum validation
128
+ const digits = match.replace(/\D/g, '');
129
+ if (digits.length !== 9)
130
+ return false;
131
+ const nums = digits.split('').map(n => parseInt(n, 10));
132
+ const checksum = (3 * (nums[0] + nums[3] + nums[6]) +
133
+ 7 * (nums[1] + nums[4] + nums[7]) +
134
+ 1 * (nums[2] + nums[5] + nums[8])) % 10;
135
+ return checksum === 0;
136
+ },
137
+ },
138
+ };
139
+ // ============================================================================
140
+ // Validation Functions
141
+ // ============================================================================
142
+ /**
143
+ * Luhn algorithm for credit card validation.
144
+ */
145
+ function luhnValidate(cardNumber) {
146
+ const digits = cardNumber.replace(/\D/g, '');
147
+ if (digits.length < 13 || digits.length > 19 || /^0+$/.test(digits)) {
148
+ return false;
149
+ }
150
+ let sum = 0;
151
+ let isEven = false;
152
+ for (let i = digits.length - 1; i >= 0; i--) {
153
+ let digit = parseInt(digits[i], 10);
154
+ if (isEven) {
155
+ digit *= 2;
156
+ if (digit > 9) {
157
+ digit -= 9;
158
+ }
159
+ }
160
+ sum += digit;
161
+ isEven = !isEven;
162
+ }
163
+ return sum % 10 === 0;
164
+ }
165
+ // ============================================================================
166
+ // PII Detector Class
167
+ // ============================================================================
168
+ /**
169
+ * Detects PII in text content based on configuration.
170
+ */
171
+ export class PIIDetector {
172
+ config;
173
+ constructor(config = {}) {
174
+ this.config = config;
175
+ }
176
+ /**
177
+ * Update the configuration.
178
+ */
179
+ configure(config) {
180
+ this.config = { ...this.config, ...config };
181
+ }
182
+ /**
183
+ * Detect all PII matches in content.
184
+ */
185
+ detect(content) {
186
+ const matches = [];
187
+ // Map config keys to pattern keys
188
+ const configToPattern = {
189
+ ssn: ['ssn', 'ssnCompact'],
190
+ creditCard: ['creditCard', 'creditCardSpaced'],
191
+ phone: ['phone'],
192
+ email: ['email'],
193
+ ipAddress: ['ipAddress'],
194
+ dateOfBirth: ['dateOfBirth'],
195
+ passport: ['passport'],
196
+ driversLicense: ['driversLicense'],
197
+ bankAccount: ['bankAccount', 'routingNumber'],
198
+ };
199
+ for (const [configKey, patternKeys] of Object.entries(configToPattern)) {
200
+ const action = this.config[configKey];
201
+ if (action === false || action === undefined) {
202
+ continue;
203
+ }
204
+ for (const patternKey of patternKeys) {
205
+ const piiPattern = PII_PATTERNS[patternKey];
206
+ if (!piiPattern)
207
+ continue;
208
+ // Reset regex lastIndex
209
+ piiPattern.pattern.lastIndex = 0;
210
+ let match;
211
+ while ((match = piiPattern.pattern.exec(content)) !== null) {
212
+ const matchedText = match[0];
213
+ // Run validator if present
214
+ if (piiPattern.validator && !piiPattern.validator(matchedText)) {
215
+ continue;
216
+ }
217
+ matches.push({
218
+ pattern: piiPattern.name,
219
+ category: OUTPUT_VALIDATION_CATEGORIES.PII,
220
+ action: action,
221
+ matchedContent: matchedText,
222
+ replacement: piiPattern.replacement,
223
+ position: {
224
+ start: match.index,
225
+ end: match.index + matchedText.length,
226
+ },
227
+ severity: piiPattern.severity,
228
+ });
229
+ }
230
+ }
231
+ }
232
+ // Sort by position and deduplicate overlapping matches
233
+ return this.deduplicateMatches(matches);
234
+ }
235
+ /**
236
+ * Remove overlapping matches, keeping the more specific/lengthy one.
237
+ */
238
+ deduplicateMatches(matches) {
239
+ if (matches.length <= 1) {
240
+ return matches;
241
+ }
242
+ // Sort by position
243
+ matches.sort((a, b) => a.position.start - b.position.start);
244
+ const result = [];
245
+ let lastEnd = -1;
246
+ for (const match of matches) {
247
+ if (match.position.start >= lastEnd) {
248
+ result.push(match);
249
+ lastEnd = match.position.end;
250
+ }
251
+ else if (match.position.end > lastEnd) {
252
+ // Overlapping match that extends further - replace last one
253
+ // (e.g. creditCardSpaced vs creditCard)
254
+ result[result.length - 1] = match;
255
+ lastEnd = match.position.end;
256
+ }
257
+ }
258
+ return result;
259
+ }
260
+ /**
261
+ * Apply redactions to content.
262
+ */
263
+ applyRedactions(content, matches) {
264
+ if (matches.length === 0) {
265
+ return content;
266
+ }
267
+ // Filter to only redact actions, sort in reverse order for safe replacement
268
+ const redactMatches = matches
269
+ .filter(m => m.action === 'redact')
270
+ .sort((a, b) => b.position.start - a.position.start);
271
+ let result = content;
272
+ for (const match of redactMatches) {
273
+ result =
274
+ result.slice(0, match.position.start) +
275
+ (match.replacement || '[REDACTED]') +
276
+ result.slice(match.position.end);
277
+ }
278
+ return result;
279
+ }
280
+ }
281
+ /**
282
+ * Export Luhn validator for testing.
283
+ */
284
+ export { luhnValidate };
285
+ /**
286
+ * Export PII patterns for testing.
287
+ */
288
+ export { PII_PATTERNS };
289
+ //# sourceMappingURL=pii-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii-detector.js","sourceRoot":"","sources":["../../src/analyzers/pii-detector.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"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"}
@@ -74,10 +74,10 @@ export class AuditLogger {
74
74
  // Prepared statements for tool calls (updated for new schema)
75
75
  this.insertToolCallStmt = this.db.prepare(`
76
76
  INSERT INTO tool_calls (
77
- id, server, tool, args, args_redacted, policy_decision, policy_rule,
77
+ id, timestamp, server, tool, args, args_redacted, policy_decision, policy_rule,
78
78
  policy_reason, analyzer, risk_level, session_grant_id, correlation_id, client_id
79
79
  )
80
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
80
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
81
81
  `);
82
82
  this.updateToolCallStmt = this.db.prepare(`
83
83
  UPDATE tool_calls
@@ -208,7 +208,7 @@ export class AuditLogger {
208
208
  // Extract analysis metadata if available
209
209
  const analyzer = decision.analysis?.analyzer ?? null;
210
210
  const riskLevel = decision.analysis?.risk ?? null;
211
- this.insertToolCallStmt.run(id, context.server, context.tool, argsToStore, argsRedacted, decision.action, decision.matchedRule ?? null, decision.reason ?? null, analyzer, riskLevel, sessionGrantId ?? null, metadata?.correlationId ?? null, metadata?.clientId ?? null);
211
+ this.insertToolCallStmt.run(id, context.timestamp.toISOString(), context.server, context.tool, argsToStore, argsRedacted, decision.action, decision.matchedRule ?? null, decision.reason ?? null, analyzer, riskLevel, sessionGrantId ?? null, metadata?.correlationId ?? null, metadata?.clientId ?? null);
212
212
  return id;
213
213
  }
214
214
  /**