@dollhousemcp/mcp-server 1.7.3 → 1.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/ConfigWizard.d.ts +78 -0
- package/dist/config/ConfigWizard.d.ts.map +1 -0
- package/dist/config/ConfigWizard.js +370 -0
- package/dist/config/ConfigWizardCheck.d.ts +47 -0
- package/dist/config/ConfigWizardCheck.d.ts.map +1 -0
- package/dist/config/ConfigWizardCheck.js +208 -0
- package/dist/config/ConfigWizardDisplay.d.ts +64 -0
- package/dist/config/ConfigWizardDisplay.d.ts.map +1 -0
- package/dist/config/ConfigWizardDisplay.js +150 -0
- package/dist/config/WizardFirstResponse.d.ts +25 -0
- package/dist/config/WizardFirstResponse.d.ts.map +1 -0
- package/dist/config/WizardFirstResponse.js +118 -0
- package/dist/config/portfolioConfig.d.ts +40 -0
- package/dist/config/portfolioConfig.d.ts.map +1 -0
- package/dist/config/portfolioConfig.js +58 -0
- package/dist/config/wizardTemplates.d.ts +84 -0
- package/dist/config/wizardTemplates.d.ts.map +1 -0
- package/dist/config/wizardTemplates.js +195 -0
- package/dist/elements/BaseElement.d.ts +15 -0
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +38 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/PortfolioPullHandler.d.ts +69 -0
- package/dist/handlers/PortfolioPullHandler.d.ts.map +1 -0
- package/dist/handlers/PortfolioPullHandler.js +340 -0
- package/dist/scripts/scripts/run-config-wizard.js +57 -0
- package/dist/scripts/src/config/ConfigManager.js +799 -0
- package/dist/scripts/src/config/ConfigWizard.js +368 -0
- package/dist/scripts/src/errors/SecurityError.js +47 -0
- package/dist/scripts/src/security/constants.js +28 -0
- package/dist/scripts/src/security/contentValidator.js +415 -0
- package/dist/scripts/src/security/errors.js +32 -0
- package/dist/scripts/src/security/regexValidator.js +217 -0
- package/dist/scripts/src/security/secureYamlParser.js +272 -0
- package/dist/scripts/src/security/securityMonitor.js +111 -0
- package/dist/scripts/src/security/validators/unicodeValidator.js +315 -0
- package/dist/scripts/src/utils/logger.js +288 -0
- package/dist/sync/PortfolioDownloader.d.ts +27 -0
- package/dist/sync/PortfolioDownloader.d.ts.map +1 -0
- package/dist/sync/PortfolioDownloader.js +120 -0
- package/dist/sync/PortfolioSyncComparer.d.ts +50 -0
- package/dist/sync/PortfolioSyncComparer.d.ts.map +1 -0
- package/dist/sync/PortfolioSyncComparer.js +158 -0
- package/dist/tools/getWelcomeMessage.d.ts +41 -0
- package/dist/tools/getWelcomeMessage.d.ts.map +1 -0
- package/dist/tools/getWelcomeMessage.js +109 -0
- package/dist/utils/TemplateRenderer.d.ts +63 -0
- package/dist/utils/TemplateRenderer.d.ts.map +1 -0
- package/dist/utils/TemplateRenderer.js +154 -0
- package/package.json +1 -1
|
@@ -0,0 +1,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"}
|