@dollhousemcp/mcp-server 1.5.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/README.md +494 -111
- package/data/agents/code-reviewer.md +8 -1
- package/data/agents/research-assistant.md +8 -1
- package/data/agents/task-manager.md +8 -1
- package/data/ensembles/business-advisor.md +8 -1
- package/data/ensembles/creative-studio.md +8 -1
- package/data/ensembles/development-team.md +8 -1
- package/data/ensembles/security-analysis-team.md +8 -1
- package/data/memories/conversation-history.md +8 -1
- package/data/memories/learning-progress.md +8 -1
- package/data/memories/project-context.md +8 -1
- package/data/personas/business-consultant.md +8 -1
- package/data/personas/creative-writer.md +8 -1
- package/data/personas/debug-detective.md +8 -1
- package/data/personas/eli5-explainer.md +8 -1
- package/data/personas/security-analyst.md +8 -1
- package/data/personas/technical-analyst.md +8 -1
- package/data/skills/code-review.md +8 -1
- package/data/skills/creative-writing.md +8 -1
- package/data/skills/data-analysis.md +8 -1
- package/data/skills/penetration-testing.md +8 -1
- package/data/skills/research.md +8 -1
- package/data/skills/threat-modeling.md +8 -1
- package/data/skills/translation.md +8 -1
- package/data/templates/code-documentation.md +8 -1
- package/data/templates/email-professional.md +8 -1
- package/data/templates/meeting-notes.md +8 -1
- package/data/templates/penetration-test-report.md +8 -1
- package/data/templates/project-brief.md +8 -1
- package/data/templates/report-executive.md +8 -1
- package/data/templates/security-vulnerability-report.md +8 -1
- package/data/templates/threat-assessment-report.md +8 -1
- package/dist/auth/GitHubAuthManager.d.ts +6 -1
- package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
- package/dist/auth/GitHubAuthManager.js +45 -18
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
- package/dist/cache/CollectionCache.d.ts.map +1 -1
- package/dist/cache/CollectionCache.js +13 -3
- package/dist/cache/CollectionIndexCache.d.ts +77 -0
- package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
- package/dist/cache/CollectionIndexCache.js +349 -0
- package/dist/cache/LRUCache.d.ts +93 -0
- package/dist/cache/LRUCache.d.ts.map +1 -0
- package/dist/cache/LRUCache.js +299 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +2 -1
- package/dist/collection/CollectionBrowser.d.ts +21 -1
- package/dist/collection/CollectionBrowser.d.ts.map +1 -1
- package/dist/collection/CollectionBrowser.js +130 -10
- package/dist/collection/CollectionIndexManager.d.ts +151 -0
- package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
- package/dist/collection/CollectionIndexManager.js +499 -0
- package/dist/collection/CollectionSearch.d.ts +55 -0
- package/dist/collection/CollectionSearch.d.ts.map +1 -1
- package/dist/collection/CollectionSearch.js +338 -13
- package/dist/collection/CollectionSeeder.d.ts.map +1 -1
- package/dist/collection/CollectionSeeder.js +38 -1
- package/dist/collection/ElementInstaller.d.ts +31 -0
- package/dist/collection/ElementInstaller.d.ts.map +1 -1
- package/dist/collection/ElementInstaller.js +77 -15
- package/dist/collection/PersonaSubmitter.d.ts +1 -1
- package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
- package/dist/collection/PersonaSubmitter.js +2 -2
- package/dist/collection/index.d.ts +1 -0
- package/dist/collection/index.d.ts.map +1 -1
- package/dist/collection/index.js +2 -1
- package/dist/config/ConfigManager.d.ts +78 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +216 -0
- package/dist/config/element-types.d.ts +135 -0
- package/dist/config/element-types.d.ts.map +1 -0
- package/dist/config/element-types.js +108 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/portfolio-constants.d.ts +83 -0
- package/dist/config/portfolio-constants.d.ts.map +1 -0
- package/dist/config/portfolio-constants.js +99 -0
- package/dist/elements/BaseElement.d.ts +14 -2
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +88 -6
- package/dist/elements/agents/Agent.d.ts +10 -1
- package/dist/elements/agents/Agent.d.ts.map +1 -1
- package/dist/elements/agents/Agent.js +66 -19
- package/dist/elements/agents/AgentManager.d.ts +2 -0
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +12 -10
- package/dist/elements/skills/Skill.d.ts +10 -1
- package/dist/elements/skills/Skill.d.ts.map +1 -1
- package/dist/elements/skills/Skill.js +40 -3
- package/dist/elements/skills/SkillManager.d.ts +1 -0
- package/dist/elements/skills/SkillManager.d.ts.map +1 -1
- package/dist/elements/skills/SkillManager.js +10 -4
- package/dist/elements/templates/Template.d.ts +10 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +35 -18
- package/dist/elements/templates/TemplateManager.d.ts +1 -1
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +6 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.barrel.d.ts +1 -2
- package/dist/index.barrel.d.ts.map +1 -1
- package/dist/index.barrel.js +2 -4
- package/dist/index.d.ts +143 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1883 -310
- package/dist/persona/PersonaElement.d.ts +10 -0
- package/dist/persona/PersonaElement.d.ts.map +1 -1
- package/dist/persona/PersonaElement.js +55 -32
- package/dist/persona/PersonaElementManager.d.ts.map +1 -1
- package/dist/persona/PersonaElementManager.js +13 -11
- package/dist/persona/PersonaLoader.d.ts.map +1 -1
- package/dist/persona/PersonaLoader.js +8 -2
- package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaImporter.js +24 -5
- package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
- package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaSharer.js +198 -22
- package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +499 -7
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
- package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
- package/dist/portfolio/MigrationManager.d.ts.map +1 -1
- package/dist/portfolio/MigrationManager.js +136 -3
- package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
- package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioIndexManager.js +478 -0
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +61 -20
- package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioRepoManager.js +337 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
- package/dist/portfolio/UnifiedIndexManager.js +1434 -0
- package/dist/portfolio/index.d.ts +15 -0
- package/dist/portfolio/index.d.ts.map +1 -0
- package/dist/portfolio/index.js +15 -0
- package/dist/portfolio/types.d.ts +7 -0
- package/dist/portfolio/types.d.ts.map +1 -1
- package/dist/portfolio/types.js +6 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +50 -48
- package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
- package/dist/security/audit/SecurityAuditor.js +17 -9
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +19 -3
- package/dist/security/contentValidator.d.ts +2 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +115 -4
- package/dist/security/secureYamlParser.d.ts +1 -0
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +29 -7
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.d.ts +1 -1
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +30 -10
- package/dist/server/ServerSetup.d.ts +22 -2
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +77 -12
- package/dist/server/tools/AuthTools.d.ts.map +1 -1
- package/dist/server/tools/AuthTools.js +33 -1
- package/dist/server/tools/BuildInfoTools.d.ts +25 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
- package/dist/server/tools/BuildInfoTools.js +36 -0
- package/dist/server/tools/CollectionTools.d.ts.map +1 -1
- package/dist/server/tools/CollectionTools.js +55 -46
- package/dist/server/tools/ConfigTools.d.ts.map +1 -1
- package/dist/server/tools/ConfigTools.js +29 -1
- package/dist/server/tools/PersonaTools.d.ts +4 -2
- package/dist/server/tools/PersonaTools.d.ts.map +1 -1
- package/dist/server/tools/PersonaTools.js +5 -152
- package/dist/server/tools/PortfolioTools.d.ts +12 -0
- package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
- package/dist/server/tools/PortfolioTools.js +221 -0
- package/dist/server/tools/index.d.ts +3 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/types.d.ts +40 -5
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/services/BuildInfoService.d.ts +84 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -0
- package/dist/services/BuildInfoService.js +271 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
- package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
- package/dist/tools/portfolio/types.d.ts +41 -0
- package/dist/tools/portfolio/types.d.ts.map +1 -0
- package/dist/tools/portfolio/types.js +15 -0
- package/dist/types/collection.d.ts +51 -0
- package/dist/types/collection.d.ts.map +1 -1
- package/dist/types/collection.js +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
- package/dist/utils/EarlyTerminationSearch.js +164 -0
- package/dist/utils/ErrorHandler.d.ts +86 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.js +201 -0
- package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
- package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
- package/dist/utils/FileDiscoveryUtil.js +169 -0
- package/dist/utils/GitHubRateLimiter.d.ts +88 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
- package/dist/utils/GitHubRateLimiter.js +315 -0
- package/dist/utils/PerformanceMonitor.d.ts +134 -0
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
- package/dist/utils/PerformanceMonitor.js +347 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +172 -0
- package/dist/utils/SecureDownloader.d.ts +241 -0
- package/dist/utils/SecureDownloader.d.ts.map +1 -0
- package/dist/utils/SecureDownloader.js +759 -0
- package/dist/utils/ToolCache.d.ts +82 -0
- package/dist/utils/ToolCache.d.ts.map +1 -0
- package/dist/utils/ToolCache.js +196 -0
- package/dist/utils/errorCodes.d.ts +136 -0
- package/dist/utils/errorCodes.d.ts.map +1 -0
- package/dist/utils/errorCodes.js +87 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/installation.d.ts +1 -1
- package/dist/utils/installation.d.ts.map +1 -1
- package/dist/utils/installation.js +9 -8
- package/dist/utils/searchUtils.d.ts +31 -0
- package/dist/utils/searchUtils.d.ts.map +1 -1
- package/dist/utils/searchUtils.js +62 -1
- package/package.json +17 -7
- package/dist/config/updateConfig.d.ts +0 -84
- package/dist/config/updateConfig.d.ts.map +0 -1
- package/dist/config/updateConfig.js +0 -148
- package/dist/server/tools/UpdateTools.d.ts +0 -10
- package/dist/server/tools/UpdateTools.d.ts.map +0 -1
- package/dist/server/tools/UpdateTools.js +0 -85
- package/dist/update/BackupManager.d.ts +0 -63
- package/dist/update/BackupManager.d.ts.map +0 -1
- package/dist/update/BackupManager.js +0 -370
- package/dist/update/DependencyChecker.d.ts +0 -41
- package/dist/update/DependencyChecker.d.ts.map +0 -1
- package/dist/update/DependencyChecker.js +0 -132
- package/dist/update/RateLimiter.d.ts.map +0 -1
- package/dist/update/RateLimiter.js +0 -172
- package/dist/update/SignatureVerifier.d.ts +0 -71
- package/dist/update/SignatureVerifier.d.ts.map +0 -1
- package/dist/update/SignatureVerifier.js +0 -214
- package/dist/update/UpdateChecker.d.ts +0 -132
- package/dist/update/UpdateChecker.d.ts.map +0 -1
- package/dist/update/UpdateChecker.js +0 -506
- package/dist/update/UpdateManager.d.ts +0 -60
- package/dist/update/UpdateManager.d.ts.map +0 -1
- package/dist/update/UpdateManager.js +0 -730
- package/dist/update/VersionManager.d.ts +0 -31
- package/dist/update/VersionManager.d.ts.map +0 -1
- package/dist/update/VersionManager.js +0 -181
- package/dist/update/index.d.ts +0 -9
- package/dist/update/index.d.ts.map +0 -1
- package/dist/update/index.js +0 -9
- /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
|
@@ -6,6 +6,9 @@ import * as path from 'path';
|
|
|
6
6
|
import { ElementType } from './types.js';
|
|
7
7
|
import { logger } from '../utils/logger.js';
|
|
8
8
|
import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
9
|
+
import { ContentValidator } from '../security/contentValidator.js';
|
|
10
|
+
import { FileLockManager } from '../security/fileLockManager.js';
|
|
11
|
+
import { SecurityMonitor } from '../security/securityMonitor.js';
|
|
9
12
|
export class MigrationManager {
|
|
10
13
|
portfolioManager;
|
|
11
14
|
constructor(portfolioManager) {
|
|
@@ -37,12 +40,28 @@ export class MigrationManager {
|
|
|
37
40
|
return result;
|
|
38
41
|
}
|
|
39
42
|
logger.info('[MigrationManager] Starting migration from legacy personas to portfolio structure');
|
|
43
|
+
// SECURITY FIX: DMCP-SEC-006 - Add security audit logging
|
|
44
|
+
SecurityMonitor.logSecurityEvent({
|
|
45
|
+
type: 'PORTFOLIO_INITIALIZATION',
|
|
46
|
+
severity: 'LOW',
|
|
47
|
+
source: 'migration_manager',
|
|
48
|
+
details: 'Starting migration from legacy personas to portfolio structure',
|
|
49
|
+
metadata: { backup: !!options?.backup }
|
|
50
|
+
});
|
|
40
51
|
// Create backup if requested
|
|
41
52
|
if (options?.backup) {
|
|
42
53
|
const backupPath = await this.createBackup();
|
|
43
54
|
result.backedUp = true;
|
|
44
55
|
result.backupPath = backupPath;
|
|
45
56
|
logger.info(`[MigrationManager] Created backup at: ${backupPath}`);
|
|
57
|
+
// SECURITY FIX: DMCP-SEC-006 - Log backup creation for audit trail
|
|
58
|
+
SecurityMonitor.logSecurityEvent({
|
|
59
|
+
type: 'FILE_COPIED',
|
|
60
|
+
severity: 'LOW',
|
|
61
|
+
source: 'migration_manager',
|
|
62
|
+
details: `Created backup during migration: ${backupPath}`,
|
|
63
|
+
metadata: { backupPath, operation: 'migration_backup' }
|
|
64
|
+
});
|
|
46
65
|
}
|
|
47
66
|
// Initialize portfolio structure
|
|
48
67
|
await this.portfolioManager.initialize();
|
|
@@ -56,17 +75,49 @@ export class MigrationManager {
|
|
|
56
75
|
try {
|
|
57
76
|
await this.migratePersona(file);
|
|
58
77
|
result.migratedCount++;
|
|
78
|
+
// SECURITY FIX: DMCP-SEC-006 - Log each successful migration for audit trail
|
|
79
|
+
SecurityMonitor.logSecurityEvent({
|
|
80
|
+
type: 'FILE_COPIED',
|
|
81
|
+
severity: 'LOW',
|
|
82
|
+
source: 'migration_manager',
|
|
83
|
+
details: `Successfully migrated persona: ${file}`,
|
|
84
|
+
metadata: { filename: file, operation: 'persona_migration' }
|
|
85
|
+
});
|
|
59
86
|
}
|
|
60
87
|
catch (error) {
|
|
61
88
|
const errorMsg = `Failed to migrate ${file}: ${error instanceof Error ? error.message : String(error)}`;
|
|
62
89
|
logger.error(`[MigrationManager] ${errorMsg}`);
|
|
63
90
|
result.errors.push(errorMsg);
|
|
64
91
|
result.success = false;
|
|
92
|
+
// SECURITY FIX: DMCP-SEC-006 - Log individual migration failures for audit trail
|
|
93
|
+
SecurityMonitor.logSecurityEvent({
|
|
94
|
+
type: 'FILE_COPIED',
|
|
95
|
+
severity: 'MEDIUM',
|
|
96
|
+
source: 'migration_manager',
|
|
97
|
+
details: `Failed to migrate persona: ${errorMsg}`,
|
|
98
|
+
metadata: {
|
|
99
|
+
filename: file,
|
|
100
|
+
operation: 'persona_migration_failed',
|
|
101
|
+
errorType: error instanceof Error ? error.name : 'unknown'
|
|
102
|
+
}
|
|
103
|
+
});
|
|
65
104
|
}
|
|
66
105
|
}
|
|
67
106
|
// If all migrations successful, optionally clean up legacy directory
|
|
68
107
|
if (result.success && result.migratedCount > 0) {
|
|
69
108
|
logger.info(`[MigrationManager] Successfully migrated ${result.migratedCount} personas`);
|
|
109
|
+
// SECURITY FIX: DMCP-SEC-006 - Log successful migration completion for audit trail
|
|
110
|
+
SecurityMonitor.logSecurityEvent({
|
|
111
|
+
type: 'PORTFOLIO_POPULATED',
|
|
112
|
+
severity: 'LOW',
|
|
113
|
+
source: 'migration_manager',
|
|
114
|
+
details: `Migration completed successfully: ${result.migratedCount} personas migrated`,
|
|
115
|
+
metadata: {
|
|
116
|
+
migratedCount: result.migratedCount,
|
|
117
|
+
backedUp: result.backedUp,
|
|
118
|
+
backupPath: result.backupPath
|
|
119
|
+
}
|
|
120
|
+
});
|
|
70
121
|
// Note: We don't automatically delete the legacy directory
|
|
71
122
|
// User should manually remove it after confirming migration success
|
|
72
123
|
}
|
|
@@ -75,6 +126,18 @@ export class MigrationManager {
|
|
|
75
126
|
result.success = false;
|
|
76
127
|
const errorMsg = `Migration failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
77
128
|
result.errors.push(errorMsg);
|
|
129
|
+
// SECURITY FIX: DMCP-SEC-006 - Log migration failures for security audit trail
|
|
130
|
+
SecurityMonitor.logSecurityEvent({
|
|
131
|
+
type: 'DIRECTORY_MIGRATION',
|
|
132
|
+
severity: 'HIGH',
|
|
133
|
+
source: 'migration_manager',
|
|
134
|
+
details: `Migration failed: ${errorMsg}`,
|
|
135
|
+
metadata: {
|
|
136
|
+
errorType: error instanceof Error ? error.name : 'unknown',
|
|
137
|
+
migratedCount: result.migratedCount,
|
|
138
|
+
errorCount: result.errors.length
|
|
139
|
+
}
|
|
140
|
+
});
|
|
78
141
|
// Log with full error details including stack trace
|
|
79
142
|
if (error instanceof Error) {
|
|
80
143
|
logger.error(`[MigrationManager] ${errorMsg}`, {
|
|
@@ -101,6 +164,18 @@ export class MigrationManager {
|
|
|
101
164
|
}
|
|
102
165
|
if (!filenameValidation.isValid) {
|
|
103
166
|
logger.warn(`[MigrationManager] Filename has Unicode issues: ${filenameValidation.detectedIssues?.join(', ')}`);
|
|
167
|
+
// SECURITY FIX: DMCP-SEC-006 - Log Unicode issues for security audit trail
|
|
168
|
+
SecurityMonitor.logSecurityEvent({
|
|
169
|
+
type: 'UNICODE_VALIDATION_ERROR',
|
|
170
|
+
severity: 'MEDIUM',
|
|
171
|
+
source: 'migration_manager',
|
|
172
|
+
details: `Unicode issues detected in filename during migration: ${filenameValidation.detectedIssues?.join(', ')}`,
|
|
173
|
+
metadata: {
|
|
174
|
+
originalFilename: filename,
|
|
175
|
+
normalizedFilename,
|
|
176
|
+
detectedIssues: filenameValidation.detectedIssues
|
|
177
|
+
}
|
|
178
|
+
});
|
|
104
179
|
}
|
|
105
180
|
const legacyPath = path.join(this.portfolioManager.getLegacyPersonasDir(), filename);
|
|
106
181
|
const newPath = this.portfolioManager.getElementPath(ElementType.PERSONA, normalizedFilename);
|
|
@@ -111,9 +186,52 @@ export class MigrationManager {
|
|
|
111
186
|
const normalizedContent = contentValidation.normalizedContent;
|
|
112
187
|
if (!contentValidation.isValid) {
|
|
113
188
|
logger.warn(`[MigrationManager] Content has Unicode issues in ${filename}: ${contentValidation.detectedIssues?.join(', ')}`);
|
|
189
|
+
// SECURITY FIX: DMCP-SEC-006 - Log Unicode content issues for security audit trail
|
|
190
|
+
SecurityMonitor.logSecurityEvent({
|
|
191
|
+
type: 'UNICODE_VALIDATION_ERROR',
|
|
192
|
+
severity: 'MEDIUM',
|
|
193
|
+
source: 'migration_manager',
|
|
194
|
+
details: `Unicode issues detected in content during migration: ${contentValidation.detectedIssues?.join(', ')}`,
|
|
195
|
+
metadata: {
|
|
196
|
+
filename,
|
|
197
|
+
detectedIssues: contentValidation.detectedIssues,
|
|
198
|
+
contentLength: content.length
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// SECURITY FIX: Add comprehensive content validation before write
|
|
203
|
+
// FIXED: CVE-2025-XXXX - Direct file write without security validation in migration
|
|
204
|
+
// Original issue: Line 147 used direct fs.writeFile without comprehensive validation
|
|
205
|
+
// Security impact: Could allow malicious content to be written during migration
|
|
206
|
+
// Fix: Added ContentValidator.validateAndSanitize with critical threat blocking
|
|
207
|
+
const validationResult = ContentValidator.validateAndSanitize(normalizedContent);
|
|
208
|
+
if (!validationResult.isValid && validationResult.severity === 'critical') {
|
|
209
|
+
const patterns = validationResult.detectedPatterns?.join(', ') || 'unknown patterns';
|
|
210
|
+
throw new Error(`Critical security threat in migrated content for ${filename}: ${patterns}`);
|
|
114
211
|
}
|
|
115
|
-
|
|
116
|
-
|
|
212
|
+
const validatedContent = validationResult.sanitizedContent || normalizedContent;
|
|
213
|
+
// SECURITY FIX: Replace direct write with atomic operation
|
|
214
|
+
// FIXED: Race condition vulnerability in file writes during migration
|
|
215
|
+
// Original issue: Line 147 used non-atomic fs.writeFile operation
|
|
216
|
+
// Security impact: Race conditions could cause data corruption or partial writes
|
|
217
|
+
// Fix: Replaced with FileLockManager.atomicWriteFile for guaranteed atomicity
|
|
218
|
+
await FileLockManager.atomicWriteFile(newPath, validatedContent, { encoding: 'utf-8' });
|
|
219
|
+
// SECURITY FIX: DMCP-SEC-006 - Log file operations for security audit trail
|
|
220
|
+
SecurityMonitor.logSecurityEvent({
|
|
221
|
+
type: 'FILE_COPIED',
|
|
222
|
+
severity: 'LOW',
|
|
223
|
+
source: 'migration_manager',
|
|
224
|
+
details: `Persona file migrated with security validation: ${normalizedFilename}`,
|
|
225
|
+
metadata: {
|
|
226
|
+
originalFilename: filename,
|
|
227
|
+
normalizedFilename,
|
|
228
|
+
sourcePath: legacyPath,
|
|
229
|
+
destinationPath: newPath,
|
|
230
|
+
contentLength: validatedContent.length,
|
|
231
|
+
unicodeNormalized: normalizedFilename !== filename,
|
|
232
|
+
unicodeIssues: !contentValidation.isValid
|
|
233
|
+
}
|
|
234
|
+
});
|
|
117
235
|
logger.debug(`[MigrationManager] Migrated: ${filename}`);
|
|
118
236
|
}
|
|
119
237
|
/**
|
|
@@ -127,14 +245,29 @@ export class MigrationManager {
|
|
|
127
245
|
await fs.mkdir(backupDir, { recursive: true });
|
|
128
246
|
// Copy all files
|
|
129
247
|
const files = await fs.readdir(legacyDir);
|
|
248
|
+
let copiedCount = 0;
|
|
130
249
|
for (const file of files) {
|
|
131
250
|
const srcPath = path.join(legacyDir, file);
|
|
132
251
|
const destPath = path.join(backupDir, file);
|
|
133
252
|
const stats = await fs.stat(srcPath);
|
|
134
253
|
if (stats.isFile()) {
|
|
135
254
|
await fs.copyFile(srcPath, destPath);
|
|
255
|
+
copiedCount++;
|
|
136
256
|
}
|
|
137
257
|
}
|
|
258
|
+
// SECURITY FIX: DMCP-SEC-006 - Log backup operation details for audit trail
|
|
259
|
+
SecurityMonitor.logSecurityEvent({
|
|
260
|
+
type: 'FILE_COPIED',
|
|
261
|
+
severity: 'LOW',
|
|
262
|
+
source: 'migration_manager',
|
|
263
|
+
details: `Backup created: ${copiedCount} files copied to ${backupDir}`,
|
|
264
|
+
metadata: {
|
|
265
|
+
backupDir,
|
|
266
|
+
legacyDir,
|
|
267
|
+
filesCopied: copiedCount,
|
|
268
|
+
operation: 'backup_creation'
|
|
269
|
+
}
|
|
270
|
+
});
|
|
138
271
|
return backupDir;
|
|
139
272
|
}
|
|
140
273
|
/**
|
|
@@ -160,4 +293,4 @@ export class MigrationManager {
|
|
|
160
293
|
};
|
|
161
294
|
}
|
|
162
295
|
}
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBVTlFLE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsZ0JBQWdCLENBQW1CO0lBRTNDLFlBQVksZ0JBQWtDO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsY0FBYztRQUN6QixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xFLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRTdELGlFQUFpRTtRQUNqRSxPQUFPLFNBQVMsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQThCO1FBQ2pELE1BQU0sTUFBTSxHQUFvQjtZQUM5QixPQUFPLEVBQUUsSUFBSTtZQUNiLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILCtCQUErQjtZQUMvQixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFF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SUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBZ0MsQ0FBQztRQUVqSCxPQUFPO1lBQ0wsaUJBQWlCO1lBQ2pCLGtCQUFrQjtZQUNsQixlQUFlO1lBQ2YsY0FBYztTQUNmLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1pZ3JhdGlvbiBNYW5hZ2VyIC0gSGFuZGxlcyBtaWdyYXRpb24gZnJvbSBsZWdhY3kgc3RydWN0dXJlIHRvIHBvcnRmb2xpbyBzdHJ1Y3R1cmVcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvblJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1pZ3JhdGVkQ291bnQ6IG51bWJlcjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbiAgYmFja2VkVXA6IGJvb2xlYW47XG4gIGJhY2t1cFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25NYW5hZ2VyIHtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBcbiAgY29uc3RydWN0b3IocG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcikge1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IHBvcnRmb2xpb01hbmFnZXI7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBtaWdyYXRpb24gaXMgbmVlZGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbmVlZHNNaWdyYXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaGFzTGVnYWN5ID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmhhc0xlZ2FjeVBlcnNvbmFzKCk7XG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpO1xuICAgIFxuICAgIC8vIE5lZWQgbWlncmF0aW9uIGlmIHdlIGhhdmUgbGVnYWN5IHBlcnNvbmFzIGJ1dCBubyBwb3J0Zm9saW8geWV0XG4gICAgcmV0dXJuIGhhc0xlZ2FjeSAmJiAhcG9ydGZvbGlvRXhpc3RzO1xuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSBtaWdyYXRpb24gZnJvbSBsZWdhY3kgdG8gcG9ydGZvbGlvIHN0cnVjdHVyZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1pZ3JhdGUob3B0aW9ucz86IHsgYmFja3VwPzogYm9vbGVhbiB9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHQ6IE1pZ3JhdGlvblJlc3VsdCA9IHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtaWdyYXRlZENvdW50OiAwLFxuICAgICAgZXJyb3JzOiBbXSxcbiAgICAgIGJhY2tlZFVwOiBmYWxzZVxuICAgIH07XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIG1pZ3JhdGlvbiBpcyBuZWVkZWRcbiAgICAgIGlmICghYXdhaXQgdGhpcy5uZWVkc01pZ3JhdGlvbigpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbTWlncmF0aW9uTWFuYWdlcl0gTm8gbWlncmF0aW9uIG5lZWRlZCcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnW01pZ3JhdGlvbk1hbmFnZXJdIFN0YXJ0aW5nIG1pZ3JhdGlvbiBmcm9tIGxlZ2FjeSBwZXJzb25hcyB0byBwb3J0Zm9saW8gc3RydWN0dXJlJyk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBiYWNrdXAgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAob3B0aW9ucz8uYmFja3VwKSB7XG4gICAgICAgIGNvbnN0IGJhY2t1cFBhdGggPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cCgpO1xuICAgICAgICByZXN1bHQuYmFja2VkVXAgPSB0cnVlO1xuICAgICAgICByZXN1bHQuYmFja3VwUGF0aCA9IGJhY2t1cFBhdGg7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWlncmF0aW9uTWFuYWdlcl0gQ3JlYXRlZCBiYWNrdXAgYXQ6ICR7YmFja3VwUGF0aH1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBwb3J0Zm9saW8gc3RydWN0dXJlXG4gICAgICBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgXG4gICAgICAvLyBHZXQgbGVnYWN5IHBlcnNvbmFzXG4gICAgICBjb25zdCBsZWdhY3lEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0TGVnYWN5UGVyc29uYXNEaXIoKTtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihsZWdhY3lEaXIpO1xuICAgICAgY29uc3QgcGVyc29uYUZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbyhgW01pZ3JhdGlvbk1hbmFnZXJdIEZvdW5kICR7cGVyc29uYUZpbGVzLmxlbmd0aH0gcGVyc29uYXMgdG8gbWlncmF0ZWApO1xuICAgICAgXG4gICAgICAvLyBNaWdyYXRlIGVhY2ggcGVyc29uYVxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHBlcnNvbmFGaWxlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubWlncmF0ZVBlcnNvbmEoZmlsZSk7XG4gICAgICAgICAgcmVzdWx0Lm1pZ3JhdGVkQ291bnQrKztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGBGYWlsZWQgdG8gbWlncmF0ZSAke2ZpbGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgW01pZ3JhdGlvbk1hbmFnZXJdICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKGVycm9yTXNnKTtcbiAgICAgICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIGFsbCBtaWdyYXRpb25zIHN1Y2Nlc3NmdWwsIG9wdGlvbmFsbHkgY2xlYW4gdXAgbGVnYWN5IGRpcmVjdG9yeVxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5taWdyYXRlZENvdW50ID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01pZ3JhdGlvbk1hbmFnZXJdIFN1Y2Nlc3NmdWxseSBtaWdyYXRlZCAke3Jlc3VsdC5taWdyYXRlZENvdW50fSBwZXJzb25hc2ApO1xuICAgICAgICAvLyBOb3RlOiBXZSBkb24ndCBhdXRvbWF0aWNhbGx5IGRlbGV0ZSB0aGUgbGVnYWN5IGRpcmVjdG9yeVxuICAgICAgICAvLyBVc2VyIHNob3VsZCBtYW51YWxseSByZW1vdmUgaXQgYWZ0ZXIgY29uZmlybWluZyBtaWdyYXRpb24gc3VjY2Vzc1xuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICBjb25zdCBlcnJvck1zZyA9IGBNaWdyYXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gO1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKGVycm9yTXNnKTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHdpdGggZnVsbCBlcnJvciBkZXRhaWxzIGluY2x1ZGluZyBzdGFjayB0cmFjZVxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWlncmF0aW9uTWFuYWdlcl0gJHtlcnJvck1zZ31gLCB7IFxuICAgICAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICAgIGNhdXNlOiBlcnJvci5jYXVzZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW01pZ3JhdGlvbk1hbmFnZXJdICR7ZXJyb3JNc2d9YCwgeyByYXdFcnJvcjogZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNaWdyYXRlIGEgc2luZ2xlIHBlcnNvbmEgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtaWdyYXRlUGVyc29uYShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTm9ybWFsaXplIGZpbGVuYW1lIHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzXG4gICAgY29uc3QgZmlsZW5hbWVWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZmlsZW5hbWUpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlbmFtZSA9IGZpbGVuYW1lVmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICBpZiAobm9ybWFsaXplZEZpbGVuYW1lICE9PSBmaWxlbmFtZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtNaWdyYXRpb25NYW5hZ2VyXSBGaWxlbmFtZSBub3JtYWxpemVkIGZyb20gXCIke2ZpbGVuYW1lfVwiIHRvIFwiJHtub3JtYWxpemVkRmlsZW5hbWV9XCJgKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFmaWxlbmFtZVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtNaWdyYXRpb25NYW5hZ2VyXSBGaWxlbmFtZSBoYXMgVW5pY29kZSBpc3N1ZXM6ICR7ZmlsZW5hbWVWYWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBsZWdhY3lQYXRoID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRMZWdhY3lQZXJzb25hc0RpcigpLCBmaWxlbmFtZSk7XG4gICAgY29uc3QgbmV3UGF0aCA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50UGF0aChFbGVtZW50VHlwZS5QRVJTT05BLCBub3JtYWxpemVkRmlsZW5hbWUpO1xuICAgIFxuICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobGVnYWN5UGF0aCwgJ3V0Zi04Jyk7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGNvbnRlbnQgdG8gcHJldmVudCBVbmljb2RlIGlzc3Vlc1xuICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY29udGVudCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50VmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICBpZiAoIWNvbnRlbnRWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbTWlncmF0aW9uTWFuYWdlcl0gQ29udGVudCBoYXMgVW5pY29kZSBpc3N1ZXMgaW4gJHtmaWxlbmFtZX06ICR7Y29udGVudFZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFdyaXRlIHRvIG5ldyBsb2NhdGlvblxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShuZXdQYXRoLCBub3JtYWxpemVkQ29udGVudCwgJ3V0Zi04Jyk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKGBbTWlncmF0aW9uTWFuYWdlcl0gTWlncmF0ZWQ6ICR7ZmlsZW5hbWV9YCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgYmFja3VwIG9mIGxlZ2FjeSBwZXJzb25hc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVCYWNrdXAoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsZWdhY3lEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0TGVnYWN5UGVyc29uYXNEaXIoKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IGJhY2t1cERpciA9IGAke2xlZ2FjeURpcn1fYmFja3VwXyR7dGltZXN0YW1wfWA7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGJhY2t1cCBkaXJlY3RvcnlcbiAgICBhd2FpdCBmcy5ta2RpcihiYWNrdXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIFxuICAgIC8vIENvcHkgYWxsIGZpbGVzXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGxlZ2FjeURpcik7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKGxlZ2FjeURpciwgZmlsZSk7XG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihiYWNrdXBEaXIsIGZpbGUpO1xuICAgICAgXG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoc3JjUGF0aCk7XG4gICAgICBpZiAoc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgYXdhaXQgZnMuY29weUZpbGUoc3JjUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYmFja3VwRGlyO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IG1pZ3JhdGlvbiBzdGF0dXMgcmVwb3J0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TWlncmF0aW9uU3RhdHVzKCk6IFByb21pc2U8e1xuICAgIGhhc0xlZ2FjeVBlcnNvbmFzOiBib29sZWFuO1xuICAgIGxlZ2FjeVBlcnNvbmFDb3VudDogbnVtYmVyO1xuICAgIHBvcnRmb2xpb0V4aXN0czogYm9vbGVhbjtcbiAgICBwb3J0Zm9saW9TdGF0czogUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+O1xuICB9PiB7XG4gICAgY29uc3QgaGFzTGVnYWN5UGVyc29uYXMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuaGFzTGVnYWN5UGVyc29uYXMoKTtcbiAgICBsZXQgbGVnYWN5UGVyc29uYUNvdW50ID0gMDtcbiAgICBcbiAgICBpZiAoaGFzTGVnYWN5UGVyc29uYXMpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeURpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRMZWdhY3lQZXJzb25hc0RpcigpO1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGxlZ2FjeURpcik7XG4gICAgICBsZWdhY3lQZXJzb25hQ291bnQgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSkubGVuZ3RoO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBwb3J0Zm9saW9FeGlzdHMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZXhpc3RzKCk7XG4gICAgY29uc3QgcG9ydGZvbGlvU3RhdHMgPSBwb3J0Zm9saW9FeGlzdHMgXG4gICAgICA/IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRTdGF0aXN0aWNzKClcbiAgICAgIDogT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkucmVkdWNlKChhY2MsIHR5cGUpID0+ICh7IC4uLmFjYywgW3R5cGVdOiAwIH0pLCB7fSkgYXMgUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+O1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBoYXNMZWdhY3lQZXJzb25hcyxcbiAgICAgIGxlZ2FjeVBlcnNvbmFDb3VudCxcbiAgICAgIHBvcnRmb2xpb0V4aXN0cyxcbiAgICAgIHBvcnRmb2xpb1N0YXRzXG4gICAgfTtcbiAgfVxufSJdfQ==
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFVakUsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixnQkFBZ0IsQ0FBbUI7SUFFM0MsWUFBWSxnQkFBa0M7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxjQUFjO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbEUsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFN0QsaUVBQWlFO1FBQ2pFLE9BQU8sU0FBUyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBOEI7UUFDakQsTUFBTSxNQUFNLEdBQW9CO1lBQzlCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsYUFB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QkFBa0I7WUFDbEIsZUFBZTtZQUNmLGNBQWM7U0FDZixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNaWdyYXRpb24gTWFuYWdlciAtIEhhbmRsZXMgbWlncmF0aW9uIGZyb20gbGVnYWN5IHN0cnVjdHVyZSB0byBwb3J0Zm9saW8gc3RydWN0dXJlXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvblJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1pZ3JhdGVkQ291bnQ6IG51bWJlcjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbiAgYmFja2VkVXA6IGJvb2xlYW47XG4gIGJhY2t1cFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25NYW5hZ2VyIHtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBcbiAgY29uc3RydWN0b3IocG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcikge1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IHBvcnRmb2xpb01hbmFnZXI7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBtaWdyYXRpb24gaXMgbmVlZGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbmVlZHNNaWdyYXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaGFzTGVnYWN5ID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmhhc0xlZ2FjeVBlcnNvbmFzKCk7XG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpO1xuICAgIFxuICAgIC8vIE5lZWQgbWlncmF0aW9uIGlmIHdlIGhhdmUgbGVnYWN5IHBlcnNvbmFzIGJ1dCBubyBwb3J0Zm9saW8geWV0XG4gICAgcmV0dXJuIGhhc0xlZ2FjeSAmJiAhcG9ydGZvbGlvRXhpc3RzO1xuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSBtaWdyYXRpb24gZnJvbSBsZWdhY3kgdG8gcG9ydGZvbGlvIHN0cnVjdHVyZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1pZ3JhdGUob3B0aW9ucz86IHsgYmFja3VwPzogYm9vbGVhbiB9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHQ6IE1pZ3JhdGlvblJlc3VsdCA9IHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtaWdyYXRlZENvdW50OiAwLFxuICAgICAgZXJyb3JzOiBbXSxcbiAgICAgIGJhY2tlZFVwOiBmYWxzZVxuICAgIH07XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIG1pZ3JhdGlvbiBpcyBuZWVkZWRcbiAgICAgIGlmICghYXdhaXQgdGhpcy5uZWVkc01pZ3JhdGlvbigpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbTWlncmF0aW9uTWFuYWdlcl0gTm8gbWlncmF0aW9uIG5lZWRlZCcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnW01pZ3JhdGlvbk1hbmFnZXJdIFN0YXJ0aW5nIG1pZ3JhdGlvbiBmcm9tIGxlZ2FjeSBwZXJzb25hcyB0byBwb3J0Zm9saW8gc3RydWN0dXJlJyk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWDogRE1DUC1TRUMtMDA2IC0gQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmdcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BPUlRGT0xJT19JTklUSUFMSVpBVElPTicsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnbWlncmF0aW9uX21hbmFnZXInLFxuICAgICAgICBkZXRhaWxzOiAnU3RhcnRpbmcgbWlncmF0aW9uIGZyb20gbGVnYWN5IHBlcnNvbmFzIHRvIHBvcnRmb2xpbyBzdHJ1Y3R1cmUnLFxuICAgICAgICBtZXRhZGF0YTogeyBiYWNrdXA6ICEhb3B0aW9ucz8uYmFja3VwIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYmFja3VwIGlmIHJlcXVlc3RlZFxuICAgICAgaWYgKG9wdGlvbnM/LmJhY2t1cCkge1xuICAgICAgICBjb25zdCBiYWNrdXBQYXRoID0gYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXAoKTtcbiAgICAgICAgcmVzdWx0LmJhY2tlZFVwID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0LmJhY2t1cFBhdGggPSBiYWNrdXBQYXRoO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01pZ3JhdGlvbk1hbmFnZXJdIENyZWF0ZWQgYmFja3VwIGF0OiAke2JhY2t1cFBhdGh9YCk7XG4gICAgICAgIFxuICAgICAgICAvLyBTRUNVUklUWSBGSVg6IERNQ1AtU0VDLTAwNiAtIExvZyBiYWNrdXAgY3JlYXRpb24gZm9yIGF1ZGl0IHRyYWlsXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdtaWdyYXRpb25fbWFuYWdlcicsXG4gICAgICAgICAgZGV0YWlsczogYENyZWF0ZWQgYmFja3VwIGR1cmluZyBtaWdyYXRpb246ICR7YmFja3VwUGF0aH1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IGJhY2t1cFBhdGgsIG9wZXJhdGlvbjogJ21pZ3JhdGlvbl9iYWNrdXAnIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgcG9ydGZvbGlvIHN0cnVjdHVyZVxuICAgICAgYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmluaXRpYWxpemUoKTtcbiAgICAgIFxuICAgICAgLy8gR2V0IGxlZ2FjeSBwZXJzb25hc1xuICAgICAgY29uc3QgbGVnYWN5RGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldExlZ2FjeVBlcnNvbmFzRGlyKCk7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIobGVnYWN5RGlyKTtcbiAgICAgIGNvbnN0IHBlcnNvbmFGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFtNaWdyYXRpb25NYW5hZ2VyXSBGb3VuZCAke3BlcnNvbmFGaWxlcy5sZW5ndGh9IHBlcnNvbmFzIHRvIG1pZ3JhdGVgKTtcbiAgICAgIFxuICAgICAgLy8gTWlncmF0ZSBlYWNoIHBlcnNvbmFcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBwZXJzb25hRmlsZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm1pZ3JhdGVQZXJzb25hKGZpbGUpO1xuICAgICAgICAgIHJlc3VsdC5taWdyYXRlZENvdW50Kys7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gU0VDVVJJVFkgRklYOiBETUNQLVNFQy0wMDYgLSBMb2cgZWFjaCBzdWNjZXNzZnVsIG1pZ3JhdGlvbiBmb3IgYXVkaXQgdHJhaWxcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnbWlncmF0aW9uX21hbmFnZXInLFxuICAgICAgICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBtaWdyYXRlZCBwZXJzb25hOiAke2ZpbGV9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IGZpbGVuYW1lOiBmaWxlLCBvcGVyYXRpb246ICdwZXJzb25hX21pZ3JhdGlvbicgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gYEZhaWxlZCB0byBtaWdyYXRlICR7ZmlsZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWA7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWlncmF0aW9uTWFuYWdlcl0gJHtlcnJvck1zZ31gKTtcbiAgICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goZXJyb3JNc2cpO1xuICAgICAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gU0VDVVJJVFkgRklYOiBETUNQLVNFQy0wMDYgLSBMb2cgaW5kaXZpZHVhbCBtaWdyYXRpb24gZmFpbHVyZXMgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ0ZJTEVfQ09QSUVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ21pZ3JhdGlvbl9tYW5hZ2VyJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gbWlncmF0ZSBwZXJzb25hOiAke2Vycm9yTXNnfWAsXG4gICAgICAgICAgICBtZXRhZGF0YTogeyBcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGUsIFxuICAgICAgICAgICAgICBvcGVyYXRpb246ICdwZXJzb25hX21pZ3JhdGlvbl9mYWlsZWQnLFxuICAgICAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogJ3Vua25vd24nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgYWxsIG1pZ3JhdGlvbnMgc3VjY2Vzc2Z1bCwgb3B0aW9uYWxseSBjbGVhbiB1cCBsZWdhY3kgZGlyZWN0b3J5XG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0Lm1pZ3JhdGVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWlncmF0aW9uTWFuYWdlcl0gU3VjY2Vzc2Z1bGx5IG1pZ3JhdGVkICR7cmVzdWx0Lm1pZ3JhdGVkQ291bnR9IHBlcnNvbmFzYCk7XG4gICAgICAgIFxuICAgICAgICAvLyBTRUNVUklUWSBGSVg6IERNQ1AtU0VDLTAwNiAtIExvZyBzdWNjZXNzZnVsIG1pZ3JhdGlvbiBjb21wbGV0aW9uIGZvciBhdWRpdCB0cmFpbFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BPUlRGT0xJT19QT1BVTEFURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdtaWdyYXRpb25fbWFuYWdlcicsXG4gICAgICAgICAgZGV0YWlsczogYE1pZ3JhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5OiAke3Jlc3VsdC5taWdyYXRlZENvdW50fSBwZXJzb25hcyBtaWdyYXRlZGAsXG4gICAgICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgICAgICBtaWdyYXRlZENvdW50OiByZXN1bHQubWlncmF0ZWRDb3VudCwgXG4gICAgICAgICAgICBiYWNrZWRVcDogcmVzdWx0LmJhY2tlZFVwLFxuICAgICAgICAgICAgYmFja3VwUGF0aDogcmVzdWx0LmJhY2t1cFBhdGhcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgYXV0b21hdGljYWxseSBkZWxldGUgdGhlIGxlZ2FjeSBkaXJlY3RvcnlcbiAgICAgICAgLy8gVXNlciBzaG91bGQgbWFudWFsbHkgcmVtb3ZlIGl0IGFmdGVyIGNvbmZpcm1pbmcgbWlncmF0aW9uIHN1Y2Nlc3NcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgY29uc3QgZXJyb3JNc2cgPSBgTWlncmF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YDtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaChlcnJvck1zZyk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWDogRE1DUC1TRUMtMDA2IC0gTG9nIG1pZ3JhdGlvbiBmYWlsdXJlcyBmb3Igc2VjdXJpdHkgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0RJUkVDVE9SWV9NSUdSQVRJT04nLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdtaWdyYXRpb25fbWFuYWdlcicsXG4gICAgICAgIGRldGFpbHM6IGBNaWdyYXRpb24gZmFpbGVkOiAke2Vycm9yTXNnfWAsXG4gICAgICAgIG1ldGFkYXRhOiB7IFxuICAgICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm5hbWUgOiAndW5rbm93bicsXG4gICAgICAgICAgbWlncmF0ZWRDb3VudDogcmVzdWx0Lm1pZ3JhdGVkQ291bnQsXG4gICAgICAgICAgZXJyb3JDb3VudDogcmVzdWx0LmVycm9ycy5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIExvZyB3aXRoIGZ1bGwgZXJyb3IgZGV0YWlscyBpbmNsdWRpbmcgc3RhY2sgdHJhY2VcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW01pZ3JhdGlvbk1hbmFnZXJdICR7ZXJyb3JNc2d9YCwgeyBcbiAgICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2ssXG4gICAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IuY2F1c2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNaWdyYXRpb25NYW5hZ2VyXSAke2Vycm9yTXNnfWAsIHsgcmF3RXJyb3I6IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICAvKipcbiAgICogTWlncmF0ZSBhIHNpbmdsZSBwZXJzb25hIGZpbGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWlncmF0ZVBlcnNvbmEoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE5vcm1hbGl6ZSBmaWxlbmFtZSB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrc1xuICAgIGNvbnN0IGZpbGVuYW1lVmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGZpbGVuYW1lKTtcbiAgICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSBmaWxlbmFtZVZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlbmFtZSAhPT0gZmlsZW5hbWUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbTWlncmF0aW9uTWFuYWdlcl0gRmlsZW5hbWUgbm9ybWFsaXplZCBmcm9tIFwiJHtmaWxlbmFtZX1cIiB0byBcIiR7bm9ybWFsaXplZEZpbGVuYW1lfVwiYCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghZmlsZW5hbWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbTWlncmF0aW9uTWFuYWdlcl0gRmlsZW5hbWUgaGFzIFVuaWNvZGUgaXNzdWVzOiAke2ZpbGVuYW1lVmFsaWRhdGlvbi5kZXRlY3RlZElzc3Vlcz8uam9pbignLCAnKX1gKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBETUNQLVNFQy0wMDYgLSBMb2cgVW5pY29kZSBpc3N1ZXMgZm9yIHNlY3VyaXR5IGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ21pZ3JhdGlvbl9tYW5hZ2VyJyxcbiAgICAgICAgZGV0YWlsczogYFVuaWNvZGUgaXNzdWVzIGRldGVjdGVkIGluIGZpbGVuYW1lIGR1cmluZyBtaWdyYXRpb246ICR7ZmlsZW5hbWVWYWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWAsXG4gICAgICAgIG1ldGFkYXRhOiB7IFxuICAgICAgICAgIG9yaWdpbmFsRmlsZW5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgIG5vcm1hbGl6ZWRGaWxlbmFtZSxcbiAgICAgICAgICBkZXRlY3RlZElzc3VlczogZmlsZW5hbWVWYWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBsZWdhY3lQYXRoID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRMZWdhY3lQZXJzb25hc0RpcigpLCBmaWxlbmFtZSk7XG4gICAgY29uc3QgbmV3UGF0aCA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50UGF0aChFbGVtZW50VHlwZS5QRVJTT05BLCBub3JtYWxpemVkRmlsZW5hbWUpO1xuICAgIFxuICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobGVnYWN5UGF0aCwgJ3V0Zi04Jyk7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGNvbnRlbnQgdG8gcHJldmVudCBVbmljb2RlIGlzc3Vlc1xuICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY29udGVudCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50VmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICBpZiAoIWNvbnRlbnRWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbTWlncmF0aW9uTWFuYWdlcl0gQ29udGVudCBoYXMgVW5pY29kZSBpc3N1ZXMgaW4gJHtmaWxlbmFtZX06ICR7Y29udGVudFZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWDogRE1DUC1TRUMtMDA2IC0gTG9nIFVuaWNvZGUgY29udGVudCBpc3N1ZXMgZm9yIHNlY3VyaXR5IGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ21pZ3JhdGlvbl9tYW5hZ2VyJyxcbiAgICAgICAgZGV0YWlsczogYFVuaWNvZGUgaXNzdWVzIGRldGVjdGVkIGluIGNvbnRlbnQgZHVyaW5nIG1pZ3JhdGlvbjogJHtjb250ZW50VmFsaWRhdGlvbi5kZXRlY3RlZElzc3Vlcz8uam9pbignLCAnKX1gLFxuICAgICAgICBtZXRhZGF0YTogeyBcbiAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICBkZXRlY3RlZElzc3VlczogY29udGVudFZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXMsXG4gICAgICAgICAgY29udGVudExlbmd0aDogY29udGVudC5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWDogQWRkIGNvbXByZWhlbnNpdmUgY29udGVudCB2YWxpZGF0aW9uIGJlZm9yZSB3cml0ZVxuICAgIC8vIEZJWEVEOiBDVkUtMjAyNS1YWFhYIC0gRGlyZWN0IGZpbGUgd3JpdGUgd2l0aG91dCBzZWN1cml0eSB2YWxpZGF0aW9uIGluIG1pZ3JhdGlvblxuICAgIC8vIE9yaWdpbmFsIGlzc3VlOiBMaW5lIDE0NyB1c2VkIGRpcmVjdCBmcy53cml0ZUZpbGUgd2l0aG91dCBjb21wcmVoZW5zaXZlIHZhbGlkYXRpb25cbiAgICAvLyBTZWN1cml0eSBpbXBhY3Q6IENvdWxkIGFsbG93IG1hbGljaW91cyBjb250ZW50IHRvIGJlIHdyaXR0ZW4gZHVyaW5nIG1pZ3JhdGlvblxuICAgIC8vIEZpeDogQWRkZWQgQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplIHdpdGggY3JpdGljYWwgdGhyZWF0IGJsb2NraW5nXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShub3JtYWxpemVkQ29udGVudCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQgJiYgdmFsaWRhdGlvblJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgY29uc3QgcGF0dGVybnMgPSB2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJykgfHwgJ3Vua25vd24gcGF0dGVybnMnO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgaW4gbWlncmF0ZWQgY29udGVudCBmb3IgJHtmaWxlbmFtZX06ICR7cGF0dGVybnN9YCk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHZhbGlkYXRlZENvbnRlbnQgPSB2YWxpZGF0aW9uUmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgbm9ybWFsaXplZENvbnRlbnQ7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBSZXBsYWNlIGRpcmVjdCB3cml0ZSB3aXRoIGF0b21pYyBvcGVyYXRpb25cbiAgICAvLyBGSVhFRDogUmFjZSBjb25kaXRpb24gdnVsbmVyYWJpbGl0eSBpbiBmaWxlIHdyaXRlcyBkdXJpbmcgbWlncmF0aW9uXG4gICAgLy8gT3JpZ2luYWwgaXNzdWU6IExpbmUgMTQ3IHVzZWQgbm9uLWF0b21pYyBmcy53cml0ZUZpbGUgb3BlcmF0aW9uXG4gICAgLy8gU2VjdXJpdHkgaW1wYWN0OiBSYWNlIGNvbmRpdGlvbnMgY291bGQgY2F1c2UgZGF0YSBjb3JydXB0aW9uIG9yIHBhcnRpYWwgd3JpdGVzXG4gICAgLy8gRml4OiBSZXBsYWNlZCB3aXRoIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUgZm9yIGd1YXJhbnRlZWQgYXRvbWljaXR5XG4gICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShuZXdQYXRoLCB2YWxpZGF0ZWRDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWDogRE1DUC1TRUMtMDA2IC0gTG9nIGZpbGUgb3BlcmF0aW9ucyBmb3Igc2VjdXJpdHkgYXVkaXQgdHJhaWxcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnbWlncmF0aW9uX21hbmFnZXInLFxuICAgICAgZGV0YWlsczogYFBlcnNvbmEgZmlsZSBtaWdyYXRlZCB3aXRoIHNlY3VyaXR5IHZhbGlkYXRpb246ICR7bm9ybWFsaXplZEZpbGVuYW1lfWAsXG4gICAgICBtZXRhZGF0YTogeyBcbiAgICAgICAgb3JpZ2luYWxGaWxlbmFtZTogZmlsZW5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWRGaWxlbmFtZSxcbiAgICAgICAgc291cmNlUGF0aDogbGVnYWN5UGF0aCxcbiAgICAgICAgZGVzdGluYXRpb25QYXRoOiBuZXdQYXRoLFxuICAgICAgICBjb250ZW50TGVuZ3RoOiB2YWxpZGF0ZWRDb250ZW50Lmxlbmd0aCxcbiAgICAgICAgdW5pY29kZU5vcm1hbGl6ZWQ6IG5vcm1hbGl6ZWRGaWxlbmFtZSAhPT0gZmlsZW5hbWUsXG4gICAgICAgIHVuaWNvZGVJc3N1ZXM6ICFjb250ZW50VmFsaWRhdGlvbi5pc1ZhbGlkXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKGBbTWlncmF0aW9uTWFuYWdlcl0gTWlncmF0ZWQ6ICR7ZmlsZW5hbWV9YCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgYmFja3VwIG9mIGxlZ2FjeSBwZXJzb25hc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVCYWNrdXAoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsZWdhY3lEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0TGVnYWN5UGVyc29uYXNEaXIoKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IGJhY2t1cERpciA9IGAke2xlZ2FjeURpcn1fYmFja3VwXyR7dGltZXN0YW1wfWA7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGJhY2t1cCBkaXJlY3RvcnlcbiAgICBhd2FpdCBmcy5ta2RpcihiYWNrdXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIFxuICAgIC8vIENvcHkgYWxsIGZpbGVzXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGxlZ2FjeURpcik7XG4gICAgbGV0IGNvcGllZENvdW50ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4obGVnYWN5RGlyLCBmaWxlKTtcbiAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKGJhY2t1cERpciwgZmlsZSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChzcmNQYXRoKTtcbiAgICAgIGlmIChzdGF0cy5pc0ZpbGUoKSkge1xuICAgICAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBkZXN0UGF0aCk7XG4gICAgICAgIGNvcGllZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWDogRE1DUC1TRUMtMDA2IC0gTG9nIGJhY2t1cCBvcGVyYXRpb24gZGV0YWlscyBmb3IgYXVkaXQgdHJhaWxcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnbWlncmF0aW9uX21hbmFnZXInLFxuICAgICAgZGV0YWlsczogYEJhY2t1cCBjcmVhdGVkOiAke2NvcGllZENvdW50fSBmaWxlcyBjb3BpZWQgdG8gJHtiYWNrdXBEaXJ9YCxcbiAgICAgIG1ldGFkYXRhOiB7IFxuICAgICAgICBiYWNrdXBEaXIsXG4gICAgICAgIGxlZ2FjeURpcixcbiAgICAgICAgZmlsZXNDb3BpZWQ6IGNvcGllZENvdW50LFxuICAgICAgICBvcGVyYXRpb246ICdiYWNrdXBfY3JlYXRpb24nXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGJhY2t1cERpcjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBtaWdyYXRpb24gc3RhdHVzIHJlcG9ydFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE1pZ3JhdGlvblN0YXR1cygpOiBQcm9taXNlPHtcbiAgICBoYXNMZWdhY3lQZXJzb25hczogYm9vbGVhbjtcbiAgICBsZWdhY3lQZXJzb25hQ291bnQ6IG51bWJlcjtcbiAgICBwb3J0Zm9saW9FeGlzdHM6IGJvb2xlYW47XG4gICAgcG9ydGZvbGlvU3RhdHM6IFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPjtcbiAgfT4ge1xuICAgIGNvbnN0IGhhc0xlZ2FjeVBlcnNvbmFzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmhhc0xlZ2FjeVBlcnNvbmFzKCk7XG4gICAgbGV0IGxlZ2FjeVBlcnNvbmFDb3VudCA9IDA7XG4gICAgXG4gICAgaWYgKGhhc0xlZ2FjeVBlcnNvbmFzKSB7XG4gICAgICBjb25zdCBsZWdhY3lEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0TGVnYWN5UGVyc29uYXNEaXIoKTtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihsZWdhY3lEaXIpO1xuICAgICAgbGVnYWN5UGVyc29uYUNvdW50ID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpLmxlbmd0aDtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmV4aXN0cygpO1xuICAgIGNvbnN0IHBvcnRmb2xpb1N0YXRzID0gcG9ydGZvbGlvRXhpc3RzIFxuICAgICAgPyBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0U3RhdGlzdGljcygpXG4gICAgICA6IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLnJlZHVjZSgoYWNjLCB0eXBlKSA9PiAoeyAuLi5hY2MsIFt0eXBlXTogMCB9KSwge30pIGFzIFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPjtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaGFzTGVnYWN5UGVyc29uYXMsXG4gICAgICBsZWdhY3lQZXJzb25hQ291bnQsXG4gICAgICBwb3J0Zm9saW9FeGlzdHMsXG4gICAgICBwb3J0Zm9saW9TdGF0c1xuICAgIH07XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portfolio Index Manager - Maps element names to file paths
|
|
3
|
+
*
|
|
4
|
+
* Solves critical issues:
|
|
5
|
+
* 1. submit_content can't find elements by metadata name (e.g., "Safe Roundtrip Tester" -> "safe-roundtrip-tester.md")
|
|
6
|
+
* 2. search_collection doesn't search local portfolio content
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - In-memory index mapping metadata.name → file path
|
|
10
|
+
* - Keywords/tags → file paths mapping
|
|
11
|
+
* - Element type → file paths mapping
|
|
12
|
+
* - Fast O(1) lookups with Maps
|
|
13
|
+
* - Lazy loading with 5-minute TTL cache
|
|
14
|
+
* - Unicode normalization for security
|
|
15
|
+
* - Error handling and logging
|
|
16
|
+
*/
|
|
17
|
+
import { ElementType } from './types.js';
|
|
18
|
+
export interface IndexEntry {
|
|
19
|
+
filePath: string;
|
|
20
|
+
elementType: ElementType;
|
|
21
|
+
metadata: {
|
|
22
|
+
name: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
version?: string;
|
|
25
|
+
author?: string;
|
|
26
|
+
tags?: string[];
|
|
27
|
+
keywords?: string[];
|
|
28
|
+
triggers?: string[];
|
|
29
|
+
category?: string;
|
|
30
|
+
created?: string;
|
|
31
|
+
updated?: string;
|
|
32
|
+
};
|
|
33
|
+
lastModified: Date;
|
|
34
|
+
filename: string;
|
|
35
|
+
}
|
|
36
|
+
export interface PortfolioIndex {
|
|
37
|
+
byName: Map<string, IndexEntry>;
|
|
38
|
+
byFilename: Map<string, IndexEntry>;
|
|
39
|
+
byType: Map<ElementType, IndexEntry[]>;
|
|
40
|
+
byKeyword: Map<string, IndexEntry[]>;
|
|
41
|
+
byTag: Map<string, IndexEntry[]>;
|
|
42
|
+
byTrigger: Map<string, IndexEntry[]>;
|
|
43
|
+
}
|
|
44
|
+
export interface SearchOptions {
|
|
45
|
+
elementType?: ElementType;
|
|
46
|
+
fuzzyMatch?: boolean;
|
|
47
|
+
maxResults?: number;
|
|
48
|
+
includeKeywords?: boolean;
|
|
49
|
+
includeTags?: boolean;
|
|
50
|
+
includeTriggers?: boolean;
|
|
51
|
+
includeDescriptions?: boolean;
|
|
52
|
+
}
|
|
53
|
+
export interface SearchResult {
|
|
54
|
+
entry: IndexEntry;
|
|
55
|
+
matchType: 'name' | 'filename' | 'keyword' | 'tag' | 'trigger' | 'description';
|
|
56
|
+
score: number;
|
|
57
|
+
}
|
|
58
|
+
export declare class PortfolioIndexManager {
|
|
59
|
+
private static instance;
|
|
60
|
+
private static instanceLock;
|
|
61
|
+
private index;
|
|
62
|
+
private lastBuilt;
|
|
63
|
+
private readonly TTL_MS;
|
|
64
|
+
private isBuilding;
|
|
65
|
+
private buildPromise;
|
|
66
|
+
private constructor();
|
|
67
|
+
static getInstance(): PortfolioIndexManager;
|
|
68
|
+
/**
|
|
69
|
+
* Get the current index, building it if necessary
|
|
70
|
+
*/
|
|
71
|
+
getIndex(): Promise<PortfolioIndex>;
|
|
72
|
+
/**
|
|
73
|
+
* Search the portfolio index by name with fuzzy matching
|
|
74
|
+
*/
|
|
75
|
+
findByName(name: string, options?: SearchOptions): Promise<IndexEntry | null>;
|
|
76
|
+
/**
|
|
77
|
+
* Search the portfolio with comprehensive text search
|
|
78
|
+
*/
|
|
79
|
+
search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Get all elements of a specific type
|
|
82
|
+
*/
|
|
83
|
+
getElementsByType(elementType: ElementType): Promise<IndexEntry[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Get statistics about the index
|
|
86
|
+
*/
|
|
87
|
+
getStats(): Promise<{
|
|
88
|
+
totalElements: number;
|
|
89
|
+
elementsByType: Record<ElementType, number>;
|
|
90
|
+
lastBuilt: Date | null;
|
|
91
|
+
isStale: boolean;
|
|
92
|
+
}>;
|
|
93
|
+
/**
|
|
94
|
+
* Force rebuild the index
|
|
95
|
+
*/
|
|
96
|
+
rebuildIndex(): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Check if the index needs rebuilding
|
|
99
|
+
*/
|
|
100
|
+
private needsRebuild;
|
|
101
|
+
/**
|
|
102
|
+
* Build the index by scanning all portfolio directories
|
|
103
|
+
*/
|
|
104
|
+
private buildIndex;
|
|
105
|
+
/**
|
|
106
|
+
* Perform the actual index building
|
|
107
|
+
*/
|
|
108
|
+
private performBuild;
|
|
109
|
+
/**
|
|
110
|
+
* Create an index entry from a file
|
|
111
|
+
*/
|
|
112
|
+
private createIndexEntry;
|
|
113
|
+
/**
|
|
114
|
+
* Add entry to all relevant index maps
|
|
115
|
+
*/
|
|
116
|
+
private addToIndex;
|
|
117
|
+
/**
|
|
118
|
+
* Find fuzzy matches for a name
|
|
119
|
+
*/
|
|
120
|
+
private findFuzzyMatch;
|
|
121
|
+
/**
|
|
122
|
+
* Calculate similarity between two strings
|
|
123
|
+
*/
|
|
124
|
+
private calculateSimilarity;
|
|
125
|
+
/**
|
|
126
|
+
* Check if any query tokens match the text
|
|
127
|
+
*/
|
|
128
|
+
private matchesQuery;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=PortfolioIndexManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PortfolioIndexManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioIndexManager.ts"],"names":[],"mappings":"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"}
|