@dollhousemcp/mcp-server 1.7.3 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/collection/CollectionBrowser.js +2 -2
  2. package/dist/collection/CollectionSearch.js +3 -3
  3. package/dist/collection/PersonaDetails.js +2 -2
  4. package/dist/config/ConfigManager.d.ts +20 -0
  5. package/dist/config/ConfigManager.d.ts.map +1 -1
  6. package/dist/config/ConfigManager.js +48 -4
  7. package/dist/config/ConfigWizard.d.ts +78 -0
  8. package/dist/config/ConfigWizard.d.ts.map +1 -0
  9. package/dist/config/ConfigWizard.js +370 -0
  10. package/dist/config/ConfigWizardCheck.d.ts +47 -0
  11. package/dist/config/ConfigWizardCheck.d.ts.map +1 -0
  12. package/dist/config/ConfigWizardCheck.js +208 -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/ConfigHandler.d.ts +30 -0
  25. package/dist/handlers/ConfigHandler.d.ts.map +1 -1
  26. package/dist/handlers/ConfigHandler.js +149 -21
  27. package/dist/handlers/PortfolioPullHandler.d.ts +69 -0
  28. package/dist/handlers/PortfolioPullHandler.d.ts.map +1 -0
  29. package/dist/handlers/PortfolioPullHandler.js +340 -0
  30. package/dist/index.d.ts +4 -6
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +73 -52
  33. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -1
  34. package/dist/portfolio/GitHubPortfolioIndexer.js +8 -5
  35. package/dist/portfolio/PortfolioIndexManager.d.ts +1 -1
  36. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  37. package/dist/portfolio/PortfolioRepoManager.d.ts +16 -2
  38. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
  39. package/dist/portfolio/PortfolioRepoManager.js +95 -18
  40. package/dist/portfolio/PortfolioSyncManager.d.ts.map +1 -1
  41. package/dist/portfolio/PortfolioSyncManager.js +23 -15
  42. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  43. package/dist/security/audit/config/suppressions.js +11 -1
  44. package/dist/server/ServerSetup.d.ts.map +1 -1
  45. package/dist/server/ServerSetup.js +11 -6
  46. package/dist/server/tools/CollectionTools.js +6 -6
  47. package/dist/server/tools/ConfigTools.js +2 -2
  48. package/dist/server/tools/ConfigToolsV2.js +5 -5
  49. package/dist/server/tools/PortfolioTools.d.ts.map +1 -1
  50. package/dist/server/tools/PortfolioTools.js +16 -5
  51. package/dist/server/types.d.ts +2 -0
  52. package/dist/server/types.d.ts.map +1 -1
  53. package/dist/server/types.js +1 -1
  54. package/dist/sync/PortfolioDownloader.d.ts +27 -0
  55. package/dist/sync/PortfolioDownloader.d.ts.map +1 -0
  56. package/dist/sync/PortfolioDownloader.js +120 -0
  57. package/dist/sync/PortfolioSyncComparer.d.ts +50 -0
  58. package/dist/sync/PortfolioSyncComparer.d.ts.map +1 -0
  59. package/dist/sync/PortfolioSyncComparer.js +158 -0
  60. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
  61. package/dist/tools/portfolio/submitToPortfolioTool.js +6 -5
  62. package/dist/utils/TemplateRenderer.d.ts +63 -0
  63. package/dist/utils/TemplateRenderer.d.ts.map +1 -0
  64. package/dist/utils/TemplateRenderer.js +154 -0
  65. package/package.json +7 -6
@@ -0,0 +1,63 @@
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 { TemplateManager } from '../elements/templates/TemplateManager.js';
13
+ export interface RenderResult {
14
+ success: boolean;
15
+ content?: string;
16
+ error?: string;
17
+ performance?: {
18
+ lookupTime: number;
19
+ renderTime: number;
20
+ totalTime: number;
21
+ };
22
+ }
23
+ export declare class TemplateRenderer {
24
+ private templateManager;
25
+ constructor(templateManager: TemplateManager);
26
+ /**
27
+ * Render a template with comprehensive validation and performance tracking
28
+ *
29
+ * VALIDATION CHAIN:
30
+ * 1. Unicode normalization of template name
31
+ * 2. Template exists in manager
32
+ * 3. Template is proper Template instance
33
+ * 4. Template has render() method
34
+ * 5. render() returns a string
35
+ *
36
+ * SECURITY:
37
+ * - Unicode normalization prevents homograph attacks
38
+ * - Variables are normalized by Template.render() internally
39
+ *
40
+ * PERFORMANCE TRACKING:
41
+ * - Lookup time (finding template)
42
+ * - Render time (actual rendering)
43
+ * - Total time (complete operation)
44
+ */
45
+ render(name: string, variables?: Record<string, any>): Promise<RenderResult>;
46
+ /**
47
+ * Batch render multiple templates (useful for testing)
48
+ * SECURITY: Each template name is normalized individually
49
+ */
50
+ renderBatch(templates: Array<{
51
+ name: string;
52
+ variables: Record<string, any>;
53
+ }>): Promise<Map<string, RenderResult>>;
54
+ /**
55
+ * Validate that a template can be rendered without actually rendering it
56
+ * SECURITY: Template name is normalized to prevent Unicode attacks
57
+ */
58
+ validate(name: string): Promise<{
59
+ valid: boolean;
60
+ reason?: string;
61
+ }>;
62
+ }
63
+ //# sourceMappingURL=TemplateRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateRenderer.d.ts","sourceRoot":"","sources":["../../src/utils/TemplateRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAI3E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,eAAe;gBAAf,eAAe,EAAE,eAAe;IAEpD;;;;;;;;;;;;;;;;;;OAkBG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkGtF;;;OAGG;IACG,WAAW,CACf,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,GACjE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAWrC;;;OAGG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA4B3E"}
@@ -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.8.0",
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",
@@ -121,25 +121,26 @@
121
121
  "url": "https://github.com/sponsors/mickdarling"
122
122
  },
123
123
  "dependencies": {
124
- "@modelcontextprotocol/sdk": "^1.17.3",
124
+ "@modelcontextprotocol/sdk": "^1.18.0",
125
125
  "@types/dompurify": "^3.0.5",
126
126
  "@types/uuid": "^10.0.0",
127
+ "chalk": "^5.6.2",
127
128
  "dompurify": "^3.2.6",
128
129
  "express": "^5.1.0",
129
130
  "gray-matter": "^4.0.3",
130
131
  "js-yaml": "^4.1.0",
131
- "jsdom": "^26.1.0",
132
+ "jsdom": "^27.0.0",
132
133
  "node-fetch": "^3.3.2",
133
134
  "uuid": "^11.1.0",
134
- "zod": "^4.0.5"
135
+ "zod": "^4.1.8"
135
136
  },
136
137
  "devDependencies": {
137
138
  "@jest/globals": "^30.0.4",
138
- "@modelcontextprotocol/inspector": "^0.16.5",
139
+ "@modelcontextprotocol/inspector": "^0.16.7",
139
140
  "@types/jest": "^30.0.0",
140
141
  "@types/js-yaml": "^4.0.9",
141
142
  "@types/jsdom": "^21.1.7",
142
- "@types/node": "^24.0.15",
143
+ "@types/node": "^24.4.0",
143
144
  "cross-env": "^7.0.3",
144
145
  "dotenv": "^17.2.1",
145
146
  "jest": "^30.0.4",