@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,78 @@
1
+ /**
2
+ * ConfigWizard - Interactive configuration wizard for new DollhouseMCP installations
3
+ *
4
+ * Features:
5
+ * - Guided walkthrough of all configuration options
6
+ * - Educational explanations for each setting
7
+ * - Tracking of completion/dismissal status
8
+ * - Non-intrusive first-run experience
9
+ * - Re-runnable via MCP tool
10
+ */
11
+ import { ConfigManager } from './ConfigManager.js';
12
+ export declare class ConfigWizard {
13
+ private configManager;
14
+ private rl;
15
+ private isInteractive;
16
+ constructor(configManager: ConfigManager);
17
+ /**
18
+ * Check if the wizard should run
19
+ */
20
+ shouldRunWizard(): Promise<boolean>;
21
+ /**
22
+ * Show initial prompt to user
23
+ */
24
+ promptInitial(): Promise<'yes' | 'skip' | 'never'>;
25
+ /**
26
+ * Run the full configuration wizard
27
+ */
28
+ runWizard(): Promise<void>;
29
+ /**
30
+ * User Identity Section
31
+ */
32
+ private runUserIdentitySection;
33
+ /**
34
+ * GitHub Integration Section
35
+ */
36
+ private runGitHubSection;
37
+ /**
38
+ * Sync Settings Section
39
+ */
40
+ private runSyncSection;
41
+ /**
42
+ * Collection Settings Section
43
+ */
44
+ private runCollectionSection;
45
+ /**
46
+ * Display Settings Section
47
+ */
48
+ private runDisplaySection;
49
+ /**
50
+ * Show configuration summary
51
+ */
52
+ private showSummary;
53
+ /**
54
+ * Mark wizard as completed
55
+ */
56
+ markCompleted(skippedSections?: string[]): Promise<void>;
57
+ /**
58
+ * Mark wizard as dismissed
59
+ */
60
+ markDismissed(): Promise<void>;
61
+ /**
62
+ * Helper: Prompt for user input
63
+ */
64
+ private prompt;
65
+ /**
66
+ * Helper: Prompt for yes/no
67
+ */
68
+ private promptYesNo;
69
+ /**
70
+ * Helper: Validate email format
71
+ */
72
+ private isValidEmail;
73
+ /**
74
+ * Cleanup readline interface
75
+ */
76
+ close(): void;
77
+ }
78
+ //# sourceMappingURL=ConfigWizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigWizard.d.ts","sourceRoot":"","sources":["../../src/config/ConfigWizard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAanD,qBAAa,YAAY;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,EAAE,CAA4B;IACtC,OAAO,CAAC,aAAa,CAAU;gBAEnB,aAAa,EAAE,aAAa;IAmBxC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAUzC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAwBxD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAoEhC;;OAEG;YACW,sBAAsB;IA2CpC;;OAEG;YACW,gBAAgB;IAkC9B;;OAEG;YACW,cAAc;IA4C5B;;OAEG;YACW,oBAAoB;IAgBlC;;OAEG;YACW,iBAAiB;IAgC/B;;OAEG;YACW,WAAW;IAiCzB;;OAEG;IACG,aAAa,CAAC,eAAe,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASlE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACH,OAAO,CAAC,MAAM;IAad;;OAEG;YACW,WAAW;IAMzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * ConfigWizard - Interactive configuration wizard for new DollhouseMCP installations
3
+ *
4
+ * Features:
5
+ * - Guided walkthrough of all configuration options
6
+ * - Educational explanations for each setting
7
+ * - Tracking of completion/dismissal status
8
+ * - Non-intrusive first-run experience
9
+ * - Re-runnable via MCP tool
10
+ */
11
+ import * as readline from 'readline';
12
+ import { logger } from '../utils/logger.js';
13
+ import chalk from 'chalk';
14
+ import { getPortfolioRepositoryName } from './portfolioConfig.js';
15
+ const WIZARD_VERSION = '1.0.0';
16
+ export class ConfigWizard {
17
+ configManager;
18
+ rl;
19
+ isInteractive;
20
+ constructor(configManager) {
21
+ this.configManager = configManager;
22
+ // Check if we're in an interactive terminal
23
+ this.isInteractive = process.stdin.isTTY && process.stdout.isTTY;
24
+ // Only create readline interface if interactive
25
+ if (this.isInteractive) {
26
+ this.rl = readline.createInterface({
27
+ input: process.stdin,
28
+ output: process.stdout,
29
+ terminal: true
30
+ });
31
+ }
32
+ else {
33
+ // No interface in non-interactive mode
34
+ this.rl = null;
35
+ }
36
+ }
37
+ /**
38
+ * Check if the wizard should run
39
+ */
40
+ async shouldRunWizard() {
41
+ // Don't run in non-interactive environments (CI, automated scripts)
42
+ if (!this.isInteractive) {
43
+ return false;
44
+ }
45
+ const config = this.configManager.getConfig();
46
+ return !config.wizard?.completed && !config.wizard?.dismissed;
47
+ }
48
+ /**
49
+ * Show initial prompt to user
50
+ */
51
+ async promptInitial() {
52
+ console.log('\n' + chalk.cyan('═'.repeat(60)));
53
+ console.log(chalk.cyan.bold(' Welcome to DollhouseMCP! 🎭'));
54
+ console.log(chalk.cyan('═'.repeat(60)) + '\n');
55
+ console.log(chalk.yellow('This appears to be your first time using DollhouseMCP.'));
56
+ console.log('Would you like a guided walkthrough of the configuration options?\n');
57
+ console.log(chalk.green(' [1]') + ' Yes, guide me through the configuration');
58
+ console.log(chalk.yellow(' [2]') + ' Skip for now (ask again next time)');
59
+ console.log(chalk.gray(' [3]') + ' Don\'t show this again\n');
60
+ const choice = await this.prompt('Choice [1/2/3]: ', '2');
61
+ switch (choice) {
62
+ case '1':
63
+ return 'yes';
64
+ case '3':
65
+ return 'never';
66
+ default:
67
+ return 'skip';
68
+ }
69
+ }
70
+ /**
71
+ * Run the full configuration wizard
72
+ */
73
+ async runWizard() {
74
+ console.log('\n' + chalk.cyan('Starting Configuration Wizard...'));
75
+ console.log(chalk.gray('You can press Ctrl+C at any time to exit\n'));
76
+ try {
77
+ // Track skipped sections
78
+ const skippedSections = [];
79
+ // Section 1: User Identity
80
+ const skipIdentity = await this.runUserIdentitySection();
81
+ if (skipIdentity)
82
+ skippedSections.push('user');
83
+ // Section 2: GitHub Integration
84
+ const skipGitHub = await this.runGitHubSection();
85
+ if (skipGitHub)
86
+ skippedSections.push('github');
87
+ // Section 3: Sync Settings
88
+ const skipSync = await this.runSyncSection();
89
+ if (skipSync)
90
+ skippedSections.push('sync');
91
+ // Section 4: Collection Settings
92
+ const skipCollection = await this.runCollectionSection();
93
+ if (skipCollection)
94
+ skippedSections.push('collection');
95
+ // Section 5: Display Settings
96
+ const skipDisplay = await this.runDisplaySection();
97
+ if (skipDisplay)
98
+ skippedSections.push('display');
99
+ // Show summary and confirm
100
+ await this.showSummary();
101
+ const save = await this.promptYesNo('Save this configuration?', true);
102
+ if (save) {
103
+ await this.markCompleted(skippedSections);
104
+ console.log(chalk.green('\n✅ Configuration saved successfully!'));
105
+ console.log(chalk.gray('You can re-run this wizard anytime with the "run_config_wizard" tool.\n'));
106
+ }
107
+ else {
108
+ console.log(chalk.yellow('\n⚠️ Configuration not saved. You can run the wizard again later.\n'));
109
+ }
110
+ }
111
+ catch (error) {
112
+ if (error instanceof Error) {
113
+ if (error.message.includes('canceled')) {
114
+ console.log(chalk.yellow('\n⚠️ Wizard canceled. You can run it again later.\n'));
115
+ }
116
+ else if (error.message.includes('EACCES') || error.message.includes('permission')) {
117
+ logger.error('Permission denied while saving configuration', { error });
118
+ console.log(chalk.red('\n❌ Permission denied: Unable to save configuration.'));
119
+ console.log(chalk.yellow(' Please check file permissions for ~/.dollhouse/config.yml\n'));
120
+ }
121
+ else if (error.message.includes('ENOSPC')) {
122
+ logger.error('No space left on device', { error });
123
+ console.log(chalk.red('\n❌ Disk full: Unable to save configuration.'));
124
+ console.log(chalk.yellow(' Please free up some disk space and try again.\n'));
125
+ }
126
+ else if (error.message.includes('readline')) {
127
+ logger.error('Terminal input error', { error });
128
+ console.log(chalk.red('\n❌ Terminal error: Unable to read input.'));
129
+ console.log(chalk.yellow(' Please ensure you\'re running in an interactive terminal.\n'));
130
+ }
131
+ else {
132
+ logger.error('Unexpected error in configuration wizard', { error });
133
+ console.log(chalk.red('\n❌ An unexpected error occurred.'));
134
+ console.log(chalk.gray(` Error: ${error.message}\n`));
135
+ }
136
+ }
137
+ else {
138
+ logger.error('Unknown error in configuration wizard', { error });
139
+ console.log(chalk.red('\n❌ An unknown error occurred. Please try again later.\n'));
140
+ }
141
+ }
142
+ }
143
+ /**
144
+ * User Identity Section
145
+ */
146
+ async runUserIdentitySection() {
147
+ console.log('\n' + chalk.cyan.bold('=== User Identity Configuration ==='));
148
+ console.log('Let\'s set up your identity for persona attribution.\n');
149
+ const config = this.configManager.getConfig();
150
+ // Username
151
+ console.log(chalk.white('Username (for persona credits):'));
152
+ console.log(chalk.gray(` Current: ${config.user.username || 'not set'}`));
153
+ console.log(chalk.gray(' Recommended: Your GitHub username'));
154
+ const username = await this.prompt(' > ', config.user.username || '');
155
+ if (username) {
156
+ await this.configManager.updateSetting('user.username', username);
157
+ }
158
+ // Email with validation
159
+ console.log(chalk.white('\nEmail (for Git commits and GitHub attribution):'));
160
+ console.log(chalk.gray(' Used for: Git author info, GitHub commits, and element attribution'));
161
+ console.log(chalk.gray(` Current: ${config.user.email || 'not set'}`));
162
+ console.log(chalk.gray(' Recommended: Your GitHub email address'));
163
+ let email = await this.prompt(' > ', config.user.email || '');
164
+ // Validate email if provided
165
+ while (email && !this.isValidEmail(email)) {
166
+ console.log(chalk.yellow(' ⚠️ Invalid email format. Please enter a valid email or leave empty to skip.'));
167
+ email = await this.prompt(' > ', '');
168
+ }
169
+ if (email) {
170
+ await this.configManager.updateSetting('user.email', email);
171
+ }
172
+ // Display Name
173
+ console.log(chalk.white('\nDisplay Name (how you appear in the community):'));
174
+ console.log(chalk.gray(` Current: ${config.user.display_name || 'not set'}`));
175
+ const displayName = await this.prompt(' > ', config.user.display_name || '');
176
+ if (displayName) {
177
+ await this.configManager.updateSetting('user.display_name', displayName);
178
+ }
179
+ return false; // Section not skipped
180
+ }
181
+ /**
182
+ * GitHub Integration Section
183
+ */
184
+ async runGitHubSection() {
185
+ console.log('\n' + chalk.cyan.bold('=== GitHub Integration ==='));
186
+ console.log('DollhouseMCP can sync your personas with GitHub for backup and sharing.\n');
187
+ const setupGitHub = await this.promptYesNo('Would you like to set up GitHub integration?', false);
188
+ if (!setupGitHub) {
189
+ console.log(chalk.gray(' Skipping GitHub setup. You can configure this later.\n'));
190
+ return true; // Section skipped
191
+ }
192
+ const config = this.configManager.getConfig();
193
+ // Repository name
194
+ console.log(chalk.white('\nGitHub Portfolio Repository:'));
195
+ console.log(chalk.gray(' This will store your personal collection'));
196
+ console.log(chalk.gray(' Format: username/repository-name'));
197
+ console.log(chalk.gray(` Default: ${config.github.portfolio.repository_name}`));
198
+ const repoName = await this.prompt(' > ', config.github.portfolio.repository_name);
199
+ if (repoName) {
200
+ await this.configManager.updateSetting('github.portfolio.repository_name', repoName);
201
+ }
202
+ // Auto-create repository
203
+ const autoCreate = await this.promptYesNo('\nAuto-create repository if it doesn\'t exist?', true);
204
+ await this.configManager.updateSetting('github.portfolio.auto_create', autoCreate);
205
+ // OAuth authentication
206
+ const useOAuth = await this.promptYesNo('\nUse OAuth for authentication? (More secure than tokens)', true);
207
+ await this.configManager.updateSetting('github.auth.use_oauth', useOAuth);
208
+ return false; // Section not skipped
209
+ }
210
+ /**
211
+ * Sync Settings Section
212
+ */
213
+ async runSyncSection() {
214
+ console.log('\n' + chalk.cyan.bold('=== Sync Settings ==='));
215
+ console.log('Control how your personas sync with GitHub.\n');
216
+ const enableSync = await this.promptYesNo('Enable sync features? (You can always enable later)', false);
217
+ await this.configManager.updateSetting('sync.enabled', enableSync);
218
+ if (!enableSync) {
219
+ console.log(chalk.gray(' Sync disabled. You can enable it later in settings.\n'));
220
+ return true; // Section skipped (partially)
221
+ }
222
+ // Individual sync settings
223
+ console.log(chalk.white('\nIndividual Sync Settings:'));
224
+ const requireConfirm = await this.promptYesNo(' Require confirmation before sync?', true);
225
+ await this.configManager.updateSetting('sync.individual.require_confirmation', requireConfirm);
226
+ const showDiff = await this.promptYesNo(' Show diff before syncing?', true);
227
+ await this.configManager.updateSetting('sync.individual.show_diff_before_sync', showDiff);
228
+ const trackVersions = await this.promptYesNo(' Keep version history?', true);
229
+ await this.configManager.updateSetting('sync.individual.track_versions', trackVersions);
230
+ if (trackVersions) {
231
+ const historyCount = await this.prompt(' How many versions to keep? [10]: ', '10');
232
+ await this.configManager.updateSetting('sync.individual.keep_history', parseInt(historyCount) || 10);
233
+ }
234
+ // Privacy settings
235
+ console.log(chalk.white('\nPrivacy Settings:'));
236
+ const scanSecrets = await this.promptYesNo(' Scan for secrets before upload?', true);
237
+ await this.configManager.updateSetting('sync.privacy.scan_for_secrets', scanSecrets);
238
+ const scanPII = await this.promptYesNo(' Scan for PII (personal info)?', true);
239
+ await this.configManager.updateSetting('sync.privacy.scan_for_pii', scanPII);
240
+ const warnSensitive = await this.promptYesNo(' Warn on sensitive content?', true);
241
+ await this.configManager.updateSetting('sync.privacy.warn_on_sensitive', warnSensitive);
242
+ return false; // Section not skipped
243
+ }
244
+ /**
245
+ * Collection Settings Section
246
+ */
247
+ async runCollectionSection() {
248
+ console.log('\n' + chalk.cyan.bold('=== Collection Settings ==='));
249
+ console.log('The DollhouseMCP Collection is our community marketplace.\n');
250
+ const autoSubmit = await this.promptYesNo('Auto-submit to collection when uploading?', false);
251
+ await this.configManager.updateSetting('collection.auto_submit', autoSubmit);
252
+ const requireReview = await this.promptYesNo('Require review before submission?', true);
253
+ await this.configManager.updateSetting('collection.require_review', requireReview);
254
+ const addAttribution = await this.promptYesNo('Add attribution to your personas? (Adds your username)', true);
255
+ await this.configManager.updateSetting('collection.add_attribution', addAttribution);
256
+ return false; // Section not skipped
257
+ }
258
+ /**
259
+ * Display Settings Section
260
+ */
261
+ async runDisplaySection() {
262
+ console.log('\n' + chalk.cyan.bold('=== Display Settings ==='));
263
+ console.log('How DollhouseMCP appears in your terminal.\n');
264
+ const showIndicators = await this.promptYesNo('Show persona indicators in responses?', true);
265
+ await this.configManager.updateSetting('display.persona_indicators.enabled', showIndicators);
266
+ if (showIndicators) {
267
+ console.log(chalk.white('\nIndicator Style:'));
268
+ console.log(' [1] Full - Complete information');
269
+ console.log(' [2] Minimal - Just the name');
270
+ console.log(' [3] Compact - Name and version');
271
+ console.log(' [4] Custom - Define your own format');
272
+ const styleChoice = await this.prompt(' Choice [1-4]: ', '2');
273
+ const styles = ['full', 'minimal', 'compact', 'custom'];
274
+ const style = styles[parseInt(styleChoice) - 1] || 'minimal';
275
+ await this.configManager.updateSetting('display.persona_indicators.style', style);
276
+ const includeEmoji = await this.promptYesNo('\n Include emoji in indicators?', true);
277
+ await this.configManager.updateSetting('display.persona_indicators.include_emoji', includeEmoji);
278
+ }
279
+ const verboseLogging = await this.promptYesNo('\nEnable verbose logging?', false);
280
+ await this.configManager.updateSetting('display.verbose_logging', verboseLogging);
281
+ const showProgress = await this.promptYesNo('Show progress indicators?', true);
282
+ await this.configManager.updateSetting('display.show_progress', showProgress);
283
+ return false; // Section not skipped
284
+ }
285
+ /**
286
+ * Show configuration summary
287
+ */
288
+ async showSummary() {
289
+ console.log('\n' + chalk.cyan.bold('=== Configuration Summary ==='));
290
+ console.log('Here\'s what we\'ll set up:\n');
291
+ const config = this.configManager.getConfig();
292
+ // User
293
+ if (config.user.username) {
294
+ console.log(chalk.green('✓') + ` Username: ${config.user.username}`);
295
+ }
296
+ if (config.user.email) {
297
+ console.log(chalk.green('✓') + ` Email: ${config.user.email}`);
298
+ }
299
+ // GitHub
300
+ const defaultRepoName = getPortfolioRepositoryName();
301
+ if (config.github.portfolio.repository_name !== defaultRepoName) {
302
+ console.log(chalk.green('✓') + ` GitHub: ${config.github.portfolio.repository_name}`);
303
+ }
304
+ // Sync
305
+ console.log(chalk.green('✓') + ` Sync: ${config.sync.enabled ? 'Enabled' : 'Disabled'}`);
306
+ // Collection
307
+ console.log(chalk.green('✓') + ` Collection: ${config.collection.auto_submit ? 'Auto-submit' : 'Manual submission'}`);
308
+ // Display
309
+ if (config.display.persona_indicators.enabled) {
310
+ console.log(chalk.green('✓') + ` Display: ${config.display.persona_indicators.style} indicators` +
311
+ (config.display.persona_indicators.include_emoji ? ' with emoji' : ''));
312
+ }
313
+ }
314
+ /**
315
+ * Mark wizard as completed
316
+ */
317
+ async markCompleted(skippedSections = []) {
318
+ await this.configManager.updateSetting('wizard.completed', true);
319
+ await this.configManager.updateSetting('wizard.completedAt', new Date().toISOString());
320
+ await this.configManager.updateSetting('wizard.version', WIZARD_VERSION);
321
+ if (skippedSections.length > 0) {
322
+ await this.configManager.updateSetting('wizard.skippedSections', skippedSections);
323
+ }
324
+ }
325
+ /**
326
+ * Mark wizard as dismissed
327
+ */
328
+ async markDismissed() {
329
+ await this.configManager.updateSetting('wizard.dismissed', true);
330
+ }
331
+ /**
332
+ * Helper: Prompt for user input
333
+ */
334
+ prompt(question, defaultValue = '') {
335
+ return new Promise((resolve) => {
336
+ if (!this.isInteractive || !this.rl) {
337
+ resolve(defaultValue);
338
+ return;
339
+ }
340
+ this.rl.question(question, (answer) => {
341
+ resolve(answer || defaultValue);
342
+ });
343
+ });
344
+ }
345
+ /**
346
+ * Helper: Prompt for yes/no
347
+ */
348
+ async promptYesNo(question, defaultYes = true) {
349
+ const hint = defaultYes ? '[Y/n]' : '[y/N]';
350
+ const answer = await this.prompt(`${question} ${hint}: `, defaultYes ? 'y' : 'n');
351
+ return answer.toLowerCase().startsWith('y');
352
+ }
353
+ /**
354
+ * Helper: Validate email format
355
+ */
356
+ isValidEmail(email) {
357
+ // Basic email regex - not perfect but good enough for wizard validation
358
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
359
+ return emailRegex.test(email);
360
+ }
361
+ /**
362
+ * Cleanup readline interface
363
+ */
364
+ close() {
365
+ if (this.isInteractive && this.rl) {
366
+ this.rl.close();
367
+ }
368
+ }
369
+ }
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnV2l6YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9Db25maWdXaXphcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRSxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFRL0IsTUFBTSxPQUFPLFlBQVk7SUFDZixhQUFhLENBQWdCO0lBQzdCLEVBQUUsQ0FBNEI7SUFDOUIsYUFBYSxDQUFVO0lBRS9CLFlBQVksYUFBNEI7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFFbkMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFFakUsZ0RBQWdEO1FBQ2hELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztnQkFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLFFBQVEsRUFBRSxJQUFJO2FBQ2YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTix1Q0FBdUM7WUFDdkMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxlQUFlO1FBQ25CLG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsSUFBSSxD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SUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWdXaXphcmQgLSBJbnRlcmFjdGl2ZSBjb25maWd1cmF0aW9uIHdpemFyZCBmb3IgbmV3IERvbGxob3VzZU1DUCBpbnN0YWxsYXRpb25zXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBHdWlkZWQgd2Fsa3Rocm91Z2ggb2YgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogLSBFZHVjYXRpb25hbCBleHBsYW5hdGlvbnMgZm9yIGVhY2ggc2V0dGluZ1xuICogLSBUcmFja2luZyBvZiBjb21wbGV0aW9uL2Rpc21pc3NhbCBzdGF0dXNcbiAqIC0gTm9uLWludHJ1c2l2ZSBmaXJzdC1ydW4gZXhwZXJpZW5jZVxuICogLSBSZS1ydW5uYWJsZSB2aWEgTUNQIHRvb2xcbiAqL1xuXG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgeyBDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi9Db25maWdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2V0UG9ydGZvbGlvUmVwb3NpdG9yeU5hbWUgfSBmcm9tICcuL3BvcnRmb2xpb0NvbmZpZy5qcyc7XG5cbmNvbnN0IFdJWkFSRF9WRVJTSU9OID0gJzEuMC4wJztcblxuaW50ZXJmYWNlIFdpemFyZENob2ljZSB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGlzRGVmYXVsdD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBDb25maWdXaXphcmQge1xuICBwcml2YXRlIGNvbmZpZ01hbmFnZXI6IENvbmZpZ01hbmFnZXI7XG4gIHByaXZhdGUgcmw6IHJlYWRsaW5lLkludGVyZmFjZSB8IG51bGw7XG4gIHByaXZhdGUgaXNJbnRlcmFjdGl2ZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWdNYW5hZ2VyOiBDb25maWdNYW5hZ2VyKSB7XG4gICAgdGhpcy5jb25maWdNYW5hZ2VyID0gY29uZmlnTWFuYWdlcjtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBhbiBpbnRlcmFjdGl2ZSB0ZXJtaW5hbFxuICAgIHRoaXMuaXNJbnRlcmFjdGl2ZSA9IHByb2Nlc3Muc3RkaW4uaXNUVFkgJiYgcHJvY2Vzcy5zdGRvdXQuaXNUVFk7XG4gICAgXG4gICAgLy8gT25seSBjcmVhdGUgcmVhZGxpbmUgaW50ZXJmYWNlIGlmIGludGVyYWN0aXZlXG4gICAgaWYgKHRoaXMuaXNJbnRlcmFjdGl2ZSkge1xuICAgICAgdGhpcy5ybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgICAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICAgICAgICB0ZXJtaW5hbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGludGVyZmFjZSBpbiBub24taW50ZXJhY3RpdmUgbW9kZVxuICAgICAgdGhpcy5ybCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB3aXphcmQgc2hvdWxkIHJ1blxuICAgKi9cbiAgYXN5bmMgc2hvdWxkUnVuV2l6YXJkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIERvbid0IHJ1biBpbiBub24taW50ZXJhY3RpdmUgZW52aXJvbm1lbnRzIChDSSwgYXV0b21hdGVkIHNjcmlwdHMpXG4gICAgaWYgKCF0aGlzLmlzSW50ZXJhY3RpdmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnKCk7XG4gICAgcmV0dXJuICFjb25maWcud2l6YXJkPy5jb21wbGV0ZWQgJiYgIWNvbmZpZy53aXphcmQ/LmRpc21pc3NlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IGluaXRpYWwgcHJvbXB0IHRvIHVzZXJcbiAgICovXG4gIGFzeW5jIHByb21wdEluaXRpYWwoKTogUHJvbWlzZTwneWVzJyB8ICdza2lwJyB8ICduZXZlcic+IHtcbiAgICBjb25zb2xlLmxvZygnXFxuJyArIGNoYWxrLmN5YW4oJ+KVkCcucmVwZWF0KDYwKSkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4uYm9sZCgnICBXZWxjb21lIHRvIERvbGxob3VzZU1DUCEg8J+OrScpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCfilZAnLnJlcGVhdCg2MCkpICsgJ1xcbicpO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnVGhpcyBhcHBlYXJzIHRvIGJlIHlvdXIgZmlyc3QgdGltZSB1c2luZyBEb2xsaG91c2VNQ1AuJykpO1xuICAgIGNvbnNvbGUubG9nKCdXb3VsZCB5b3UgbGlrZSBhIGd1aWRlZCB3YWxrdGhyb3VnaCBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zP1xcbicpO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCcgIFsxXScpICsgJyBZZXMsIGd1aWRlIG1lIHRocm91Z2ggdGhlIGNvbmZpZ3VyYXRpb24nKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJyAgWzJdJykgKyAnIFNraXAgZm9yIG5vdyAoYXNrIGFnYWluIG5leHQgdGltZSknKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFszXScpICsgJyBEb25cXCd0IHNob3cgdGhpcyBhZ2FpblxcbicpO1xuXG4gICAgY29uc3QgY2hvaWNlID0gYXdhaXQgdGhpcy5wcm9tcHQoJ0Nob2ljZSBbMS8yLzNdOiAnLCAnMicpO1xuICAgIFxuICAgIHN3aXRjaCAoY2hvaWNlKSB7XG4gICAgICBjYXNlICcxJzpcbiAgICAgICAgcmV0dXJuICd5ZXMnO1xuICAgICAgY2FzZSAnMyc6XG4gICAgICAgIHJldHVybiAnbmV2ZXInO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdza2lwJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBmdWxsIGNvbmZpZ3VyYXRpb24gd2l6YXJkXG4gICAqL1xuICBhc3luYyBydW5XaXphcmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coJ1xcbicgKyBjaGFsay5jeWFuKCdTdGFydGluZyBDb25maWd1cmF0aW9uIFdpemFyZC4uLicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdZb3UgY2FuIHByZXNzIEN0cmwrQyBhdCBhbnkgdGltZSB0byBleGl0XFxuJykpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyYWNrIHNraXBwZWQgc2VjdGlvbnNcbiAgICAgIGNvbnN0IHNraXBwZWRTZWN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgLy8gU2VjdGlvbiAxOiBVc2VyIElkZW50aXR5XG4gICAgICBjb25zdCBza2lwSWRlbnRpdHkgPSBhd2FpdCB0aGlzLnJ1blVzZXJJZGVudGl0eVNlY3Rpb24oKTtcbiAgICAgIGlmIChza2lwSWRlbnRpdHkpIHNraXBwZWRTZWN0aW9ucy5wdXNoKCd1c2VyJyk7XG5cbiAgICAgIC8vIFNlY3Rpb24gMjogR2l0SHViIEludGVncmF0aW9uXG4gICAgICBjb25zdCBza2lwR2l0SHViID0gYXdhaXQgdGhpcy5ydW5HaXRIdWJTZWN0aW9uKCk7XG4gICAgICBpZiAoc2tpcEdpdEh1Yikgc2tpcHBlZFNlY3Rpb25zLnB1c2goJ2dpdGh1YicpO1xuXG4gICAgICAvLyBTZWN0aW9uIDM6IFN5bmMgU2V0dGluZ3NcbiAgICAgIGNvbnN0IHNraXBTeW5jID0gYXdhaXQgdGhpcy5ydW5TeW5jU2VjdGlvbigpO1xuICAgICAgaWYgKHNraXBTeW5jKSBza2lwcGVkU2VjdGlvbnMucHVzaCgnc3luYycpO1xuXG4gICAgICAvLyBTZWN0aW9uIDQ6IENvbGxlY3Rpb24gU2V0dGluZ3NcbiAgICAgIGNvbnN0IHNraXBDb2xsZWN0aW9uID0gYXdhaXQgdGhpcy5ydW5Db2xsZWN0aW9uU2VjdGlvbigpO1xuICAgICAgaWYgKHNraXBDb2xsZWN0aW9uKSBza2lwcGVkU2VjdGlvbnMucHVzaCgnY29sbGVjdGlvbicpO1xuXG4gICAgICAvLyBTZWN0aW9uIDU6IERpc3BsYXkgU2V0dGluZ3NcbiAgICAgIGNvbnN0IHNraXBEaXNwbGF5ID0gYXdhaXQgdGhpcy5ydW5EaXNwbGF5U2VjdGlvbigpO1xuICAgICAgaWYgKHNraXBEaXNwbGF5KSBza2lwcGVkU2VjdGlvbnMucHVzaCgnZGlzcGxheScpO1xuXG4gICAgICAvLyBTaG93IHN1bW1hcnkgYW5kIGNvbmZpcm1cbiAgICAgIGF3YWl0IHRoaXMuc2hvd1N1bW1hcnkoKTtcbiAgICAgIFxuICAgICAgY29uc3Qgc2F2ZSA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJ1NhdmUgdGhpcyBjb25maWd1cmF0aW9uPycsIHRydWUpO1xuICAgICAgaWYgKHNhdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXJrQ29tcGxldGVkKHNraXBwZWRTZWN0aW9ucyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCdcXG7inIUgQ29uZmlndXJhdGlvbiBzYXZlZCBzdWNjZXNzZnVsbHkhJykpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdZb3UgY2FuIHJlLXJ1biB0aGlzIHdpemFyZCBhbnl0aW1lIHdpdGggdGhlIFwicnVuX2NvbmZpZ193aXphcmRcIiB0b29sLlxcbicpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnXFxu4pqg77iPICBDb25maWd1cmF0aW9uIG5vdCBzYXZlZC4gWW91IGNhbiBydW4gdGhlIHdpemFyZCBhZ2FpbiBsYXRlci5cXG4nKSk7XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2NhbmNlbGVkJykpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcbuKaoO+4jyAgV2l6YXJkIGNhbmNlbGVkLiBZb3UgY2FuIHJ1biBpdCBhZ2FpbiBsYXRlci5cXG4nKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRUFDQ0VTJykgfHwgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygncGVybWlzc2lvbicpKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdQZXJtaXNzaW9uIGRlbmllZCB3aGlsZSBzYXZpbmcgY29uZmlndXJhdGlvbicsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdcXG7inYwgUGVybWlzc2lvbiBkZW5pZWQ6IFVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24uJykpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnICAgUGxlYXNlIGNoZWNrIGZpbGUgcGVybWlzc2lvbnMgZm9yIH4vLmRvbGxob3VzZS9jb25maWcueW1sXFxuJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VOT1NQQycpKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdObyBzcGFjZSBsZWZ0IG9uIGRldmljZScsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdcXG7inYwgRGlzayBmdWxsOiBVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uLicpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJyAgIFBsZWFzZSBmcmVlIHVwIHNvbWUgZGlzayBzcGFjZSBhbmQgdHJ5IGFnYWluLlxcbicpKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdyZWFkbGluZScpKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdUZXJtaW5hbCBpbnB1dCBlcnJvcicsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdcXG7inYwgVGVybWluYWwgZXJyb3I6IFVuYWJsZSB0byByZWFkIGlucHV0LicpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJyAgIFBsZWFzZSBlbnN1cmUgeW91XFwncmUgcnVubmluZyBpbiBhbiBpbnRlcmFjdGl2ZSB0ZXJtaW5hbC5cXG4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIGNvbmZpZ3VyYXRpb24gd2l6YXJkJywgeyBlcnJvciB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ1xcbuKdjCBBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLicpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgICBFcnJvcjogJHtlcnJvci5tZXNzYWdlfVxcbmApKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmtub3duIGVycm9yIGluIGNvbmZpZ3VyYXRpb24gd2l6YXJkJywgeyBlcnJvciB9KTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdcXG7inYwgQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cXG4nKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZXIgSWRlbnRpdHkgU2VjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5Vc2VySWRlbnRpdHlTZWN0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnNvbGUubG9nKCdcXG4nICsgY2hhbGsuY3lhbi5ib2xkKCc9PT0gVXNlciBJZGVudGl0eSBDb25maWd1cmF0aW9uID09PScpKTtcbiAgICBjb25zb2xlLmxvZygnTGV0XFwncyBzZXQgdXAgeW91ciBpZGVudGl0eSBmb3IgcGVyc29uYSBhdHRyaWJ1dGlvbi5cXG4nKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICBcbiAgICAvLyBVc2VybmFtZVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLndoaXRlKCdVc2VybmFtZSAoZm9yIHBlcnNvbmEgY3JlZGl0cyk6JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgQ3VycmVudDogJHtjb25maWcudXNlci51c2VybmFtZSB8fCAnbm90IHNldCd9YCkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgUmVjb21tZW5kZWQ6IFlvdXIgR2l0SHViIHVzZXJuYW1lJykpO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gYXdhaXQgdGhpcy5wcm9tcHQoJyAgPiAnLCBjb25maWcudXNlci51c2VybmFtZSB8fCAnJyk7XG4gICAgaWYgKHVzZXJuYW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygndXNlci51c2VybmFtZScsIHVzZXJuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBFbWFpbCB3aXRoIHZhbGlkYXRpb25cbiAgICBjb25zb2xlLmxvZyhjaGFsay53aGl0ZSgnXFxuRW1haWwgKGZvciBHaXQgY29tbWl0cyBhbmQgR2l0SHViIGF0dHJpYnV0aW9uKTonKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBVc2VkIGZvcjogR2l0IGF1dGhvciBpbmZvLCBHaXRIdWIgY29tbWl0cywgYW5kIGVsZW1lbnQgYXR0cmlidXRpb24nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBDdXJyZW50OiAke2NvbmZpZy51c2VyLmVtYWlsIHx8ICdub3Qgc2V0J31gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBSZWNvbW1lbmRlZDogWW91ciBHaXRIdWIgZW1haWwgYWRkcmVzcycpKTtcbiAgICBsZXQgZW1haWwgPSBhd2FpdCB0aGlzLnByb21wdCgnICA+ICcsIGNvbmZpZy51c2VyLmVtYWlsIHx8ICcnKTtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBlbWFpbCBpZiBwcm92aWRlZFxuICAgIHdoaWxlIChlbWFpbCAmJiAhdGhpcy5pc1ZhbGlkRW1haWwoZW1haWwpKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJyAg4pqg77iPICBJbnZhbGlkIGVtYWlsIGZvcm1hdC4gUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgb3IgbGVhdmUgZW1wdHkgdG8gc2tpcC4nKSk7XG4gICAgICBlbWFpbCA9IGF3YWl0IHRoaXMucHJvbXB0KCcgID4gJywgJycpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZW1haWwpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci51cGRhdGVTZXR0aW5nKCd1c2VyLmVtYWlsJywgZW1haWwpO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgTmFtZVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLndoaXRlKCdcXG5EaXNwbGF5IE5hbWUgKGhvdyB5b3UgYXBwZWFyIGluIHRoZSBjb21tdW5pdHkpOicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIEN1cnJlbnQ6ICR7Y29uZmlnLnVzZXIuZGlzcGxheV9uYW1lIHx8ICdub3Qgc2V0J31gKSk7XG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBhd2FpdCB0aGlzLnByb21wdCgnICA+ICcsIGNvbmZpZy51c2VyLmRpc3BsYXlfbmFtZSB8fCAnJyk7XG4gICAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygndXNlci5kaXNwbGF5X25hbWUnLCBkaXNwbGF5TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlOyAvLyBTZWN0aW9uIG5vdCBza2lwcGVkXG4gIH1cblxuICAvKipcbiAgICogR2l0SHViIEludGVncmF0aW9uIFNlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuR2l0SHViU2VjdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zb2xlLmxvZygnXFxuJyArIGNoYWxrLmN5YW4uYm9sZCgnPT09IEdpdEh1YiBJbnRlZ3JhdGlvbiA9PT0nKSk7XG4gICAgY29uc29sZS5sb2coJ0RvbGxob3VzZU1DUCBjYW4gc3luYyB5b3VyIHBlcnNvbmFzIHdpdGggR2l0SHViIGZvciBiYWNrdXAgYW5kIHNoYXJpbmcuXFxuJyk7XG5cbiAgICBjb25zdCBzZXR1cEdpdEh1YiA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJ1dvdWxkIHlvdSBsaWtlIHRvIHNldCB1cCBHaXRIdWIgaW50ZWdyYXRpb24/JywgZmFsc2UpO1xuICAgIFxuICAgIGlmICghc2V0dXBHaXRIdWIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgU2tpcHBpbmcgR2l0SHViIHNldHVwLiBZb3UgY2FuIGNvbmZpZ3VyZSB0aGlzIGxhdGVyLlxcbicpKTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBTZWN0aW9uIHNraXBwZWRcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICAvLyBSZXBvc2l0b3J5IG5hbWVcbiAgICBjb25zb2xlLmxvZyhjaGFsay53aGl0ZSgnXFxuR2l0SHViIFBvcnRmb2xpbyBSZXBvc2l0b3J5OicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFRoaXMgd2lsbCBzdG9yZSB5b3VyIHBlcnNvbmFsIGNvbGxlY3Rpb24nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBGb3JtYXQ6IHVzZXJuYW1lL3JlcG9zaXRvcnktbmFtZScpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIERlZmF1bHQ6ICR7Y29uZmlnLmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV9uYW1lfWApKTtcbiAgICBjb25zdCByZXBvTmFtZSA9IGF3YWl0IHRoaXMucHJvbXB0KCcgID4gJywgY29uZmlnLmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV9uYW1lKTtcbiAgICBpZiAocmVwb05hbWUpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci51cGRhdGVTZXR0aW5nKCdnaXRodWIucG9ydGZvbGlvLnJlcG9zaXRvcnlfbmFtZScsIHJlcG9OYW1lKTtcbiAgICB9XG5cbiAgICAvLyBBdXRvLWNyZWF0ZSByZXBvc2l0b3J5XG4gICAgY29uc3QgYXV0b0NyZWF0ZSA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJ1xcbkF1dG8tY3JlYXRlIHJlcG9zaXRvcnkgaWYgaXQgZG9lc25cXCd0IGV4aXN0PycsIHRydWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci51cGRhdGVTZXR0aW5nKCdnaXRodWIucG9ydGZvbGlvLmF1dG9fY3JlYXRlJywgYXV0b0NyZWF0ZSk7XG5cbiAgICAvLyBPQXV0aCBhdXRoZW50aWNhdGlvblxuICAgIGNvbnN0IHVzZU9BdXRoID0gYXdhaXQgdGhpcy5wcm9tcHRZZXNObygnXFxuVXNlIE9BdXRoIGZvciBhdXRoZW50aWNhdGlvbj8gKE1vcmUgc2VjdXJlIHRoYW4gdG9rZW5zKScsIHRydWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci51cGRhdGVTZXR0aW5nKCdnaXRodWIuYXV0aC51c2Vfb2F1dGgnLCB1c2VPQXV0aCk7XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIFNlY3Rpb24gbm90IHNraXBwZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIFNldHRpbmdzIFNlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuU3luY1NlY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc29sZS5sb2coJ1xcbicgKyBjaGFsay5jeWFuLmJvbGQoJz09PSBTeW5jIFNldHRpbmdzID09PScpKTtcbiAgICBjb25zb2xlLmxvZygnQ29udHJvbCBob3cgeW91ciBwZXJzb25hcyBzeW5jIHdpdGggR2l0SHViLlxcbicpO1xuXG4gICAgY29uc3QgZW5hYmxlU3luYyA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJ0VuYWJsZSBzeW5jIGZlYXR1cmVzPyAoWW91IGNhbiBhbHdheXMgZW5hYmxlIGxhdGVyKScsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnc3luYy5lbmFibGVkJywgZW5hYmxlU3luYyk7XG5cbiAgICBpZiAoIWVuYWJsZVN5bmMpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgU3luYyBkaXNhYmxlZC4gWW91IGNhbiBlbmFibGUgaXQgbGF0ZXIgaW4gc2V0dGluZ3MuXFxuJykpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIFNlY3Rpb24gc2tpcHBlZCAocGFydGlhbGx5KVxuICAgIH1cblxuICAgIC8vIEluZGl2aWR1YWwgc3luYyBzZXR0aW5nc1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLndoaXRlKCdcXG5JbmRpdmlkdWFsIFN5bmMgU2V0dGluZ3M6JykpO1xuICAgIFxuICAgIGNvbnN0IHJlcXVpcmVDb25maXJtID0gYXdhaXQgdGhpcy5wcm9tcHRZZXNObygnICBSZXF1aXJlIGNvbmZpcm1hdGlvbiBiZWZvcmUgc3luYz8nLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnc3luYy5pbmRpdmlkdWFsLnJlcXVpcmVfY29uZmlybWF0aW9uJywgcmVxdWlyZUNvbmZpcm0pO1xuXG4gICAgY29uc3Qgc2hvd0RpZmYgPSBhd2FpdCB0aGlzLnByb21wdFllc05vKCcgIFNob3cgZGlmZiBiZWZvcmUgc3luY2luZz8nLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnc3luYy5pbmRpdmlkdWFsLnNob3dfZGlmZl9iZWZvcmVfc3luYycsIHNob3dEaWZmKTtcblxuICAgIGNvbnN0IHRyYWNrVmVyc2lvbnMgPSBhd2FpdCB0aGlzLnByb21wdFllc05vKCcgIEtlZXAgdmVyc2lvbiBoaXN0b3J5PycsIHRydWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci51cGRhdGVTZXR0aW5nKCdzeW5jLmluZGl2aWR1YWwudHJhY2tfdmVyc2lvbnMnLCB0cmFja1ZlcnNpb25zKTtcblxuICAgIGlmICh0cmFja1ZlcnNpb25zKSB7XG4gICAgICBjb25zdCBoaXN0b3J5Q291bnQgPSBhd2FpdCB0aGlzLnByb21wdCgnICAgIEhvdyBtYW55IHZlcnNpb25zIHRvIGtlZXA/IFsxMF06ICcsICcxMCcpO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWdNYW5hZ2VyLnVwZGF0ZVNldHRpbmcoJ3N5bmMuaW5kaXZpZHVhbC5rZWVwX2hpc3RvcnknLCBwYXJzZUludChoaXN0b3J5Q291bnQpIHx8IDEwKTtcbiAgICB9XG5cbiAgICAvLyBQcml2YWN5IHNldHRpbmdzXG4gICAgY29uc29sZS5sb2coY2hhbGsud2hpdGUoJ1xcblByaXZhY3kgU2V0dGluZ3M6JykpO1xuICAgIFxuICAgIGNvbnN0IHNjYW5TZWNyZXRzID0gYXdhaXQgdGhpcy5wcm9tcHRZZXNObygnICBTY2FuIGZvciBzZWNyZXRzIGJlZm9yZSB1cGxvYWQ/JywgdHJ1ZSk7XG4gICAgYXdhaXQgdGhpcy5jb25maWdNYW5hZ2VyLnVwZGF0ZVNldHRpbmcoJ3N5bmMucHJpdmFjeS5zY2FuX2Zvcl9zZWNyZXRzJywgc2NhblNlY3JldHMpO1xuXG4gICAgY29uc3Qgc2NhblBJSSA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJyAgU2NhbiBmb3IgUElJIChwZXJzb25hbCBpbmZvKT8nLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnc3luYy5wcml2YWN5LnNjYW5fZm9yX3BpaScsIHNjYW5QSUkpO1xuXG4gICAgY29uc3Qgd2FyblNlbnNpdGl2ZSA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJyAgV2FybiBvbiBzZW5zaXRpdmUgY29udGVudD8nLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnc3luYy5wcml2YWN5Lndhcm5fb25fc2Vuc2l0aXZlJywgd2FyblNlbnNpdGl2ZSk7XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIFNlY3Rpb24gbm90IHNraXBwZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIFNldHRpbmdzIFNlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuQ29sbGVjdGlvblNlY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc29sZS5sb2coJ1xcbicgKyBjaGFsay5jeWFuLmJvbGQoJz09PSBDb2xsZWN0aW9uIFNldHRpbmdzID09PScpKTtcbiAgICBjb25zb2xlLmxvZygnVGhlIERvbGxob3VzZU1DUCBDb2xsZWN0aW9uIGlzIG91ciBjb21tdW5pdHkgbWFya2V0cGxhY2UuXFxuJyk7XG5cbiAgICBjb25zdCBhdXRvU3VibWl0ID0gYXdhaXQgdGhpcy5wcm9tcHRZZXNObygnQXV0by1zdWJtaXQgdG8gY29sbGVjdGlvbiB3aGVuIHVwbG9hZGluZz8nLCBmYWxzZSk7XG4gICAgYXdhaXQgdGhpcy5jb25maWdNYW5hZ2VyLnVwZGF0ZVNldHRpbmcoJ2NvbGxlY3Rpb24uYXV0b19zdWJtaXQnLCBhdXRvU3VibWl0KTtcblxuICAgIGNvbnN0IHJlcXVpcmVSZXZpZXcgPSBhd2FpdCB0aGlzLnByb21wdFllc05vKCdSZXF1aXJlIHJldmlldyBiZWZvcmUgc3VibWlzc2lvbj8nLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnY29sbGVjdGlvbi5yZXF1aXJlX3JldmlldycsIHJlcXVpcmVSZXZpZXcpO1xuXG4gICAgY29uc3QgYWRkQXR0cmlidXRpb24gPSBhd2FpdCB0aGlzLnByb21wdFllc05vKCdBZGQgYXR0cmlidXRpb24gdG8geW91ciBwZXJzb25hcz8gKEFkZHMgeW91ciB1c2VybmFtZSknLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnY29sbGVjdGlvbi5hZGRfYXR0cmlidXRpb24nLCBhZGRBdHRyaWJ1dGlvbik7XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIFNlY3Rpb24gbm90IHNraXBwZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IFNldHRpbmdzIFNlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuRGlzcGxheVNlY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc29sZS5sb2coJ1xcbicgKyBjaGFsay5jeWFuLmJvbGQoJz09PSBEaXNwbGF5IFNldHRpbmdzID09PScpKTtcbiAgICBjb25zb2xlLmxvZygnSG93IERvbGxob3VzZU1DUCBhcHBlYXJzIGluIHlvdXIgdGVybWluYWwuXFxuJyk7XG5cbiAgICBjb25zdCBzaG93SW5kaWNhdG9ycyA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJ1Nob3cgcGVyc29uYSBpbmRpY2F0b3JzIGluIHJlc3BvbnNlcz8nLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMuZW5hYmxlZCcsIHNob3dJbmRpY2F0b3JzKTtcblxuICAgIGlmIChzaG93SW5kaWNhdG9ycykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsud2hpdGUoJ1xcbkluZGljYXRvciBTdHlsZTonKSk7XG4gICAgICBjb25zb2xlLmxvZygnICBbMV0gRnVsbCAtIENvbXBsZXRlIGluZm9ybWF0aW9uJyk7XG4gICAgICBjb25zb2xlLmxvZygnICBbMl0gTWluaW1hbCAtIEp1c3QgdGhlIG5hbWUnKTtcbiAgICAgIGNvbnNvbGUubG9nKCcgIFszXSBDb21wYWN0IC0gTmFtZSBhbmQgdmVyc2lvbicpO1xuICAgICAgY29uc29sZS5sb2coJyAgWzRdIEN1c3RvbSAtIERlZmluZSB5b3VyIG93biBmb3JtYXQnKTtcbiAgICAgIFxuICAgICAgY29uc3Qgc3R5bGVDaG9pY2UgPSBhd2FpdCB0aGlzLnByb21wdCgnICBDaG9pY2UgWzEtNF06ICcsICcyJyk7XG4gICAgICBjb25zdCBzdHlsZXMgPSBbJ2Z1bGwnLCAnbWluaW1hbCcsICdjb21wYWN0JywgJ2N1c3RvbSddO1xuICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZXNbcGFyc2VJbnQoc3R5bGVDaG9pY2UpIC0gMV0gfHwgJ21pbmltYWwnO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWdNYW5hZ2VyLnVwZGF0ZVNldHRpbmcoJ2Rpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLnN0eWxlJywgc3R5bGUpO1xuXG4gICAgICBjb25zdCBpbmNsdWRlRW1vamkgPSBhd2FpdCB0aGlzLnByb21wdFllc05vKCdcXG4gIEluY2x1ZGUgZW1vamkgaW4gaW5kaWNhdG9ycz8nLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci51cGRhdGVTZXR0aW5nKCdkaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycy5pbmNsdWRlX2Vtb2ppJywgaW5jbHVkZUVtb2ppKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJib3NlTG9nZ2luZyA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJ1xcbkVuYWJsZSB2ZXJib3NlIGxvZ2dpbmc/JywgZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci51cGRhdGVTZXR0aW5nKCdkaXNwbGF5LnZlcmJvc2VfbG9nZ2luZycsIHZlcmJvc2VMb2dnaW5nKTtcblxuICAgIGNvbnN0IHNob3dQcm9ncmVzcyA9IGF3YWl0IHRoaXMucHJvbXB0WWVzTm8oJ1Nob3cgcHJvZ3Jlc3MgaW5kaWNhdG9ycz8nLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnZGlzcGxheS5zaG93X3Byb2dyZXNzJywgc2hvd1Byb2dyZXNzKTtcblxuICAgIHJldHVybiBmYWxzZTsgLy8gU2VjdGlvbiBub3Qgc2tpcHBlZFxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgY29uZmlndXJhdGlvbiBzdW1tYXJ5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNob3dTdW1tYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdcXG4nICsgY2hhbGsuY3lhbi5ib2xkKCc9PT0gQ29uZmlndXJhdGlvbiBTdW1tYXJ5ID09PScpKTtcbiAgICBjb25zb2xlLmxvZygnSGVyZVxcJ3Mgd2hhdCB3ZVxcJ2xsIHNldCB1cDpcXG4nKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcblxuICAgIC8vIFVzZXJcbiAgICBpZiAoY29uZmlnLnVzZXIudXNlcm5hbWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMnKSArIGAgVXNlcm5hbWU6ICR7Y29uZmlnLnVzZXIudXNlcm5hbWV9YCk7XG4gICAgfVxuICAgIGlmIChjb25maWcudXNlci5lbWFpbCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckycpICsgYCBFbWFpbDogJHtjb25maWcudXNlci5lbWFpbH1gKTtcbiAgICB9XG5cbiAgICAvLyBHaXRIdWJcbiAgICBjb25zdCBkZWZhdWx0UmVwb05hbWUgPSBnZXRQb3J0Zm9saW9SZXBvc2l0b3J5TmFtZSgpO1xuICAgIGlmIChjb25maWcuZ2l0aHViLnBvcnRmb2xpby5yZXBvc2l0b3J5X25hbWUgIT09IGRlZmF1bHRSZXBvTmFtZSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckycpICsgYCBHaXRIdWI6ICR7Y29uZmlnLmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV9uYW1lfWApO1xuICAgIH1cblxuICAgIC8vIFN5bmNcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTJykgKyBgIFN5bmM6ICR7Y29uZmlnLnN5bmMuZW5hYmxlZCA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCd9YCk7XG5cbiAgICAvLyBDb2xsZWN0aW9uXG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckycpICsgYCBDb2xsZWN0aW9uOiAke2NvbmZpZy5jb2xsZWN0aW9uLmF1dG9fc3VibWl0ID8gJ0F1dG8tc3VibWl0JyA6ICdNYW51YWwgc3VibWlzc2lvbid9YCk7XG5cbiAgICAvLyBEaXNwbGF5XG4gICAgaWYgKGNvbmZpZy5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycy5lbmFibGVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTJykgKyBgIERpc3BsYXk6ICR7Y29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLnN0eWxlfSBpbmRpY2F0b3JzYCArXG4gICAgICAgIChjb25maWcuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMuaW5jbHVkZV9lbW9qaSA/ICcgd2l0aCBlbW9qaScgOiAnJykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrIHdpemFyZCBhcyBjb21wbGV0ZWRcbiAgICovXG4gIGFzeW5jIG1hcmtDb21wbGV0ZWQoc2tpcHBlZFNlY3Rpb25zOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb25maWdNYW5hZ2VyLnVwZGF0ZVNldHRpbmcoJ3dpemFyZC5jb21wbGV0ZWQnLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnd2l6YXJkLmNvbXBsZXRlZEF0JywgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnd2l6YXJkLnZlcnNpb24nLCBXSVpBUkRfVkVSU0lPTik7XG4gICAgaWYgKHNraXBwZWRTZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnd2l6YXJkLnNraXBwZWRTZWN0aW9ucycsIHNraXBwZWRTZWN0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgd2l6YXJkIGFzIGRpc21pc3NlZFxuICAgKi9cbiAgYXN5bmMgbWFya0Rpc21pc3NlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ01hbmFnZXIudXBkYXRlU2V0dGluZygnd2l6YXJkLmRpc21pc3NlZCcsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogUHJvbXB0IGZvciB1c2VyIGlucHV0XG4gICAqL1xuICBwcml2YXRlIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0ludGVyYWN0aXZlIHx8ICF0aGlzLnJsKSB7XG4gICAgICAgIHJlc29sdmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJsLnF1ZXN0aW9uKHF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICAgIHJlc29sdmUoYW5zd2VyIHx8IGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IFByb21wdCBmb3IgeWVzL25vXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb21wdFllc05vKHF1ZXN0aW9uOiBzdHJpbmcsIGRlZmF1bHRZZXM6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaGludCA9IGRlZmF1bHRZZXMgPyAnW1kvbl0nIDogJ1t5L05dJztcbiAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCB0aGlzLnByb21wdChgJHtxdWVzdGlvbn0gJHtoaW50fTogYCwgZGVmYXVsdFllcyA/ICd5JyA6ICduJyk7XG4gICAgcmV0dXJuIGFuc3dlci50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IFZhbGlkYXRlIGVtYWlsIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZhbGlkRW1haWwoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEJhc2ljIGVtYWlsIHJlZ2V4IC0gbm90IHBlcmZlY3QgYnV0IGdvb2QgZW5vdWdoIGZvciB3aXphcmQgdmFsaWRhdGlvblxuICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcbiAgICByZXR1cm4gZW1haWxSZWdleC50ZXN0KGVtYWlsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwIHJlYWRsaW5lIGludGVyZmFjZVxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcmFjdGl2ZSAmJiB0aGlzLnJsKSB7XG4gICAgICB0aGlzLnJsLmNsb3NlKCk7XG4gICAgfVxuICB9XG59Il19
@@ -0,0 +1,47 @@
1
+ /**
2
+ * ConfigWizardCheck - Handles checking if the configuration wizard should run
3
+ * on first interaction with the MCP server
4
+ */
5
+ export declare class ConfigWizardCheck {
6
+ private hasCheckedWizard;
7
+ private configManager;
8
+ private currentVersion;
9
+ constructor();
10
+ /**
11
+ * Get the current version from package.json
12
+ */
13
+ private getCurrentVersion;
14
+ /**
15
+ * Check if configuration wizard should run on first interaction
16
+ * Returns a prompt message if wizard should run, null otherwise
17
+ */
18
+ checkIfWizardNeeded(): Promise<string | null>;
19
+ /**
20
+ * Determine if we should show the update wizard based on version changes
21
+ * This logic can be updated with each release to trigger when needed
22
+ */
23
+ private shouldShowUpdateWizard;
24
+ /**
25
+ * Get the wizard prompt message - friendly for non-technical users
26
+ */
27
+ private getWizardPrompt;
28
+ /**
29
+ * Get the update wizard prompt for returning users
30
+ * This can be customized for each release that needs to notify users
31
+ */
32
+ private getUpdateWizardPrompt;
33
+ /**
34
+ * Wrap tool responses to check for wizard on first interaction
35
+ * CRITICAL FIX: Create new response objects to avoid mutations
36
+ */
37
+ wrapResponse(response: any): Promise<any>;
38
+ /**
39
+ * Mark wizard as completed
40
+ */
41
+ markWizardCompleted(): Promise<void>;
42
+ /**
43
+ * Mark wizard as dismissed
44
+ */
45
+ markWizardDismissed(): Promise<void>;
46
+ }
47
+ //# sourceMappingURL=ConfigWizardCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigWizardCheck.d.ts","sourceRoot":"","sources":["../../src/config/ConfigWizardCheck.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAS;;IAO/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkCnD;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiCvB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;OAGG;IACG,YAAY,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAoD/C;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAM1C;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;CAG3C"}