@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.
Files changed (272) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +494 -111
  3. package/data/agents/code-reviewer.md +8 -1
  4. package/data/agents/research-assistant.md +8 -1
  5. package/data/agents/task-manager.md +8 -1
  6. package/data/ensembles/business-advisor.md +8 -1
  7. package/data/ensembles/creative-studio.md +8 -1
  8. package/data/ensembles/development-team.md +8 -1
  9. package/data/ensembles/security-analysis-team.md +8 -1
  10. package/data/memories/conversation-history.md +8 -1
  11. package/data/memories/learning-progress.md +8 -1
  12. package/data/memories/project-context.md +8 -1
  13. package/data/personas/business-consultant.md +8 -1
  14. package/data/personas/creative-writer.md +8 -1
  15. package/data/personas/debug-detective.md +8 -1
  16. package/data/personas/eli5-explainer.md +8 -1
  17. package/data/personas/security-analyst.md +8 -1
  18. package/data/personas/technical-analyst.md +8 -1
  19. package/data/skills/code-review.md +8 -1
  20. package/data/skills/creative-writing.md +8 -1
  21. package/data/skills/data-analysis.md +8 -1
  22. package/data/skills/penetration-testing.md +8 -1
  23. package/data/skills/research.md +8 -1
  24. package/data/skills/threat-modeling.md +8 -1
  25. package/data/skills/translation.md +8 -1
  26. package/data/templates/code-documentation.md +8 -1
  27. package/data/templates/email-professional.md +8 -1
  28. package/data/templates/meeting-notes.md +8 -1
  29. package/data/templates/penetration-test-report.md +8 -1
  30. package/data/templates/project-brief.md +8 -1
  31. package/data/templates/report-executive.md +8 -1
  32. package/data/templates/security-vulnerability-report.md +8 -1
  33. package/data/templates/threat-assessment-report.md +8 -1
  34. package/dist/auth/GitHubAuthManager.d.ts +6 -1
  35. package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
  36. package/dist/auth/GitHubAuthManager.js +45 -18
  37. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
  38. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
  39. package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
  40. package/dist/cache/CollectionCache.d.ts.map +1 -1
  41. package/dist/cache/CollectionCache.js +13 -3
  42. package/dist/cache/CollectionIndexCache.d.ts +77 -0
  43. package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
  44. package/dist/cache/CollectionIndexCache.js +349 -0
  45. package/dist/cache/LRUCache.d.ts +93 -0
  46. package/dist/cache/LRUCache.d.ts.map +1 -0
  47. package/dist/cache/LRUCache.js +299 -0
  48. package/dist/cache/index.d.ts +1 -0
  49. package/dist/cache/index.d.ts.map +1 -1
  50. package/dist/cache/index.js +2 -1
  51. package/dist/collection/CollectionBrowser.d.ts +21 -1
  52. package/dist/collection/CollectionBrowser.d.ts.map +1 -1
  53. package/dist/collection/CollectionBrowser.js +130 -10
  54. package/dist/collection/CollectionIndexManager.d.ts +151 -0
  55. package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
  56. package/dist/collection/CollectionIndexManager.js +499 -0
  57. package/dist/collection/CollectionSearch.d.ts +55 -0
  58. package/dist/collection/CollectionSearch.d.ts.map +1 -1
  59. package/dist/collection/CollectionSearch.js +338 -13
  60. package/dist/collection/CollectionSeeder.d.ts.map +1 -1
  61. package/dist/collection/CollectionSeeder.js +38 -1
  62. package/dist/collection/ElementInstaller.d.ts +31 -0
  63. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  64. package/dist/collection/ElementInstaller.js +77 -15
  65. package/dist/collection/PersonaSubmitter.d.ts +1 -1
  66. package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
  67. package/dist/collection/PersonaSubmitter.js +2 -2
  68. package/dist/collection/index.d.ts +1 -0
  69. package/dist/collection/index.d.ts.map +1 -1
  70. package/dist/collection/index.js +2 -1
  71. package/dist/config/ConfigManager.d.ts +78 -0
  72. package/dist/config/ConfigManager.d.ts.map +1 -0
  73. package/dist/config/ConfigManager.js +216 -0
  74. package/dist/config/element-types.d.ts +135 -0
  75. package/dist/config/element-types.d.ts.map +1 -0
  76. package/dist/config/element-types.js +108 -0
  77. package/dist/config/index.d.ts +2 -0
  78. package/dist/config/index.d.ts.map +1 -1
  79. package/dist/config/index.js +3 -1
  80. package/dist/config/portfolio-constants.d.ts +83 -0
  81. package/dist/config/portfolio-constants.d.ts.map +1 -0
  82. package/dist/config/portfolio-constants.js +99 -0
  83. package/dist/elements/BaseElement.d.ts +14 -2
  84. package/dist/elements/BaseElement.d.ts.map +1 -1
  85. package/dist/elements/BaseElement.js +88 -6
  86. package/dist/elements/agents/Agent.d.ts +10 -1
  87. package/dist/elements/agents/Agent.d.ts.map +1 -1
  88. package/dist/elements/agents/Agent.js +66 -19
  89. package/dist/elements/agents/AgentManager.d.ts +2 -0
  90. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  91. package/dist/elements/agents/AgentManager.js +12 -10
  92. package/dist/elements/skills/Skill.d.ts +10 -1
  93. package/dist/elements/skills/Skill.d.ts.map +1 -1
  94. package/dist/elements/skills/Skill.js +40 -3
  95. package/dist/elements/skills/SkillManager.d.ts +1 -0
  96. package/dist/elements/skills/SkillManager.d.ts.map +1 -1
  97. package/dist/elements/skills/SkillManager.js +10 -4
  98. package/dist/elements/templates/Template.d.ts +10 -1
  99. package/dist/elements/templates/Template.d.ts.map +1 -1
  100. package/dist/elements/templates/Template.js +35 -18
  101. package/dist/elements/templates/TemplateManager.d.ts +1 -1
  102. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  103. package/dist/elements/templates/TemplateManager.js +6 -5
  104. package/dist/generated/version.d.ts +2 -2
  105. package/dist/generated/version.js +3 -3
  106. package/dist/index.barrel.d.ts +1 -2
  107. package/dist/index.barrel.d.ts.map +1 -1
  108. package/dist/index.barrel.js +2 -4
  109. package/dist/index.d.ts +143 -25
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +1883 -310
  112. package/dist/persona/PersonaElement.d.ts +10 -0
  113. package/dist/persona/PersonaElement.d.ts.map +1 -1
  114. package/dist/persona/PersonaElement.js +55 -32
  115. package/dist/persona/PersonaElementManager.d.ts.map +1 -1
  116. package/dist/persona/PersonaElementManager.js +13 -11
  117. package/dist/persona/PersonaLoader.d.ts.map +1 -1
  118. package/dist/persona/PersonaLoader.js +8 -2
  119. package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
  120. package/dist/persona/export-import/PersonaImporter.js +24 -5
  121. package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
  122. package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
  123. package/dist/persona/export-import/PersonaSharer.js +198 -22
  124. package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
  125. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  126. package/dist/portfolio/DefaultElementProvider.js +499 -7
  127. package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
  128. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
  129. package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
  130. package/dist/portfolio/MigrationManager.d.ts.map +1 -1
  131. package/dist/portfolio/MigrationManager.js +136 -3
  132. package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
  133. package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
  134. package/dist/portfolio/PortfolioIndexManager.js +478 -0
  135. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  136. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  137. package/dist/portfolio/PortfolioManager.js +61 -20
  138. package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
  139. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
  140. package/dist/portfolio/PortfolioRepoManager.js +337 -0
  141. package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
  142. package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
  143. package/dist/portfolio/UnifiedIndexManager.js +1434 -0
  144. package/dist/portfolio/index.d.ts +15 -0
  145. package/dist/portfolio/index.d.ts.map +1 -0
  146. package/dist/portfolio/index.js +15 -0
  147. package/dist/portfolio/types.d.ts +7 -0
  148. package/dist/portfolio/types.d.ts.map +1 -1
  149. package/dist/portfolio/types.js +6 -1
  150. package/dist/security/InputValidator.d.ts.map +1 -1
  151. package/dist/security/InputValidator.js +50 -48
  152. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
  153. package/dist/security/audit/SecurityAuditor.js +17 -9
  154. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  155. package/dist/security/audit/config/suppressions.js +19 -3
  156. package/dist/security/contentValidator.d.ts +2 -0
  157. package/dist/security/contentValidator.d.ts.map +1 -1
  158. package/dist/security/contentValidator.js +115 -4
  159. package/dist/security/secureYamlParser.d.ts +1 -0
  160. package/dist/security/secureYamlParser.d.ts.map +1 -1
  161. package/dist/security/secureYamlParser.js +29 -7
  162. package/dist/security/securityMonitor.d.ts +1 -1
  163. package/dist/security/securityMonitor.d.ts.map +1 -1
  164. package/dist/security/securityMonitor.js +1 -1
  165. package/dist/security/tokenManager.d.ts +1 -1
  166. package/dist/security/tokenManager.d.ts.map +1 -1
  167. package/dist/security/tokenManager.js +30 -10
  168. package/dist/server/ServerSetup.d.ts +22 -2
  169. package/dist/server/ServerSetup.d.ts.map +1 -1
  170. package/dist/server/ServerSetup.js +77 -12
  171. package/dist/server/tools/AuthTools.d.ts.map +1 -1
  172. package/dist/server/tools/AuthTools.js +33 -1
  173. package/dist/server/tools/BuildInfoTools.d.ts +25 -0
  174. package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
  175. package/dist/server/tools/BuildInfoTools.js +36 -0
  176. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  177. package/dist/server/tools/CollectionTools.js +55 -46
  178. package/dist/server/tools/ConfigTools.d.ts.map +1 -1
  179. package/dist/server/tools/ConfigTools.js +29 -1
  180. package/dist/server/tools/PersonaTools.d.ts +4 -2
  181. package/dist/server/tools/PersonaTools.d.ts.map +1 -1
  182. package/dist/server/tools/PersonaTools.js +5 -152
  183. package/dist/server/tools/PortfolioTools.d.ts +12 -0
  184. package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
  185. package/dist/server/tools/PortfolioTools.js +221 -0
  186. package/dist/server/tools/index.d.ts +3 -1
  187. package/dist/server/tools/index.d.ts.map +1 -1
  188. package/dist/server/tools/index.js +4 -2
  189. package/dist/server/types.d.ts +40 -5
  190. package/dist/server/types.d.ts.map +1 -1
  191. package/dist/server/types.js +1 -1
  192. package/dist/services/BuildInfoService.d.ts +84 -0
  193. package/dist/services/BuildInfoService.d.ts.map +1 -0
  194. package/dist/services/BuildInfoService.js +271 -0
  195. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
  196. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
  197. package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
  198. package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
  199. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
  200. package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
  201. package/dist/tools/portfolio/types.d.ts +41 -0
  202. package/dist/tools/portfolio/types.d.ts.map +1 -0
  203. package/dist/tools/portfolio/types.js +15 -0
  204. package/dist/types/collection.d.ts +51 -0
  205. package/dist/types/collection.d.ts.map +1 -1
  206. package/dist/types/collection.js +1 -1
  207. package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
  208. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
  209. package/dist/utils/EarlyTerminationSearch.js +164 -0
  210. package/dist/utils/ErrorHandler.d.ts +86 -0
  211. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  212. package/dist/utils/ErrorHandler.js +201 -0
  213. package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
  214. package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
  215. package/dist/utils/FileDiscoveryUtil.js +169 -0
  216. package/dist/utils/GitHubRateLimiter.d.ts +88 -0
  217. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
  218. package/dist/utils/GitHubRateLimiter.js +315 -0
  219. package/dist/utils/PerformanceMonitor.d.ts +134 -0
  220. package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
  221. package/dist/utils/PerformanceMonitor.js +347 -0
  222. package/dist/utils/RateLimiter.d.ts.map +1 -0
  223. package/dist/utils/RateLimiter.js +172 -0
  224. package/dist/utils/SecureDownloader.d.ts +241 -0
  225. package/dist/utils/SecureDownloader.d.ts.map +1 -0
  226. package/dist/utils/SecureDownloader.js +759 -0
  227. package/dist/utils/ToolCache.d.ts +82 -0
  228. package/dist/utils/ToolCache.d.ts.map +1 -0
  229. package/dist/utils/ToolCache.js +196 -0
  230. package/dist/utils/errorCodes.d.ts +136 -0
  231. package/dist/utils/errorCodes.d.ts.map +1 -0
  232. package/dist/utils/errorCodes.js +87 -0
  233. package/dist/utils/index.d.ts +3 -0
  234. package/dist/utils/index.d.ts.map +1 -1
  235. package/dist/utils/index.js +4 -1
  236. package/dist/utils/installation.d.ts +1 -1
  237. package/dist/utils/installation.d.ts.map +1 -1
  238. package/dist/utils/installation.js +9 -8
  239. package/dist/utils/searchUtils.d.ts +31 -0
  240. package/dist/utils/searchUtils.d.ts.map +1 -1
  241. package/dist/utils/searchUtils.js +62 -1
  242. package/package.json +17 -7
  243. package/dist/config/updateConfig.d.ts +0 -84
  244. package/dist/config/updateConfig.d.ts.map +0 -1
  245. package/dist/config/updateConfig.js +0 -148
  246. package/dist/server/tools/UpdateTools.d.ts +0 -10
  247. package/dist/server/tools/UpdateTools.d.ts.map +0 -1
  248. package/dist/server/tools/UpdateTools.js +0 -85
  249. package/dist/update/BackupManager.d.ts +0 -63
  250. package/dist/update/BackupManager.d.ts.map +0 -1
  251. package/dist/update/BackupManager.js +0 -370
  252. package/dist/update/DependencyChecker.d.ts +0 -41
  253. package/dist/update/DependencyChecker.d.ts.map +0 -1
  254. package/dist/update/DependencyChecker.js +0 -132
  255. package/dist/update/RateLimiter.d.ts.map +0 -1
  256. package/dist/update/RateLimiter.js +0 -172
  257. package/dist/update/SignatureVerifier.d.ts +0 -71
  258. package/dist/update/SignatureVerifier.d.ts.map +0 -1
  259. package/dist/update/SignatureVerifier.js +0 -214
  260. package/dist/update/UpdateChecker.d.ts +0 -132
  261. package/dist/update/UpdateChecker.d.ts.map +0 -1
  262. package/dist/update/UpdateChecker.js +0 -506
  263. package/dist/update/UpdateManager.d.ts +0 -60
  264. package/dist/update/UpdateManager.d.ts.map +0 -1
  265. package/dist/update/UpdateManager.js +0 -730
  266. package/dist/update/VersionManager.d.ts +0 -31
  267. package/dist/update/VersionManager.d.ts.map +0 -1
  268. package/dist/update/VersionManager.js +0 -181
  269. package/dist/update/index.d.ts +0 -9
  270. package/dist/update/index.d.ts.map +0 -1
  271. package/dist/update/index.js +0 -9
  272. /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
- // Write to new location
116
- await fs.writeFile(newPath, normalizedContent, 'utf-8');
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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"}