@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.
Files changed (51) hide show
  1. package/dist/config/ConfigWizard.d.ts +78 -0
  2. package/dist/config/ConfigWizard.d.ts.map +1 -0
  3. package/dist/config/ConfigWizard.js +370 -0
  4. package/dist/config/ConfigWizardCheck.d.ts +47 -0
  5. package/dist/config/ConfigWizardCheck.d.ts.map +1 -0
  6. package/dist/config/ConfigWizardCheck.js +208 -0
  7. package/dist/config/ConfigWizardDisplay.d.ts +64 -0
  8. package/dist/config/ConfigWizardDisplay.d.ts.map +1 -0
  9. package/dist/config/ConfigWizardDisplay.js +150 -0
  10. package/dist/config/WizardFirstResponse.d.ts +25 -0
  11. package/dist/config/WizardFirstResponse.d.ts.map +1 -0
  12. package/dist/config/WizardFirstResponse.js +118 -0
  13. package/dist/config/portfolioConfig.d.ts +40 -0
  14. package/dist/config/portfolioConfig.d.ts.map +1 -0
  15. package/dist/config/portfolioConfig.js +58 -0
  16. package/dist/config/wizardTemplates.d.ts +84 -0
  17. package/dist/config/wizardTemplates.d.ts.map +1 -0
  18. package/dist/config/wizardTemplates.js +195 -0
  19. package/dist/elements/BaseElement.d.ts +15 -0
  20. package/dist/elements/BaseElement.d.ts.map +1 -1
  21. package/dist/elements/BaseElement.js +38 -5
  22. package/dist/generated/version.d.ts +2 -2
  23. package/dist/generated/version.js +3 -3
  24. package/dist/handlers/PortfolioPullHandler.d.ts +69 -0
  25. package/dist/handlers/PortfolioPullHandler.d.ts.map +1 -0
  26. package/dist/handlers/PortfolioPullHandler.js +340 -0
  27. package/dist/scripts/scripts/run-config-wizard.js +57 -0
  28. package/dist/scripts/src/config/ConfigManager.js +799 -0
  29. package/dist/scripts/src/config/ConfigWizard.js +368 -0
  30. package/dist/scripts/src/errors/SecurityError.js +47 -0
  31. package/dist/scripts/src/security/constants.js +28 -0
  32. package/dist/scripts/src/security/contentValidator.js +415 -0
  33. package/dist/scripts/src/security/errors.js +32 -0
  34. package/dist/scripts/src/security/regexValidator.js +217 -0
  35. package/dist/scripts/src/security/secureYamlParser.js +272 -0
  36. package/dist/scripts/src/security/securityMonitor.js +111 -0
  37. package/dist/scripts/src/security/validators/unicodeValidator.js +315 -0
  38. package/dist/scripts/src/utils/logger.js +288 -0
  39. package/dist/sync/PortfolioDownloader.d.ts +27 -0
  40. package/dist/sync/PortfolioDownloader.d.ts.map +1 -0
  41. package/dist/sync/PortfolioDownloader.js +120 -0
  42. package/dist/sync/PortfolioSyncComparer.d.ts +50 -0
  43. package/dist/sync/PortfolioSyncComparer.d.ts.map +1 -0
  44. package/dist/sync/PortfolioSyncComparer.js +158 -0
  45. package/dist/tools/getWelcomeMessage.d.ts +41 -0
  46. package/dist/tools/getWelcomeMessage.d.ts.map +1 -0
  47. package/dist/tools/getWelcomeMessage.js +109 -0
  48. package/dist/utils/TemplateRenderer.d.ts +63 -0
  49. package/dist/utils/TemplateRenderer.d.ts.map +1 -0
  50. package/dist/utils/TemplateRenderer.js +154 -0
  51. 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",
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",