@dollhousemcp/mcp-server 1.5.1 → 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 (274) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +497 -110
  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 +65 -0
  41. package/dist/cache/CollectionCache.d.ts.map +1 -0
  42. package/dist/cache/CollectionCache.js +172 -0
  43. package/dist/cache/CollectionIndexCache.d.ts +77 -0
  44. package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
  45. package/dist/cache/CollectionIndexCache.js +349 -0
  46. package/dist/cache/LRUCache.d.ts +93 -0
  47. package/dist/cache/LRUCache.d.ts.map +1 -0
  48. package/dist/cache/LRUCache.js +299 -0
  49. package/dist/cache/index.d.ts +2 -0
  50. package/dist/cache/index.d.ts.map +1 -1
  51. package/dist/cache/index.js +3 -1
  52. package/dist/collection/CollectionBrowser.d.ts +44 -1
  53. package/dist/collection/CollectionBrowser.d.ts.map +1 -1
  54. package/dist/collection/CollectionBrowser.js +260 -28
  55. package/dist/collection/CollectionIndexManager.d.ts +151 -0
  56. package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
  57. package/dist/collection/CollectionIndexManager.js +499 -0
  58. package/dist/collection/CollectionSearch.d.ts +75 -1
  59. package/dist/collection/CollectionSearch.d.ts.map +1 -1
  60. package/dist/collection/CollectionSearch.js +435 -6
  61. package/dist/collection/CollectionSeeder.d.ts +36 -0
  62. package/dist/collection/CollectionSeeder.d.ts.map +1 -0
  63. package/dist/collection/CollectionSeeder.js +267 -0
  64. package/dist/collection/ElementInstaller.d.ts +31 -0
  65. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  66. package/dist/collection/ElementInstaller.js +77 -15
  67. package/dist/collection/PersonaSubmitter.d.ts +48 -1
  68. package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
  69. package/dist/collection/PersonaSubmitter.js +170 -34
  70. package/dist/collection/index.d.ts +2 -0
  71. package/dist/collection/index.d.ts.map +1 -1
  72. package/dist/collection/index.js +3 -1
  73. package/dist/config/ConfigManager.d.ts +78 -0
  74. package/dist/config/ConfigManager.d.ts.map +1 -0
  75. package/dist/config/ConfigManager.js +216 -0
  76. package/dist/config/element-types.d.ts +135 -0
  77. package/dist/config/element-types.d.ts.map +1 -0
  78. package/dist/config/element-types.js +108 -0
  79. package/dist/config/index.d.ts +2 -0
  80. package/dist/config/index.d.ts.map +1 -1
  81. package/dist/config/index.js +3 -1
  82. package/dist/config/portfolio-constants.d.ts +83 -0
  83. package/dist/config/portfolio-constants.d.ts.map +1 -0
  84. package/dist/config/portfolio-constants.js +99 -0
  85. package/dist/elements/BaseElement.d.ts +14 -2
  86. package/dist/elements/BaseElement.d.ts.map +1 -1
  87. package/dist/elements/BaseElement.js +88 -6
  88. package/dist/elements/agents/Agent.d.ts +10 -1
  89. package/dist/elements/agents/Agent.d.ts.map +1 -1
  90. package/dist/elements/agents/Agent.js +66 -19
  91. package/dist/elements/agents/AgentManager.d.ts +2 -0
  92. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  93. package/dist/elements/agents/AgentManager.js +12 -10
  94. package/dist/elements/skills/Skill.d.ts +10 -1
  95. package/dist/elements/skills/Skill.d.ts.map +1 -1
  96. package/dist/elements/skills/Skill.js +40 -3
  97. package/dist/elements/skills/SkillManager.d.ts +1 -0
  98. package/dist/elements/skills/SkillManager.d.ts.map +1 -1
  99. package/dist/elements/skills/SkillManager.js +10 -4
  100. package/dist/elements/templates/Template.d.ts +10 -1
  101. package/dist/elements/templates/Template.d.ts.map +1 -1
  102. package/dist/elements/templates/Template.js +35 -18
  103. package/dist/elements/templates/TemplateManager.d.ts +1 -1
  104. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  105. package/dist/elements/templates/TemplateManager.js +6 -5
  106. package/dist/generated/version.d.ts +2 -2
  107. package/dist/generated/version.js +3 -3
  108. package/dist/index.barrel.d.ts +1 -2
  109. package/dist/index.barrel.d.ts.map +1 -1
  110. package/dist/index.barrel.js +2 -4
  111. package/dist/index.d.ts +154 -25
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +1951 -264
  114. package/dist/persona/PersonaElement.d.ts +10 -0
  115. package/dist/persona/PersonaElement.d.ts.map +1 -1
  116. package/dist/persona/PersonaElement.js +55 -32
  117. package/dist/persona/PersonaElementManager.d.ts.map +1 -1
  118. package/dist/persona/PersonaElementManager.js +13 -11
  119. package/dist/persona/PersonaLoader.d.ts.map +1 -1
  120. package/dist/persona/PersonaLoader.js +8 -2
  121. package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
  122. package/dist/persona/export-import/PersonaImporter.js +24 -5
  123. package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
  124. package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
  125. package/dist/persona/export-import/PersonaSharer.js +198 -22
  126. package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
  127. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  128. package/dist/portfolio/DefaultElementProvider.js +499 -7
  129. package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
  130. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
  131. package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
  132. package/dist/portfolio/MigrationManager.d.ts.map +1 -1
  133. package/dist/portfolio/MigrationManager.js +136 -3
  134. package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
  135. package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
  136. package/dist/portfolio/PortfolioIndexManager.js +478 -0
  137. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  138. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  139. package/dist/portfolio/PortfolioManager.js +61 -20
  140. package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
  141. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
  142. package/dist/portfolio/PortfolioRepoManager.js +337 -0
  143. package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
  144. package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
  145. package/dist/portfolio/UnifiedIndexManager.js +1434 -0
  146. package/dist/portfolio/index.d.ts +15 -0
  147. package/dist/portfolio/index.d.ts.map +1 -0
  148. package/dist/portfolio/index.js +15 -0
  149. package/dist/portfolio/types.d.ts +7 -0
  150. package/dist/portfolio/types.d.ts.map +1 -1
  151. package/dist/portfolio/types.js +6 -1
  152. package/dist/security/InputValidator.d.ts.map +1 -1
  153. package/dist/security/InputValidator.js +50 -48
  154. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
  155. package/dist/security/audit/SecurityAuditor.js +17 -9
  156. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  157. package/dist/security/audit/config/suppressions.js +19 -3
  158. package/dist/security/contentValidator.d.ts +2 -0
  159. package/dist/security/contentValidator.d.ts.map +1 -1
  160. package/dist/security/contentValidator.js +115 -4
  161. package/dist/security/secureYamlParser.d.ts +1 -0
  162. package/dist/security/secureYamlParser.d.ts.map +1 -1
  163. package/dist/security/secureYamlParser.js +29 -7
  164. package/dist/security/securityMonitor.d.ts +1 -1
  165. package/dist/security/securityMonitor.d.ts.map +1 -1
  166. package/dist/security/securityMonitor.js +1 -1
  167. package/dist/security/tokenManager.d.ts +1 -1
  168. package/dist/security/tokenManager.d.ts.map +1 -1
  169. package/dist/security/tokenManager.js +30 -10
  170. package/dist/server/ServerSetup.d.ts +22 -2
  171. package/dist/server/ServerSetup.d.ts.map +1 -1
  172. package/dist/server/ServerSetup.js +77 -12
  173. package/dist/server/tools/AuthTools.d.ts.map +1 -1
  174. package/dist/server/tools/AuthTools.js +33 -1
  175. package/dist/server/tools/BuildInfoTools.d.ts +25 -0
  176. package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
  177. package/dist/server/tools/BuildInfoTools.js +36 -0
  178. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  179. package/dist/server/tools/CollectionTools.js +62 -42
  180. package/dist/server/tools/ConfigTools.d.ts.map +1 -1
  181. package/dist/server/tools/ConfigTools.js +29 -1
  182. package/dist/server/tools/PersonaTools.d.ts +4 -2
  183. package/dist/server/tools/PersonaTools.d.ts.map +1 -1
  184. package/dist/server/tools/PersonaTools.js +5 -152
  185. package/dist/server/tools/PortfolioTools.d.ts +12 -0
  186. package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
  187. package/dist/server/tools/PortfolioTools.js +221 -0
  188. package/dist/server/tools/index.d.ts +3 -1
  189. package/dist/server/tools/index.d.ts.map +1 -1
  190. package/dist/server/tools/index.js +4 -2
  191. package/dist/server/types.d.ts +41 -5
  192. package/dist/server/types.d.ts.map +1 -1
  193. package/dist/server/types.js +1 -1
  194. package/dist/services/BuildInfoService.d.ts +84 -0
  195. package/dist/services/BuildInfoService.d.ts.map +1 -0
  196. package/dist/services/BuildInfoService.js +271 -0
  197. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
  198. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
  199. package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
  200. package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
  201. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
  202. package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
  203. package/dist/tools/portfolio/types.d.ts +41 -0
  204. package/dist/tools/portfolio/types.d.ts.map +1 -0
  205. package/dist/tools/portfolio/types.js +15 -0
  206. package/dist/types/collection.d.ts +51 -0
  207. package/dist/types/collection.d.ts.map +1 -1
  208. package/dist/types/collection.js +1 -1
  209. package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
  210. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
  211. package/dist/utils/EarlyTerminationSearch.js +164 -0
  212. package/dist/utils/ErrorHandler.d.ts +86 -0
  213. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  214. package/dist/utils/ErrorHandler.js +201 -0
  215. package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
  216. package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
  217. package/dist/utils/FileDiscoveryUtil.js +169 -0
  218. package/dist/utils/GitHubRateLimiter.d.ts +88 -0
  219. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
  220. package/dist/utils/GitHubRateLimiter.js +315 -0
  221. package/dist/utils/PerformanceMonitor.d.ts +134 -0
  222. package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
  223. package/dist/utils/PerformanceMonitor.js +347 -0
  224. package/dist/utils/RateLimiter.d.ts.map +1 -0
  225. package/dist/utils/RateLimiter.js +172 -0
  226. package/dist/utils/SecureDownloader.d.ts +241 -0
  227. package/dist/utils/SecureDownloader.d.ts.map +1 -0
  228. package/dist/utils/SecureDownloader.js +759 -0
  229. package/dist/utils/ToolCache.d.ts +82 -0
  230. package/dist/utils/ToolCache.d.ts.map +1 -0
  231. package/dist/utils/ToolCache.js +196 -0
  232. package/dist/utils/errorCodes.d.ts +136 -0
  233. package/dist/utils/errorCodes.d.ts.map +1 -0
  234. package/dist/utils/errorCodes.js +87 -0
  235. package/dist/utils/index.d.ts +3 -0
  236. package/dist/utils/index.d.ts.map +1 -1
  237. package/dist/utils/index.js +4 -1
  238. package/dist/utils/installation.d.ts +1 -1
  239. package/dist/utils/installation.d.ts.map +1 -1
  240. package/dist/utils/installation.js +9 -8
  241. package/dist/utils/searchUtils.d.ts +54 -0
  242. package/dist/utils/searchUtils.d.ts.map +1 -0
  243. package/dist/utils/searchUtils.js +118 -0
  244. package/package.json +17 -7
  245. package/dist/config/updateConfig.d.ts +0 -84
  246. package/dist/config/updateConfig.d.ts.map +0 -1
  247. package/dist/config/updateConfig.js +0 -148
  248. package/dist/server/tools/UpdateTools.d.ts +0 -10
  249. package/dist/server/tools/UpdateTools.d.ts.map +0 -1
  250. package/dist/server/tools/UpdateTools.js +0 -85
  251. package/dist/update/BackupManager.d.ts +0 -63
  252. package/dist/update/BackupManager.d.ts.map +0 -1
  253. package/dist/update/BackupManager.js +0 -370
  254. package/dist/update/DependencyChecker.d.ts +0 -41
  255. package/dist/update/DependencyChecker.d.ts.map +0 -1
  256. package/dist/update/DependencyChecker.js +0 -132
  257. package/dist/update/RateLimiter.d.ts.map +0 -1
  258. package/dist/update/RateLimiter.js +0 -172
  259. package/dist/update/SignatureVerifier.d.ts +0 -71
  260. package/dist/update/SignatureVerifier.d.ts.map +0 -1
  261. package/dist/update/SignatureVerifier.js +0 -214
  262. package/dist/update/UpdateChecker.d.ts +0 -132
  263. package/dist/update/UpdateChecker.d.ts.map +0 -1
  264. package/dist/update/UpdateChecker.js +0 -506
  265. package/dist/update/UpdateManager.d.ts +0 -60
  266. package/dist/update/UpdateManager.d.ts.map +0 -1
  267. package/dist/update/UpdateManager.js +0 -730
  268. package/dist/update/VersionManager.d.ts +0 -31
  269. package/dist/update/VersionManager.d.ts.map +0 -1
  270. package/dist/update/VersionManager.js +0 -181
  271. package/dist/update/index.d.ts +0 -9
  272. package/dist/update/index.d.ts.map +0 -1
  273. package/dist/update/index.js +0 -9
  274. /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
@@ -6,13 +6,10 @@ import * as fs from 'fs';
6
6
  import * as path from 'path';
7
7
  import { fileURLToPath } from 'url';
8
8
  import { logger } from './logger.js';
9
- import { UpdateConfigManager } from '../config/updateConfig.js';
10
9
  export class InstallationDetector {
11
10
  static cachedType = null;
12
11
  // Maximum directory levels to search upward for .git directory
13
- static get MAX_SEARCH_DEPTH() {
14
- return UpdateConfigManager.getInstance().getMaxSearchDepth();
15
- }
12
+ static MAX_SEARCH_DEPTH = 10;
16
13
  /**
17
14
  * Detect the installation type (npm global, git clone, or unknown)
18
15
  */
@@ -36,8 +33,10 @@ export class InstallationDetector {
36
33
  }
37
34
  // Check if we're in a node_modules directory (npm installation)
38
35
  // Use path separator to ensure we match the exact package name
39
- const npmPattern = path.sep + path.join('node_modules', '@dollhousemcp', 'mcp-server') + path.sep;
40
- if (currentDir.includes(npmPattern)) {
36
+ // Normalize the path to handle both Windows and Unix separators
37
+ const normalizedCurrentDir = path.normalize(currentDir);
38
+ const npmPattern = path.normalize(path.join('node_modules', '@dollhousemcp', 'mcp-server'));
39
+ if (normalizedCurrentDir.includes(npmPattern)) {
41
40
  logger.debug('[InstallationDetector] Detected npm installation');
42
41
  this.cachedType = 'npm';
43
42
  return 'npm';
@@ -86,7 +85,9 @@ export class InstallationDetector {
86
85
  const currentFilePath = fileURLToPath(currentFileUrl);
87
86
  let currentDir = path.dirname(currentFilePath);
88
87
  // Find the root of the npm package
89
- while (currentDir.includes('node_modules/@dollhousemcp/mcp-server')) {
88
+ // Normalize paths to handle Windows and Unix separators
89
+ const npmPackagePattern = path.normalize('node_modules/@dollhousemcp/mcp-server');
90
+ while (path.normalize(currentDir).includes(npmPackagePattern)) {
90
91
  const packageJsonPath = path.join(currentDir, 'package.json');
91
92
  if (fs.existsSync(packageJsonPath)) {
92
93
  return currentDir;
@@ -157,4 +158,4 @@ export class InstallationDetector {
157
158
  this.cachedType = null;
158
159
  }
159
160
  }
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2luc3RhbGxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJaEUsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQUMsVUFBVSxHQUE0QixJQUFJLENBQUM7SUFFMUQsK0RBQStEO0lBQ3ZELE1BQU0sS0FBSyxnQkFBZ0I7UUFDakMsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxtQkFBbUI7UUFDeEIsb0NBQW9DO1FBQ3BDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILCtDQUErQztZQUMvQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN2QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUUvQyx3Q0FBd0M7WUFDeEMsSUFBSSxDQUFDO2dCQUNILFVBQVUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLENBQUM7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Q0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNDLElBQUksU0FBUyxLQUFLLFVBQVU7b0JBQUUsTUFBTTtnQkFDcEMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDJEQUEyRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQywwQkFBMEI7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFeEMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssS0FBSztnQkFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxPQUFPO29CQUNaLENBQUMsQ0FBQyw4QkFBOEIsT0FBTyxFQUFFO29CQUN6QyxDQUFDLENBQUMseUJBQXlCLENBQUM7WUFFaEMsS0FBSyxLQUFLO2dCQUNSLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLE9BQU87b0JBQ1osQ0FBQyxDQUFDLHVCQUF1QixPQUFPLEVBQUU7b0JBQ2xDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztZQUV6QjtnQkFDRSxPQUFPLDJCQUEyQixDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsVUFBVTtRQUNmLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluc3RhbGxhdGlvbiBkZXRlY3Rpb24gdXRpbGl0aWVzXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgZnJvbSBucG0gb3IgZ2l0IGluc3RhbGxhdGlvblxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVwZGF0ZUNvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi9jb25maWcvdXBkYXRlQ29uZmlnLmpzJztcblxuZXhwb3J0IHR5cGUgSW5zdGFsbGF0aW9uVHlwZSA9ICducG0nIHwgJ2dpdCcgfCAndW5rbm93bic7XG5cbmV4cG9ydCBjbGFzcyBJbnN0YWxsYXRpb25EZXRlY3RvciB7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlZFR5cGU6IEluc3RhbGxhdGlvblR5cGUgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIE1heGltdW0gZGlyZWN0b3J5IGxldmVscyB0byBzZWFyY2ggdXB3YXJkIGZvciAuZ2l0IGRpcmVjdG9yeVxuICBwcml2YXRlIHN0YXRpYyBnZXQgTUFYX1NFQVJDSF9ERVBUSCgpOiBudW1iZXIge1xuICAgIHJldHVybiBVcGRhdGVDb25maWdNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TWF4U2VhcmNoRGVwdGgoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVjdCB0aGUgaW5zdGFsbGF0aW9uIHR5cGUgKG5wbSBnbG9iYWwsIGdpdCBjbG9uZSwgb3IgdW5rbm93bilcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YWxsYXRpb25UeXBlKCk6IEluc3RhbGxhdGlvblR5cGUge1xuICAgIC8vIFJldHVybiBjYWNoZWQgcmVzdWx0IGlmIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLmNhY2hlZFR5cGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZFR5cGU7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGlzIGZpbGUgaXMgbG9jYXRlZFxuICAgICAgY29uc3QgY3VycmVudEZpbGVVcmwgPSBpbXBvcnQubWV0YS51cmw7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVBhdGggPSBmaWxlVVJMVG9QYXRoKGN1cnJlbnRGaWxlVXJsKTtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFJlc29sdmUgc3ltbGlua3MgdG8gZ2V0IHRoZSByZWFsIHBhdGhcbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJlbnREaXIgPSBmcy5yZWFscGF0aFN5bmMoY3VycmVudERpcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiByZWFscGF0aCBmYWlscywgY29udGludWUgd2l0aCBvcmlnaW5hbCBwYXRoXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW0luc3RhbGxhdGlvbkRldGVjdG9yXSBDb3VsZCBub3QgcmVzb2x2ZSByZWFsIHBhdGgsIHVzaW5nIG9yaWdpbmFsJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGEgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSAobnBtIGluc3RhbGxhdGlvbilcbiAgICAgIC8vIFVzZSBwYXRoIHNlcGFyYXRvciB0byBlbnN1cmUgd2UgbWF0Y2ggdGhlIGV4YWN0IHBhY2thZ2UgbmFtZVxuICAgICAgY29uc3QgbnBtUGF0dGVybiA9IHBhdGguc2VwICsgcGF0aC5qb2luKCdub2RlX21vZHVsZXMnLCAnQGRvbGxob3VzZW1jcCcsICdtY3Atc2VydmVyJykgKyBwYXRoLnNlcDtcbiAgICAgIGlmIChjdXJyZW50RGlyLmluY2x1ZGVzKG5wbVBhdHRlcm4pKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW0luc3RhbGxhdGlvbkRldGVjdG9yXSBEZXRlY3RlZCBucG0gaW5zdGFsbGF0aW9uJyk7XG4gICAgICAgIHRoaXMuY2FjaGVkVHlwZSA9ICducG0nO1xuICAgICAgICByZXR1cm4gJ25wbSc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciAuZ2l0IGRpcmVjdG9yeSAoZ2l0IGluc3RhbGxhdGlvbilcbiAgICAgIC8vIFNlYXJjaCB1cCBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5XG4gICAgICBsZXQgc2VhcmNoRGlyID0gY3VycmVudERpcjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5NQVhfU0VBUkNIX0RFUFRIOyBpKyspIHtcbiAgICAgICAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKHNlYXJjaERpciwgJy5naXQnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhnaXREaXIpICYmIGZzLnN0YXRTeW5jKGdpdERpcikuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIERldGVjdGVkIGdpdCBpbnN0YWxsYXRpb24nKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVkVHlwZSA9ICdnaXQnO1xuICAgICAgICAgICAgcmV0dXJuICdnaXQnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGFuZCBjb250aW51ZSBzZWFyY2hpbmdcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5kaXJuYW1lKHNlYXJjaERpcik7XG4gICAgICAgIGlmIChwYXJlbnREaXIgPT09IHNlYXJjaERpcikge1xuICAgICAgICAgIC8vIFJlYWNoZWQgcm9vdCBkaXJlY3RvcnlcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzZWFyY2hEaXIgPSBwYXJlbnREaXI7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci53YXJuKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIENvdWxkIG5vdCBkZXRlcm1pbmUgaW5zdGFsbGF0aW9uIHR5cGUnKTtcbiAgICAgIHRoaXMuY2FjaGVkVHlwZSA9ICd1bmtub3duJztcbiAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW0luc3RhbGxhdGlvbkRldGVjdG9yXSBFcnJvciBkZXRlY3RpbmcgaW5zdGFsbGF0aW9uIHR5cGU6JywgZXJyb3IpO1xuICAgICAgdGhpcy5jYWNoZWRUeXBlID0gJ3Vua25vd24nO1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5wbSBnbG9iYWwgaW5zdGFsbGF0aW9uIHBhdGggaWYgcnVubmluZyBmcm9tIG5wbVxuICAgKi9cbiAgc3RhdGljIGdldE5wbUdsb2JhbFBhdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZ2V0SW5zdGFsbGF0aW9uVHlwZSgpICE9PSAnbnBtJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVVybCA9IGltcG9ydC5tZXRhLnVybDtcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGZpbGVVUkxUb1BhdGgoY3VycmVudEZpbGVVcmwpO1xuICAgICAgbGV0IGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudEZpbGVQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gRmluZCB0aGUgcm9vdCBvZiB0aGUgbnBtIHBhY2thZ2VcbiAgICAgIHdoaWxlIChjdXJyZW50RGlyLmluY2x1ZGVzKCdub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJykpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgICAgaWYgKHBhcmVudERpciA9PT0gY3VycmVudERpcikgYnJlYWs7XG4gICAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW0luc3RhbGxhdGlvbkRldGVjdG9yXSBFcnJvciBmaW5kaW5nIG5wbSBnbG9iYWwgcGF0aDonLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBnaXQgcmVwb3NpdG9yeSByb290IHBhdGggaWYgcnVubmluZyBmcm9tIGdpdFxuICAgKi9cbiAgc3RhdGljIGdldEdpdFJlcG9zaXRvcnlQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmdldEluc3RhbGxhdGlvblR5cGUoKSAhPT0gJ2dpdCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudEZpbGVVcmwgPSBpbXBvcnQubWV0YS51cmw7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVBhdGggPSBmaWxlVVJMVG9QYXRoKGN1cnJlbnRGaWxlVXJsKTtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNlYXJjaCB1cCBmb3IgLmdpdCBkaXJlY3RvcnlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgJy5naXQnKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZ2l0RGlyKSAmJiBmcy5zdGF0U3luYyhnaXREaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhaztcbiAgICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIEVycm9yIGZpbmRpbmcgZ2l0IHJlcG9zaXRvcnkgcGF0aDonLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGluc3RhbGxhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbGxhdGlvbkRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0SW5zdGFsbGF0aW9uVHlwZSgpO1xuICAgIFxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbnBtJzpcbiAgICAgICAgY29uc3QgbnBtUGF0aCA9IHRoaXMuZ2V0TnBtR2xvYmFsUGF0aCgpO1xuICAgICAgICByZXR1cm4gbnBtUGF0aCBcbiAgICAgICAgICA/IGBucG0gZ2xvYmFsIGluc3RhbGxhdGlvbiBhdCAke25wbVBhdGh9YFxuICAgICAgICAgIDogJ25wbSBnbG9iYWwgaW5zdGFsbGF0aW9uJztcbiAgICAgICAgICBcbiAgICAgIGNhc2UgJ2dpdCc6XG4gICAgICAgIGNvbnN0IGdpdFBhdGggPSB0aGlzLmdldEdpdFJlcG9zaXRvcnlQYXRoKCk7XG4gICAgICAgIHJldHVybiBnaXRQYXRoXG4gICAgICAgICAgPyBgZ2l0IGluc3RhbGxhdGlvbiBhdCAke2dpdFBhdGh9YFxuICAgICAgICAgIDogJ2dpdCBpbnN0YWxsYXRpb24nO1xuICAgICAgICAgIFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd1bmtub3duIGluc3RhbGxhdGlvbiB0eXBlJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGVkIGluc3RhbGxhdGlvbiB0eXBlIChtYWlubHkgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBzdGF0aWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlZFR5cGUgPSBudWxsO1xuICB9XG59Il19
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2luc3RhbGxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJckMsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQUMsVUFBVSxHQUE0QixJQUFJLENBQUM7SUFFMUQsK0RBQStEO0lBQ3ZELE1BQU0sQ0FBVSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFFOUM7O09BRUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CO1FBQ3hCLG9DQUFvQztRQUNwQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCwrQ0FBK0M7WUFDL0MsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFL0Msd0NBQXdDO1lBQ3hDLElBQUksQ0FBQztnQkFDSCxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixpREFBaUQ7Z0JBQ2pELE1BQU0sQ0FBQyxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztZQUNyRixDQUFDO1lBRUQsZ0VBQWdFO1lBQ2hFLCtEQUErRDtZQUMvRCxnRUFBZ0U7WUFDaEUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDNUYsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsOENBQThDO1lBQzlDLG1DQUFtQztZQUNuQyxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDO29CQUNILElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7d0JBQy9ELE1BQU0sQ0FBQyxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQzt3QkFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7d0JBQ3hCLE9BQU8sS0FBSyxDQUFDO29CQUNmLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLHVDQUF1QztnQkFDekMsQ0FBQztnQkFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDNUIseUJBQXlCO29CQUN6QixNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN4QixDQUFDO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQjtRQUNyQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3ZDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN0RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRS9DLG1DQUFtQztZQUNuQyx3REFBd0Q7WUFDeEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDbEYsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzlELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsT0FBTyxVQUFVLENBQUM7Z0JBQ3BCLENBQUM7Z0JBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxTQUFTLEtBQUssVUFBVTtvQkFBRSxNQUFNO2dCQUNwQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsdURBQXVELEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLG9CQUFvQjtRQUN6QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3ZDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN0RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRS9DLCtCQUErQjtZQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO29CQUMvRCxPQUFPLFVBQVUsQ0FBQztnQkFDcEIsQ0FBQztnQkFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLFNBQVMsS0FBSyxVQUFVO29CQUFFLE1BQU07Z0JBQ3BDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsMEJBQTBCO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRXhDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDYixLQUFLLEtBQUs7Z0JBQ1IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sT0FBTztvQkFDWixDQUFDLENBQUMsOEJBQThCLE9BQU8sRUFBRTtvQkFDekMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO1lBRWhDLEtBQUssS0FBSztnQkFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxPQUFPO29CQUNaLENBQUMsQ0FBQyx1QkFBdUIsT0FBTyxFQUFFO29CQUNsQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7WUFFekI7Z0JBQ0UsT0FBTywyQkFBMkIsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFVBQVU7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnN0YWxsYXRpb24gZGV0ZWN0aW9uIHV0aWxpdGllc1xuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGZyb20gbnBtIG9yIGdpdCBpbnN0YWxsYXRpb25cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCB0eXBlIEluc3RhbGxhdGlvblR5cGUgPSAnbnBtJyB8ICdnaXQnIHwgJ3Vua25vd24nO1xuXG5leHBvcnQgY2xhc3MgSW5zdGFsbGF0aW9uRGV0ZWN0b3Ige1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZWRUeXBlOiBJbnN0YWxsYXRpb25UeXBlIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvLyBNYXhpbXVtIGRpcmVjdG9yeSBsZXZlbHMgdG8gc2VhcmNoIHVwd2FyZCBmb3IgLmdpdCBkaXJlY3RvcnlcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1NFQVJDSF9ERVBUSCA9IDEwO1xuICBcbiAgLyoqXG4gICAqIERldGVjdCB0aGUgaW5zdGFsbGF0aW9uIHR5cGUgKG5wbSBnbG9iYWwsIGdpdCBjbG9uZSwgb3IgdW5rbm93bilcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YWxsYXRpb25UeXBlKCk6IEluc3RhbGxhdGlvblR5cGUge1xuICAgIC8vIFJldHVybiBjYWNoZWQgcmVzdWx0IGlmIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLmNhY2hlZFR5cGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZFR5cGU7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGlzIGZpbGUgaXMgbG9jYXRlZFxuICAgICAgY29uc3QgY3VycmVudEZpbGVVcmwgPSBpbXBvcnQubWV0YS51cmw7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVBhdGggPSBmaWxlVVJMVG9QYXRoKGN1cnJlbnRGaWxlVXJsKTtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFJlc29sdmUgc3ltbGlua3MgdG8gZ2V0IHRoZSByZWFsIHBhdGhcbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJlbnREaXIgPSBmcy5yZWFscGF0aFN5bmMoY3VycmVudERpcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiByZWFscGF0aCBmYWlscywgY29udGludWUgd2l0aCBvcmlnaW5hbCBwYXRoXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW0luc3RhbGxhdGlvbkRldGVjdG9yXSBDb3VsZCBub3QgcmVzb2x2ZSByZWFsIHBhdGgsIHVzaW5nIG9yaWdpbmFsJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGEgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSAobnBtIGluc3RhbGxhdGlvbilcbiAgICAgIC8vIFVzZSBwYXRoIHNlcGFyYXRvciB0byBlbnN1cmUgd2UgbWF0Y2ggdGhlIGV4YWN0IHBhY2thZ2UgbmFtZVxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIHRvIGhhbmRsZSBib3RoIFdpbmRvd3MgYW5kIFVuaXggc2VwYXJhdG9yc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEN1cnJlbnREaXIgPSBwYXRoLm5vcm1hbGl6ZShjdXJyZW50RGlyKTtcbiAgICAgIGNvbnN0IG5wbVBhdHRlcm4gPSBwYXRoLm5vcm1hbGl6ZShwYXRoLmpvaW4oJ25vZGVfbW9kdWxlcycsICdAZG9sbGhvdXNlbWNwJywgJ21jcC1zZXJ2ZXInKSk7XG4gICAgICBpZiAobm9ybWFsaXplZEN1cnJlbnREaXIuaW5jbHVkZXMobnBtUGF0dGVybikpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIERldGVjdGVkIG5wbSBpbnN0YWxsYXRpb24nKTtcbiAgICAgICAgdGhpcy5jYWNoZWRUeXBlID0gJ25wbSc7XG4gICAgICAgIHJldHVybiAnbnBtJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIC5naXQgZGlyZWN0b3J5IChnaXQgaW5zdGFsbGF0aW9uKVxuICAgICAgLy8gU2VhcmNoIHVwIGZyb20gY3VycmVudCBkaXJlY3RvcnlcbiAgICAgIGxldCBzZWFyY2hEaXIgPSBjdXJyZW50RGlyO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLk1BWF9TRUFSQ0hfREVQVEg7IGkrKykge1xuICAgICAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4oc2VhcmNoRGlyLCAnLmdpdCcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGdpdERpcikgJiYgZnMuc3RhdFN5bmMoZ2l0RGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1tJbnN0YWxsYXRpb25EZXRlY3Rvcl0gRGV0ZWN0ZWQgZ2l0IGluc3RhbGxhdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZWRUeXBlID0gJ2dpdCc7XG4gICAgICAgICAgICByZXR1cm4gJ2dpdCc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgYW5kIGNvbnRpbnVlIHNlYXJjaGluZ1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoLmRpcm5hbWUoc2VhcmNoRGlyKTtcbiAgICAgICAgaWYgKHBhcmVudERpciA9PT0gc2VhcmNoRGlyKSB7XG4gICAgICAgICAgLy8gUmVhY2hlZCByb290IGRpcmVjdG9yeVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNlYXJjaERpciA9IHBhcmVudERpcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLndhcm4oJ1tJbnN0YWxsYXRpb25EZXRlY3Rvcl0gQ291bGQgbm90IGRldGVybWluZSBpbnN0YWxsYXRpb24gdHlwZScpO1xuICAgICAgdGhpcy5jYWNoZWRUeXBlID0gJ3Vua25vd24nO1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIEVycm9yIGRldGVjdGluZyBpbnN0YWxsYXRpb24gdHlwZTonLCBlcnJvcik7XG4gICAgICB0aGlzLmNhY2hlZFR5cGUgPSAndW5rbm93bic7XG4gICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgbnBtIGdsb2JhbCBpbnN0YWxsYXRpb24gcGF0aCBpZiBydW5uaW5nIGZyb20gbnBtXG4gICAqL1xuICBzdGF0aWMgZ2V0TnBtR2xvYmFsUGF0aCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5nZXRJbnN0YWxsYXRpb25UeXBlKCkgIT09ICducG0nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWxlVXJsID0gaW1wb3J0Lm1ldGEudXJsO1xuICAgICAgY29uc3QgY3VycmVudEZpbGVQYXRoID0gZmlsZVVSTFRvUGF0aChjdXJyZW50RmlsZVVybCk7XG4gICAgICBsZXQgY3VycmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RmlsZVBhdGgpO1xuICAgICAgXG4gICAgICAvLyBGaW5kIHRoZSByb290IG9mIHRoZSBucG0gcGFja2FnZVxuICAgICAgLy8gTm9ybWFsaXplIHBhdGhzIHRvIGhhbmRsZSBXaW5kb3dzIGFuZCBVbml4IHNlcGFyYXRvcnNcbiAgICAgIGNvbnN0IG5wbVBhY2thZ2VQYXR0ZXJuID0gcGF0aC5ub3JtYWxpemUoJ25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInKTtcbiAgICAgIHdoaWxlIChwYXRoLm5vcm1hbGl6ZShjdXJyZW50RGlyKS5pbmNsdWRlcyhucG1QYWNrYWdlUGF0dGVybikpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgICAgaWYgKHBhcmVudERpciA9PT0gY3VycmVudERpcikgYnJlYWs7XG4gICAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW0luc3RhbGxhdGlvbkRldGVjdG9yXSBFcnJvciBmaW5kaW5nIG5wbSBnbG9iYWwgcGF0aDonLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBnaXQgcmVwb3NpdG9yeSByb290IHBhdGggaWYgcnVubmluZyBmcm9tIGdpdFxuICAgKi9cbiAgc3RhdGljIGdldEdpdFJlcG9zaXRvcnlQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmdldEluc3RhbGxhdGlvblR5cGUoKSAhPT0gJ2dpdCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudEZpbGVVcmwgPSBpbXBvcnQubWV0YS51cmw7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVBhdGggPSBmaWxlVVJMVG9QYXRoKGN1cnJlbnRGaWxlVXJsKTtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNlYXJjaCB1cCBmb3IgLmdpdCBkaXJlY3RvcnlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgJy5naXQnKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZ2l0RGlyKSAmJiBmcy5zdGF0U3luYyhnaXREaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhaztcbiAgICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIEVycm9yIGZpbmRpbmcgZ2l0IHJlcG9zaXRvcnkgcGF0aDonLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGluc3RhbGxhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbGxhdGlvbkRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0SW5zdGFsbGF0aW9uVHlwZSgpO1xuICAgIFxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbnBtJzpcbiAgICAgICAgY29uc3QgbnBtUGF0aCA9IHRoaXMuZ2V0TnBtR2xvYmFsUGF0aCgpO1xuICAgICAgICByZXR1cm4gbnBtUGF0aCBcbiAgICAgICAgICA/IGBucG0gZ2xvYmFsIGluc3RhbGxhdGlvbiBhdCAke25wbVBhdGh9YFxuICAgICAgICAgIDogJ25wbSBnbG9iYWwgaW5zdGFsbGF0aW9uJztcbiAgICAgICAgICBcbiAgICAgIGNhc2UgJ2dpdCc6XG4gICAgICAgIGNvbnN0IGdpdFBhdGggPSB0aGlzLmdldEdpdFJlcG9zaXRvcnlQYXRoKCk7XG4gICAgICAgIHJldHVybiBnaXRQYXRoXG4gICAgICAgICAgPyBgZ2l0IGluc3RhbGxhdGlvbiBhdCAke2dpdFBhdGh9YFxuICAgICAgICAgIDogJ2dpdCBpbnN0YWxsYXRpb24nO1xuICAgICAgICAgIFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd1bmtub3duIGluc3RhbGxhdGlvbiB0eXBlJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGVkIGluc3RhbGxhdGlvbiB0eXBlIChtYWlubHkgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBzdGF0aWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlZFR5cGUgPSBudWxsO1xuICB9XG59Il19
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Shared utilities for search functionality
3
+ */
4
+ /**
5
+ * Normalize search terms for better matching
6
+ * Handles spaces, dashes, underscores, and file extensions
7
+ *
8
+ * @param term - The search term to normalize
9
+ * @param maxLength - Maximum allowed length for the search term (default: 1000)
10
+ * @returns Normalized search term
11
+ * @throws Error if term exceeds maxLength
12
+ */
13
+ export declare function normalizeSearchTerm(term: string, maxLength?: number): string;
14
+ /**
15
+ * Preserve original structure for partial matching
16
+ * Less aggressive normalization that keeps original separators for partial searches
17
+ *
18
+ * @param term - The search term to normalize
19
+ * @param maxLength - Maximum allowed length for the search term (default: 1000)
20
+ * @returns Normalized search term with preserved structure
21
+ * @throws Error if term exceeds maxLength
22
+ */
23
+ export declare function normalizeForPartialMatch(term: string, maxLength?: number): string;
24
+ /**
25
+ * Check if a search term matches a target string with multiple strategies
26
+ * Uses both normalized matching and partial matching for better results
27
+ *
28
+ * @param searchTerm - The term being searched for
29
+ * @param targetString - The string to search in
30
+ * @returns true if there's a match
31
+ */
32
+ export declare function isSearchMatch(searchTerm: string, targetString: string): boolean;
33
+ /**
34
+ * Validate search query length and content
35
+ *
36
+ * @param query - The search query to validate
37
+ * @param maxLength - Maximum allowed length (default: 1000)
38
+ * @returns true if valid
39
+ * @throws Error with descriptive message if invalid
40
+ */
41
+ export declare function validateSearchQuery(query: string, maxLength?: number): boolean;
42
+ /**
43
+ * Debug function to show how search terms are normalized
44
+ * Helps troubleshoot search matching issues
45
+ *
46
+ * @param originalTerm - The original search term
47
+ * @returns Object with different normalization results
48
+ */
49
+ export declare function debugNormalization(originalTerm: string): {
50
+ original: string;
51
+ normalized: string;
52
+ partialMatch: string;
53
+ };
54
+ //# sourceMappingURL=searchUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchUtils.d.ts","sourceRoot":"","sources":["../../src/utils/searchUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,MAAM,CAclF;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,MAAM,CAavF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAqB/E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,OAAO,CA0BpF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM;;;;EAMtD"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Shared utilities for search functionality
3
+ */
4
+ import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
5
+ /**
6
+ * Normalize search terms for better matching
7
+ * Handles spaces, dashes, underscores, and file extensions
8
+ *
9
+ * @param term - The search term to normalize
10
+ * @param maxLength - Maximum allowed length for the search term (default: 1000)
11
+ * @returns Normalized search term
12
+ * @throws Error if term exceeds maxLength
13
+ */
14
+ export function normalizeSearchTerm(term, maxLength = 1000) {
15
+ // SECURITY FIX: Normalize Unicode to prevent homograph attacks
16
+ const normalized = UnicodeValidator.normalize(term);
17
+ const cleanTerm = normalized.normalizedContent;
18
+ // Security: Limit input length to prevent DoS attacks
19
+ if (cleanTerm.length > maxLength) {
20
+ throw new Error(`Search term exceeds maximum length of ${maxLength} characters`);
21
+ }
22
+ return cleanTerm.toLowerCase()
23
+ .replace(/[-_\s]+/g, ' ') // Convert dashes, underscores to spaces
24
+ .replace(/\.md$/, '') // Remove .md extension
25
+ .trim();
26
+ }
27
+ /**
28
+ * Preserve original structure for partial matching
29
+ * Less aggressive normalization that keeps original separators for partial searches
30
+ *
31
+ * @param term - The search term to normalize
32
+ * @param maxLength - Maximum allowed length for the search term (default: 1000)
33
+ * @returns Normalized search term with preserved structure
34
+ * @throws Error if term exceeds maxLength
35
+ */
36
+ export function normalizeForPartialMatch(term, maxLength = 1000) {
37
+ // SECURITY FIX: Normalize Unicode to prevent homograph attacks
38
+ const normalized = UnicodeValidator.normalize(term);
39
+ const cleanTerm = normalized.normalizedContent;
40
+ // Security: Limit input length to prevent DoS attacks
41
+ if (cleanTerm.length > maxLength) {
42
+ throw new Error(`Search term exceeds maximum length of ${maxLength} characters`);
43
+ }
44
+ return cleanTerm.toLowerCase()
45
+ .replace(/\.md$/, '') // Remove .md extension only
46
+ .trim();
47
+ }
48
+ /**
49
+ * Check if a search term matches a target string with multiple strategies
50
+ * Uses both normalized matching and partial matching for better results
51
+ *
52
+ * @param searchTerm - The term being searched for
53
+ * @param targetString - The string to search in
54
+ * @returns true if there's a match
55
+ */
56
+ export function isSearchMatch(searchTerm, targetString) {
57
+ // Strategy 1: Exact normalized matching
58
+ const normalizedSearch = normalizeSearchTerm(searchTerm);
59
+ const normalizedTarget = normalizeSearchTerm(targetString);
60
+ if (normalizedTarget.includes(normalizedSearch)) {
61
+ return true;
62
+ }
63
+ // Strategy 2: Partial matching with preserved structure
64
+ const partialSearch = normalizeForPartialMatch(searchTerm);
65
+ const partialTarget = normalizeForPartialMatch(targetString);
66
+ if (partialTarget.includes(partialSearch)) {
67
+ return true;
68
+ }
69
+ // Strategy 3: Word-boundary matching
70
+ const searchWords = normalizedSearch.split(/\s+/);
71
+ const targetWords = normalizedTarget.split(/\s+/);
72
+ return searchWords.some(searchWord => targetWords.some(targetWord => targetWord.includes(searchWord)));
73
+ }
74
+ /**
75
+ * Validate search query length and content
76
+ *
77
+ * @param query - The search query to validate
78
+ * @param maxLength - Maximum allowed length (default: 1000)
79
+ * @returns true if valid
80
+ * @throws Error with descriptive message if invalid
81
+ */
82
+ export function validateSearchQuery(query, maxLength = 1000) {
83
+ if (!query || query.trim().length === 0) {
84
+ throw new Error('Search query cannot be empty');
85
+ }
86
+ // SECURITY FIX: Normalize Unicode before validation
87
+ const normalized = UnicodeValidator.normalize(query);
88
+ const cleanQuery = normalized.normalizedContent;
89
+ if (cleanQuery.length > maxLength) {
90
+ throw new Error(`Search query exceeds maximum length of ${maxLength} characters`);
91
+ }
92
+ // Check for potential injection patterns (basic validation)
93
+ const dangerousPatterns = [
94
+ /[\x00-\x1F\x7F]/, // Control characters
95
+ /[<>]/, // Potential HTML/XML injection
96
+ ];
97
+ for (const pattern of dangerousPatterns) {
98
+ if (pattern.test(cleanQuery)) {
99
+ throw new Error('Search query contains invalid characters');
100
+ }
101
+ }
102
+ return true;
103
+ }
104
+ /**
105
+ * Debug function to show how search terms are normalized
106
+ * Helps troubleshoot search matching issues
107
+ *
108
+ * @param originalTerm - The original search term
109
+ * @returns Object with different normalization results
110
+ */
111
+ export function debugNormalization(originalTerm) {
112
+ return {
113
+ original: originalTerm,
114
+ normalized: normalizeSearchTerm(originalTerm),
115
+ partialMatch: normalizeForPartialMatch(originalTerm)
116
+ };
117
+ }
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VhcmNoVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUU5RTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsWUFBb0IsSUFBSTtJQUN4RSwrREFBK0Q7SUFDL0QsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztJQUUvQyxzREFBc0Q7SUFDdEQsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLFNBQVMsYUFBYSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDLFdBQVcsRUFBRTtTQUMzQixPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFFLHdDQUF3QztTQUNsRSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFPLHVCQUF1QjtTQUNsRCxJQUFJLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxJQUFZLEVBQUUsWUFBb0IsSUFBSTtJQUM3RSwrREFBK0Q7SUFDL0QsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztJQUUvQyxzREFBc0Q7SUFDdEQsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMs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ZnVuY3Rpb25hbGl0eVxuICovXG5cbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBzZWFyY2ggdGVybXMgZm9yIGJldHRlciBtYXRjaGluZ1xuICogSGFuZGxlcyBzcGFjZXMsIGRhc2hlcywgdW5kZXJzY29yZXMsIGFuZCBmaWxlIGV4dGVuc2lvbnNcbiAqIFxuICogQHBhcmFtIHRlcm0gLSBUaGUgc2VhcmNoIHRlcm0gdG8gbm9ybWFsaXplXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIC0gTWF4aW11bSBhbGxvd2VkIGxlbmd0aCBmb3IgdGhlIHNlYXJjaCB0ZXJtIChkZWZhdWx0OiAxMDAwKVxuICogQHJldHVybnMgTm9ybWFsaXplZCBzZWFyY2ggdGVybVxuICogQHRocm93cyBFcnJvciBpZiB0ZXJtIGV4Y2VlZHMgbWF4TGVuZ3RoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXJtKHRlcm06IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIgPSAxMDAwKTogc3RyaW5nIHtcbiAgLy8gU0VDVVJJVFkgRklYOiBOb3JtYWxpemUgVW5pY29kZSB0byBwcmV2ZW50IGhvbW9ncmFwaCBhdHRhY2tzXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh0ZXJtKTtcbiAgY29uc3QgY2xlYW5UZXJtID0gbm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudDtcbiAgXG4gIC8vIFNlY3VyaXR5OiBMaW1pdCBpbnB1dCBsZW5ndGggdG8gcHJldmVudCBEb1MgYXR0YWNrc1xuICBpZiAoY2xlYW5UZXJtLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VhcmNoIHRlcm0gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke21heExlbmd0aH0gY2hhcmFjdGVyc2ApO1xuICB9XG4gIFxuICByZXR1cm4gY2xlYW5UZXJtLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvWy1fXFxzXSsvZywgJyAnKSAgLy8gQ29udmVydCBkYXNoZXMsIHVuZGVyc2NvcmVzIHRvIHNwYWNlc1xuICAgIC5yZXBsYWNlKC9cXC5tZCQvLCAnJykgICAgICAgLy8gUmVtb3ZlIC5tZCBleHRlbnNpb25cbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIFByZXNlcnZlIG9yaWdpbmFsIHN0cnVjdHVyZSBmb3IgcGFydGlhbCBtYXRjaGluZ1xuICogTGVzcyBhZ2dyZXNzaXZlIG5vcm1hbGl6YXRpb24gdGhhdCBrZWVwcyBvcmlnaW5hbCBzZXBhcmF0b3JzIGZvciBwYXJ0aWFsIHNlYXJjaGVzXG4gKiBcbiAqIEBwYXJhbSB0ZXJtIC0gVGhlIHNlYXJjaCB0ZXJtIHRvIG5vcm1hbGl6ZVxuICogQHBhcmFtIG1heExlbmd0aCAtIE1heGltdW0gYWxsb3dlZCBsZW5ndGggZm9yIHRoZSBzZWFyY2ggdGVybSAoZGVmYXVsdDogMTAwMClcbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgc2VhcmNoIHRlcm0gd2l0aCBwcmVzZXJ2ZWQgc3RydWN0dXJlXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRlcm0gZXhjZWVkcyBtYXhMZW5ndGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZvclBhcnRpYWxNYXRjaCh0ZXJtOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gMTAwMCk6IHN0cmluZyB7XG4gIC8vIFNFQ1VSSVRZIEZJWDogTm9ybWFsaXplIFVuaWNvZGUgdG8gcHJldmVudCBob21vZ3JhcGggYXR0YWNrc1xuICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodGVybSk7XG4gIGNvbnN0IGNsZWFuVGVybSA9IG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQ7XG4gIFxuICAvLyBTZWN1cml0eTogTGltaXQgaW5wdXQgbGVuZ3RoIHRvIHByZXZlbnQgRG9TIGF0dGFja3NcbiAgaWYgKGNsZWFuVGVybS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlYXJjaCB0ZXJtIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgfVxuICBcbiAgcmV0dXJuIGNsZWFuVGVybS50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1xcLm1kJC8sICcnKSAgICAgICAvLyBSZW1vdmUgLm1kIGV4dGVuc2lvbiBvbmx5XG4gICAgLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNlYXJjaCB0ZXJtIG1hdGNoZXMgYSB0YXJnZXQgc3RyaW5nIHdpdGggbXVsdGlwbGUgc3RyYXRlZ2llc1xuICogVXNlcyBib3RoIG5vcm1hbGl6ZWQgbWF0Y2hpbmcgYW5kIHBhcnRpYWwgbWF0Y2hpbmcgZm9yIGJldHRlciByZXN1bHRzXG4gKiBcbiAqIEBwYXJhbSBzZWFyY2hUZXJtIC0gVGhlIHRlcm0gYmVpbmcgc2VhcmNoZWQgZm9yXG4gKiBAcGFyYW0gdGFyZ2V0U3RyaW5nIC0gVGhlIHN0cmluZyB0byBzZWFyY2ggaW5cbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhIG1hdGNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlYXJjaE1hdGNoKHNlYXJjaFRlcm06IHN0cmluZywgdGFyZ2V0U3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gU3RyYXRlZ3kgMTogRXhhY3Qgbm9ybWFsaXplZCBtYXRjaGluZ1xuICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gbm9ybWFsaXplU2VhcmNoVGVybShzZWFyY2hUZXJtKTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldCA9IG5vcm1hbGl6ZVNlYXJjaFRlcm0odGFyZ2V0U3RyaW5nKTtcbiAgaWYgKG5vcm1hbGl6ZWRUYXJnZXQuaW5jbHVkZXMobm9ybWFsaXplZFNlYXJjaCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgLy8gU3RyYXRlZ3kgMjogUGFydGlhbCBtYXRjaGluZyB3aXRoIHByZXNlcnZlZCBzdHJ1Y3R1cmVcbiAgY29uc3QgcGFydGlhbFNlYXJjaCA9IG5vcm1hbGl6ZUZvclBhcnRpYWxNYXRjaChzZWFyY2hUZXJtKTtcbiAgY29uc3QgcGFydGlhbFRhcmdldCA9IG5vcm1hbGl6ZUZvclBhcnRpYWxNYXRjaCh0YXJnZXRTdHJpbmcpO1xuICBpZiAocGFydGlhbFRhcmdldC5pbmNsdWRlcyhwYXJ0aWFsU2VhcmNoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIFxuICAvLyBTdHJhdGVneSAzOiBXb3JkLWJvdW5kYXJ5IG1hdGNoaW5nXG4gIGNvbnN0IHNlYXJjaFdvcmRzID0gbm9ybWFsaXplZFNlYXJjaC5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCB0YXJnZXRXb3JkcyA9IG5vcm1hbGl6ZWRUYXJnZXQuc3BsaXQoL1xccysvKTtcbiAgcmV0dXJuIHNlYXJjaFdvcmRzLnNvbWUoc2VhcmNoV29yZCA9PiBcbiAgICB0YXJnZXRXb3Jkcy5zb21lKHRhcmdldFdvcmQgPT4gdGFyZ2V0V29yZC5pbmNsdWRlcyhzZWFyY2hXb3JkKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzZWFyY2ggcXVlcnkgbGVuZ3RoIGFuZCBjb250ZW50XG4gKiBcbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSBzZWFyY2ggcXVlcnkgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBtYXhMZW5ndGggLSBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIChkZWZhdWx0OiAxMDAwKVxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZFxuICogQHRocm93cyBFcnJvciB3aXRoIGRlc2NyaXB0aXZlIG1lc3NhZ2UgaWYgaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeTogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IDEwMDApOiBib29sZWFuIHtcbiAgaWYgKCFxdWVyeSB8fCBxdWVyeS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgY2Fubm90IGJlIGVtcHR5Jyk7XG4gIH1cbiAgXG4gIC8vIFNFQ1VSSVRZIEZJWDogTm9ybWFsaXplIFVuaWNvZGUgYmVmb3JlIHZhbGlkYXRpb25cbiAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHF1ZXJ5KTtcbiAgY29uc3QgY2xlYW5RdWVyeSA9IG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQ7XG4gIFxuICBpZiAoY2xlYW5RdWVyeS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlYXJjaCBxdWVyeSBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bWF4TGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciBwb3RlbnRpYWwgaW5qZWN0aW9uIHBhdHRlcm5zIChiYXNpYyB2YWxpZGF0aW9uKVxuICBjb25zdCBkYW5nZXJvdXNQYXR0ZXJucyA9IFtcbiAgICAvW1xceDAwLVxceDFGXFx4N0ZdLywgIC8vIENvbnRyb2wgY2hhcmFjdGVyc1xuICAgIC9bPD5dLywgICAgICAgICAgICAgLy8gUG90ZW50aWFsIEhUTUwvWE1MIGluamVjdGlvblxuICBdO1xuICBcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGRhbmdlcm91c1BhdHRlcm5zKSB7XG4gICAgaWYgKHBhdHRlcm4udGVzdChjbGVhblF1ZXJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWJ1ZyBmdW5jdGlvbiB0byBzaG93IGhvdyBzZWFyY2ggdGVybXMgYXJlIG5vcm1hbGl6ZWRcbiAqIEhlbHBzIHRyb3VibGVzaG9vdCBzZWFyY2ggbWF0Y2hpbmcgaXNzdWVzXG4gKiBcbiAqIEBwYXJhbSBvcmlnaW5hbFRlcm0gLSBUaGUgb3JpZ2luYWwgc2VhcmNoIHRlcm1cbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRpZmZlcmVudCBub3JtYWxpemF0aW9uIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnTm9ybWFsaXphdGlvbihvcmlnaW5hbFRlcm06IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIG9yaWdpbmFsOiBvcmlnaW5hbFRlcm0sXG4gICAgbm9ybWFsaXplZDogbm9ybWFsaXplU2VhcmNoVGVybShvcmlnaW5hbFRlcm0pLFxuICAgIHBhcnRpYWxNYXRjaDogbm9ybWFsaXplRm9yUGFydGlhbE1hdGNoKG9yaWdpbmFsVGVybSlcbiAgfTtcbn0iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,14 +13,12 @@
13
13
  "build": "tsc",
14
14
  "start": "node dist/index.js",
15
15
  "dev": "tsx watch src/index.ts",
16
+ "inspector": "npx @modelcontextprotocol/inspector node dist/index.js",
17
+ "inspector:dev": "npx @modelcontextprotocol/inspector tsx src/index.ts",
16
18
  "clean": "rm -rf dist",
17
19
  "rebuild": "npm run clean && npm run build",
18
20
  "setup": "npm install && npm run build",
19
21
  "prepublishOnly": "BUILD_TYPE=npm npm run build",
20
- "update:check": "echo 'Use check_for_updates MCP tool for interactive update checking'",
21
- "update:pull": "git pull origin main && npm install && npm run build",
22
- "update:backup": "cp -r . .backup-$(date +%s)",
23
- "update:restore": "echo 'Use rollback_update MCP tool for interactive rollback'",
24
22
  "test": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config test/jest.config.cjs",
25
23
  "test:watch": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config test/jest.config.cjs --watch",
26
24
  "test:coverage": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config test/jest.config.cjs --coverage",
@@ -42,7 +40,17 @@
42
40
  "security:audit": "tsx scripts/run-security-audit.ts",
43
41
  "security:audit:json": "tsx scripts/run-security-audit.ts --json",
44
42
  "security:audit:verbose": "tsx scripts/run-security-audit.ts --verbose",
45
- "pre-commit": "npm run security:rapid && npm audit --audit-level=high"
43
+ "pre-commit": "npm run security:rapid && npm audit --audit-level=high",
44
+ "test:e2e": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config test/jest.e2e.config.cjs",
45
+ "test:e2e:watch": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config test/jest.e2e.config.cjs --watch",
46
+ "test:e2e:verbose": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config test/jest.e2e.config.cjs --verbose",
47
+ "test:roundtrip": "npm run test:e2e",
48
+ "test:roundtrip:manual": "./scripts/test-roundtrip-workflow.sh",
49
+ "test:roundtrip:cleanup": "./scripts/test-roundtrip-workflow.sh cleanup",
50
+ "qa:direct": "node scripts/qa-direct-test.js",
51
+ "qa:inspector": "node scripts/qa-inspector-cli-test.js",
52
+ "qa:all": "npm run qa:direct && npm run qa:inspector",
53
+ "qa:simple": "node scripts/qa-simple-test.js"
46
54
  },
47
55
  "keywords": [
48
56
  "mcp",
@@ -99,7 +107,7 @@
99
107
  "url": "https://github.com/sponsors/mickdarling"
100
108
  },
101
109
  "dependencies": {
102
- "@modelcontextprotocol/sdk": "^1.16.0",
110
+ "@modelcontextprotocol/sdk": "^1.17.3",
103
111
  "@types/dompurify": "^3.0.5",
104
112
  "@types/uuid": "^10.0.0",
105
113
  "dompurify": "^3.2.6",
@@ -107,11 +115,13 @@
107
115
  "gray-matter": "^4.0.3",
108
116
  "js-yaml": "^4.1.0",
109
117
  "jsdom": "^26.1.0",
118
+ "node-fetch": "^3.3.2",
110
119
  "uuid": "^11.1.0",
111
120
  "zod": "^4.0.5"
112
121
  },
113
122
  "devDependencies": {
114
123
  "@jest/globals": "^30.0.4",
124
+ "@modelcontextprotocol/inspector": "^0.16.5",
115
125
  "@types/jest": "^30.0.0",
116
126
  "@types/js-yaml": "^4.0.9",
117
127
  "@types/jsdom": "^21.1.7",
@@ -1,84 +0,0 @@
1
- /**
2
- * Configuration for update system
3
- * Supports environment variables and XDG directories
4
- */
5
- export interface UpdateConfig {
6
- paths: {
7
- backupDir: string;
8
- npmBackupDir: string;
9
- tempDir: string;
10
- };
11
- limits: {
12
- maxSearchDepth: number;
13
- maxBackupCount: number;
14
- maxBackupSizeMB: number;
15
- };
16
- timeouts: {
17
- gitCloneMs: number;
18
- npmInstallMs: number;
19
- npmUpdateMs: number;
20
- buildMs: number;
21
- };
22
- }
23
- export declare class UpdateConfigManager {
24
- private static instance;
25
- private config;
26
- private constructor();
27
- /**
28
- * Get singleton instance
29
- */
30
- static getInstance(): UpdateConfigManager;
31
- /**
32
- * Get configuration
33
- */
34
- getConfig(): UpdateConfig;
35
- /**
36
- * Load configuration from environment and defaults
37
- */
38
- private loadConfiguration;
39
- /**
40
- * Get base directory respecting XDG standards on Linux
41
- */
42
- private getBaseDirectory;
43
- /**
44
- * Parse integer environment variable with default
45
- */
46
- private parseIntEnv;
47
- /**
48
- * Get backup directory path
49
- */
50
- getBackupDir(): string;
51
- /**
52
- * Get npm backup directory path
53
- */
54
- getNpmBackupDir(): string;
55
- /**
56
- * Get temporary directory path
57
- */
58
- getTempDir(): string;
59
- /**
60
- * Get max search depth for installation detection
61
- */
62
- getMaxSearchDepth(): number;
63
- /**
64
- * Get max number of backups to keep
65
- */
66
- getMaxBackupCount(): number;
67
- /**
68
- * Get timeout for git clone operations
69
- */
70
- getGitCloneTimeout(): number;
71
- /**
72
- * Get timeout for npm install operations
73
- */
74
- getNpmInstallTimeout(): number;
75
- /**
76
- * Get timeout for npm update operations
77
- */
78
- getNpmUpdateTimeout(): number;
79
- /**
80
- * Get timeout for build operations
81
- */
82
- getBuildTimeout(): number;
83
- }
84
- //# sourceMappingURL=updateConfig.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"updateConfig.d.ts","sourceRoot":"","sources":["../../src/config/updateConfig.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACN,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,SAAS,IAAI,YAAY;IAIzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B"}
@@ -1,148 +0,0 @@
1
- import * as path from 'path';
2
- import * as os from 'os';
3
- import { logger } from '../utils/logger.js';
4
- export class UpdateConfigManager {
5
- static instance = null;
6
- config;
7
- constructor() {
8
- this.config = this.loadConfiguration();
9
- }
10
- /**
11
- * Get singleton instance
12
- */
13
- static getInstance() {
14
- if (!UpdateConfigManager.instance) {
15
- UpdateConfigManager.instance = new UpdateConfigManager();
16
- }
17
- return UpdateConfigManager.instance;
18
- }
19
- /**
20
- * Get configuration
21
- */
22
- getConfig() {
23
- return this.config;
24
- }
25
- /**
26
- * Load configuration from environment and defaults
27
- */
28
- loadConfiguration() {
29
- // Determine base directory (respects XDG on Linux)
30
- const baseDir = this.getBaseDirectory();
31
- // Load from environment or use defaults
32
- const config = {
33
- paths: {
34
- backupDir: process.env.DOLLHOUSE_BACKUP_DIR ||
35
- path.join(baseDir, 'backups'),
36
- npmBackupDir: process.env.DOLLHOUSE_NPM_BACKUP_DIR ||
37
- path.join(baseDir, 'backups', 'npm'),
38
- tempDir: process.env.DOLLHOUSE_TEMP_DIR ||
39
- path.join(os.tmpdir(), 'dollhouse-update')
40
- },
41
- limits: {
42
- maxSearchDepth: this.parseIntEnv('DOLLHOUSE_MAX_SEARCH_DEPTH', 10),
43
- maxBackupCount: this.parseIntEnv('DOLLHOUSE_MAX_BACKUP_COUNT', 5),
44
- maxBackupSizeMB: this.parseIntEnv('DOLLHOUSE_MAX_BACKUP_SIZE_MB', 500)
45
- },
46
- timeouts: {
47
- gitCloneMs: this.parseIntEnv('DOLLHOUSE_GIT_CLONE_TIMEOUT_MS', 300000), // 5 minutes
48
- npmInstallMs: this.parseIntEnv('DOLLHOUSE_NPM_INSTALL_TIMEOUT_MS', 300000), // 5 minutes
49
- npmUpdateMs: this.parseIntEnv('DOLLHOUSE_NPM_UPDATE_TIMEOUT_MS', 300000), // 5 minutes
50
- buildMs: this.parseIntEnv('DOLLHOUSE_BUILD_TIMEOUT_MS', 120000) // 2 minutes
51
- }
52
- };
53
- logger.info('[UpdateConfig] Configuration loaded:', {
54
- baseDir,
55
- backupDir: config.paths.backupDir,
56
- maxSearchDepth: config.limits.maxSearchDepth
57
- });
58
- return config;
59
- }
60
- /**
61
- * Get base directory respecting XDG standards on Linux
62
- */
63
- getBaseDirectory() {
64
- // Check for explicit override
65
- if (process.env.DOLLHOUSE_BASE_DIR) {
66
- return process.env.DOLLHOUSE_BASE_DIR;
67
- }
68
- // On Linux, respect XDG standards
69
- if (process.platform === 'linux') {
70
- const xdgDataHome = process.env.XDG_DATA_HOME;
71
- if (xdgDataHome) {
72
- return path.join(xdgDataHome, 'dollhouse');
73
- }
74
- }
75
- // Default to home directory
76
- return path.join(os.homedir(), '.dollhouse');
77
- }
78
- /**
79
- * Parse integer environment variable with default
80
- */
81
- parseIntEnv(key, defaultValue) {
82
- const value = process.env[key];
83
- if (!value) {
84
- return defaultValue;
85
- }
86
- const parsed = parseInt(value, 10);
87
- if (isNaN(parsed)) {
88
- logger.warn(`[UpdateConfig] Invalid integer value for ${key}: ${value}, using default: ${defaultValue}`);
89
- return defaultValue;
90
- }
91
- return parsed;
92
- }
93
- /**
94
- * Get backup directory path
95
- */
96
- getBackupDir() {
97
- return this.config.paths.backupDir;
98
- }
99
- /**
100
- * Get npm backup directory path
101
- */
102
- getNpmBackupDir() {
103
- return this.config.paths.npmBackupDir;
104
- }
105
- /**
106
- * Get temporary directory path
107
- */
108
- getTempDir() {
109
- return this.config.paths.tempDir;
110
- }
111
- /**
112
- * Get max search depth for installation detection
113
- */
114
- getMaxSearchDepth() {
115
- return this.config.limits.maxSearchDepth;
116
- }
117
- /**
118
- * Get max number of backups to keep
119
- */
120
- getMaxBackupCount() {
121
- return this.config.limits.maxBackupCount;
122
- }
123
- /**
124
- * Get timeout for git clone operations
125
- */
126
- getGitCloneTimeout() {
127
- return this.config.timeouts.gitCloneMs;
128
- }
129
- /**
130
- * Get timeout for npm install operations
131
- */
132
- getNpmInstallTimeout() {
133
- return this.config.timeouts.npmInstallMs;
134
- }
135
- /**
136
- * Get timeout for npm update operations
137
- */
138
- getNpmUpdateTimeout() {
139
- return this.config.timeouts.npmUpdateMs;
140
- }
141
- /**
142
- * Get timeout for build operations
143
- */
144
- getBuildTimeout() {
145
- return this.config.timeouts.buildMs;
146
- }
147
- }
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy91cGRhdGVDb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBeUI1QyxNQUFNLE9BQU8sbUJBQW1CO0lBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQStCLElBQUksQ0FBQztJQUNuRCxNQUFNLENBQWU7SUFFN0I7UUFDRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQjtRQUN2QixtREFBbUQ7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEMsd0NBQXdDO1FBQ3hDLE1BQU0sTUFBTSxHQUFpQjtZQUMzQixLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7Z0JBQ3hDLFlBQVksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QjtvQkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQztnQkFDbEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCO29CQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQzthQUNwRDtZQUNELE1BQU0sRUFBRTtnQkFDTixjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLENBQUM7Z0JBQ2xFLGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQztnQkFDakUsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDO2FBQ3ZFO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdDQUFnQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFlBQVk7Z0JBQ3BGLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGtDQUFrQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFlBQVk7Z0JBQ3hGLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGlDQUFpQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFlBQVk7Z0JBQ3RGLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLDRCQUE0QixFQUFFLE1BQU0sQ0FBQyxDQUFDLFlBQVk7YUFDN0U7U0FDRixDQUFDO1FBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRTtZQUNsRCxPQUFPO1lBQ1AsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUztZQUNqQyxjQUFjLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjO1NBQzdDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQjtRQUN0Qiw4QkFBOEI7UUFDOUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDbkMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1FBQ3hDLENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQzlDLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXLENBQUMsR0FBVyxFQUFFLFlBQW9CO1FBQ25ELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxHQUFHLEtBQUssS0FBSyxvQkFBb0IsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUN6RyxPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB1cGRhdGUgc3lzdGVtXG4gKiBTdXBwb3J0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIFhERyBkaXJlY3Rvcmllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNvbmZpZyB7XG4gIHBhdGhzOiB7XG4gICAgYmFja3VwRGlyOiBzdHJpbmc7XG4gICAgbnBtQmFja3VwRGlyOiBzdHJpbmc7XG4gICAgdGVtcERpcjogc3RyaW5nO1xuICB9O1xuICBsaW1pdHM6IHtcbiAgICBtYXhTZWFyY2hEZXB0aDogbnVtYmVyO1xuICAgIG1heEJhY2t1cENvdW50OiBudW1iZXI7XG4gICAgbWF4QmFja3VwU2l6ZU1COiBudW1iZXI7XG4gIH07XG4gIHRpbWVvdXRzOiB7XG4gICAgZ2l0Q2xvbmVNczogbnVtYmVyO1xuICAgIG5wbUluc3RhbGxNczogbnVtYmVyO1xuICAgIG5wbVVwZGF0ZU1zOiBudW1iZXI7XG4gICAgYnVpbGRNczogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlQ29uZmlnTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBVcGRhdGVDb25maWdNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29uZmlnOiBVcGRhdGVDb25maWc7XG4gIFxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5sb2FkQ29uZmlndXJhdGlvbigpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IFVwZGF0ZUNvbmZpZ01hbmFnZXIge1xuICAgIGlmICghVXBkYXRlQ29uZmlnTWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgVXBkYXRlQ29uZmlnTWFuYWdlci5pbnN0YW5jZSA9IG5ldyBVcGRhdGVDb25maWdNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBVcGRhdGVDb25maWdNYW5hZ2VyLmluc3RhbmNlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGdldENvbmZpZygpOiBVcGRhdGVDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuICBcbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IGFuZCBkZWZhdWx0c1xuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ29uZmlndXJhdGlvbigpOiBVcGRhdGVDb25maWcge1xuICAgIC8vIERldGVybWluZSBiYXNlIGRpcmVjdG9yeSAocmVzcGVjdHMgWERHIG9uIExpbnV4KVxuICAgIGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldEJhc2VEaXJlY3RvcnkoKTtcbiAgICBcbiAgICAvLyBMb2FkIGZyb20gZW52aXJvbm1lbnQgb3IgdXNlIGRlZmF1bHRzXG4gICAgY29uc3QgY29uZmlnOiBVcGRhdGVDb25maWcgPSB7XG4gICAgICBwYXRoczoge1xuICAgICAgICBiYWNrdXBEaXI6IHByb2Nlc3MuZW52LkRPTExIT1VTRV9CQUNLVVBfRElSIHx8IFxuICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihiYXNlRGlyLCAnYmFja3VwcycpLFxuICAgICAgICBucG1CYWNrdXBEaXI6IHByb2Nlc3MuZW52LkRPTExIT1VTRV9OUE1fQkFDS1VQX0RJUiB8fCBcbiAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oYmFzZURpciwgJ2JhY2t1cHMnLCAnbnBtJyksXG4gICAgICAgIHRlbXBEaXI6IHByb2Nlc3MuZW52LkRPTExIT1VTRV9URU1QX0RJUiB8fCBcbiAgICAgICAgICAgICAgICAgcGF0aC5qb2luKG9zLnRtcGRpcigpLCAnZG9sbGhvdXNlLXVwZGF0ZScpXG4gICAgICB9LFxuICAgICAgbGltaXRzOiB7XG4gICAgICAgIG1heFNlYXJjaERlcHRoOiB0aGlzLnBhcnNlSW50RW52KCdET0xMSE9VU0VfTUFYX1NFQVJDSF9ERVBUSCcsIDEwKSxcbiAgICAgICAgbWF4QmFja3VwQ291bnQ6IHRoaXMucGFyc2VJbnRFbnYoJ0RPTExIT1VTRV9NQVhfQkFDS1VQX0NPVU5UJywgNSksXG4gICAgICAgIG1heEJhY2t1cFNpemVNQjogdGhpcy5wYXJzZUludEVudignRE9MTEhPVVNFX01BWF9CQUNLVVBfU0laRV9NQicsIDUwMClcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0czoge1xuICAgICAgICBnaXRDbG9uZU1zOiB0aGlzLnBhcnNlSW50RW52KCdET0xMSE9VU0VfR0lUX0NMT05FX1RJTUVPVVRfTVMnLCAzMDAwMDApLCAvLyA1IG1pbnV0ZXNcbiAgICAgICAgbnBtSW5zdGFsbE1zOiB0aGlzLnBhcnNlSW50RW52KCdET0xMSE9VU0VfTlBNX0lOU1RBTExfVElNRU9VVF9NUycsIDMwMDAwMCksIC8vIDUgbWludXRlc1xuICAgICAgICBucG1VcGRhdGVNczogdGhpcy5wYXJzZUludEVudignRE9MTEhPVVNFX05QTV9VUERBVEVfVElNRU9VVF9NUycsIDMwMDAwMCksIC8vIDUgbWludXRlc1xuICAgICAgICBidWlsZE1zOiB0aGlzLnBhcnNlSW50RW52KCdET0xMSE9VU0VfQlVJTERfVElNRU9VVF9NUycsIDEyMDAwMCkgLy8gMiBtaW51dGVzXG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICBsb2dnZXIuaW5mbygnW1VwZGF0ZUNvbmZpZ10gQ29uZmlndXJhdGlvbiBsb2FkZWQ6Jywge1xuICAgICAgYmFzZURpcixcbiAgICAgIGJhY2t1cERpcjogY29uZmlnLnBhdGhzLmJhY2t1cERpcixcbiAgICAgIG1heFNlYXJjaERlcHRoOiBjb25maWcubGltaXRzLm1heFNlYXJjaERlcHRoXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBiYXNlIGRpcmVjdG9yeSByZXNwZWN0aW5nIFhERyBzdGFuZGFyZHMgb24gTGludXhcbiAgICovXG4gIHByaXZhdGUgZ2V0QmFzZURpcmVjdG9yeSgpOiBzdHJpbmcge1xuICAgIC8vIENoZWNrIGZvciBleHBsaWNpdCBvdmVycmlkZVxuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfQkFTRV9ESVIpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQkFTRV9ESVI7XG4gICAgfVxuICAgIFxuICAgIC8vIE9uIExpbnV4LCByZXNwZWN0IFhERyBzdGFuZGFyZHNcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgICAgY29uc3QgeGRnRGF0YUhvbWUgPSBwcm9jZXNzLmVudi5YREdfREFUQV9IT01FO1xuICAgICAgaWYgKHhkZ0RhdGFIb21lKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oeGRnRGF0YUhvbWUsICdkb2xsaG91c2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRGVmYXVsdCB0byBob21lIGRpcmVjdG9yeVxuICAgIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmRvbGxob3VzZScpO1xuICB9XG4gIFxuICAvKipcbiAgICogUGFyc2UgaW50ZWdlciBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgcGFyc2VJbnRFbnYoa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByb2Nlc3MuZW52W2tleV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtVcGRhdGVDb25maWddIEludmFsaWQgaW50ZWdlciB2YWx1ZSBmb3IgJHtrZXl9OiAke3ZhbHVlfSwgdXNpbmcgZGVmYXVsdDogJHtkZWZhdWx0VmFsdWV9YCk7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGJhY2t1cCBkaXJlY3RvcnkgcGF0aFxuICAgKi9cbiAgZ2V0QmFja3VwRGlyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnBhdGhzLmJhY2t1cERpcjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBucG0gYmFja3VwIGRpcmVjdG9yeSBwYXRoXG4gICAqL1xuICBnZXROcG1CYWNrdXBEaXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucGF0aHMubnBtQmFja3VwRGlyO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRlbXBvcmFyeSBkaXJlY3RvcnkgcGF0aFxuICAgKi9cbiAgZ2V0VGVtcERpcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wYXRocy50ZW1wRGlyO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IG1heCBzZWFyY2ggZGVwdGggZm9yIGluc3RhbGxhdGlvbiBkZXRlY3Rpb25cbiAgICovXG4gIGdldE1heFNlYXJjaERlcHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmxpbWl0cy5tYXhTZWFyY2hEZXB0aDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBtYXggbnVtYmVyIG9mIGJhY2t1cHMgdG8ga2VlcFxuICAgKi9cbiAgZ2V0TWF4QmFja3VwQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubGltaXRzLm1heEJhY2t1cENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRpbWVvdXQgZm9yIGdpdCBjbG9uZSBvcGVyYXRpb25zXG4gICAqL1xuICBnZXRHaXRDbG9uZVRpbWVvdXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudGltZW91dHMuZ2l0Q2xvbmVNcztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aW1lb3V0IGZvciBucG0gaW5zdGFsbCBvcGVyYXRpb25zXG4gICAqL1xuICBnZXROcG1JbnN0YWxsVGltZW91dCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50aW1lb3V0cy5ucG1JbnN0YWxsTXM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGltZW91dCBmb3IgbnBtIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAqL1xuICBnZXROcG1VcGRhdGVUaW1lb3V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRpbWVvdXRzLm5wbVVwZGF0ZU1zO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRpbWVvdXQgZm9yIGJ1aWxkIG9wZXJhdGlvbnNcbiAgICovXG4gIGdldEJ1aWxkVGltZW91dCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50aW1lb3V0cy5idWlsZE1zO1xuICB9XG59Il19
@@ -1,10 +0,0 @@
1
- /**
2
- * Update/maintenance-related tool definitions and handlers
3
- */
4
- import { ToolDefinition } from './ToolRegistry.js';
5
- import { IToolHandler } from '../types.js';
6
- export declare function getUpdateTools(server: IToolHandler): Array<{
7
- tool: ToolDefinition;
8
- handler: any;
9
- }>;
10
- //# sourceMappingURL=UpdateTools.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UpdateTools.d.ts","sourceRoot":"","sources":["../../../src/server/tools/UpdateTools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC,CAgFlG"}