@dollhousemcp/mcp-server 1.3.0 → 1.3.3

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 (684) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +99 -17
  3. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  4. package/dist/collection/ElementInstaller.js +3 -7
  5. package/dist/elements/index.d.ts +0 -2
  6. package/dist/elements/index.d.ts.map +1 -1
  7. package/dist/elements/index.js +1 -3
  8. package/dist/elements/skills/Skill.d.ts.map +1 -1
  9. package/dist/elements/skills/Skill.js +3 -2
  10. package/dist/elements/skills/SkillManager.d.ts +83 -0
  11. package/dist/elements/skills/SkillManager.d.ts.map +1 -0
  12. package/dist/elements/skills/SkillManager.js +383 -0
  13. package/dist/elements/skills/index.d.ts +1 -0
  14. package/dist/elements/skills/index.d.ts.map +1 -1
  15. package/dist/elements/skills/index.js +2 -1
  16. package/dist/index.d.ts +51 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +577 -3
  19. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  20. package/dist/portfolio/PortfolioManager.js +1 -3
  21. package/dist/portfolio/types.d.ts +1 -3
  22. package/dist/portfolio/types.d.ts.map +1 -1
  23. package/dist/portfolio/types.js +1 -3
  24. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  25. package/dist/security/audit/config/suppressions.js +6 -1
  26. package/dist/server/ServerSetup.d.ts.map +1 -1
  27. package/dist/server/ServerSetup.js +5 -2
  28. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  29. package/dist/server/tools/CollectionTools.js +52 -7
  30. package/dist/server/tools/ElementTools.d.ts +11 -0
  31. package/dist/server/tools/ElementTools.d.ts.map +1 -0
  32. package/dist/server/tools/ElementTools.js +174 -0
  33. package/dist/server/tools/index.d.ts +1 -0
  34. package/dist/server/tools/index.d.ts.map +1 -1
  35. package/dist/server/tools/index.js +2 -1
  36. package/dist/server/types.d.ts +8 -0
  37. package/dist/server/types.d.ts.map +1 -1
  38. package/dist/server/types.js +1 -1
  39. package/package.json +1 -1
  40. package/dist/collection/MarketplaceBrowser.d.ts +0 -24
  41. package/dist/collection/MarketplaceBrowser.d.ts.map +0 -1
  42. package/dist/collection/MarketplaceBrowser.js +0 -115
  43. package/dist/collection/MarketplaceSearch.d.ts +0 -18
  44. package/dist/collection/MarketplaceSearch.d.ts.map +0 -1
  45. package/dist/collection/MarketplaceSearch.js +0 -48
  46. package/dist/collection/PersonaInstaller.d.ts +0 -26
  47. package/dist/collection/PersonaInstaller.d.ts.map +0 -1
  48. package/dist/collection/PersonaInstaller.js +0 -103
  49. package/dist/elements/ensembles/Ensemble.d.ts +0 -144
  50. package/dist/elements/ensembles/Ensemble.d.ts.map +0 -1
  51. package/dist/elements/ensembles/Ensemble.js +0 -860
  52. package/dist/elements/ensembles/EnsembleManager.d.ts +0 -85
  53. package/dist/elements/ensembles/EnsembleManager.d.ts.map +0 -1
  54. package/dist/elements/ensembles/EnsembleManager.js +0 -378
  55. package/dist/elements/ensembles/constants.d.ts +0 -73
  56. package/dist/elements/ensembles/constants.d.ts.map +0 -1
  57. package/dist/elements/ensembles/constants.js +0 -92
  58. package/dist/elements/ensembles/index.d.ts +0 -8
  59. package/dist/elements/ensembles/index.d.ts.map +0 -1
  60. package/dist/elements/ensembles/index.js +0 -8
  61. package/dist/elements/ensembles/types.d.ts +0 -92
  62. package/dist/elements/ensembles/types.d.ts.map +0 -1
  63. package/dist/elements/ensembles/types.js +0 -8
  64. package/dist/elements/memories/Memory.d.ts +0 -110
  65. package/dist/elements/memories/Memory.d.ts.map +0 -1
  66. package/dist/elements/memories/Memory.js +0 -470
  67. package/dist/elements/memories/MemoryManager.d.ts +0 -86
  68. package/dist/elements/memories/MemoryManager.d.ts.map +0 -1
  69. package/dist/elements/memories/MemoryManager.js +0 -435
  70. package/dist/elements/memories/constants.d.ts +0 -42
  71. package/dist/elements/memories/constants.d.ts.map +0 -1
  72. package/dist/elements/memories/constants.js +0 -49
  73. package/dist/elements/memories/index.d.ts +0 -6
  74. package/dist/elements/memories/index.d.ts.map +0 -1
  75. package/dist/elements/memories/index.js +0 -6
  76. package/dist/marketplace/GitHubClient.d.ts +0 -22
  77. package/dist/marketplace/GitHubClient.d.ts.map +0 -1
  78. package/dist/marketplace/GitHubClient.js +0 -112
  79. package/dist/marketplace/MarketplaceBrowser.d.ts +0 -24
  80. package/dist/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  81. package/dist/marketplace/MarketplaceBrowser.js +0 -115
  82. package/dist/marketplace/MarketplaceSearch.d.ts +0 -18
  83. package/dist/marketplace/MarketplaceSearch.d.ts.map +0 -1
  84. package/dist/marketplace/MarketplaceSearch.js +0 -48
  85. package/dist/marketplace/PersonaDetails.d.ts +0 -22
  86. package/dist/marketplace/PersonaDetails.d.ts.map +0 -1
  87. package/dist/marketplace/PersonaDetails.js +0 -71
  88. package/dist/marketplace/PersonaInstaller.d.ts +0 -25
  89. package/dist/marketplace/PersonaInstaller.d.ts.map +0 -1
  90. package/dist/marketplace/PersonaInstaller.js +0 -100
  91. package/dist/marketplace/PersonaSubmitter.d.ts +0 -19
  92. package/dist/marketplace/PersonaSubmitter.d.ts.map +0 -1
  93. package/dist/marketplace/PersonaSubmitter.js +0 -57
  94. package/dist/marketplace/index.d.ts +0 -10
  95. package/dist/marketplace/index.d.ts.map +0 -1
  96. package/dist/marketplace/index.js +0 -10
  97. package/dist/server/tools/MarketplaceTools.d.ts +0 -10
  98. package/dist/server/tools/MarketplaceTools.d.ts.map +0 -1
  99. package/dist/server/tools/MarketplaceTools.js +0 -96
  100. package/dist/src/cache/APICache.d.ts +0 -23
  101. package/dist/src/cache/APICache.d.ts.map +0 -1
  102. package/dist/src/cache/APICache.js +0 -42
  103. package/dist/src/cache/index.d.ts +0 -5
  104. package/dist/src/cache/index.d.ts.map +0 -1
  105. package/dist/src/cache/index.js +0 -5
  106. package/dist/src/config/constants.d.ts +0 -25
  107. package/dist/src/config/constants.d.ts.map +0 -1
  108. package/dist/src/config/constants.js +0 -30
  109. package/dist/src/config/index.d.ts +0 -6
  110. package/dist/src/config/index.d.ts.map +0 -1
  111. package/dist/src/config/index.js +0 -6
  112. package/dist/src/config/indicator-config.d.ts +0 -107
  113. package/dist/src/config/indicator-config.d.ts.map +0 -1
  114. package/dist/src/config/indicator-config.js +0 -158
  115. package/dist/src/constants/defaultPersonas.d.ts +0 -10
  116. package/dist/src/constants/defaultPersonas.d.ts.map +0 -1
  117. package/dist/src/constants/defaultPersonas.js +0 -18
  118. package/dist/src/constants/limits.d.ts +0 -10
  119. package/dist/src/constants/limits.d.ts.map +0 -1
  120. package/dist/src/constants/limits.js +0 -13
  121. package/dist/src/errors/SecurityError.d.ts +0 -29
  122. package/dist/src/errors/SecurityError.d.ts.map +0 -1
  123. package/dist/src/errors/SecurityError.js +0 -47
  124. package/dist/src/errors/index.d.ts +0 -2
  125. package/dist/src/errors/index.d.ts.map +0 -1
  126. package/dist/src/errors/index.js +0 -2
  127. package/dist/src/index.barrel.d.ts +0 -21
  128. package/dist/src/index.barrel.d.ts.map +0 -1
  129. package/dist/src/index.barrel.js +0 -31
  130. package/dist/src/index.d.ts +0 -220
  131. package/dist/src/index.d.ts.map +0 -1
  132. package/dist/src/index.js +0 -1559
  133. package/dist/src/marketplace/GitHubClient.d.ts +0 -22
  134. package/dist/src/marketplace/GitHubClient.d.ts.map +0 -1
  135. package/dist/src/marketplace/GitHubClient.js +0 -112
  136. package/dist/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  137. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  138. package/dist/src/marketplace/MarketplaceBrowser.js +0 -45
  139. package/dist/src/marketplace/MarketplaceSearch.d.ts +0 -18
  140. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  141. package/dist/src/marketplace/MarketplaceSearch.js +0 -36
  142. package/dist/src/marketplace/PersonaDetails.d.ts +0 -22
  143. package/dist/src/marketplace/PersonaDetails.d.ts.map +0 -1
  144. package/dist/src/marketplace/PersonaDetails.js +0 -71
  145. package/dist/src/marketplace/PersonaInstaller.d.ts +0 -25
  146. package/dist/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  147. package/dist/src/marketplace/PersonaInstaller.js +0 -100
  148. package/dist/src/marketplace/PersonaSubmitter.d.ts +0 -19
  149. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  150. package/dist/src/marketplace/PersonaSubmitter.js +0 -57
  151. package/dist/src/marketplace/index.d.ts +0 -10
  152. package/dist/src/marketplace/index.d.ts.map +0 -1
  153. package/dist/src/marketplace/index.js +0 -10
  154. package/dist/src/persona/PersonaLoader.d.ts +0 -33
  155. package/dist/src/persona/PersonaLoader.d.ts.map +0 -1
  156. package/dist/src/persona/PersonaLoader.js +0 -139
  157. package/dist/src/persona/PersonaManager.d.ts +0 -112
  158. package/dist/src/persona/PersonaManager.d.ts.map +0 -1
  159. package/dist/src/persona/PersonaManager.js +0 -341
  160. package/dist/src/persona/PersonaValidator.d.ts +0 -33
  161. package/dist/src/persona/PersonaValidator.d.ts.map +0 -1
  162. package/dist/src/persona/PersonaValidator.js +0 -157
  163. package/dist/src/persona/export-import/PersonaExporter.d.ts +0 -43
  164. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  165. package/dist/src/persona/export-import/PersonaExporter.js +0 -99
  166. package/dist/src/persona/export-import/PersonaImporter.d.ts +0 -65
  167. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  168. package/dist/src/persona/export-import/PersonaImporter.js +0 -313
  169. package/dist/src/persona/export-import/PersonaSharer.d.ts +0 -60
  170. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  171. package/dist/src/persona/export-import/PersonaSharer.js +0 -363
  172. package/dist/src/persona/export-import/index.d.ts +0 -10
  173. package/dist/src/persona/export-import/index.d.ts.map +0 -1
  174. package/dist/src/persona/export-import/index.js +0 -7
  175. package/dist/src/persona/index.d.ts +0 -7
  176. package/dist/src/persona/index.d.ts.map +0 -1
  177. package/dist/src/persona/index.js +0 -7
  178. package/dist/src/security/InputValidator.d.ts +0 -69
  179. package/dist/src/security/InputValidator.d.ts.map +0 -1
  180. package/dist/src/security/InputValidator.js +0 -381
  181. package/dist/src/security/commandValidator.d.ts +0 -7
  182. package/dist/src/security/commandValidator.d.ts.map +0 -1
  183. package/dist/src/security/commandValidator.js +0 -77
  184. package/dist/src/security/constants.d.ts +0 -21
  185. package/dist/src/security/constants.d.ts.map +0 -1
  186. package/dist/src/security/constants.js +0 -23
  187. package/dist/src/security/contentValidator.d.ts +0 -47
  188. package/dist/src/security/contentValidator.d.ts.map +0 -1
  189. package/dist/src/security/contentValidator.js +0 -188
  190. package/dist/src/security/fileLockManager.d.ts +0 -70
  191. package/dist/src/security/fileLockManager.d.ts.map +0 -1
  192. package/dist/src/security/fileLockManager.js +0 -187
  193. package/dist/src/security/index.d.ts +0 -12
  194. package/dist/src/security/index.d.ts.map +0 -1
  195. package/dist/src/security/index.js +0 -14
  196. package/dist/src/security/pathValidator.d.ts +0 -9
  197. package/dist/src/security/pathValidator.d.ts.map +0 -1
  198. package/dist/src/security/pathValidator.js +0 -97
  199. package/dist/src/security/secureYamlParser.d.ts +0 -46
  200. package/dist/src/security/secureYamlParser.d.ts.map +0 -1
  201. package/dist/src/security/secureYamlParser.js +0 -203
  202. package/dist/src/security/securityMonitor.d.ts +0 -58
  203. package/dist/src/security/securityMonitor.d.ts.map +0 -1
  204. package/dist/src/security/securityMonitor.js +0 -108
  205. package/dist/src/security/tokenManager.d.ts +0 -59
  206. package/dist/src/security/tokenManager.d.ts.map +0 -1
  207. package/dist/src/security/tokenManager.js +0 -216
  208. package/dist/src/security/yamlValidator.d.ts +0 -20
  209. package/dist/src/security/yamlValidator.d.ts.map +0 -1
  210. package/dist/src/security/yamlValidator.js +0 -138
  211. package/dist/src/server/ServerSetup.d.ts +0 -31
  212. package/dist/src/server/ServerSetup.d.ts.map +0 -1
  213. package/dist/src/server/ServerSetup.js +0 -79
  214. package/dist/src/server/index.d.ts +0 -7
  215. package/dist/src/server/index.d.ts.map +0 -1
  216. package/dist/src/server/index.js +0 -7
  217. package/dist/src/server/tools/ConfigTools.d.ts +0 -10
  218. package/dist/src/server/tools/ConfigTools.d.ts.map +0 -1
  219. package/dist/src/server/tools/ConfigTools.js +0 -63
  220. package/dist/src/server/tools/MarketplaceTools.d.ts +0 -10
  221. package/dist/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  222. package/dist/src/server/tools/MarketplaceTools.js +0 -92
  223. package/dist/src/server/tools/PersonaTools.d.ts +0 -10
  224. package/dist/src/server/tools/PersonaTools.d.ts.map +0 -1
  225. package/dist/src/server/tools/PersonaTools.js +0 -257
  226. package/dist/src/server/tools/ToolRegistry.d.ts +0 -37
  227. package/dist/src/server/tools/ToolRegistry.d.ts.map +0 -1
  228. package/dist/src/server/tools/ToolRegistry.js +0 -40
  229. package/dist/src/server/tools/UpdateTools.d.ts +0 -10
  230. package/dist/src/server/tools/UpdateTools.d.ts.map +0 -1
  231. package/dist/src/server/tools/UpdateTools.js +0 -64
  232. package/dist/src/server/tools/UserTools.d.ts +0 -10
  233. package/dist/src/server/tools/UserTools.d.ts.map +0 -1
  234. package/dist/src/server/tools/UserTools.js +0 -51
  235. package/dist/src/server/tools/index.d.ts +0 -10
  236. package/dist/src/server/tools/index.d.ts.map +0 -1
  237. package/dist/src/server/tools/index.js +0 -10
  238. package/dist/src/server/types.d.ts +0 -34
  239. package/dist/src/server/types.d.ts.map +0 -1
  240. package/dist/src/server/types.js +0 -5
  241. package/dist/src/tools/debug.d.ts +0 -20
  242. package/dist/src/tools/debug.d.ts.map +0 -1
  243. package/dist/src/tools/debug.js +0 -37
  244. package/dist/src/types/cache.d.ts +0 -8
  245. package/dist/src/types/cache.d.ts.map +0 -1
  246. package/dist/src/types/cache.js +0 -5
  247. package/dist/src/types/index.d.ts +0 -8
  248. package/dist/src/types/index.d.ts.map +0 -1
  249. package/dist/src/types/index.js +0 -8
  250. package/dist/src/types/marketplace.d.ts +0 -23
  251. package/dist/src/types/marketplace.d.ts.map +0 -1
  252. package/dist/src/types/marketplace.js +0 -5
  253. package/dist/src/types/mcp.d.ts +0 -161
  254. package/dist/src/types/mcp.d.ts.map +0 -1
  255. package/dist/src/types/mcp.js +0 -75
  256. package/dist/src/types/persona.d.ts +0 -30
  257. package/dist/src/types/persona.d.ts.map +0 -1
  258. package/dist/src/types/persona.js +0 -5
  259. package/dist/src/update/BackupManager.d.ts +0 -46
  260. package/dist/src/update/BackupManager.d.ts.map +0 -1
  261. package/dist/src/update/BackupManager.js +0 -261
  262. package/dist/src/update/DependencyChecker.d.ts +0 -41
  263. package/dist/src/update/DependencyChecker.d.ts.map +0 -1
  264. package/dist/src/update/DependencyChecker.js +0 -132
  265. package/dist/src/update/RateLimiter.d.ts +0 -80
  266. package/dist/src/update/RateLimiter.d.ts.map +0 -1
  267. package/dist/src/update/RateLimiter.js +0 -172
  268. package/dist/src/update/SignatureVerifier.d.ts +0 -71
  269. package/dist/src/update/SignatureVerifier.d.ts.map +0 -1
  270. package/dist/src/update/SignatureVerifier.js +0 -214
  271. package/dist/src/update/UpdateChecker.d.ts +0 -127
  272. package/dist/src/update/UpdateChecker.d.ts.map +0 -1
  273. package/dist/src/update/UpdateChecker.js +0 -460
  274. package/dist/src/update/UpdateManager.d.ts +0 -41
  275. package/dist/src/update/UpdateManager.d.ts.map +0 -1
  276. package/dist/src/update/UpdateManager.js +0 -260
  277. package/dist/src/update/VersionManager.d.ts +0 -31
  278. package/dist/src/update/VersionManager.d.ts.map +0 -1
  279. package/dist/src/update/VersionManager.js +0 -134
  280. package/dist/src/update/index.d.ts +0 -9
  281. package/dist/src/update/index.d.ts.map +0 -1
  282. package/dist/src/update/index.js +0 -9
  283. package/dist/src/utils/filesystem.d.ts +0 -32
  284. package/dist/src/utils/filesystem.d.ts.map +0 -1
  285. package/dist/src/utils/filesystem.js +0 -73
  286. package/dist/src/utils/git.d.ts +0 -32
  287. package/dist/src/utils/git.d.ts.map +0 -1
  288. package/dist/src/utils/git.js +0 -65
  289. package/dist/src/utils/index.d.ts +0 -7
  290. package/dist/src/utils/index.d.ts.map +0 -1
  291. package/dist/src/utils/index.js +0 -7
  292. package/dist/src/utils/logger.d.ts +0 -45
  293. package/dist/src/utils/logger.d.ts.map +0 -1
  294. package/dist/src/utils/logger.js +0 -91
  295. package/dist/src/utils/version.d.ts +0 -25
  296. package/dist/src/utils/version.d.ts.map +0 -1
  297. package/dist/src/utils/version.js +0 -97
  298. package/dist/test/src/cache/APICache.d.ts +0 -23
  299. package/dist/test/src/cache/APICache.d.ts.map +0 -1
  300. package/dist/test/src/cache/APICache.js +0 -42
  301. package/dist/test/src/cache/index.d.ts +0 -5
  302. package/dist/test/src/cache/index.d.ts.map +0 -1
  303. package/dist/test/src/cache/index.js +0 -5
  304. package/dist/test/src/collection/CollectionBrowser.d.ts +0 -24
  305. package/dist/test/src/collection/CollectionBrowser.d.ts.map +0 -1
  306. package/dist/test/src/collection/CollectionBrowser.js +0 -115
  307. package/dist/test/src/collection/CollectionSearch.d.ts +0 -18
  308. package/dist/test/src/collection/CollectionSearch.d.ts.map +0 -1
  309. package/dist/test/src/collection/CollectionSearch.js +0 -48
  310. package/dist/test/src/collection/GitHubClient.d.ts +0 -22
  311. package/dist/test/src/collection/GitHubClient.d.ts.map +0 -1
  312. package/dist/test/src/collection/GitHubClient.js +0 -114
  313. package/dist/test/src/collection/PersonaDetails.d.ts +0 -22
  314. package/dist/test/src/collection/PersonaDetails.d.ts.map +0 -1
  315. package/dist/test/src/collection/PersonaDetails.js +0 -71
  316. package/dist/test/src/collection/PersonaInstaller.d.ts +0 -26
  317. package/dist/test/src/collection/PersonaInstaller.d.ts.map +0 -1
  318. package/dist/test/src/collection/PersonaInstaller.js +0 -103
  319. package/dist/test/src/collection/PersonaSubmitter.d.ts +0 -19
  320. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +0 -1
  321. package/dist/test/src/collection/PersonaSubmitter.js +0 -57
  322. package/dist/test/src/collection/index.d.ts +0 -10
  323. package/dist/test/src/collection/index.d.ts.map +0 -1
  324. package/dist/test/src/collection/index.js +0 -10
  325. package/dist/test/src/config/constants.d.ts +0 -25
  326. package/dist/test/src/config/constants.d.ts.map +0 -1
  327. package/dist/test/src/config/constants.js +0 -30
  328. package/dist/test/src/config/index.d.ts +0 -6
  329. package/dist/test/src/config/index.d.ts.map +0 -1
  330. package/dist/test/src/config/index.js +0 -6
  331. package/dist/test/src/config/indicator-config.d.ts +0 -107
  332. package/dist/test/src/config/indicator-config.d.ts.map +0 -1
  333. package/dist/test/src/config/indicator-config.js +0 -158
  334. package/dist/test/src/constants/defaultPersonas.d.ts +0 -10
  335. package/dist/test/src/constants/defaultPersonas.d.ts.map +0 -1
  336. package/dist/test/src/constants/defaultPersonas.js +0 -18
  337. package/dist/test/src/constants/limits.d.ts +0 -10
  338. package/dist/test/src/constants/limits.d.ts.map +0 -1
  339. package/dist/test/src/constants/limits.js +0 -13
  340. package/dist/test/src/elements/BaseElement.d.ts +0 -81
  341. package/dist/test/src/elements/BaseElement.d.ts.map +0 -1
  342. package/dist/test/src/elements/BaseElement.js +0 -381
  343. package/dist/test/src/elements/FeedbackProcessor.d.ts +0 -57
  344. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +0 -1
  345. package/dist/test/src/elements/FeedbackProcessor.js +0 -418
  346. package/dist/test/src/elements/agents/Agent.d.ts +0 -145
  347. package/dist/test/src/elements/agents/Agent.d.ts.map +0 -1
  348. package/dist/test/src/elements/agents/Agent.js +0 -848
  349. package/dist/test/src/elements/agents/AgentManager.d.ts +0 -125
  350. package/dist/test/src/elements/agents/AgentManager.d.ts.map +0 -1
  351. package/dist/test/src/elements/agents/AgentManager.js +0 -608
  352. package/dist/test/src/elements/agents/constants.d.ts +0 -42
  353. package/dist/test/src/elements/agents/constants.d.ts.map +0 -1
  354. package/dist/test/src/elements/agents/constants.js +0 -45
  355. package/dist/test/src/elements/agents/goalTemplates.d.ts +0 -44
  356. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +0 -1
  357. package/dist/test/src/elements/agents/goalTemplates.js +0 -297
  358. package/dist/test/src/elements/agents/index.d.ts +0 -8
  359. package/dist/test/src/elements/agents/index.d.ts.map +0 -1
  360. package/dist/test/src/elements/agents/index.js +0 -8
  361. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +0 -76
  362. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +0 -1
  363. package/dist/test/src/elements/agents/ruleEngineConfig.js +0 -143
  364. package/dist/test/src/elements/agents/types.d.ts +0 -97
  365. package/dist/test/src/elements/agents/types.d.ts.map +0 -1
  366. package/dist/test/src/elements/agents/types.js +0 -5
  367. package/dist/test/src/elements/index.d.ts +0 -6
  368. package/dist/test/src/elements/index.d.ts.map +0 -1
  369. package/dist/test/src/elements/index.js +0 -6
  370. package/dist/test/src/elements/memories/Memory.d.ts +0 -110
  371. package/dist/test/src/elements/memories/Memory.d.ts.map +0 -1
  372. package/dist/test/src/elements/memories/Memory.js +0 -470
  373. package/dist/test/src/elements/memories/MemoryManager.d.ts +0 -86
  374. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +0 -1
  375. package/dist/test/src/elements/memories/MemoryManager.js +0 -435
  376. package/dist/test/src/elements/memories/constants.d.ts +0 -42
  377. package/dist/test/src/elements/memories/constants.d.ts.map +0 -1
  378. package/dist/test/src/elements/memories/constants.js +0 -49
  379. package/dist/test/src/elements/memories/index.d.ts +0 -6
  380. package/dist/test/src/elements/memories/index.d.ts.map +0 -1
  381. package/dist/test/src/elements/memories/index.js +0 -6
  382. package/dist/test/src/elements/skills/Skill.d.ts +0 -109
  383. package/dist/test/src/elements/skills/Skill.d.ts.map +0 -1
  384. package/dist/test/src/elements/skills/Skill.js +0 -381
  385. package/dist/test/src/elements/templates/Template.d.ts +0 -138
  386. package/dist/test/src/elements/templates/Template.d.ts.map +0 -1
  387. package/dist/test/src/elements/templates/Template.js +0 -673
  388. package/dist/test/src/elements/templates/TemplateManager.d.ts +0 -104
  389. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +0 -1
  390. package/dist/test/src/elements/templates/TemplateManager.js +0 -496
  391. package/dist/test/src/elements/templates/index.d.ts +0 -6
  392. package/dist/test/src/elements/templates/index.d.ts.map +0 -1
  393. package/dist/test/src/elements/templates/index.js +0 -6
  394. package/dist/test/src/errors/SecurityError.d.ts +0 -29
  395. package/dist/test/src/errors/SecurityError.d.ts.map +0 -1
  396. package/dist/test/src/errors/SecurityError.js +0 -47
  397. package/dist/test/src/errors/index.d.ts +0 -2
  398. package/dist/test/src/errors/index.d.ts.map +0 -1
  399. package/dist/test/src/errors/index.js +0 -2
  400. package/dist/test/src/index.barrel.d.ts +0 -21
  401. package/dist/test/src/index.barrel.d.ts.map +0 -1
  402. package/dist/test/src/index.barrel.js +0 -31
  403. package/dist/test/src/index.d.ts +0 -223
  404. package/dist/test/src/index.d.ts.map +0 -1
  405. package/dist/test/src/index.js +0 -1594
  406. package/dist/test/src/marketplace/GitHubClient.d.ts +0 -22
  407. package/dist/test/src/marketplace/GitHubClient.d.ts.map +0 -1
  408. package/dist/test/src/marketplace/GitHubClient.js +0 -112
  409. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  410. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  411. package/dist/test/src/marketplace/MarketplaceBrowser.js +0 -45
  412. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +0 -18
  413. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  414. package/dist/test/src/marketplace/MarketplaceSearch.js +0 -36
  415. package/dist/test/src/marketplace/PersonaDetails.d.ts +0 -22
  416. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +0 -1
  417. package/dist/test/src/marketplace/PersonaDetails.js +0 -71
  418. package/dist/test/src/marketplace/PersonaInstaller.d.ts +0 -25
  419. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  420. package/dist/test/src/marketplace/PersonaInstaller.js +0 -100
  421. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +0 -19
  422. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  423. package/dist/test/src/marketplace/PersonaSubmitter.js +0 -57
  424. package/dist/test/src/marketplace/index.d.ts +0 -10
  425. package/dist/test/src/marketplace/index.d.ts.map +0 -1
  426. package/dist/test/src/marketplace/index.js +0 -10
  427. package/dist/test/src/persona/PersonaElement.d.ts +0 -64
  428. package/dist/test/src/persona/PersonaElement.d.ts.map +0 -1
  429. package/dist/test/src/persona/PersonaElement.js +0 -223
  430. package/dist/test/src/persona/PersonaElementManager.d.ts +0 -97
  431. package/dist/test/src/persona/PersonaElementManager.d.ts.map +0 -1
  432. package/dist/test/src/persona/PersonaElementManager.js +0 -342
  433. package/dist/test/src/persona/PersonaLoader.d.ts +0 -34
  434. package/dist/test/src/persona/PersonaLoader.d.ts.map +0 -1
  435. package/dist/test/src/persona/PersonaLoader.js +0 -145
  436. package/dist/test/src/persona/PersonaManager.d.ts +0 -112
  437. package/dist/test/src/persona/PersonaManager.d.ts.map +0 -1
  438. package/dist/test/src/persona/PersonaManager.js +0 -341
  439. package/dist/test/src/persona/PersonaValidator.d.ts +0 -33
  440. package/dist/test/src/persona/PersonaValidator.d.ts.map +0 -1
  441. package/dist/test/src/persona/PersonaValidator.js +0 -157
  442. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +0 -43
  443. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  444. package/dist/test/src/persona/export-import/PersonaExporter.js +0 -99
  445. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +0 -65
  446. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  447. package/dist/test/src/persona/export-import/PersonaImporter.js +0 -315
  448. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +0 -60
  449. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  450. package/dist/test/src/persona/export-import/PersonaSharer.js +0 -502
  451. package/dist/test/src/persona/export-import/index.d.ts +0 -10
  452. package/dist/test/src/persona/export-import/index.d.ts.map +0 -1
  453. package/dist/test/src/persona/export-import/index.js +0 -7
  454. package/dist/test/src/persona/index.d.ts +0 -7
  455. package/dist/test/src/persona/index.d.ts.map +0 -1
  456. package/dist/test/src/persona/index.js +0 -7
  457. package/dist/test/src/portfolio/MigrationManager.d.ts +0 -44
  458. package/dist/test/src/portfolio/MigrationManager.d.ts.map +0 -1
  459. package/dist/test/src/portfolio/MigrationManager.js +0 -163
  460. package/dist/test/src/portfolio/PortfolioManager.d.ts +0 -54
  461. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +0 -1
  462. package/dist/test/src/portfolio/PortfolioManager.js +0 -224
  463. package/dist/test/src/portfolio/types.d.ts +0 -18
  464. package/dist/test/src/portfolio/types.d.ts.map +0 -1
  465. package/dist/test/src/portfolio/types.js +0 -13
  466. package/dist/test/src/security/InputValidator.d.ts +0 -80
  467. package/dist/test/src/security/InputValidator.d.ts.map +0 -1
  468. package/dist/test/src/security/InputValidator.js +0 -436
  469. package/dist/test/src/security/audit/SecurityAuditor.d.ts +0 -44
  470. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +0 -1
  471. package/dist/test/src/security/audit/SecurityAuditor.js +0 -274
  472. package/dist/test/src/security/audit/config/suppressions.d.ts +0 -34
  473. package/dist/test/src/security/audit/config/suppressions.d.ts.map +0 -1
  474. package/dist/test/src/security/audit/config/suppressions.js +0 -575
  475. package/dist/test/src/security/audit/index.d.ts +0 -14
  476. package/dist/test/src/security/audit/index.d.ts.map +0 -1
  477. package/dist/test/src/security/audit/index.js +0 -15
  478. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +0 -46
  479. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +0 -1
  480. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +0 -174
  481. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +0 -13
  482. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +0 -1
  483. package/dist/test/src/security/audit/reporters/JsonReporter.js +0 -25
  484. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +0 -13
  485. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +0 -1
  486. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +0 -79
  487. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +0 -20
  488. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +0 -1
  489. package/dist/test/src/security/audit/rules/SecurityRules.js +0 -244
  490. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +0 -47
  491. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +0 -1
  492. package/dist/test/src/security/audit/scanners/CodeScanner.js +0 -174
  493. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +0 -13
  494. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +0 -1
  495. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +0 -22
  496. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +0 -13
  497. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +0 -1
  498. package/dist/test/src/security/audit/scanners/DependencyScanner.js +0 -22
  499. package/dist/test/src/security/audit/types.d.ts +0 -94
  500. package/dist/test/src/security/audit/types.d.ts.map +0 -1
  501. package/dist/test/src/security/audit/types.js +0 -6
  502. package/dist/test/src/security/commandValidator.d.ts +0 -7
  503. package/dist/test/src/security/commandValidator.d.ts.map +0 -1
  504. package/dist/test/src/security/commandValidator.js +0 -78
  505. package/dist/test/src/security/constants.d.ts +0 -24
  506. package/dist/test/src/security/constants.d.ts.map +0 -1
  507. package/dist/test/src/security/constants.js +0 -26
  508. package/dist/test/src/security/contentValidator.d.ts +0 -47
  509. package/dist/test/src/security/contentValidator.d.ts.map +0 -1
  510. package/dist/test/src/security/contentValidator.js +0 -301
  511. package/dist/test/src/security/errors.d.ts +0 -14
  512. package/dist/test/src/security/errors.d.ts.map +0 -1
  513. package/dist/test/src/security/errors.js +0 -28
  514. package/dist/test/src/security/fileLockManager.d.ts +0 -70
  515. package/dist/test/src/security/fileLockManager.d.ts.map +0 -1
  516. package/dist/test/src/security/fileLockManager.js +0 -187
  517. package/dist/test/src/security/index.d.ts +0 -12
  518. package/dist/test/src/security/index.d.ts.map +0 -1
  519. package/dist/test/src/security/index.js +0 -14
  520. package/dist/test/src/security/pathValidator.d.ts +0 -9
  521. package/dist/test/src/security/pathValidator.d.ts.map +0 -1
  522. package/dist/test/src/security/pathValidator.js +0 -98
  523. package/dist/test/src/security/regexValidator.d.ts +0 -59
  524. package/dist/test/src/security/regexValidator.d.ts.map +0 -1
  525. package/dist/test/src/security/regexValidator.js +0 -214
  526. package/dist/test/src/security/secureYamlParser.d.ts +0 -46
  527. package/dist/test/src/security/secureYamlParser.d.ts.map +0 -1
  528. package/dist/test/src/security/secureYamlParser.js +0 -203
  529. package/dist/test/src/security/securityMonitor.d.ts +0 -58
  530. package/dist/test/src/security/securityMonitor.d.ts.map +0 -1
  531. package/dist/test/src/security/securityMonitor.js +0 -108
  532. package/dist/test/src/security/tokenManager.d.ts +0 -85
  533. package/dist/test/src/security/tokenManager.d.ts.map +0 -1
  534. package/dist/test/src/security/tokenManager.js +0 -286
  535. package/dist/test/src/security/validators/unicodeValidator.d.ts +0 -97
  536. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +0 -1
  537. package/dist/test/src/security/validators/unicodeValidator.js +0 -312
  538. package/dist/test/src/security/yamlValidator.d.ts +0 -21
  539. package/dist/test/src/security/yamlValidator.d.ts.map +0 -1
  540. package/dist/test/src/security/yamlValidator.js +0 -164
  541. package/dist/test/src/server/ServerSetup.d.ts +0 -35
  542. package/dist/test/src/server/ServerSetup.d.ts.map +0 -1
  543. package/dist/test/src/server/ServerSetup.js +0 -116
  544. package/dist/test/src/server/index.d.ts +0 -7
  545. package/dist/test/src/server/index.d.ts.map +0 -1
  546. package/dist/test/src/server/index.js +0 -7
  547. package/dist/test/src/server/startup.d.ts +0 -31
  548. package/dist/test/src/server/startup.d.ts.map +0 -1
  549. package/dist/test/src/server/startup.js +0 -67
  550. package/dist/test/src/server/tools/CollectionTools.d.ts +0 -10
  551. package/dist/test/src/server/tools/CollectionTools.d.ts.map +0 -1
  552. package/dist/test/src/server/tools/CollectionTools.js +0 -96
  553. package/dist/test/src/server/tools/ConfigTools.d.ts +0 -10
  554. package/dist/test/src/server/tools/ConfigTools.d.ts.map +0 -1
  555. package/dist/test/src/server/tools/ConfigTools.js +0 -63
  556. package/dist/test/src/server/tools/MarketplaceTools.d.ts +0 -10
  557. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  558. package/dist/test/src/server/tools/MarketplaceTools.js +0 -92
  559. package/dist/test/src/server/tools/PersonaTools.d.ts +0 -10
  560. package/dist/test/src/server/tools/PersonaTools.d.ts.map +0 -1
  561. package/dist/test/src/server/tools/PersonaTools.js +0 -257
  562. package/dist/test/src/server/tools/ToolRegistry.d.ts +0 -37
  563. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +0 -1
  564. package/dist/test/src/server/tools/ToolRegistry.js +0 -40
  565. package/dist/test/src/server/tools/UpdateTools.d.ts +0 -10
  566. package/dist/test/src/server/tools/UpdateTools.d.ts.map +0 -1
  567. package/dist/test/src/server/tools/UpdateTools.js +0 -64
  568. package/dist/test/src/server/tools/UserTools.d.ts +0 -10
  569. package/dist/test/src/server/tools/UserTools.d.ts.map +0 -1
  570. package/dist/test/src/server/tools/UserTools.js +0 -51
  571. package/dist/test/src/server/tools/index.d.ts +0 -10
  572. package/dist/test/src/server/tools/index.d.ts.map +0 -1
  573. package/dist/test/src/server/tools/index.js +0 -10
  574. package/dist/test/src/server/types.d.ts +0 -34
  575. package/dist/test/src/server/types.d.ts.map +0 -1
  576. package/dist/test/src/server/types.js +0 -5
  577. package/dist/test/src/tools/debug.d.ts +0 -20
  578. package/dist/test/src/tools/debug.d.ts.map +0 -1
  579. package/dist/test/src/tools/debug.js +0 -37
  580. package/dist/test/src/types/cache.d.ts +0 -8
  581. package/dist/test/src/types/cache.d.ts.map +0 -1
  582. package/dist/test/src/types/cache.js +0 -5
  583. package/dist/test/src/types/collection.d.ts +0 -23
  584. package/dist/test/src/types/collection.d.ts.map +0 -1
  585. package/dist/test/src/types/collection.js +0 -5
  586. package/dist/test/src/types/elements/IElement.d.ts +0 -123
  587. package/dist/test/src/types/elements/IElement.d.ts.map +0 -1
  588. package/dist/test/src/types/elements/IElement.js +0 -30
  589. package/dist/test/src/types/elements/IElementManager.d.ts +0 -65
  590. package/dist/test/src/types/elements/IElementManager.d.ts.map +0 -1
  591. package/dist/test/src/types/elements/IElementManager.js +0 -6
  592. package/dist/test/src/types/elements/IRatingManager.d.ts +0 -109
  593. package/dist/test/src/types/elements/IRatingManager.d.ts.map +0 -1
  594. package/dist/test/src/types/elements/IRatingManager.js +0 -6
  595. package/dist/test/src/types/elements/IReferenceResolver.d.ts +0 -52
  596. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +0 -1
  597. package/dist/test/src/types/elements/IReferenceResolver.js +0 -6
  598. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +0 -49
  599. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +0 -1
  600. package/dist/test/src/types/elements/RatingBreakdowns.js +0 -6
  601. package/dist/test/src/types/elements/index.d.ts +0 -9
  602. package/dist/test/src/types/elements/index.d.ts.map +0 -1
  603. package/dist/test/src/types/elements/index.js +0 -11
  604. package/dist/test/src/types/index.d.ts +0 -9
  605. package/dist/test/src/types/index.d.ts.map +0 -1
  606. package/dist/test/src/types/index.js +0 -9
  607. package/dist/test/src/types/marketplace.d.ts +0 -23
  608. package/dist/test/src/types/marketplace.d.ts.map +0 -1
  609. package/dist/test/src/types/marketplace.js +0 -5
  610. package/dist/test/src/types/mcp.d.ts +0 -84
  611. package/dist/test/src/types/mcp.d.ts.map +0 -1
  612. package/dist/test/src/types/mcp.js +0 -80
  613. package/dist/test/src/types/persona.d.ts +0 -30
  614. package/dist/test/src/types/persona.d.ts.map +0 -1
  615. package/dist/test/src/types/persona.js +0 -5
  616. package/dist/test/src/update/BackupManager.d.ts +0 -46
  617. package/dist/test/src/update/BackupManager.d.ts.map +0 -1
  618. package/dist/test/src/update/BackupManager.js +0 -261
  619. package/dist/test/src/update/DependencyChecker.d.ts +0 -41
  620. package/dist/test/src/update/DependencyChecker.d.ts.map +0 -1
  621. package/dist/test/src/update/DependencyChecker.js +0 -132
  622. package/dist/test/src/update/RateLimiter.d.ts +0 -80
  623. package/dist/test/src/update/RateLimiter.d.ts.map +0 -1
  624. package/dist/test/src/update/RateLimiter.js +0 -172
  625. package/dist/test/src/update/SignatureVerifier.d.ts +0 -71
  626. package/dist/test/src/update/SignatureVerifier.d.ts.map +0 -1
  627. package/dist/test/src/update/SignatureVerifier.js +0 -214
  628. package/dist/test/src/update/UpdateChecker.d.ts +0 -127
  629. package/dist/test/src/update/UpdateChecker.d.ts.map +0 -1
  630. package/dist/test/src/update/UpdateChecker.js +0 -469
  631. package/dist/test/src/update/UpdateManager.d.ts +0 -41
  632. package/dist/test/src/update/UpdateManager.d.ts.map +0 -1
  633. package/dist/test/src/update/UpdateManager.js +0 -260
  634. package/dist/test/src/update/VersionManager.d.ts +0 -31
  635. package/dist/test/src/update/VersionManager.d.ts.map +0 -1
  636. package/dist/test/src/update/VersionManager.js +0 -134
  637. package/dist/test/src/update/index.d.ts +0 -9
  638. package/dist/test/src/update/index.d.ts.map +0 -1
  639. package/dist/test/src/update/index.js +0 -9
  640. package/dist/test/src/utils/filesystem.d.ts +0 -29
  641. package/dist/test/src/utils/filesystem.d.ts.map +0 -1
  642. package/dist/test/src/utils/filesystem.js +0 -94
  643. package/dist/test/src/utils/git.d.ts +0 -32
  644. package/dist/test/src/utils/git.d.ts.map +0 -1
  645. package/dist/test/src/utils/git.js +0 -65
  646. package/dist/test/src/utils/index.d.ts +0 -7
  647. package/dist/test/src/utils/index.d.ts.map +0 -1
  648. package/dist/test/src/utils/index.js +0 -7
  649. package/dist/test/src/utils/logger.d.ts +0 -45
  650. package/dist/test/src/utils/logger.d.ts.map +0 -1
  651. package/dist/test/src/utils/logger.js +0 -91
  652. package/dist/test/src/utils/version.d.ts +0 -25
  653. package/dist/test/src/utils/version.d.ts.map +0 -1
  654. package/dist/test/src/utils/version.js +0 -97
  655. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +0 -33
  656. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +0 -1
  657. package/dist/test/test/__tests__/integration/helpers/file-utils.js +0 -83
  658. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +0 -26
  659. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +0 -1
  660. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +0 -95
  661. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +0 -26
  662. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +0 -1
  663. package/dist/test/test/__tests__/integration/helpers/test-server.js +0 -41
  664. package/dist/test/test/__tests__/integration/setup.d.ts +0 -8
  665. package/dist/test/test/__tests__/integration/setup.d.ts.map +0 -1
  666. package/dist/test/test/__tests__/integration/setup.js +0 -31
  667. package/dist/test/test/__tests__/integration/teardown.d.ts +0 -5
  668. package/dist/test/test/__tests__/integration/teardown.d.ts.map +0 -1
  669. package/dist/test/test/__tests__/integration/teardown.js +0 -23
  670. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +0 -34
  671. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +0 -1
  672. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +0 -224
  673. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +0 -89
  674. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +0 -1
  675. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +0 -543
  676. package/dist/test/test/__tests__/security/index.d.ts +0 -46
  677. package/dist/test/test/__tests__/security/index.d.ts.map +0 -1
  678. package/dist/test/test/__tests__/security/index.js +0 -98
  679. package/dist/test/test/__tests__/security/setup.d.ts +0 -3
  680. package/dist/test/test/__tests__/security/setup.d.ts.map +0 -1
  681. package/dist/test/test/__tests__/security/setup.js +0 -23
  682. package/dist/types/marketplace.d.ts +0 -23
  683. package/dist/types/marketplace.d.ts.map +0 -1
  684. package/dist/types/marketplace.js +0 -5
@@ -1,469 +0,0 @@
1
- /**
2
- * UpdateChecker - Secure GitHub release update checking with comprehensive sanitization
3
- *
4
- * Security measures implemented:
5
- * 1. XSS Protection: DOMPurify with strict no-tags/no-attributes policy
6
- * 2. Command Injection Prevention: Multiple regex patterns for various escape sequences
7
- * 3. URL Validation: Whitelist approach allowing only http/https schemes
8
- * 4. Information Disclosure Prevention: Sanitized logging of sensitive data
9
- * 5. Length Limits: Configurable limits to prevent DoS attacks
10
- * 6. OWASP Patterns: Protection against PHP, ASP, hex, unicode, and octal escapes
11
- *
12
- * Performance optimizations:
13
- * - Cached DOMPurify instance to avoid recreation overhead
14
- * - Single-pass regex processing for injection patterns
15
- * - Exponential backoff for network retries
16
- */
17
- import { RELEASES_API_URL } from '../config/constants.js';
18
- import { RateLimiterFactory } from './RateLimiter.js';
19
- import { SignatureVerifier } from './SignatureVerifier.js';
20
- import DOMPurify from 'dompurify';
21
- import { JSDOM } from 'jsdom';
22
- import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
23
- export class UpdateChecker {
24
- versionManager;
25
- rateLimiter;
26
- signatureVerifier;
27
- // Static cache for DOMPurify to improve performance
28
- // We use 'any' for JSDOM window to avoid complex type conflicts
29
- // but maintain type safety for DOMPurify instance
30
- static purifyWindow = null;
31
- static purify = null;
32
- // Security configuration with sensible defaults
33
- releaseNotesMaxLength;
34
- urlMaxLength;
35
- securityLogger;
36
- requireSignedReleases;
37
- constructor(versionManager, options) {
38
- if (!versionManager) {
39
- throw new Error('VersionManager is required');
40
- }
41
- this.versionManager = versionManager;
42
- // Apply options with defaults and validation
43
- this.releaseNotesMaxLength = options?.releaseNotesMaxLength ?? 5000;
44
- this.urlMaxLength = options?.urlMaxLength ?? 2048;
45
- this.securityLogger = options?.securityLogger;
46
- // Use provided rate limiter or create default
47
- this.rateLimiter = options?.rateLimiter || RateLimiterFactory.createUpdateCheckLimiter();
48
- // Determine if we're in production environment
49
- const isProduction = process.env.NODE_ENV === 'production' ||
50
- process.env.CI === 'true' ||
51
- !process.env.ALLOW_UNSIGNED_RELEASES;
52
- // Use provided signature verifier or create default
53
- this.signatureVerifier = options?.signatureVerifier || new SignatureVerifier({
54
- // In production, we should require signed releases
55
- allowUnsignedInDev: !isProduction
56
- });
57
- // Whether to require signed releases (default: true in production)
58
- this.requireSignedReleases = options?.requireSignedReleases ?? isProduction;
59
- // Validate configuration for security
60
- if (this.releaseNotesMaxLength < 100) {
61
- throw new Error('releaseNotesMaxLength must be at least 100 characters for security');
62
- }
63
- if (this.urlMaxLength < 50) {
64
- throw new Error('urlMaxLength must be at least 50 characters');
65
- }
66
- // Initialize cached DOMPurify instance for performance
67
- // This avoids creating a new JSDOM window for each sanitization
68
- if (!UpdateChecker.purifyWindow) {
69
- const dom = new JSDOM('');
70
- UpdateChecker.purifyWindow = dom.window;
71
- // DOMPurify expects a Window-like object from JSDOM
72
- UpdateChecker.purify = DOMPurify(UpdateChecker.purifyWindow);
73
- }
74
- }
75
- /**
76
- * Execute a network operation with retry logic and exponential backoff
77
- * @param operation - The async operation to execute
78
- * @param maxRetries - Maximum number of retry attempts (default: 3)
79
- * @param baseDelay - Base delay in milliseconds for exponential backoff (default: 1000ms)
80
- * @returns Promise resolving to the operation result
81
- * @throws The last error if all retries fail
82
- */
83
- async retryNetworkOperation(operation, maxRetries = 3, baseDelay = 1000) {
84
- let lastError;
85
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
86
- try {
87
- return await operation();
88
- }
89
- catch (error) {
90
- lastError = error;
91
- // Don't retry on the last attempt
92
- if (attempt === maxRetries) {
93
- break;
94
- }
95
- // Don't retry certain errors (like 404, 401)
96
- if (error instanceof Error && error.message.includes('404')) {
97
- break;
98
- }
99
- // Calculate delay with exponential backoff
100
- const delay = baseDelay * Math.pow(2, attempt);
101
- await new Promise(resolve => setTimeout(resolve, delay));
102
- }
103
- }
104
- throw lastError;
105
- }
106
- /**
107
- * Check for updates from GitHub releases with security and error handling
108
- * @returns UpdateCheckResult if update info is available, null if no releases found
109
- * @throws Error for network or API failures or rate limit exceeded
110
- */
111
- async checkForUpdates() {
112
- // Check rate limit before making API request
113
- const rateLimitStatus = this.rateLimiter.checkLimit();
114
- if (!rateLimitStatus.allowed) {
115
- const waitTime = Math.ceil(rateLimitStatus.retryAfterMs / 1000);
116
- const waitMinutes = Math.floor(waitTime / 60);
117
- const waitSeconds = waitTime % 60;
118
- const timeStr = waitMinutes > 0
119
- ? `${waitMinutes} minute${waitMinutes > 1 ? 's' : ''} ${waitSeconds} second${waitSeconds !== 1 ? 's' : ''}`
120
- : `${waitSeconds} second${waitSeconds !== 1 ? 's' : ''}`;
121
- throw new Error(`Rate limit exceeded. Please wait ${timeStr} before checking for updates again. ` +
122
- `(${rateLimitStatus.remainingTokens} requests remaining, resets at ${rateLimitStatus.resetTime.toLocaleTimeString()})`);
123
- }
124
- // Consume a rate limit token
125
- this.rateLimiter.consumeToken();
126
- const currentVersion = await this.versionManager.getCurrentVersion();
127
- // Check GitHub releases API for latest version with retry logic
128
- const response = await this.retryNetworkOperation(async () => {
129
- const controller = new AbortController();
130
- const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout
131
- try {
132
- const response = await fetch(RELEASES_API_URL, {
133
- headers: {
134
- 'Accept': 'application/vnd.github.v3+json',
135
- 'User-Agent': 'DollhouseMCP/1.0'
136
- },
137
- signal: controller.signal
138
- });
139
- clearTimeout(timeoutId);
140
- return response;
141
- }
142
- catch (error) {
143
- clearTimeout(timeoutId);
144
- throw error;
145
- }
146
- });
147
- if (!response.ok) {
148
- if (response.status === 404) {
149
- return null; // No releases found
150
- }
151
- throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);
152
- }
153
- const releaseData = await response.json();
154
- const tagName = releaseData.tag_name;
155
- const latestVersion = tagName?.replace(/^v/, '') || releaseData.name;
156
- // Use consistent date formatting method
157
- const publishedAt = releaseData.published_at;
158
- // Compare versions
159
- const isUpdateAvailable = this.versionManager.compareVersions(currentVersion, latestVersion) < 0;
160
- const releaseNotes = releaseData.body || 'See release notes on GitHub';
161
- // Verify release signature if we have a tag
162
- let signatureVerified = false;
163
- let signerInfo;
164
- if (tagName) {
165
- try {
166
- const verificationResult = await this.signatureVerifier.verifyTagSignature(tagName);
167
- signatureVerified = verificationResult.verified;
168
- if (verificationResult.signerEmail) {
169
- signerInfo = verificationResult.signerEmail;
170
- if (verificationResult.signerKey) {
171
- signerInfo += ` (${verificationResult.signerKey})`;
172
- }
173
- }
174
- // Log signature verification
175
- if (this.securityLogger) {
176
- this.securityLogger('signature_verification', {
177
- tagName,
178
- verified: signatureVerified,
179
- signerKey: verificationResult.signerKey,
180
- error: verificationResult.error
181
- });
182
- }
183
- // If signature verification is required and failed, throw error
184
- if (this.requireSignedReleases && !signatureVerified) {
185
- throw new Error(`Release signature verification failed: ${verificationResult.error || 'Unknown error'}. ` +
186
- 'Only signed releases are accepted in production mode.');
187
- }
188
- }
189
- catch (error) {
190
- // If we can't verify the signature and it's required, fail
191
- if (this.requireSignedReleases) {
192
- throw error;
193
- }
194
- // Otherwise, log and continue
195
- if (this.securityLogger) {
196
- this.securityLogger('signature_verification_error', {
197
- tagName,
198
- error: error instanceof Error ? error.message : String(error)
199
- });
200
- }
201
- }
202
- }
203
- return {
204
- currentVersion,
205
- latestVersion,
206
- isUpdateAvailable,
207
- releaseDate: publishedAt, // Will be formatted by formatDate() when displayed
208
- releaseNotes,
209
- releaseUrl: releaseData.html_url,
210
- tagName,
211
- signatureVerified,
212
- signerInfo
213
- };
214
- }
215
- /**
216
- * Get current rate limit status
217
- * @returns Current rate limit status including remaining requests and reset time
218
- */
219
- getRateLimitStatus() {
220
- const status = this.rateLimiter.getStatus();
221
- return {
222
- allowed: status.allowed,
223
- remainingRequests: status.remainingTokens,
224
- resetTime: status.resetTime,
225
- waitTimeSeconds: status.retryAfterMs ? Math.ceil(status.retryAfterMs / 1000) : undefined
226
- };
227
- }
228
- /**
229
- * Format update check results for display with comprehensive sanitization
230
- * @param result - The update check result to format
231
- * @param error - Optional error from update check
232
- * @param personaIndicator - Optional persona indicator prefix
233
- * @returns Formatted string safe for display
234
- */
235
- formatUpdateCheckResult(result, error, personaIndicator = '') {
236
- if (error) {
237
- const isAbortError = error.name === 'AbortError';
238
- const errorMessage = error.message || String(error);
239
- const isRateLimitError = errorMessage.includes('Rate limit exceeded');
240
- if (isRateLimitError) {
241
- return personaIndicator +
242
- '⏳ **Rate Limit Exceeded**\n\n' +
243
- error.message + '\n\n' +
244
- '**Why this happens:**\n' +
245
- '• Update checks are limited to prevent API abuse\n' +
246
- '• GitHub API has rate limits for all applications\n\n' +
247
- '**What you can do:**\n' +
248
- '• Wait for the specified time before checking again\n' +
249
- '• Use `get_server_status` to see current version without API calls\n' +
250
- '• Visit https://github.com/DollhouseMCP/mcp-server/releases directly';
251
- }
252
- return personaIndicator +
253
- '❌ **Update Check Failed**\n\n' +
254
- 'Error: ' + errorMessage + '\n\n' +
255
- (isAbortError
256
- ? 'The request timed out. Please check your internet connection and try again.'
257
- : 'Tips:\n' +
258
- '• Check your internet connection\n' +
259
- '• Ensure GitHub.com is accessible\n' +
260
- '• Try running `update_server true` for manual update\n' +
261
- '• Visit https://github.com/DollhouseMCP/mcp-server/releases');
262
- }
263
- if (!result) {
264
- const currentVersion = 'unknown';
265
- return personaIndicator +
266
- '📦 **Update Check Complete**\n\n' +
267
- '🔄 **Current Version:** ' + currentVersion + '\n' +
268
- '📡 **Remote Status:** No releases found on GitHub\n' +
269
- 'ℹ️ **Note:** This may be a development version or releases haven\'t been published yet.\n\n' +
270
- '**Manual Update:**\n' +
271
- 'Use `update_server true` to pull latest changes from main branch.';
272
- }
273
- const statusParts = [
274
- personaIndicator + '📦 **Update Check Complete**\n\n',
275
- '🔄 **Current Version:** ' + result.currentVersion + '\n',
276
- '📡 **Latest Version:** ' + result.latestVersion + '\n',
277
- '📅 **Released:** ' + this.formatDate(result.releaseDate) + '\n'
278
- ];
279
- // Add signature verification status
280
- if (result.signatureVerified !== undefined) {
281
- if (result.signatureVerified) {
282
- statusParts.push('✅ **Signature:** Verified');
283
- if (result.signerInfo) {
284
- statusParts.push(` by ${result.signerInfo}`);
285
- }
286
- statusParts.push('\n');
287
- }
288
- else {
289
- statusParts.push('⚠️ **Signature:** Not verified\n');
290
- }
291
- }
292
- statusParts.push('\n');
293
- if (result.isUpdateAvailable) {
294
- statusParts.push('✨ **Update Available!**\n\n', '**What\'s New:**\n' + this.sanitizeReleaseNotes(result.releaseNotes) + '\n\n', '**To Update:**\n', '• Use: `update_server true`\n', '• Or visit: ' + this.sanitizeUrl(result.releaseUrl) + '\n\n', '⚠️ **Note:** Update will restart the server and reload all personas.');
295
- }
296
- else {
297
- statusParts.push('✅ **You\'re Up to Date!**\n\n', 'Your DollhouseMCP installation is current.\n', 'Check back later for new features and improvements.');
298
- }
299
- return statusParts.join('');
300
- }
301
- /**
302
- * Sanitize URLs to prevent dangerous schemes and information disclosure
303
- *
304
- * Security measures:
305
- * - Length validation to prevent DoS
306
- * - Whitelist approach: only http/https allowed
307
- * - Sanitized logging to prevent sensitive data exposure
308
- *
309
- * @param url - The URL to sanitize
310
- * @returns Empty string if invalid/dangerous, original URL if safe
311
- */
312
- sanitizeUrl(url) {
313
- if (!url)
314
- return '';
315
- // Check URL length
316
- if (url.length > this.urlMaxLength) {
317
- this.logSecurityEvent('url_too_long', {
318
- length: url.length,
319
- maxLength: this.urlMaxLength,
320
- urlPrefix: url.substring(0, 50) + '...' // Only log first 50 chars
321
- });
322
- return ''; // URL too long
323
- }
324
- // Only allow http and https schemes
325
- const allowedSchemes = ['http:', 'https:'];
326
- try {
327
- const parsed = new URL(url);
328
- if (!allowedSchemes.includes(parsed.protocol)) {
329
- this.logSecurityEvent('dangerous_url_scheme', {
330
- scheme: parsed.protocol,
331
- host: parsed.hostname // Log only hostname, not full URL
332
- });
333
- return ''; // Return empty string for dangerous schemes
334
- }
335
- return url;
336
- }
337
- catch {
338
- this.logSecurityEvent('invalid_url', {
339
- urlLength: url.length // Log length only, not content
340
- });
341
- return ''; // Invalid URL
342
- }
343
- }
344
- /**
345
- * Sanitize release notes to prevent XSS, command injection, and DoS
346
- *
347
- * Security layers:
348
- * 1. Length limiting (configurable, default 5000 chars)
349
- * 2. HTML/JS sanitization via DOMPurify (no tags/attributes allowed)
350
- * 3. Command injection pattern removal (backticks, command substitution)
351
- * 4. OWASP pattern removal (PHP, ASP, hex/unicode/octal escapes)
352
- *
353
- * @param notes - The release notes to sanitize
354
- * @returns Sanitized release notes safe for display
355
- */
356
- sanitizeReleaseNotes(notes) {
357
- if (!notes)
358
- return 'See release notes on GitHub';
359
- // First, normalize Unicode to prevent bypass attacks
360
- const unicodeResult = UnicodeValidator.normalize(notes);
361
- let sanitized = unicodeResult.normalizedContent;
362
- if (unicodeResult.detectedIssues && unicodeResult.detectedIssues.length > 0) {
363
- this.logSecurityEvent('unicode_issues_in_release_notes', {
364
- issues: unicodeResult.detectedIssues,
365
- severity: unicodeResult.severity
366
- });
367
- }
368
- // Apply length limit
369
- if (sanitized.length > this.releaseNotesMaxLength) {
370
- this.logSecurityEvent('release_notes_truncated', {
371
- originalLength: sanitized.length,
372
- maxLength: this.releaseNotesMaxLength
373
- });
374
- sanitized = sanitized.substring(0, this.releaseNotesMaxLength) + '...';
375
- }
376
- // Use cached DOMPurify instance with automatic recovery
377
- if (!UpdateChecker.purify || !UpdateChecker.purifyWindow) {
378
- // Reinitialize if somehow corrupted - provides resilience
379
- const dom = new JSDOM('');
380
- UpdateChecker.purifyWindow = dom.window;
381
- UpdateChecker.purify = DOMPurify(UpdateChecker.purifyWindow);
382
- }
383
- const beforeSanitize = sanitized;
384
- // DOMPurify configuration for maximum security
385
- // ALLOWED_TAGS: [] strips all HTML tags
386
- // ALLOWED_ATTR: [] strips all attributes
387
- // Additional options for extra security
388
- sanitized = UpdateChecker.purify.sanitize(sanitized, {
389
- ALLOWED_TAGS: [], // Strip all HTML tags
390
- ALLOWED_ATTR: [], // Strip all attributes
391
- FORBID_TAGS: ['style', 'script', 'iframe', 'object', 'embed', 'link'],
392
- FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover']
393
- });
394
- if (beforeSanitize !== sanitized) {
395
- this.logSecurityEvent('html_content_removed', {
396
- removedLength: beforeSanitize.length - sanitized.length
397
- });
398
- }
399
- // Additional sanitization for command injection patterns
400
- // Single-pass processing for performance while maintaining security
401
- // These patterns cover various injection vectors beyond HTML/JS
402
- // Length limits added to prevent ReDoS attacks
403
- const patterns = [
404
- /`[^`]{0,1000}`/g, // Backtick expressions (limited to 1000 chars)
405
- /\$\([^)]{0,1000}\)/g, // Command substitution (limited to 1000 chars)
406
- /\$\{[^}]{0,1000}\}/g, // Variable expansion (limited to 1000 chars)
407
- /<\?[^>]{0,1000}\?>/g, // PHP tags (OWASP) (limited to 1000 chars)
408
- /&lt;%[^>]{0,1000}%&gt;/g, // ASP tags (HTML-encoded by DOMPurify) (limited to 1000 chars)
409
- /<%[^>]{0,1000}%>/g, // ASP tags (raw) (limited to 1000 chars)
410
- /\\x[0-9a-fA-F]{2}/g, // Hex escapes (OWASP) - already limited by {2}
411
- /\\u[0-9a-fA-F]{4}/g, // Unicode escapes - already limited by {4}
412
- /\\[0-7]{1,3}/g // Octal escapes - already limited by {1,3}
413
- ];
414
- const beforePatterns = sanitized;
415
- for (const pattern of patterns) {
416
- sanitized = sanitized.replace(pattern, '');
417
- }
418
- if (beforePatterns !== sanitized) {
419
- this.logSecurityEvent('injection_patterns_removed', {
420
- removedLength: beforePatterns.length - sanitized.length
421
- });
422
- }
423
- return sanitized;
424
- }
425
- /**
426
- * Format date to human-readable format with consistent timezone handling
427
- * @param dateStr - ISO date string to format
428
- * @returns Human-readable date string (e.g., "January 5, 2025")
429
- */
430
- formatDate(dateStr) {
431
- try {
432
- const date = new Date(dateStr);
433
- if (isNaN(date.getTime())) {
434
- return dateStr; // Return original if invalid
435
- }
436
- // Use UTC methods to ensure consistent timezone handling
437
- return date.toLocaleDateString('en-US', {
438
- year: 'numeric',
439
- month: 'long',
440
- day: 'numeric',
441
- timeZone: 'UTC' // Ensure consistent timezone
442
- });
443
- }
444
- catch {
445
- return dateStr; // Return original on error
446
- }
447
- }
448
- /**
449
- * Log security events for monitoring and alerting
450
- * Only logs if securityLogger callback was provided in constructor
451
- * @param event - The security event type
452
- * @param details - Event details (sanitized to prevent info disclosure)
453
- */
454
- logSecurityEvent(event, details) {
455
- if (this.securityLogger) {
456
- this.securityLogger(event, details);
457
- }
458
- }
459
- /**
460
- * Reset static DOMPurify cache (useful for long-running processes)
461
- * This prevents memory accumulation in services that run for extended periods
462
- * @static
463
- */
464
- static resetCache() {
465
- UpdateChecker.purifyWindow = null;
466
- UpdateChecker.purify = null;
467
- }
468
- }
469
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlQ2hlY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91cGRhdGUvVXBkYXRlQ2hlY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLFNBQVMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWlCOUUsTUFBTSxPQUFPLGFBQWE7SUFDaEIsY0FBYyxDQUFpQjtJQUMvQixXQUFXLENBQWM7SUFDekIsaUJBQWlCLENBQW9CO0lBRTdDLG9EQUFvRDtJQUNwRCxnRUFBZ0U7SUFDaEUsa0RBQWtEO0lBQzFDLE1BQU0sQ0FBQyxZQUFZLEdBQVEsSUFBSSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQTZCLElBQUksQ0FBQztJQUV2RCxnREFBZ0Q7SUFDL0IscUJBQXFCLENBQVM7SUFDOUIsWUFBWSxDQUFTO0lBQ3JCLGNBQWMsQ0FBeUM7SUFDdkQscUJBQXFCLENBQVU7SUFFaEQsWUFDRSxjQUE4QixFQUM5QixPQU9DO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFFckMsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLEVBQUUscUJBQXFCLElBQUksSUFBSSxDQUFDO1FBQ3BF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LENBQUM7WUFDUCxPQUFPLE9BQU8sQ0FBQyxDQUFFLDJCQUEyQjtRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZ0JBQWdCLENBQUMsS0FBYSxFQUFFLE9BQVk7UUFDbEQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFVBQVU7UUFDdEIsYUFBYSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDbEMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXBkYXRlQ2hlY2tlciAtIFNlY3VyZSBHaXRIdWIgcmVsZWFzZSB1cGRhdGUgY2hlY2tpbmcgd2l0aCBjb21wcmVoZW5zaXZlIHNhbml0aXphdGlvblxuICogXG4gKiBTZWN1cml0eSBtZWFzdXJlcyBpbXBsZW1lbnRlZDpcbiAqIDEuIFhTUyBQcm90ZWN0aW9uOiBET01QdXJpZnkgd2l0aCBzdHJpY3Qgbm8tdGFncy9uby1hdHRyaWJ1dGVzIHBvbGljeVxuICogMi4gQ29tbWFuZCBJbmplY3Rpb24gUHJldmVudGlvbjogTXVsdGlwbGUgcmVnZXggcGF0dGVybnMgZm9yIHZhcmlvdXMgZXNjYXBlIHNlcXVlbmNlc1xuICogMy4gVVJMIFZhbGlkYXRpb246IFdoaXRlbGlzdCBhcHByb2FjaCBhbGxvd2luZyBvbmx5IGh0dHAvaHR0cHMgc2NoZW1lc1xuICogNC4gSW5mb3JtYXRpb24gRGlzY2xvc3VyZSBQcmV2ZW50aW9uOiBTYW5pdGl6ZWQgbG9nZ2luZyBvZiBzZW5zaXRpdmUgZGF0YVxuICogNS4gTGVuZ3RoIExpbWl0czogQ29uZmlndXJhYmxlIGxpbWl0cyB0byBwcmV2ZW50IERvUyBhdHRhY2tzXG4gKiA2LiBPV0FTUCBQYXR0ZXJuczogUHJvdGVjdGlvbiBhZ2FpbnN0IFBIUCwgQVNQLCBoZXgsIHVuaWNvZGUsIGFuZCBvY3RhbCBlc2NhcGVzXG4gKiBcbiAqIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnM6XG4gKiAtIENhY2hlZCBET01QdXJpZnkgaW5zdGFuY2UgdG8gYXZvaWQgcmVjcmVhdGlvbiBvdmVyaGVhZFxuICogLSBTaW5nbGUtcGFzcyByZWdleCBwcm9jZXNzaW5nIGZvciBpbmplY3Rpb24gcGF0dGVybnNcbiAqIC0gRXhwb25lbnRpYWwgYmFja29mZiBmb3IgbmV0d29yayByZXRyaWVzXG4gKi9cblxuaW1wb3J0IHsgUkVMRUFTRVNfQVBJX1VSTCB9IGZyb20gJy4uL2NvbmZpZy9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgVmVyc2lvbk1hbmFnZXIgfSBmcm9tICcuL1ZlcnNpb25NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyLCBSYXRlTGltaXRlckZhY3RvcnkgfSBmcm9tICcuL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IFNpZ25hdHVyZVZlcmlmaWVyIH0gZnJvbSAnLi9TaWduYXR1cmVWZXJpZmllci5qcyc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5pbXBvcnQgeyBKU0RPTSB9IGZyb20gJ2pzZG9tJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoZWNrUmVzdWx0IHtcbiAgY3VycmVudFZlcnNpb246IHN0cmluZztcbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xuICBpc1VwZGF0ZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgcmVsZWFzZURhdGU6IHN0cmluZztcbiAgcmVsZWFzZU5vdGVzOiBzdHJpbmc7XG4gIHJlbGVhc2VVcmw6IHN0cmluZztcbiAgdGFnTmFtZT86IHN0cmluZztcbiAgc2lnbmF0dXJlVmVyaWZpZWQ/OiBib29sZWFuO1xuICBzaWduZXJJbmZvPzogc3RyaW5nO1xufVxuXG4vLyBUeXBlIGRlY2xhcmF0aW9ucyBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5XG50eXBlIERPTVB1cmlmeUluc3RhbmNlID0gUmV0dXJuVHlwZTx0eXBlb2YgRE9NUHVyaWZ5PjtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUNoZWNrZXIge1xuICBwcml2YXRlIHZlcnNpb25NYW5hZ2VyOiBWZXJzaW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSByYXRlTGltaXRlcjogUmF0ZUxpbWl0ZXI7XG4gIHByaXZhdGUgc2lnbmF0dXJlVmVyaWZpZXI6IFNpZ25hdHVyZVZlcmlmaWVyO1xuICBcbiAgLy8gU3RhdGljIGNhY2hlIGZvciBET01QdXJpZnkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuICAvLyBXZSB1c2UgJ2FueScgZm9yIEpTRE9NIHdpbmRvdyB0byBhdm9pZCBjb21wbGV4IHR5cGUgY29uZmxpY3RzXG4gIC8vIGJ1dCBtYWludGFpbiB0eXBlIHNhZmV0eSBmb3IgRE9NUHVyaWZ5IGluc3RhbmNlXG4gIHByaXZhdGUgc3RhdGljIHB1cmlmeVdpbmRvdzogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcHVyaWZ5OiBET01QdXJpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gU2VjdXJpdHkgY29uZmlndXJhdGlvbiB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVsZWFzZU5vdGVzTWF4TGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsTWF4TGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdXJpdHlMb2dnZXI/OiAoZXZlbnQ6IHN0cmluZywgZGV0YWlsczogYW55KSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVTaWduZWRSZWxlYXNlczogYm9vbGVhbjtcbiAgXG4gIGNvbnN0cnVjdG9yKFxuICAgIHZlcnNpb25NYW5hZ2VyOiBWZXJzaW9uTWFuYWdlcixcbiAgICBvcHRpb25zPzoge1xuICAgICAgcmVsZWFzZU5vdGVzTWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgdXJsTWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgc2VjdXJpdHlMb2dnZXI/OiAoZXZlbnQ6IHN0cmluZywgZGV0YWlsczogYW55KSA9PiB2b2lkO1xuICAgICAgcmF0ZUxpbWl0ZXI/OiBSYXRlTGltaXRlcjtcbiAgICAgIHNpZ25hdHVyZVZlcmlmaWVyPzogU2lnbmF0dXJlVmVyaWZpZXI7XG4gICAgICByZXF1aXJlU2lnbmVkUmVsZWFzZXM/OiBib29sZWFuO1xuICAgIH1cbiAgKSB7XG4gICAgaWYgKCF2ZXJzaW9uTWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWZXJzaW9uTWFuYWdlciBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICB0aGlzLnZlcnNpb25NYW5hZ2VyID0gdmVyc2lvbk1hbmFnZXI7XG4gICAgXG4gICAgLy8gQXBwbHkgb3B0aW9ucyB3aXRoIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uXG4gICAgdGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGggPSBvcHRpb25zPy5yZWxlYXNlTm90ZXNNYXhMZW5ndGggPz8gNTAwMDtcbiAgICB0aGlzLnVybE1heExlbmd0aCA9IG9wdGlvbnM/LnVybE1heExlbmd0aCA/PyAyMDQ4O1xuICAgIHRoaXMuc2VjdXJpdHlMb2dnZXIgPSBvcHRpb25zPy5zZWN1cml0eUxvZ2dlcjtcbiAgICBcbiAgICAvLyBVc2UgcHJvdmlkZWQgcmF0ZSBsaW1pdGVyIG9yIGNyZWF0ZSBkZWZhdWx0XG4gICAgdGhpcy5yYXRlTGltaXRlciA9IG9wdGlvbnM/LnJhdGVMaW1pdGVyIHx8IFJhdGVMaW1pdGVyRmFjdG9yeS5jcmVhdGVVcGRhdGVDaGVja0xpbWl0ZXIoKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgaWYgd2UncmUgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5DSSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhcHJvY2Vzcy5lbnYuQUxMT1dfVU5TSUdORURfUkVMRUFTRVM7XG4gICAgXG4gICAgLy8gVXNlIHByb3ZpZGVkIHNpZ25hdHVyZSB2ZXJpZmllciBvciBjcmVhdGUgZGVmYXVsdFxuICAgIHRoaXMuc2lnbmF0dXJlVmVyaWZpZXIgPSBvcHRpb25zPy5zaWduYXR1cmVWZXJpZmllciB8fCBuZXcgU2lnbmF0dXJlVmVyaWZpZXIoe1xuICAgICAgLy8gSW4gcHJvZHVjdGlvbiwgd2Ugc2hvdWxkIHJlcXVpcmUgc2lnbmVkIHJlbGVhc2VzXG4gICAgICBhbGxvd1Vuc2lnbmVkSW5EZXY6ICFpc1Byb2R1Y3Rpb25cbiAgICB9KTtcbiAgICBcbiAgICAvLyBXaGV0aGVyIHRvIHJlcXVpcmUgc2lnbmVkIHJlbGVhc2VzIChkZWZhdWx0OiB0cnVlIGluIHByb2R1Y3Rpb24pXG4gICAgdGhpcy5yZXF1aXJlU2lnbmVkUmVsZWFzZXMgPSBvcHRpb25zPy5yZXF1aXJlU2lnbmVkUmVsZWFzZXMgPz8gaXNQcm9kdWN0aW9uO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gZm9yIHNlY3VyaXR5XG4gICAgaWYgKHRoaXMucmVsZWFzZU5vdGVzTWF4TGVuZ3RoIDwgMTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbGVhc2VOb3Rlc01heExlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDEwMCBjaGFyYWN0ZXJzIGZvciBzZWN1cml0eScpO1xuICAgIH1cbiAgICBpZiAodGhpcy51cmxNYXhMZW5ndGggPCA1MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cmxNYXhMZW5ndGggbXVzdCBiZSBhdCBsZWFzdCA1MCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEluaXRpYWxpemUgY2FjaGVkIERPTVB1cmlmeSBpbnN0YW5jZSBmb3IgcGVyZm9ybWFuY2VcbiAgICAvLyBUaGlzIGF2b2lkcyBjcmVhdGluZyBhIG5ldyBKU0RPTSB3aW5kb3cgZm9yIGVhY2ggc2FuaXRpemF0aW9uXG4gICAgaWYgKCFVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdykge1xuICAgICAgY29uc3QgZG9tID0gbmV3IEpTRE9NKCcnKTtcbiAgICAgIFVwZGF0ZUNoZWNrZXIucHVyaWZ5V2luZG93ID0gZG9tLndpbmRvdztcbiAgICAgIC8vIERPTVB1cmlmeSBleHBlY3RzIGEgV2luZG93LWxpa2Ugb2JqZWN0IGZyb20gSlNET01cbiAgICAgIFVwZGF0ZUNoZWNrZXIucHVyaWZ5ID0gRE9NUHVyaWZ5KFVwZGF0ZUNoZWNrZXIucHVyaWZ5V2luZG93KTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgbmV0d29yayBvcGVyYXRpb24gd2l0aCByZXRyeSBsb2dpYyBhbmQgZXhwb25lbnRpYWwgYmFja29mZlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIGFzeW5jIG9wZXJhdGlvbiB0byBleGVjdXRlXG4gICAqIEBwYXJhbSBtYXhSZXRyaWVzIC0gTWF4aW11bSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgKGRlZmF1bHQ6IDMpXG4gICAqIEBwYXJhbSBiYXNlRGVsYXkgLSBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBmb3IgZXhwb25lbnRpYWwgYmFja29mZiAoZGVmYXVsdDogMTAwMG1zKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgb3BlcmF0aW9uIHJlc3VsdFxuICAgKiBAdGhyb3dzIFRoZSBsYXN0IGVycm9yIGlmIGFsbCByZXRyaWVzIGZhaWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmV0cnlOZXR3b3JrT3BlcmF0aW9uPFQ+KFxuICAgIG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTxUPiwgXG4gICAgbWF4UmV0cmllczogbnVtYmVyID0gMyxcbiAgICBiYXNlRGVsYXk6IG51bWJlciA9IDEwMDBcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3I7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgXG4gICAgICAgIC8vIERvbid0IHJldHJ5IG9uIHRoZSBsYXN0IGF0dGVtcHRcbiAgICAgICAgaWYgKGF0dGVtcHQgPT09IG1heFJldHJpZXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgcmV0cnkgY2VydGFpbiBlcnJvcnMgKGxpa2UgNDA0LCA0MDEpXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJzQwNCcpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENhbGN1bGF0ZSBkZWxheSB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICAgICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRocm93IGxhc3RFcnJvciE7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBmb3IgdXBkYXRlcyBmcm9tIEdpdEh1YiByZWxlYXNlcyB3aXRoIHNlY3VyaXR5IGFuZCBlcnJvciBoYW5kbGluZ1xuICAgKiBAcmV0dXJucyBVcGRhdGVDaGVja1Jlc3VsdCBpZiB1cGRhdGUgaW5mbyBpcyBhdmFpbGFibGUsIG51bGwgaWYgbm8gcmVsZWFzZXMgZm91bmRcbiAgICogQHRocm93cyBFcnJvciBmb3IgbmV0d29yayBvciBBUEkgZmFpbHVyZXMgb3IgcmF0ZSBsaW1pdCBleGNlZWRlZFxuICAgKi9cbiAgYXN5bmMgY2hlY2tGb3JVcGRhdGVzKCk6IFByb21pc2U8VXBkYXRlQ2hlY2tSZXN1bHQgfCBudWxsPiB7XG4gICAgLy8gQ2hlY2sgcmF0ZSBsaW1pdCBiZWZvcmUgbWFraW5nIEFQSSByZXF1ZXN0XG4gICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gdGhpcy5yYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgaWYgKCFyYXRlTGltaXRTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgY29uc3Qgd2FpdFRpbWUgPSBNYXRoLmNlaWwocmF0ZUxpbWl0U3RhdHVzLnJldHJ5QWZ0ZXJNcyEgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHdhaXRNaW51dGVzID0gTWF0aC5mbG9vcih3YWl0VGltZSAvIDYwKTtcbiAgICAgIGNvbnN0IHdhaXRTZWNvbmRzID0gd2FpdFRpbWUgJSA2MDtcbiAgICAgIFxuICAgICAgY29uc3QgdGltZVN0ciA9IHdhaXRNaW51dGVzID4gMCBcbiAgICAgICAgPyBgJHt3YWl0TWludXRlc30gbWludXRlJHt3YWl0TWludXRlcyA+IDEgPyAncycgOiAnJ30gJHt3YWl0U2Vjb25kc30gc2Vjb25kJHt3YWl0U2Vjb25kcyAhPT0gMSA/ICdzJyA6ICcnfWBcbiAgICAgICAgOiBgJHt3YWl0U2Vjb25kc30gc2Vjb25kJHt3YWl0U2Vjb25kcyAhPT0gMSA/ICdzJyA6ICcnfWA7XG4gICAgICBcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB3YWl0ICR7dGltZVN0cn0gYmVmb3JlIGNoZWNraW5nIGZvciB1cGRhdGVzIGFnYWluLiBgICtcbiAgICAgICAgYCgke3JhdGVMaW1pdFN0YXR1cy5yZW1haW5pbmdUb2tlbnN9IHJlcXVlc3RzIHJlbWFpbmluZywgcmVzZXRzIGF0ICR7cmF0ZUxpbWl0U3RhdHVzLnJlc2V0VGltZS50b0xvY2FsZVRpbWVTdHJpbmcoKX0pYFxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29uc3VtZSBhIHJhdGUgbGltaXQgdG9rZW5cbiAgICB0aGlzLnJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgIFxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gYXdhaXQgdGhpcy52ZXJzaW9uTWFuYWdlci5nZXRDdXJyZW50VmVyc2lvbigpO1xuICAgIFxuICAgIC8vIENoZWNrIEdpdEh1YiByZWxlYXNlcyBBUEkgZm9yIGxhdGVzdCB2ZXJzaW9uIHdpdGggcmV0cnkgbG9naWNcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmV0cnlOZXR3b3JrT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgMTAwMDApOyAvLyAxMCBzZWNvbmQgdGltZW91dFxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFJFTEVBU0VTX0FQSV9VUkwsIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBObyByZWxlYXNlcyBmb3VuZFxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHaXRIdWIgQVBJIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCByZWxlYXNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBjb25zdCB0YWdOYW1lID0gcmVsZWFzZURhdGEudGFnX25hbWU7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRhZ05hbWU/LnJlcGxhY2UoL152LywgJycpIHx8IHJlbGVhc2VEYXRhLm5hbWU7XG4gICAgLy8gVXNlIGNvbnNpc3RlbnQgZGF0ZSBmb3JtYXR0aW5nIG1ldGhvZFxuICAgIGNvbnN0IHB1Ymxpc2hlZEF0ID0gcmVsZWFzZURhdGEucHVibGlzaGVkX2F0O1xuICAgIFxuICAgIC8vIENvbXBhcmUgdmVyc2lvbnNcbiAgICBjb25zdCBpc1VwZGF0ZUF2YWlsYWJsZSA9IHRoaXMudmVyc2lvbk1hbmFnZXIuY29tcGFyZVZlcnNpb25zKGN1cnJlbnRWZXJzaW9uLCBsYXRlc3RWZXJzaW9uKSA8IDA7XG4gICAgXG4gICAgY29uc3QgcmVsZWFzZU5vdGVzID0gcmVsZWFzZURhdGEuYm9keSB8fCAnU2VlIHJlbGVhc2Ugbm90ZXMgb24gR2l0SHViJztcbiAgICBcbiAgICAvLyBWZXJpZnkgcmVsZWFzZSBzaWduYXR1cmUgaWYgd2UgaGF2ZSBhIHRhZ1xuICAgIGxldCBzaWduYXR1cmVWZXJpZmllZCA9IGZhbHNlO1xuICAgIGxldCBzaWduZXJJbmZvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgXG4gICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuc2lnbmF0dXJlVmVyaWZpZXIudmVyaWZ5VGFnU2lnbmF0dXJlKHRhZ05hbWUpO1xuICAgICAgICBzaWduYXR1cmVWZXJpZmllZCA9IHZlcmlmaWNhdGlvblJlc3VsdC52ZXJpZmllZDtcbiAgICAgICAgXG4gICAgICAgIGlmICh2ZXJpZmljYXRpb25SZXN1bHQuc2lnbmVyRW1haWwpIHtcbiAgICAgICAgICBzaWduZXJJbmZvID0gdmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25lckVtYWlsO1xuICAgICAgICAgIGlmICh2ZXJpZmljYXRpb25SZXN1bHQuc2lnbmVyS2V5KSB7XG4gICAgICAgICAgICBzaWduZXJJbmZvICs9IGAgKCR7dmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25lcktleX0pYDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIExvZyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlY3VyaXR5TG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5zZWN1cml0eUxvZ2dlcignc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbicsIHtcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICB2ZXJpZmllZDogc2lnbmF0dXJlVmVyaWZpZWQsXG4gICAgICAgICAgICBzaWduZXJLZXk6IHZlcmlmaWNhdGlvblJlc3VsdC5zaWduZXJLZXksXG4gICAgICAgICAgICBlcnJvcjogdmVyaWZpY2F0aW9uUmVzdWx0LmVycm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gaXMgcmVxdWlyZWQgYW5kIGZhaWxlZCwgdGhyb3cgZXJyb3JcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZVNpZ25lZFJlbGVhc2VzICYmICFzaWduYXR1cmVWZXJpZmllZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBSZWxlYXNlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAke3ZlcmlmaWNhdGlvblJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9LiBgICtcbiAgICAgICAgICAgICdPbmx5IHNpZ25lZCByZWxlYXNlcyBhcmUgYWNjZXB0ZWQgaW4gcHJvZHVjdGlvbiBtb2RlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiB3ZSBjYW4ndCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBhbmQgaXQncyByZXF1aXJlZCwgZmFpbFxuICAgICAgICBpZiAodGhpcy5yZXF1aXJlU2lnbmVkUmVsZWFzZXMpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIGxvZyBhbmQgY29udGludWVcbiAgICAgICAgaWYgKHRoaXMuc2VjdXJpdHlMb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLnNlY3VyaXR5TG9nZ2VyKCdzaWduYXR1cmVfdmVyaWZpY2F0aW9uX2Vycm9yJywge1xuICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZlcnNpb24sXG4gICAgICBsYXRlc3RWZXJzaW9uLFxuICAgICAgaXNVcGRhdGVBdmFpbGFibGUsXG4gICAgICByZWxlYXNlRGF0ZTogcHVibGlzaGVkQXQsICAvLyBXaWxsIGJlIGZvcm1hdHRlZCBieSBmb3JtYXREYXRlKCkgd2hlbiBkaXNwbGF5ZWRcbiAgICAgIHJlbGVhc2VOb3RlcyxcbiAgICAgIHJlbGVhc2VVcmw6IHJlbGVhc2VEYXRhLmh0bWxfdXJsLFxuICAgICAgdGFnTmFtZSxcbiAgICAgIHNpZ25hdHVyZVZlcmlmaWVkLFxuICAgICAgc2lnbmVySW5mb1xuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCByYXRlIGxpbWl0IHN0YXR1c1xuICAgKiBAcmV0dXJucyBDdXJyZW50IHJhdGUgbGltaXQgc3RhdHVzIGluY2x1ZGluZyByZW1haW5pbmcgcmVxdWVzdHMgYW5kIHJlc2V0IHRpbWVcbiAgICovXG4gIGdldFJhdGVMaW1pdFN0YXR1cygpOiB7IFxuICAgIGFsbG93ZWQ6IGJvb2xlYW47IFxuICAgIHJlbWFpbmluZ1JlcXVlc3RzOiBudW1iZXI7IFxuICAgIHJlc2V0VGltZTogRGF0ZTtcbiAgICB3YWl0VGltZVNlY29uZHM/OiBudW1iZXI7XG4gIH0ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMucmF0ZUxpbWl0ZXIuZ2V0U3RhdHVzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWQ6IHN0YXR1cy5hbGxvd2VkLFxuICAgICAgcmVtYWluaW5nUmVxdWVzdHM6IHN0YXR1cy5yZW1haW5pbmdUb2tlbnMsXG4gICAgICByZXNldFRpbWU6IHN0YXR1cy5yZXNldFRpbWUsXG4gICAgICB3YWl0VGltZVNlY29uZHM6IHN0YXR1cy5yZXRyeUFmdGVyTXMgPyBNYXRoLmNlaWwoc3RhdHVzLnJldHJ5QWZ0ZXJNcyAvIDEwMDApIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZvcm1hdCB1cGRhdGUgY2hlY2sgcmVzdWx0cyBmb3IgZGlzcGxheSB3aXRoIGNvbXByZWhlbnNpdmUgc2FuaXRpemF0aW9uXG4gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgdXBkYXRlIGNoZWNrIHJlc3VsdCB0byBmb3JtYXRcbiAgICogQHBhcmFtIGVycm9yIC0gT3B0aW9uYWwgZXJyb3IgZnJvbSB1cGRhdGUgY2hlY2tcbiAgICogQHBhcmFtIHBlcnNvbmFJbmRpY2F0b3IgLSBPcHRpb25hbCBwZXJzb25hIGluZGljYXRvciBwcmVmaXhcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIHN0cmluZyBzYWZlIGZvciBkaXNwbGF5XG4gICAqL1xuICBmb3JtYXRVcGRhdGVDaGVja1Jlc3VsdChyZXN1bHQ6IFVwZGF0ZUNoZWNrUmVzdWx0IHwgbnVsbCwgZXJyb3I/OiBFcnJvciwgcGVyc29uYUluZGljYXRvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgY29uc3QgaXNBYm9ydEVycm9yID0gZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgaXNSYXRlTGltaXRFcnJvciA9IGVycm9yTWVzc2FnZS5pbmNsdWRlcygnUmF0ZSBsaW1pdCBleGNlZWRlZCcpO1xuICAgICAgXG4gICAgICBpZiAoaXNSYXRlTGltaXRFcnJvcikge1xuICAgICAgICByZXR1cm4gcGVyc29uYUluZGljYXRvciArIFxuICAgICAgICAgICfij7MgKipSYXRlIExpbWl0IEV4Y2VlZGVkKipcXG5cXG4nICtcbiAgICAgICAgICBlcnJvci5tZXNzYWdlICsgJ1xcblxcbicgK1xuICAgICAgICAgICcqKldoeSB0aGlzIGhhcHBlbnM6KipcXG4nICtcbiAgICAgICAgICAn4oCiIFVwZGF0ZSBjaGVja3MgYXJlIGxpbWl0ZWQgdG8gcHJldmVudCBBUEkgYWJ1c2VcXG4nICtcbiAgICAgICAgICAn4oCiIEdpdEh1YiBBUEkgaGFzIHJhdGUgbGltaXRzIGZvciBhbGwgYXBwbGljYXRpb25zXFxuXFxuJyArXG4gICAgICAgICAgJyoqV2hhdCB5b3UgY2FuIGRvOioqXFxuJyArXG4gICAgICAgICAgJ+KAoiBXYWl0IGZvciB0aGUgc3BlY2lmaWVkIHRpbWUgYmVmb3JlIGNoZWNraW5nIGFnYWluXFxuJyArXG4gICAgICAgICAgJ+KAoiBVc2UgYGdldF9zZXJ2ZXJfc3RhdHVzYCB0byBzZWUgY3VycmVudCB2ZXJzaW9uIHdpdGhvdXQgQVBJIGNhbGxzXFxuJyArXG4gICAgICAgICAgJ+KAoiBWaXNpdCBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvcmVsZWFzZXMgZGlyZWN0bHknO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gcGVyc29uYUluZGljYXRvciArIFxuICAgICAgICAn4p2MICoqVXBkYXRlIENoZWNrIEZhaWxlZCoqXFxuXFxuJyArXG4gICAgICAgICdFcnJvcjogJyArIGVycm9yTWVzc2FnZSArICdcXG5cXG4nICtcbiAgICAgICAgKGlzQWJvcnRFcnJvciBcbiAgICAgICAgICA/ICdUaGUgcmVxdWVzdCB0aW1lZCBvdXQuIFBsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nXG4gICAgICAgICAgOiAnVGlwczpcXG4nICtcbiAgICAgICAgICAgICfigKIgQ2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uXFxuJyArXG4gICAgICAgICAgICAn4oCiIEVuc3VyZSBHaXRIdWIuY29tIGlzIGFjY2Vzc2libGVcXG4nICtcbiAgICAgICAgICAgICfigKIgVHJ5IHJ1bm5pbmcgYHVwZGF0ZV9zZXJ2ZXIgdHJ1ZWAgZm9yIG1hbnVhbCB1cGRhdGVcXG4nICtcbiAgICAgICAgICAgICfigKIgVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyL3JlbGVhc2VzJyk7XG4gICAgfVxuICAgIFxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9ICd1bmtub3duJztcbiAgICAgIHJldHVybiBwZXJzb25hSW5kaWNhdG9yICsgXG4gICAgICAgICfwn5OmICoqVXBkYXRlIENoZWNrIENvbXBsZXRlKipcXG5cXG4nICtcbiAgICAgICAgJ/CflIQgKipDdXJyZW50IFZlcnNpb246KiogJyArIGN1cnJlbnRWZXJzaW9uICsgJ1xcbicgK1xuICAgICAgICAn8J+ToSAqKlJlbW90ZSBTdGF0dXM6KiogTm8gcmVsZWFzZXMgZm91bmQgb24gR2l0SHViXFxuJyArXG4gICAgICAgICfihLnvuI8gKipOb3RlOioqIFRoaXMgbWF5IGJlIGEgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvciByZWxlYXNlcyBoYXZlblxcJ3QgYmVlbiBwdWJsaXNoZWQgeWV0LlxcblxcbicgK1xuICAgICAgICAnKipNYW51YWwgVXBkYXRlOioqXFxuJyArXG4gICAgICAgICdVc2UgYHVwZGF0ZV9zZXJ2ZXIgdHJ1ZWAgdG8gcHVsbCBsYXRlc3QgY2hhbmdlcyBmcm9tIG1haW4gYnJhbmNoLic7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHN0YXR1c1BhcnRzID0gW1xuICAgICAgcGVyc29uYUluZGljYXRvciArICfwn5OmICoqVXBkYXRlIENoZWNrIENvbXBsZXRlKipcXG5cXG4nLFxuICAgICAgJ/CflIQgKipDdXJyZW50IFZlcnNpb246KiogJyArIHJlc3VsdC5jdXJyZW50VmVyc2lvbiArICdcXG4nLFxuICAgICAgJ/Cfk6EgKipMYXRlc3QgVmVyc2lvbjoqKiAnICsgcmVzdWx0LmxhdGVzdFZlcnNpb24gKyAnXFxuJyxcbiAgICAgICfwn5OFICoqUmVsZWFzZWQ6KiogJyArIHRoaXMuZm9ybWF0RGF0ZShyZXN1bHQucmVsZWFzZURhdGUpICsgJ1xcbidcbiAgICBdO1xuICAgIFxuICAgIC8vIEFkZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHN0YXR1c1xuICAgIGlmIChyZXN1bHQuc2lnbmF0dXJlVmVyaWZpZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHJlc3VsdC5zaWduYXR1cmVWZXJpZmllZCkge1xuICAgICAgICBzdGF0dXNQYXJ0cy5wdXNoKCfinIUgKipTaWduYXR1cmU6KiogVmVyaWZpZWQnKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zaWduZXJJbmZvKSB7XG4gICAgICAgICAgc3RhdHVzUGFydHMucHVzaChgIGJ5ICR7cmVzdWx0LnNpZ25lckluZm99YCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdHVzUGFydHMucHVzaCgnXFxuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNQYXJ0cy5wdXNoKCfimqDvuI8gKipTaWduYXR1cmU6KiogTm90IHZlcmlmaWVkXFxuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXR1c1BhcnRzLnB1c2goJ1xcbicpO1xuICAgIFxuICAgIGlmIChyZXN1bHQuaXNVcGRhdGVBdmFpbGFibGUpIHtcbiAgICAgIHN0YXR1c1BhcnRzLnB1c2goXG4gICAgICAgICfinKggKipVcGRhdGUgQXZhaWxhYmxlISoqXFxuXFxuJyxcbiAgICAgICAgJyoqV2hhdFxcJ3MgTmV3OioqXFxuJyArIHRoaXMuc2FuaXRpemVSZWxlYXNlTm90ZXMocmVzdWx0LnJlbGVhc2VOb3RlcykgKyAnXFxuXFxuJyxcbiAgICAgICAgJyoqVG8gVXBkYXRlOioqXFxuJyxcbiAgICAgICAgJ+KAoiBVc2U6IGB1cGRhdGVfc2VydmVyIHRydWVgXFxuJyxcbiAgICAgICAgJ+KAoiBPciB2aXNpdDogJyArIHRoaXMuc2FuaXRpemVVcmwocmVzdWx0LnJlbGVhc2VVcmwpICsgJ1xcblxcbicsXG4gICAgICAgICfimqDvuI8gKipOb3RlOioqIFVwZGF0ZSB3aWxsIHJlc3RhcnQgdGhlIHNlcnZlciBhbmQgcmVsb2FkIGFsbCBwZXJzb25hcy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXNQYXJ0cy5wdXNoKFxuICAgICAgICAn4pyFICoqWW91XFwncmUgVXAgdG8gRGF0ZSEqKlxcblxcbicsXG4gICAgICAgICdZb3VyIERvbGxob3VzZU1DUCBpbnN0YWxsYXRpb24gaXMgY3VycmVudC5cXG4nLFxuICAgICAgICAnQ2hlY2sgYmFjayBsYXRlciBmb3IgbmV3IGZlYXR1cmVzIGFuZCBpbXByb3ZlbWVudHMuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0YXR1c1BhcnRzLmpvaW4oJycpO1xuICB9XG4gIFxuICAvKipcbiAgICogU2FuaXRpemUgVVJMcyB0byBwcmV2ZW50IGRhbmdlcm91cyBzY2hlbWVzIGFuZCBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlXG4gICAqIFxuICAgKiBTZWN1cml0eSBtZWFzdXJlczpcbiAgICogLSBMZW5ndGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IERvU1xuICAgKiAtIFdoaXRlbGlzdCBhcHByb2FjaDogb25seSBodHRwL2h0dHBzIGFsbG93ZWRcbiAgICogLSBTYW5pdGl6ZWQgbG9nZ2luZyB0byBwcmV2ZW50IHNlbnNpdGl2ZSBkYXRhIGV4cG9zdXJlXG4gICAqIFxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBzYW5pdGl6ZVxuICAgKiBAcmV0dXJucyBFbXB0eSBzdHJpbmcgaWYgaW52YWxpZC9kYW5nZXJvdXMsIG9yaWdpbmFsIFVSTCBpZiBzYWZlXG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybCkgcmV0dXJuICcnO1xuICAgIFxuICAgIC8vIENoZWNrIFVSTCBsZW5ndGhcbiAgICBpZiAodXJsLmxlbmd0aCA+IHRoaXMudXJsTWF4TGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvZ1NlY3VyaXR5RXZlbnQoJ3VybF90b29fbG9uZycsIHsgXG4gICAgICAgIGxlbmd0aDogdXJsLmxlbmd0aCwgXG4gICAgICAgIG1heExlbmd0aDogdGhpcy51cmxNYXhMZW5ndGgsXG4gICAgICAgIHVybFByZWZpeDogdXJsLnN1YnN0cmluZygwLCA1MCkgKyAnLi4uJyAgLy8gT25seSBsb2cgZmlyc3QgNTAgY2hhcnNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICcnOyAgLy8gVVJMIHRvbyBsb25nXG4gICAgfVxuICAgIFxuICAgIC8vIE9ubHkgYWxsb3cgaHR0cCBhbmQgaHR0cHMgc2NoZW1lc1xuICAgIGNvbnN0IGFsbG93ZWRTY2hlbWVzID0gWydodHRwOicsICdodHRwczonXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgICAgaWYgKCFhbGxvd2VkU2NoZW1lcy5pbmNsdWRlcyhwYXJzZWQucHJvdG9jb2wpKSB7XG4gICAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgnZGFuZ2Vyb3VzX3VybF9zY2hlbWUnLCB7IFxuICAgICAgICAgIHNjaGVtZTogcGFyc2VkLnByb3RvY29sLFxuICAgICAgICAgIGhvc3Q6IHBhcnNlZC5ob3N0bmFtZSAgLy8gTG9nIG9ubHkgaG9zdG5hbWUsIG5vdCBmdWxsIFVSTFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICcnOyAgLy8gUmV0dXJuIGVtcHR5IHN0cmluZyBmb3IgZGFuZ2Vyb3VzIHNjaGVtZXNcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmxvZ1NlY3VyaXR5RXZlbnQoJ2ludmFsaWRfdXJsJywgeyBcbiAgICAgICAgdXJsTGVuZ3RoOiB1cmwubGVuZ3RoICAvLyBMb2cgbGVuZ3RoIG9ubHksIG5vdCBjb250ZW50XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAnJzsgIC8vIEludmFsaWQgVVJMXG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2FuaXRpemUgcmVsZWFzZSBub3RlcyB0byBwcmV2ZW50IFhTUywgY29tbWFuZCBpbmplY3Rpb24sIGFuZCBEb1NcbiAgICogXG4gICAqIFNlY3VyaXR5IGxheWVyczpcbiAgICogMS4gTGVuZ3RoIGxpbWl0aW5nIChjb25maWd1cmFibGUsIGRlZmF1bHQgNTAwMCBjaGFycylcbiAgICogMi4gSFRNTC9KUyBzYW5pdGl6YXRpb24gdmlhIERPTVB1cmlmeSAobm8gdGFncy9hdHRyaWJ1dGVzIGFsbG93ZWQpXG4gICAqIDMuIENvbW1hbmQgaW5qZWN0aW9uIHBhdHRlcm4gcmVtb3ZhbCAoYmFja3RpY2tzLCBjb21tYW5kIHN1YnN0aXR1dGlvbilcbiAgICogNC4gT1dBU1AgcGF0dGVybiByZW1vdmFsIChQSFAsIEFTUCwgaGV4L3VuaWNvZGUvb2N0YWwgZXNjYXBlcylcbiAgICogXG4gICAqIEBwYXJhbSBub3RlcyAtIFRoZSByZWxlYXNlIG5vdGVzIHRvIHNhbml0aXplXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCByZWxlYXNlIG5vdGVzIHNhZmUgZm9yIGRpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVSZWxlYXNlTm90ZXMobm90ZXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFub3RlcykgcmV0dXJuICdTZWUgcmVsZWFzZSBub3RlcyBvbiBHaXRIdWInO1xuICAgIFxuICAgIC8vIEZpcnN0LCBub3JtYWxpemUgVW5pY29kZSB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzXG4gICAgY29uc3QgdW5pY29kZVJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5vdGVzKTtcbiAgICBsZXQgc2FuaXRpemVkID0gdW5pY29kZVJlc3VsdC5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICBpZiAodW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3VlcyAmJiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgndW5pY29kZV9pc3N1ZXNfaW5fcmVsZWFzZV9ub3RlcycsIHtcbiAgICAgICAgaXNzdWVzOiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLFxuICAgICAgICBzZXZlcml0eTogdW5pY29kZVJlc3VsdC5zZXZlcml0eVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGxlbmd0aCBsaW1pdFxuICAgIGlmIChzYW5pdGl6ZWQubGVuZ3RoID4gdGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgncmVsZWFzZV9ub3Rlc190cnVuY2F0ZWQnLCB7IFxuICAgICAgICBvcmlnaW5hbExlbmd0aDogc2FuaXRpemVkLmxlbmd0aCwgXG4gICAgICAgIG1heExlbmd0aDogdGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGggXG4gICAgICB9KTtcbiAgICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgdGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGgpICsgJy4uLic7XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBjYWNoZWQgRE9NUHVyaWZ5IGluc3RhbmNlIHdpdGggYXV0b21hdGljIHJlY292ZXJ5XG4gICAgaWYgKCFVcGRhdGVDaGVja2VyLnB1cmlmeSB8fCAhVXBkYXRlQ2hlY2tlci5wdXJpZnlXaW5kb3cpIHtcbiAgICAgIC8vIFJlaW5pdGlhbGl6ZSBpZiBzb21laG93IGNvcnJ1cHRlZCAtIHByb3ZpZGVzIHJlc2lsaWVuY2VcbiAgICAgIGNvbnN0IGRvbSA9IG5ldyBKU0RPTSgnJyk7XG4gICAgICBVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdyA9IGRvbS53aW5kb3c7XG4gICAgICBVcGRhdGVDaGVja2VyLnB1cmlmeSA9IERPTVB1cmlmeShVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdyk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJlZm9yZVNhbml0aXplID0gc2FuaXRpemVkO1xuICAgIC8vIERPTVB1cmlmeSBjb25maWd1cmF0aW9uIGZvciBtYXhpbXVtIHNlY3VyaXR5XG4gICAgLy8gQUxMT1dFRF9UQUdTOiBbXSBzdHJpcHMgYWxsIEhUTUwgdGFnc1xuICAgIC8vIEFMTE9XRURfQVRUUjogW10gc3RyaXBzIGFsbCBhdHRyaWJ1dGVzXG4gICAgLy8gQWRkaXRpb25hbCBvcHRpb25zIGZvciBleHRyYSBzZWN1cml0eVxuICAgIHNhbml0aXplZCA9IFVwZGF0ZUNoZWNrZXIucHVyaWZ5LnNhbml0aXplKHNhbml0aXplZCwgeyBcbiAgICAgIEFMTE9XRURfVEFHUzogW10sICAgICAgLy8gU3RyaXAgYWxsIEhUTUwgdGFnc1xuICAgICAgQUxMT1dFRF9BVFRSOiBbXSwgICAgICAvLyBTdHJpcCBhbGwgYXR0cmlidXRlc1xuICAgICAgRk9SQklEX1RBR1M6IFsnc3R5bGUnLCAnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnbGluayddLFxuICAgICAgRk9SQklEX0FUVFI6IFsnb25lcnJvcicsICdvbmxvYWQnLCAnb25jbGljaycsICdvbm1vdXNlb3ZlciddXG4gICAgfSk7XG4gICAgXG4gICAgaWYgKGJlZm9yZVNhbml0aXplICE9PSBzYW5pdGl6ZWQpIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgnaHRtbF9jb250ZW50X3JlbW92ZWQnLCB7IFxuICAgICAgICByZW1vdmVkTGVuZ3RoOiBiZWZvcmVTYW5pdGl6ZS5sZW5ndGggLSBzYW5pdGl6ZWQubGVuZ3RoIFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgc2FuaXRpemF0aW9uIGZvciBjb21tYW5kIGluamVjdGlvbiBwYXR0ZXJuc1xuICAgIC8vIFNpbmdsZS1wYXNzIHByb2Nlc3NpbmcgZm9yIHBlcmZvcm1hbmNlIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5XG4gICAgLy8gVGhlc2UgcGF0dGVybnMgY292ZXIgdmFyaW91cyBpbmplY3Rpb24gdmVjdG9ycyBiZXlvbmQgSFRNTC9KU1xuICAgIC8vIExlbmd0aCBsaW1pdHMgYWRkZWQgdG8gcHJldmVudCBSZURvUyBhdHRhY2tzXG4gICAgY29uc3QgcGF0dGVybnMgPSBbXG4gICAgICAvYFteYF17MCwxMDAwfWAvZywgICAgICAgICAgIC8vIEJhY2t0aWNrIGV4cHJlc3Npb25zIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvXFwkXFwoW14pXXswLDEwMDB9XFwpL2csICAgICAgIC8vIENvbW1hbmQgc3Vic3RpdHV0aW9uIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvXFwkXFx7W159XXswLDEwMDB9XFx9L2csICAgICAgIC8vIFZhcmlhYmxlIGV4cGFuc2lvbiAobGltaXRlZCB0byAxMDAwIGNoYXJzKVxuICAgICAgLzxcXD9bXj5dezAsMTAwMH1cXD8+L2csICAgICAgIC8vIFBIUCB0YWdzIChPV0FTUCkgKGxpbWl0ZWQgdG8gMTAwMCBjaGFycylcbiAgICAgIC8mbHQ7JVtePl17MCwxMDAwfSUmZ3Q7L2csICAgLy8gQVNQIHRhZ3MgKEhUTUwtZW5jb2RlZCBieSBET01QdXJpZnkpIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvPCVbXj5dezAsMTAwMH0lPi9nLCAgICAgICAgIC8vIEFTUCB0YWdzIChyYXcpIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvXFxcXHhbMC05YS1mQS1GXXsyfS9nLCAgICAgICAgLy8gSGV4IGVzY2FwZXMgKE9XQVNQKSAtIGFscmVhZHkgbGltaXRlZCBieSB7Mn1cbiAgICAgIC9cXFxcdVswLTlhLWZBLUZdezR9L2csICAgICAgICAvLyBVbmljb2RlIGVzY2FwZXMgLSBhbHJlYWR5IGxpbWl0ZWQgYnkgezR9XG4gICAgICAvXFxcXFswLTddezEsM30vZyAgICAgICAgICAgICAgLy8gT2N0YWwgZXNjYXBlcyAtIGFscmVhZHkgbGltaXRlZCBieSB7MSwzfVxuICAgIF07XG4gICAgXG4gICAgY29uc3QgYmVmb3JlUGF0dGVybnMgPSBzYW5pdGl6ZWQ7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZShwYXR0ZXJuLCAnJyk7XG4gICAgfVxuICAgIFxuICAgIGlmIChiZWZvcmVQYXR0ZXJucyAhPT0gc2FuaXRpemVkKSB7XG4gICAgICB0aGlzLmxvZ1NlY3VyaXR5RXZlbnQoJ2luamVjdGlvbl9wYXR0ZXJuc19yZW1vdmVkJywgeyBcbiAgICAgICAgcmVtb3ZlZExlbmd0aDogYmVmb3JlUGF0dGVybnMubGVuZ3RoIC0gc2FuaXRpemVkLmxlbmd0aCBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG4gIFxuICAvKipcbiAgICogRm9ybWF0IGRhdGUgdG8gaHVtYW4tcmVhZGFibGUgZm9ybWF0IHdpdGggY29uc2lzdGVudCB0aW1lem9uZSBoYW5kbGluZ1xuICAgKiBAcGFyYW0gZGF0ZVN0ciAtIElTTyBkYXRlIHN0cmluZyB0byBmb3JtYXRcbiAgICogQHJldHVybnMgSHVtYW4tcmVhZGFibGUgZGF0ZSBzdHJpbmcgKGUuZy4sIFwiSmFudWFyeSA1LCAyMDI1XCIpXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZVN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGVTdHIpO1xuICAgICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICByZXR1cm4gZGF0ZVN0cjsgIC8vIFJldHVybiBvcmlnaW5hbCBpZiBpbnZhbGlkXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVzZSBVVEMgbWV0aG9kcyB0byBlbnN1cmUgY29uc2lzdGVudCB0aW1lem9uZSBoYW5kbGluZ1xuICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgdGltZVpvbmU6ICdVVEMnICAvLyBFbnN1cmUgY29uc2lzdGVudCB0aW1lem9uZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGF0ZVN0cjsgIC8vIFJldHVybiBvcmlnaW5hbCBvbiBlcnJvclxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIExvZyBzZWN1cml0eSBldmVudHMgZm9yIG1vbml0b3JpbmcgYW5kIGFsZXJ0aW5nXG4gICAqIE9ubHkgbG9ncyBpZiBzZWN1cml0eUxvZ2dlciBjYWxsYmFjayB3YXMgcHJvdmlkZWQgaW4gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHNlY3VyaXR5IGV2ZW50IHR5cGVcbiAgICogQHBhcmFtIGRldGFpbHMgLSBFdmVudCBkZXRhaWxzIChzYW5pdGl6ZWQgdG8gcHJldmVudCBpbmZvIGRpc2Nsb3N1cmUpXG4gICAqL1xuICBwcml2YXRlIGxvZ1NlY3VyaXR5RXZlbnQoZXZlbnQ6IHN0cmluZywgZGV0YWlsczogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VjdXJpdHlMb2dnZXIpIHtcbiAgICAgIHRoaXMuc2VjdXJpdHlMb2dnZXIoZXZlbnQsIGRldGFpbHMpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFJlc2V0IHN0YXRpYyBET01QdXJpZnkgY2FjaGUgKHVzZWZ1bCBmb3IgbG9uZy1ydW5uaW5nIHByb2Nlc3NlcylcbiAgICogVGhpcyBwcmV2ZW50cyBtZW1vcnkgYWNjdW11bGF0aW9uIGluIHNlcnZpY2VzIHRoYXQgcnVuIGZvciBleHRlbmRlZCBwZXJpb2RzXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRDYWNoZSgpOiB2b2lkIHtcbiAgICBVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdyA9IG51bGw7XG4gICAgVXBkYXRlQ2hlY2tlci5wdXJpZnkgPSBudWxsO1xuICB9XG59Il19
@@ -1,41 +0,0 @@
1
- /**
2
- * Manage server updates and rollbacks
3
- */
4
- export interface UpdateProgress {
5
- step: string;
6
- message: string;
7
- isComplete: boolean;
8
- }
9
- export declare class UpdateManager {
10
- private versionManager;
11
- private updateChecker;
12
- private dependencyChecker;
13
- private backupManager;
14
- private rootDir;
15
- constructor(rootDir?: string);
16
- /**
17
- * Check for available updates
18
- */
19
- checkForUpdates(): Promise<{
20
- text: string;
21
- }>;
22
- /**
23
- * Perform server update
24
- */
25
- updateServer(createBackup?: boolean, personaIndicator?: string): Promise<{
26
- text: string;
27
- }>;
28
- /**
29
- * Rollback to previous version
30
- */
31
- rollbackUpdate(force?: boolean, personaIndicator?: string): Promise<{
32
- text: string;
33
- }>;
34
- /**
35
- * Get current server status
36
- */
37
- getServerStatus(personaIndicator?: string): Promise<{
38
- text: string;
39
- }>;
40
- }
41
- //# sourceMappingURL=UpdateManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UpdateManager.d.ts","sourceRoot":"","sources":["../../../../src/update/UpdateManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAQ5B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAWlD;;OAEG;IACG,YAAY,CAAC,YAAY,GAAE,OAAc,EAAE,gBAAgB,GAAE,MAAW,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IA4H1G;;OAEG;IACG,cAAc,CAAC,KAAK,GAAE,OAAe,EAAE,gBAAgB,GAAE,MAAW,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAuEtG;;OAEG;IACG,eAAe,CAAC,gBAAgB,GAAE,MAAW,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAyEhF"}