@dollhousemcp/mcp-server 1.7.3 → 1.7.4
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/dist/config/ConfigWizard.d.ts +78 -0
- package/dist/config/ConfigWizard.d.ts.map +1 -0
- package/dist/config/ConfigWizard.js +370 -0
- package/dist/config/ConfigWizardCheck.d.ts +47 -0
- package/dist/config/ConfigWizardCheck.d.ts.map +1 -0
- package/dist/config/ConfigWizardCheck.js +208 -0
- package/dist/config/ConfigWizardDisplay.d.ts +64 -0
- package/dist/config/ConfigWizardDisplay.d.ts.map +1 -0
- package/dist/config/ConfigWizardDisplay.js +150 -0
- package/dist/config/WizardFirstResponse.d.ts +25 -0
- package/dist/config/WizardFirstResponse.d.ts.map +1 -0
- package/dist/config/WizardFirstResponse.js +118 -0
- package/dist/config/portfolioConfig.d.ts +40 -0
- package/dist/config/portfolioConfig.d.ts.map +1 -0
- package/dist/config/portfolioConfig.js +58 -0
- package/dist/config/wizardTemplates.d.ts +84 -0
- package/dist/config/wizardTemplates.d.ts.map +1 -0
- package/dist/config/wizardTemplates.js +195 -0
- package/dist/elements/BaseElement.d.ts +15 -0
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +38 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/PortfolioPullHandler.d.ts +69 -0
- package/dist/handlers/PortfolioPullHandler.d.ts.map +1 -0
- package/dist/handlers/PortfolioPullHandler.js +340 -0
- package/dist/scripts/scripts/run-config-wizard.js +57 -0
- package/dist/scripts/src/config/ConfigManager.js +799 -0
- package/dist/scripts/src/config/ConfigWizard.js +368 -0
- package/dist/scripts/src/errors/SecurityError.js +47 -0
- package/dist/scripts/src/security/constants.js +28 -0
- package/dist/scripts/src/security/contentValidator.js +415 -0
- package/dist/scripts/src/security/errors.js +32 -0
- package/dist/scripts/src/security/regexValidator.js +217 -0
- package/dist/scripts/src/security/secureYamlParser.js +272 -0
- package/dist/scripts/src/security/securityMonitor.js +111 -0
- package/dist/scripts/src/security/validators/unicodeValidator.js +315 -0
- package/dist/scripts/src/utils/logger.js +288 -0
- package/dist/sync/PortfolioDownloader.d.ts +27 -0
- package/dist/sync/PortfolioDownloader.d.ts.map +1 -0
- package/dist/sync/PortfolioDownloader.js +120 -0
- package/dist/sync/PortfolioSyncComparer.d.ts +50 -0
- package/dist/sync/PortfolioSyncComparer.d.ts.map +1 -0
- package/dist/sync/PortfolioSyncComparer.js +158 -0
- package/dist/tools/getWelcomeMessage.d.ts +41 -0
- package/dist/tools/getWelcomeMessage.d.ts.map +1 -0
- package/dist/tools/getWelcomeMessage.js +109 -0
- package/dist/utils/TemplateRenderer.d.ts +63 -0
- package/dist/utils/TemplateRenderer.d.ts.map +1 -0
- package/dist/utils/TemplateRenderer.js +154 -0
- package/package.json +1 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TemplateRenderer - Utility class for rendering templates with comprehensive validation
|
|
3
|
+
*
|
|
4
|
+
* IMPROVEMENTS IMPLEMENTED (per Debug Detective recommendations):
|
|
5
|
+
* 1. instanceof Template verification for type safety
|
|
6
|
+
* 2. Performance logging to track render times
|
|
7
|
+
* 3. Validation of render() return value
|
|
8
|
+
* 4. Clear separation of concerns from index.ts
|
|
9
|
+
*
|
|
10
|
+
* This addresses Issues #913 and #914 from the v1.7.3 hotfix
|
|
11
|
+
*/
|
|
12
|
+
import { Template } from '../elements/templates/Template.js';
|
|
13
|
+
import { logger } from '../utils/logger.js';
|
|
14
|
+
import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
15
|
+
export class TemplateRenderer {
|
|
16
|
+
templateManager;
|
|
17
|
+
constructor(templateManager) {
|
|
18
|
+
this.templateManager = templateManager;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Render a template with comprehensive validation and performance tracking
|
|
22
|
+
*
|
|
23
|
+
* VALIDATION CHAIN:
|
|
24
|
+
* 1. Unicode normalization of template name
|
|
25
|
+
* 2. Template exists in manager
|
|
26
|
+
* 3. Template is proper Template instance
|
|
27
|
+
* 4. Template has render() method
|
|
28
|
+
* 5. render() returns a string
|
|
29
|
+
*
|
|
30
|
+
* SECURITY:
|
|
31
|
+
* - Unicode normalization prevents homograph attacks
|
|
32
|
+
* - Variables are normalized by Template.render() internally
|
|
33
|
+
*
|
|
34
|
+
* PERFORMANCE TRACKING:
|
|
35
|
+
* - Lookup time (finding template)
|
|
36
|
+
* - Render time (actual rendering)
|
|
37
|
+
* - Total time (complete operation)
|
|
38
|
+
*/
|
|
39
|
+
async render(name, variables = {}) {
|
|
40
|
+
const startTime = performance.now();
|
|
41
|
+
try {
|
|
42
|
+
// SECURITY: Normalize template name to prevent Unicode attacks
|
|
43
|
+
const normalizedName = UnicodeValidator.normalize(name).normalizedContent;
|
|
44
|
+
// STEP 1: Find template with performance tracking
|
|
45
|
+
const lookupStart = performance.now();
|
|
46
|
+
const template = await this.templateManager.find(t => t.metadata.name === normalizedName);
|
|
47
|
+
const lookupTime = performance.now() - lookupStart;
|
|
48
|
+
logger.debug(`Template lookup for '${normalizedName}' completed in ${lookupTime.toFixed(2)}ms`);
|
|
49
|
+
// VALIDATION 1: Template exists
|
|
50
|
+
if (!template) {
|
|
51
|
+
const totalTime = performance.now() - startTime;
|
|
52
|
+
logger.warn(`Template '${normalizedName}' not found after ${lookupTime.toFixed(2)}ms lookup`);
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
error: `Template '${normalizedName}' not found`,
|
|
56
|
+
performance: { lookupTime, renderTime: 0, totalTime }
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// VALIDATION 2: Verify template is proper Template instance with render method
|
|
60
|
+
if (!(template instanceof Template) || typeof template.render !== 'function') {
|
|
61
|
+
const totalTime = performance.now() - startTime;
|
|
62
|
+
const isInstance = template instanceof Template;
|
|
63
|
+
const hasRender = typeof template?.render === 'function';
|
|
64
|
+
logger.error(`Template '${normalizedName}' validation failed. ` +
|
|
65
|
+
`Is Template instance: ${isInstance}, Has render method: ${hasRender}`);
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
error: `Template '${normalizedName}' is not a valid Template instance`,
|
|
69
|
+
performance: { lookupTime, renderTime: 0, totalTime }
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// STEP 2: Render template with performance tracking
|
|
73
|
+
// Note: Template.render() internally handles Unicode normalization for variables
|
|
74
|
+
logger.debug(`Starting render for template '${normalizedName}': ` +
|
|
75
|
+
`variables=${JSON.stringify(Object.keys(variables))}, template.id=${template.id}`);
|
|
76
|
+
const renderStart = performance.now();
|
|
77
|
+
const rendered = await template.render(variables);
|
|
78
|
+
const renderTime = performance.now() - renderStart;
|
|
79
|
+
// VALIDATION 3: Verify render() returned a string
|
|
80
|
+
if (typeof rendered !== 'string') {
|
|
81
|
+
const totalTime = performance.now() - startTime;
|
|
82
|
+
logger.error(`Template '${normalizedName}' render() returned non-string: ${typeof rendered}`);
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: `Template render failed: invalid return type (${typeof rendered})`,
|
|
86
|
+
performance: { lookupTime, renderTime, totalTime }
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// SUCCESS: Log performance metrics
|
|
90
|
+
const totalTime = performance.now() - startTime;
|
|
91
|
+
logger.info(`Template '${normalizedName}' rendered successfully: ` +
|
|
92
|
+
`lookup=${lookupTime.toFixed(2)}ms, ` +
|
|
93
|
+
`render=${renderTime.toFixed(2)}ms, ` +
|
|
94
|
+
`total=${totalTime.toFixed(2)}ms, ` +
|
|
95
|
+
`output_length=${rendered.length}`);
|
|
96
|
+
return {
|
|
97
|
+
success: true,
|
|
98
|
+
content: rendered,
|
|
99
|
+
performance: { lookupTime, renderTime, totalTime }
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const totalTime = performance.now() - startTime;
|
|
104
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
105
|
+
// Use original name in error message for clarity
|
|
106
|
+
logger.error(`Failed to render template '${name}' after ${totalTime.toFixed(2)}ms:`, error);
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
error: `Failed to render template: ${errorMessage}`,
|
|
110
|
+
performance: { lookupTime: 0, renderTime: 0, totalTime }
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Batch render multiple templates (useful for testing)
|
|
116
|
+
* SECURITY: Each template name is normalized individually
|
|
117
|
+
*/
|
|
118
|
+
async renderBatch(templates) {
|
|
119
|
+
const results = new Map();
|
|
120
|
+
for (const { name, variables } of templates) {
|
|
121
|
+
// Each render call handles its own Unicode normalization
|
|
122
|
+
results.set(name, await this.render(name, variables));
|
|
123
|
+
}
|
|
124
|
+
return results;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validate that a template can be rendered without actually rendering it
|
|
128
|
+
* SECURITY: Template name is normalized to prevent Unicode attacks
|
|
129
|
+
*/
|
|
130
|
+
async validate(name) {
|
|
131
|
+
try {
|
|
132
|
+
// SECURITY: Normalize template name
|
|
133
|
+
const normalizedName = UnicodeValidator.normalize(name).normalizedContent;
|
|
134
|
+
const template = await this.templateManager.find(t => t.metadata.name === normalizedName);
|
|
135
|
+
if (!template) {
|
|
136
|
+
return { valid: false, reason: 'Template not found' };
|
|
137
|
+
}
|
|
138
|
+
if (!(template instanceof Template)) {
|
|
139
|
+
return { valid: false, reason: 'Not a valid Template instance' };
|
|
140
|
+
}
|
|
141
|
+
if (typeof template.render !== 'function') {
|
|
142
|
+
return { valid: false, reason: 'Missing render method' };
|
|
143
|
+
}
|
|
144
|
+
return { valid: true };
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return {
|
|
148
|
+
valid: false,
|
|
149
|
+
reason: `Validation error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVSZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9UZW1wbGF0ZVJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBYTlFLE1BQU0sT0FBTyxnQkFBZ0I7SUFDUDtJQUFwQixZQUFvQixlQUFnQztRQUFoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7SUFBRyxDQUFDO0lBRXhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVksRUFBRSxZQUFpQyxFQUFFO1FBQzVELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVwQyxJQUFJLENBQUM7WUFDSCwrREFBK0Q7WUFDL0QsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1lBRTFFLGtEQUFrRDtZQUNsRCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxDQUFDO1lBQzFGLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxXQUFXLENBQUM7WUFFbkQsTUFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsY0FBYyxrQkFBa0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxD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QyxJQUFZO1FBQ3pCLElBQUksQ0FBQztZQUNILG9DQUFvQztZQUNwQyxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUM7WUFFMUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxDQUFDO1lBRTFGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztZQUN4RCxDQUFDO1lBRUQsSUFBSSxDQUFDLENBQUMsUUFBUSxZQUFZLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSwrQkFBK0IsRUFBRSxDQUFDO1lBQ25FLENBQUM7WUFFRCxJQUFJLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLENBQUM7WUFDM0QsQ0FBQztZQUVELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFekIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPO2dCQUNMLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSxxQkFBcUIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFO2FBQ3hGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUZW1wbGF0ZVJlbmRlcmVyIC0gVXRpbGl0eSBjbGFzcyBmb3IgcmVuZGVyaW5nIHRlbXBsYXRlcyB3aXRoIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvblxuICogXG4gKiBJTVBST1ZFTUVOVFMgSU1QTEVNRU5URUQgKHBlciBEZWJ1ZyBEZXRlY3RpdmUgcmVjb21tZW5kYXRpb25zKTpcbiAqIDEuIGluc3RhbmNlb2YgVGVtcGxhdGUgdmVyaWZpY2F0aW9uIGZvciB0eXBlIHNhZmV0eVxuICogMi4gUGVyZm9ybWFuY2UgbG9nZ2luZyB0byB0cmFjayByZW5kZXIgdGltZXNcbiAqIDMuIFZhbGlkYXRpb24gb2YgcmVuZGVyKCkgcmV0dXJuIHZhbHVlXG4gKiA0LiBDbGVhciBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGZyb20gaW5kZXgudHNcbiAqIFxuICogVGhpcyBhZGRyZXNzZXMgSXNzdWVzICM5MTMgYW5kICM5MTQgZnJvbSB0aGUgdjEuNy4zIGhvdGZpeFxuICovXG5cbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlLmpzJztcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xuICBwZXJmb3JtYW5jZT86IHtcbiAgICBsb29rdXBUaW1lOiBudW1iZXI7XG4gICAgcmVuZGVyVGltZTogbnVtYmVyO1xuICAgIHRvdGFsVGltZTogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGVtcGxhdGVNYW5hZ2VyOiBUZW1wbGF0ZU1hbmFnZXIpIHt9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIHRlbXBsYXRlIHdpdGggY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIGFuZCBwZXJmb3JtYW5jZSB0cmFja2luZ1xuICAgKiBcbiAgICogVkFMSURBVElPTiBDSEFJTjpcbiAgICogMS4gVW5pY29kZSBub3JtYWxpemF0aW9uIG9mIHRlbXBsYXRlIG5hbWVcbiAgICogMi4gVGVtcGxhdGUgZXhpc3RzIGluIG1hbmFnZXJcbiAgICogMy4gVGVtcGxhdGUgaXMgcHJvcGVyIFRlbXBsYXRlIGluc3RhbmNlXG4gICAqIDQuIFRlbXBsYXRlIGhhcyByZW5kZXIoKSBtZXRob2RcbiAgICogNS4gcmVuZGVyKCkgcmV0dXJucyBhIHN0cmluZ1xuICAgKiBcbiAgICogU0VDVVJJVFk6XG4gICAqIC0gVW5pY29kZSBub3JtYWxpemF0aW9uIHByZXZlbnRzIGhvbW9ncmFwaCBhdHRhY2tzXG4gICAqIC0gVmFyaWFibGVzIGFyZSBub3JtYWxpemVkIGJ5IFRlbXBsYXRlLnJlbmRlcigpIGludGVybmFsbHlcbiAgICogXG4gICAqIFBFUkZPUk1BTkNFIFRSQUNLSU5HOlxuICAgKiAtIExvb2t1cCB0aW1lIChmaW5kaW5nIHRlbXBsYXRlKVxuICAgKiAtIFJlbmRlciB0aW1lIChhY3R1YWwgcmVuZGVyaW5nKVxuICAgKiAtIFRvdGFsIHRpbWUgKGNvbXBsZXRlIG9wZXJhdGlvbilcbiAgICovXG4gIGFzeW5jIHJlbmRlcihuYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9KTogUHJvbWlzZTxSZW5kZXJSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gU0VDVVJJVFk6IE5vcm1hbGl6ZSB0ZW1wbGF0ZSBuYW1lIHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzXG4gICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgICAgXG4gICAgICAvLyBTVEVQIDE6IEZpbmQgdGVtcGxhdGUgd2l0aCBwZXJmb3JtYW5jZSB0cmFja2luZ1xuICAgICAgY29uc3QgbG9va3VwU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuZmluZCh0ID0+IHQubWV0YWRhdGEubmFtZSA9PT0gbm9ybWFsaXplZE5hbWUpO1xuICAgICAgY29uc3QgbG9va3VwVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gbG9va3VwU3RhcnQ7XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVtcGxhdGUgbG9va3VwIGZvciAnJHtub3JtYWxpemVkTmFtZX0nIGNvbXBsZXRlZCBpbiAke2xvb2t1cFRpbWUudG9GaXhlZCgyKX1tc2ApO1xuICAgICAgXG4gICAgICAvLyBWQUxJREFUSU9OIDE6IFRlbXBsYXRlIGV4aXN0c1xuICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFRlbXBsYXRlICcke25vcm1hbGl6ZWROYW1lfScgbm90IGZvdW5kIGFmdGVyICR7bG9va3VwVGltZS50b0ZpeGVkKDIpfW1zIGxvb2t1cGApO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogYFRlbXBsYXRlICcke25vcm1hbGl6ZWROYW1lfScgbm90IGZvdW5kYCxcbiAgICAgICAgICBwZXJmb3JtYW5jZTogeyBsb29rdXBUaW1lLCByZW5kZXJUaW1lOiAwLCB0b3RhbFRpbWUgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBWQUxJREFUSU9OIDI6IFZlcmlmeSB0ZW1wbGF0ZSBpcyBwcm9wZXIgVGVtcGxhdGUgaW5zdGFuY2Ugd2l0aCByZW5kZXIgbWV0aG9kXG4gICAgICBpZiAoISh0ZW1wbGF0ZSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB8fCB0eXBlb2YgdGVtcGxhdGUucmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBjb25zdCBpc0luc3RhbmNlID0gdGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZTtcbiAgICAgICAgY29uc3QgaGFzUmVuZGVyID0gdHlwZW9mICh0ZW1wbGF0ZSBhcyBhbnkpPy5yZW5kZXIgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYFRlbXBsYXRlICcke25vcm1hbGl6ZWROYW1lfScgdmFsaWRhdGlvbiBmYWlsZWQuIGAgK1xuICAgICAgICAgIGBJcyBUZW1wbGF0ZSBpbnN0YW5jZTogJHtpc0luc3RhbmNlfSwgSGFzIHJlbmRlciBtZXRob2Q6ICR7aGFzUmVuZGVyfWBcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IGBUZW1wbGF0ZSAnJHtub3JtYWxpemVkTmFtZX0nIGlzIG5vdCBhIHZhbGlkIFRlbXBsYXRlIGluc3RhbmNlYCxcbiAgICAgICAgICBwZXJmb3JtYW5jZTogeyBsb29rdXBUaW1lLCByZW5kZXJUaW1lOiAwLCB0b3RhbFRpbWUgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTVEVQIDI6IFJlbmRlciB0ZW1wbGF0ZSB3aXRoIHBlcmZvcm1hbmNlIHRyYWNraW5nXG4gICAgICAvLyBOb3RlOiBUZW1wbGF0ZS5yZW5kZXIoKSBpbnRlcm5hbGx5IGhhbmRsZXMgVW5pY29kZSBub3JtYWxpemF0aW9uIGZvciB2YXJpYWJsZXNcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFN0YXJ0aW5nIHJlbmRlciBmb3IgdGVtcGxhdGUgJyR7bm9ybWFsaXplZE5hbWV9JzogYCArXG4gICAgICAgIGB2YXJpYWJsZXM9JHtKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyh2YXJpYWJsZXMpKX0sIHRlbXBsYXRlLmlkPSR7dGVtcGxhdGUuaWR9YFxuICAgICAgKTtcbiAgICAgIFxuICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gYXdhaXQgdGVtcGxhdGUucmVuZGVyKHZhcmlhYmxlcyk7XG4gICAgICBjb25zdCByZW5kZXJUaW1lID0gcGVyZm9ybWFuY2Uubm93KCkgLSByZW5kZXJTdGFydDtcbiAgICAgIFxuICAgICAgLy8gVkFMSURBVElPTiAzOiBWZXJpZnkgcmVuZGVyKCkgcmV0dXJuZWQgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgcmVuZGVyZWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFRlbXBsYXRlICcke25vcm1hbGl6ZWROYW1lfScgcmVuZGVyKCkgcmV0dXJuZWQgbm9uLXN0cmluZzogJHt0eXBlb2YgcmVuZGVyZWR9YCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBgVGVtcGxhdGUgcmVuZGVyIGZhaWxlZDogaW52YWxpZCByZXR1cm4gdHlwZSAoJHt0eXBlb2YgcmVuZGVyZWR9KWAsXG4gICAgICAgICAgcGVyZm9ybWFuY2U6IHsgbG9va3VwVGltZSwgcmVuZGVyVGltZSwgdG90YWxUaW1lIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU1VDQ0VTUzogTG9nIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICAgIGNvbnN0IHRvdGFsVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBUZW1wbGF0ZSAnJHtub3JtYWxpemVkTmFtZX0nIHJlbmRlcmVkIHN1Y2Nlc3NmdWxseTogYCArXG4gICAgICAgIGBsb29rdXA9JHtsb29rdXBUaW1lLnRvRml4ZWQoMil9bXMsIGAgK1xuICAgICAgICBgcmVuZGVyPSR7cmVuZGVyVGltZS50b0ZpeGVkKDIpfW1zLCBgICtcbiAgICAgICAgYHRvdGFsPSR7dG90YWxUaW1lLnRvRml4ZWQoMil9bXMsIGAgK1xuICAgICAgICBgb3V0cHV0X2xlbmd0aD0ke3JlbmRlcmVkLmxlbmd0aH1gXG4gICAgICApO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBjb250ZW50OiByZW5kZXJlZCxcbiAgICAgICAgcGVyZm9ybWFuY2U6IHsgbG9va3VwVGltZSwgcmVuZGVyVGltZSwgdG90YWxUaW1lIH1cbiAgICAgIH07XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgdG90YWxUaW1lID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJztcbiAgICAgIFxuICAgICAgLy8gVXNlIG9yaWdpbmFsIG5hbWUgaW4gZXJyb3IgbWVzc2FnZSBmb3IgY2xhcml0eVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVuZGVyIHRlbXBsYXRlICcke25hbWV9JyBhZnRlciAke3RvdGFsVGltZS50b0ZpeGVkKDIpfW1zOmAsIGVycm9yKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBgRmFpbGVkIHRvIHJlbmRlciB0ZW1wbGF0ZTogJHtlcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgcGVyZm9ybWFuY2U6IHsgbG9va3VwVGltZTogMCwgcmVuZGVyVGltZTogMCwgdG90YWxUaW1lIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoIHJlbmRlciBtdWx0aXBsZSB0ZW1wbGF0ZXMgKHVzZWZ1bCBmb3IgdGVzdGluZylcbiAgICogU0VDVVJJVFk6IEVhY2ggdGVtcGxhdGUgbmFtZSBpcyBub3JtYWxpemVkIGluZGl2aWR1YWxseVxuICAgKi9cbiAgYXN5bmMgcmVuZGVyQmF0Y2goXG4gICAgdGVtcGxhdGVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0+XG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgUmVuZGVyUmVzdWx0Pj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgTWFwPHN0cmluZywgUmVuZGVyUmVzdWx0PigpO1xuICAgIFxuICAgIGZvciAoY29uc3QgeyBuYW1lLCB2YXJpYWJsZXMgfSBvZiB0ZW1wbGF0ZXMpIHtcbiAgICAgIC8vIEVhY2ggcmVuZGVyIGNhbGwgaGFuZGxlcyBpdHMgb3duIFVuaWNvZGUgbm9ybWFsaXphdGlvblxuICAgICAgcmVzdWx0cy5zZXQobmFtZSwgYXdhaXQgdGhpcy5yZW5kZXIobmFtZSwgdmFyaWFibGVzKSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgYSB0ZW1wbGF0ZSBjYW4gYmUgcmVuZGVyZWQgd2l0aG91dCBhY3R1YWxseSByZW5kZXJpbmcgaXRcbiAgICogU0VDVVJJVFk6IFRlbXBsYXRlIG5hbWUgaXMgbm9ybWFsaXplZCB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrc1xuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHZhbGlkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBTRUNVUklUWTogTm9ybWFsaXplIHRlbXBsYXRlIG5hbWVcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgICBcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuZmluZCh0ID0+IHQubWV0YWRhdGEubmFtZSA9PT0gbm9ybWFsaXplZE5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgcmVhc29uOiAnVGVtcGxhdGUgbm90IGZvdW5kJyB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoISh0ZW1wbGF0ZSBpbnN0YW5jZW9mIFRlbXBsYXRlKSkge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIHJlYXNvbjogJ05vdCBhIHZhbGlkIFRlbXBsYXRlIGluc3RhbmNlJyB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodHlwZW9mIHRlbXBsYXRlLnJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIHJlYXNvbjogJ01pc3NpbmcgcmVuZGVyIG1ldGhvZCcgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBcbiAgICAgICAgdmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgcmVhc29uOiBgVmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICB9O1xuICAgIH1cbiAgfVxufSJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dollhousemcp/mcp-server",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.4",
|
|
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",
|