@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,496 +0,0 @@
1
- /**
2
- * TemplateManager - Implementation of IElementManager for Template elements
3
- * Handles CRUD operations and lifecycle management for templates implementing IElement
4
- *
5
- * SECURITY FIXES IMPLEMENTED (Following PR #319 patterns):
6
- * 1. CRITICAL: Fixed race conditions in file operations by using FileLockManager for atomic reads/writes
7
- * 2. CRITICAL: Fixed dynamic require() statements by using static imports
8
- * 3. HIGH: Fixed unvalidated YAML parsing vulnerability by using SecureYamlParser
9
- * 4. MEDIUM: All user inputs are now validated and sanitized
10
- * 5. MEDIUM: Audit logging added for security operations
11
- * 6. MEDIUM: Path traversal prevention for all file operations
12
- */
13
- import { Template } from './Template.js';
14
- import { ElementType } from '../../portfolio/types.js';
15
- import { PortfolioManager } from '../../portfolio/PortfolioManager.js';
16
- import { logger } from '../../utils/logger.js';
17
- import { FileLockManager } from '../../security/fileLockManager.js';
18
- import { SecureYamlParser } from '../../security/secureYamlParser.js';
19
- import { SecurityMonitor } from '../../security/securityMonitor.js';
20
- import { sanitizeInput } from '../../security/InputValidator.js';
21
- import { UnicodeValidator } from '../../security/validators/unicodeValidator.js';
22
- import { promises as fs } from 'fs';
23
- import * as path from 'path';
24
- import * as yaml from 'js-yaml';
25
- import matter from 'gray-matter';
26
- export class TemplateManager {
27
- portfolioManager;
28
- templatesDir;
29
- templates = new Map();
30
- constructor() {
31
- this.portfolioManager = PortfolioManager.getInstance();
32
- this.templatesDir = this.portfolioManager.getElementDir(ElementType.TEMPLATE);
33
- }
34
- /**
35
- * Load a template from file
36
- * SECURITY FIX #1: Uses FileLockManager.atomicReadFile() instead of fs.readFile()
37
- * to prevent race conditions and ensure atomic file operations
38
- */
39
- async load(filePath) {
40
- // SECURITY FIX #4 & #6: Validate and sanitize the file path
41
- // Previously: Direct use of user-provided paths could lead to path traversal
42
- // Now: Full validation prevents accessing files outside templates directory
43
- const sanitizedPath = sanitizeInput(filePath, 255);
44
- // Ensure the path is within the templates directory
45
- const fullPath = path.isAbsolute(sanitizedPath)
46
- ? sanitizedPath
47
- : path.join(this.templatesDir, sanitizedPath);
48
- // SECURITY FIX #6: Prevent path traversal attacks
49
- const normalizedPath = path.normalize(fullPath);
50
- if (!normalizedPath.startsWith(this.templatesDir)) {
51
- SecurityMonitor.logSecurityEvent({
52
- type: 'PATH_TRAVERSAL_ATTEMPT',
53
- severity: 'CRITICAL',
54
- source: 'TemplateManager.load',
55
- details: `Attempted to access file outside templates directory: ${sanitizedPath}`
56
- });
57
- throw new Error('Path traversal attempt detected');
58
- }
59
- try {
60
- // CRITICAL FIX: Use atomic file read to prevent race conditions
61
- // Previously: const content = await fs.readFile(fullPath, 'utf-8');
62
- // Now: Uses FileLockManager with proper encoding object format
63
- const content = await FileLockManager.atomicReadFile(normalizedPath, { encoding: 'utf-8' });
64
- // Parse the template file (expected format: YAML frontmatter + content)
65
- const parsed = matter(content);
66
- // SECURITY FIX #3: Validate YAML metadata using SecureYamlParser
67
- // Previously: Frontmatter parsing could be vulnerable to YAML injection
68
- // Now: SecureYamlParser validates and sanitizes YAML content
69
- const metadata = await this.validateMetadata(parsed.data);
70
- // Create the template instance
71
- const template = new Template(metadata, parsed.content);
72
- // Cache the template
73
- this.templates.set(normalizedPath, template);
74
- // SECURITY FIX #5: Log successful template load for audit trail
75
- SecurityMonitor.logSecurityEvent({
76
- type: 'TEMPLATE_LOADED',
77
- severity: 'LOW',
78
- source: 'TemplateManager.load',
79
- details: `Template loaded: ${template.metadata.name} from ${path.basename(normalizedPath)}`
80
- });
81
- return template;
82
- }
83
- catch (error) {
84
- logger.error(`Failed to load template from ${normalizedPath}: ${error}`);
85
- throw error;
86
- }
87
- }
88
- /**
89
- * Save a template to file
90
- * SECURITY FIX #1: Uses FileLockManager.atomicWriteFile() for atomic operations
91
- */
92
- async save(template, filePath) {
93
- // SECURITY FIX #4: Validate inputs
94
- const validation = template.validate();
95
- if (!validation.valid) {
96
- throw new Error(`Cannot save invalid template: ${validation.errors?.map(e => e.message).join(', ')}`);
97
- }
98
- // SECURITY FIX #4 & #6: Validate and sanitize the file path
99
- const sanitizedPath = sanitizeInput(filePath, 255);
100
- // Ensure the path is within the templates directory
101
- const fullPath = path.isAbsolute(sanitizedPath)
102
- ? sanitizedPath
103
- : path.join(this.templatesDir, sanitizedPath);
104
- // SECURITY FIX #6: Prevent path traversal attacks
105
- const normalizedPath = path.normalize(fullPath);
106
- if (!normalizedPath.startsWith(this.templatesDir)) {
107
- SecurityMonitor.logSecurityEvent({
108
- type: 'PATH_TRAVERSAL_ATTEMPT',
109
- severity: 'CRITICAL',
110
- source: 'TemplateManager.save',
111
- details: `Attempted to save file outside templates directory: ${sanitizedPath}`
112
- });
113
- throw new Error('Path traversal attempt detected');
114
- }
115
- try {
116
- // Ensure directory exists
117
- await fs.mkdir(path.dirname(normalizedPath), { recursive: true });
118
- // Create frontmatter content
119
- const frontmatter = this.createFrontmatter(template.metadata);
120
- const content = `---\n${frontmatter}\n---\n\n${template.content}`;
121
- // CRITICAL FIX: Use atomic file write to prevent race conditions
122
- // Previously: await fs.writeFile(fullPath, content, 'utf-8');
123
- // Now: Uses FileLockManager for atomic operations
124
- await FileLockManager.atomicWriteFile(normalizedPath, content, { encoding: 'utf-8' });
125
- // Update cache
126
- this.templates.set(normalizedPath, template);
127
- // SECURITY FIX #5: Log successful save for audit trail
128
- SecurityMonitor.logSecurityEvent({
129
- type: 'TEMPLATE_SAVED',
130
- severity: 'LOW',
131
- source: 'TemplateManager.save',
132
- details: `Template saved: ${template.metadata.name} to ${path.basename(normalizedPath)}`
133
- });
134
- logger.info(`Template saved: ${template.metadata.name}`);
135
- }
136
- catch (error) {
137
- logger.error(`Failed to save template to ${normalizedPath}: ${error}`);
138
- throw error;
139
- }
140
- }
141
- /**
142
- * List all templates
143
- * SECURITY FIX: Uses validated directory path
144
- */
145
- async list() {
146
- try {
147
- const files = await fs.readdir(this.templatesDir);
148
- const templateFiles = files.filter(file => file.endsWith('.md') || file.endsWith('.yaml'));
149
- // Load templates in parallel with error handling
150
- const templates = await Promise.all(templateFiles.map(async (file) => {
151
- try {
152
- return await this.load(file);
153
- }
154
- catch (error) {
155
- logger.error(`Failed to load template ${file}: ${error}`);
156
- return null;
157
- }
158
- }));
159
- // Filter out failed loads
160
- return templates.filter((t) => t !== null);
161
- }
162
- catch (error) {
163
- logger.error(`Failed to list templates: ${error}`);
164
- return [];
165
- }
166
- }
167
- /**
168
- * Find a template by predicate
169
- */
170
- async find(predicate) {
171
- const templates = await this.list();
172
- return templates.find(predicate);
173
- }
174
- /**
175
- * Delete a template
176
- * SECURITY FIX #6: Path validation to prevent deletion outside directory
177
- */
178
- async delete(filePath) {
179
- // SECURITY FIX #4 & #6: Validate and sanitize the file path
180
- const sanitizedPath = sanitizeInput(filePath, 255);
181
- // Ensure the path is within the templates directory
182
- const fullPath = path.isAbsolute(sanitizedPath)
183
- ? sanitizedPath
184
- : path.join(this.templatesDir, sanitizedPath);
185
- // SECURITY FIX #6: Prevent path traversal attacks
186
- const normalizedPath = path.normalize(fullPath);
187
- if (!normalizedPath.startsWith(this.templatesDir)) {
188
- SecurityMonitor.logSecurityEvent({
189
- type: 'PATH_TRAVERSAL_ATTEMPT',
190
- severity: 'CRITICAL',
191
- source: 'TemplateManager.delete',
192
- details: `Attempted to delete file outside templates directory: ${sanitizedPath}`
193
- });
194
- throw new Error('Path traversal attempt detected');
195
- }
196
- try {
197
- await fs.unlink(normalizedPath);
198
- this.templates.delete(normalizedPath);
199
- // SECURITY FIX #5: Log deletion for audit trail
200
- SecurityMonitor.logSecurityEvent({
201
- type: 'TEMPLATE_DELETED',
202
- severity: 'MEDIUM',
203
- source: 'TemplateManager.delete',
204
- details: `Template deleted: ${path.basename(normalizedPath)}`
205
- });
206
- logger.info(`Template deleted: ${path.basename(normalizedPath)}`);
207
- }
208
- catch (error) {
209
- logger.error(`Failed to delete template ${normalizedPath}: ${error}`);
210
- throw error;
211
- }
212
- }
213
- /**
214
- * Import a template from external format
215
- * SECURITY FIX #3: Uses SecureYamlParser for safe YAML parsing
216
- */
217
- async importElement(data, format) {
218
- try {
219
- let metadata;
220
- let content = '';
221
- switch (format) {
222
- case 'json':
223
- const jsonData = JSON.parse(data);
224
- metadata = await this.validateMetadata(jsonData.metadata || {});
225
- content = jsonData.content || '';
226
- break;
227
- case 'yaml':
228
- // HIGH SEVERITY FIX: Use SecureYamlParser to prevent YAML injection attacks
229
- // Previously: Used unsafe YAML parsing without validation
230
- // Now: Uses SecureYamlParser which validates content and prevents malicious patterns
231
- const parsed = SecureYamlParser.parse(data, {
232
- maxYamlSize: 64 * 1024, // 64KB limit
233
- validateContent: true
234
- });
235
- metadata = await this.validateMetadata(parsed.metadata || {});
236
- content = parsed.content || '';
237
- // Log security event for audit trail
238
- SecurityMonitor.logSecurityEvent({
239
- type: 'YAML_PARSE_SUCCESS',
240
- severity: 'LOW',
241
- source: 'TemplateManager.importElement',
242
- details: 'YAML content safely parsed during import'
243
- });
244
- break;
245
- case 'markdown':
246
- const mdParsed = matter(data);
247
- metadata = await this.validateMetadata(mdParsed.data);
248
- content = mdParsed.content;
249
- break;
250
- default:
251
- throw new Error(`Unsupported import format: ${format}`);
252
- }
253
- // Create and validate the template
254
- const template = new Template(metadata, content);
255
- const validation = template.validate();
256
- if (!validation.valid) {
257
- throw new Error(`Invalid template: ${validation.errors?.map(e => e.message).join(', ')}`);
258
- }
259
- return template;
260
- }
261
- catch (error) {
262
- logger.error(`Failed to import template: ${error}`);
263
- throw error;
264
- }
265
- }
266
- /**
267
- * Export a template to external format
268
- * SECURITY FIX #3: Uses safe YAML serialization
269
- */
270
- async exportElement(template, format) {
271
- try {
272
- switch (format) {
273
- case 'json':
274
- return template.serialize();
275
- case 'yaml':
276
- // SECURITY FIX: Use yaml.dump with FAILSAFE_SCHEMA to prevent code execution
277
- // Previously: Could potentially use unsafe YAML features
278
- // Now: FAILSAFE_SCHEMA only allows basic YAML types, no JS-specific constructs
279
- const yamlData = {
280
- metadata: template.metadata,
281
- content: template.content,
282
- id: template.id,
283
- version: template.version
284
- };
285
- return yaml.dump(yamlData, {
286
- // SECURITY TRADE-OFF: Using DEFAULT_SCHEMA instead of FAILSAFE_SCHEMA
287
- // Reason: FAILSAFE_SCHEMA doesn't support number types which are needed for template metadata
288
- // Risk: DEFAULT_SCHEMA allows more YAML features that could be exploited
289
- // Mitigation: noRefs prevents reference attacks, skipInvalid drops dangerous constructs
290
- // Consider: For maximum security, implement custom schema that only allows needed types
291
- schema: yaml.DEFAULT_SCHEMA,
292
- noRefs: true, // Prevent reference attacks
293
- sortKeys: true, // Consistent output
294
- skipInvalid: true, // Skip unserializable values instead of throwing
295
- condenseFlow: true, // More compact output
296
- quotingType: '"', // Force double quotes for consistency
297
- forceQuotes: false // Only quote when necessary
298
- });
299
- case 'markdown':
300
- const frontmatter = this.createFrontmatter(template.metadata);
301
- return `---\n${frontmatter}\n---\n\n${template.content}`;
302
- default:
303
- throw new Error(`Unsupported export format: ${format}`);
304
- }
305
- }
306
- catch (error) {
307
- logger.error(`Failed to export template: ${error}`);
308
- throw error;
309
- }
310
- }
311
- /**
312
- * Validate and sanitize metadata
313
- * SECURITY FIX #4: Comprehensive metadata validation
314
- */
315
- async validateMetadata(data) {
316
- const metadata = {};
317
- // Sanitize string fields
318
- if (data.name) {
319
- metadata.name = sanitizeInput(UnicodeValidator.normalize(data.name).normalizedContent, 100);
320
- }
321
- if (data.description) {
322
- metadata.description = sanitizeInput(UnicodeValidator.normalize(data.description).normalizedContent, 500);
323
- }
324
- if (data.category) {
325
- metadata.category = sanitizeInput(data.category, 50);
326
- }
327
- if (data.output_format) {
328
- metadata.output_format = sanitizeInput(data.output_format, 20);
329
- }
330
- // Validate arrays
331
- if (Array.isArray(data.tags)) {
332
- metadata.tags = data.tags.map((tag) => sanitizeInput(String(tag), 50));
333
- }
334
- if (Array.isArray(data.includes)) {
335
- metadata.includes = data.includes.map((inc) => sanitizeInput(String(inc), 200));
336
- }
337
- // Copy safe fields
338
- if (typeof data.usage_count === 'number') {
339
- metadata.usage_count = Math.max(0, Math.floor(data.usage_count));
340
- }
341
- if (data.last_used) {
342
- metadata.last_used = sanitizeInput(String(data.last_used), 50);
343
- }
344
- // Validate complex fields
345
- if (Array.isArray(data.variables)) {
346
- metadata.variables = data.variables.map((v) => ({
347
- name: sanitizeInput(v.name || '', 50),
348
- type: sanitizeInput(v.type || 'string', 20),
349
- description: v.description ? sanitizeInput(v.description, 200) : undefined,
350
- required: Boolean(v.required),
351
- default: v.default,
352
- validation: v.validation ? sanitizeInput(v.validation, 200) : undefined,
353
- options: Array.isArray(v.options) ? v.options.map((o) => sanitizeInput(String(o), 100)) : undefined,
354
- format: v.format ? sanitizeInput(v.format, 50) : undefined
355
- }));
356
- }
357
- if (Array.isArray(data.examples)) {
358
- metadata.examples = data.examples.map((ex) => ({
359
- title: sanitizeInput(ex.title || '', 100),
360
- description: ex.description ? sanitizeInput(ex.description, 500) : undefined,
361
- variables: ex.variables || {},
362
- output: ex.output ? sanitizeInput(ex.output, 5000) : undefined
363
- }));
364
- }
365
- // Copy standard element fields
366
- metadata.author = data.author ? sanitizeInput(data.author, 100) : undefined;
367
- metadata.version = data.version ? sanitizeInput(data.version, 20) : undefined;
368
- return metadata;
369
- }
370
- /**
371
- * Create YAML frontmatter from metadata
372
- * SECURITY FIX #3: Safe YAML generation
373
- */
374
- createFrontmatter(metadata) {
375
- // SECURITY FIX: Use yaml.dump with security options
376
- // Ensures no code execution vulnerabilities in generated YAML
377
- const safeMetadata = {
378
- name: metadata.name,
379
- description: metadata.description,
380
- author: metadata.author,
381
- version: metadata.version,
382
- category: metadata.category,
383
- output_format: metadata.output_format,
384
- tags: metadata.tags,
385
- includes: metadata.includes,
386
- usage_count: metadata.usage_count,
387
- last_used: metadata.last_used,
388
- variables: metadata.variables,
389
- examples: metadata.examples
390
- };
391
- // Remove undefined values
392
- const cleanMetadata = Object.fromEntries(Object.entries(safeMetadata).filter(([_, value]) => value !== undefined));
393
- return yaml.dump(cleanMetadata, {
394
- // SECURITY TRADE-OFF: Same as exportElement - using DEFAULT_SCHEMA for type support
395
- // See exportElement method for detailed security considerations
396
- schema: yaml.DEFAULT_SCHEMA,
397
- noRefs: true,
398
- sortKeys: true,
399
- lineWidth: 80,
400
- skipInvalid: true,
401
- condenseFlow: true,
402
- quotingType: '"',
403
- forceQuotes: false
404
- });
405
- }
406
- /**
407
- * Check if a template file exists
408
- */
409
- async exists(filePath) {
410
- const sanitizedPath = sanitizeInput(filePath, 255);
411
- const fullPath = path.isAbsolute(sanitizedPath)
412
- ? sanitizedPath
413
- : path.join(this.templatesDir, sanitizedPath);
414
- try {
415
- await fs.access(fullPath);
416
- return true;
417
- }
418
- catch {
419
- return false;
420
- }
421
- }
422
- /**
423
- * Find multiple templates by predicate
424
- */
425
- async findMany(predicate) {
426
- const templates = await this.list();
427
- return templates.filter(predicate);
428
- }
429
- /**
430
- * Validate a template
431
- */
432
- validate(template) {
433
- return template.validate();
434
- }
435
- /**
436
- * Validate a file path
437
- */
438
- validatePath(filePath) {
439
- try {
440
- const sanitizedPath = sanitizeInput(filePath, 255);
441
- const fullPath = path.isAbsolute(sanitizedPath)
442
- ? sanitizedPath
443
- : path.join(this.templatesDir, sanitizedPath);
444
- const normalizedPath = path.normalize(fullPath);
445
- return normalizedPath.startsWith(this.templatesDir);
446
- }
447
- catch {
448
- return false;
449
- }
450
- }
451
- /**
452
- * Get the element type
453
- */
454
- getElementType() {
455
- return ElementType.TEMPLATE;
456
- }
457
- /**
458
- * Get the file extension
459
- */
460
- getFileExtension() {
461
- return '.md';
462
- }
463
- /**
464
- * Find templates by category
465
- */
466
- async findByCategory(category) {
467
- const sanitizedCategory = sanitizeInput(category, 50);
468
- return this.list().then(templates => templates.filter(t => t.metadata.category === sanitizedCategory));
469
- }
470
- /**
471
- * Find templates by tag
472
- */
473
- async findByTag(tag) {
474
- const sanitizedTag = sanitizeInput(tag, 50);
475
- return this.list().then(templates => templates.filter(t => t.metadata.tags?.includes(sanitizedTag)));
476
- }
477
- /**
478
- * Get most used templates
479
- */
480
- async getMostUsed(limit = 10) {
481
- // SECURITY FIX: Validate limit parameter to prevent excessive memory usage
482
- // Previously: No validation could allow very large limits
483
- // Now: Enforces reasonable bounds
484
- const MIN_LIMIT = 1;
485
- const MAX_LIMIT = 100;
486
- const validatedLimit = Math.max(MIN_LIMIT, Math.min(MAX_LIMIT, Math.floor(limit)));
487
- if (limit !== validatedLimit) {
488
- logger.warn(`getMostUsed: limit ${limit} adjusted to ${validatedLimit} (valid range: ${MIN_LIMIT}-${MAX_LIMIT})`);
489
- }
490
- const templates = await this.list();
491
- return templates
492
- .sort((a, b) => (b.metadata.usage_count || 0) - (a.metadata.usage_count || 0))
493
- .slice(0, validatedLimit);
494
- }
495
- }
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFJSCxPQUFPLEVBQUUsUUFBUSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsZ0JBQWdCLENBQW1CO0lBQ25DLFlBQVksQ0FBUztJQUNyQixTQUFTLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQ7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJ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ZU1hbmFnZXIgLSBJbXBsZW1lbnRhdGlvbiBvZiBJRWxlbWVudE1hbmFnZXIgZm9yIFRlbXBsYXRlIGVsZW1lbnRzXG4gKiBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgZm9yIHRlbXBsYXRlcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqIFxuICogU0VDVVJJVFkgRklYRVMgSU1QTEVNRU5URUQgKEZvbGxvd2luZyBQUiAjMzE5IHBhdHRlcm5zKTpcbiAqIDEuIENSSVRJQ0FMOiBGaXhlZCByYWNlIGNvbmRpdGlvbnMgaW4gZmlsZSBvcGVyYXRpb25zIGJ5IHVzaW5nIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIHJlYWRzL3dyaXRlc1xuICogMi4gQ1JJVElDQUw6IEZpeGVkIGR5bmFtaWMgcmVxdWlyZSgpIHN0YXRlbWVudHMgYnkgdXNpbmcgc3RhdGljIGltcG9ydHNcbiAqIDMuIEhJR0g6IEZpeGVkIHVudmFsaWRhdGVkIFlBTUwgcGFyc2luZyB2dWxuZXJhYmlsaXR5IGJ5IHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAqIDQuIE1FRElVTTogQWxsIHVzZXIgaW5wdXRzIGFyZSBub3cgdmFsaWRhdGVkIGFuZCBzYW5pdGl6ZWRcbiAqIDUuIE1FRElVTTogQXVkaXQgbG9nZ2luZyBhZGRlZCBmb3Igc2VjdXJpdHkgb3BlcmF0aW9uc1xuICogNi4gTUVESVVNOiBQYXRoIHRyYXZlcnNhbCBwcmV2ZW50aW9uIGZvciBhbGwgZmlsZSBvcGVyYXRpb25zXG4gKi9cblxuaW1wb3J0IHsgSUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVGVtcGxhdGUsIFRlbXBsYXRlTWV0YWRhdGEgfSBmcm9tICcuL1RlbXBsYXRlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0LCB2YWxpZGF0ZVBhdGggfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgbWF0dGVyIGZyb20gJ2dyYXktbWF0dGVyJztcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlTWFuYWdlciBpbXBsZW1lbnRzIElFbGVtZW50TWFuYWdlcjxUZW1wbGF0ZT4ge1xuICBwcml2YXRlIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgdGVtcGxhdGVzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgdGVtcGxhdGVzOiBNYXA8c3RyaW5nLCBUZW1wbGF0ZT4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHRoaXMudGVtcGxhdGVzRGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuVEVNUExBVEUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSB0ZW1wbGF0ZSBmcm9tIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIGluc3RlYWQgb2YgZnMucmVhZEZpbGUoKVxuICAgKiB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBhbmQgZW5zdXJlIGF0b21pYyBmaWxlIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzQgJiAjNjogVmFsaWRhdGUgYW5kIHNhbml0aXplIHRoZSBmaWxlIHBhdGhcbiAgICAvLyBQcmV2aW91c2x5OiBEaXJlY3QgdXNlIG9mIHVzZXItcHJvdmlkZWQgcGF0aHMgY291bGQgbGVhZCB0byBwYXRoIHRyYXZlcnNhbFxuICAgIC8vIE5vdzogRnVsbCB2YWxpZGF0aW9uIHByZXZlbnRzIGFjY2Vzc2luZyBmaWxlcyBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICBcbiAgICAvLyBFbnN1cmUgdGhlIHBhdGggaXMgd2l0aGluIHRoZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkgXG4gICAgICA/IHNhbml0aXplZFBhdGggXG4gICAgICA6IHBhdGguam9pbih0aGlzLnRlbXBsYXRlc0Rpciwgc2FuaXRpemVkUGF0aCk7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICM2OiBQcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGZ1bGxQYXRoKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgodGhpcy50ZW1wbGF0ZXNEaXIpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5sb2FkJyxcbiAgICAgICAgZGV0YWlsczogYEF0dGVtcHRlZCB0byBhY2Nlc3MgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBhdG9taWMgZmlsZSByZWFkIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgICAvLyBQcmV2aW91c2x5OiBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgsICd1dGYtOCcpO1xuICAgICAgLy8gTm93OiBVc2VzIEZpbGVMb2NrTWFuYWdlciB3aXRoIHByb3BlciBlbmNvZGluZyBvYmplY3QgZm9ybWF0XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKG5vcm1hbGl6ZWRQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBQYXJzZSB0aGUgdGVtcGxhdGUgZmlsZSAoZXhwZWN0ZWQgZm9ybWF0OiBZQU1MIGZyb250bWF0dGVyICsgY29udGVudClcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG1hdHRlcihjb250ZW50KTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYICMzOiBWYWxpZGF0ZSBZQU1MIG1ldGFkYXRhIHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAgICAgIC8vIFByZXZpb3VzbHk6IEZyb250bWF0dGVyIHBhcnNpbmcgY291bGQgYmUgdnVsbmVyYWJsZSB0byBZQU1MIGluamVjdGlvblxuICAgICAgLy8gTm93OiBTZWN1cmVZYW1sUGFyc2VyIHZhbGlkYXRlcyBhbmQgc2FuaXRpemVzIFlBTUwgY29udGVudFxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0YWRhdGEocGFyc2VkLmRhdGEpO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgdGhlIHRlbXBsYXRlIGluc3RhbmNlXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBDYWNoZSB0aGUgdGVtcGxhdGVcbiAgICAgIHRoaXMudGVtcGxhdGVzLnNldChub3JtYWxpemVkUGF0aCwgdGVtcGxhdGUpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBzdWNjZXNzZnVsIHRlbXBsYXRlIGxvYWQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9MT0FERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5sb2FkJyxcbiAgICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGxvYWRlZDogJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfSBmcm9tICR7cGF0aC5iYXNlbmFtZShub3JtYWxpemVkUGF0aCl9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCB0ZW1wbGF0ZSBmcm9tICR7bm9ybWFsaXplZFBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYSB0ZW1wbGF0ZSB0byBmaWxlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogVXNlcyBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKCkgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBzYXZlKHRlbXBsYXRlOiBUZW1wbGF0ZSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNDogVmFsaWRhdGUgaW5wdXRzXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHRlbXBsYXRlLnZhbGlkYXRlKCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzYXZlIGludmFsaWQgdGVtcGxhdGU6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWSBGSVggIzQgJiAjNjogVmFsaWRhdGUgYW5kIHNhbml0aXplIHRoZSBmaWxlIHBhdGhcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICBcbiAgICAvLyBFbnN1cmUgdGhlIHBhdGggaXMgd2l0aGluIHRoZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkgXG4gICAgICA/IHNhbml0aXplZFBhdGggXG4gICAgICA6IHBhdGguam9pbih0aGlzLnRlbXBsYXRlc0Rpciwgc2FuaXRpemVkUGF0aCk7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICM2OiBQcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGZ1bGxQYXRoKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgodGhpcy50ZW1wbGF0ZXNEaXIpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYEF0dGVtcHRlZCB0byBzYXZlIGZpbGUgb3V0c2lkZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5OiAke3Nhbml0aXplZFBhdGh9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggdHJhdmVyc2FsIGF0dGVtcHQgZGV0ZWN0ZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShub3JtYWxpemVkUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgZnJvbnRtYXR0ZXIgY29udGVudFxuICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSB0aGlzLmNyZWF0ZUZyb250bWF0dGVyKHRlbXBsYXRlLm1ldGFkYXRhKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBgLS0tXFxuJHtmcm9udG1hdHRlcn1cXG4tLS1cXG5cXG4ke3RlbXBsYXRlLmNvbnRlbnR9YDtcbiAgICAgIFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgYXRvbWljIGZpbGUgd3JpdGUgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IGF3YWl0IGZzLndyaXRlRmlsZShmdWxsUGF0aCwgY29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShub3JtYWxpemVkUGF0aCwgY29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGNhY2hlXG4gICAgICB0aGlzLnRlbXBsYXRlcy5zZXQobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYICM1OiBMb2cgc3VjY2Vzc2Z1bCBzYXZlIGZvciBhdWRpdCB0cmFpbFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVEVNUExBVEVfU0FWRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYFRlbXBsYXRlIHNhdmVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9IHRvICR7cGF0aC5iYXNlbmFtZShub3JtYWxpemVkUGF0aCl9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKGBUZW1wbGF0ZSBzYXZlZDogJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzYXZlIHRlbXBsYXRlIHRvICR7bm9ybWFsaXplZFBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIHRlbXBsYXRlc1xuICAgKiBTRUNVUklUWSBGSVg6IFVzZXMgdmFsaWRhdGVkIGRpcmVjdG9yeSBwYXRoXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8VGVtcGxhdGVbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIodGhpcy50ZW1wbGF0ZXNEaXIpO1xuICAgICAgY29uc3QgdGVtcGxhdGVGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpIHx8IGZpbGUuZW5kc1dpdGgoJy55YW1sJykpO1xuICAgICAgXG4gICAgICAvLyBMb2FkIHRlbXBsYXRlcyBpbiBwYXJhbGxlbCB3aXRoIGVycm9yIGhhbmRsaW5nXG4gICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGVtcGxhdGVGaWxlcy5tYXAoYXN5bmMgZmlsZSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWQoZmlsZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGUgJHtmaWxlfTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBcbiAgICAgIC8vIEZpbHRlciBvdXQgZmFpbGVkIGxvYWRzXG4gICAgICByZXR1cm4gdGVtcGxhdGVzLmZpbHRlcigodCk6IHQgaXMgVGVtcGxhdGUgPT4gdCAhPT0gbnVsbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgdGVtcGxhdGVzOiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgdGVtcGxhdGUgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kKHByZWRpY2F0ZTogKHRlbXBsYXRlOiBUZW1wbGF0ZSkgPT4gYm9vbGVhbik6IFByb21pc2U8VGVtcGxhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gdGVtcGxhdGVzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSB0ZW1wbGF0ZVxuICAgKiBTRUNVUklUWSBGSVggIzY6IFBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IGRlbGV0aW9uIG91dHNpZGUgZGlyZWN0b3J5XG4gICAqL1xuICBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICAgIGRldGFpbHM6IGBBdHRlbXB0ZWQgdG8gZGVsZXRlIGZpbGUgb3V0c2lkZSB0ZW1wbGF0ZXMgZGlyZWN0b3J5OiAke3Nhbml0aXplZFBhdGh9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggdHJhdmVyc2FsIGF0dGVtcHQgZGV0ZWN0ZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIHRoaXMudGVtcGxhdGVzLmRlbGV0ZShub3JtYWxpemVkUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogTG9nIGRlbGV0aW9uIGZvciBhdWRpdCB0cmFpbFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVEVNUExBVEVfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICAgIGRldGFpbHM6IGBUZW1wbGF0ZSBkZWxldGVkOiAke3BhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbyhgVGVtcGxhdGUgZGVsZXRlZDogJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHRlbXBsYXRlICR7bm9ybWFsaXplZFBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIHRlbXBsYXRlIGZyb20gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFNFQ1VSSVRZIEZJWCAjMzogVXNlcyBTZWN1cmVZYW1sUGFyc2VyIGZvciBzYWZlIFlBTUwgcGFyc2luZ1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0RWxlbWVudChkYXRhOiBzdHJpbmcsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IG1ldGFkYXRhOiBQYXJ0aWFsPFRlbXBsYXRlTWV0YWRhdGE+O1xuICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZyA9ICcnO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0YWRhdGEoanNvbkRhdGEubWV0YWRhdGEgfHwge30pO1xuICAgICAgICAgIGNvbnRlbnQgPSBqc29uRGF0YS5jb250ZW50IHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICd5YW1sJzpcbiAgICAgICAgICAvLyBISUdIIFNFVkVSSVRZIEZJWDogVXNlIFNlY3VyZVlhbWxQYXJzZXIgdG8gcHJldmVudCBZQU1MIGluamVjdGlvbiBhdHRhY2tzXG4gICAgICAgICAgLy8gUHJldmlvdXNseTogVXNlZCB1bnNhZmUgWUFNTCBwYXJzaW5nIHdpdGhvdXQgdmFsaWRhdGlvblxuICAgICAgICAgIC8vIE5vdzogVXNlcyBTZWN1cmVZYW1sUGFyc2VyIHdoaWNoIHZhbGlkYXRlcyBjb250ZW50IGFuZCBwcmV2ZW50cyBtYWxpY2lvdXMgcGF0dGVybnNcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGRhdGEsIHtcbiAgICAgICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsIC8vIDY0S0IgbGltaXRcbiAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIG1ldGFkYXRhID0gYXdhaXQgdGhpcy52YWxpZGF0ZU1ldGFkYXRhKChwYXJzZWQgYXMgYW55KS5tZXRhZGF0YSB8fCB7fSk7XG4gICAgICAgICAgY29udGVudCA9IHBhcnNlZC5jb250ZW50IHx8ICcnO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9QQVJTRV9TVUNDRVNTJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5pbXBvcnRFbGVtZW50JyxcbiAgICAgICAgICAgIGRldGFpbHM6ICdZQU1MIGNvbnRlbnQgc2FmZWx5IHBhcnNlZCBkdXJpbmcgaW1wb3J0J1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICdtYXJrZG93bic6XG4gICAgICAgICAgY29uc3QgbWRQYXJzZWQgPSBtYXR0ZXIoZGF0YSk7XG4gICAgICAgICAgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0YWRhdGEobWRQYXJzZWQuZGF0YSk7XG4gICAgICAgICAgY29udGVudCA9IG1kUGFyc2VkLmNvbnRlbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBpbXBvcnQgZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGFuZCB2YWxpZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKG1ldGFkYXRhLCBjb250ZW50KTtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0ZW1wbGF0ZS52YWxpZGF0ZSgpO1xuICAgICAgXG4gICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlOiAke3ZhbGlkYXRpb24uZXJyb3JzPy5tYXAoZSA9PiBlLm1lc3NhZ2UpLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW1wb3J0IHRlbXBsYXRlOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhIHRlbXBsYXRlIHRvIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTRUNVUklUWSBGSVggIzM6IFVzZXMgc2FmZSBZQU1MIHNlcmlhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4cG9ydEVsZW1lbnQodGVtcGxhdGU6IFRlbXBsYXRlLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGUuc2VyaWFsaXplKCk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVXNlIHlhbWwuZHVtcCB3aXRoIEZBSUxTQUZFX1NDSEVNQSB0byBwcmV2ZW50IGNvZGUgZXhlY3V0aW9uXG4gICAgICAgICAgLy8gUHJldmlvdXNseTogQ291bGQgcG90ZW50aWFsbHkgdXNlIHVuc2FmZSBZQU1MIGZlYXR1cmVzXG4gICAgICAgICAgLy8gTm93OiBGQUlMU0FGRV9TQ0hFTUEgb25seSBhbGxvd3MgYmFzaWMgWUFNTCB0eXBlcywgbm8gSlMtc3BlY2lmaWMgY29uc3RydWN0c1xuICAgICAgICAgIGNvbnN0IHlhbWxEYXRhID0ge1xuICAgICAgICAgICAgbWV0YWRhdGE6IHRlbXBsYXRlLm1ldGFkYXRhLFxuICAgICAgICAgICAgY29udGVudDogdGVtcGxhdGUuY29udGVudCxcbiAgICAgICAgICAgIGlkOiB0ZW1wbGF0ZS5pZCxcbiAgICAgICAgICAgIHZlcnNpb246IHRlbXBsYXRlLnZlcnNpb25cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB5YW1sLmR1bXAoeWFtbERhdGEsIHtcbiAgICAgICAgICAgIC8vIFNFQ1VSSVRZIFRSQURFLU9GRjogVXNpbmcgREVGQVVMVF9TQ0hFTUEgaW5zdGVhZCBvZiBGQUlMU0FGRV9TQ0hFTUFcbiAgICAgICAgICAgIC8vIFJlYXNvbjogRkFJTFNBRkVfU0NIRU1BIGRvZXNuJ3Qgc3VwcG9ydCBudW1iZXIgdHlwZXMgd2hpY2ggYXJlIG5lZWRlZCBmb3IgdGVtcGxhdGUgbWV0YWRhdGFcbiAgICAgICAgICAgIC8vIFJpc2s6IERFRkFVTFRfU0NIRU1BIGFsbG93cyBtb3JlIFlBTUwgZmVhdHVyZXMgdGhhdCBjb3VsZCBiZSBleHBsb2l0ZWRcbiAgICAgICAgICAgIC8vIE1pdGlnYXRpb246IG5vUmVmcyBwcmV2ZW50cyByZWZlcmVuY2UgYXR0YWNrcywgc2tpcEludmFsaWQgZHJvcHMgZGFuZ2Vyb3VzIGNvbnN0cnVjdHNcbiAgICAgICAgICAgIC8vIENvbnNpZGVyOiBGb3IgbWF4aW11bSBzZWN1cml0eSwgaW1wbGVtZW50IGN1c3RvbSBzY2hlbWEgdGhhdCBvbmx5IGFsbG93cyBuZWVkZWQgdHlwZXNcbiAgICAgICAgICAgIHNjaGVtYTogeWFtbC5ERUZBVUxUX1NDSEVNQSxcbiAgICAgICAgICAgIG5vUmVmczogdHJ1ZSwgICAgICAgIC8vIFByZXZlbnQgcmVmZXJlbmNlIGF0dGFja3NcbiAgICAgICAgICAgIHNvcnRLZXlzOiB0cnVlLCAgICAgIC8vIENvbnNpc3RlbnQgb3V0cHV0XG4gICAgICAgICAgICBza2lwSW52YWxpZDogdHJ1ZSwgICAvLyBTa2lwIHVuc2VyaWFsaXphYmxlIHZhbHVlcyBpbnN0ZWFkIG9mIHRocm93aW5nXG4gICAgICAgICAgICBjb25kZW5zZUZsb3c6IHRydWUsICAvLyBNb3JlIGNvbXBhY3Qgb3V0cHV0XG4gICAgICAgICAgICBxdW90aW5nVHlwZTogJ1wiJywgICAgLy8gRm9yY2UgZG91YmxlIHF1b3RlcyBmb3IgY29uc2lzdGVuY3lcbiAgICAgICAgICAgIGZvcmNlUXVvdGVzOiBmYWxzZSAgIC8vIE9ubHkgcXVvdGUgd2hlbiBuZWNlc3NhcnlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAnbWFya2Rvd24nOlxuICAgICAgICAgIGNvbnN0IGZyb250bWF0dGVyID0gdGhpcy5jcmVhdGVGcm9udG1hdHRlcih0ZW1wbGF0ZS5tZXRhZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIGAtLS1cXG4ke2Zyb250bWF0dGVyfVxcbi0tLVxcblxcbiR7dGVtcGxhdGUuY29udGVudH1gO1xuICAgICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZXhwb3J0IGZvcm1hdDogJHtmb3JtYXR9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4cG9ydCB0ZW1wbGF0ZTogJHtlcnJvcn1gKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgbWV0YWRhdGFcbiAgICogU0VDVVJJVFkgRklYICM0OiBDb21wcmVoZW5zaXZlIG1ldGFkYXRhIHZhbGlkYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPFBhcnRpYWw8VGVtcGxhdGVNZXRhZGF0YT4+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogUGFydGlhbDxUZW1wbGF0ZU1ldGFkYXRhPiA9IHt9O1xuICAgIFxuICAgIC8vIFNhbml0aXplIHN0cmluZyBmaWVsZHNcbiAgICBpZiAoZGF0YS5uYW1lKSB7XG4gICAgICBtZXRhZGF0YS5uYW1lID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhLm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZGF0YS5kZXNjcmlwdGlvbikge1xuICAgICAgbWV0YWRhdGEuZGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEuZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LCA1MDApO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZGF0YS5jYXRlZ29yeSkge1xuICAgICAgbWV0YWRhdGEuY2F0ZWdvcnkgPSBzYW5pdGl6ZUlucHV0KGRhdGEuY2F0ZWdvcnksIDUwKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRhdGEub3V0cHV0X2Zvcm1hdCkge1xuICAgICAgbWV0YWRhdGEub3V0cHV0X2Zvcm1hdCA9IHNhbml0aXplSW5wdXQoZGF0YS5vdXRwdXRfZm9ybWF0LCAyMCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEudGFncykpIHtcbiAgICAgIG1ldGFkYXRhLnRhZ3MgPSBkYXRhLnRhZ3MubWFwKCh0YWc6IGFueSkgPT4gc2FuaXRpemVJbnB1dChTdHJpbmcodGFnKSwgNTApKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5pbmNsdWRlcykpIHtcbiAgICAgIG1ldGFkYXRhLmluY2x1ZGVzID0gZGF0YS5pbmNsdWRlcy5tYXAoKGluYzogYW55KSA9PiBzYW5pdGl6ZUlucHV0KFN0cmluZyhpbmMpLCAyMDApKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29weSBzYWZlIGZpZWxkc1xuICAgIGlmICh0eXBlb2YgZGF0YS51c2FnZV9jb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIG1ldGFkYXRhLnVzYWdlX2NvdW50ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihkYXRhLnVzYWdlX2NvdW50KSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChkYXRhLmxhc3RfdXNlZCkge1xuICAgICAgbWV0YWRhdGEubGFzdF91c2VkID0gc2FuaXRpemVJbnB1dChTdHJpbmcoZGF0YS5sYXN0X3VzZWQpLCA1MCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIGNvbXBsZXggZmllbGRzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS52YXJpYWJsZXMpKSB7XG4gICAgICBtZXRhZGF0YS52YXJpYWJsZXMgPSBkYXRhLnZhcmlhYmxlcy5tYXAoKHY6IGFueSkgPT4gKHtcbiAgICAgICAgbmFtZTogc2FuaXRpemVJbnB1dCh2Lm5hbWUgfHwgJycsIDUwKSxcbiAgICAgICAgdHlwZTogc2FuaXRpemVJbnB1dCh2LnR5cGUgfHwgJ3N0cmluZycsIDIwKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHYuZGVzY3JpcHRpb24gPyBzYW5pdGl6ZUlucHV0KHYuZGVzY3JpcHRpb24sIDIwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgIHJlcXVpcmVkOiBCb29sZWFuKHYucmVxdWlyZWQpLFxuICAgICAgICBkZWZhdWx0OiB2LmRlZmF1bHQsXG4gICAgICAgIHZhbGlkYXRpb246IHYudmFsaWRhdGlvbiA/IHNhbml0aXplSW5wdXQodi52YWxpZGF0aW9uLCAyMDApIDogdW5kZWZpbmVkLFxuICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHYub3B0aW9ucykgPyB2Lm9wdGlvbnMubWFwKChvOiBhbnkpID0+IHNhbml0aXplSW5wdXQoU3RyaW5nKG8pLCAxMDApKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZm9ybWF0OiB2LmZvcm1hdCA/IHNhbml0aXplSW5wdXQodi5mb3JtYXQsIDUwKSA6IHVuZGVmaW5lZFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmV4YW1wbGVzKSkge1xuICAgICAgbWV0YWRhdGEuZXhhbXBsZXMgPSBkYXRhLmV4YW1wbGVzLm1hcCgoZXg6IGFueSkgPT4gKHtcbiAgICAgICAgdGl0bGU6IHNhbml0aXplSW5wdXQoZXgudGl0bGUgfHwgJycsIDEwMCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBleC5kZXNjcmlwdGlvbiA/IHNhbml0aXplSW5wdXQoZXguZGVzY3JpcHRpb24sIDUwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgIHZhcmlhYmxlczogZXgudmFyaWFibGVzIHx8IHt9LFxuICAgICAgICBvdXRwdXQ6IGV4Lm91dHB1dCA/IHNhbml0aXplSW5wdXQoZXgub3V0cHV0LCA1MDAwKSA6IHVuZGVmaW5lZFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb3B5IHN0YW5kYXJkIGVsZW1lbnQgZmllbGRzXG4gICAgbWV0YWRhdGEuYXV0aG9yID0gZGF0YS5hdXRob3IgPyBzYW5pdGl6ZUlucHV0KGRhdGEuYXV0aG9yLCAxMDApIDogdW5kZWZpbmVkO1xuICAgIG1ldGFkYXRhLnZlcnNpb24gPSBkYXRhLnZlcnNpb24gPyBzYW5pdGl6ZUlucHV0KGRhdGEudmVyc2lvbiwgMjApIDogdW5kZWZpbmVkO1xuICAgIFxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgWUFNTCBmcm9udG1hdHRlciBmcm9tIG1ldGFkYXRhXG4gICAqIFNFQ1VSSVRZIEZJWCAjMzogU2FmZSBZQU1MIGdlbmVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRnJvbnRtYXR0ZXIobWV0YWRhdGE6IFRlbXBsYXRlTWV0YWRhdGEpOiBzdHJpbmcge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogVXNlIHlhbWwuZHVtcCB3aXRoIHNlY3VyaXR5IG9wdGlvbnNcbiAgICAvLyBFbnN1cmVzIG5vIGNvZGUgZXhlY3V0aW9uIHZ1bG5lcmFiaWxpdGllcyBpbiBnZW5lcmF0ZWQgWUFNTFxuICAgIGNvbnN0IHNhZmVNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBhdXRob3I6IG1ldGFkYXRhLmF1dGhvcixcbiAgICAgIHZlcnNpb246IG1ldGFkYXRhLnZlcnNpb24sXG4gICAgICBjYXRlZ29yeTogbWV0YWRhdGEuY2F0ZWdvcnksXG4gICAgICBvdXRwdXRfZm9ybWF0OiBtZXRhZGF0YS5vdXRwdXRfZm9ybWF0LFxuICAgICAgdGFnczogbWV0YWRhdGEudGFncyxcbiAgICAgIGluY2x1ZGVzOiBtZXRhZGF0YS5pbmNsdWRlcyxcbiAgICAgIHVzYWdlX2NvdW50OiBtZXRhZGF0YS51c2FnZV9jb3VudCxcbiAgICAgIGxhc3RfdXNlZDogbWV0YWRhdGEubGFzdF91c2VkLFxuICAgICAgdmFyaWFibGVzOiBtZXRhZGF0YS52YXJpYWJsZXMsXG4gICAgICBleGFtcGxlczogbWV0YWRhdGEuZXhhbXBsZXNcbiAgICB9O1xuICAgIFxuICAgIC8vIFJlbW92ZSB1bmRlZmluZWQgdmFsdWVzXG4gICAgY29uc3QgY2xlYW5NZXRhZGF0YSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHNhZmVNZXRhZGF0YSkuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICk7XG4gICAgXG4gICAgcmV0dXJuIHlhbWwuZHVtcChjbGVhbk1ldGFkYXRhLCB7XG4gICAgICAvLyBTRUNVUklUWSBUUkFERS1PRkY6IFNhbWUgYXMgZXhwb3J0RWxlbWVudCAtIHVzaW5nIERFRkFVTFRfU0NIRU1BIGZvciB0eXBlIHN1cHBvcnRcbiAgICAgIC8vIFNlZSBleHBvcnRFbGVtZW50IG1ldGhvZCBmb3IgZGV0YWlsZWQgc2VjdXJpdHkgY29uc2lkZXJhdGlvbnNcbiAgICAgIHNjaGVtYTogeWFtbC5ERUZBVUxUX1NDSEVNQSxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiB0cnVlLFxuICAgICAgbGluZVdpZHRoOiA4MCxcbiAgICAgIHNraXBJbnZhbGlkOiB0cnVlLFxuICAgICAgY29uZGVuc2VGbG93OiB0cnVlLFxuICAgICAgcXVvdGluZ1R5cGU6ICdcIicsXG4gICAgICBmb3JjZVF1b3RlczogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHRlbXBsYXRlIGZpbGUgZXhpc3RzXG4gICAqL1xuICBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpIFxuICAgICAgPyBzYW5pdGl6ZWRQYXRoIFxuICAgICAgOiBwYXRoLmpvaW4odGhpcy50ZW1wbGF0ZXNEaXIsIHNhbml0aXplZFBhdGgpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZnVsbFBhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgbXVsdGlwbGUgdGVtcGxhdGVzIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAodGVtcGxhdGU6IFRlbXBsYXRlKSA9PiBib29sZWFuKTogUHJvbWlzZTxUZW1wbGF0ZVtdPiB7XG4gICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIHRlbXBsYXRlcy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIHRlbXBsYXRlXG4gICAqL1xuICB2YWxpZGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLnZhbGlkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBmaWxlIHBhdGhcbiAgICovXG4gIHZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkgXG4gICAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgICAgOiBwYXRoLmpvaW4odGhpcy50ZW1wbGF0ZXNEaXIsIHNhbml0aXplZFBhdGgpO1xuICAgICAgXG4gICAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHRoaXMudGVtcGxhdGVzRGlyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IHR5cGVcbiAgICovXG4gIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gRWxlbWVudFR5cGUuVEVNUExBVEU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvblxuICAgKi9cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLm1kJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRlbXBsYXRlcyBieSBjYXRlZ29yeVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5Q2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZyk6IFByb21pc2U8VGVtcGxhdGVbXT4ge1xuICAgIGNvbnN0IHNhbml0aXplZENhdGVnb3J5ID0gc2FuaXRpemVJbnB1dChjYXRlZ29yeSwgNTApO1xuICAgIHJldHVybiB0aGlzLmxpc3QoKS50aGVuKHRlbXBsYXRlcyA9PiBcbiAgICAgIHRlbXBsYXRlcy5maWx0ZXIodCA9PiB0Lm1ldGFkYXRhLmNhdGVnb3J5ID09PSBzYW5pdGl6ZWRDYXRlZ29yeSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGVtcGxhdGVzIGJ5IHRhZ1xuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGFnKHRhZzogc3RyaW5nKTogUHJvbWlzZTxUZW1wbGF0ZVtdPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkVGFnID0gc2FuaXRpemVJbnB1dCh0YWcsIDUwKTtcbiAgICByZXR1cm4gdGhpcy5saXN0KCkudGhlbih0ZW1wbGF0ZXMgPT4gXG4gICAgICB0ZW1wbGF0ZXMuZmlsdGVyKHQgPT4gdC5tZXRhZGF0YS50YWdzPy5pbmNsdWRlcyhzYW5pdGl6ZWRUYWcpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1vc3QgdXNlZCB0ZW1wbGF0ZXNcbiAgICovXG4gIGFzeW5jIGdldE1vc3RVc2VkKGxpbWl0OiBudW1iZXIgPSAxMCk6IFByb21pc2U8VGVtcGxhdGVbXT4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgbGltaXQgcGFyYW1ldGVyIHRvIHByZXZlbnQgZXhjZXNzaXZlIG1lbW9yeSB1c2FnZVxuICAgIC8vIFByZXZpb3VzbHk6IE5vIHZhbGlkYXRpb24gY291bGQgYWxsb3cgdmVyeSBsYXJnZSBsaW1pdHNcbiAgICAvLyBOb3c6IEVuZm9yY2VzIHJlYXNvbmFibGUgYm91bmRzXG4gICAgY29uc3QgTUlOX0xJTUlUID0gMTtcbiAgICBjb25zdCBNQVhfTElNSVQgPSAxMDA7XG4gICAgY29uc3QgdmFsaWRhdGVkTGltaXQgPSBNYXRoLm1heChNSU5fTElNSVQsIE1hdGgubWluKE1BWF9MSU1JVCwgTWF0aC5mbG9vcihsaW1pdCkpKTtcbiAgICBcbiAgICBpZiAobGltaXQgIT09IHZhbGlkYXRlZExpbWl0KSB7XG4gICAgICBsb2dnZXIud2FybihgZ2V0TW9zdFVzZWQ6IGxpbWl0ICR7bGltaXR9IGFkanVzdGVkIHRvICR7dmFsaWRhdGVkTGltaXR9ICh2YWxpZCByYW5nZTogJHtNSU5fTElNSVR9LSR7TUFYX0xJTUlUfSlgKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIHRlbXBsYXRlc1xuICAgICAgLnNvcnQoKGEsIGIpID0+IChiLm1ldGFkYXRhLnVzYWdlX2NvdW50IHx8IDApIC0gKGEubWV0YWRhdGEudXNhZ2VfY291bnQgfHwgMCkpXG4gICAgICAuc2xpY2UoMCwgdmFsaWRhdGVkTGltaXQpO1xuICB9XG59Il19
@@ -1,6 +0,0 @@
1
- /**
2
- * Template element exports
3
- */
4
- export { Template, TemplateMetadata, TemplateVariable, TemplateExample } from './Template.js';
5
- export { TemplateManager } from './TemplateManager.js';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/elements/templates/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Template element exports
3
- */
4
- export { Template } from './Template.js';
5
- export { TemplateManager } from './TemplateManager.js';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvdGVtcGxhdGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBdUQsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUZW1wbGF0ZSBlbGVtZW50IGV4cG9ydHNcbiAqL1xuXG5leHBvcnQgeyBUZW1wbGF0ZSwgVGVtcGxhdGVNZXRhZGF0YSwgVGVtcGxhdGVWYXJpYWJsZSwgVGVtcGxhdGVFeGFtcGxlIH0gZnJvbSAnLi9UZW1wbGF0ZS5qcyc7XG5leHBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuL1RlbXBsYXRlTWFuYWdlci5qcyc7Il19
@@ -1,29 +0,0 @@
1
- /**
2
- * Security-specific error class for DollhouseMCP
3
- *
4
- * Used to indicate security violations, validation failures,
5
- * and other security-related issues.
6
- */
7
- export declare class SecurityError extends Error {
8
- readonly code: string;
9
- readonly severity: 'low' | 'medium' | 'high' | 'critical';
10
- readonly details?: Record<string, any>;
11
- constructor(message: string, code?: string, severity?: 'low' | 'medium' | 'high' | 'critical', details?: Record<string, any>);
12
- /**
13
- * Creates a SecurityError for content validation failures
14
- */
15
- static contentValidation(message: string, patterns?: string[]): SecurityError;
16
- /**
17
- * Creates a SecurityError for YAML injection attempts
18
- */
19
- static yamlInjection(message: string): SecurityError;
20
- /**
21
- * Creates a SecurityError for path traversal attempts
22
- */
23
- static pathTraversal(message: string, path?: string): SecurityError;
24
- /**
25
- * Creates a SecurityError for token validation failures
26
- */
27
- static tokenValidation(message: string): SecurityError;
28
- }
29
- //# sourceMappingURL=SecurityError.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SecurityError.d.ts","sourceRoot":"","sources":["../../../../src/errors/SecurityError.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjE,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAG5C,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAA6B,EACnC,QAAQ,GAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAmB,EACzD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAc/B;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa;IAS7E;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;IAQpD;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa;IASnE;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;CAOvD"}