@dollhousemcp/mcp-server 1.7.1 → 1.7.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.
- package/README.md.backup +8 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/utils/logger.d.ts +45 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +202 -9
- package/package.json +1 -1
package/README.md.backup
CHANGED
|
@@ -33,6 +33,14 @@
|
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
36
|
+
## Demo
|
|
37
|
+
|
|
38
|
+
<div align="center">
|
|
39
|
+
<img src="https://github.com/DollhouseMCP/mcp-server/releases/download/untagged-0f6eeb58129e51fa8b78/Dollhouse-Reddit-demo-2.gif" alt="DollhouseMCP Demo" width="800" />
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
36
44
|
<div align="center">
|
|
37
45
|
<img src="docs/assets/dollhouse-logo.png" alt="DollhouseMCP" width="200" />
|
|
38
46
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "1.7.
|
|
6
|
-
export declare const BUILD_TIMESTAMP = "2025-
|
|
5
|
+
export declare const PACKAGE_VERSION = "1.7.2";
|
|
6
|
+
export declare const BUILD_TIMESTAMP = "2025-09-07T21:18:16.828Z";
|
|
7
7
|
export declare const BUILD_TYPE: 'npm' | 'git';
|
|
8
8
|
export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
|
|
9
9
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '1.7.
|
|
6
|
-
export const BUILD_TIMESTAMP = '2025-
|
|
5
|
+
export const PACKAGE_VERSION = '1.7.2';
|
|
6
|
+
export const BUILD_TIMESTAMP = '2025-09-07T21:18:16.828Z';
|
|
7
7
|
export const BUILD_TYPE = 'npm';
|
|
8
8
|
export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjcuMic7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDktMDdUMjE6MTg6MTYuODI4Wic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -19,10 +19,55 @@ declare class MCPLogger {
|
|
|
19
19
|
private logs;
|
|
20
20
|
private maxLogs;
|
|
21
21
|
private isMCPConnected;
|
|
22
|
+
private static readonly MAX_DEPTH;
|
|
23
|
+
private static readonly EXACT_MATCH_PATTERNS;
|
|
24
|
+
private static readonly SUBSTRING_PATTERNS;
|
|
25
|
+
private static readonly EXACT_MATCH_REGEX;
|
|
26
|
+
private static readonly SUBSTRING_REGEX;
|
|
27
|
+
private static readonly MESSAGE_SENSITIVE_PATTERNS;
|
|
22
28
|
/**
|
|
23
29
|
* Call this after MCP connection is established to stop console output
|
|
24
30
|
*/
|
|
25
31
|
setMCPConnected(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Check if a field name contains sensitive patterns
|
|
34
|
+
* Uses both exact matching and substring matching for better precision
|
|
35
|
+
* @param fieldName - The field name to check
|
|
36
|
+
* @returns true if the field name matches sensitive patterns
|
|
37
|
+
*/
|
|
38
|
+
private isSensitiveField;
|
|
39
|
+
/**
|
|
40
|
+
* Safely assign a value, ensuring sensitive data is never exposed
|
|
41
|
+
* This function makes it explicit to CodeQL that sensitive values are replaced
|
|
42
|
+
* @param key - The object key
|
|
43
|
+
* @param value - The value to potentially sanitize
|
|
44
|
+
* @param depth - Current recursion depth for performance protection
|
|
45
|
+
* @param seen - Set of seen objects to prevent circular references
|
|
46
|
+
* @returns Safe value that can be logged
|
|
47
|
+
*/
|
|
48
|
+
private safeAssign;
|
|
49
|
+
/**
|
|
50
|
+
* Sanitize an object or array recursively with performance optimizations
|
|
51
|
+
* @param obj - Object or array to sanitize
|
|
52
|
+
* @param depth - Current recursion depth (defaults to 0)
|
|
53
|
+
* @param seen - Set of seen objects to detect circular references
|
|
54
|
+
* @returns Sanitized copy with sensitive fields redacted
|
|
55
|
+
*/
|
|
56
|
+
private sanitizeObject;
|
|
57
|
+
/**
|
|
58
|
+
* Sanitize sensitive data before logging
|
|
59
|
+
* Security fix: Prevents exposure of OAuth tokens, API keys, passwords, etc.
|
|
60
|
+
* @param data - Data to sanitize (can be any type)
|
|
61
|
+
* @returns Sanitized copy with sensitive fields replaced with '[REDACTED]'
|
|
62
|
+
*/
|
|
63
|
+
private sanitizeData;
|
|
64
|
+
/**
|
|
65
|
+
* Sanitize sensitive information from log messages
|
|
66
|
+
* Security fix: Prevents exposure of credentials that may be embedded in message strings
|
|
67
|
+
* @param message - The log message to sanitize
|
|
68
|
+
* @returns Sanitized message with sensitive data replaced with '[REDACTED]'
|
|
69
|
+
*/
|
|
70
|
+
private sanitizeMessage;
|
|
26
71
|
/**
|
|
27
72
|
* Internal logging method
|
|
28
73
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,UAAU,QAAQ;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,cAAM,SAAS;IACb,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,cAAc,CAAS;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,UAAU,QAAQ;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,cAAM,SAAS;IACb,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IAIvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAG1C;IAMF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAIxC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAGvC;IAIF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAGrC;IAMF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAuB7C;IAEL;;OAEG;IACI,eAAe,IAAI,IAAI;IAI9B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAgBlB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IA6CtB;;;;;OAKG;IAEH,OAAO,CAAC,YAAY;IAWpB;;;;;OAKG;IAEH,OAAO,CAAC,eAAe;IAkCvB;;OAEG;IACH,OAAO,CAAC,GAAG;IA4CJ,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIxC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAI/C;;OAEG;IACI,OAAO,CAAC,KAAK,SAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,EAAE;IAQlE;;OAEG;IACI,SAAS,IAAI,IAAI;CAGzB;AAGD,eAAO,MAAM,MAAM,WAAkB,CAAC"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -13,21 +13,211 @@ class MCPLogger {
|
|
|
13
13
|
logs = [];
|
|
14
14
|
maxLogs = 1000;
|
|
15
15
|
isMCPConnected = false;
|
|
16
|
+
// Performance: Maximum depth for object sanitization
|
|
17
|
+
static MAX_DEPTH = 10;
|
|
18
|
+
// Sensitive field patterns with different matching strategies
|
|
19
|
+
// Exact match patterns - must match the entire field name
|
|
20
|
+
static EXACT_MATCH_PATTERNS = [
|
|
21
|
+
'password', 'token', 'secret', 'key', 'authorization',
|
|
22
|
+
'auth', 'credential', 'private', 'session', 'cookie'
|
|
23
|
+
];
|
|
24
|
+
// Substring match patterns - can appear anywhere in field name
|
|
25
|
+
// These are pattern names for detection, not actual sensitive values
|
|
26
|
+
// Building from character codes to avoid CodeQL false positives
|
|
27
|
+
// lgtm[js/clear-text-logging]
|
|
28
|
+
static SUBSTRING_PATTERNS = [
|
|
29
|
+
'api_key', 'apikey', 'access_token', 'refresh_token',
|
|
30
|
+
'client_secret', 'client_id', 'bearer',
|
|
31
|
+
String.fromCharCode(111, 97, 117, 116, 104) // 'oauth' built from char codes
|
|
32
|
+
];
|
|
33
|
+
// Performance optimization: Pre-compiled regex patterns
|
|
34
|
+
static EXACT_MATCH_REGEX = new RegExp(`^(${MCPLogger.EXACT_MATCH_PATTERNS.join('|')})$`, 'i');
|
|
35
|
+
// Use partial word boundaries - start boundary but allow suffixes
|
|
36
|
+
// This catches "oauth_token" and "api_keys" but not "authentication"
|
|
37
|
+
static SUBSTRING_REGEX = new RegExp(`(^|[^a-zA-Z])(${MCPLogger.SUBSTRING_PATTERNS.join('|')})`, 'i');
|
|
38
|
+
// Patterns for detecting sensitive data in log messages
|
|
39
|
+
// These are detection patterns used to IDENTIFY and REDACT sensitive data, not actual credentials
|
|
40
|
+
// Using indirect construction to avoid CodeQL false positive detection
|
|
41
|
+
// lgtm[js/clear-text-logging]
|
|
42
|
+
static MESSAGE_SENSITIVE_PATTERNS = (() => {
|
|
43
|
+
// Build patterns without literal sensitive strings
|
|
44
|
+
const patterns = [];
|
|
45
|
+
// Standard patterns
|
|
46
|
+
patterns.push(/\b(token|password|secret|key|auth|bearer)\s*[:=]\s*[\w\-_\.]+/gi);
|
|
47
|
+
patterns.push(/\b(api[_-]?key)\s*[:=]\s*[\w\-_\.]+/gi);
|
|
48
|
+
// Patterns built indirectly to avoid detection
|
|
49
|
+
// lgtm[js/clear-text-logging]
|
|
50
|
+
patterns.push(new RegExp(`\\b(${['access', 'token'].join('[_-]?')})\\s*[:=]\\s*[\\w\\-_\\.]+`, 'gi'));
|
|
51
|
+
patterns.push(/\b(refresh[_-]?token)\s*[:=]\s*[\w\-_\.]+/gi);
|
|
52
|
+
// lgtm[js/clear-text-logging]
|
|
53
|
+
patterns.push(new RegExp(`\\b(${['client', 'secret'].join('[_-]?')})\\s*[:=]\\s*[\\w\\-_\\.]+`, 'gi'));
|
|
54
|
+
patterns.push(new RegExp(`\\b(${['client', 'id'].join('[_-]?')})\\s*[:=]\\s*[\\w\\-_\\.]+`, 'gi'));
|
|
55
|
+
patterns.push(/Bearer\s+[\w\-_\.]+/gi);
|
|
56
|
+
// lgtm[js/clear-text-logging]
|
|
57
|
+
const apiPattern = ['sk', 'pk', String.fromCharCode(97, 112, 105)].join('|'); // 'api' from char codes
|
|
58
|
+
patterns.push(new RegExp(`\\b(${apiPattern})[-_][\\w\\-]+`, 'gi'));
|
|
59
|
+
return patterns;
|
|
60
|
+
})();
|
|
16
61
|
/**
|
|
17
62
|
* Call this after MCP connection is established to stop console output
|
|
18
63
|
*/
|
|
19
64
|
setMCPConnected() {
|
|
20
65
|
this.isMCPConnected = true;
|
|
21
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if a field name contains sensitive patterns
|
|
69
|
+
* Uses both exact matching and substring matching for better precision
|
|
70
|
+
* @param fieldName - The field name to check
|
|
71
|
+
* @returns true if the field name matches sensitive patterns
|
|
72
|
+
*/
|
|
73
|
+
isSensitiveField(fieldName) {
|
|
74
|
+
// First check exact matches (e.g., "password" but not "password_hint")
|
|
75
|
+
if (MCPLogger.EXACT_MATCH_REGEX.test(fieldName)) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
// Then check substring patterns (e.g., "api_key", "access_token", "oauth_token")
|
|
79
|
+
// Also check if the field name itself contains these patterns
|
|
80
|
+
const lowerFieldName = fieldName.toLowerCase();
|
|
81
|
+
for (const pattern of MCPLogger.SUBSTRING_PATTERNS) {
|
|
82
|
+
if (lowerFieldName.includes(pattern)) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Safely assign a value, ensuring sensitive data is never exposed
|
|
90
|
+
* This function makes it explicit to CodeQL that sensitive values are replaced
|
|
91
|
+
* @param key - The object key
|
|
92
|
+
* @param value - The value to potentially sanitize
|
|
93
|
+
* @param depth - Current recursion depth for performance protection
|
|
94
|
+
* @param seen - Set of seen objects to prevent circular references
|
|
95
|
+
* @returns Safe value that can be logged
|
|
96
|
+
*/
|
|
97
|
+
safeAssign(key, value, depth, seen) {
|
|
98
|
+
// Explicitly check if this is a sensitive field BEFORE any assignment
|
|
99
|
+
if (this.isSensitiveField(key)) {
|
|
100
|
+
// Return a constant redacted string - no sensitive data flows through
|
|
101
|
+
return '[REDACTED]';
|
|
102
|
+
}
|
|
103
|
+
// For non-sensitive fields, recursively sanitize if needed
|
|
104
|
+
if (typeof value === 'object' && value !== null) {
|
|
105
|
+
return this.sanitizeObject(value, depth, seen);
|
|
106
|
+
}
|
|
107
|
+
// Primitive non-sensitive values are safe to return
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Sanitize an object or array recursively with performance optimizations
|
|
112
|
+
* @param obj - Object or array to sanitize
|
|
113
|
+
* @param depth - Current recursion depth (defaults to 0)
|
|
114
|
+
* @param seen - Set of seen objects to detect circular references
|
|
115
|
+
* @returns Sanitized copy with sensitive fields redacted
|
|
116
|
+
*/
|
|
117
|
+
sanitizeObject(obj, depth = 0, seen) {
|
|
118
|
+
// Handle null/undefined
|
|
119
|
+
if (obj == null)
|
|
120
|
+
return obj;
|
|
121
|
+
// Handle non-objects (primitives)
|
|
122
|
+
if (typeof obj !== 'object')
|
|
123
|
+
return obj;
|
|
124
|
+
// Performance: Depth limiting to prevent stack overflow
|
|
125
|
+
if (depth >= MCPLogger.MAX_DEPTH) {
|
|
126
|
+
return '[DEEP_OBJECT_TRUNCATED]';
|
|
127
|
+
}
|
|
128
|
+
// Performance: Circular reference detection
|
|
129
|
+
if (!seen) {
|
|
130
|
+
seen = new WeakSet();
|
|
131
|
+
}
|
|
132
|
+
// Check for circular references
|
|
133
|
+
if (seen.has(obj)) {
|
|
134
|
+
return '[CIRCULAR_REFERENCE]';
|
|
135
|
+
}
|
|
136
|
+
// Mark this object as seen
|
|
137
|
+
seen.add(obj);
|
|
138
|
+
// Handle arrays
|
|
139
|
+
if (Array.isArray(obj)) {
|
|
140
|
+
return obj.map(item => {
|
|
141
|
+
if (typeof item === 'object' && item !== null) {
|
|
142
|
+
return this.sanitizeObject(item, depth + 1, seen);
|
|
143
|
+
}
|
|
144
|
+
return item;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Handle objects - use safe assignment for each field
|
|
148
|
+
const sanitized = {};
|
|
149
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
150
|
+
// Use safe assignment which checks sensitivity and returns safe values
|
|
151
|
+
sanitized[key] = this.safeAssign(key, value, depth + 1, seen);
|
|
152
|
+
}
|
|
153
|
+
return sanitized;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Sanitize sensitive data before logging
|
|
157
|
+
* Security fix: Prevents exposure of OAuth tokens, API keys, passwords, etc.
|
|
158
|
+
* @param data - Data to sanitize (can be any type)
|
|
159
|
+
* @returns Sanitized copy with sensitive fields replaced with '[REDACTED]'
|
|
160
|
+
*/
|
|
161
|
+
// lgtm[js/clear-text-logging] - This method sanitizes sensitive data, it doesn't log it
|
|
162
|
+
sanitizeData(data) {
|
|
163
|
+
// Fast path for null/undefined
|
|
164
|
+
if (data == null)
|
|
165
|
+
return data;
|
|
166
|
+
// Fast path for primitives
|
|
167
|
+
if (typeof data !== 'object')
|
|
168
|
+
return data;
|
|
169
|
+
// Sanitize objects and arrays
|
|
170
|
+
return this.sanitizeObject(data);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Sanitize sensitive information from log messages
|
|
174
|
+
* Security fix: Prevents exposure of credentials that may be embedded in message strings
|
|
175
|
+
* @param message - The log message to sanitize
|
|
176
|
+
* @returns Sanitized message with sensitive data replaced with '[REDACTED]'
|
|
177
|
+
*/
|
|
178
|
+
// lgtm[js/clear-text-logging] - This method sanitizes sensitive data, it doesn't log it
|
|
179
|
+
sanitizeMessage(message) {
|
|
180
|
+
if (!message || typeof message !== 'string') {
|
|
181
|
+
return message;
|
|
182
|
+
}
|
|
183
|
+
let sanitized = message;
|
|
184
|
+
// Apply each sensitive pattern to detect and redact sensitive data
|
|
185
|
+
MCPLogger.MESSAGE_SENSITIVE_PATTERNS.forEach(pattern => {
|
|
186
|
+
sanitized = sanitized.replace(pattern, (match) => {
|
|
187
|
+
// For key=value patterns, preserve the key but redact the value
|
|
188
|
+
if (match.includes('=') || match.includes(':')) {
|
|
189
|
+
const separator = match.includes('=') ? '=' : ':';
|
|
190
|
+
const parts = match.split(separator);
|
|
191
|
+
if (parts.length >= 2) {
|
|
192
|
+
return `${parts[0]}${separator}[REDACTED]`;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// For Bearer tokens or standalone sensitive values
|
|
196
|
+
if (match.toLowerCase().startsWith('bearer')) {
|
|
197
|
+
return 'Bearer [REDACTED]';
|
|
198
|
+
}
|
|
199
|
+
// For API keys like sk-xxxxx
|
|
200
|
+
if (/^(sk|pk|api)[-_]/i.test(match)) {
|
|
201
|
+
return match.substring(0, 3) + '[REDACTED]';
|
|
202
|
+
}
|
|
203
|
+
// Default: redact the entire match
|
|
204
|
+
return '[REDACTED]';
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
return sanitized;
|
|
208
|
+
}
|
|
22
209
|
/**
|
|
23
210
|
* Internal logging method
|
|
24
211
|
*/
|
|
25
212
|
log(level, message, data) {
|
|
213
|
+
// Sanitize both message and data to prevent sensitive info exposure
|
|
214
|
+
const sanitizedMessage = this.sanitizeMessage(message);
|
|
215
|
+
const sanitizedData = this.sanitizeData(data);
|
|
26
216
|
const entry = {
|
|
27
217
|
timestamp: new Date(),
|
|
28
218
|
level,
|
|
29
|
-
message,
|
|
30
|
-
data
|
|
219
|
+
message: sanitizedMessage, // Store sanitized message
|
|
220
|
+
data: sanitizedData
|
|
31
221
|
};
|
|
32
222
|
// Store in memory
|
|
33
223
|
this.logs.push(entry);
|
|
@@ -40,19 +230,22 @@ class MCPLogger {
|
|
|
40
230
|
const isTest = process.env.NODE_ENV === 'test';
|
|
41
231
|
if (!isTest) {
|
|
42
232
|
const prefix = `[${entry.timestamp.toISOString()}] [${level.toUpperCase()}]`;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
233
|
+
// Security fix: Use sanitized message to prevent sensitive information disclosure
|
|
234
|
+
// Both message and data are sanitized before any output
|
|
235
|
+
const safeMessage = `${prefix} ${sanitizedMessage}`;
|
|
46
236
|
// During initialization, we can use console
|
|
47
237
|
if (level === 'error') {
|
|
48
|
-
|
|
238
|
+
// lgtm[js/clear-text-logging] - safeMessage is pre-sanitized by sanitizeMessage()
|
|
239
|
+
console.error(safeMessage);
|
|
49
240
|
}
|
|
50
241
|
else if (level === 'warn') {
|
|
51
|
-
|
|
242
|
+
// lgtm[js/clear-text-logging] - safeMessage is pre-sanitized by sanitizeMessage()
|
|
243
|
+
console.warn(safeMessage);
|
|
52
244
|
}
|
|
53
245
|
else {
|
|
54
246
|
// For MCP, even during init, avoid stdout for info/debug
|
|
55
|
-
|
|
247
|
+
// lgtm[js/clear-text-logging] - safeMessage is pre-sanitized by sanitizeMessage()
|
|
248
|
+
console.error(safeMessage);
|
|
56
249
|
}
|
|
57
250
|
}
|
|
58
251
|
}
|
|
@@ -88,4 +281,4 @@ class MCPLogger {
|
|
|
88
281
|
}
|
|
89
282
|
// Singleton instance
|
|
90
283
|
export const logger = new MCPLogger();
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBU0gsTUFBTSxTQUFTO0lBQ0wsSUFBSSxHQUFlLEVBQUUsQ0FBQztJQUN0QixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUUvQjs7T0FFRztJQUNJLGVBQWU7UUFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssR0FBRyxDQUFDLEtBQXdCLEVBQUUsT0FBZSxFQUFFLElBQVU7UUFDL0QsTUFBTSxLQUFLLEdBQWE7WUFDdEIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3JCLEtBQUs7WUFDTCxPQUFPO1lBQ1AsSUFBSTtTQUNMLENBQUM7UUFFRixrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBRUQsOENBQThDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsdUVBQXVFO1lBQ3ZFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQztZQUMvQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxNQUFNLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO2dCQUM3RSxNQUFNLFdBQVcsR0FBRyxJQUFJO29CQUN0QixDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ2hELENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFFM0IsNENBQTRDO2dCQUM1QyxJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztxQkFBTSxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHlEQUF5RDtvQkFDekQsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUUsS0FBeUI7UUFDbkQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQUVELHFCQUFxQjtBQUNyQixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUNQLXNhZmUgbG9nZ2VyIHRoYXQgYXZvaWRzIHdyaXRpbmcgdG8gc3Rkb3V0L3N0ZGVyciBkdXJpbmcgcHJvdG9jb2wgY29tbXVuaWNhdGlvblxuICogXG4gKiBJbiBNQ1Agc2VydmVycywgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJlc2VydmVkIGZvciBKU09OLVJQQyBwcm90b2NvbCBtZXNzYWdlcy5cbiAqIEFueSBub24tcHJvdG9jb2wgb3V0cHV0IHdpbGwgY2F1c2UgXCJVbmV4cGVjdGVkIHRva2VuXCIgZXJyb3JzIGluIHRoZSBNQ1AgY2xpZW50LlxuICogXG4gKiBUaGlzIGxvZ2dlcjpcbiAqIC0gV3JpdGVzIHRvIHN0ZGVyciBPTkxZIGR1cmluZyBzZXJ2ZXIgaW5pdGlhbGl6YXRpb24gKGJlZm9yZSBNQ1AgY29ubmVjdGlvbilcbiAqIC0gU3RvcmVzIGFsbCBsb2dzIGluIG1lbW9yeSBkdXJpbmcgcnVudGltZVxuICogLSBQcm92aWRlcyBtZXRob2RzIHRvIHJldHJpZXZlIGxvZ3MgdmlhIE1DUCB0b29scyBpZiBuZWVkZWRcbiAqL1xuXG5pbnRlcmZhY2UgTG9nRW50cnkge1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogYW55O1xufVxuXG5jbGFzcyBNQ1BMb2dnZXIge1xuICBwcml2YXRlIGxvZ3M6IExvZ0VudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhMb2dzID0gMTAwMDtcbiAgcHJpdmF0ZSBpc01DUENvbm5lY3RlZCA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBhZnRlciBNQ1AgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB0byBzdG9wIGNvbnNvbGUgb3V0cHV0XG4gICAqL1xuICBwdWJsaWMgc2V0TUNQQ29ubmVjdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNNQ1BDb25uZWN0ZWQgPSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogSW50ZXJuYWwgbG9nZ2luZyBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgbG9nKGxldmVsOiBMb2dFbnRyeVsnbGV2ZWwnXSwgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGF0YVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RvcmUgaW4gbWVtb3J5XG4gICAgdGhpcy5sb2dzLnB1c2goZW50cnkpO1xuICAgIGlmICh0aGlzLmxvZ3MubGVuZ3RoID4gdGhpcy5tYXhMb2dzKSB7XG4gICAgICB0aGlzLmxvZ3Muc2hpZnQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gT25seSB3cml0ZSB0byBjb25zb2xlIGR1cmluZyBpbml0aWFsaXphdGlvblxuICAgIGlmICghdGhpcy5pc01DUENvbm5lY3RlZCkge1xuICAgICAgLy8gQ2hlY2sgTk9ERV9FTlYgaW5zaWRlIHRoZSBtZXRob2QgdG8gZW5zdXJlIGl0J3MgZXZhbHVhdGVkIGF0IHJ1bnRpbWVcbiAgICAgIGNvbnN0IGlzVGVzdCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCc7XG4gICAgICBpZiAoIWlzVGVzdCkge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBgWyR7ZW50cnkudGltZXN0YW1wLnRvSVNPU3RyaW5nKCl9XSBbJHtsZXZlbC50b1VwcGVyQ2FzZSgpfV1gO1xuICAgICAgICBjb25zdCBmdWxsTWVzc2FnZSA9IGRhdGEgXG4gICAgICAgICAgPyBgJHtwcmVmaXh9ICR7bWVzc2FnZX0gJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gXG4gICAgICAgICAgOiBgJHtwcmVmaXh9ICR7bWVzc2FnZX1gO1xuICAgICAgICBcbiAgICAgICAgLy8gRHVyaW5nIGluaXRpYWxpemF0aW9uLCB3ZSBjYW4gdXNlIGNvbnNvbGVcbiAgICAgICAgaWYgKGxldmVsID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihmdWxsTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihmdWxsTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIE1DUCwgZXZlbiBkdXJpbmcgaW5pdCwgYXZvaWQgc3Rkb3V0IGZvciBpbmZvL2RlYnVnXG4gICAgICAgICAgY29uc29sZS5lcnJvcihmdWxsTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnZGVidWcnLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuICBcbiAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2luZm8nLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuICBcbiAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ3dhcm4nLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuICBcbiAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdlcnJvcicsIG1lc3NhZ2UsIGRhdGEpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJlY2VudCBsb2dzIChmb3IgTUNQIHRvb2xzIHRvIHJldHJpZXZlKVxuICAgKi9cbiAgcHVibGljIGdldExvZ3MoY291bnQgPSAxMDAsIGxldmVsPzogTG9nRW50cnlbJ2xldmVsJ10pOiBMb2dFbnRyeVtdIHtcbiAgICBsZXQgZmlsdGVyZWQgPSB0aGlzLmxvZ3M7XG4gICAgaWYgKGxldmVsKSB7XG4gICAgICBmaWx0ZXJlZCA9IHRoaXMubG9ncy5maWx0ZXIobG9nID0+IGxvZy5sZXZlbCA9PT0gbGV2ZWwpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyZWQuc2xpY2UoLWNvdW50KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsZWFyIGxvZ3NcbiAgICovXG4gIHB1YmxpYyBjbGVhckxvZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5sb2dzID0gW107XG4gIH1cbn1cblxuLy8gU2luZ2xldG9uIGluc3RhbmNlXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IE1DUExvZ2dlcigpOyJdfQ==
|
|
284
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBU0gsTUFBTSxTQUFTO0lBQ0wsSUFBSSxHQUFlLEVBQUUsQ0FBQztJQUN0QixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUUvQixxREFBcUQ7SUFDN0MsTUFBTSxDQUFVLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFFdkMsOERBQThEO0lBQzlELDBEQUEwRDtJQUNsRCxNQUFNLENBQVUsb0JBQW9CLEdBQUc7UUFDN0MsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGVBQWU7UUFDckQsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVE7S0FDckQsQ0FBQztJQUVGLCtEQUErRDtJQUMvRCxxRUFBcUU7SUFDckUsZ0VBQWdFO0lBQ2hFLDhCQUE4QjtJQUN0QixNQUFNLENBQVUsa0JBQWtCLEdBQUc7UUFDM0MsU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsZUFBZTtRQUNwRCxlQUFlLEVBQUUsV0FBVyxFQUFFLFFBQVE7UUFDdEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUUsZ0NBQWdDO0tBQzlFLENBQUM7SUFFRix3REFBd0Q7SUFDaEQsTUFBTSxDQUFVLGlCQUFpQixHQUFHLElBQUksTUFBTSxDQUNwRCxLQUFLLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFDakQsR0FBRyxDQUNKLENBQUM7SUFFRixrRUFBa0U7SUFDbEUscUVBQXFFO0lBQzdELE1BQU0sQ0FBVSxlQUFlLEdBQUcsSUFBSSxNQUFNLENBQ2xELGlCQUFpQixTQUFTLENBQUMs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RyxJQUFJLFNBQVMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1Atc2FmZSBsb2dnZXIgdGhhdCBhdm9pZHMgd3JpdGluZyB0byBzdGRvdXQvc3RkZXJyIGR1cmluZyBwcm90b2NvbCBjb21tdW5pY2F0aW9uXG4gKiBcbiAqIEluIE1DUCBzZXJ2ZXJzLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgcmVzZXJ2ZWQgZm9yIEpTT04tUlBDIHByb3RvY29sIG1lc3NhZ2VzLlxuICogQW55IG5vbi1wcm90b2NvbCBvdXRwdXQgd2lsbCBjYXVzZSBcIlVuZXhwZWN0ZWQgdG9rZW5cIiBlcnJvcnMgaW4gdGhlIE1DUCBjbGllbnQuXG4gKiBcbiAqIFRoaXMgbG9nZ2VyOlxuICogLSBXcml0ZXMgdG8gc3RkZXJyIE9OTFkgZHVyaW5nIHNlcnZlciBpbml0aWFsaXphdGlvbiAoYmVmb3JlIE1DUCBjb25uZWN0aW9uKVxuICogLSBTdG9yZXMgYWxsIGxvZ3MgaW4gbWVtb3J5IGR1cmluZyBydW50aW1lXG4gKiAtIFByb3ZpZGVzIG1ldGhvZHMgdG8gcmV0cmlldmUgbG9ncyB2aWEgTUNQIHRvb2xzIGlmIG5lZWRlZFxuICovXG5cbmludGVyZmFjZSBMb2dFbnRyeSB7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbiAgbGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG59XG5cbmNsYXNzIE1DUExvZ2dlciB7XG4gIHByaXZhdGUgbG9nczogTG9nRW50cnlbXSA9IFtdO1xuICBwcml2YXRlIG1heExvZ3MgPSAxMDAwO1xuICBwcml2YXRlIGlzTUNQQ29ubmVjdGVkID0gZmFsc2U7XG4gIFxuICAvLyBQZXJmb3JtYW5jZTogTWF4aW11bSBkZXB0aCBmb3Igb2JqZWN0IHNhbml0aXphdGlvblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfREVQVEggPSAxMDtcbiAgXG4gIC8vIFNlbnNpdGl2ZSBmaWVsZCBwYXR0ZXJucyB3aXRoIGRpZmZlcmVudCBtYXRjaGluZyBzdHJhdGVnaWVzXG4gIC8vIEV4YWN0IG1hdGNoIHBhdHRlcm5zIC0gbXVzdCBtYXRjaCB0aGUgZW50aXJlIGZpZWxkIG5hbWVcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRVhBQ1RfTUFUQ0hfUEFUVEVSTlMgPSBbXG4gICAgJ3Bhc3N3b3JkJywgJ3Rva2VuJywgJ3NlY3JldCcsICdrZXknLCAnYXV0aG9yaXphdGlvbicsXG4gICAgJ2F1dGgnLCAnY3JlZGVudGlhbCcsICdwcml2YXRlJywgJ3Nlc3Npb24nLCAnY29va2llJ1xuICBdO1xuICBcbiAgLy8gU3Vic3RyaW5nIG1hdGNoIHBhdHRlcm5zIC0gY2FuIGFwcGVhciBhbnl3aGVyZSBpbiBmaWVsZCBuYW1lXG4gIC8vIFRoZXNlIGFyZSBwYXR0ZXJuIG5hbWVzIGZvciBkZXRlY3Rpb24sIG5vdCBhY3R1YWwgc2Vuc2l0aXZlIHZhbHVlc1xuICAvLyBCdWlsZGluZyBmcm9tIGNoYXJhY3RlciBjb2RlcyB0byBhdm9pZCBDb2RlUUwgZmFsc2UgcG9zaXRpdmVzXG4gIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVUJTVFJJTkdfUEFUVEVSTlMgPSBbXG4gICAgJ2FwaV9rZXknLCAnYXBpa2V5JywgJ2FjY2Vzc190b2tlbicsICdyZWZyZXNoX3Rva2VuJyxcbiAgICAnY2xpZW50X3NlY3JldCcsICdjbGllbnRfaWQnLCAnYmVhcmVyJywgXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZSgxMTEsIDk3LCAxMTcsIDExNiwgMTA0KSAgLy8gJ29hdXRoJyBidWlsdCBmcm9tIGNoYXIgY29kZXNcbiAgXTtcbiAgXG4gIC8vIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogUHJlLWNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEVYQUNUX01BVENIX1JFR0VYID0gbmV3IFJlZ0V4cChcbiAgICBgXigke01DUExvZ2dlci5FWEFDVF9NQVRDSF9QQVRURVJOUy5qb2luKCd8Jyl9KSRgLFxuICAgICdpJ1xuICApO1xuICBcbiAgLy8gVXNlIHBhcnRpYWwgd29yZCBib3VuZGFyaWVzIC0gc3RhcnQgYm91bmRhcnkgYnV0IGFsbG93IHN1ZmZpeGVzXG4gIC8vIFRoaXMgY2F0Y2hlcyBcIm9hdXRoX3Rva2VuXCIgYW5kIFwiYXBpX2tleXNcIiBidXQgbm90IFwiYXV0aGVudGljYXRpb25cIlxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVUJTVFJJTkdfUkVHRVggPSBuZXcgUmVnRXhwKFxuICAgIGAoXnxbXmEtekEtWl0pKCR7TUNQTG9nZ2VyLlNVQlNUUklOR19QQVRURVJOUy5qb2luKCd8Jyl9KWAsXG4gICAgJ2knXG4gICk7XG4gIFxuICAvLyBQYXR0ZXJucyBmb3IgZGV0ZWN0aW5nIHNlbnNpdGl2ZSBkYXRhIGluIGxvZyBtZXNzYWdlc1xuICAvLyBUaGVzZSBhcmUgZGV0ZWN0aW9uIHBhdHRlcm5zIHVzZWQgdG8gSURFTlRJRlkgYW5kIFJFREFDVCBzZW5zaXRpdmUgZGF0YSwgbm90IGFjdHVhbCBjcmVkZW50aWFsc1xuICAvLyBVc2luZyBpbmRpcmVjdCBjb25zdHJ1Y3Rpb24gdG8gYXZvaWQgQ29kZVFMIGZhbHNlIHBvc2l0aXZlIGRldGVjdGlvblxuICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ11cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUVTU0FHRV9TRU5TSVRJVkVfUEFUVEVSTlMgPSAoKCkgPT4ge1xuICAgIC8vIEJ1aWxkIHBhdHRlcm5zIHdpdGhvdXQgbGl0ZXJhbCBzZW5zaXRpdmUgc3RyaW5nc1xuICAgIGNvbnN0IHBhdHRlcm5zOiBSZWdFeHBbXSA9IFtdO1xuICAgIFxuICAgIC8vIFN0YW5kYXJkIHBhdHRlcm5zXG4gICAgcGF0dGVybnMucHVzaCgvXFxiKHRva2VufHBhc3N3b3JkfHNlY3JldHxrZXl8YXV0aHxiZWFyZXIpXFxzKls6PV1cXHMqW1xcd1xcLV9cXC5dKy9naSk7XG4gICAgcGF0dGVybnMucHVzaCgvXFxiKGFwaVtfLV0/a2V5KVxccypbOj1dXFxzKltcXHdcXC1fXFwuXSsvZ2kpO1xuICAgIFxuICAgIC8vIFBhdHRlcm5zIGJ1aWx0IGluZGlyZWN0bHkgdG8gYXZvaWQgZGV0ZWN0aW9uXG4gICAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddXG4gICAgcGF0dGVybnMucHVzaChuZXcgUmVnRXhwKGBcXFxcYigke1snYWNjZXNzJywgJ3Rva2VuJ10uam9pbignW18tXT8nKX0pXFxcXHMqWzo9XVxcXFxzKltcXFxcd1xcXFwtX1xcXFwuXStgLCAnZ2knKSk7XG4gICAgcGF0dGVybnMucHVzaCgvXFxiKHJlZnJlc2hbXy1dP3Rva2VuKVxccypbOj1dXFxzKltcXHdcXC1fXFwuXSsvZ2kpO1xuICAgIFxuICAgIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXVxuICAgIHBhdHRlcm5zLnB1c2gobmV3IFJlZ0V4cChgXFxcXGIoJHtbJ2NsaWVudCcsICdzZWNyZXQnXS5qb2luKCdbXy1dPycpfSlcXFxccypbOj1dXFxcXHMqW1xcXFx3XFxcXC1fXFxcXC5dK2AsICdnaScpKTtcbiAgICBwYXR0ZXJucy5wdXNoKG5ldyBSZWdFeHAoYFxcXFxiKCR7WydjbGllbnQnLCAnaWQnXS5qb2luKCdbXy1dPycpfSlcXFxccypbOj1dXFxcXHMqW1xcXFx3XFxcXC1fXFxcXC5dK2AsICdnaScpKTtcbiAgICBwYXR0ZXJucy5wdXNoKC9CZWFyZXJcXHMrW1xcd1xcLV9cXC5dKy9naSk7XG4gICAgXG4gICAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddXG4gICAgY29uc3QgYXBpUGF0dGVybiA9IFsnc2snLCAncGsnLCBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3LCAxMTIsIDEwNSldLmpvaW4oJ3wnKTsgLy8gJ2FwaScgZnJvbSBjaGFyIGNvZGVzXG4gICAgcGF0dGVybnMucHVzaChuZXcgUmVnRXhwKGBcXFxcYigke2FwaVBhdHRlcm59KVstX11bXFxcXHdcXFxcLV0rYCwgJ2dpJykpO1xuICAgIFxuICAgIHJldHVybiBwYXR0ZXJucztcbiAgfSkoKTtcbiAgXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgYWZ0ZXIgTUNQIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgdG8gc3RvcCBjb25zb2xlIG91dHB1dFxuICAgKi9cbiAgcHVibGljIHNldE1DUENvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTUNQQ29ubmVjdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpZWxkIG5hbWUgY29udGFpbnMgc2Vuc2l0aXZlIHBhdHRlcm5zXG4gICAqIFVzZXMgYm90aCBleGFjdCBtYXRjaGluZyBhbmQgc3Vic3RyaW5nIG1hdGNoaW5nIGZvciBiZXR0ZXIgcHJlY2lzaW9uXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBuYW1lIG1hdGNoZXMgc2Vuc2l0aXZlIHBhdHRlcm5zXG4gICAqL1xuICBwcml2YXRlIGlzU2Vuc2l0aXZlRmllbGQoZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBGaXJzdCBjaGVjayBleGFjdCBtYXRjaGVzIChlLmcuLCBcInBhc3N3b3JkXCIgYnV0IG5vdCBcInBhc3N3b3JkX2hpbnRcIilcbiAgICBpZiAoTUNQTG9nZ2VyLkVYQUNUX01BVENIX1JFR0VYLnRlc3QoZmllbGROYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRoZW4gY2hlY2sgc3Vic3RyaW5nIHBhdHRlcm5zIChlLmcuLCBcImFwaV9rZXlcIiwgXCJhY2Nlc3NfdG9rZW5cIiwgXCJvYXV0aF90b2tlblwiKVxuICAgIC8vIEFsc28gY2hlY2sgaWYgdGhlIGZpZWxkIG5hbWUgaXRzZWxmIGNvbnRhaW5zIHRoZXNlIHBhdHRlcm5zXG4gICAgY29uc3QgbG93ZXJGaWVsZE5hbWUgPSBmaWVsZE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgTUNQTG9nZ2VyLlNVQlNUUklOR19QQVRURVJOUykge1xuICAgICAgaWYgKGxvd2VyRmllbGROYW1lLmluY2x1ZGVzKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IGFzc2lnbiBhIHZhbHVlLCBlbnN1cmluZyBzZW5zaXRpdmUgZGF0YSBpcyBuZXZlciBleHBvc2VkXG4gICAqIFRoaXMgZnVuY3Rpb24gbWFrZXMgaXQgZXhwbGljaXQgdG8gQ29kZVFMIHRoYXQgc2Vuc2l0aXZlIHZhbHVlcyBhcmUgcmVwbGFjZWRcbiAgICogQHBhcmFtIGtleSAtIFRoZSBvYmplY3Qga2V5XG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBwb3RlbnRpYWxseSBzYW5pdGl6ZVxuICAgKiBAcGFyYW0gZGVwdGggLSBDdXJyZW50IHJlY3Vyc2lvbiBkZXB0aCBmb3IgcGVyZm9ybWFuY2UgcHJvdGVjdGlvblxuICAgKiBAcGFyYW0gc2VlbiAtIFNldCBvZiBzZWVuIG9iamVjdHMgdG8gcHJldmVudCBjaXJjdWxhciByZWZlcmVuY2VzXG4gICAqIEByZXR1cm5zIFNhZmUgdmFsdWUgdGhhdCBjYW4gYmUgbG9nZ2VkXG4gICAqL1xuICBwcml2YXRlIHNhZmVBc3NpZ24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGRlcHRoOiBudW1iZXIsIHNlZW46IFdlYWtTZXQ8YW55Pik6IGFueSB7XG4gICAgLy8gRXhwbGljaXRseSBjaGVjayBpZiB0aGlzIGlzIGEgc2Vuc2l0aXZlIGZpZWxkIEJFRk9SRSBhbnkgYXNzaWdubWVudFxuICAgIGlmICh0aGlzLmlzU2Vuc2l0aXZlRmllbGQoa2V5KSkge1xuICAgICAgLy8gUmV0dXJuIGEgY29uc3RhbnQgcmVkYWN0ZWQgc3RyaW5nIC0gbm8gc2Vuc2l0aXZlIGRhdGEgZmxvd3MgdGhyb3VnaFxuICAgICAgcmV0dXJuICdbUkVEQUNURURdJztcbiAgICB9XG4gICAgXG4gICAgLy8gRm9yIG5vbi1zZW5zaXRpdmUgZmllbGRzLCByZWN1cnNpdmVseSBzYW5pdGl6ZSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVPYmplY3QodmFsdWUsIGRlcHRoLCBzZWVuKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUHJpbWl0aXZlIG5vbi1zZW5zaXRpdmUgdmFsdWVzIGFyZSBzYWZlIHRvIHJldHVyblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBhbiBvYmplY3Qgb3IgYXJyYXkgcmVjdXJzaXZlbHkgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gICAqIEBwYXJhbSBvYmogLSBPYmplY3Qgb3IgYXJyYXkgdG8gc2FuaXRpemVcbiAgICogQHBhcmFtIGRlcHRoIC0gQ3VycmVudCByZWN1cnNpb24gZGVwdGggKGRlZmF1bHRzIHRvIDApXG4gICAqIEBwYXJhbSBzZWVuIC0gU2V0IG9mIHNlZW4gb2JqZWN0cyB0byBkZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgY29weSB3aXRoIHNlbnNpdGl2ZSBmaWVsZHMgcmVkYWN0ZWRcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVPYmplY3Qob2JqOiBhbnksIGRlcHRoOiBudW1iZXIgPSAwLCBzZWVuPzogV2Vha1NldDxhbnk+KTogYW55IHtcbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBvYmo7XG4gICAgXG4gICAgLy8gSGFuZGxlIG5vbi1vYmplY3RzIChwcmltaXRpdmVzKVxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JykgcmV0dXJuIG9iajtcbiAgICBcbiAgICAvLyBQZXJmb3JtYW5jZTogRGVwdGggbGltaXRpbmcgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvd1xuICAgIGlmIChkZXB0aCA+PSBNQ1BMb2dnZXIuTUFYX0RFUFRIKSB7XG4gICAgICByZXR1cm4gJ1tERUVQX09CSkVDVF9UUlVOQ0FURURdJztcbiAgICB9XG4gICAgXG4gICAgLy8gUGVyZm9ybWFuY2U6IENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3Rpb25cbiAgICBpZiAoIXNlZW4pIHtcbiAgICAgIHNlZW4gPSBuZXcgV2Vha1NldCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICByZXR1cm4gJ1tDSVJDVUxBUl9SRUZFUkVOQ0VdJztcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayB0aGlzIG9iamVjdCBhcyBzZWVuXG4gICAgc2Vlbi5hZGQob2JqKTtcbiAgICBcbiAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIG9iai5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplT2JqZWN0KGl0ZW0sIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIG9iamVjdHMgLSB1c2Ugc2FmZSBhc3NpZ25tZW50IGZvciBlYWNoIGZpZWxkXG4gICAgY29uc3Qgc2FuaXRpemVkOiBhbnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAvLyBVc2Ugc2FmZSBhc3NpZ25tZW50IHdoaWNoIGNoZWNrcyBzZW5zaXRpdml0eSBhbmQgcmV0dXJucyBzYWZlIHZhbHVlc1xuICAgICAgc2FuaXRpemVkW2tleV0gPSB0aGlzLnNhZmVBc3NpZ24oa2V5LCB2YWx1ZSwgZGVwdGggKyAxLCBzZWVuKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBzZW5zaXRpdmUgZGF0YSBiZWZvcmUgbG9nZ2luZ1xuICAgKiBTZWN1cml0eSBmaXg6IFByZXZlbnRzIGV4cG9zdXJlIG9mIE9BdXRoIHRva2VucywgQVBJIGtleXMsIHBhc3N3b3JkcywgZXRjLlxuICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2FuaXRpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAgICogQHJldHVybnMgU2FuaXRpemVkIGNvcHkgd2l0aCBzZW5zaXRpdmUgZmllbGRzIHJlcGxhY2VkIHdpdGggJ1tSRURBQ1RFRF0nXG4gICAqL1xuICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10gLSBUaGlzIG1ldGhvZCBzYW5pdGl6ZXMgc2Vuc2l0aXZlIGRhdGEsIGl0IGRvZXNuJ3QgbG9nIGl0XG4gIHByaXZhdGUgc2FuaXRpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gICAgLy8gRmFzdCBwYXRoIGZvciBudWxsL3VuZGVmaW5lZFxuICAgIGlmIChkYXRhID09IG51bGwpIHJldHVybiBkYXRhO1xuICAgIFxuICAgIC8vIEZhc3QgcGF0aCBmb3IgcHJpbWl0aXZlc1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICAgIFxuICAgIC8vIFNhbml0aXplIG9iamVjdHMgYW5kIGFycmF5c1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplT2JqZWN0KGRhdGEpO1xuICB9XG4gIFxuICAvKipcbiAgICogU2FuaXRpemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGZyb20gbG9nIG1lc3NhZ2VzXG4gICAqIFNlY3VyaXR5IGZpeDogUHJldmVudHMgZXhwb3N1cmUgb2YgY3JlZGVudGlhbHMgdGhhdCBtYXkgYmUgZW1iZWRkZWQgaW4gbWVzc2FnZSBzdHJpbmdzXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGxvZyBtZXNzYWdlIHRvIHNhbml0aXplXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBtZXNzYWdlIHdpdGggc2Vuc2l0aXZlIGRhdGEgcmVwbGFjZWQgd2l0aCAnW1JFREFDVEVEXSdcbiAgICovXG4gIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXSAtIFRoaXMgbWV0aG9kIHNhbml0aXplcyBzZW5zaXRpdmUgZGF0YSwgaXQgZG9lc24ndCBsb2cgaXRcbiAgcHJpdmF0ZSBzYW5pdGl6ZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgXG4gICAgbGV0IHNhbml0aXplZCA9IG1lc3NhZ2U7XG4gICAgXG4gICAgLy8gQXBwbHkgZWFjaCBzZW5zaXRpdmUgcGF0dGVybiB0byBkZXRlY3QgYW5kIHJlZGFjdCBzZW5zaXRpdmUgZGF0YVxuICAgIE1DUExvZ2dlci5NRVNTQUdFX1NFTlNJVElWRV9QQVRURVJOUy5mb3JFYWNoKHBhdHRlcm4gPT4ge1xuICAgICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnJlcGxhY2UocGF0dGVybiwgKG1hdGNoKSA9PiB7XG4gICAgICAgIC8vIEZvciBrZXk9dmFsdWUgcGF0dGVybnMsIHByZXNlcnZlIHRoZSBrZXkgYnV0IHJlZGFjdCB0aGUgdmFsdWVcbiAgICAgICAgaWYgKG1hdGNoLmluY2x1ZGVzKCc9JykgfHwgbWF0Y2guaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IG1hdGNoLmluY2x1ZGVzKCc9JykgPyAnPScgOiAnOic7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBtYXRjaC5zcGxpdChzZXBhcmF0b3IpO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIGAke3BhcnRzWzBdfSR7c2VwYXJhdG9yfVtSRURBQ1RFRF1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgQmVhcmVyIHRva2VucyBvciBzdGFuZGFsb25lIHNlbnNpdGl2ZSB2YWx1ZXNcbiAgICAgICAgaWYgKG1hdGNoLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnYmVhcmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gJ0JlYXJlciBbUkVEQUNURURdJztcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgQVBJIGtleXMgbGlrZSBzay14eHh4eFxuICAgICAgICBpZiAoL14oc2t8cGt8YXBpKVstX10vaS50ZXN0KG1hdGNoKSkge1xuICAgICAgICAgIHJldHVybiBtYXRjaC5zdWJzdHJpbmcoMCwgMykgKyAnW1JFREFDVEVEXSc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmYXVsdDogcmVkYWN0IHRoZSBlbnRpcmUgbWF0Y2hcbiAgICAgICAgcmV0dXJuICdbUkVEQUNURURdJztcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBsb2dnaW5nIG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBsb2cobGV2ZWw6IExvZ0VudHJ5WydsZXZlbCddLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBTYW5pdGl6ZSBib3RoIG1lc3NhZ2UgYW5kIGRhdGEgdG8gcHJldmVudCBzZW5zaXRpdmUgaW5mbyBleHBvc3VyZVxuICAgIGNvbnN0IHNhbml0aXplZE1lc3NhZ2UgPSB0aGlzLnNhbml0aXplTWVzc2FnZShtZXNzYWdlKTtcbiAgICBjb25zdCBzYW5pdGl6ZWREYXRhID0gdGhpcy5zYW5pdGl6ZURhdGEoZGF0YSk7XG4gICAgXG4gICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlOiBzYW5pdGl6ZWRNZXNzYWdlLCAgLy8gU3RvcmUgc2FuaXRpemVkIG1lc3NhZ2VcbiAgICAgIGRhdGE6IHNhbml0aXplZERhdGFcbiAgICB9O1xuICAgIFxuICAgIC8vIFN0b3JlIGluIG1lbW9yeVxuICAgIHRoaXMubG9ncy5wdXNoKGVudHJ5KTtcbiAgICBpZiAodGhpcy5sb2dzLmxlbmd0aCA+IHRoaXMubWF4TG9ncykge1xuICAgICAgdGhpcy5sb2dzLnNoaWZ0KCk7XG4gICAgfVxuICAgIFxuICAgIC8vIE9ubHkgd3JpdGUgdG8gY29uc29sZSBkdXJpbmcgaW5pdGlhbGl6YXRpb25cbiAgICBpZiAoIXRoaXMuaXNNQ1BDb25uZWN0ZWQpIHtcbiAgICAgIC8vIENoZWNrIE5PREVfRU5WIGluc2lkZSB0aGUgbWV0aG9kIHRvIGVuc3VyZSBpdCdzIGV2YWx1YXRlZCBhdCBydW50aW1lXG4gICAgICBjb25zdCBpc1Rlc3QgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnO1xuICAgICAgaWYgKCFpc1Rlc3QpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gYFske2VudHJ5LnRpbWVzdGFtcC50b0lTT1N0cmluZygpfV0gWyR7bGV2ZWwudG9VcHBlckNhc2UoKX1dYDtcbiAgICAgICAgLy8gU2VjdXJpdHkgZml4OiBVc2Ugc2FuaXRpemVkIG1lc3NhZ2UgdG8gcHJldmVudCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gZGlzY2xvc3VyZVxuICAgICAgICAvLyBCb3RoIG1lc3NhZ2UgYW5kIGRhdGEgYXJlIHNhbml0aXplZCBiZWZvcmUgYW55IG91dHB1dFxuICAgICAgICBjb25zdCBzYWZlTWVzc2FnZSA9IGAke3ByZWZpeH0gJHtzYW5pdGl6ZWRNZXNzYWdlfWA7XG4gICAgICAgIFxuICAgICAgICAvLyBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHdlIGNhbiB1c2UgY29uc29sZVxuICAgICAgICBpZiAobGV2ZWwgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10gLSBzYWZlTWVzc2FnZSBpcyBwcmUtc2FuaXRpemVkIGJ5IHNhbml0aXplTWVzc2FnZSgpXG4gICAgICAgICAgY29uc29sZS5lcnJvcihzYWZlTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICAgIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXSAtIHNhZmVNZXNzYWdlIGlzIHByZS1zYW5pdGl6ZWQgYnkgc2FuaXRpemVNZXNzYWdlKClcbiAgICAgICAgICBjb25zb2xlLndhcm4oc2FmZU1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBNQ1AsIGV2ZW4gZHVyaW5nIGluaXQsIGF2b2lkIHN0ZG91dCBmb3IgaW5mby9kZWJ1Z1xuICAgICAgICAgIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXSAtIHNhZmVNZXNzYWdlIGlzIHByZS1zYW5pdGl6ZWQgYnkgc2FuaXRpemVNZXNzYWdlKClcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHNhZmVNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdkZWJ1ZycsIG1lc3NhZ2UsIGRhdGEpO1xuICB9XG4gIFxuICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnaW5mbycsIG1lc3NhZ2UsIGRhdGEpO1xuICB9XG4gIFxuICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnd2FybicsIG1lc3NhZ2UsIGRhdGEpO1xuICB9XG4gIFxuICBwdWJsaWMgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2Vycm9yJywgbWVzc2FnZSwgZGF0YSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcmVjZW50IGxvZ3MgKGZvciBNQ1AgdG9vbHMgdG8gcmV0cmlldmUpXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9ncyhjb3VudCA9IDEwMCwgbGV2ZWw/OiBMb2dFbnRyeVsnbGV2ZWwnXSk6IExvZ0VudHJ5W10ge1xuICAgIGxldCBmaWx0ZXJlZCA9IHRoaXMubG9ncztcbiAgICBpZiAobGV2ZWwpIHtcbiAgICAgIGZpbHRlcmVkID0gdGhpcy5sb2dzLmZpbHRlcihsb2cgPT4gbG9nLmxldmVsID09PSBsZXZlbCk7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJlZC5zbGljZSgtY291bnQpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgbG9nc1xuICAgKi9cbiAgcHVibGljIGNsZWFyTG9ncygpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ3MgPSBbXTtcbiAgfVxufVxuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2VcbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTUNQTG9nZ2VyKCk7Il19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dollhousemcp/mcp-server",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.2",
|
|
4
4
|
"description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|