@dollhousemcp/mcp-server 1.4.4 → 1.4.5

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 (650) hide show
  1. package/dist/generated/version.d.ts +2 -2
  2. package/dist/generated/version.js +3 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +54 -7
  5. package/package.json +1 -1
  6. package/dist/collection/MarketplaceBrowser.d.ts +0 -24
  7. package/dist/collection/MarketplaceBrowser.d.ts.map +0 -1
  8. package/dist/collection/MarketplaceBrowser.js +0 -115
  9. package/dist/collection/MarketplaceSearch.d.ts +0 -18
  10. package/dist/collection/MarketplaceSearch.d.ts.map +0 -1
  11. package/dist/collection/MarketplaceSearch.js +0 -48
  12. package/dist/collection/PersonaInstaller.d.ts +0 -26
  13. package/dist/collection/PersonaInstaller.d.ts.map +0 -1
  14. package/dist/collection/PersonaInstaller.js +0 -103
  15. package/dist/elements/ensembles/Ensemble.d.ts +0 -144
  16. package/dist/elements/ensembles/Ensemble.d.ts.map +0 -1
  17. package/dist/elements/ensembles/Ensemble.js +0 -860
  18. package/dist/elements/ensembles/EnsembleManager.d.ts +0 -85
  19. package/dist/elements/ensembles/EnsembleManager.d.ts.map +0 -1
  20. package/dist/elements/ensembles/EnsembleManager.js +0 -378
  21. package/dist/elements/ensembles/constants.d.ts +0 -73
  22. package/dist/elements/ensembles/constants.d.ts.map +0 -1
  23. package/dist/elements/ensembles/constants.js +0 -92
  24. package/dist/elements/ensembles/index.d.ts +0 -8
  25. package/dist/elements/ensembles/index.d.ts.map +0 -1
  26. package/dist/elements/ensembles/index.js +0 -8
  27. package/dist/elements/ensembles/types.d.ts +0 -92
  28. package/dist/elements/ensembles/types.d.ts.map +0 -1
  29. package/dist/elements/ensembles/types.js +0 -8
  30. package/dist/elements/memories/Memory.d.ts +0 -110
  31. package/dist/elements/memories/Memory.d.ts.map +0 -1
  32. package/dist/elements/memories/Memory.js +0 -470
  33. package/dist/elements/memories/MemoryManager.d.ts +0 -86
  34. package/dist/elements/memories/MemoryManager.d.ts.map +0 -1
  35. package/dist/elements/memories/MemoryManager.js +0 -435
  36. package/dist/elements/memories/constants.d.ts +0 -42
  37. package/dist/elements/memories/constants.d.ts.map +0 -1
  38. package/dist/elements/memories/constants.js +0 -49
  39. package/dist/elements/memories/index.d.ts +0 -6
  40. package/dist/elements/memories/index.d.ts.map +0 -1
  41. package/dist/elements/memories/index.js +0 -6
  42. package/dist/marketplace/GitHubClient.d.ts +0 -22
  43. package/dist/marketplace/GitHubClient.d.ts.map +0 -1
  44. package/dist/marketplace/GitHubClient.js +0 -112
  45. package/dist/marketplace/MarketplaceBrowser.d.ts +0 -24
  46. package/dist/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  47. package/dist/marketplace/MarketplaceBrowser.js +0 -115
  48. package/dist/marketplace/MarketplaceSearch.d.ts +0 -18
  49. package/dist/marketplace/MarketplaceSearch.d.ts.map +0 -1
  50. package/dist/marketplace/MarketplaceSearch.js +0 -48
  51. package/dist/marketplace/PersonaDetails.d.ts +0 -22
  52. package/dist/marketplace/PersonaDetails.d.ts.map +0 -1
  53. package/dist/marketplace/PersonaDetails.js +0 -71
  54. package/dist/marketplace/PersonaInstaller.d.ts +0 -25
  55. package/dist/marketplace/PersonaInstaller.d.ts.map +0 -1
  56. package/dist/marketplace/PersonaInstaller.js +0 -100
  57. package/dist/marketplace/PersonaSubmitter.d.ts +0 -19
  58. package/dist/marketplace/PersonaSubmitter.d.ts.map +0 -1
  59. package/dist/marketplace/PersonaSubmitter.js +0 -57
  60. package/dist/marketplace/index.d.ts +0 -10
  61. package/dist/marketplace/index.d.ts.map +0 -1
  62. package/dist/marketplace/index.js +0 -10
  63. package/dist/server/tools/MarketplaceTools.d.ts +0 -10
  64. package/dist/server/tools/MarketplaceTools.d.ts.map +0 -1
  65. package/dist/server/tools/MarketplaceTools.js +0 -96
  66. package/dist/src/cache/APICache.d.ts +0 -23
  67. package/dist/src/cache/APICache.d.ts.map +0 -1
  68. package/dist/src/cache/APICache.js +0 -42
  69. package/dist/src/cache/index.d.ts +0 -5
  70. package/dist/src/cache/index.d.ts.map +0 -1
  71. package/dist/src/cache/index.js +0 -5
  72. package/dist/src/config/constants.d.ts +0 -25
  73. package/dist/src/config/constants.d.ts.map +0 -1
  74. package/dist/src/config/constants.js +0 -30
  75. package/dist/src/config/index.d.ts +0 -6
  76. package/dist/src/config/index.d.ts.map +0 -1
  77. package/dist/src/config/index.js +0 -6
  78. package/dist/src/config/indicator-config.d.ts +0 -107
  79. package/dist/src/config/indicator-config.d.ts.map +0 -1
  80. package/dist/src/config/indicator-config.js +0 -158
  81. package/dist/src/constants/defaultPersonas.d.ts +0 -10
  82. package/dist/src/constants/defaultPersonas.d.ts.map +0 -1
  83. package/dist/src/constants/defaultPersonas.js +0 -18
  84. package/dist/src/constants/limits.d.ts +0 -10
  85. package/dist/src/constants/limits.d.ts.map +0 -1
  86. package/dist/src/constants/limits.js +0 -13
  87. package/dist/src/errors/SecurityError.d.ts +0 -29
  88. package/dist/src/errors/SecurityError.d.ts.map +0 -1
  89. package/dist/src/errors/SecurityError.js +0 -47
  90. package/dist/src/errors/index.d.ts +0 -2
  91. package/dist/src/errors/index.d.ts.map +0 -1
  92. package/dist/src/errors/index.js +0 -2
  93. package/dist/src/index.barrel.d.ts +0 -21
  94. package/dist/src/index.barrel.d.ts.map +0 -1
  95. package/dist/src/index.barrel.js +0 -31
  96. package/dist/src/index.d.ts +0 -220
  97. package/dist/src/index.d.ts.map +0 -1
  98. package/dist/src/index.js +0 -1559
  99. package/dist/src/marketplace/GitHubClient.d.ts +0 -22
  100. package/dist/src/marketplace/GitHubClient.d.ts.map +0 -1
  101. package/dist/src/marketplace/GitHubClient.js +0 -112
  102. package/dist/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  103. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  104. package/dist/src/marketplace/MarketplaceBrowser.js +0 -45
  105. package/dist/src/marketplace/MarketplaceSearch.d.ts +0 -18
  106. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  107. package/dist/src/marketplace/MarketplaceSearch.js +0 -36
  108. package/dist/src/marketplace/PersonaDetails.d.ts +0 -22
  109. package/dist/src/marketplace/PersonaDetails.d.ts.map +0 -1
  110. package/dist/src/marketplace/PersonaDetails.js +0 -71
  111. package/dist/src/marketplace/PersonaInstaller.d.ts +0 -25
  112. package/dist/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  113. package/dist/src/marketplace/PersonaInstaller.js +0 -100
  114. package/dist/src/marketplace/PersonaSubmitter.d.ts +0 -19
  115. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  116. package/dist/src/marketplace/PersonaSubmitter.js +0 -57
  117. package/dist/src/marketplace/index.d.ts +0 -10
  118. package/dist/src/marketplace/index.d.ts.map +0 -1
  119. package/dist/src/marketplace/index.js +0 -10
  120. package/dist/src/persona/PersonaLoader.d.ts +0 -33
  121. package/dist/src/persona/PersonaLoader.d.ts.map +0 -1
  122. package/dist/src/persona/PersonaLoader.js +0 -139
  123. package/dist/src/persona/PersonaManager.d.ts +0 -112
  124. package/dist/src/persona/PersonaManager.d.ts.map +0 -1
  125. package/dist/src/persona/PersonaManager.js +0 -341
  126. package/dist/src/persona/PersonaValidator.d.ts +0 -33
  127. package/dist/src/persona/PersonaValidator.d.ts.map +0 -1
  128. package/dist/src/persona/PersonaValidator.js +0 -157
  129. package/dist/src/persona/export-import/PersonaExporter.d.ts +0 -43
  130. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  131. package/dist/src/persona/export-import/PersonaExporter.js +0 -99
  132. package/dist/src/persona/export-import/PersonaImporter.d.ts +0 -65
  133. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  134. package/dist/src/persona/export-import/PersonaImporter.js +0 -313
  135. package/dist/src/persona/export-import/PersonaSharer.d.ts +0 -60
  136. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  137. package/dist/src/persona/export-import/PersonaSharer.js +0 -363
  138. package/dist/src/persona/export-import/index.d.ts +0 -10
  139. package/dist/src/persona/export-import/index.d.ts.map +0 -1
  140. package/dist/src/persona/export-import/index.js +0 -7
  141. package/dist/src/persona/index.d.ts +0 -7
  142. package/dist/src/persona/index.d.ts.map +0 -1
  143. package/dist/src/persona/index.js +0 -7
  144. package/dist/src/security/InputValidator.d.ts +0 -69
  145. package/dist/src/security/InputValidator.d.ts.map +0 -1
  146. package/dist/src/security/InputValidator.js +0 -381
  147. package/dist/src/security/commandValidator.d.ts +0 -7
  148. package/dist/src/security/commandValidator.d.ts.map +0 -1
  149. package/dist/src/security/commandValidator.js +0 -77
  150. package/dist/src/security/constants.d.ts +0 -21
  151. package/dist/src/security/constants.d.ts.map +0 -1
  152. package/dist/src/security/constants.js +0 -23
  153. package/dist/src/security/contentValidator.d.ts +0 -47
  154. package/dist/src/security/contentValidator.d.ts.map +0 -1
  155. package/dist/src/security/contentValidator.js +0 -188
  156. package/dist/src/security/fileLockManager.d.ts +0 -70
  157. package/dist/src/security/fileLockManager.d.ts.map +0 -1
  158. package/dist/src/security/fileLockManager.js +0 -187
  159. package/dist/src/security/index.d.ts +0 -12
  160. package/dist/src/security/index.d.ts.map +0 -1
  161. package/dist/src/security/index.js +0 -14
  162. package/dist/src/security/pathValidator.d.ts +0 -9
  163. package/dist/src/security/pathValidator.d.ts.map +0 -1
  164. package/dist/src/security/pathValidator.js +0 -97
  165. package/dist/src/security/secureYamlParser.d.ts +0 -46
  166. package/dist/src/security/secureYamlParser.d.ts.map +0 -1
  167. package/dist/src/security/secureYamlParser.js +0 -203
  168. package/dist/src/security/securityMonitor.d.ts +0 -58
  169. package/dist/src/security/securityMonitor.d.ts.map +0 -1
  170. package/dist/src/security/securityMonitor.js +0 -108
  171. package/dist/src/security/tokenManager.d.ts +0 -59
  172. package/dist/src/security/tokenManager.d.ts.map +0 -1
  173. package/dist/src/security/tokenManager.js +0 -216
  174. package/dist/src/security/yamlValidator.d.ts +0 -20
  175. package/dist/src/security/yamlValidator.d.ts.map +0 -1
  176. package/dist/src/security/yamlValidator.js +0 -138
  177. package/dist/src/server/ServerSetup.d.ts +0 -31
  178. package/dist/src/server/ServerSetup.d.ts.map +0 -1
  179. package/dist/src/server/ServerSetup.js +0 -79
  180. package/dist/src/server/index.d.ts +0 -7
  181. package/dist/src/server/index.d.ts.map +0 -1
  182. package/dist/src/server/index.js +0 -7
  183. package/dist/src/server/tools/ConfigTools.d.ts +0 -10
  184. package/dist/src/server/tools/ConfigTools.d.ts.map +0 -1
  185. package/dist/src/server/tools/ConfigTools.js +0 -63
  186. package/dist/src/server/tools/MarketplaceTools.d.ts +0 -10
  187. package/dist/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  188. package/dist/src/server/tools/MarketplaceTools.js +0 -92
  189. package/dist/src/server/tools/PersonaTools.d.ts +0 -10
  190. package/dist/src/server/tools/PersonaTools.d.ts.map +0 -1
  191. package/dist/src/server/tools/PersonaTools.js +0 -257
  192. package/dist/src/server/tools/ToolRegistry.d.ts +0 -37
  193. package/dist/src/server/tools/ToolRegistry.d.ts.map +0 -1
  194. package/dist/src/server/tools/ToolRegistry.js +0 -40
  195. package/dist/src/server/tools/UpdateTools.d.ts +0 -10
  196. package/dist/src/server/tools/UpdateTools.d.ts.map +0 -1
  197. package/dist/src/server/tools/UpdateTools.js +0 -64
  198. package/dist/src/server/tools/UserTools.d.ts +0 -10
  199. package/dist/src/server/tools/UserTools.d.ts.map +0 -1
  200. package/dist/src/server/tools/UserTools.js +0 -51
  201. package/dist/src/server/tools/index.d.ts +0 -10
  202. package/dist/src/server/tools/index.d.ts.map +0 -1
  203. package/dist/src/server/tools/index.js +0 -10
  204. package/dist/src/server/types.d.ts +0 -34
  205. package/dist/src/server/types.d.ts.map +0 -1
  206. package/dist/src/server/types.js +0 -5
  207. package/dist/src/tools/debug.d.ts +0 -20
  208. package/dist/src/tools/debug.d.ts.map +0 -1
  209. package/dist/src/tools/debug.js +0 -37
  210. package/dist/src/types/cache.d.ts +0 -8
  211. package/dist/src/types/cache.d.ts.map +0 -1
  212. package/dist/src/types/cache.js +0 -5
  213. package/dist/src/types/index.d.ts +0 -8
  214. package/dist/src/types/index.d.ts.map +0 -1
  215. package/dist/src/types/index.js +0 -8
  216. package/dist/src/types/marketplace.d.ts +0 -23
  217. package/dist/src/types/marketplace.d.ts.map +0 -1
  218. package/dist/src/types/marketplace.js +0 -5
  219. package/dist/src/types/mcp.d.ts +0 -161
  220. package/dist/src/types/mcp.d.ts.map +0 -1
  221. package/dist/src/types/mcp.js +0 -75
  222. package/dist/src/types/persona.d.ts +0 -30
  223. package/dist/src/types/persona.d.ts.map +0 -1
  224. package/dist/src/types/persona.js +0 -5
  225. package/dist/src/update/BackupManager.d.ts +0 -46
  226. package/dist/src/update/BackupManager.d.ts.map +0 -1
  227. package/dist/src/update/BackupManager.js +0 -261
  228. package/dist/src/update/DependencyChecker.d.ts +0 -41
  229. package/dist/src/update/DependencyChecker.d.ts.map +0 -1
  230. package/dist/src/update/DependencyChecker.js +0 -132
  231. package/dist/src/update/RateLimiter.d.ts +0 -80
  232. package/dist/src/update/RateLimiter.d.ts.map +0 -1
  233. package/dist/src/update/RateLimiter.js +0 -172
  234. package/dist/src/update/SignatureVerifier.d.ts +0 -71
  235. package/dist/src/update/SignatureVerifier.d.ts.map +0 -1
  236. package/dist/src/update/SignatureVerifier.js +0 -214
  237. package/dist/src/update/UpdateChecker.d.ts +0 -127
  238. package/dist/src/update/UpdateChecker.d.ts.map +0 -1
  239. package/dist/src/update/UpdateChecker.js +0 -460
  240. package/dist/src/update/UpdateManager.d.ts +0 -41
  241. package/dist/src/update/UpdateManager.d.ts.map +0 -1
  242. package/dist/src/update/UpdateManager.js +0 -260
  243. package/dist/src/update/VersionManager.d.ts +0 -31
  244. package/dist/src/update/VersionManager.d.ts.map +0 -1
  245. package/dist/src/update/VersionManager.js +0 -134
  246. package/dist/src/update/index.d.ts +0 -9
  247. package/dist/src/update/index.d.ts.map +0 -1
  248. package/dist/src/update/index.js +0 -9
  249. package/dist/src/utils/filesystem.d.ts +0 -32
  250. package/dist/src/utils/filesystem.d.ts.map +0 -1
  251. package/dist/src/utils/filesystem.js +0 -73
  252. package/dist/src/utils/git.d.ts +0 -32
  253. package/dist/src/utils/git.d.ts.map +0 -1
  254. package/dist/src/utils/git.js +0 -65
  255. package/dist/src/utils/index.d.ts +0 -7
  256. package/dist/src/utils/index.d.ts.map +0 -1
  257. package/dist/src/utils/index.js +0 -7
  258. package/dist/src/utils/logger.d.ts +0 -45
  259. package/dist/src/utils/logger.d.ts.map +0 -1
  260. package/dist/src/utils/logger.js +0 -91
  261. package/dist/src/utils/version.d.ts +0 -25
  262. package/dist/src/utils/version.d.ts.map +0 -1
  263. package/dist/src/utils/version.js +0 -97
  264. package/dist/test/src/cache/APICache.d.ts +0 -23
  265. package/dist/test/src/cache/APICache.d.ts.map +0 -1
  266. package/dist/test/src/cache/APICache.js +0 -42
  267. package/dist/test/src/cache/index.d.ts +0 -5
  268. package/dist/test/src/cache/index.d.ts.map +0 -1
  269. package/dist/test/src/cache/index.js +0 -5
  270. package/dist/test/src/collection/CollectionBrowser.d.ts +0 -24
  271. package/dist/test/src/collection/CollectionBrowser.d.ts.map +0 -1
  272. package/dist/test/src/collection/CollectionBrowser.js +0 -115
  273. package/dist/test/src/collection/CollectionSearch.d.ts +0 -18
  274. package/dist/test/src/collection/CollectionSearch.d.ts.map +0 -1
  275. package/dist/test/src/collection/CollectionSearch.js +0 -48
  276. package/dist/test/src/collection/GitHubClient.d.ts +0 -22
  277. package/dist/test/src/collection/GitHubClient.d.ts.map +0 -1
  278. package/dist/test/src/collection/GitHubClient.js +0 -114
  279. package/dist/test/src/collection/PersonaDetails.d.ts +0 -22
  280. package/dist/test/src/collection/PersonaDetails.d.ts.map +0 -1
  281. package/dist/test/src/collection/PersonaDetails.js +0 -71
  282. package/dist/test/src/collection/PersonaInstaller.d.ts +0 -26
  283. package/dist/test/src/collection/PersonaInstaller.d.ts.map +0 -1
  284. package/dist/test/src/collection/PersonaInstaller.js +0 -103
  285. package/dist/test/src/collection/PersonaSubmitter.d.ts +0 -19
  286. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +0 -1
  287. package/dist/test/src/collection/PersonaSubmitter.js +0 -57
  288. package/dist/test/src/collection/index.d.ts +0 -10
  289. package/dist/test/src/collection/index.d.ts.map +0 -1
  290. package/dist/test/src/collection/index.js +0 -10
  291. package/dist/test/src/config/constants.d.ts +0 -25
  292. package/dist/test/src/config/constants.d.ts.map +0 -1
  293. package/dist/test/src/config/constants.js +0 -30
  294. package/dist/test/src/config/index.d.ts +0 -6
  295. package/dist/test/src/config/index.d.ts.map +0 -1
  296. package/dist/test/src/config/index.js +0 -6
  297. package/dist/test/src/config/indicator-config.d.ts +0 -107
  298. package/dist/test/src/config/indicator-config.d.ts.map +0 -1
  299. package/dist/test/src/config/indicator-config.js +0 -158
  300. package/dist/test/src/constants/defaultPersonas.d.ts +0 -10
  301. package/dist/test/src/constants/defaultPersonas.d.ts.map +0 -1
  302. package/dist/test/src/constants/defaultPersonas.js +0 -18
  303. package/dist/test/src/constants/limits.d.ts +0 -10
  304. package/dist/test/src/constants/limits.d.ts.map +0 -1
  305. package/dist/test/src/constants/limits.js +0 -13
  306. package/dist/test/src/elements/BaseElement.d.ts +0 -81
  307. package/dist/test/src/elements/BaseElement.d.ts.map +0 -1
  308. package/dist/test/src/elements/BaseElement.js +0 -381
  309. package/dist/test/src/elements/FeedbackProcessor.d.ts +0 -57
  310. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +0 -1
  311. package/dist/test/src/elements/FeedbackProcessor.js +0 -418
  312. package/dist/test/src/elements/agents/Agent.d.ts +0 -145
  313. package/dist/test/src/elements/agents/Agent.d.ts.map +0 -1
  314. package/dist/test/src/elements/agents/Agent.js +0 -848
  315. package/dist/test/src/elements/agents/AgentManager.d.ts +0 -125
  316. package/dist/test/src/elements/agents/AgentManager.d.ts.map +0 -1
  317. package/dist/test/src/elements/agents/AgentManager.js +0 -608
  318. package/dist/test/src/elements/agents/constants.d.ts +0 -42
  319. package/dist/test/src/elements/agents/constants.d.ts.map +0 -1
  320. package/dist/test/src/elements/agents/constants.js +0 -45
  321. package/dist/test/src/elements/agents/goalTemplates.d.ts +0 -44
  322. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +0 -1
  323. package/dist/test/src/elements/agents/goalTemplates.js +0 -297
  324. package/dist/test/src/elements/agents/index.d.ts +0 -8
  325. package/dist/test/src/elements/agents/index.d.ts.map +0 -1
  326. package/dist/test/src/elements/agents/index.js +0 -8
  327. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +0 -76
  328. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +0 -1
  329. package/dist/test/src/elements/agents/ruleEngineConfig.js +0 -143
  330. package/dist/test/src/elements/agents/types.d.ts +0 -97
  331. package/dist/test/src/elements/agents/types.d.ts.map +0 -1
  332. package/dist/test/src/elements/agents/types.js +0 -5
  333. package/dist/test/src/elements/index.d.ts +0 -6
  334. package/dist/test/src/elements/index.d.ts.map +0 -1
  335. package/dist/test/src/elements/index.js +0 -6
  336. package/dist/test/src/elements/memories/Memory.d.ts +0 -110
  337. package/dist/test/src/elements/memories/Memory.d.ts.map +0 -1
  338. package/dist/test/src/elements/memories/Memory.js +0 -470
  339. package/dist/test/src/elements/memories/MemoryManager.d.ts +0 -86
  340. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +0 -1
  341. package/dist/test/src/elements/memories/MemoryManager.js +0 -435
  342. package/dist/test/src/elements/memories/constants.d.ts +0 -42
  343. package/dist/test/src/elements/memories/constants.d.ts.map +0 -1
  344. package/dist/test/src/elements/memories/constants.js +0 -49
  345. package/dist/test/src/elements/memories/index.d.ts +0 -6
  346. package/dist/test/src/elements/memories/index.d.ts.map +0 -1
  347. package/dist/test/src/elements/memories/index.js +0 -6
  348. package/dist/test/src/elements/skills/Skill.d.ts +0 -109
  349. package/dist/test/src/elements/skills/Skill.d.ts.map +0 -1
  350. package/dist/test/src/elements/skills/Skill.js +0 -381
  351. package/dist/test/src/elements/templates/Template.d.ts +0 -138
  352. package/dist/test/src/elements/templates/Template.d.ts.map +0 -1
  353. package/dist/test/src/elements/templates/Template.js +0 -673
  354. package/dist/test/src/elements/templates/TemplateManager.d.ts +0 -104
  355. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +0 -1
  356. package/dist/test/src/elements/templates/TemplateManager.js +0 -496
  357. package/dist/test/src/elements/templates/index.d.ts +0 -6
  358. package/dist/test/src/elements/templates/index.d.ts.map +0 -1
  359. package/dist/test/src/elements/templates/index.js +0 -6
  360. package/dist/test/src/errors/SecurityError.d.ts +0 -29
  361. package/dist/test/src/errors/SecurityError.d.ts.map +0 -1
  362. package/dist/test/src/errors/SecurityError.js +0 -47
  363. package/dist/test/src/errors/index.d.ts +0 -2
  364. package/dist/test/src/errors/index.d.ts.map +0 -1
  365. package/dist/test/src/errors/index.js +0 -2
  366. package/dist/test/src/index.barrel.d.ts +0 -21
  367. package/dist/test/src/index.barrel.d.ts.map +0 -1
  368. package/dist/test/src/index.barrel.js +0 -31
  369. package/dist/test/src/index.d.ts +0 -223
  370. package/dist/test/src/index.d.ts.map +0 -1
  371. package/dist/test/src/index.js +0 -1594
  372. package/dist/test/src/marketplace/GitHubClient.d.ts +0 -22
  373. package/dist/test/src/marketplace/GitHubClient.d.ts.map +0 -1
  374. package/dist/test/src/marketplace/GitHubClient.js +0 -112
  375. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  376. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  377. package/dist/test/src/marketplace/MarketplaceBrowser.js +0 -45
  378. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +0 -18
  379. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  380. package/dist/test/src/marketplace/MarketplaceSearch.js +0 -36
  381. package/dist/test/src/marketplace/PersonaDetails.d.ts +0 -22
  382. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +0 -1
  383. package/dist/test/src/marketplace/PersonaDetails.js +0 -71
  384. package/dist/test/src/marketplace/PersonaInstaller.d.ts +0 -25
  385. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  386. package/dist/test/src/marketplace/PersonaInstaller.js +0 -100
  387. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +0 -19
  388. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  389. package/dist/test/src/marketplace/PersonaSubmitter.js +0 -57
  390. package/dist/test/src/marketplace/index.d.ts +0 -10
  391. package/dist/test/src/marketplace/index.d.ts.map +0 -1
  392. package/dist/test/src/marketplace/index.js +0 -10
  393. package/dist/test/src/persona/PersonaElement.d.ts +0 -64
  394. package/dist/test/src/persona/PersonaElement.d.ts.map +0 -1
  395. package/dist/test/src/persona/PersonaElement.js +0 -223
  396. package/dist/test/src/persona/PersonaElementManager.d.ts +0 -97
  397. package/dist/test/src/persona/PersonaElementManager.d.ts.map +0 -1
  398. package/dist/test/src/persona/PersonaElementManager.js +0 -342
  399. package/dist/test/src/persona/PersonaLoader.d.ts +0 -34
  400. package/dist/test/src/persona/PersonaLoader.d.ts.map +0 -1
  401. package/dist/test/src/persona/PersonaLoader.js +0 -145
  402. package/dist/test/src/persona/PersonaManager.d.ts +0 -112
  403. package/dist/test/src/persona/PersonaManager.d.ts.map +0 -1
  404. package/dist/test/src/persona/PersonaManager.js +0 -341
  405. package/dist/test/src/persona/PersonaValidator.d.ts +0 -33
  406. package/dist/test/src/persona/PersonaValidator.d.ts.map +0 -1
  407. package/dist/test/src/persona/PersonaValidator.js +0 -157
  408. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +0 -43
  409. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  410. package/dist/test/src/persona/export-import/PersonaExporter.js +0 -99
  411. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +0 -65
  412. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  413. package/dist/test/src/persona/export-import/PersonaImporter.js +0 -315
  414. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +0 -60
  415. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  416. package/dist/test/src/persona/export-import/PersonaSharer.js +0 -502
  417. package/dist/test/src/persona/export-import/index.d.ts +0 -10
  418. package/dist/test/src/persona/export-import/index.d.ts.map +0 -1
  419. package/dist/test/src/persona/export-import/index.js +0 -7
  420. package/dist/test/src/persona/index.d.ts +0 -7
  421. package/dist/test/src/persona/index.d.ts.map +0 -1
  422. package/dist/test/src/persona/index.js +0 -7
  423. package/dist/test/src/portfolio/MigrationManager.d.ts +0 -44
  424. package/dist/test/src/portfolio/MigrationManager.d.ts.map +0 -1
  425. package/dist/test/src/portfolio/MigrationManager.js +0 -163
  426. package/dist/test/src/portfolio/PortfolioManager.d.ts +0 -54
  427. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +0 -1
  428. package/dist/test/src/portfolio/PortfolioManager.js +0 -224
  429. package/dist/test/src/portfolio/types.d.ts +0 -18
  430. package/dist/test/src/portfolio/types.d.ts.map +0 -1
  431. package/dist/test/src/portfolio/types.js +0 -13
  432. package/dist/test/src/security/InputValidator.d.ts +0 -80
  433. package/dist/test/src/security/InputValidator.d.ts.map +0 -1
  434. package/dist/test/src/security/InputValidator.js +0 -436
  435. package/dist/test/src/security/audit/SecurityAuditor.d.ts +0 -44
  436. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +0 -1
  437. package/dist/test/src/security/audit/SecurityAuditor.js +0 -274
  438. package/dist/test/src/security/audit/config/suppressions.d.ts +0 -34
  439. package/dist/test/src/security/audit/config/suppressions.d.ts.map +0 -1
  440. package/dist/test/src/security/audit/config/suppressions.js +0 -575
  441. package/dist/test/src/security/audit/index.d.ts +0 -14
  442. package/dist/test/src/security/audit/index.d.ts.map +0 -1
  443. package/dist/test/src/security/audit/index.js +0 -15
  444. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +0 -46
  445. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +0 -1
  446. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +0 -174
  447. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +0 -13
  448. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +0 -1
  449. package/dist/test/src/security/audit/reporters/JsonReporter.js +0 -25
  450. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +0 -13
  451. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +0 -1
  452. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +0 -79
  453. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +0 -20
  454. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +0 -1
  455. package/dist/test/src/security/audit/rules/SecurityRules.js +0 -244
  456. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +0 -47
  457. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +0 -1
  458. package/dist/test/src/security/audit/scanners/CodeScanner.js +0 -174
  459. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +0 -13
  460. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +0 -1
  461. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +0 -22
  462. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +0 -13
  463. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +0 -1
  464. package/dist/test/src/security/audit/scanners/DependencyScanner.js +0 -22
  465. package/dist/test/src/security/audit/types.d.ts +0 -94
  466. package/dist/test/src/security/audit/types.d.ts.map +0 -1
  467. package/dist/test/src/security/audit/types.js +0 -6
  468. package/dist/test/src/security/commandValidator.d.ts +0 -7
  469. package/dist/test/src/security/commandValidator.d.ts.map +0 -1
  470. package/dist/test/src/security/commandValidator.js +0 -78
  471. package/dist/test/src/security/constants.d.ts +0 -24
  472. package/dist/test/src/security/constants.d.ts.map +0 -1
  473. package/dist/test/src/security/constants.js +0 -26
  474. package/dist/test/src/security/contentValidator.d.ts +0 -47
  475. package/dist/test/src/security/contentValidator.d.ts.map +0 -1
  476. package/dist/test/src/security/contentValidator.js +0 -301
  477. package/dist/test/src/security/errors.d.ts +0 -14
  478. package/dist/test/src/security/errors.d.ts.map +0 -1
  479. package/dist/test/src/security/errors.js +0 -28
  480. package/dist/test/src/security/fileLockManager.d.ts +0 -70
  481. package/dist/test/src/security/fileLockManager.d.ts.map +0 -1
  482. package/dist/test/src/security/fileLockManager.js +0 -187
  483. package/dist/test/src/security/index.d.ts +0 -12
  484. package/dist/test/src/security/index.d.ts.map +0 -1
  485. package/dist/test/src/security/index.js +0 -14
  486. package/dist/test/src/security/pathValidator.d.ts +0 -9
  487. package/dist/test/src/security/pathValidator.d.ts.map +0 -1
  488. package/dist/test/src/security/pathValidator.js +0 -98
  489. package/dist/test/src/security/regexValidator.d.ts +0 -59
  490. package/dist/test/src/security/regexValidator.d.ts.map +0 -1
  491. package/dist/test/src/security/regexValidator.js +0 -214
  492. package/dist/test/src/security/secureYamlParser.d.ts +0 -46
  493. package/dist/test/src/security/secureYamlParser.d.ts.map +0 -1
  494. package/dist/test/src/security/secureYamlParser.js +0 -203
  495. package/dist/test/src/security/securityMonitor.d.ts +0 -58
  496. package/dist/test/src/security/securityMonitor.d.ts.map +0 -1
  497. package/dist/test/src/security/securityMonitor.js +0 -108
  498. package/dist/test/src/security/tokenManager.d.ts +0 -85
  499. package/dist/test/src/security/tokenManager.d.ts.map +0 -1
  500. package/dist/test/src/security/tokenManager.js +0 -286
  501. package/dist/test/src/security/validators/unicodeValidator.d.ts +0 -97
  502. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +0 -1
  503. package/dist/test/src/security/validators/unicodeValidator.js +0 -312
  504. package/dist/test/src/security/yamlValidator.d.ts +0 -21
  505. package/dist/test/src/security/yamlValidator.d.ts.map +0 -1
  506. package/dist/test/src/security/yamlValidator.js +0 -164
  507. package/dist/test/src/server/ServerSetup.d.ts +0 -35
  508. package/dist/test/src/server/ServerSetup.d.ts.map +0 -1
  509. package/dist/test/src/server/ServerSetup.js +0 -116
  510. package/dist/test/src/server/index.d.ts +0 -7
  511. package/dist/test/src/server/index.d.ts.map +0 -1
  512. package/dist/test/src/server/index.js +0 -7
  513. package/dist/test/src/server/startup.d.ts +0 -31
  514. package/dist/test/src/server/startup.d.ts.map +0 -1
  515. package/dist/test/src/server/startup.js +0 -67
  516. package/dist/test/src/server/tools/CollectionTools.d.ts +0 -10
  517. package/dist/test/src/server/tools/CollectionTools.d.ts.map +0 -1
  518. package/dist/test/src/server/tools/CollectionTools.js +0 -96
  519. package/dist/test/src/server/tools/ConfigTools.d.ts +0 -10
  520. package/dist/test/src/server/tools/ConfigTools.d.ts.map +0 -1
  521. package/dist/test/src/server/tools/ConfigTools.js +0 -63
  522. package/dist/test/src/server/tools/MarketplaceTools.d.ts +0 -10
  523. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  524. package/dist/test/src/server/tools/MarketplaceTools.js +0 -92
  525. package/dist/test/src/server/tools/PersonaTools.d.ts +0 -10
  526. package/dist/test/src/server/tools/PersonaTools.d.ts.map +0 -1
  527. package/dist/test/src/server/tools/PersonaTools.js +0 -257
  528. package/dist/test/src/server/tools/ToolRegistry.d.ts +0 -37
  529. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +0 -1
  530. package/dist/test/src/server/tools/ToolRegistry.js +0 -40
  531. package/dist/test/src/server/tools/UpdateTools.d.ts +0 -10
  532. package/dist/test/src/server/tools/UpdateTools.d.ts.map +0 -1
  533. package/dist/test/src/server/tools/UpdateTools.js +0 -64
  534. package/dist/test/src/server/tools/UserTools.d.ts +0 -10
  535. package/dist/test/src/server/tools/UserTools.d.ts.map +0 -1
  536. package/dist/test/src/server/tools/UserTools.js +0 -51
  537. package/dist/test/src/server/tools/index.d.ts +0 -10
  538. package/dist/test/src/server/tools/index.d.ts.map +0 -1
  539. package/dist/test/src/server/tools/index.js +0 -10
  540. package/dist/test/src/server/types.d.ts +0 -34
  541. package/dist/test/src/server/types.d.ts.map +0 -1
  542. package/dist/test/src/server/types.js +0 -5
  543. package/dist/test/src/tools/debug.d.ts +0 -20
  544. package/dist/test/src/tools/debug.d.ts.map +0 -1
  545. package/dist/test/src/tools/debug.js +0 -37
  546. package/dist/test/src/types/cache.d.ts +0 -8
  547. package/dist/test/src/types/cache.d.ts.map +0 -1
  548. package/dist/test/src/types/cache.js +0 -5
  549. package/dist/test/src/types/collection.d.ts +0 -23
  550. package/dist/test/src/types/collection.d.ts.map +0 -1
  551. package/dist/test/src/types/collection.js +0 -5
  552. package/dist/test/src/types/elements/IElement.d.ts +0 -123
  553. package/dist/test/src/types/elements/IElement.d.ts.map +0 -1
  554. package/dist/test/src/types/elements/IElement.js +0 -30
  555. package/dist/test/src/types/elements/IElementManager.d.ts +0 -65
  556. package/dist/test/src/types/elements/IElementManager.d.ts.map +0 -1
  557. package/dist/test/src/types/elements/IElementManager.js +0 -6
  558. package/dist/test/src/types/elements/IRatingManager.d.ts +0 -109
  559. package/dist/test/src/types/elements/IRatingManager.d.ts.map +0 -1
  560. package/dist/test/src/types/elements/IRatingManager.js +0 -6
  561. package/dist/test/src/types/elements/IReferenceResolver.d.ts +0 -52
  562. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +0 -1
  563. package/dist/test/src/types/elements/IReferenceResolver.js +0 -6
  564. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +0 -49
  565. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +0 -1
  566. package/dist/test/src/types/elements/RatingBreakdowns.js +0 -6
  567. package/dist/test/src/types/elements/index.d.ts +0 -9
  568. package/dist/test/src/types/elements/index.d.ts.map +0 -1
  569. package/dist/test/src/types/elements/index.js +0 -11
  570. package/dist/test/src/types/index.d.ts +0 -9
  571. package/dist/test/src/types/index.d.ts.map +0 -1
  572. package/dist/test/src/types/index.js +0 -9
  573. package/dist/test/src/types/marketplace.d.ts +0 -23
  574. package/dist/test/src/types/marketplace.d.ts.map +0 -1
  575. package/dist/test/src/types/marketplace.js +0 -5
  576. package/dist/test/src/types/mcp.d.ts +0 -84
  577. package/dist/test/src/types/mcp.d.ts.map +0 -1
  578. package/dist/test/src/types/mcp.js +0 -80
  579. package/dist/test/src/types/persona.d.ts +0 -30
  580. package/dist/test/src/types/persona.d.ts.map +0 -1
  581. package/dist/test/src/types/persona.js +0 -5
  582. package/dist/test/src/update/BackupManager.d.ts +0 -46
  583. package/dist/test/src/update/BackupManager.d.ts.map +0 -1
  584. package/dist/test/src/update/BackupManager.js +0 -261
  585. package/dist/test/src/update/DependencyChecker.d.ts +0 -41
  586. package/dist/test/src/update/DependencyChecker.d.ts.map +0 -1
  587. package/dist/test/src/update/DependencyChecker.js +0 -132
  588. package/dist/test/src/update/RateLimiter.d.ts +0 -80
  589. package/dist/test/src/update/RateLimiter.d.ts.map +0 -1
  590. package/dist/test/src/update/RateLimiter.js +0 -172
  591. package/dist/test/src/update/SignatureVerifier.d.ts +0 -71
  592. package/dist/test/src/update/SignatureVerifier.d.ts.map +0 -1
  593. package/dist/test/src/update/SignatureVerifier.js +0 -214
  594. package/dist/test/src/update/UpdateChecker.d.ts +0 -127
  595. package/dist/test/src/update/UpdateChecker.d.ts.map +0 -1
  596. package/dist/test/src/update/UpdateChecker.js +0 -469
  597. package/dist/test/src/update/UpdateManager.d.ts +0 -41
  598. package/dist/test/src/update/UpdateManager.d.ts.map +0 -1
  599. package/dist/test/src/update/UpdateManager.js +0 -260
  600. package/dist/test/src/update/VersionManager.d.ts +0 -31
  601. package/dist/test/src/update/VersionManager.d.ts.map +0 -1
  602. package/dist/test/src/update/VersionManager.js +0 -134
  603. package/dist/test/src/update/index.d.ts +0 -9
  604. package/dist/test/src/update/index.d.ts.map +0 -1
  605. package/dist/test/src/update/index.js +0 -9
  606. package/dist/test/src/utils/filesystem.d.ts +0 -29
  607. package/dist/test/src/utils/filesystem.d.ts.map +0 -1
  608. package/dist/test/src/utils/filesystem.js +0 -94
  609. package/dist/test/src/utils/git.d.ts +0 -32
  610. package/dist/test/src/utils/git.d.ts.map +0 -1
  611. package/dist/test/src/utils/git.js +0 -65
  612. package/dist/test/src/utils/index.d.ts +0 -7
  613. package/dist/test/src/utils/index.d.ts.map +0 -1
  614. package/dist/test/src/utils/index.js +0 -7
  615. package/dist/test/src/utils/logger.d.ts +0 -45
  616. package/dist/test/src/utils/logger.d.ts.map +0 -1
  617. package/dist/test/src/utils/logger.js +0 -91
  618. package/dist/test/src/utils/version.d.ts +0 -25
  619. package/dist/test/src/utils/version.d.ts.map +0 -1
  620. package/dist/test/src/utils/version.js +0 -97
  621. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +0 -33
  622. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +0 -1
  623. package/dist/test/test/__tests__/integration/helpers/file-utils.js +0 -83
  624. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +0 -26
  625. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +0 -1
  626. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +0 -95
  627. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +0 -26
  628. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +0 -1
  629. package/dist/test/test/__tests__/integration/helpers/test-server.js +0 -41
  630. package/dist/test/test/__tests__/integration/setup.d.ts +0 -8
  631. package/dist/test/test/__tests__/integration/setup.d.ts.map +0 -1
  632. package/dist/test/test/__tests__/integration/setup.js +0 -31
  633. package/dist/test/test/__tests__/integration/teardown.d.ts +0 -5
  634. package/dist/test/test/__tests__/integration/teardown.d.ts.map +0 -1
  635. package/dist/test/test/__tests__/integration/teardown.js +0 -23
  636. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +0 -34
  637. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +0 -1
  638. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +0 -224
  639. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +0 -89
  640. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +0 -1
  641. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +0 -543
  642. package/dist/test/test/__tests__/security/index.d.ts +0 -46
  643. package/dist/test/test/__tests__/security/index.d.ts.map +0 -1
  644. package/dist/test/test/__tests__/security/index.js +0 -98
  645. package/dist/test/test/__tests__/security/setup.d.ts +0 -3
  646. package/dist/test/test/__tests__/security/setup.d.ts.map +0 -1
  647. package/dist/test/test/__tests__/security/setup.js +0 -23
  648. package/dist/types/marketplace.d.ts +0 -23
  649. package/dist/types/marketplace.d.ts.map +0 -1
  650. package/dist/types/marketplace.js +0 -5
@@ -1,108 +0,0 @@
1
- /**
2
- * Security Monitor for DollhouseMCP
3
- *
4
- * Centralized security event logging and monitoring system
5
- * for tracking and alerting on security-related events.
6
- */
7
- import { logger } from '../utils/logger.js';
8
- export class SecurityMonitor {
9
- static eventCount = 0;
10
- static events = [];
11
- static MAX_EVENTS = 1000; // Keep last 1000 events in memory
12
- /**
13
- * Logs a security event
14
- */
15
- static logSecurityEvent(event) {
16
- const logEntry = {
17
- ...event,
18
- timestamp: new Date().toISOString(),
19
- id: `SEC-${Date.now()}-${++this.eventCount}`,
20
- };
21
- // Store in memory (circular buffer)
22
- this.events.push(logEntry);
23
- if (this.events.length > this.MAX_EVENTS) {
24
- this.events.shift();
25
- }
26
- // In MCP servers, we cannot write to stderr/stdout as it breaks the JSON-RPC protocol
27
- // Security events are stored in memory and can be retrieved via API
28
- // Only send critical alerts via the proper channel
29
- if (event.severity === 'CRITICAL') {
30
- this.sendSecurityAlert(logEntry);
31
- }
32
- }
33
- /**
34
- * Sends security alerts for critical events
35
- */
36
- static sendSecurityAlert(event) {
37
- // In a production environment, this would integrate with:
38
- // - Slack webhooks
39
- // - Email alerts
40
- // - PagerDuty
41
- // - Security Information and Event Management (SIEM) systems
42
- // Log critical security alerts with structured data
43
- // DO NOT use console.error in MCP servers as it breaks the JSON-RPC protocol
44
- logger.error('🚨 CRITICAL SECURITY ALERT 🚨', {
45
- type: event.type,
46
- details: event.details,
47
- timestamp: event.timestamp,
48
- id: event.id
49
- });
50
- // If in production mode with proper config, send actual alerts
51
- if (process.env.DOLLHOUSE_SECURITY_ALERTS === 'true') {
52
- // TODO: Implement actual alert mechanisms
53
- }
54
- }
55
- /**
56
- * Gets recent security events for analysis
57
- */
58
- static getRecentEvents(count = 100) {
59
- return this.events.slice(-count);
60
- }
61
- /**
62
- * Gets events by severity
63
- */
64
- static getEventsBySeverity(severity) {
65
- return this.events.filter(event => event.severity === severity);
66
- }
67
- /**
68
- * Gets events by type
69
- */
70
- static getEventsByType(type) {
71
- return this.events.filter(event => event.type === type);
72
- }
73
- /**
74
- * Generates a security report
75
- */
76
- static generateSecurityReport() {
77
- const eventsBySeverity = {
78
- CRITICAL: 0,
79
- HIGH: 0,
80
- MEDIUM: 0,
81
- LOW: 0,
82
- };
83
- const eventsByType = {};
84
- for (const event of this.events) {
85
- eventsBySeverity[event.severity]++;
86
- eventsByType[event.type] = (eventsByType[event.type] || 0) + 1;
87
- }
88
- return {
89
- totalEvents: this.events.length,
90
- eventsBySeverity,
91
- eventsByType,
92
- recentCriticalEvents: this.getEventsBySeverity('CRITICAL').slice(-10),
93
- };
94
- }
95
- /**
96
- * Clears old events (for memory management)
97
- */
98
- static clearOldEvents(daysToKeep = 7) {
99
- const cutoffDate = new Date();
100
- cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);
101
- const cutoffTimestamp = cutoffDate.toISOString();
102
- const index = this.events.findIndex(event => event.timestamp >= cutoffTimestamp);
103
- if (index > 0) {
104
- this.events.splice(0, index);
105
- }
106
- }
107
- }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlNb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQTZCNUMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDdEIsTUFBTSxDQUFVLE1BQU0sR0FBdUIsRUFBRSxDQUFDO0lBQ2hELE1BQU0sQ0FBVSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsa0NBQWtDO0lBRTdFOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQW9CO1FBQzFDLE1BQU0sUUFBUSxHQUFxQjtZQUNqQyxHQUFHLEtBQUs7WUFDUixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtTQUM3QyxDQUFDO1FBRUYsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELHNGQUFzRjtRQUN0RixvRUFBb0U7UUFDcEUsbURBQW1EO1FBRW5ELElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FB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LCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyaXR5IE1vbml0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBDZW50cmFsaXplZCBzZWN1cml0eSBldmVudCBsb2dnaW5nIGFuZCBtb25pdG9yaW5nIHN5c3RlbVxuICogZm9yIHRyYWNraW5nIGFuZCBhbGVydGluZyBvbiBzZWN1cml0eS1yZWxhdGVkIGV2ZW50cy5cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5RXZlbnQge1xuICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcgfCAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcgfCAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcgfCBcbiAgICAgICAgJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScgfCAnVVBEQVRFX1NFQ1VSSVRZX1ZJT0xBVElPTicgfCAnUkFURV9MSU1JVF9FWENFRURFRCcgfFxuICAgICAgICAnWUFNTF9QQVJTSU5HX1dBUk5JTkcnIHwgJ1lBTUxfUEFSU0VfU1VDQ0VTUycgfCAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyB8XG4gICAgICAgICdSQVRFX0xJTUlUX1dBUk5JTkcnIHwgJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnIHwgJ1lBTUxfVU5JQ09ERV9BVFRBQ0snIHxcbiAgICAgICAgJ1VOSUNPREVfRElSRUNUSU9OX09WRVJSSURFJyB8ICdVTklDT0RFX01JWEVEX1NDUklQVCcgfCAnVU5JQ09ERV9WQUxJREFUSU9OX0VSUk9SJyB8XG4gICAgICAgICdDT05URU5UX1NJWkVfRVhDRUVERUQnIHwgJ0lOQ0xVREVfREVQVEhfRVhDRUVERUQnIHwgJ1RFTVBMQVRFX1JFTkRFUkVEJyB8IFxuICAgICAgICAnVEVNUExBVEVfSU5DTFVERScgfCAnVEVNUExBVEVfTE9BREVEJyB8ICdURU1QTEFURV9TQVZFRCcgfCAnVEVNUExBVEVfREVMRVRFRCcgfFxuICAgICAgICAnTUVNT1JZX0NSRUFURUQnIHwgJ01FTU9SWV9BRERFRCcgfCAnTUVNT1JZX1NFQVJDSEVEJyB8ICdTRU5TSVRJVkVfTUVNT1JZX0RFTEVURUQnIHxcbiAgICAgICAgJ1JFVEVOVElPTl9QT0xJQ1lfRU5GT1JDRUQnIHwgJ01FTU9SWV9DTEVBUkVEJyB8ICdNRU1PUllfTE9BREVEJyB8ICdNRU1PUllfU0FWRUQnIHxcbiAgICAgICAgJ01FTU9SWV9ERUxFVEVEJyB8ICdNRU1PUllfTE9BRF9GQUlMRUQnIHwgJ01FTU9SWV9TQVZFX0ZBSUxFRCcgfCAnTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQnIHxcbiAgICAgICAgJ01FTU9SWV9JTVBPUlRfRkFJTEVEJyB8ICdNRU1PUllfREVTRVJJQUxJWkVfRkFJTEVEJyB8ICdFTEVNRU5UX0NSRUFURUQnIHwgJ0VMRU1FTlRfREVMRVRFRCcgfFxuICAgICAgICAnQUdFTlRfREVDSVNJT04nIHwgJ1JVTEVfRU5HSU5FX0NPTkZJR19VUERBVEUnIHwgJ1JVTEVfRU5HSU5FX0NPTkZJR19WQUxJREFUSU9OX0VSUk9SJyB8XG4gICAgICAgICdHT0FMX1RFTVBMQVRFX0FQUExJRUQnIHwgJ0dPQUxfVEVNUExBVEVfVkFMSURBVElPTic7XG4gIHNldmVyaXR5OiAnTE9XJyB8ICdNRURJVU0nIHwgJ0hJR0gnIHwgJ0NSSVRJQ0FMJztcbiAgc291cmNlOiBzdHJpbmc7XG4gIGRldGFpbHM6IHN0cmluZztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICBpcD86IHN0cmluZztcbiAgYWRkaXRpb25hbERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5TG9nRW50cnkgZXh0ZW5kcyBTZWN1cml0eUV2ZW50IHtcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWN1cml0eU1vbml0b3Ige1xuICBwcml2YXRlIHN0YXRpYyBldmVudENvdW50ID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzOiBTZWN1cml0eUxvZ0VudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0VWRU5UUyA9IDEwMDA7IC8vIEtlZXAgbGFzdCAxMDAwIGV2ZW50cyBpbiBtZW1vcnlcblxuICAvKipcbiAgICogTG9ncyBhIHNlY3VyaXR5IGV2ZW50XG4gICAqL1xuICBzdGF0aWMgbG9nU2VjdXJpdHlFdmVudChldmVudDogU2VjdXJpdHlFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxvZ0VudHJ5OiBTZWN1cml0eUxvZ0VudHJ5ID0ge1xuICAgICAgLi4uZXZlbnQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGlkOiBgU0VDLSR7RGF0ZS5ub3coKX0tJHsrK3RoaXMuZXZlbnRDb3VudH1gLFxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbiBtZW1vcnkgKGNpcmN1bGFyIGJ1ZmZlcilcbiAgICB0aGlzLmV2ZW50cy5wdXNoKGxvZ0VudHJ5KTtcbiAgICBpZiAodGhpcy5ldmVudHMubGVuZ3RoID4gdGhpcy5NQVhfRVZFTlRTKSB7XG4gICAgICB0aGlzLmV2ZW50cy5zaGlmdCgpO1xuICAgIH1cblxuICAgIC8vIEluIE1DUCBzZXJ2ZXJzLCB3ZSBjYW5ub3Qgd3JpdGUgdG8gc3RkZXJyL3N0ZG91dCBhcyBpdCBicmVha3MgdGhlIEpTT04tUlBDIHByb3RvY29sXG4gICAgLy8gU2VjdXJpdHkgZXZlbnRzIGFyZSBzdG9yZWQgaW4gbWVtb3J5IGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBBUElcbiAgICAvLyBPbmx5IHNlbmQgY3JpdGljYWwgYWxlcnRzIHZpYSB0aGUgcHJvcGVyIGNoYW5uZWxcbiAgICBcbiAgICBpZiAoZXZlbnQuc2V2ZXJpdHkgPT09ICdDUklUSUNBTCcpIHtcbiAgICAgIHRoaXMuc2VuZFNlY3VyaXR5QWxlcnQobG9nRW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBzZWN1cml0eSBhbGVydHMgZm9yIGNyaXRpY2FsIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2VuZFNlY3VyaXR5QWxlcnQoZXZlbnQ6IFNlY3VyaXR5TG9nRW50cnkpOiB2b2lkIHtcbiAgICAvLyBJbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIHRoaXMgd291bGQgaW50ZWdyYXRlIHdpdGg6XG4gICAgLy8gLSBTbGFjayB3ZWJob29rc1xuICAgIC8vIC0gRW1haWwgYWxlcnRzXG4gICAgLy8gLSBQYWdlckR1dHlcbiAgICAvLyAtIFNlY3VyaXR5IEluZm9ybWF0aW9uIGFuZCBFdmVudCBNYW5hZ2VtZW50IChTSUVNKSBzeXN0ZW1zXG4gICAgXG4gICAgLy8gTG9nIGNyaXRpY2FsIHNlY3VyaXR5IGFsZXJ0cyB3aXRoIHN0cnVjdHVyZWQgZGF0YVxuICAgIC8vIERPIE5PVCB1c2UgY29uc29sZS5lcnJvciBpbiBNQ1Agc2VydmVycyBhcyBpdCBicmVha3MgdGhlIEpTT04tUlBDIHByb3RvY29sXG4gICAgbG9nZ2VyLmVycm9yKCfwn5qoIENSSVRJQ0FMIFNFQ1VSSVRZIEFMRVJUIPCfmqgnLCB7XG4gICAgICB0eXBlOiBldmVudC50eXBlLFxuICAgICAgZGV0YWlsczogZXZlbnQuZGV0YWlscyxcbiAgICAgIHRpbWVzdGFtcDogZXZlbnQudGltZXN0YW1wLFxuICAgICAgaWQ6IGV2ZW50LmlkXG4gICAgfSk7XG4gICAgXG4gICAgLy8gSWYgaW4gcHJvZHVjdGlvbiBtb2RlIHdpdGggcHJvcGVyIGNvbmZpZywgc2VuZCBhY3R1YWwgYWxlcnRzXG4gICAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9TRUNVUklUWV9BTEVSVFMgPT09ICd0cnVlJykge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IGFjdHVhbCBhbGVydCBtZWNoYW5pc21zXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcmVjZW50IHNlY3VyaXR5IGV2ZW50cyBmb3IgYW5hbHlzaXNcbiAgICovXG4gIHN0YXRpYyBnZXRSZWNlbnRFdmVudHMoY291bnQ6IG51bWJlciA9IDEwMCk6IFNlY3VyaXR5TG9nRW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLnNsaWNlKC1jb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBldmVudHMgYnkgc2V2ZXJpdHlcbiAgICovXG4gIHN0YXRpYyBnZXRFdmVudHNCeVNldmVyaXR5KHNldmVyaXR5OiBTZWN1cml0eUV2ZW50WydzZXZlcml0eSddKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMuZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnNldmVyaXR5ID09PSBzZXZlcml0eSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBldmVudHMgYnkgdHlwZVxuICAgKi9cbiAgc3RhdGljIGdldEV2ZW50c0J5VHlwZSh0eXBlOiBTZWN1cml0eUV2ZW50Wyd0eXBlJ10pOiBTZWN1cml0eUxvZ0VudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5maWx0ZXIoZXZlbnQgPT4gZXZlbnQudHlwZSA9PT0gdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc2VjdXJpdHkgcmVwb3J0XG4gICAqL1xuICBzdGF0aWMgZ2VuZXJhdGVTZWN1cml0eVJlcG9ydCgpOiB7XG4gICAgdG90YWxFdmVudHM6IG51bWJlcjtcbiAgICBldmVudHNCeVNldmVyaXR5OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIGV2ZW50c0J5VHlwZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICByZWNlbnRDcml0aWNhbEV2ZW50czogU2VjdXJpdHlMb2dFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCBldmVudHNCeVNldmVyaXR5OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgICAgQ1JJVElDQUw6IDAsXG4gICAgICBISUdIOiAwLFxuICAgICAgTUVESVVNOiAwLFxuICAgICAgTE9XOiAwLFxuICAgIH07XG5cbiAgICBjb25zdCBldmVudHNCeVR5cGU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgdGhpcy5ldmVudHMpIHtcbiAgICAgIGV2ZW50c0J5U2V2ZXJpdHlbZXZlbnQuc2V2ZXJpdHldKys7XG4gICAgICBldmVudHNCeVR5cGVbZXZlbnQudHlwZV0gPSAoZXZlbnRzQnlUeXBlW2V2ZW50LnR5cGVdIHx8IDApICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxFdmVudHM6IHRoaXMuZXZlbnRzLmxlbmd0aCxcbiAgICAgIGV2ZW50c0J5U2V2ZXJpdHksXG4gICAgICBldmVudHNCeVR5cGUsXG4gICAgICByZWNlbnRDcml0aWNhbEV2ZW50czogdGhpcy5nZXRFdmVudHNCeVNldmVyaXR5KCdDUklUSUNBTCcpLnNsaWNlKC0xMCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgb2xkIGV2ZW50cyAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50KVxuICAgKi9cbiAgc3RhdGljIGNsZWFyT2xkRXZlbnRzKGRheXNUb0tlZXA6IG51bWJlciA9IDcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXRvZmZEYXRlID0gbmV3IERhdGUoKTtcbiAgICBjdXRvZmZEYXRlLnNldERhdGUoY3V0b2ZmRGF0ZS5nZXREYXRlKCkgLSBkYXlzVG9LZWVwKTtcbiAgICBjb25zdCBjdXRvZmZUaW1lc3RhbXAgPSBjdXRvZmZEYXRlLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZXZlbnRzLmZpbmRJbmRleChldmVudCA9PiBldmVudC50aW1lc3RhbXAgPj0gY3V0b2ZmVGltZXN0YW1wKTtcbiAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgaW5kZXgpO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -1,85 +0,0 @@
1
- /**
2
- * Secure GitHub token management and validation
3
- */
4
- import { RateLimiter } from '../update/RateLimiter.js';
5
- export interface TokenScopes {
6
- required: string[];
7
- optional?: string[];
8
- }
9
- export interface TokenValidationResult {
10
- isValid: boolean;
11
- scopes?: string[];
12
- rateLimit?: {
13
- remaining: number;
14
- resetTime: Date;
15
- };
16
- rateLimitExceeded?: boolean;
17
- retryAfterMs?: number;
18
- error?: string;
19
- }
20
- /**
21
- * Secure GitHub token manager with validation and protection
22
- */
23
- export declare class TokenManager {
24
- private static readonly GITHUB_TOKEN_PATTERNS;
25
- private static tokenValidationLimiter;
26
- /**
27
- * Get or create the token validation rate limiter
28
- * Prevents brute force token validation attacks
29
- */
30
- private static getTokenValidationLimiter;
31
- /**
32
- * Create a rate limiter specifically for token validation
33
- * Conservative limits to prevent abuse while allowing legitimate usage
34
- */
35
- static createTokenValidationLimiter(): RateLimiter;
36
- /**
37
- * Reset the token validation rate limiter
38
- * Useful for testing or manual intervention
39
- */
40
- static resetTokenValidationLimiter(): void;
41
- /**
42
- * Validate GitHub token format
43
- */
44
- static validateTokenFormat(token: string): boolean;
45
- /**
46
- * Get GitHub token from environment with validation
47
- */
48
- static getGitHubToken(): string | null;
49
- /**
50
- * Redact token for safe logging
51
- */
52
- static redactToken(token: string): string;
53
- /**
54
- * Get token type from format
55
- */
56
- static getTokenType(token: string): string;
57
- /**
58
- * Get safe token prefix for logging
59
- */
60
- static getTokenPrefix(token: string): string;
61
- /**
62
- * Validate token scopes via GitHub API
63
- */
64
- static validateTokenScopes(token: string, requiredScopes: TokenScopes): Promise<TokenValidationResult>;
65
- /**
66
- * Create safe error message without token exposure
67
- */
68
- static createSafeErrorMessage(error: string, token?: string): string;
69
- /**
70
- * Get minimum required scopes for different operations
71
- *
72
- * NOTE: The 'marketplace' scope identifier is kept for backward compatibility
73
- * with existing token validations. This is an internal scope name and does not
74
- * affect user-facing functionality. (PR #280)
75
- */
76
- static getRequiredScopes(operation: 'read' | 'write' | 'marketplace' | 'collection' | 'gist'): TokenScopes;
77
- /**
78
- * Check if token has sufficient permissions for operation
79
- *
80
- * NOTE: The 'marketplace' operation type is kept for backward compatibility.
81
- * This is called internally when accessing collection features. (PR #280)
82
- */
83
- static ensureTokenPermissions(operation: 'read' | 'write' | 'marketplace' | 'collection' | 'gist'): Promise<TokenValidationResult>;
84
- }
85
- //# sourceMappingURL=tokenManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenManager.d.ts","sourceRoot":"","sources":["../../../../src/security/tokenManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;KACjB,CAAC;IACF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAK3C;IAGF,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAA4B;IAEjE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAOxC;;;OAGG;IACH,MAAM,CAAC,4BAA4B,IAAI,WAAW;IAQlD;;;OAGG;IACH,MAAM,CAAC,2BAA2B,IAAI,IAAI;IAI1C;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAWlD;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM,GAAG,IAAI;IAwBtC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQzC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAgB1C;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAO5C;;OAEG;WACU,mBAAmB,CAC9B,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,WAAW,GAC1B,OAAO,CAAC,qBAAqB,CAAC;IA0HjC;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAgBpE;;;;;;OAMG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW;IAkC1G;;;;;OAKG;WACU,sBAAsB,CACjC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,GAClE,OAAO,CAAC,qBAAqB,CAAC;CAalC"}
@@ -1,286 +0,0 @@
1
- /**
2
- * Secure GitHub token management and validation
3
- */
4
- import { logger } from '../utils/logger.js';
5
- import { RateLimiter } from '../update/RateLimiter.js';
6
- import { SecurityError } from './errors.js';
7
- /**
8
- * Secure GitHub token manager with validation and protection
9
- */
10
- export class TokenManager {
11
- static GITHUB_TOKEN_PATTERNS = {
12
- PERSONAL_ACCESS_TOKEN: /^ghp_[A-Za-z0-9_]{36,}$/,
13
- INSTALLATION_TOKEN: /^ghs_[A-Za-z0-9_]{36,}$/,
14
- USER_ACCESS_TOKEN: /^ghu_[A-Za-z0-9_]{36,}$/,
15
- REFRESH_TOKEN: /^ghr_[A-Za-z0-9_]{36,}$/
16
- };
17
- // Rate limiter for token validation operations - prevents brute force attacks
18
- static tokenValidationLimiter = null;
19
- /**
20
- * Get or create the token validation rate limiter
21
- * Prevents brute force token validation attacks
22
- */
23
- static getTokenValidationLimiter() {
24
- if (!this.tokenValidationLimiter) {
25
- this.tokenValidationLimiter = this.createTokenValidationLimiter();
26
- }
27
- return this.tokenValidationLimiter;
28
- }
29
- /**
30
- * Create a rate limiter specifically for token validation
31
- * Conservative limits to prevent abuse while allowing legitimate usage
32
- */
33
- static createTokenValidationLimiter() {
34
- return new RateLimiter({
35
- maxRequests: 10, // 10 validation attempts
36
- windowMs: 60 * 60 * 1000, // per hour
37
- minDelayMs: 5 * 1000 // 5 seconds minimum between attempts
38
- });
39
- }
40
- /**
41
- * Reset the token validation rate limiter
42
- * Useful for testing or manual intervention
43
- */
44
- static resetTokenValidationLimiter() {
45
- this.tokenValidationLimiter?.reset();
46
- }
47
- /**
48
- * Validate GitHub token format
49
- */
50
- static validateTokenFormat(token) {
51
- if (!token || typeof token !== 'string') {
52
- return false;
53
- }
54
- // Check against all known GitHub token patterns
55
- return Object.values(this.GITHUB_TOKEN_PATTERNS).some(pattern => pattern.test(token));
56
- }
57
- /**
58
- * Get GitHub token from environment with validation
59
- */
60
- static getGitHubToken() {
61
- const token = process.env.GITHUB_TOKEN;
62
- if (!token) {
63
- logger.debug('No GitHub token found in environment');
64
- return null;
65
- }
66
- if (!this.validateTokenFormat(token)) {
67
- logger.warn('Invalid GitHub token format detected', {
68
- tokenPrefix: this.getTokenPrefix(token),
69
- length: token.length
70
- });
71
- return null;
72
- }
73
- logger.debug('Valid GitHub token found', {
74
- tokenType: this.getTokenType(token),
75
- tokenPrefix: this.getTokenPrefix(token)
76
- });
77
- return token;
78
- }
79
- /**
80
- * Redact token for safe logging
81
- */
82
- static redactToken(token) {
83
- if (!token || token.length < 8) {
84
- return '[REDACTED]';
85
- }
86
- return token.substring(0, 4) + '...' + token.substring(token.length - 4);
87
- }
88
- /**
89
- * Get token type from format
90
- */
91
- static getTokenType(token) {
92
- if (this.GITHUB_TOKEN_PATTERNS.PERSONAL_ACCESS_TOKEN.test(token)) {
93
- return 'Personal Access Token';
94
- }
95
- if (this.GITHUB_TOKEN_PATTERNS.INSTALLATION_TOKEN.test(token)) {
96
- return 'Installation Token';
97
- }
98
- if (this.GITHUB_TOKEN_PATTERNS.USER_ACCESS_TOKEN.test(token)) {
99
- return 'User Access Token';
100
- }
101
- if (this.GITHUB_TOKEN_PATTERNS.REFRESH_TOKEN.test(token)) {
102
- return 'Refresh Token';
103
- }
104
- return 'Unknown';
105
- }
106
- /**
107
- * Get safe token prefix for logging
108
- */
109
- static getTokenPrefix(token) {
110
- if (!token || token.length < 4) {
111
- return '[INVALID]';
112
- }
113
- return token.substring(0, 4) + '...';
114
- }
115
- /**
116
- * Validate token scopes via GitHub API
117
- */
118
- static async validateTokenScopes(token, requiredScopes) {
119
- // Validate token format before consuming rate limit
120
- if (!this.validateTokenFormat(token)) {
121
- return {
122
- isValid: false,
123
- error: 'Invalid token format'
124
- };
125
- }
126
- // Check rate limit before making API call
127
- const rateLimiter = this.getTokenValidationLimiter();
128
- const rateLimitStatus = rateLimiter.checkLimit();
129
- if (!rateLimitStatus.allowed) {
130
- logger.warn('Token validation rate limit exceeded', {
131
- tokenPrefix: this.getTokenPrefix(token),
132
- retryAfterMs: rateLimitStatus.retryAfterMs,
133
- remainingTokens: rateLimitStatus.remainingTokens
134
- });
135
- throw new SecurityError(`Token validation rate limit exceeded. Please retry in ${Math.ceil((rateLimitStatus.retryAfterMs || 0) / 1000)} seconds.`, 'RATE_LIMIT_EXCEEDED');
136
- }
137
- try {
138
- // Consume rate limit token for this validation attempt
139
- rateLimiter.consumeToken();
140
- // Make a test API call to check token validity and scopes
141
- const response = await fetch('https://api.github.com/user', {
142
- headers: {
143
- 'Authorization': `Bearer ${token}`,
144
- 'Accept': 'application/vnd.github.v3+json',
145
- 'User-Agent': 'DollhouseMCP/1.0'
146
- }
147
- });
148
- const rateLimitRemaining = parseInt(response.headers.get('x-ratelimit-remaining') || '0');
149
- const rateLimitReset = parseInt(response.headers.get('x-ratelimit-reset') || '0');
150
- if (!response.ok) {
151
- const error = `GitHub API error: ${response.status} ${response.statusText}`;
152
- logger.warn('Token validation failed', {
153
- status: response.status,
154
- tokenPrefix: this.getTokenPrefix(token)
155
- });
156
- return {
157
- isValid: false,
158
- error: error
159
- };
160
- }
161
- // Extract scopes from response headers
162
- const scopesHeader = response.headers.get('x-oauth-scopes') || '';
163
- const tokenScopes = scopesHeader.split(',').map(s => s.trim()).filter(s => s);
164
- // Check if required scopes are present
165
- const hasRequiredScopes = requiredScopes.required.every(scope => tokenScopes.includes(scope));
166
- if (!hasRequiredScopes) {
167
- const missingScopes = requiredScopes.required.filter(scope => !tokenScopes.includes(scope));
168
- logger.warn('Token missing required scopes', {
169
- tokenPrefix: this.getTokenPrefix(token),
170
- missingScopes: missingScopes,
171
- currentScopes: tokenScopes
172
- });
173
- return {
174
- isValid: false,
175
- scopes: tokenScopes,
176
- error: `Missing required scopes: ${missingScopes.join(', ')}`
177
- };
178
- }
179
- logger.info('Token validation successful', {
180
- tokenType: this.getTokenType(token),
181
- tokenPrefix: this.getTokenPrefix(token),
182
- scopes: tokenScopes,
183
- rateLimitRemaining: rateLimitRemaining
184
- });
185
- return {
186
- isValid: true,
187
- scopes: tokenScopes,
188
- rateLimit: {
189
- remaining: rateLimitRemaining,
190
- resetTime: new Date(rateLimitReset * 1000)
191
- }
192
- };
193
- }
194
- catch (error) {
195
- // Handle SecurityError (including rate limit errors) separately
196
- if (error instanceof SecurityError && error.code === 'RATE_LIMIT_EXCEEDED') {
197
- const currentStatus = rateLimiter.checkLimit();
198
- return {
199
- isValid: false,
200
- rateLimitExceeded: true,
201
- retryAfterMs: currentStatus.retryAfterMs,
202
- error: error.message
203
- };
204
- }
205
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
206
- logger.error('Token validation error', {
207
- error: errorMessage,
208
- tokenPrefix: this.getTokenPrefix(token)
209
- });
210
- return {
211
- isValid: false,
212
- error: `Validation error: ${errorMessage}`
213
- };
214
- }
215
- }
216
- /**
217
- * Create safe error message without token exposure
218
- */
219
- static createSafeErrorMessage(error, token) {
220
- // Remove any potential token data from error messages
221
- let safeMessage = error
222
- .replace(/ghp_[A-Za-z0-9_]{36,}/g, '[REDACTED_PAT]')
223
- .replace(/ghs_[A-Za-z0-9_]{36,}/g, '[REDACTED_INSTALL]')
224
- .replace(/ghu_[A-Za-z0-9_]{36,}/g, '[REDACTED_USER]')
225
- .replace(/ghr_[A-Za-z0-9_]{36,}/g, '[REDACTED_REFRESH]');
226
- if (token) {
227
- const tokenPrefix = this.getTokenPrefix(token);
228
- safeMessage += ` (Token: ${tokenPrefix})`;
229
- }
230
- return safeMessage;
231
- }
232
- /**
233
- * Get minimum required scopes for different operations
234
- *
235
- * NOTE: The 'marketplace' scope identifier is kept for backward compatibility
236
- * with existing token validations. This is an internal scope name and does not
237
- * affect user-facing functionality. (PR #280)
238
- */
239
- static getRequiredScopes(operation) {
240
- switch (operation) {
241
- case 'read':
242
- return {
243
- required: ['repo'],
244
- optional: ['user:email']
245
- };
246
- case 'write':
247
- return {
248
- required: ['repo'],
249
- optional: ['user:email']
250
- };
251
- case 'marketplace': // Internal scope name kept for compatibility (PR #280)
252
- case 'collection': // New preferred name
253
- return {
254
- required: ['repo'],
255
- optional: ['user:email']
256
- };
257
- case 'gist':
258
- return {
259
- required: ['gist'],
260
- optional: ['user:email']
261
- };
262
- default:
263
- return {
264
- required: ['repo']
265
- };
266
- }
267
- }
268
- /**
269
- * Check if token has sufficient permissions for operation
270
- *
271
- * NOTE: The 'marketplace' operation type is kept for backward compatibility.
272
- * This is called internally when accessing collection features. (PR #280)
273
- */
274
- static async ensureTokenPermissions(operation) {
275
- const token = this.getGitHubToken();
276
- if (!token) {
277
- return {
278
- isValid: false,
279
- error: 'No GitHub token available'
280
- };
281
- }
282
- const requiredScopes = this.getRequiredScopes(operation);
283
- return this.validateTokenScopes(token, requiredScopes);
284
- }
285
- }
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlY3VyaXR5L3Rva2VuTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQW1CNUM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE1BQU0sQ0FBVSxxQkFBcUIsR0FBRztRQUM5QyxxQkFBcUIsRUFBRSx5QkFBeUI7UUFDaEQsa0JBQWtCLEVBQUUseUJBQXlCO1FBQzdDLGlCQUFpQixFQUFFLHlCQUF5QjtRQUM1QyxhQUFhLEVBQUUseUJBQXlCO0tBQ3pDLENBQUM7SUFFRiw4RUFBOEU7SUFDdEUsTUFBTSxDQUFDLHNCQUFzQixHQUF1QixJQUFJLENBQUM7SUFFakU7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLHlCQUF5QjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLDRCQUE0QjtRQUNqQyxPQUFPLElBQUksV0FBVyxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxFQUFFLEVBQVcseUJBQXlCO1lBQ25ELFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxXQUFXO1lBQ3JDLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFNLHFDQUFxQztTQUNoRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdH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S0FBSyxFQUFFLDJCQUEyQjthQUNuQyxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VjdXJlIEdpdEh1YiB0b2tlbiBtYW5hZ2VtZW50IGFuZCB2YWxpZGF0aW9uXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyIH0gZnJvbSAnLi4vdXBkYXRlL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5TY29wZXMge1xuICByZXF1aXJlZDogc3RyaW5nW107XG4gIG9wdGlvbmFsPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5WYWxpZGF0aW9uUmVzdWx0IHtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgc2NvcGVzPzogc3RyaW5nW107XG4gIHJhdGVMaW1pdD86IHtcbiAgICByZW1haW5pbmc6IG51bWJlcjtcbiAgICByZXNldFRpbWU6IERhdGU7XG4gIH07XG4gIHJhdGVMaW1pdEV4Y2VlZGVkPzogYm9vbGVhbjtcbiAgcmV0cnlBZnRlck1zPzogbnVtYmVyO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWN1cmUgR2l0SHViIHRva2VuIG1hbmFnZXIgd2l0aCB2YWxpZGF0aW9uIGFuZCBwcm90ZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBUb2tlbk1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHSVRIVUJfVE9LRU5fUEFUVEVSTlMgPSB7XG4gICAgUEVSU09OQUxfQUNDRVNTX1RPS0VOOiAvXmdocF9bQS1aYS16MC05X117MzYsfSQvLFxuICAgIElOU1RBTExBVElPTl9UT0tFTjogL15naHNfW0EtWmEtejAtOV9dezM2LH0kLyxcbiAgICBVU0VSX0FDQ0VTU19UT0tFTjogL15naHVfW0EtWmEtejAtOV9dezM2LH0kLyxcbiAgICBSRUZSRVNIX1RPS0VOOiAvXmdocl9bQS1aYS16MC05X117MzYsfSQvXG4gIH07XG5cbiAgLy8gUmF0ZSBsaW1pdGVyIGZvciB0b2tlbiB2YWxpZGF0aW9uIG9wZXJhdGlvbnMgLSBwcmV2ZW50cyBicnV0ZSBmb3JjZSBhdHRhY2tzXG4gIHByaXZhdGUgc3RhdGljIHRva2VuVmFsaWRhdGlvbkxpbWl0ZXI6IFJhdGVMaW1pdGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCBvciBjcmVhdGUgdGhlIHRva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVyXG4gICAqIFByZXZlbnRzIGJydXRlIGZvcmNlIHRva2VuIHZhbGlkYXRpb24gYXR0YWNrc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0VG9rZW5WYWxpZGF0aW9uTGltaXRlcigpOiBSYXRlTGltaXRlciB7XG4gICAgaWYgKCF0aGlzLnRva2VuVmFsaWRhdGlvbkxpbWl0ZXIpIHtcbiAgICAgIHRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlciA9IHRoaXMuY3JlYXRlVG9rZW5WYWxpZGF0aW9uTGltaXRlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlblZhbGlkYXRpb25MaW1pdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJhdGUgbGltaXRlciBzcGVjaWZpY2FsbHkgZm9yIHRva2VuIHZhbGlkYXRpb25cbiAgICogQ29uc2VydmF0aXZlIGxpbWl0cyB0byBwcmV2ZW50IGFidXNlIHdoaWxlIGFsbG93aW5nIGxlZ2l0aW1hdGUgdXNhZ2VcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk6IFJhdGVMaW1pdGVyIHtcbiAgICByZXR1cm4gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgIG1heFJlcXVlc3RzOiAxMCwgICAgICAgICAgLy8gMTAgdmFsaWRhdGlvbiBhdHRlbXB0c1xuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyBwZXIgaG91clxuICAgICAgbWluRGVsYXlNczogNSAqIDEwMDAgICAgICAvLyA1IHNlY29uZHMgbWluaW11bSBiZXR3ZWVuIGF0dGVtcHRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHRva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVyXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciBtYW51YWwgaW50ZXJ2ZW50aW9uXG4gICAqL1xuICBzdGF0aWMgcmVzZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlcj8ucmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBHaXRIdWIgdG9rZW4gZm9ybWF0XG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0b2tlbiB8fCB0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYWdhaW5zdCBhbGwga25vd24gR2l0SHViIHRva2VuIHBhdHRlcm5zXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5HSVRIVUJfVE9LRU5fUEFUVEVSTlMpLnNvbWUocGF0dGVybiA9PiBcbiAgICAgIHBhdHRlcm4udGVzdCh0b2tlbilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgdG9rZW4gZnJvbSBlbnZpcm9ubWVudCB3aXRoIHZhbGlkYXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXRHaXRIdWJUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbiAgICBcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIEdpdEh1YiB0b2tlbiBmb3VuZCBpbiBlbnZpcm9ubWVudCcpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW4pKSB7XG4gICAgICBsb2dnZXIud2FybignSW52YWxpZCBHaXRIdWIgdG9rZW4gZm9ybWF0IGRldGVjdGVkJywge1xuICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgIGxlbmd0aDogdG9rZW4ubGVuZ3RoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZygnVmFsaWQgR2l0SHViIHRva2VuIGZvdW5kJywge1xuICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZSh0b2tlbiksXG4gICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbilcbiAgICB9KTtcblxuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRhY3QgdG9rZW4gZm9yIHNhZmUgbG9nZ2luZ1xuICAgKi9cbiAgc3RhdGljIHJlZGFjdFRva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4ubGVuZ3RoIDwgOCkge1xuICAgICAgcmV0dXJuICdbUkVEQUNURURdJztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCA0KSArICcuLi4nICsgdG9rZW4uc3Vic3RyaW5nKHRva2VuLmxlbmd0aCAtIDQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b2tlbiB0eXBlIGZyb20gZm9ybWF0XG4gICAqL1xuICBzdGF0aWMgZ2V0VG9rZW5UeXBlKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5QRVJTT05BTF9BQ0NFU1NfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnUGVyc29uYWwgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKHRoaXMuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLklOU1RBTExBVElPTl9UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdJbnN0YWxsYXRpb24gVG9rZW4nO1xuICAgIH1cbiAgICBpZiAodGhpcy5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuVVNFUl9BQ0NFU1NfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnVXNlciBBY2Nlc3MgVG9rZW4nO1xuICAgIH1cbiAgICBpZiAodGhpcy5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuUkVGUkVTSF9UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdSZWZyZXNoIFRva2VuJztcbiAgICB9XG4gICAgcmV0dXJuICdVbmtub3duJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2FmZSB0b2tlbiBwcmVmaXggZm9yIGxvZ2dpbmdcbiAgICovXG4gIHN0YXRpYyBnZXRUb2tlblByZWZpeCh0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCA8IDQpIHtcbiAgICAgIHJldHVybiAnW0lOVkFMSURdJztcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCA0KSArICcuLi4nO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRva2VuIHNjb3BlcyB2aWEgR2l0SHViIEFQSVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlVG9rZW5TY29wZXMoXG4gICAgdG9rZW46IHN0cmluZywgXG4gICAgcmVxdWlyZWRTY29wZXM6IFRva2VuU2NvcGVzXG4gICk6IFByb21pc2U8VG9rZW5WYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgLy8gVmFsaWRhdGUgdG9rZW4gZm9ybWF0IGJlZm9yZSBjb25zdW1pbmcgcmF0ZSBsaW1pdFxuICAgIGlmICghdGhpcy52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIHJhdGUgbGltaXQgYmVmb3JlIG1ha2luZyBBUEkgY2FsbFxuICAgIGNvbnN0IHJhdGVMaW1pdGVyID0gdGhpcy5nZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk7XG4gICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gcmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuXG4gICAgaWYgKCFyYXRlTGltaXRTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdCBleGNlZWRlZCcsIHtcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICByZXRyeUFmdGVyTXM6IHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgIHJlbWFpbmluZ1Rva2VuczogcmF0ZUxpbWl0U3RhdHVzLnJlbWFpbmluZ1Rva2Vuc1xuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICBgVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgcmV0cnkgaW4gJHtNYXRoLmNlaWwoKHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMgfHwgMCkgLyAxMDAwKX0gc2Vjb25kcy5gLFxuICAgICAgICAnUkFURV9MSU1JVF9FWENFRURFRCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnN1bWUgcmF0ZSBsaW1pdCB0b2tlbiBmb3IgdGhpcyB2YWxpZGF0aW9uIGF0dGVtcHRcbiAgICAgIHJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgLy8gTWFrZSBhIHRlc3QgQVBJIGNhbGwgdG8gY2hlY2sgdG9rZW4gdmFsaWRpdHkgYW5kIHNjb3Blc1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2VyJywge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhdGVMaW1pdFJlbWFpbmluZyA9IHBhcnNlSW50KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZW1haW5pbmcnKSB8fCAnMCcpO1xuICAgICAgY29uc3QgcmF0ZUxpbWl0UmVzZXQgPSBwYXJzZUludChyZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVzZXQnKSB8fCAnMCcpO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YDtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gZmFpbGVkJywge1xuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3Qgc2NvcGVzIGZyb20gcmVzcG9uc2UgaGVhZGVyc1xuICAgICAgY29uc3Qgc2NvcGVzSGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtb2F1dGgtc2NvcGVzJykgfHwgJyc7XG4gICAgICBjb25zdCB0b2tlblNjb3BlcyA9IHNjb3Blc0hlYWRlci5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIocyA9PiBzKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgcmVxdWlyZWQgc2NvcGVzIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBoYXNSZXF1aXJlZFNjb3BlcyA9IHJlcXVpcmVkU2NvcGVzLnJlcXVpcmVkLmV2ZXJ5KHNjb3BlID0+IFxuICAgICAgICB0b2tlblNjb3Blcy5pbmNsdWRlcyhzY29wZSlcbiAgICAgICk7XG5cbiAgICAgIGlmICghaGFzUmVxdWlyZWRTY29wZXMpIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ1Njb3BlcyA9IHJlcXVpcmVkU2NvcGVzLnJlcXVpcmVkLmZpbHRlcihzY29wZSA9PiBcbiAgICAgICAgICAhdG9rZW5TY29wZXMuaW5jbHVkZXMoc2NvcGUpXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gbWlzc2luZyByZXF1aXJlZCBzY29wZXMnLCB7XG4gICAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICAgIG1pc3NpbmdTY29wZXM6IG1pc3NpbmdTY29wZXMsXG4gICAgICAgICAgY3VycmVudFNjb3BlczogdG9rZW5TY29wZXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICAgIGVycm9yOiBgTWlzc2luZyByZXF1aXJlZCBzY29wZXM6ICR7bWlzc2luZ1Njb3Blcy5qb2luKCcsICcpfWBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1Rva2VuIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bCcsIHtcbiAgICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZSh0b2tlbiksXG4gICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKSxcbiAgICAgICAgc2NvcGVzOiB0b2tlblNjb3BlcyxcbiAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiByYXRlTGltaXRSZW1haW5pbmdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICByYXRlTGltaXQ6IHtcbiAgICAgICAgICByZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZyxcbiAgICAgICAgICByZXNldFRpbWU6IG5ldyBEYXRlKHJhdGVMaW1pdFJlc2V0ICogMTAwMClcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgU2VjdXJpdHlFcnJvciAoaW5jbHVkaW5nIHJhdGUgbGltaXQgZXJyb3JzKSBzZXBhcmF0ZWx5XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yICYmIGVycm9yLmNvZGUgPT09ICdSQVRFX0xJTUlUX0VYQ0VFREVEJykge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gcmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIHJhdGVMaW1pdEV4Y2VlZGVkOiB0cnVlLFxuICAgICAgICAgIHJldHJ5QWZ0ZXJNczogY3VycmVudFN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcic7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1Rva2VuIHZhbGlkYXRpb24gZXJyb3InLCB7XG4gICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYFZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBzYWZlIGVycm9yIG1lc3NhZ2Ugd2l0aG91dCB0b2tlbiBleHBvc3VyZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVNhZmVFcnJvck1lc3NhZ2UoZXJyb3I6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBhbnkgcG90ZW50aWFsIHRva2VuIGRhdGEgZnJvbSBlcnJvciBtZXNzYWdlc1xuICAgIGxldCBzYWZlTWVzc2FnZSA9IGVycm9yXG4gICAgICAucmVwbGFjZSgvZ2hwX1tBLVphLXowLTlfXXszNix9L2csICdbUkVEQUNURURfUEFUXScpXG4gICAgICAucmVwbGFjZSgvZ2hzX1tBLVphLXowLTlfXXszNix9L2csICdbUkVEQUNURURfSU5TVEFMTF0nKVxuICAgICAgLnJlcGxhY2UoL2dodV9bQS1aYS16MC05X117MzYsfS9nLCAnW1JFREFDVEVEX1VTRVJdJylcbiAgICAgIC5yZXBsYWNlKC9naHJfW0EtWmEtejAtOV9dezM2LH0vZywgJ1tSRURBQ1RFRF9SRUZSRVNIXScpO1xuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBjb25zdCB0b2tlblByZWZpeCA9IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pO1xuICAgICAgc2FmZU1lc3NhZ2UgKz0gYCAoVG9rZW46ICR7dG9rZW5QcmVmaXh9KWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhZmVNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtaW5pbXVtIHJlcXVpcmVkIHNjb3BlcyBmb3IgZGlmZmVyZW50IG9wZXJhdGlvbnNcbiAgICogXG4gICAqIE5PVEU6IFRoZSAnbWFya2V0cGxhY2UnIHNjb3BlIGlkZW50aWZpZXIgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKiB3aXRoIGV4aXN0aW5nIHRva2VuIHZhbGlkYXRpb25zLiBUaGlzIGlzIGFuIGludGVybmFsIHNjb3BlIG5hbWUgYW5kIGRvZXMgbm90XG4gICAqIGFmZmVjdCB1c2VyLWZhY2luZyBmdW5jdGlvbmFsaXR5LiAoUFIgIzI4MClcbiAgICovXG4gIHN0YXRpYyBnZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnbWFya2V0cGxhY2UnIHwgJ2NvbGxlY3Rpb24nIHwgJ2dpc3QnKTogVG9rZW5TY29wZXMge1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICdyZWFkJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydyZXBvJ10sXG4gICAgICAgICAgb3B0aW9uYWw6IFsndXNlcjplbWFpbCddXG4gICAgICAgIH07XG4gICAgICBcbiAgICAgIGNhc2UgJ3dyaXRlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydyZXBvJ10sXG4gICAgICAgICAgb3B0aW9uYWw6IFsndXNlcjplbWFpbCddXG4gICAgICAgIH07XG4gICAgICBcbiAgICAgIGNhc2UgJ21hcmtldHBsYWNlJzogLy8gSW50ZXJuYWwgc2NvcGUgbmFtZSBrZXB0IGZvciBjb21wYXRpYmlsaXR5IChQUiAjMjgwKVxuICAgICAgY2FzZSAnY29sbGVjdGlvbic6IC8vIE5ldyBwcmVmZXJyZWQgbmFtZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3JlcG8nXSxcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnZ2lzdCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IFsnZ2lzdCddLFxuICAgICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgICB9O1xuICAgICAgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3JlcG8nXVxuICAgICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0b2tlbiBoYXMgc3VmZmljaWVudCBwZXJtaXNzaW9ucyBmb3Igb3BlcmF0aW9uXG4gICAqIFxuICAgKiBOT1RFOiBUaGUgJ21hcmtldHBsYWNlJyBvcGVyYXRpb24gdHlwZSBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKiBUaGlzIGlzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gYWNjZXNzaW5nIGNvbGxlY3Rpb24gZmVhdHVyZXMuIChQUiAjMjgwKVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVuc3VyZVRva2VuUGVybWlzc2lvbnMoXG4gICAgb3BlcmF0aW9uOiAncmVhZCcgfCAnd3JpdGUnIHwgJ21hcmtldHBsYWNlJyB8ICdjb2xsZWN0aW9uJyB8ICdnaXN0J1xuICApOiBQcm9taXNlPFRva2VuVmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRHaXRIdWJUb2tlbigpO1xuICAgIFxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogJ05vIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVpcmVkU2NvcGVzID0gdGhpcy5nZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcbiAgfVxufSJdfQ==
@@ -1,97 +0,0 @@
1
- /**
2
- * Unicode Validator for DollhouseMCP
3
- *
4
- * Prevents Unicode-based bypass attacks including:
5
- * - Homograph attacks (visually similar characters)
6
- * - Direction override attacks (RLO/LRO)
7
- * - Mixed script attacks
8
- * - Zero-width character injection
9
- * - Unicode normalization bypasses
10
- *
11
- * Security: SEC-001 - Unicode attack prevention
12
- */
13
- export interface UnicodeValidationResult {
14
- isValid: boolean;
15
- normalizedContent: string;
16
- detectedIssues?: string[];
17
- severity?: 'low' | 'medium' | 'high' | 'critical';
18
- }
19
- export declare class UnicodeValidator {
20
- /**
21
- * Unicode attack patterns and confusable characters
22
- */
23
- /**
24
- * Direction override characters that can hide or reverse text display
25
- * @see https://unicode.org/reports/tr9/#Directional_Formatting_Characters
26
- * U+202A-U+202E: Left/Right embedding and override marks (LRE, RLE, PDF, LRO, RLO)
27
- * U+2066-U+2069: Isolate formatting characters (LRI, RLI, FSI, PDI)
28
- */
29
- private static readonly DIRECTION_OVERRIDE_CHARS;
30
- /**
31
- * Zero-width and invisible formatting characters often used to hide payloads
32
- * U+200B-U+200F: Zero-width spaces and directional marks
33
- * U+2028-U+202F: Line/paragraph separators and formatting characters
34
- * U+FEFF: Zero-width no-break space (Byte Order Mark)
35
- */
36
- private static readonly ZERO_WIDTH_CHARS;
37
- /**
38
- * Non-printable control characters that should not appear in normal text
39
- * U+0000-U+0008, U+000B-U+000C, U+000E-U+001F: C0 control codes (except TAB, LF, CR)
40
- * U+007F-U+009F: Delete and C1 control codes
41
- * U+FFFE-U+FFFF: Non-characters that should never appear in valid text
42
- */
43
- private static readonly NON_PRINTABLE_CHARS;
44
- /**
45
- * Common homograph/confusable character mappings
46
- * Maps visually similar Unicode characters to their ASCII equivalents
47
- */
48
- private static readonly CONFUSABLE_MAPPINGS;
49
- /**
50
- * Script mixing detection patterns
51
- * Detects suspicious mixing of different Unicode scripts
52
- */
53
- private static readonly SCRIPT_PATTERNS;
54
- /**
55
- * Normalize Unicode content to prevent bypass attacks
56
- */
57
- static normalize(content: string): UnicodeValidationResult;
58
- /**
59
- * Detect suspicious Unicode patterns that might indicate attacks
60
- */
61
- private static detectSuspiciousPatterns;
62
- /**
63
- * Replace confusable Unicode characters with ASCII equivalents
64
- */
65
- private static replaceConfusables;
66
- /**
67
- * Detect suspicious mixing of different Unicode scripts
68
- */
69
- private static detectMixedScripts;
70
- /**
71
- * Escalate severity level (higher severity takes precedence)
72
- */
73
- private static escalateSeverity;
74
- /**
75
- * Escape special regex characters for safe replacement
76
- */
77
- private static escapeRegex;
78
- /**
79
- * Check if content contains potentially dangerous Unicode patterns
80
- */
81
- static containsDangerousUnicode(content: string): boolean;
82
- /**
83
- * Check if content has excessive Unicode escape sequences
84
- * Prevents null pointer exception by safely checking match results
85
- */
86
- private static hasExcessiveUnicodeEscapes;
87
- /**
88
- * Safely check for malformed surrogate pairs without ReDoS vulnerability
89
- * Uses character-by-character validation instead of complex regex
90
- */
91
- private static hasMalformedSurrogates;
92
- /**
93
- * Get safe preview of Unicode content for logging
94
- */
95
- static getSafePreview(content: string, maxLength?: number): string;
96
- }
97
- //# sourceMappingURL=unicodeValidator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unicodeValidator.d.ts","sourceRoot":"","sources":["../../../../../src/security/validators/unicodeValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACnD;AAED,qBAAa,gBAAgB;IAC3B;;OAEG;IAEH;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAmC;IAEnF;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAEjF;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAwE;IAEnH;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CA2BxC;IAEH;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAOrC;IAEF;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IAiG1D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA2CvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAoBjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQzD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAKzC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAwBrC;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM;CAWxE"}