@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,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2luc3RhbGxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJckMsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQUMsVUFBVSxHQUE0QixJQUFJLENBQUM7SUFFMUQsK0RBQStEO0lBQ3ZELE1BQU0sQ0FBVSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFFOUM7O09BRUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CO1FBQ3hCLG9DQUFvQztRQUNwQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCwrQ0FBK0M7WUFDL0MsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFL0Msd0NBQXdDO1lBQ3hDLElBQUksQ0FBQztnQkFDSCxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixpREFBaUQ7Z0JBQ2pELE1BQU0sQ0FBQyxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztZQUNyRixDQUFDO1lB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O29CQUMvRCxPQUFPLFVBQVUsQ0FBQztnQkFDcEIsQ0FBQztnQkFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLFNBQVMsS0FBSyxVQUFVO29CQUFFLE1BQU07Z0JBQ3BDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsMEJBQTBCO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRXhDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDYixLQUFLLEtBQUs7Z0JBQ1IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sT0FBTztvQkFDWixDQUFDLENBQUMsOEJBQThCLE9BQU8sRUFBRTtvQkFDekMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO1lBRWhDLEtBQUssS0FBSztnQkFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxPQUFPO29CQUNaLENBQUMsQ0FBQyx1QkFBdUIsT0FBTyxFQUFFO29CQUNsQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7WUFFekI7Z0JBQ0UsT0FBTywyQkFBMkIsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFVBQVU7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnN0YWxsYXRpb24gZGV0ZWN0aW9uIHV0aWxpdGllc1xuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGZyb20gbnBtIG9yIGdpdCBpbnN0YWxsYXRpb25cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCB0eXBlIEluc3RhbGxhdGlvblR5cGUgPSAnbnBtJyB8ICdnaXQnIHwgJ3Vua25vd24nO1xuXG5leHBvcnQgY2xhc3MgSW5zdGFsbGF0aW9uRGV0ZWN0b3Ige1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZWRUeXBlOiBJbnN0YWxsYXRpb25UeXBlIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvLyBNYXhpbXVtIGRpcmVjdG9yeSBsZXZlbHMgdG8gc2VhcmNoIHVwd2FyZCBmb3IgLmdpdCBkaXJlY3RvcnlcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1NFQVJDSF9ERVBUSCA9IDEwO1xuICBcbiAgLyoqXG4gICAqIERldGVjdCB0aGUgaW5zdGFsbGF0aW9uIHR5cGUgKG5wbSBnbG9iYWwsIGdpdCBjbG9uZSwgb3IgdW5rbm93bilcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YWxsYXRpb25UeXBlKCk6IEluc3RhbGxhdGlvblR5cGUge1xuICAgIC8vIFJldHVybiBjYWNoZWQgcmVzdWx0IGlmIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLmNhY2hlZFR5cGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZFR5cGU7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGlzIGZpbGUgaXMgbG9jYXRlZFxuICAgICAgY29uc3QgY3VycmVudEZpbGVVcmwgPSBpbXBvcnQubWV0YS51cmw7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVBhdGggPSBmaWxlVVJMVG9QYXRoKGN1cnJlbnRGaWxlVXJsKTtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFJlc29sdmUgc3ltbGlua3MgdG8gZ2V0IHRoZSByZWFsIHBhdGhcbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJlbnREaXIgPSBmcy5yZWFscGF0aFN5bmMoY3VycmVudERpcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiByZWFscGF0aCBmYWlscywgY29udGludWUgd2l0aCBvcmlnaW5hbCBwYXRoXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW0luc3RhbGxhdGlvbkRldGVjdG9yXSBDb3VsZCBub3QgcmVzb2x2ZSByZWFsIHBhdGgsIHVzaW5nIG9yaWdpbmFsJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGEgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSAobnBtIGluc3RhbGxhdGlvbilcbiAgICAgIC8vIFVzZSBwYXRoIHNlcGFyYXRvciB0byBlbnN1cmUgd2UgbWF0Y2ggdGhlIGV4YWN0IHBhY2thZ2UgbmFtZVxuICAgICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIHRvIGhhbmRsZSBib3RoIFdpbmRvd3MgYW5kIFVuaXggc2VwYXJhdG9yc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEN1cnJlbnREaXIgPSBwYXRoLm5vcm1hbGl6ZShjdXJyZW50RGlyKTtcbiAgICAgIGNvbnN0IG5wbVBhdHRlcm4gPSBwYXRoLm5vcm1hbGl6ZShwYXRoLmpvaW4oJ25vZGVfbW9kdWxlcycsICdAZG9sbGhvdXNlbWNwJywgJ21jcC1zZXJ2ZXInKSk7XG4gICAgICBpZiAobm9ybWFsaXplZEN1cnJlbnREaXIuaW5jbHVkZXMobnBtUGF0dGVybikpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIERldGVjdGVkIG5wbSBpbnN0YWxsYXRpb24nKTtcbiAgICAgICAgdGhpcy5jYWNoZWRUeXBlID0gJ25wbSc7XG4gICAgICAgIHJldHVybiAnbnBtJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIC5naXQgZGlyZWN0b3J5IChnaXQgaW5zdGFsbGF0aW9uKVxuICAgICAgLy8gU2VhcmNoIHVwIGZyb20gY3VycmVudCBkaXJlY3RvcnlcbiAgICAgIGxldCBzZWFyY2hEaXIgPSBjdXJyZW50RGlyO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLk1BWF9TRUFSQ0hfREVQVEg7IGkrKykge1xuICAgICAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4oc2VhcmNoRGlyLCAnLmdpdCcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGdpdERpcikgJiYgZnMuc3RhdFN5bmMoZ2l0RGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1tJbnN0YWxsYXRpb25EZXRlY3Rvcl0gRGV0ZWN0ZWQgZ2l0IGluc3RhbGxhdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZWRUeXBlID0gJ2dpdCc7XG4gICAgICAgICAgICByZXR1cm4gJ2dpdCc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgYW5kIGNvbnRpbnVlIHNlYXJjaGluZ1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoLmRpcm5hbWUoc2VhcmNoRGlyKTtcbiAgICAgICAgaWYgKHBhcmVudERpciA9PT0gc2VhcmNoRGlyKSB7XG4gICAgICAgICAgLy8gUmVhY2hlZCByb290IGRpcmVjdG9yeVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNlYXJjaERpciA9IHBhcmVudERpcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLndhcm4oJ1tJbnN0YWxsYXRpb25EZXRlY3Rvcl0gQ291bGQgbm90IGRldGVybWluZSBpbnN0YWxsYXRpb24gdHlwZScpO1xuICAgICAgdGhpcy5jYWNoZWRUeXBlID0gJ3Vua25vd24nO1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIEVycm9yIGRldGVjdGluZyBpbnN0YWxsYXRpb24gdHlwZTonLCBlcnJvcik7XG4gICAgICB0aGlzLmNhY2hlZFR5cGUgPSAndW5rbm93bic7XG4gICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgbnBtIGdsb2JhbCBpbnN0YWxsYXRpb24gcGF0aCBpZiBydW5uaW5nIGZyb20gbnBtXG4gICAqL1xuICBzdGF0aWMgZ2V0TnBtR2xvYmFsUGF0aCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5nZXRJbnN0YWxsYXRpb25UeXBlKCkgIT09ICducG0nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWxlVXJsID0gaW1wb3J0Lm1ldGEudXJsO1xuICAgICAgY29uc3QgY3VycmVudEZpbGVQYXRoID0gZmlsZVVSTFRvUGF0aChjdXJyZW50RmlsZVVybCk7XG4gICAgICBsZXQgY3VycmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RmlsZVBhdGgpO1xuICAgICAgXG4gICAgICAvLyBGaW5kIHRoZSByb290IG9mIHRoZSBucG0gcGFja2FnZVxuICAgICAgLy8gTm9ybWFsaXplIHBhdGhzIHRvIGhhbmRsZSBXaW5kb3dzIGFuZCBVbml4IHNlcGFyYXRvcnNcbiAgICAgIGNvbnN0IG5wbVBhY2thZ2VQYXR0ZXJuID0gcGF0aC5ub3JtYWxpemUoJ25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInKTtcbiAgICAgIHdoaWxlIChwYXRoLm5vcm1hbGl6ZShjdXJyZW50RGlyKS5pbmNsdWRlcyhucG1QYWNrYWdlUGF0dGVybikpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgICAgaWYgKHBhcmVudERpciA9PT0gY3VycmVudERpcikgYnJlYWs7XG4gICAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW0luc3RhbGxhdGlvbkRldGVjdG9yXSBFcnJvciBmaW5kaW5nIG5wbSBnbG9iYWwgcGF0aDonLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBnaXQgcmVwb3NpdG9yeSByb290IHBhdGggaWYgcnVubmluZyBmcm9tIGdpdFxuICAgKi9cbiAgc3RhdGljIGdldEdpdFJlcG9zaXRvcnlQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmdldEluc3RhbGxhdGlvblR5cGUoKSAhPT0gJ2dpdCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudEZpbGVVcmwgPSBpbXBvcnQubWV0YS51cmw7XG4gICAgICBjb25zdCBjdXJyZW50RmlsZVBhdGggPSBmaWxlVVJMVG9QYXRoKGN1cnJlbnRGaWxlVXJsKTtcbiAgICAgIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNlYXJjaCB1cCBmb3IgLmdpdCBkaXJlY3RvcnlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgJy5naXQnKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZ2l0RGlyKSAmJiBmcy5zdGF0U3luYyhnaXREaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhaztcbiAgICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbSW5zdGFsbGF0aW9uRGV0ZWN0b3JdIEVycm9yIGZpbmRpbmcgZ2l0IHJlcG9zaXRvcnkgcGF0aDonLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGluc3RhbGxhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbGxhdGlvbkRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0SW5zdGFsbGF0aW9uVHlwZSgpO1xuICAgIFxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbnBtJzpcbiAgICAgICAgY29uc3QgbnBtUGF0aCA9IHRoaXMuZ2V0TnBtR2xvYmFsUGF0aCgpO1xuICAgICAgICByZXR1cm4gbnBtUGF0aCBcbiAgICAgICAgICA/IGBucG0gZ2xvYmFsIGluc3RhbGxhdGlvbiBhdCAke25wbVBhdGh9YFxuICAgICAgICAgIDogJ25wbSBnbG9iYWwgaW5zdGFsbGF0aW9uJztcbiAgICAgICAgICBcbiAgICAgIGNhc2UgJ2dpdCc6XG4gICAgICAgIGNvbnN0IGdpdFBhdGggPSB0aGlzLmdldEdpdFJlcG9zaXRvcnlQYXRoKCk7XG4gICAgICAgIHJldHVybiBnaXRQYXRoXG4gICAgICAgICAgPyBgZ2l0IGluc3RhbGxhdGlvbiBhdCAke2dpdFBhdGh9YFxuICAgICAgICAgIDogJ2dpdCBpbnN0YWxsYXRpb24nO1xuICAgICAgICAgIFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd1bmtub3duIGluc3RhbGxhdGlvbiB0eXBlJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGVkIGluc3RhbGxhdGlvbiB0eXBlIChtYWlubHkgZm9yIHRlc3RpbmcpXG4gICAqL1xuICBzdGF0aWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlZFR5cGUgPSBudWxsO1xuICB9XG59Il19
@@ -11,6 +11,25 @@
11
11
  * @throws Error if term exceeds maxLength
12
12
  */
13
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;
14
33
  /**
15
34
  * Validate search query length and content
16
35
  *
@@ -20,4 +39,16 @@ export declare function normalizeSearchTerm(term: string, maxLength?: number): s
20
39
  * @throws Error with descriptive message if invalid
21
40
  */
22
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
+ };
23
54
  //# sourceMappingURL=searchUtils.d.ts.map
@@ -1 +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;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,OAAO,CA0BpF"}
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"}
@@ -24,6 +24,53 @@ export function normalizeSearchTerm(term, maxLength = 1000) {
24
24
  .replace(/\.md$/, '') // Remove .md extension
25
25
  .trim();
26
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
+ }
27
74
  /**
28
75
  * Validate search query length and content
29
76
  *
@@ -54,4 +101,18 @@ export function validateSearchQuery(query, maxLength = 1000) {
54
101
  }
55
102
  return true;
56
103
  }
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VhcmNoVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUU5RTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsWUFBb0IsSUFBSTtJQUN4RSwrREFBK0Q7SUFDL0QsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztJQUUvQyxzREFBc0Q7SUFDdEQsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLFNBQVMsYUFBYSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDLFdBQVcsRUFBRTtTQUMzQixPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFFLHdDQUF3QztTQUNsRSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFPLHVCQUF1QjtTQUNsRCxJQUFJLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWEsRUFBRSxZQUFvQixJQUFJO0lBQ3pFLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDO0lBRWhELElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxTQUFTLGFBQWEsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsTUFBTSxpQkFBaUIsR0FBRztRQUN4QixpQkFBaUIsRUFBRyxxQkFBcUI7UUFDekMsTUFBTSxFQUFjLCtCQUErQjtLQUNwRCxDQUFDO0lBRUYsS0FBSyxNQUFNLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIHV0aWxpdGllcyBmb3Igc2VhcmNoIGZ1bmN0aW9uYWxpdHlcbiAqL1xuXG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcblxuLyoqXG4gKiBOb3JtYWxpemUgc2VhcmNoIHRlcm1zIGZvciBiZXR0ZXIgbWF0Y2hpbmdcbiAqIEhhbmRsZXMgc3BhY2VzLCBkYXNoZXMsIHVuZGVyc2NvcmVzLCBhbmQgZmlsZSBleHRlbnNpb25zXG4gKiBcbiAqIEBwYXJhbSB0ZXJtIC0gVGhlIHNlYXJjaCB0ZXJtIHRvIG5vcm1hbGl6ZVxuICogQHBhcmFtIG1heExlbmd0aCAtIE1heGltdW0gYWxsb3dlZCBsZW5ndGggZm9yIHRoZSBzZWFyY2ggdGVybSAoZGVmYXVsdDogMTAwMClcbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgc2VhcmNoIHRlcm1cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGVybSBleGNlZWRzIG1heExlbmd0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoVGVybSh0ZXJtOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gMTAwMCk6IHN0cmluZyB7XG4gIC8vIFNFQ1VSSVRZIEZJWDogTm9ybWFsaXplIFVuaWNvZGUgdG8gcHJldmVudCBob21vZ3JhcGggYXR0YWNrc1xuICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodGVybSk7XG4gIGNvbnN0IGNsZWFuVGVybSA9IG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQ7XG4gIFxuICAvLyBTZWN1cml0eTogTGltaXQgaW5wdXQgbGVuZ3RoIHRvIHByZXZlbnQgRG9TIGF0dGFja3NcbiAgaWYgKGNsZWFuVGVybS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlYXJjaCB0ZXJtIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgfVxuICBcbiAgcmV0dXJuIGNsZWFuVGVybS50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1stX1xcc10rL2csICcgJykgIC8vIENvbnZlcnQgZGFzaGVzLCB1bmRlcnNjb3JlcyB0byBzcGFjZXNcbiAgICAucmVwbGFjZSgvXFwubWQkLywgJycpICAgICAgIC8vIFJlbW92ZSAubWQgZXh0ZW5zaW9uXG4gICAgLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzZWFyY2ggcXVlcnkgbGVuZ3RoIGFuZCBjb250ZW50XG4gKiBcbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSBzZWFyY2ggcXVlcnkgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBtYXhMZW5ndGggLSBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIChkZWZhdWx0OiAxMDAwKVxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZFxuICogQHRocm93cyBFcnJvciB3aXRoIGRlc2NyaXB0aXZlIG1lc3NhZ2UgaWYgaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeTogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IDEwMDApOiBib29sZWFuIHtcbiAgaWYgKCFxdWVyeSB8fCBxdWVyeS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgY2Fubm90IGJlIGVtcHR5Jyk7XG4gIH1cbiAgXG4gIC8vIFNFQ1VSSVRZIEZJWDogTm9ybWFsaXplIFVuaWNvZGUgYmVmb3JlIHZhbGlkYXRpb25cbiAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHF1ZXJ5KTtcbiAgY29uc3QgY2xlYW5RdWVyeSA9IG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQ7XG4gIFxuICBpZiAoY2xlYW5RdWVyeS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlYXJjaCBxdWVyeSBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bWF4TGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciBwb3RlbnRpYWwgaW5qZWN0aW9uIHBhdHRlcm5zIChiYXNpYyB2YWxpZGF0aW9uKVxuICBjb25zdCBkYW5nZXJvdXNQYXR0ZXJucyA9IFtcbiAgICAvW1xceDAwLVxceDFGXFx4N0ZdLywgIC8vIENvbnRyb2wgY2hhcmFjdGVyc1xuICAgIC9bPD5dLywgICAgICAgICAgICAgLy8gUG90ZW50aWFsIEhUTUwvWE1MIGluamVjdGlvblxuICBdO1xuICBcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGRhbmdlcm91c1BhdHRlcm5zKSB7XG4gICAgaWYgKHBhdHRlcm4udGVzdChjbGVhblF1ZXJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gdHJ1ZTtcbn0iXX0=
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.2",
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy91cGRhdGVDb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBeUI1QyxNQUFNLE9BQU8sbUJBQW1CO0lBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQStCLElBQUksQ0FBQztJQUNuRCxNQUFNLENBQWU7SUFFN0I7UUFDRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQjtRQUN2QixtREFBbUQ7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEMsd0NBQXdDO1FBQ3hDLE1BQU0sTUFBTSxHQUFpQjtZQUMzQixLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7Z0JBQ3hDLFlBQVksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QjtvQkFDcEMs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Q0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB1cGRhdGUgc3lzdGVtXG4gKiBTdXBwb3J0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIFhERyBkaXJlY3Rvcmllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNvbmZpZyB7XG4gIHBhdGhzOiB7XG4gICAgYmFja3VwRGlyOiBzdHJpbmc7XG4gICAgbnBtQmFja3VwRGlyOiBzdHJpbmc7XG4gICAgdGVtcERpcjogc3RyaW5nO1xuICB9O1xuICBsaW1pdHM6IHtcbiAgICBtYXhTZWFyY2hEZXB0aDogbnVtYmVyO1xuICAgIG1heEJhY2t1cENvdW50OiBudW1iZXI7XG4gICAgbWF4QmFja3VwU2l6ZU1COiBudW1iZXI7XG4gIH07XG4gIHRpbWVvdXRzOiB7XG4gICAgZ2l0Q2xvbmVNczogbnVtYmVyO1xuICAgIG5wbUluc3RhbGxNczogbnVtYmVyO1xuICAgIG5wbVVwZGF0ZU1zOiBudW1iZXI7XG4gICAgYnVpbGRNczogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlQ29uZmlnTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBVcGRhdGVDb25maWdNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29uZmlnOiBVcGRhdGVDb25maWc7XG4gIFxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5sb2FkQ29uZmlndXJhdGlvbigpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IFVwZGF0ZUNvbmZpZ01hbmFnZXIge1xuICAgIGlmICghVXBkYXRlQ29uZmlnTWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgVXBkYXRlQ29uZmlnTWFuYWdlci5pbnN0YW5jZSA9IG5ldyBVcGRhdGVDb25maWdNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBVcGRhdGVDb25maWdNYW5hZ2VyLmluc3RhbmNlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGdldENvbmZpZygpOiBVcGRhdGVDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuICBcbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IGFuZCBkZWZhdWx0c1xuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ29uZmlndXJhdGlvbigpOiBVcGRhdGVDb25maWcge1xuICAgIC8vIERldGVybWluZSBiYXNlIGRpcmVjdG9yeSAocmVzcGVjdHMgWERHIG9uIExpbnV4KVxuICAgIGNvbnN0IGJhc2VEaXIgPSB0aGlzLmdldEJhc2VEaXJlY3RvcnkoKTtcbiAgICBcbiAgICAvLyBMb2FkIGZyb20gZW52aXJvbm1lbnQgb3IgdXNlIGRlZmF1bHRzXG4gICAgY29uc3QgY29uZmlnOiBVcGRhdGVDb25maWcgPSB7XG4gICAgICBwYXRoczoge1xuICAgICAgICBiYWNrdXBEaXI6IHByb2Nlc3MuZW52LkRPTExIT1VTRV9CQUNLVVBfRElSIHx8IFxuICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihiYXNlRGlyLCAnYmFja3VwcycpLFxuICAgICAgICBucG1CYWNrdXBEaXI6IHByb2Nlc3MuZW52LkRPTExIT1VTRV9OUE1fQkFDS1VQX0RJUiB8fCBcbiAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oYmFzZURpciwgJ2JhY2t1cHMnLCAnbnBtJyksXG4gICAgICAgIHRlbXBEaXI6IHByb2Nlc3MuZW52LkRPTExIT1VTRV9URU1QX0RJUiB8fCBcbiAgICAgICAgICAgICAgICAgcGF0aC5qb2luKG9zLnRtcGRpcigpLCAnZG9sbGhvdXNlLXVwZGF0ZScpXG4gICAgICB9LFxuICAgICAgbGltaXRzOiB7XG4gICAgICAgIG1heFNlYXJjaERlcHRoOiB0aGlzLnBhcnNlSW50RW52KCdET0xMSE9VU0VfTUFYX1NFQVJDSF9ERVBUSCcsIDEwKSxcbiAgICAgICAgbWF4QmFja3VwQ291bnQ6IHRoaXMucGFyc2VJbnRFbnYoJ0RPTExIT1VTRV9NQVhfQkFDS1VQX0NPVU5UJywgNSksXG4gICAgICAgIG1heEJhY2t1cFNpemVNQjogdGhpcy5wYXJzZUludEVudignRE9MTEhPVVNFX01BWF9CQUNLVVBfU0laRV9NQicsIDUwMClcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0czoge1xuICAgICAgICBnaXRDbG9uZU1zOiB0aGlzLnBhcnNlSW50RW52KCdET0xMSE9VU0VfR0lUX0NMT05FX1RJTUVPVVRfTVMnLCAzMDAwMDApLCAvLyA1IG1pbnV0ZXNcbiAgICAgICAgbnBtSW5zdGFsbE1zOiB0aGlzLnBhcnNlSW50RW52KCdET0xMSE9VU0VfTlBNX0lOU1RBTExfVElNRU9VVF9NUycsIDMwMDAwMCksIC8vIDUgbWludXRlc1xuICAgICAgICBucG1VcGRhdGVNczogdGhpcy5wYXJzZUludEVudignRE9MTEhPVVNFX05QTV9VUERBVEVfVElNRU9VVF9NUycsIDMwMDAwMCksIC8vIDUgbWludXRlc1xuICAgICAgICBidWlsZE1zOiB0aGlzLnBhcnNlSW50RW52KCdET0xMSE9VU0VfQlVJTERfVElNRU9VVF9NUycsIDEyMDAwMCkgLy8gMiBtaW51dGVzXG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICBsb2dnZXIuaW5mbygnW1VwZGF0ZUNvbmZpZ10gQ29uZmlndXJhdGlvbiBsb2FkZWQ6Jywge1xuICAgICAgYmFzZURpcixcbiAgICAgIGJhY2t1cERpcjogY29uZmlnLnBhdGhzLmJhY2t1cERpcixcbiAgICAgIG1heFNlYXJjaERlcHRoOiBjb25maWcubGltaXRzLm1heFNlYXJjaERlcHRoXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBiYXNlIGRpcmVjdG9yeSByZXNwZWN0aW5nIFhERyBzdGFuZGFyZHMgb24gTGludXhcbiAgICovXG4gIHByaXZhdGUgZ2V0QmFzZURpcmVjdG9yeSgpOiBzdHJpbmcge1xuICAgIC8vIENoZWNrIGZvciBleHBsaWNpdCBvdmVycmlkZVxuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfQkFTRV9ESVIpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQkFTRV9ESVI7XG4gICAgfVxuICAgIFxuICAgIC8vIE9uIExpbnV4LCByZXNwZWN0IFhERyBzdGFuZGFyZHNcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgICAgY29uc3QgeGRnRGF0YUhvbWUgPSBwcm9jZXNzLmVudi5YREdfREFUQV9IT01FO1xuICAgICAgaWYgKHhkZ0RhdGFIb21lKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oeGRnRGF0YUhvbWUsICdkb2xsaG91c2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRGVmYXVsdCB0byBob21lIGRpcmVjdG9yeVxuICAgIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmRvbGxob3VzZScpO1xuICB9XG4gIFxuICAvKipcbiAgICogUGFyc2UgaW50ZWdlciBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIGRlZmF1bHRcbiAgICovXG4gIHByaXZhdGUgcGFyc2VJbnRFbnYoa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByb2Nlc3MuZW52W2tleV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtVcGRhdGVDb25maWddIEludmFsaWQgaW50ZWdlciB2YWx1ZSBmb3IgJHtrZXl9OiAke3ZhbHVlfSwgdXNpbmcgZGVmYXVsdDogJHtkZWZhdWx0VmFsdWV9YCk7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGJhY2t1cCBkaXJlY3RvcnkgcGF0aFxuICAgKi9cbiAgZ2V0QmFja3VwRGlyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnBhdGhzLmJhY2t1cERpcjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBucG0gYmFja3VwIGRpcmVjdG9yeSBwYXRoXG4gICAqL1xuICBnZXROcG1CYWNrdXBEaXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucGF0aHMubnBtQmFja3VwRGlyO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRlbXBvcmFyeSBkaXJlY3RvcnkgcGF0aFxuICAgKi9cbiAgZ2V0VGVtcERpcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wYXRocy50ZW1wRGlyO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IG1heCBzZWFyY2ggZGVwdGggZm9yIGluc3RhbGxhdGlvbiBkZXRlY3Rpb25cbiAgICovXG4gIGdldE1heFNlYXJjaERlcHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmxpbWl0cy5tYXhTZWFyY2hEZXB0aDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBtYXggbnVtYmVyIG9mIGJhY2t1cHMgdG8ga2VlcFxuICAgKi9cbiAgZ2V0TWF4QmFja3VwQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubGltaXRzLm1heEJhY2t1cENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRpbWVvdXQgZm9yIGdpdCBjbG9uZSBvcGVyYXRpb25zXG4gICAqL1xuICBnZXRHaXRDbG9uZVRpbWVvdXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudGltZW91dHMuZ2l0Q2xvbmVNcztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aW1lb3V0IGZvciBucG0gaW5zdGFsbCBvcGVyYXRpb25zXG4gICAqL1xuICBnZXROcG1JbnN0YWxsVGltZW91dCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50aW1lb3V0cy5ucG1JbnN0YWxsTXM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGltZW91dCBmb3IgbnBtIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAqL1xuICBnZXROcG1VcGRhdGVUaW1lb3V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRpbWVvdXRzLm5wbVVwZGF0ZU1zO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRpbWVvdXQgZm9yIGJ1aWxkIG9wZXJhdGlvbnNcbiAgICovXG4gIGdldEJ1aWxkVGltZW91dCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50aW1lb3V0cy5idWlsZE1zO1xuICB9XG59Il19
@@ -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"}