@dollhousemcp/mcp-server 1.4.4 → 1.5.0

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