@dollhousemcp/mcp-server 1.3.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 (1004) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/LICENSE +51 -0
  3. package/README.md +1124 -0
  4. package/data/agents/code-reviewer.md +296 -0
  5. package/data/agents/research-assistant.md +259 -0
  6. package/data/agents/task-manager.md +206 -0
  7. package/data/ensembles/business-advisor.md +354 -0
  8. package/data/ensembles/creative-studio.md +288 -0
  9. package/data/ensembles/development-team.md +292 -0
  10. package/data/ensembles/security-analysis-team.md +438 -0
  11. package/data/memories/conversation-history.md +146 -0
  12. package/data/memories/learning-progress.md +376 -0
  13. package/data/memories/project-context.md +268 -0
  14. package/data/personas/business-consultant.md +50 -0
  15. package/data/personas/creative-writer.md +44 -0
  16. package/data/personas/debug-detective.md +59 -0
  17. package/data/personas/eli5-explainer.md +49 -0
  18. package/data/personas/security-analyst.md +161 -0
  19. package/data/personas/technical-analyst.md +43 -0
  20. package/data/skills/code-review.md +112 -0
  21. package/data/skills/creative-writing.md +174 -0
  22. package/data/skills/data-analysis.md +160 -0
  23. package/data/skills/penetration-testing.md +374 -0
  24. package/data/skills/research.md +181 -0
  25. package/data/skills/threat-modeling.md +469 -0
  26. package/data/skills/translation.md +148 -0
  27. package/data/templates/code-documentation.md +409 -0
  28. package/data/templates/email-professional.md +158 -0
  29. package/data/templates/meeting-notes.md +141 -0
  30. package/data/templates/penetration-test-report.md +608 -0
  31. package/data/templates/project-brief.md +234 -0
  32. package/data/templates/report-executive.md +258 -0
  33. package/data/templates/security-vulnerability-report.md +457 -0
  34. package/data/templates/threat-assessment-report.md +774 -0
  35. package/dist/cache/APICache.d.ts +23 -0
  36. package/dist/cache/APICache.d.ts.map +1 -0
  37. package/dist/cache/APICache.js +42 -0
  38. package/dist/cache/index.d.ts +5 -0
  39. package/dist/cache/index.d.ts.map +1 -0
  40. package/dist/cache/index.js +5 -0
  41. package/dist/collection/CollectionBrowser.d.ts +24 -0
  42. package/dist/collection/CollectionBrowser.d.ts.map +1 -0
  43. package/dist/collection/CollectionBrowser.js +120 -0
  44. package/dist/collection/CollectionSearch.d.ts +18 -0
  45. package/dist/collection/CollectionSearch.d.ts.map +1 -0
  46. package/dist/collection/CollectionSearch.js +48 -0
  47. package/dist/collection/ElementInstaller.d.ts +33 -0
  48. package/dist/collection/ElementInstaller.d.ts.map +1 -0
  49. package/dist/collection/ElementInstaller.js +142 -0
  50. package/dist/collection/GitHubClient.d.ts +22 -0
  51. package/dist/collection/GitHubClient.d.ts.map +1 -0
  52. package/dist/collection/GitHubClient.js +114 -0
  53. package/dist/collection/MarketplaceBrowser.d.ts +24 -0
  54. package/dist/collection/MarketplaceBrowser.d.ts.map +1 -0
  55. package/dist/collection/MarketplaceBrowser.js +115 -0
  56. package/dist/collection/MarketplaceSearch.d.ts +18 -0
  57. package/dist/collection/MarketplaceSearch.d.ts.map +1 -0
  58. package/dist/collection/MarketplaceSearch.js +48 -0
  59. package/dist/collection/PersonaDetails.d.ts +22 -0
  60. package/dist/collection/PersonaDetails.d.ts.map +1 -0
  61. package/dist/collection/PersonaDetails.js +71 -0
  62. package/dist/collection/PersonaInstaller.d.ts +26 -0
  63. package/dist/collection/PersonaInstaller.d.ts.map +1 -0
  64. package/dist/collection/PersonaInstaller.js +103 -0
  65. package/dist/collection/PersonaSubmitter.d.ts +19 -0
  66. package/dist/collection/PersonaSubmitter.d.ts.map +1 -0
  67. package/dist/collection/PersonaSubmitter.js +57 -0
  68. package/dist/collection/index.d.ts +10 -0
  69. package/dist/collection/index.d.ts.map +1 -0
  70. package/dist/collection/index.js +10 -0
  71. package/dist/config/constants.d.ts +25 -0
  72. package/dist/config/constants.d.ts.map +1 -0
  73. package/dist/config/constants.js +34 -0
  74. package/dist/config/index.d.ts +6 -0
  75. package/dist/config/index.d.ts.map +1 -0
  76. package/dist/config/index.js +6 -0
  77. package/dist/config/indicator-config.d.ts +107 -0
  78. package/dist/config/indicator-config.d.ts.map +1 -0
  79. package/dist/config/indicator-config.js +158 -0
  80. package/dist/constants/defaultPersonas.d.ts +10 -0
  81. package/dist/constants/defaultPersonas.d.ts.map +1 -0
  82. package/dist/constants/defaultPersonas.js +18 -0
  83. package/dist/constants/limits.d.ts +10 -0
  84. package/dist/constants/limits.d.ts.map +1 -0
  85. package/dist/constants/limits.js +13 -0
  86. package/dist/elements/BaseElement.d.ts +81 -0
  87. package/dist/elements/BaseElement.d.ts.map +1 -0
  88. package/dist/elements/BaseElement.js +381 -0
  89. package/dist/elements/FeedbackProcessor.d.ts +57 -0
  90. package/dist/elements/FeedbackProcessor.d.ts.map +1 -0
  91. package/dist/elements/FeedbackProcessor.js +418 -0
  92. package/dist/elements/agents/Agent.d.ts +145 -0
  93. package/dist/elements/agents/Agent.d.ts.map +1 -0
  94. package/dist/elements/agents/Agent.js +848 -0
  95. package/dist/elements/agents/AgentManager.d.ts +125 -0
  96. package/dist/elements/agents/AgentManager.d.ts.map +1 -0
  97. package/dist/elements/agents/AgentManager.js +615 -0
  98. package/dist/elements/agents/constants.d.ts +42 -0
  99. package/dist/elements/agents/constants.d.ts.map +1 -0
  100. package/dist/elements/agents/constants.js +45 -0
  101. package/dist/elements/agents/goalTemplates.d.ts +44 -0
  102. package/dist/elements/agents/goalTemplates.d.ts.map +1 -0
  103. package/dist/elements/agents/goalTemplates.js +297 -0
  104. package/dist/elements/agents/index.d.ts +8 -0
  105. package/dist/elements/agents/index.d.ts.map +1 -0
  106. package/dist/elements/agents/index.js +8 -0
  107. package/dist/elements/agents/ruleEngineConfig.d.ts +76 -0
  108. package/dist/elements/agents/ruleEngineConfig.d.ts.map +1 -0
  109. package/dist/elements/agents/ruleEngineConfig.js +143 -0
  110. package/dist/elements/agents/types.d.ts +97 -0
  111. package/dist/elements/agents/types.d.ts.map +1 -0
  112. package/dist/elements/agents/types.js +5 -0
  113. package/dist/elements/ensembles/Ensemble.d.ts +144 -0
  114. package/dist/elements/ensembles/Ensemble.d.ts.map +1 -0
  115. package/dist/elements/ensembles/Ensemble.js +860 -0
  116. package/dist/elements/ensembles/EnsembleManager.d.ts +85 -0
  117. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -0
  118. package/dist/elements/ensembles/EnsembleManager.js +378 -0
  119. package/dist/elements/ensembles/constants.d.ts +73 -0
  120. package/dist/elements/ensembles/constants.d.ts.map +1 -0
  121. package/dist/elements/ensembles/constants.js +92 -0
  122. package/dist/elements/ensembles/index.d.ts +8 -0
  123. package/dist/elements/ensembles/index.d.ts.map +1 -0
  124. package/dist/elements/ensembles/index.js +8 -0
  125. package/dist/elements/ensembles/types.d.ts +92 -0
  126. package/dist/elements/ensembles/types.d.ts.map +1 -0
  127. package/dist/elements/ensembles/types.js +8 -0
  128. package/dist/elements/index.d.ts +11 -0
  129. package/dist/elements/index.d.ts.map +1 -0
  130. package/dist/elements/index.js +12 -0
  131. package/dist/elements/memories/Memory.d.ts +110 -0
  132. package/dist/elements/memories/Memory.d.ts.map +1 -0
  133. package/dist/elements/memories/Memory.js +470 -0
  134. package/dist/elements/memories/MemoryManager.d.ts +86 -0
  135. package/dist/elements/memories/MemoryManager.d.ts.map +1 -0
  136. package/dist/elements/memories/MemoryManager.js +435 -0
  137. package/dist/elements/memories/constants.d.ts +42 -0
  138. package/dist/elements/memories/constants.d.ts.map +1 -0
  139. package/dist/elements/memories/constants.js +49 -0
  140. package/dist/elements/memories/index.d.ts +6 -0
  141. package/dist/elements/memories/index.d.ts.map +1 -0
  142. package/dist/elements/memories/index.js +6 -0
  143. package/dist/elements/skills/Skill.d.ts +109 -0
  144. package/dist/elements/skills/Skill.d.ts.map +1 -0
  145. package/dist/elements/skills/Skill.js +381 -0
  146. package/dist/elements/skills/index.d.ts +5 -0
  147. package/dist/elements/skills/index.d.ts.map +1 -0
  148. package/dist/elements/skills/index.js +5 -0
  149. package/dist/elements/templates/Template.d.ts +138 -0
  150. package/dist/elements/templates/Template.d.ts.map +1 -0
  151. package/dist/elements/templates/Template.js +673 -0
  152. package/dist/elements/templates/TemplateManager.d.ts +104 -0
  153. package/dist/elements/templates/TemplateManager.d.ts.map +1 -0
  154. package/dist/elements/templates/TemplateManager.js +501 -0
  155. package/dist/elements/templates/index.d.ts +6 -0
  156. package/dist/elements/templates/index.d.ts.map +1 -0
  157. package/dist/elements/templates/index.js +6 -0
  158. package/dist/errors/SecurityError.d.ts +29 -0
  159. package/dist/errors/SecurityError.d.ts.map +1 -0
  160. package/dist/errors/SecurityError.js +47 -0
  161. package/dist/errors/index.d.ts +2 -0
  162. package/dist/errors/index.d.ts.map +1 -0
  163. package/dist/errors/index.js +2 -0
  164. package/dist/index.barrel.d.ts +21 -0
  165. package/dist/index.barrel.d.ts.map +1 -0
  166. package/dist/index.barrel.js +31 -0
  167. package/dist/index.d.ts +223 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +1606 -0
  170. package/dist/marketplace/GitHubClient.d.ts +22 -0
  171. package/dist/marketplace/GitHubClient.d.ts.map +1 -0
  172. package/dist/marketplace/GitHubClient.js +112 -0
  173. package/dist/marketplace/MarketplaceBrowser.d.ts +24 -0
  174. package/dist/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  175. package/dist/marketplace/MarketplaceBrowser.js +115 -0
  176. package/dist/marketplace/MarketplaceSearch.d.ts +18 -0
  177. package/dist/marketplace/MarketplaceSearch.d.ts.map +1 -0
  178. package/dist/marketplace/MarketplaceSearch.js +48 -0
  179. package/dist/marketplace/PersonaDetails.d.ts +22 -0
  180. package/dist/marketplace/PersonaDetails.d.ts.map +1 -0
  181. package/dist/marketplace/PersonaDetails.js +71 -0
  182. package/dist/marketplace/PersonaInstaller.d.ts +25 -0
  183. package/dist/marketplace/PersonaInstaller.d.ts.map +1 -0
  184. package/dist/marketplace/PersonaInstaller.js +100 -0
  185. package/dist/marketplace/PersonaSubmitter.d.ts +19 -0
  186. package/dist/marketplace/PersonaSubmitter.d.ts.map +1 -0
  187. package/dist/marketplace/PersonaSubmitter.js +57 -0
  188. package/dist/marketplace/index.d.ts +10 -0
  189. package/dist/marketplace/index.d.ts.map +1 -0
  190. package/dist/marketplace/index.js +10 -0
  191. package/dist/persona/PersonaElement.d.ts +64 -0
  192. package/dist/persona/PersonaElement.d.ts.map +1 -0
  193. package/dist/persona/PersonaElement.js +223 -0
  194. package/dist/persona/PersonaElementManager.d.ts +97 -0
  195. package/dist/persona/PersonaElementManager.d.ts.map +1 -0
  196. package/dist/persona/PersonaElementManager.js +348 -0
  197. package/dist/persona/PersonaLoader.d.ts +34 -0
  198. package/dist/persona/PersonaLoader.d.ts.map +1 -0
  199. package/dist/persona/PersonaLoader.js +145 -0
  200. package/dist/persona/PersonaManager.d.ts +112 -0
  201. package/dist/persona/PersonaManager.d.ts.map +1 -0
  202. package/dist/persona/PersonaManager.js +341 -0
  203. package/dist/persona/PersonaValidator.d.ts +39 -0
  204. package/dist/persona/PersonaValidator.d.ts.map +1 -0
  205. package/dist/persona/PersonaValidator.js +161 -0
  206. package/dist/persona/export-import/PersonaExporter.d.ts +43 -0
  207. package/dist/persona/export-import/PersonaExporter.d.ts.map +1 -0
  208. package/dist/persona/export-import/PersonaExporter.js +99 -0
  209. package/dist/persona/export-import/PersonaImporter.d.ts +65 -0
  210. package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -0
  211. package/dist/persona/export-import/PersonaImporter.js +315 -0
  212. package/dist/persona/export-import/PersonaSharer.d.ts +60 -0
  213. package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -0
  214. package/dist/persona/export-import/PersonaSharer.js +502 -0
  215. package/dist/persona/export-import/index.d.ts +10 -0
  216. package/dist/persona/export-import/index.d.ts.map +1 -0
  217. package/dist/persona/export-import/index.js +7 -0
  218. package/dist/persona/index.d.ts +7 -0
  219. package/dist/persona/index.d.ts.map +1 -0
  220. package/dist/persona/index.js +7 -0
  221. package/dist/portfolio/MigrationManager.d.ts +44 -0
  222. package/dist/portfolio/MigrationManager.d.ts.map +1 -0
  223. package/dist/portfolio/MigrationManager.js +163 -0
  224. package/dist/portfolio/PortfolioManager.d.ts +54 -0
  225. package/dist/portfolio/PortfolioManager.d.ts.map +1 -0
  226. package/dist/portfolio/PortfolioManager.js +224 -0
  227. package/dist/portfolio/types.d.ts +18 -0
  228. package/dist/portfolio/types.d.ts.map +1 -0
  229. package/dist/portfolio/types.js +13 -0
  230. package/dist/security/InputValidator.d.ts +80 -0
  231. package/dist/security/InputValidator.d.ts.map +1 -0
  232. package/dist/security/InputValidator.js +448 -0
  233. package/dist/security/audit/SecurityAuditor.d.ts +44 -0
  234. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -0
  235. package/dist/security/audit/SecurityAuditor.js +274 -0
  236. package/dist/security/audit/config/suppressions.d.ts +34 -0
  237. package/dist/security/audit/config/suppressions.d.ts.map +1 -0
  238. package/dist/security/audit/config/suppressions.js +575 -0
  239. package/dist/security/audit/index.d.ts +14 -0
  240. package/dist/security/audit/index.d.ts.map +1 -0
  241. package/dist/security/audit/index.js +15 -0
  242. package/dist/security/audit/reporters/ConsoleReporter.d.ts +46 -0
  243. package/dist/security/audit/reporters/ConsoleReporter.d.ts.map +1 -0
  244. package/dist/security/audit/reporters/ConsoleReporter.js +174 -0
  245. package/dist/security/audit/reporters/JsonReporter.d.ts +13 -0
  246. package/dist/security/audit/reporters/JsonReporter.d.ts.map +1 -0
  247. package/dist/security/audit/reporters/JsonReporter.js +25 -0
  248. package/dist/security/audit/reporters/MarkdownReporter.d.ts +13 -0
  249. package/dist/security/audit/reporters/MarkdownReporter.d.ts.map +1 -0
  250. package/dist/security/audit/reporters/MarkdownReporter.js +79 -0
  251. package/dist/security/audit/rules/SecurityRules.d.ts +20 -0
  252. package/dist/security/audit/rules/SecurityRules.d.ts.map +1 -0
  253. package/dist/security/audit/rules/SecurityRules.js +244 -0
  254. package/dist/security/audit/scanners/CodeScanner.d.ts +47 -0
  255. package/dist/security/audit/scanners/CodeScanner.d.ts.map +1 -0
  256. package/dist/security/audit/scanners/CodeScanner.js +174 -0
  257. package/dist/security/audit/scanners/ConfigurationScanner.d.ts +13 -0
  258. package/dist/security/audit/scanners/ConfigurationScanner.d.ts.map +1 -0
  259. package/dist/security/audit/scanners/ConfigurationScanner.js +22 -0
  260. package/dist/security/audit/scanners/DependencyScanner.d.ts +13 -0
  261. package/dist/security/audit/scanners/DependencyScanner.d.ts.map +1 -0
  262. package/dist/security/audit/scanners/DependencyScanner.js +22 -0
  263. package/dist/security/audit/types.d.ts +94 -0
  264. package/dist/security/audit/types.d.ts.map +1 -0
  265. package/dist/security/audit/types.js +6 -0
  266. package/dist/security/commandValidator.d.ts +7 -0
  267. package/dist/security/commandValidator.d.ts.map +1 -0
  268. package/dist/security/commandValidator.js +78 -0
  269. package/dist/security/constants.d.ts +24 -0
  270. package/dist/security/constants.d.ts.map +1 -0
  271. package/dist/security/constants.js +26 -0
  272. package/dist/security/contentValidator.d.ts +47 -0
  273. package/dist/security/contentValidator.d.ts.map +1 -0
  274. package/dist/security/contentValidator.js +301 -0
  275. package/dist/security/errorHandler.d.ts +42 -0
  276. package/dist/security/errorHandler.d.ts.map +1 -0
  277. package/dist/security/errorHandler.js +166 -0
  278. package/dist/security/errors.d.ts +14 -0
  279. package/dist/security/errors.d.ts.map +1 -0
  280. package/dist/security/errors.js +28 -0
  281. package/dist/security/fileLockManager.d.ts +70 -0
  282. package/dist/security/fileLockManager.d.ts.map +1 -0
  283. package/dist/security/fileLockManager.js +187 -0
  284. package/dist/security/index.d.ts +12 -0
  285. package/dist/security/index.d.ts.map +1 -0
  286. package/dist/security/index.js +14 -0
  287. package/dist/security/pathValidator.d.ts +9 -0
  288. package/dist/security/pathValidator.d.ts.map +1 -0
  289. package/dist/security/pathValidator.js +102 -0
  290. package/dist/security/regexValidator.d.ts +59 -0
  291. package/dist/security/regexValidator.d.ts.map +1 -0
  292. package/dist/security/regexValidator.js +214 -0
  293. package/dist/security/secureYamlParser.d.ts +46 -0
  294. package/dist/security/secureYamlParser.d.ts.map +1 -0
  295. package/dist/security/secureYamlParser.js +203 -0
  296. package/dist/security/securityMonitor.d.ts +58 -0
  297. package/dist/security/securityMonitor.d.ts.map +1 -0
  298. package/dist/security/securityMonitor.js +108 -0
  299. package/dist/security/tokenManager.d.ts +85 -0
  300. package/dist/security/tokenManager.d.ts.map +1 -0
  301. package/dist/security/tokenManager.js +286 -0
  302. package/dist/security/validators/unicodeValidator.d.ts +97 -0
  303. package/dist/security/validators/unicodeValidator.d.ts.map +1 -0
  304. package/dist/security/validators/unicodeValidator.js +312 -0
  305. package/dist/security/yamlValidator.d.ts +21 -0
  306. package/dist/security/yamlValidator.d.ts.map +1 -0
  307. package/dist/security/yamlValidator.js +164 -0
  308. package/dist/server/ServerSetup.d.ts +35 -0
  309. package/dist/server/ServerSetup.d.ts.map +1 -0
  310. package/dist/server/ServerSetup.js +116 -0
  311. package/dist/server/index.d.ts +7 -0
  312. package/dist/server/index.d.ts.map +1 -0
  313. package/dist/server/index.js +7 -0
  314. package/dist/server/startup.d.ts +31 -0
  315. package/dist/server/startup.d.ts.map +1 -0
  316. package/dist/server/startup.js +67 -0
  317. package/dist/server/tools/CollectionTools.d.ts +10 -0
  318. package/dist/server/tools/CollectionTools.d.ts.map +1 -0
  319. package/dist/server/tools/CollectionTools.js +96 -0
  320. package/dist/server/tools/ConfigTools.d.ts +10 -0
  321. package/dist/server/tools/ConfigTools.d.ts.map +1 -0
  322. package/dist/server/tools/ConfigTools.js +63 -0
  323. package/dist/server/tools/MarketplaceTools.d.ts +10 -0
  324. package/dist/server/tools/MarketplaceTools.d.ts.map +1 -0
  325. package/dist/server/tools/MarketplaceTools.js +96 -0
  326. package/dist/server/tools/PersonaTools.d.ts +10 -0
  327. package/dist/server/tools/PersonaTools.d.ts.map +1 -0
  328. package/dist/server/tools/PersonaTools.js +257 -0
  329. package/dist/server/tools/ToolRegistry.d.ts +37 -0
  330. package/dist/server/tools/ToolRegistry.d.ts.map +1 -0
  331. package/dist/server/tools/ToolRegistry.js +40 -0
  332. package/dist/server/tools/UpdateTools.d.ts +10 -0
  333. package/dist/server/tools/UpdateTools.d.ts.map +1 -0
  334. package/dist/server/tools/UpdateTools.js +64 -0
  335. package/dist/server/tools/UserTools.d.ts +10 -0
  336. package/dist/server/tools/UserTools.d.ts.map +1 -0
  337. package/dist/server/tools/UserTools.js +51 -0
  338. package/dist/server/tools/index.d.ts +10 -0
  339. package/dist/server/tools/index.d.ts.map +1 -0
  340. package/dist/server/tools/index.js +10 -0
  341. package/dist/server/types.d.ts +34 -0
  342. package/dist/server/types.d.ts.map +1 -0
  343. package/dist/server/types.js +5 -0
  344. package/dist/src/cache/APICache.d.ts +23 -0
  345. package/dist/src/cache/APICache.d.ts.map +1 -0
  346. package/dist/src/cache/APICache.js +42 -0
  347. package/dist/src/cache/index.d.ts +5 -0
  348. package/dist/src/cache/index.d.ts.map +1 -0
  349. package/dist/src/cache/index.js +5 -0
  350. package/dist/src/config/constants.d.ts +25 -0
  351. package/dist/src/config/constants.d.ts.map +1 -0
  352. package/dist/src/config/constants.js +30 -0
  353. package/dist/src/config/index.d.ts +6 -0
  354. package/dist/src/config/index.d.ts.map +1 -0
  355. package/dist/src/config/index.js +6 -0
  356. package/dist/src/config/indicator-config.d.ts +107 -0
  357. package/dist/src/config/indicator-config.d.ts.map +1 -0
  358. package/dist/src/config/indicator-config.js +158 -0
  359. package/dist/src/constants/defaultPersonas.d.ts +10 -0
  360. package/dist/src/constants/defaultPersonas.d.ts.map +1 -0
  361. package/dist/src/constants/defaultPersonas.js +18 -0
  362. package/dist/src/constants/limits.d.ts +10 -0
  363. package/dist/src/constants/limits.d.ts.map +1 -0
  364. package/dist/src/constants/limits.js +13 -0
  365. package/dist/src/errors/SecurityError.d.ts +29 -0
  366. package/dist/src/errors/SecurityError.d.ts.map +1 -0
  367. package/dist/src/errors/SecurityError.js +47 -0
  368. package/dist/src/errors/index.d.ts +2 -0
  369. package/dist/src/errors/index.d.ts.map +1 -0
  370. package/dist/src/errors/index.js +2 -0
  371. package/dist/src/index.barrel.d.ts +21 -0
  372. package/dist/src/index.barrel.d.ts.map +1 -0
  373. package/dist/src/index.barrel.js +31 -0
  374. package/dist/src/index.d.ts +220 -0
  375. package/dist/src/index.d.ts.map +1 -0
  376. package/dist/src/index.js +1559 -0
  377. package/dist/src/marketplace/GitHubClient.d.ts +22 -0
  378. package/dist/src/marketplace/GitHubClient.d.ts.map +1 -0
  379. package/dist/src/marketplace/GitHubClient.js +112 -0
  380. package/dist/src/marketplace/MarketplaceBrowser.d.ts +21 -0
  381. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  382. package/dist/src/marketplace/MarketplaceBrowser.js +45 -0
  383. package/dist/src/marketplace/MarketplaceSearch.d.ts +18 -0
  384. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
  385. package/dist/src/marketplace/MarketplaceSearch.js +36 -0
  386. package/dist/src/marketplace/PersonaDetails.d.ts +22 -0
  387. package/dist/src/marketplace/PersonaDetails.d.ts.map +1 -0
  388. package/dist/src/marketplace/PersonaDetails.js +71 -0
  389. package/dist/src/marketplace/PersonaInstaller.d.ts +25 -0
  390. package/dist/src/marketplace/PersonaInstaller.d.ts.map +1 -0
  391. package/dist/src/marketplace/PersonaInstaller.js +100 -0
  392. package/dist/src/marketplace/PersonaSubmitter.d.ts +19 -0
  393. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
  394. package/dist/src/marketplace/PersonaSubmitter.js +57 -0
  395. package/dist/src/marketplace/index.d.ts +10 -0
  396. package/dist/src/marketplace/index.d.ts.map +1 -0
  397. package/dist/src/marketplace/index.js +10 -0
  398. package/dist/src/persona/PersonaLoader.d.ts +33 -0
  399. package/dist/src/persona/PersonaLoader.d.ts.map +1 -0
  400. package/dist/src/persona/PersonaLoader.js +139 -0
  401. package/dist/src/persona/PersonaManager.d.ts +112 -0
  402. package/dist/src/persona/PersonaManager.d.ts.map +1 -0
  403. package/dist/src/persona/PersonaManager.js +341 -0
  404. package/dist/src/persona/PersonaValidator.d.ts +33 -0
  405. package/dist/src/persona/PersonaValidator.d.ts.map +1 -0
  406. package/dist/src/persona/PersonaValidator.js +157 -0
  407. package/dist/src/persona/export-import/PersonaExporter.d.ts +43 -0
  408. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
  409. package/dist/src/persona/export-import/PersonaExporter.js +99 -0
  410. package/dist/src/persona/export-import/PersonaImporter.d.ts +65 -0
  411. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
  412. package/dist/src/persona/export-import/PersonaImporter.js +313 -0
  413. package/dist/src/persona/export-import/PersonaSharer.d.ts +60 -0
  414. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
  415. package/dist/src/persona/export-import/PersonaSharer.js +363 -0
  416. package/dist/src/persona/export-import/index.d.ts +10 -0
  417. package/dist/src/persona/export-import/index.d.ts.map +1 -0
  418. package/dist/src/persona/export-import/index.js +7 -0
  419. package/dist/src/persona/index.d.ts +7 -0
  420. package/dist/src/persona/index.d.ts.map +1 -0
  421. package/dist/src/persona/index.js +7 -0
  422. package/dist/src/security/InputValidator.d.ts +69 -0
  423. package/dist/src/security/InputValidator.d.ts.map +1 -0
  424. package/dist/src/security/InputValidator.js +381 -0
  425. package/dist/src/security/commandValidator.d.ts +7 -0
  426. package/dist/src/security/commandValidator.d.ts.map +1 -0
  427. package/dist/src/security/commandValidator.js +77 -0
  428. package/dist/src/security/constants.d.ts +21 -0
  429. package/dist/src/security/constants.d.ts.map +1 -0
  430. package/dist/src/security/constants.js +23 -0
  431. package/dist/src/security/contentValidator.d.ts +47 -0
  432. package/dist/src/security/contentValidator.d.ts.map +1 -0
  433. package/dist/src/security/contentValidator.js +188 -0
  434. package/dist/src/security/fileLockManager.d.ts +70 -0
  435. package/dist/src/security/fileLockManager.d.ts.map +1 -0
  436. package/dist/src/security/fileLockManager.js +187 -0
  437. package/dist/src/security/index.d.ts +12 -0
  438. package/dist/src/security/index.d.ts.map +1 -0
  439. package/dist/src/security/index.js +14 -0
  440. package/dist/src/security/pathValidator.d.ts +9 -0
  441. package/dist/src/security/pathValidator.d.ts.map +1 -0
  442. package/dist/src/security/pathValidator.js +97 -0
  443. package/dist/src/security/secureYamlParser.d.ts +46 -0
  444. package/dist/src/security/secureYamlParser.d.ts.map +1 -0
  445. package/dist/src/security/secureYamlParser.js +203 -0
  446. package/dist/src/security/securityMonitor.d.ts +58 -0
  447. package/dist/src/security/securityMonitor.d.ts.map +1 -0
  448. package/dist/src/security/securityMonitor.js +108 -0
  449. package/dist/src/security/tokenManager.d.ts +59 -0
  450. package/dist/src/security/tokenManager.d.ts.map +1 -0
  451. package/dist/src/security/tokenManager.js +216 -0
  452. package/dist/src/security/yamlValidator.d.ts +20 -0
  453. package/dist/src/security/yamlValidator.d.ts.map +1 -0
  454. package/dist/src/security/yamlValidator.js +138 -0
  455. package/dist/src/server/ServerSetup.d.ts +31 -0
  456. package/dist/src/server/ServerSetup.d.ts.map +1 -0
  457. package/dist/src/server/ServerSetup.js +79 -0
  458. package/dist/src/server/index.d.ts +7 -0
  459. package/dist/src/server/index.d.ts.map +1 -0
  460. package/dist/src/server/index.js +7 -0
  461. package/dist/src/server/tools/ConfigTools.d.ts +10 -0
  462. package/dist/src/server/tools/ConfigTools.d.ts.map +1 -0
  463. package/dist/src/server/tools/ConfigTools.js +63 -0
  464. package/dist/src/server/tools/MarketplaceTools.d.ts +10 -0
  465. package/dist/src/server/tools/MarketplaceTools.d.ts.map +1 -0
  466. package/dist/src/server/tools/MarketplaceTools.js +92 -0
  467. package/dist/src/server/tools/PersonaTools.d.ts +10 -0
  468. package/dist/src/server/tools/PersonaTools.d.ts.map +1 -0
  469. package/dist/src/server/tools/PersonaTools.js +257 -0
  470. package/dist/src/server/tools/ToolRegistry.d.ts +37 -0
  471. package/dist/src/server/tools/ToolRegistry.d.ts.map +1 -0
  472. package/dist/src/server/tools/ToolRegistry.js +40 -0
  473. package/dist/src/server/tools/UpdateTools.d.ts +10 -0
  474. package/dist/src/server/tools/UpdateTools.d.ts.map +1 -0
  475. package/dist/src/server/tools/UpdateTools.js +64 -0
  476. package/dist/src/server/tools/UserTools.d.ts +10 -0
  477. package/dist/src/server/tools/UserTools.d.ts.map +1 -0
  478. package/dist/src/server/tools/UserTools.js +51 -0
  479. package/dist/src/server/tools/index.d.ts +10 -0
  480. package/dist/src/server/tools/index.d.ts.map +1 -0
  481. package/dist/src/server/tools/index.js +10 -0
  482. package/dist/src/server/types.d.ts +34 -0
  483. package/dist/src/server/types.d.ts.map +1 -0
  484. package/dist/src/server/types.js +5 -0
  485. package/dist/src/tools/debug.d.ts +20 -0
  486. package/dist/src/tools/debug.d.ts.map +1 -0
  487. package/dist/src/tools/debug.js +37 -0
  488. package/dist/src/types/cache.d.ts +8 -0
  489. package/dist/src/types/cache.d.ts.map +1 -0
  490. package/dist/src/types/cache.js +5 -0
  491. package/dist/src/types/index.d.ts +8 -0
  492. package/dist/src/types/index.d.ts.map +1 -0
  493. package/dist/src/types/index.js +8 -0
  494. package/dist/src/types/marketplace.d.ts +23 -0
  495. package/dist/src/types/marketplace.d.ts.map +1 -0
  496. package/dist/src/types/marketplace.js +5 -0
  497. package/dist/src/types/mcp.d.ts +161 -0
  498. package/dist/src/types/mcp.d.ts.map +1 -0
  499. package/dist/src/types/mcp.js +75 -0
  500. package/dist/src/types/persona.d.ts +30 -0
  501. package/dist/src/types/persona.d.ts.map +1 -0
  502. package/dist/src/types/persona.js +5 -0
  503. package/dist/src/update/BackupManager.d.ts +46 -0
  504. package/dist/src/update/BackupManager.d.ts.map +1 -0
  505. package/dist/src/update/BackupManager.js +261 -0
  506. package/dist/src/update/DependencyChecker.d.ts +41 -0
  507. package/dist/src/update/DependencyChecker.d.ts.map +1 -0
  508. package/dist/src/update/DependencyChecker.js +132 -0
  509. package/dist/src/update/RateLimiter.d.ts +80 -0
  510. package/dist/src/update/RateLimiter.d.ts.map +1 -0
  511. package/dist/src/update/RateLimiter.js +172 -0
  512. package/dist/src/update/SignatureVerifier.d.ts +71 -0
  513. package/dist/src/update/SignatureVerifier.d.ts.map +1 -0
  514. package/dist/src/update/SignatureVerifier.js +214 -0
  515. package/dist/src/update/UpdateChecker.d.ts +127 -0
  516. package/dist/src/update/UpdateChecker.d.ts.map +1 -0
  517. package/dist/src/update/UpdateChecker.js +460 -0
  518. package/dist/src/update/UpdateManager.d.ts +41 -0
  519. package/dist/src/update/UpdateManager.d.ts.map +1 -0
  520. package/dist/src/update/UpdateManager.js +260 -0
  521. package/dist/src/update/VersionManager.d.ts +31 -0
  522. package/dist/src/update/VersionManager.d.ts.map +1 -0
  523. package/dist/src/update/VersionManager.js +134 -0
  524. package/dist/src/update/index.d.ts +9 -0
  525. package/dist/src/update/index.d.ts.map +1 -0
  526. package/dist/src/update/index.js +9 -0
  527. package/dist/src/utils/filesystem.d.ts +32 -0
  528. package/dist/src/utils/filesystem.d.ts.map +1 -0
  529. package/dist/src/utils/filesystem.js +73 -0
  530. package/dist/src/utils/git.d.ts +32 -0
  531. package/dist/src/utils/git.d.ts.map +1 -0
  532. package/dist/src/utils/git.js +65 -0
  533. package/dist/src/utils/index.d.ts +7 -0
  534. package/dist/src/utils/index.d.ts.map +1 -0
  535. package/dist/src/utils/index.js +7 -0
  536. package/dist/src/utils/logger.d.ts +45 -0
  537. package/dist/src/utils/logger.d.ts.map +1 -0
  538. package/dist/src/utils/logger.js +91 -0
  539. package/dist/src/utils/version.d.ts +25 -0
  540. package/dist/src/utils/version.d.ts.map +1 -0
  541. package/dist/src/utils/version.js +97 -0
  542. package/dist/test/src/cache/APICache.d.ts +23 -0
  543. package/dist/test/src/cache/APICache.d.ts.map +1 -0
  544. package/dist/test/src/cache/APICache.js +42 -0
  545. package/dist/test/src/cache/index.d.ts +5 -0
  546. package/dist/test/src/cache/index.d.ts.map +1 -0
  547. package/dist/test/src/cache/index.js +5 -0
  548. package/dist/test/src/collection/CollectionBrowser.d.ts +24 -0
  549. package/dist/test/src/collection/CollectionBrowser.d.ts.map +1 -0
  550. package/dist/test/src/collection/CollectionBrowser.js +115 -0
  551. package/dist/test/src/collection/CollectionSearch.d.ts +18 -0
  552. package/dist/test/src/collection/CollectionSearch.d.ts.map +1 -0
  553. package/dist/test/src/collection/CollectionSearch.js +48 -0
  554. package/dist/test/src/collection/GitHubClient.d.ts +22 -0
  555. package/dist/test/src/collection/GitHubClient.d.ts.map +1 -0
  556. package/dist/test/src/collection/GitHubClient.js +114 -0
  557. package/dist/test/src/collection/PersonaDetails.d.ts +22 -0
  558. package/dist/test/src/collection/PersonaDetails.d.ts.map +1 -0
  559. package/dist/test/src/collection/PersonaDetails.js +71 -0
  560. package/dist/test/src/collection/PersonaInstaller.d.ts +26 -0
  561. package/dist/test/src/collection/PersonaInstaller.d.ts.map +1 -0
  562. package/dist/test/src/collection/PersonaInstaller.js +103 -0
  563. package/dist/test/src/collection/PersonaSubmitter.d.ts +19 -0
  564. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +1 -0
  565. package/dist/test/src/collection/PersonaSubmitter.js +57 -0
  566. package/dist/test/src/collection/index.d.ts +10 -0
  567. package/dist/test/src/collection/index.d.ts.map +1 -0
  568. package/dist/test/src/collection/index.js +10 -0
  569. package/dist/test/src/config/constants.d.ts +25 -0
  570. package/dist/test/src/config/constants.d.ts.map +1 -0
  571. package/dist/test/src/config/constants.js +30 -0
  572. package/dist/test/src/config/index.d.ts +6 -0
  573. package/dist/test/src/config/index.d.ts.map +1 -0
  574. package/dist/test/src/config/index.js +6 -0
  575. package/dist/test/src/config/indicator-config.d.ts +107 -0
  576. package/dist/test/src/config/indicator-config.d.ts.map +1 -0
  577. package/dist/test/src/config/indicator-config.js +158 -0
  578. package/dist/test/src/constants/defaultPersonas.d.ts +10 -0
  579. package/dist/test/src/constants/defaultPersonas.d.ts.map +1 -0
  580. package/dist/test/src/constants/defaultPersonas.js +18 -0
  581. package/dist/test/src/constants/limits.d.ts +10 -0
  582. package/dist/test/src/constants/limits.d.ts.map +1 -0
  583. package/dist/test/src/constants/limits.js +13 -0
  584. package/dist/test/src/elements/BaseElement.d.ts +81 -0
  585. package/dist/test/src/elements/BaseElement.d.ts.map +1 -0
  586. package/dist/test/src/elements/BaseElement.js +381 -0
  587. package/dist/test/src/elements/FeedbackProcessor.d.ts +57 -0
  588. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +1 -0
  589. package/dist/test/src/elements/FeedbackProcessor.js +418 -0
  590. package/dist/test/src/elements/agents/Agent.d.ts +145 -0
  591. package/dist/test/src/elements/agents/Agent.d.ts.map +1 -0
  592. package/dist/test/src/elements/agents/Agent.js +848 -0
  593. package/dist/test/src/elements/agents/AgentManager.d.ts +125 -0
  594. package/dist/test/src/elements/agents/AgentManager.d.ts.map +1 -0
  595. package/dist/test/src/elements/agents/AgentManager.js +608 -0
  596. package/dist/test/src/elements/agents/constants.d.ts +42 -0
  597. package/dist/test/src/elements/agents/constants.d.ts.map +1 -0
  598. package/dist/test/src/elements/agents/constants.js +45 -0
  599. package/dist/test/src/elements/agents/goalTemplates.d.ts +44 -0
  600. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +1 -0
  601. package/dist/test/src/elements/agents/goalTemplates.js +297 -0
  602. package/dist/test/src/elements/agents/index.d.ts +8 -0
  603. package/dist/test/src/elements/agents/index.d.ts.map +1 -0
  604. package/dist/test/src/elements/agents/index.js +8 -0
  605. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +76 -0
  606. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +1 -0
  607. package/dist/test/src/elements/agents/ruleEngineConfig.js +143 -0
  608. package/dist/test/src/elements/agents/types.d.ts +97 -0
  609. package/dist/test/src/elements/agents/types.d.ts.map +1 -0
  610. package/dist/test/src/elements/agents/types.js +5 -0
  611. package/dist/test/src/elements/index.d.ts +6 -0
  612. package/dist/test/src/elements/index.d.ts.map +1 -0
  613. package/dist/test/src/elements/index.js +6 -0
  614. package/dist/test/src/elements/memories/Memory.d.ts +110 -0
  615. package/dist/test/src/elements/memories/Memory.d.ts.map +1 -0
  616. package/dist/test/src/elements/memories/Memory.js +470 -0
  617. package/dist/test/src/elements/memories/MemoryManager.d.ts +86 -0
  618. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +1 -0
  619. package/dist/test/src/elements/memories/MemoryManager.js +435 -0
  620. package/dist/test/src/elements/memories/constants.d.ts +42 -0
  621. package/dist/test/src/elements/memories/constants.d.ts.map +1 -0
  622. package/dist/test/src/elements/memories/constants.js +49 -0
  623. package/dist/test/src/elements/memories/index.d.ts +6 -0
  624. package/dist/test/src/elements/memories/index.d.ts.map +1 -0
  625. package/dist/test/src/elements/memories/index.js +6 -0
  626. package/dist/test/src/elements/skills/Skill.d.ts +109 -0
  627. package/dist/test/src/elements/skills/Skill.d.ts.map +1 -0
  628. package/dist/test/src/elements/skills/Skill.js +381 -0
  629. package/dist/test/src/elements/templates/Template.d.ts +138 -0
  630. package/dist/test/src/elements/templates/Template.d.ts.map +1 -0
  631. package/dist/test/src/elements/templates/Template.js +673 -0
  632. package/dist/test/src/elements/templates/TemplateManager.d.ts +104 -0
  633. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +1 -0
  634. package/dist/test/src/elements/templates/TemplateManager.js +496 -0
  635. package/dist/test/src/elements/templates/index.d.ts +6 -0
  636. package/dist/test/src/elements/templates/index.d.ts.map +1 -0
  637. package/dist/test/src/elements/templates/index.js +6 -0
  638. package/dist/test/src/errors/SecurityError.d.ts +29 -0
  639. package/dist/test/src/errors/SecurityError.d.ts.map +1 -0
  640. package/dist/test/src/errors/SecurityError.js +47 -0
  641. package/dist/test/src/errors/index.d.ts +2 -0
  642. package/dist/test/src/errors/index.d.ts.map +1 -0
  643. package/dist/test/src/errors/index.js +2 -0
  644. package/dist/test/src/index.barrel.d.ts +21 -0
  645. package/dist/test/src/index.barrel.d.ts.map +1 -0
  646. package/dist/test/src/index.barrel.js +31 -0
  647. package/dist/test/src/index.d.ts +223 -0
  648. package/dist/test/src/index.d.ts.map +1 -0
  649. package/dist/test/src/index.js +1594 -0
  650. package/dist/test/src/marketplace/GitHubClient.d.ts +22 -0
  651. package/dist/test/src/marketplace/GitHubClient.d.ts.map +1 -0
  652. package/dist/test/src/marketplace/GitHubClient.js +112 -0
  653. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +21 -0
  654. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  655. package/dist/test/src/marketplace/MarketplaceBrowser.js +45 -0
  656. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +18 -0
  657. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
  658. package/dist/test/src/marketplace/MarketplaceSearch.js +36 -0
  659. package/dist/test/src/marketplace/PersonaDetails.d.ts +22 -0
  660. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +1 -0
  661. package/dist/test/src/marketplace/PersonaDetails.js +71 -0
  662. package/dist/test/src/marketplace/PersonaInstaller.d.ts +25 -0
  663. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +1 -0
  664. package/dist/test/src/marketplace/PersonaInstaller.js +100 -0
  665. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +19 -0
  666. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
  667. package/dist/test/src/marketplace/PersonaSubmitter.js +57 -0
  668. package/dist/test/src/marketplace/index.d.ts +10 -0
  669. package/dist/test/src/marketplace/index.d.ts.map +1 -0
  670. package/dist/test/src/marketplace/index.js +10 -0
  671. package/dist/test/src/persona/PersonaElement.d.ts +64 -0
  672. package/dist/test/src/persona/PersonaElement.d.ts.map +1 -0
  673. package/dist/test/src/persona/PersonaElement.js +223 -0
  674. package/dist/test/src/persona/PersonaElementManager.d.ts +97 -0
  675. package/dist/test/src/persona/PersonaElementManager.d.ts.map +1 -0
  676. package/dist/test/src/persona/PersonaElementManager.js +342 -0
  677. package/dist/test/src/persona/PersonaLoader.d.ts +34 -0
  678. package/dist/test/src/persona/PersonaLoader.d.ts.map +1 -0
  679. package/dist/test/src/persona/PersonaLoader.js +145 -0
  680. package/dist/test/src/persona/PersonaManager.d.ts +112 -0
  681. package/dist/test/src/persona/PersonaManager.d.ts.map +1 -0
  682. package/dist/test/src/persona/PersonaManager.js +341 -0
  683. package/dist/test/src/persona/PersonaValidator.d.ts +33 -0
  684. package/dist/test/src/persona/PersonaValidator.d.ts.map +1 -0
  685. package/dist/test/src/persona/PersonaValidator.js +157 -0
  686. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +43 -0
  687. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
  688. package/dist/test/src/persona/export-import/PersonaExporter.js +99 -0
  689. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +65 -0
  690. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
  691. package/dist/test/src/persona/export-import/PersonaImporter.js +315 -0
  692. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +60 -0
  693. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
  694. package/dist/test/src/persona/export-import/PersonaSharer.js +502 -0
  695. package/dist/test/src/persona/export-import/index.d.ts +10 -0
  696. package/dist/test/src/persona/export-import/index.d.ts.map +1 -0
  697. package/dist/test/src/persona/export-import/index.js +7 -0
  698. package/dist/test/src/persona/index.d.ts +7 -0
  699. package/dist/test/src/persona/index.d.ts.map +1 -0
  700. package/dist/test/src/persona/index.js +7 -0
  701. package/dist/test/src/portfolio/MigrationManager.d.ts +44 -0
  702. package/dist/test/src/portfolio/MigrationManager.d.ts.map +1 -0
  703. package/dist/test/src/portfolio/MigrationManager.js +163 -0
  704. package/dist/test/src/portfolio/PortfolioManager.d.ts +54 -0
  705. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +1 -0
  706. package/dist/test/src/portfolio/PortfolioManager.js +224 -0
  707. package/dist/test/src/portfolio/types.d.ts +18 -0
  708. package/dist/test/src/portfolio/types.d.ts.map +1 -0
  709. package/dist/test/src/portfolio/types.js +13 -0
  710. package/dist/test/src/security/InputValidator.d.ts +80 -0
  711. package/dist/test/src/security/InputValidator.d.ts.map +1 -0
  712. package/dist/test/src/security/InputValidator.js +436 -0
  713. package/dist/test/src/security/audit/SecurityAuditor.d.ts +44 -0
  714. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +1 -0
  715. package/dist/test/src/security/audit/SecurityAuditor.js +274 -0
  716. package/dist/test/src/security/audit/config/suppressions.d.ts +34 -0
  717. package/dist/test/src/security/audit/config/suppressions.d.ts.map +1 -0
  718. package/dist/test/src/security/audit/config/suppressions.js +575 -0
  719. package/dist/test/src/security/audit/index.d.ts +14 -0
  720. package/dist/test/src/security/audit/index.d.ts.map +1 -0
  721. package/dist/test/src/security/audit/index.js +15 -0
  722. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +46 -0
  723. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +1 -0
  724. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +174 -0
  725. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +13 -0
  726. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +1 -0
  727. package/dist/test/src/security/audit/reporters/JsonReporter.js +25 -0
  728. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +13 -0
  729. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +1 -0
  730. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +79 -0
  731. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +20 -0
  732. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +1 -0
  733. package/dist/test/src/security/audit/rules/SecurityRules.js +244 -0
  734. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +47 -0
  735. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +1 -0
  736. package/dist/test/src/security/audit/scanners/CodeScanner.js +174 -0
  737. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +13 -0
  738. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +1 -0
  739. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +22 -0
  740. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +13 -0
  741. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +1 -0
  742. package/dist/test/src/security/audit/scanners/DependencyScanner.js +22 -0
  743. package/dist/test/src/security/audit/types.d.ts +94 -0
  744. package/dist/test/src/security/audit/types.d.ts.map +1 -0
  745. package/dist/test/src/security/audit/types.js +6 -0
  746. package/dist/test/src/security/commandValidator.d.ts +7 -0
  747. package/dist/test/src/security/commandValidator.d.ts.map +1 -0
  748. package/dist/test/src/security/commandValidator.js +78 -0
  749. package/dist/test/src/security/constants.d.ts +24 -0
  750. package/dist/test/src/security/constants.d.ts.map +1 -0
  751. package/dist/test/src/security/constants.js +26 -0
  752. package/dist/test/src/security/contentValidator.d.ts +47 -0
  753. package/dist/test/src/security/contentValidator.d.ts.map +1 -0
  754. package/dist/test/src/security/contentValidator.js +301 -0
  755. package/dist/test/src/security/errors.d.ts +14 -0
  756. package/dist/test/src/security/errors.d.ts.map +1 -0
  757. package/dist/test/src/security/errors.js +28 -0
  758. package/dist/test/src/security/fileLockManager.d.ts +70 -0
  759. package/dist/test/src/security/fileLockManager.d.ts.map +1 -0
  760. package/dist/test/src/security/fileLockManager.js +187 -0
  761. package/dist/test/src/security/index.d.ts +12 -0
  762. package/dist/test/src/security/index.d.ts.map +1 -0
  763. package/dist/test/src/security/index.js +14 -0
  764. package/dist/test/src/security/pathValidator.d.ts +9 -0
  765. package/dist/test/src/security/pathValidator.d.ts.map +1 -0
  766. package/dist/test/src/security/pathValidator.js +98 -0
  767. package/dist/test/src/security/regexValidator.d.ts +59 -0
  768. package/dist/test/src/security/regexValidator.d.ts.map +1 -0
  769. package/dist/test/src/security/regexValidator.js +214 -0
  770. package/dist/test/src/security/secureYamlParser.d.ts +46 -0
  771. package/dist/test/src/security/secureYamlParser.d.ts.map +1 -0
  772. package/dist/test/src/security/secureYamlParser.js +203 -0
  773. package/dist/test/src/security/securityMonitor.d.ts +58 -0
  774. package/dist/test/src/security/securityMonitor.d.ts.map +1 -0
  775. package/dist/test/src/security/securityMonitor.js +108 -0
  776. package/dist/test/src/security/tokenManager.d.ts +85 -0
  777. package/dist/test/src/security/tokenManager.d.ts.map +1 -0
  778. package/dist/test/src/security/tokenManager.js +286 -0
  779. package/dist/test/src/security/validators/unicodeValidator.d.ts +97 -0
  780. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +1 -0
  781. package/dist/test/src/security/validators/unicodeValidator.js +312 -0
  782. package/dist/test/src/security/yamlValidator.d.ts +21 -0
  783. package/dist/test/src/security/yamlValidator.d.ts.map +1 -0
  784. package/dist/test/src/security/yamlValidator.js +164 -0
  785. package/dist/test/src/server/ServerSetup.d.ts +35 -0
  786. package/dist/test/src/server/ServerSetup.d.ts.map +1 -0
  787. package/dist/test/src/server/ServerSetup.js +116 -0
  788. package/dist/test/src/server/index.d.ts +7 -0
  789. package/dist/test/src/server/index.d.ts.map +1 -0
  790. package/dist/test/src/server/index.js +7 -0
  791. package/dist/test/src/server/startup.d.ts +31 -0
  792. package/dist/test/src/server/startup.d.ts.map +1 -0
  793. package/dist/test/src/server/startup.js +67 -0
  794. package/dist/test/src/server/tools/CollectionTools.d.ts +10 -0
  795. package/dist/test/src/server/tools/CollectionTools.d.ts.map +1 -0
  796. package/dist/test/src/server/tools/CollectionTools.js +96 -0
  797. package/dist/test/src/server/tools/ConfigTools.d.ts +10 -0
  798. package/dist/test/src/server/tools/ConfigTools.d.ts.map +1 -0
  799. package/dist/test/src/server/tools/ConfigTools.js +63 -0
  800. package/dist/test/src/server/tools/MarketplaceTools.d.ts +10 -0
  801. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +1 -0
  802. package/dist/test/src/server/tools/MarketplaceTools.js +92 -0
  803. package/dist/test/src/server/tools/PersonaTools.d.ts +10 -0
  804. package/dist/test/src/server/tools/PersonaTools.d.ts.map +1 -0
  805. package/dist/test/src/server/tools/PersonaTools.js +257 -0
  806. package/dist/test/src/server/tools/ToolRegistry.d.ts +37 -0
  807. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +1 -0
  808. package/dist/test/src/server/tools/ToolRegistry.js +40 -0
  809. package/dist/test/src/server/tools/UpdateTools.d.ts +10 -0
  810. package/dist/test/src/server/tools/UpdateTools.d.ts.map +1 -0
  811. package/dist/test/src/server/tools/UpdateTools.js +64 -0
  812. package/dist/test/src/server/tools/UserTools.d.ts +10 -0
  813. package/dist/test/src/server/tools/UserTools.d.ts.map +1 -0
  814. package/dist/test/src/server/tools/UserTools.js +51 -0
  815. package/dist/test/src/server/tools/index.d.ts +10 -0
  816. package/dist/test/src/server/tools/index.d.ts.map +1 -0
  817. package/dist/test/src/server/tools/index.js +10 -0
  818. package/dist/test/src/server/types.d.ts +34 -0
  819. package/dist/test/src/server/types.d.ts.map +1 -0
  820. package/dist/test/src/server/types.js +5 -0
  821. package/dist/test/src/tools/debug.d.ts +20 -0
  822. package/dist/test/src/tools/debug.d.ts.map +1 -0
  823. package/dist/test/src/tools/debug.js +37 -0
  824. package/dist/test/src/types/cache.d.ts +8 -0
  825. package/dist/test/src/types/cache.d.ts.map +1 -0
  826. package/dist/test/src/types/cache.js +5 -0
  827. package/dist/test/src/types/collection.d.ts +23 -0
  828. package/dist/test/src/types/collection.d.ts.map +1 -0
  829. package/dist/test/src/types/collection.js +5 -0
  830. package/dist/test/src/types/elements/IElement.d.ts +123 -0
  831. package/dist/test/src/types/elements/IElement.d.ts.map +1 -0
  832. package/dist/test/src/types/elements/IElement.js +30 -0
  833. package/dist/test/src/types/elements/IElementManager.d.ts +65 -0
  834. package/dist/test/src/types/elements/IElementManager.d.ts.map +1 -0
  835. package/dist/test/src/types/elements/IElementManager.js +6 -0
  836. package/dist/test/src/types/elements/IRatingManager.d.ts +109 -0
  837. package/dist/test/src/types/elements/IRatingManager.d.ts.map +1 -0
  838. package/dist/test/src/types/elements/IRatingManager.js +6 -0
  839. package/dist/test/src/types/elements/IReferenceResolver.d.ts +52 -0
  840. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +1 -0
  841. package/dist/test/src/types/elements/IReferenceResolver.js +6 -0
  842. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +49 -0
  843. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +1 -0
  844. package/dist/test/src/types/elements/RatingBreakdowns.js +6 -0
  845. package/dist/test/src/types/elements/index.d.ts +9 -0
  846. package/dist/test/src/types/elements/index.d.ts.map +1 -0
  847. package/dist/test/src/types/elements/index.js +11 -0
  848. package/dist/test/src/types/index.d.ts +9 -0
  849. package/dist/test/src/types/index.d.ts.map +1 -0
  850. package/dist/test/src/types/index.js +9 -0
  851. package/dist/test/src/types/marketplace.d.ts +23 -0
  852. package/dist/test/src/types/marketplace.d.ts.map +1 -0
  853. package/dist/test/src/types/marketplace.js +5 -0
  854. package/dist/test/src/types/mcp.d.ts +84 -0
  855. package/dist/test/src/types/mcp.d.ts.map +1 -0
  856. package/dist/test/src/types/mcp.js +80 -0
  857. package/dist/test/src/types/persona.d.ts +30 -0
  858. package/dist/test/src/types/persona.d.ts.map +1 -0
  859. package/dist/test/src/types/persona.js +5 -0
  860. package/dist/test/src/update/BackupManager.d.ts +46 -0
  861. package/dist/test/src/update/BackupManager.d.ts.map +1 -0
  862. package/dist/test/src/update/BackupManager.js +261 -0
  863. package/dist/test/src/update/DependencyChecker.d.ts +41 -0
  864. package/dist/test/src/update/DependencyChecker.d.ts.map +1 -0
  865. package/dist/test/src/update/DependencyChecker.js +132 -0
  866. package/dist/test/src/update/RateLimiter.d.ts +80 -0
  867. package/dist/test/src/update/RateLimiter.d.ts.map +1 -0
  868. package/dist/test/src/update/RateLimiter.js +172 -0
  869. package/dist/test/src/update/SignatureVerifier.d.ts +71 -0
  870. package/dist/test/src/update/SignatureVerifier.d.ts.map +1 -0
  871. package/dist/test/src/update/SignatureVerifier.js +214 -0
  872. package/dist/test/src/update/UpdateChecker.d.ts +127 -0
  873. package/dist/test/src/update/UpdateChecker.d.ts.map +1 -0
  874. package/dist/test/src/update/UpdateChecker.js +469 -0
  875. package/dist/test/src/update/UpdateManager.d.ts +41 -0
  876. package/dist/test/src/update/UpdateManager.d.ts.map +1 -0
  877. package/dist/test/src/update/UpdateManager.js +260 -0
  878. package/dist/test/src/update/VersionManager.d.ts +31 -0
  879. package/dist/test/src/update/VersionManager.d.ts.map +1 -0
  880. package/dist/test/src/update/VersionManager.js +134 -0
  881. package/dist/test/src/update/index.d.ts +9 -0
  882. package/dist/test/src/update/index.d.ts.map +1 -0
  883. package/dist/test/src/update/index.js +9 -0
  884. package/dist/test/src/utils/filesystem.d.ts +29 -0
  885. package/dist/test/src/utils/filesystem.d.ts.map +1 -0
  886. package/dist/test/src/utils/filesystem.js +94 -0
  887. package/dist/test/src/utils/git.d.ts +32 -0
  888. package/dist/test/src/utils/git.d.ts.map +1 -0
  889. package/dist/test/src/utils/git.js +65 -0
  890. package/dist/test/src/utils/index.d.ts +7 -0
  891. package/dist/test/src/utils/index.d.ts.map +1 -0
  892. package/dist/test/src/utils/index.js +7 -0
  893. package/dist/test/src/utils/logger.d.ts +45 -0
  894. package/dist/test/src/utils/logger.d.ts.map +1 -0
  895. package/dist/test/src/utils/logger.js +91 -0
  896. package/dist/test/src/utils/version.d.ts +25 -0
  897. package/dist/test/src/utils/version.d.ts.map +1 -0
  898. package/dist/test/src/utils/version.js +97 -0
  899. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +33 -0
  900. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +1 -0
  901. package/dist/test/test/__tests__/integration/helpers/file-utils.js +83 -0
  902. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +26 -0
  903. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +1 -0
  904. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +95 -0
  905. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +26 -0
  906. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +1 -0
  907. package/dist/test/test/__tests__/integration/helpers/test-server.js +41 -0
  908. package/dist/test/test/__tests__/integration/setup.d.ts +8 -0
  909. package/dist/test/test/__tests__/integration/setup.d.ts.map +1 -0
  910. package/dist/test/test/__tests__/integration/setup.js +31 -0
  911. package/dist/test/test/__tests__/integration/teardown.d.ts +5 -0
  912. package/dist/test/test/__tests__/integration/teardown.d.ts.map +1 -0
  913. package/dist/test/test/__tests__/integration/teardown.js +23 -0
  914. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +34 -0
  915. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +1 -0
  916. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +224 -0
  917. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +89 -0
  918. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +1 -0
  919. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +543 -0
  920. package/dist/test/test/__tests__/security/index.d.ts +46 -0
  921. package/dist/test/test/__tests__/security/index.d.ts.map +1 -0
  922. package/dist/test/test/__tests__/security/index.js +98 -0
  923. package/dist/test/test/__tests__/security/setup.d.ts +3 -0
  924. package/dist/test/test/__tests__/security/setup.d.ts.map +1 -0
  925. package/dist/test/test/__tests__/security/setup.js +23 -0
  926. package/dist/tools/debug.d.ts +20 -0
  927. package/dist/tools/debug.d.ts.map +1 -0
  928. package/dist/tools/debug.js +37 -0
  929. package/dist/types/cache.d.ts +8 -0
  930. package/dist/types/cache.d.ts.map +1 -0
  931. package/dist/types/cache.js +5 -0
  932. package/dist/types/collection.d.ts +23 -0
  933. package/dist/types/collection.d.ts.map +1 -0
  934. package/dist/types/collection.js +5 -0
  935. package/dist/types/elements/IElement.d.ts +123 -0
  936. package/dist/types/elements/IElement.d.ts.map +1 -0
  937. package/dist/types/elements/IElement.js +30 -0
  938. package/dist/types/elements/IElementManager.d.ts +65 -0
  939. package/dist/types/elements/IElementManager.d.ts.map +1 -0
  940. package/dist/types/elements/IElementManager.js +6 -0
  941. package/dist/types/elements/IRatingManager.d.ts +109 -0
  942. package/dist/types/elements/IRatingManager.d.ts.map +1 -0
  943. package/dist/types/elements/IRatingManager.js +6 -0
  944. package/dist/types/elements/IReferenceResolver.d.ts +52 -0
  945. package/dist/types/elements/IReferenceResolver.d.ts.map +1 -0
  946. package/dist/types/elements/IReferenceResolver.js +6 -0
  947. package/dist/types/elements/RatingBreakdowns.d.ts +49 -0
  948. package/dist/types/elements/RatingBreakdowns.d.ts.map +1 -0
  949. package/dist/types/elements/RatingBreakdowns.js +6 -0
  950. package/dist/types/elements/index.d.ts +9 -0
  951. package/dist/types/elements/index.d.ts.map +1 -0
  952. package/dist/types/elements/index.js +11 -0
  953. package/dist/types/index.d.ts +9 -0
  954. package/dist/types/index.d.ts.map +1 -0
  955. package/dist/types/index.js +9 -0
  956. package/dist/types/marketplace.d.ts +23 -0
  957. package/dist/types/marketplace.d.ts.map +1 -0
  958. package/dist/types/marketplace.js +5 -0
  959. package/dist/types/mcp.d.ts +84 -0
  960. package/dist/types/mcp.d.ts.map +1 -0
  961. package/dist/types/mcp.js +80 -0
  962. package/dist/types/persona.d.ts +30 -0
  963. package/dist/types/persona.d.ts.map +1 -0
  964. package/dist/types/persona.js +5 -0
  965. package/dist/update/BackupManager.d.ts +46 -0
  966. package/dist/update/BackupManager.d.ts.map +1 -0
  967. package/dist/update/BackupManager.js +261 -0
  968. package/dist/update/DependencyChecker.d.ts +41 -0
  969. package/dist/update/DependencyChecker.d.ts.map +1 -0
  970. package/dist/update/DependencyChecker.js +132 -0
  971. package/dist/update/RateLimiter.d.ts +80 -0
  972. package/dist/update/RateLimiter.d.ts.map +1 -0
  973. package/dist/update/RateLimiter.js +172 -0
  974. package/dist/update/SignatureVerifier.d.ts +71 -0
  975. package/dist/update/SignatureVerifier.d.ts.map +1 -0
  976. package/dist/update/SignatureVerifier.js +214 -0
  977. package/dist/update/UpdateChecker.d.ts +127 -0
  978. package/dist/update/UpdateChecker.d.ts.map +1 -0
  979. package/dist/update/UpdateChecker.js +469 -0
  980. package/dist/update/UpdateManager.d.ts +41 -0
  981. package/dist/update/UpdateManager.d.ts.map +1 -0
  982. package/dist/update/UpdateManager.js +260 -0
  983. package/dist/update/VersionManager.d.ts +31 -0
  984. package/dist/update/VersionManager.d.ts.map +1 -0
  985. package/dist/update/VersionManager.js +134 -0
  986. package/dist/update/index.d.ts +9 -0
  987. package/dist/update/index.d.ts.map +1 -0
  988. package/dist/update/index.js +9 -0
  989. package/dist/utils/filesystem.d.ts +29 -0
  990. package/dist/utils/filesystem.d.ts.map +1 -0
  991. package/dist/utils/filesystem.js +94 -0
  992. package/dist/utils/git.d.ts +32 -0
  993. package/dist/utils/git.d.ts.map +1 -0
  994. package/dist/utils/git.js +65 -0
  995. package/dist/utils/index.d.ts +7 -0
  996. package/dist/utils/index.d.ts.map +1 -0
  997. package/dist/utils/index.js +7 -0
  998. package/dist/utils/logger.d.ts +45 -0
  999. package/dist/utils/logger.d.ts.map +1 -0
  1000. package/dist/utils/logger.js +91 -0
  1001. package/dist/utils/version.d.ts +25 -0
  1002. package/dist/utils/version.d.ts.map +1 -0
  1003. package/dist/utils/version.js +97 -0
  1004. package/package.json +128 -0
@@ -0,0 +1,97 @@
1
+ import path from 'path';
2
+ import fs from 'fs/promises';
3
+ import { logger } from '../utils/logger.js';
4
+ export class PathValidator {
5
+ static ALLOWED_DIRECTORIES = [];
6
+ static ALLOWED_EXTENSIONS = ['.md', '.markdown', '.txt', '.yml', '.yaml'];
7
+ static initialize(personasDir, allowedExtensions) {
8
+ this.ALLOWED_DIRECTORIES = [
9
+ path.resolve(personasDir),
10
+ path.resolve('./personas'),
11
+ path.resolve('./custom-personas'),
12
+ path.resolve('./backups'),
13
+ path.resolve(process.env.PERSONAS_DIR || './personas')
14
+ ];
15
+ if (allowedExtensions) {
16
+ this.ALLOWED_EXTENSIONS = allowedExtensions;
17
+ }
18
+ }
19
+ static async validatePersonaPath(userPath) {
20
+ if (!userPath || typeof userPath !== 'string') {
21
+ throw new Error('Path must be a non-empty string');
22
+ }
23
+ // Remove any null bytes
24
+ const cleanPath = userPath.replace(/\x00/g, '');
25
+ // Normalize and resolve path
26
+ const normalizedPath = path.normalize(cleanPath);
27
+ const resolvedPath = path.resolve(normalizedPath);
28
+ // Check for path traversal attempts
29
+ if (normalizedPath.includes('..') || cleanPath.includes('..')) {
30
+ logger.warn('Path traversal attempt detected', { userPath });
31
+ throw new Error('Path traversal detected');
32
+ }
33
+ // Check if path is within allowed directories
34
+ if (this.ALLOWED_DIRECTORIES.length === 0) {
35
+ // If not initialized, allow paths under current working directory's personas folder
36
+ const defaultAllowed = [
37
+ path.resolve('./personas'),
38
+ path.resolve(process.env.PERSONAS_DIR || './personas')
39
+ ];
40
+ const isAllowed = defaultAllowed.some(allowedDir => resolvedPath.startsWith(allowedDir + path.sep) ||
41
+ resolvedPath === allowedDir);
42
+ if (!isAllowed) {
43
+ throw new Error(`Path access denied: ${userPath}`);
44
+ }
45
+ }
46
+ else {
47
+ const isAllowed = this.ALLOWED_DIRECTORIES.some(allowedDir => resolvedPath.startsWith(allowedDir + path.sep) ||
48
+ resolvedPath === allowedDir);
49
+ if (!isAllowed) {
50
+ throw new Error(`Path access denied: ${userPath}`);
51
+ }
52
+ }
53
+ // Validate filename if it's a file
54
+ if (path.extname(resolvedPath)) {
55
+ const filename = path.basename(resolvedPath);
56
+ const ext = path.extname(filename).toLowerCase();
57
+ // Check if extension is allowed
58
+ if (!this.ALLOWED_EXTENSIONS.includes(ext)) {
59
+ throw new Error(`File extension not allowed: ${ext}. Allowed: ${this.ALLOWED_EXTENSIONS.join(', ')}`);
60
+ }
61
+ // Validate filename format (alphanumeric, dash, underscore, dot)
62
+ if (!/^[a-zA-Z0-9\-_.]+$/i.test(filename)) {
63
+ throw new Error(`Invalid filename format: ${filename}`);
64
+ }
65
+ }
66
+ return resolvedPath;
67
+ }
68
+ static async safeReadFile(filePath) {
69
+ const validatedPath = await this.validatePersonaPath(filePath);
70
+ // Check file exists and is not a directory
71
+ const stats = await fs.stat(validatedPath);
72
+ if (stats.isDirectory()) {
73
+ throw new Error('Path is a directory, not a file');
74
+ }
75
+ // Size check
76
+ if (stats.size > 500000) { // 500KB
77
+ throw new Error('File too large');
78
+ }
79
+ return fs.readFile(validatedPath, 'utf-8');
80
+ }
81
+ static async safeWriteFile(filePath, content) {
82
+ const validatedPath = await this.validatePersonaPath(filePath);
83
+ // Content validation
84
+ if (content.length > 500000) {
85
+ throw new Error('Content too large');
86
+ }
87
+ // Ensure directory exists before atomic write
88
+ const dirPath = path.dirname(validatedPath);
89
+ await fs.mkdir(dirPath, { recursive: true });
90
+ // Write to temp file first (atomic write)
91
+ const tempPath = `${validatedPath}.tmp`;
92
+ await fs.writeFile(tempPath, content, 'utf-8');
93
+ // Rename to final path (atomic on most filesystems)
94
+ await fs.rename(tempPath, validatedPath);
95
+ }
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLE1BQU0sT0FBTyxhQUFhO0lBQ2hCLE1BQU0sQ0FBQyxtQkFBbUIsR0FBYSxFQUFFLENBQUM7SUFDMUMsTUFBTSxDQUFDLGtCQUFrQixHQUFhLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTVGLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBbUIsRUFBRSxpQkFBNEI7UUFDakUsSUFBSSxDQUFDLG1CQUFtQixHQUFHO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUM7U0FDdkQsQ0FBQztRQUVGLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsaUJBQWlCLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFFBQWdCO1FBQy9DLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FB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LE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQYXRoVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQUxMT1dFRF9ESVJFQ1RPUklFUzogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgQUxMT1dFRF9FWFRFTlNJT05TOiBzdHJpbmdbXSA9IFsnLm1kJywgJy5tYXJrZG93bicsICcudHh0JywgJy55bWwnLCAnLnlhbWwnXTtcbiAgXG4gIHN0YXRpYyBpbml0aWFsaXplKHBlcnNvbmFzRGlyOiBzdHJpbmcsIGFsbG93ZWRFeHRlbnNpb25zPzogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLkFMTE9XRURfRElSRUNUT1JJRVMgPSBbXG4gICAgICBwYXRoLnJlc29sdmUocGVyc29uYXNEaXIpLFxuICAgICAgcGF0aC5yZXNvbHZlKCcuL3BlcnNvbmFzJyksXG4gICAgICBwYXRoLnJlc29sdmUoJy4vY3VzdG9tLXBlcnNvbmFzJyksXG4gICAgICBwYXRoLnJlc29sdmUoJy4vYmFja3VwcycpLFxuICAgICAgcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LlBFUlNPTkFTX0RJUiB8fCAnLi9wZXJzb25hcycpXG4gICAgXTtcbiAgICBcbiAgICBpZiAoYWxsb3dlZEV4dGVuc2lvbnMpIHtcbiAgICAgIHRoaXMuQUxMT1dFRF9FWFRFTlNJT05TID0gYWxsb3dlZEV4dGVuc2lvbnM7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlUGVyc29uYVBhdGgodXNlclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF1c2VyUGF0aCB8fCB0eXBlb2YgdXNlclBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IG51bGwgYnl0ZXNcbiAgICBjb25zdCBjbGVhblBhdGggPSB1c2VyUGF0aC5yZXBsYWNlKC9cXHgwMC9nLCAnJyk7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGFuZCByZXNvbHZlIHBhdGhcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGNsZWFuUGF0aCk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy4uJykgfHwgY2xlYW5QYXRoLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICBsb2dnZXIud2FybignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcsIHsgdXNlclBhdGggfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggdHJhdmVyc2FsIGRldGVjdGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIHBhdGggaXMgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAgICBpZiAodGhpcy5BTExPV0VEX0RJUkVDVE9SSUVTLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gSWYgbm90IGluaXRpYWxpemVkLCBhbGxvdyBwYXRocyB1bmRlciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5J3MgcGVyc29uYXMgZm9sZGVyXG4gICAgICBjb25zdCBkZWZhdWx0QWxsb3dlZCA9IFtcbiAgICAgICAgcGF0aC5yZXNvbHZlKCcuL3BlcnNvbmFzJyksXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5QRVJTT05BU19ESVIgfHwgJy4vcGVyc29uYXMnKVxuICAgICAgXTtcbiAgICAgIGNvbnN0IGlzQWxsb3dlZCA9IGRlZmF1bHRBbGxvd2VkLnNvbWUoYWxsb3dlZERpciA9PiBcbiAgICAgICAgcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgoYWxsb3dlZERpciArIHBhdGguc2VwKSB8fCBcbiAgICAgICAgcmVzb2x2ZWRQYXRoID09PSBhbGxvd2VkRGlyXG4gICAgICApO1xuICAgICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIGFjY2VzcyBkZW5pZWQ6ICR7dXNlclBhdGh9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzQWxsb3dlZCA9IHRoaXMuQUxMT1dFRF9ESVJFQ1RPUklFUy5zb21lKGFsbG93ZWREaXIgPT4gXG4gICAgICAgIHJlc29sdmVkUGF0aC5zdGFydHNXaXRoKGFsbG93ZWREaXIgKyBwYXRoLnNlcCkgfHwgXG4gICAgICAgIHJlc29sdmVkUGF0aCA9PT0gYWxsb3dlZERpclxuICAgICAgKTtcbiAgICAgIFxuICAgICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIGFjY2VzcyBkZW5pZWQ6ICR7dXNlclBhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIGZpbGVuYW1lIGlmIGl0J3MgYSBmaWxlXG4gICAgaWYgKHBhdGguZXh0bmFtZShyZXNvbHZlZFBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoKTtcbiAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlbmFtZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZXh0ZW5zaW9uIGlzIGFsbG93ZWRcbiAgICAgIGlmICghdGhpcy5BTExPV0VEX0VYVEVOU0lPTlMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgZXh0ZW5zaW9uIG5vdCBhbGxvd2VkOiAke2V4dH0uIEFsbG93ZWQ6ICR7dGhpcy5BTExPV0VEX0VYVEVOU0lPTlMuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZmlsZW5hbWUgZm9ybWF0IChhbHBoYW51bWVyaWMsIGRhc2gsIHVuZGVyc2NvcmUsIGRvdClcbiAgICAgIGlmICghL15bYS16QS1aMC05XFwtXy5dKyQvaS50ZXN0KGZpbGVuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmlsZW5hbWUgZm9ybWF0OiAke2ZpbGVuYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNhZmVSZWFkRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2YWxpZGF0ZWRQYXRoID0gYXdhaXQgdGhpcy52YWxpZGF0ZVBlcnNvbmFQYXRoKGZpbGVQYXRoKTtcbiAgICBcbiAgICAvLyBDaGVjayBmaWxlIGV4aXN0cyBhbmQgaXMgbm90IGEgZGlyZWN0b3J5XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHZhbGlkYXRlZFBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggaXMgYSBkaXJlY3RvcnksIG5vdCBhIGZpbGUnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU2l6ZSBjaGVja1xuICAgIGlmIChzdGF0cy5zaXplID4gNTAwMDAwKSB7IC8vIDUwMEtCXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgdG9vIGxhcmdlJyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmcy5yZWFkRmlsZSh2YWxpZGF0ZWRQYXRoLCAndXRmLTgnKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBzYWZlV3JpdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhbGlkYXRlZFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlUGVyc29uYVBhdGgoZmlsZVBhdGgpO1xuICAgIFxuICAgIC8vIENvbnRlbnQgdmFsaWRhdGlvblxuICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDUwMDAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZW50IHRvbyBsYXJnZScpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0cyBiZWZvcmUgYXRvbWljIHdyaXRlXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGguZGlybmFtZSh2YWxpZGF0ZWRQYXRoKTtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBcbiAgICAvLyBXcml0ZSB0byB0ZW1wIGZpbGUgZmlyc3QgKGF0b21pYyB3cml0ZSlcbiAgICBjb25zdCB0ZW1wUGF0aCA9IGAke3ZhbGlkYXRlZFBhdGh9LnRtcGA7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICBcbiAgICAvLyBSZW5hbWUgdG8gZmluYWwgcGF0aCAoYXRvbWljIG9uIG1vc3QgZmlsZXN5c3RlbXMpXG4gICAgYXdhaXQgZnMucmVuYW1lKHRlbXBQYXRoLCB2YWxpZGF0ZWRQYXRoKTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Secure YAML Parser for DollhouseMCP
3
+ *
4
+ * Provides safe YAML parsing that prevents deserialization attacks
5
+ * by using a restricted schema and pre-validation.
6
+ *
7
+ * Security: SEC-003 - YAML parsing vulnerability protection
8
+ */
9
+ import matter from 'gray-matter';
10
+ export interface SecureParseOptions {
11
+ maxYamlSize?: number;
12
+ maxContentSize?: number;
13
+ allowedKeys?: string[];
14
+ validateContent?: boolean;
15
+ }
16
+ export interface ParsedContent {
17
+ data: Record<string, any>;
18
+ content: string;
19
+ excerpt?: string;
20
+ }
21
+ export declare class SecureYamlParser {
22
+ private static readonly DEFAULT_OPTIONS;
23
+ private static readonly SAFE_SCHEMA;
24
+ private static readonly FIELD_VALIDATORS;
25
+ /**
26
+ * Securely parse content with YAML frontmatter
27
+ */
28
+ static parse(input: string, options?: SecureParseOptions): ParsedContent;
29
+ /**
30
+ * Create a secure gray-matter compatible parser
31
+ */
32
+ static createSecureMatterParser(): {
33
+ parse: (input: string) => {
34
+ data: Record<string, any>;
35
+ content: string;
36
+ excerpt: string | undefined;
37
+ orig: string;
38
+ };
39
+ stringify: (content: string, data: any) => string;
40
+ };
41
+ /**
42
+ * Safe wrapper for gray-matter with security validations
43
+ */
44
+ static safeMatter(input: string, options?: matter.GrayMatterOption<string, any>): matter.GrayMatterFile<string>;
45
+ }
46
+ //# sourceMappingURL=secureYamlParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secureYamlParser.d.ts","sourceRoot":"","sources":["../../../src/security/secureYamlParser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAIrC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAwB;IAG3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAatC;IAEF;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,aAAa;IA8G5E;;OAEG;IACH,MAAM,CAAC,wBAAwB;uBAEZ,MAAM;;;;;;6BASA,MAAM,QAAQ,GAAG;;IAoB1C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;CAgChH"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Secure YAML Parser for DollhouseMCP
3
+ *
4
+ * Provides safe YAML parsing that prevents deserialization attacks
5
+ * by using a restricted schema and pre-validation.
6
+ *
7
+ * Security: SEC-003 - YAML parsing vulnerability protection
8
+ */
9
+ import * as yaml from 'js-yaml';
10
+ import matter from 'gray-matter';
11
+ import { SecurityError } from '../errors/SecurityError.js';
12
+ import { ContentValidator } from './contentValidator.js';
13
+ import { SecurityMonitor } from './securityMonitor.js';
14
+ export class SecureYamlParser {
15
+ static DEFAULT_OPTIONS = {
16
+ maxYamlSize: 64 * 1024, // 64KB for YAML
17
+ maxContentSize: 1024 * 1024, // 1MB for content
18
+ validateContent: true
19
+ };
20
+ // Allowed YAML types - using FAILSAFE_SCHEMA as base
21
+ static SAFE_SCHEMA = yaml.FAILSAFE_SCHEMA;
22
+ // Additional validation for specific persona fields
23
+ static FIELD_VALIDATORS = {
24
+ name: (v) => typeof v === 'string' && v.length <= 100,
25
+ description: (v) => typeof v === 'string' && v.length <= 500,
26
+ author: (v) => typeof v === 'string' && v.length <= 100,
27
+ version: (v) => typeof v === 'string' && /^\d+\.\d+(\.\d+)?(-[a-zA-Z0-9.-]+)?$/.test(v),
28
+ category: (v) => typeof v === 'string' && v.length <= 50,
29
+ age_rating: (v) => ['all', '13+', '18+'].includes(v),
30
+ price: (v) => typeof v === 'string' && (v === 'free' || /^\$\d+\.\d{2}$/.test(v)),
31
+ ai_generated: (v) => typeof v === 'boolean' || v === 'true' || v === 'false',
32
+ generation_method: (v) => ['human', 'ChatGPT', 'Claude', 'hybrid'].includes(v),
33
+ created_date: (v) => typeof v === 'string' && !isNaN(Date.parse(v)),
34
+ triggers: (v) => Array.isArray(v) && v.every(t => typeof t === 'string' && t.length <= 50),
35
+ content_flags: (v) => Array.isArray(v) && v.every(f => typeof f === 'string' && f.length <= 50)
36
+ };
37
+ /**
38
+ * Securely parse content with YAML frontmatter
39
+ */
40
+ static parse(input, options = {}) {
41
+ const opts = { ...this.DEFAULT_OPTIONS, ...options };
42
+ // 1. Size validation
43
+ if (input.length > (opts.maxContentSize || this.DEFAULT_OPTIONS.maxContentSize)) {
44
+ throw new SecurityError('Content exceeds maximum allowed size', 'medium');
45
+ }
46
+ // 2. Extract frontmatter boundaries
47
+ const frontmatterMatch = input.match(/^---\n([\s\S]*?)\n---/);
48
+ if (!frontmatterMatch) {
49
+ // No frontmatter, return empty data
50
+ return {
51
+ data: {},
52
+ content: input
53
+ };
54
+ }
55
+ const yamlContent = frontmatterMatch[1];
56
+ const markdownContent = input.substring(frontmatterMatch[0].length);
57
+ // 3. Validate YAML size
58
+ if (yamlContent.length > (opts.maxYamlSize || this.DEFAULT_OPTIONS.maxYamlSize)) {
59
+ throw new SecurityError('YAML frontmatter exceeds maximum allowed size', 'medium');
60
+ }
61
+ // 4. Pre-parse security validation
62
+ if (!ContentValidator.validateYamlContent(yamlContent)) {
63
+ SecurityMonitor.logSecurityEvent({
64
+ type: 'YAML_INJECTION_ATTEMPT',
65
+ severity: 'CRITICAL',
66
+ source: 'secure_yaml_parser',
67
+ details: 'Malicious YAML pattern detected during parsing'
68
+ });
69
+ throw new SecurityError('Malicious YAML content detected', 'critical');
70
+ }
71
+ // 5. Parse with safe schema
72
+ let data;
73
+ try {
74
+ data = yaml.load(yamlContent, {
75
+ schema: this.SAFE_SCHEMA,
76
+ json: false, // Don't allow JSON-specific types
77
+ onWarning: (warning) => {
78
+ SecurityMonitor.logSecurityEvent({
79
+ type: 'YAML_PARSING_WARNING',
80
+ severity: 'LOW',
81
+ source: 'secure_yaml_parser',
82
+ details: `YAML warning: ${warning.message}`
83
+ });
84
+ }
85
+ });
86
+ }
87
+ catch (error) {
88
+ throw new SecurityError(`YAML parsing failed: ${error instanceof Error ? error.message : 'Unknown error'}`, 'high');
89
+ }
90
+ // 6. Ensure data is an object
91
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
92
+ throw new SecurityError('YAML must contain an object at root level', 'medium');
93
+ }
94
+ // 7. Validate allowed keys if specified
95
+ if (opts.allowedKeys) {
96
+ const invalidKeys = Object.keys(data).filter(key => !opts.allowedKeys.includes(key));
97
+ if (invalidKeys.length > 0) {
98
+ throw new SecurityError(`Invalid YAML keys detected: ${invalidKeys.join(', ')}`, 'medium');
99
+ }
100
+ }
101
+ // 8. Validate field types and content
102
+ for (const [key, value] of Object.entries(data)) {
103
+ // Check field-specific validators
104
+ if (this.FIELD_VALIDATORS[key] && !this.FIELD_VALIDATORS[key](value)) {
105
+ throw new SecurityError(`Invalid value for field '${key}'`, 'medium');
106
+ }
107
+ // Validate string fields for injection patterns
108
+ if (typeof value === 'string' && opts.validateContent) {
109
+ const validation = ContentValidator.validateAndSanitize(value);
110
+ if (!validation.isValid && validation.severity === 'critical') {
111
+ throw new SecurityError(`Security threat detected in field '${key}'`, 'critical');
112
+ }
113
+ // Replace with sanitized content
114
+ data[key] = validation.sanitizedContent;
115
+ }
116
+ }
117
+ // 9. Validate markdown content if requested
118
+ let finalContent = markdownContent;
119
+ if (opts.validateContent) {
120
+ const contentValidation = ContentValidator.validateAndSanitize(markdownContent);
121
+ if (!contentValidation.isValid && contentValidation.severity === 'critical') {
122
+ throw new SecurityError('Security threat detected in content', 'critical');
123
+ }
124
+ finalContent = contentValidation.sanitizedContent || markdownContent;
125
+ }
126
+ SecurityMonitor.logSecurityEvent({
127
+ type: 'YAML_PARSE_SUCCESS',
128
+ severity: 'LOW',
129
+ source: 'secure_yaml_parser',
130
+ details: `Successfully parsed YAML with ${Object.keys(data).length} fields`
131
+ });
132
+ return {
133
+ data,
134
+ content: finalContent
135
+ };
136
+ }
137
+ /**
138
+ * Create a secure gray-matter compatible parser
139
+ */
140
+ static createSecureMatterParser() {
141
+ return {
142
+ parse: (input) => {
143
+ const result = this.parse(input);
144
+ return {
145
+ data: result.data,
146
+ content: result.content,
147
+ excerpt: result.excerpt,
148
+ orig: input
149
+ };
150
+ },
151
+ stringify: (content, data) => {
152
+ // Validate data before stringifying
153
+ const validation = ContentValidator.validateMetadata(data);
154
+ if (!validation.isValid) {
155
+ throw new SecurityError('Cannot stringify content with security threats', 'high');
156
+ }
157
+ // Use safe YAML dump
158
+ const yamlStr = yaml.dump(data, {
159
+ schema: this.SAFE_SCHEMA,
160
+ skipInvalid: true,
161
+ noRefs: true,
162
+ noCompatMode: true
163
+ });
164
+ return `---\n${yamlStr}---\n${content}`;
165
+ }
166
+ };
167
+ }
168
+ /**
169
+ * Safe wrapper for gray-matter with security validations
170
+ */
171
+ static safeMatter(input, options) {
172
+ // First, use our secure parser
173
+ const secureParsed = this.parse(input);
174
+ // Then use gray-matter with custom engines
175
+ return matter(input, {
176
+ ...options,
177
+ engines: {
178
+ yaml: {
179
+ parse: (str) => {
180
+ // Use our secure YAML parsing
181
+ const parsed = yaml.load(str, {
182
+ schema: this.SAFE_SCHEMA,
183
+ json: false
184
+ });
185
+ // Ensure it's an object
186
+ if (typeof parsed !== 'object' || parsed === null) {
187
+ return {};
188
+ }
189
+ return parsed;
190
+ },
191
+ stringify: (obj) => {
192
+ return yaml.dump(obj, {
193
+ schema: this.SAFE_SCHEMA,
194
+ skipInvalid: true,
195
+ noRefs: true
196
+ });
197
+ }
198
+ }
199
+ }
200
+ });
201
+ }
202
+ }
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlWWFtbFBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWV2RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLE1BQU0sQ0FBVSxlQUFlLEdBQXVCO1FBQzVELFdBQVcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFPLGdCQUFnQjtRQUM3QyxjQUFjLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRyxrQkFBa0I7UUFDaEQsZUFBZSxFQUFFLElBQUk7S0FDdEIsQ0FBQztJQUVGLHFEQUFxRDtJQUM3QyxNQUFNLENBQVUsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7SUFFM0Qsb0RBQW9EO0lBQzVDLE1BQU0sQ0FBVSxnQkFBZ0IsR0FBNEM7UUFDbEYsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHO1FBQ3JELFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRztRQUM1RCxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUc7UUFDdkQsT0FB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O1lBQ25CLEdBQUcsT0FBTztZQUNWLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUU7b0JBQ0osS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUU7d0JBQ3JCLDhCQUE4Qjt3QkFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7NEJBQzVCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVzs0QkFDeEIsSUFBSSxFQUFFLEtBQUs7eUJBQ1osQ0FBQyxDQUFDO3dCQUNILHdCQUF3Qjt3QkFDeEIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDOzRCQUNsRCxPQUFPLEVBQUUsQ0FBQzt3QkFDWixDQUFDO3dCQUNELE9BQU8sTUFBZ0IsQ0FBQztvQkFDMUIsQ0FBQztvQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTt3QkFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTs0QkFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXOzRCQUN4QixXQUFXLEVBQUUsSUFBSTs0QkFDakIsTUFBTSxFQUFFLElBQUk7eUJBQ2IsQ0FBQyxDQUFDO29CQUNMLENBQUM7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyZSBZQU1MIFBhcnNlciBmb3IgRG9sbGhvdXNlTUNQXG4gKiBcbiAqIFByb3ZpZGVzIHNhZmUgWUFNTCBwYXJzaW5nIHRoYXQgcHJldmVudHMgZGVzZXJpYWxpemF0aW9uIGF0dGFja3NcbiAqIGJ5IHVzaW5nIGEgcmVzdHJpY3RlZCBzY2hlbWEgYW5kIHByZS12YWxpZGF0aW9uLlxuICogXG4gKiBTZWN1cml0eTogU0VDLTAwMyAtIFlBTUwgcGFyc2luZyB2dWxuZXJhYmlsaXR5IHByb3RlY3Rpb25cbiAqL1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IG1hdHRlciBmcm9tICdncmF5LW1hdHRlcic7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL1NlY3VyaXR5RXJyb3IuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4vY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuL3NlY3VyaXR5TW9uaXRvci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJlUGFyc2VPcHRpb25zIHtcbiAgbWF4WWFtbFNpemU/OiBudW1iZXI7XG4gIG1heENvbnRlbnRTaXplPzogbnVtYmVyO1xuICBhbGxvd2VkS2V5cz86IHN0cmluZ1tdO1xuICB2YWxpZGF0ZUNvbnRlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZENvbnRlbnQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGV4Y2VycHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWN1cmVZYW1sUGFyc2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9PUFRJT05TOiBTZWN1cmVQYXJzZU9wdGlvbnMgPSB7XG4gICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgICAgICAvLyA2NEtCIGZvciBZQU1MXG4gICAgbWF4Q29udGVudFNpemU6IDEwMjQgKiAxMDI0LCAgLy8gMU1CIGZvciBjb250ZW50XG4gICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gIH07XG5cbiAgLy8gQWxsb3dlZCBZQU1MIHR5cGVzIC0gdXNpbmcgRkFJTFNBRkVfU0NIRU1BIGFzIGJhc2VcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0FGRV9TQ0hFTUEgPSB5YW1sLkZBSUxTQUZFX1NDSEVNQTtcblxuICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIHNwZWNpZmljIHBlcnNvbmEgZmllbGRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZJRUxEX1ZBTElEQVRPUlM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBib29sZWFuPiA9IHtcbiAgICBuYW1lOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoIDw9IDEwMCxcbiAgICBkZXNjcmlwdGlvbjogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA8PSA1MDAsXG4gICAgYXV0aG9yOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoIDw9IDEwMCxcbiAgICB2ZXJzaW9uOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIC9eXFxkK1xcLlxcZCsoXFwuXFxkKyk/KC1bYS16QS1aMC05Li1dKyk/JC8udGVzdCh2KSxcbiAgICBjYXRlZ29yeTogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA8PSA1MCxcbiAgICBhZ2VfcmF0aW5nOiAodikgPT4gWydhbGwnLCAnMTMrJywgJzE4KyddLmluY2x1ZGVzKHYpLFxuICAgIHByaWNlOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmICh2ID09PSAnZnJlZScgfHwgL15cXCRcXGQrXFwuXFxkezJ9JC8udGVzdCh2KSksXG4gICAgYWlfZ2VuZXJhdGVkOiAodikgPT4gdHlwZW9mIHYgPT09ICdib29sZWFuJyB8fCB2ID09PSAndHJ1ZScgfHwgdiA9PT0gJ2ZhbHNlJyxcbiAgICBnZW5lcmF0aW9uX21ldGhvZDogKHYpID0+IFsnaHVtYW4nLCAnQ2hhdEdQVCcsICdDbGF1ZGUnLCAnaHlicmlkJ10uaW5jbHVkZXModiksXG4gICAgY3JlYXRlZF9kYXRlOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmICFpc05hTihEYXRlLnBhcnNlKHYpKSxcbiAgICB0cmlnZ2VyczogKHYpID0+IEFycmF5LmlzQXJyYXkodikgJiYgdi5ldmVyeSh0ID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyAmJiB0Lmxlbmd0aCA8PSA1MCksXG4gICAgY29udGVudF9mbGFnczogKHYpID0+IEFycmF5LmlzQXJyYXkodikgJiYgdi5ldmVyeShmID0+IHR5cGVvZiBmID09PSAnc3RyaW5nJyAmJiBmLmxlbmd0aCA8PSA1MClcbiAgfTtcblxuICAvKipcbiAgICogU2VjdXJlbHkgcGFyc2UgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICovXG4gIHN0YXRpYyBwYXJzZShpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBTZWN1cmVQYXJzZU9wdGlvbnMgPSB7fSk6IFBhcnNlZENvbnRlbnQge1xuICAgIGNvbnN0IG9wdHMgPSB7IC4uLnRoaXMuREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XG5cbiAgICAvLyAxLiBTaXplIHZhbGlkYXRpb25cbiAgICBpZiAoaW5wdXQubGVuZ3RoID4gKG9wdHMubWF4Q29udGVudFNpemUgfHwgdGhpcy5ERUZBVUxUX09QVElPTlMubWF4Q29udGVudFNpemUhKSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ0NvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgc2l6ZScsICdtZWRpdW0nKTtcbiAgICB9XG5cbiAgICAvLyAyLiBFeHRyYWN0IGZyb250bWF0dGVyIGJvdW5kYXJpZXNcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gaW5wdXQubWF0Y2goL14tLS1cXG4oW1xcc1xcU10qPylcXG4tLS0vKTtcbiAgICBpZiAoIWZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIC8vIE5vIGZyb250bWF0dGVyLCByZXR1cm4gZW1wdHkgZGF0YVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGNvbnRlbnQ6IGlucHV0XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0gZnJvbnRtYXR0ZXJNYXRjaFsxXTtcbiAgICBjb25zdCBtYXJrZG93bkNvbnRlbnQgPSBpbnB1dC5zdWJzdHJpbmcoZnJvbnRtYXR0ZXJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgLy8gMy4gVmFsaWRhdGUgWUFNTCBzaXplXG4gICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA+IChvcHRzLm1heFlhbWxTaXplIHx8IHRoaXMuREVGQVVMVF9PUFRJT05TLm1heFlhbWxTaXplISkpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdZQU1MIGZyb250bWF0dGVyIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemUnLCAnbWVkaXVtJyk7XG4gICAgfVxuXG4gICAgLy8gNC4gUHJlLXBhcnNlIHNlY3VyaXR5IHZhbGlkYXRpb25cbiAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnc2VjdXJlX3lhbWxfcGFyc2VyJyxcbiAgICAgICAgZGV0YWlsczogJ01hbGljaW91cyBZQU1MIHBhdHRlcm4gZGV0ZWN0ZWQgZHVyaW5nIHBhcnNpbmcnXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdNYWxpY2lvdXMgWUFNTCBjb250ZW50IGRldGVjdGVkJywgJ2NyaXRpY2FsJyk7XG4gICAgfVxuXG4gICAgLy8gNS4gUGFyc2Ugd2l0aCBzYWZlIHNjaGVtYVxuICAgIGxldCBkYXRhOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQsIHtcbiAgICAgICAgc2NoZW1hOiB0aGlzLlNBRkVfU0NIRU1BLFxuICAgICAgICBqc29uOiBmYWxzZSwgIC8vIERvbid0IGFsbG93IEpTT04tc3BlY2lmaWMgdHlwZXNcbiAgICAgICAgb25XYXJuaW5nOiAod2FybmluZykgPT4ge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX1BBUlNJTkdfV0FSTklORycsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdzZWN1cmVfeWFtbF9wYXJzZXInLFxuICAgICAgICAgICAgZGV0YWlsczogYFlBTUwgd2FybmluZzogJHt3YXJuaW5nLm1lc3NhZ2V9YFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoYFlBTUwgcGFyc2luZyBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCwgJ2hpZ2gnKTtcbiAgICB9XG5cbiAgICAvLyA2LiBFbnN1cmUgZGF0YSBpcyBhbiBvYmplY3RcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IGRhdGEgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ1lBTUwgbXVzdCBjb250YWluIGFuIG9iamVjdCBhdCByb290IGxldmVsJywgJ21lZGl1bScpO1xuICAgIH1cblxuICAgIC8vIDcuIFZhbGlkYXRlIGFsbG93ZWQga2V5cyBpZiBzcGVjaWZpZWRcbiAgICBpZiAob3B0cy5hbGxvd2VkS2V5cykge1xuICAgICAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhkYXRhKS5maWx0ZXIoa2V5ID0+ICFvcHRzLmFsbG93ZWRLZXlzIS5pbmNsdWRlcyhrZXkpKTtcbiAgICAgIGlmIChpbnZhbGlkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKGBJbnZhbGlkIFlBTUwga2V5cyBkZXRlY3RlZDogJHtpbnZhbGlkS2V5cy5qb2luKCcsICcpfWAsICdtZWRpdW0nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA4LiBWYWxpZGF0ZSBmaWVsZCB0eXBlcyBhbmQgY29udGVudFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAvLyBDaGVjayBmaWVsZC1zcGVjaWZpYyB2YWxpZGF0b3JzXG4gICAgICBpZiAodGhpcy5GSUVMRF9WQUxJREFUT1JTW2tleV0gJiYgIXRoaXMuRklFTERfVkFMSURBVE9SU1trZXldKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgSW52YWxpZCB2YWx1ZSBmb3IgZmllbGQgJyR7a2V5fSdgLCAnbWVkaXVtJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHN0cmluZyBmaWVsZHMgZm9yIGluamVjdGlvbiBwYXR0ZXJuc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgb3B0cy52YWxpZGF0ZUNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSk7XG4gICAgICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkICYmIHZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIGZpZWxkICcke2tleX0nYCwgJ2NyaXRpY2FsJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVwbGFjZSB3aXRoIHNhbml0aXplZCBjb250ZW50XG4gICAgICAgIGRhdGFba2V5XSA9IHZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA5LiBWYWxpZGF0ZSBtYXJrZG93biBjb250ZW50IGlmIHJlcXVlc3RlZFxuICAgIGxldCBmaW5hbENvbnRlbnQgPSBtYXJrZG93bkNvbnRlbnQ7XG4gICAgaWYgKG9wdHMudmFsaWRhdGVDb250ZW50KSB7XG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShtYXJrZG93bkNvbnRlbnQpO1xuICAgICAgaWYgKCFjb250ZW50VmFsaWRhdGlvbi5pc1ZhbGlkICYmIGNvbnRlbnRWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdTZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gY29udGVudCcsICdjcml0aWNhbCcpO1xuICAgICAgfVxuICAgICAgZmluYWxDb250ZW50ID0gY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCBtYXJrZG93bkNvbnRlbnQ7XG4gICAgfVxuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1lBTUxfUEFSU0VfU1VDQ0VTUycsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdzZWN1cmVfeWFtbF9wYXJzZXInLFxuICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBwYXJzZWQgWUFNTCB3aXRoICR7T2JqZWN0LmtleXMoZGF0YSkubGVuZ3RofSBmaWVsZHNgXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YSxcbiAgICAgIGNvbnRlbnQ6IGZpbmFsQ29udGVudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2VjdXJlIGdyYXktbWF0dGVyIGNvbXBhdGlibGUgcGFyc2VyXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlU2VjdXJlTWF0dGVyUGFyc2VyKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJzZTogKGlucHV0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZShpbnB1dCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEsXG4gICAgICAgICAgY29udGVudDogcmVzdWx0LmNvbnRlbnQsXG4gICAgICAgICAgZXhjZXJwdDogcmVzdWx0LmV4Y2VycHQsXG4gICAgICAgICAgb3JpZzogaW5wdXRcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBzdHJpbmdpZnk6IChjb250ZW50OiBzdHJpbmcsIGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBWYWxpZGF0ZSBkYXRhIGJlZm9yZSBzdHJpbmdpZnlpbmdcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShkYXRhKTtcbiAgICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignQ2Fubm90IHN0cmluZ2lmeSBjb250ZW50IHdpdGggc2VjdXJpdHkgdGhyZWF0cycsICdoaWdoJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2Ugc2FmZSBZQU1MIGR1bXBcbiAgICAgICAgY29uc3QgeWFtbFN0ciA9IHlhbWwuZHVtcChkYXRhLCB7XG4gICAgICAgICAgc2NoZW1hOiB0aGlzLlNBRkVfU0NIRU1BLFxuICAgICAgICAgIHNraXBJbnZhbGlkOiB0cnVlLFxuICAgICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgICAgICBub0NvbXBhdE1vZGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGAtLS1cXG4ke3lhbWxTdHJ9LS0tXFxuJHtjb250ZW50fWA7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlIHdyYXBwZXIgZm9yIGdyYXktbWF0dGVyIHdpdGggc2VjdXJpdHkgdmFsaWRhdGlvbnNcbiAgICovXG4gIHN0YXRpYyBzYWZlTWF0dGVyKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM/OiBtYXR0ZXIuR3JheU1hdHRlck9wdGlvbjxzdHJpbmcsIGFueT4pOiBtYXR0ZXIuR3JheU1hdHRlckZpbGU8c3RyaW5nPiB7XG4gICAgLy8gRmlyc3QsIHVzZSBvdXIgc2VjdXJlIHBhcnNlclxuICAgIGNvbnN0IHNlY3VyZVBhcnNlZCA9IHRoaXMucGFyc2UoaW5wdXQpO1xuXG4gICAgLy8gVGhlbiB1c2UgZ3JheS1tYXR0ZXIgd2l0aCBjdXN0b20gZW5naW5lc1xuICAgIHJldHVybiBtYXR0ZXIoaW5wdXQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBlbmdpbmVzOiB7XG4gICAgICAgIHlhbWw6IHtcbiAgICAgICAgICBwYXJzZTogKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2Ugb3VyIHNlY3VyZSBZQU1MIHBhcnNpbmdcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZChzdHIsIHtcbiAgICAgICAgICAgICAgc2NoZW1hOiB0aGlzLlNBRkVfU0NIRU1BLFxuICAgICAgICAgICAgICBqc29uOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBFbnN1cmUgaXQncyBhbiBvYmplY3RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBwYXJzZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZCBhcyBvYmplY3Q7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJpbmdpZnk6IChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHlhbWwuZHVtcChvYmosIHtcbiAgICAgICAgICAgICAgc2NoZW1hOiB0aGlzLlNBRkVfU0NIRU1BLFxuICAgICAgICAgICAgICBza2lwSW52YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbm9SZWZzOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,58 @@
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
+ export interface SecurityEvent {
8
+ type: 'CONTENT_INJECTION_ATTEMPT' | 'YAML_INJECTION_ATTEMPT' | 'PATH_TRAVERSAL_ATTEMPT' | 'TOKEN_VALIDATION_FAILURE' | 'UPDATE_SECURITY_VIOLATION' | 'RATE_LIMIT_EXCEEDED' | 'YAML_PARSING_WARNING' | 'YAML_PARSE_SUCCESS' | 'TOKEN_VALIDATION_SUCCESS' | 'RATE_LIMIT_WARNING' | 'TOKEN_CACHE_CLEARED';
9
+ severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
10
+ source: string;
11
+ details: string;
12
+ userAgent?: string;
13
+ ip?: string;
14
+ additionalData?: Record<string, any>;
15
+ }
16
+ export interface SecurityLogEntry extends SecurityEvent {
17
+ timestamp: string;
18
+ id: string;
19
+ }
20
+ export declare class SecurityMonitor {
21
+ private static eventCount;
22
+ private static readonly events;
23
+ private static readonly MAX_EVENTS;
24
+ /**
25
+ * Logs a security event
26
+ */
27
+ static logSecurityEvent(event: SecurityEvent): void;
28
+ /**
29
+ * Sends security alerts for critical events
30
+ */
31
+ private static sendSecurityAlert;
32
+ /**
33
+ * Gets recent security events for analysis
34
+ */
35
+ static getRecentEvents(count?: number): SecurityLogEntry[];
36
+ /**
37
+ * Gets events by severity
38
+ */
39
+ static getEventsBySeverity(severity: SecurityEvent['severity']): SecurityLogEntry[];
40
+ /**
41
+ * Gets events by type
42
+ */
43
+ static getEventsByType(type: SecurityEvent['type']): SecurityLogEntry[];
44
+ /**
45
+ * Generates a security report
46
+ */
47
+ static generateSecurityReport(): {
48
+ totalEvents: number;
49
+ eventsBySeverity: Record<string, number>;
50
+ eventsByType: Record<string, number>;
51
+ recentCriticalEvents: SecurityLogEntry[];
52
+ };
53
+ /**
54
+ * Clears old events (for memory management)
55
+ */
56
+ static clearOldEvents(daysToKeep?: number): void;
57
+ }
58
+ //# sourceMappingURL=securityMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"securityMonitor.d.ts","sourceRoot":"","sources":["../../../src/security/securityMonitor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,2BAA2B,GAAG,wBAAwB,GAAG,wBAAwB,GACjF,0BAA0B,GAAG,2BAA2B,GAAG,qBAAqB,GAChF,sBAAsB,GAAG,oBAAoB,GAAG,0BAA0B,GAC1E,oBAAoB,GAAG,qBAAqB,CAAC;IACnD,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,UAAU,CAAK;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAE1C;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAsBnD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAsBhC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,KAAK,GAAE,MAAY,GAAG,gBAAgB,EAAE;IAI/D;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,gBAAgB,EAAE;IAInF;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,gBAAgB,EAAE;IAIvE;;OAEG;IACH,MAAM,CAAC,sBAAsB,IAAI;QAC/B,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;KAC1C;IAuBD;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,UAAU,GAAE,MAAU,GAAG,IAAI;CAUpD"}
@@ -0,0 +1,108 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlNb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQW9CNUMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDdEIsTUFBTSxDQUFVLE1BQU0sR0FBdUIsRUFBRSxDQUFDO0lBQ2hELE1BQU0sQ0FBVSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsa0NBQWtDO0lBRTdFOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQW9CO1FBQzFDLE1BQU0sUUFBUSxHQUFxQjtZQUNqQyxHQUFHLEtBQUs7WUFDUixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtTQUM3QyxDQUFDO1FBRUYsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELHNGQUFzRjtRQUN0RixvRUFBb0U7UUFDcEUsbURBQW1EO1FBRW5ELElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUF1QjtRQUN0RCwwREFBMEQ7UUFDMUQsbUJBQW1CO1FBQ25CLGlCQUFpQjtRQUNqQixjQUFjO1FBQ2QsNkRBQTZEO1FBRTdELG9EQUFvRDtRQUNwRCw2RUFBNkU7UUFDN0UsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRTtZQUM1QyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7U0FDYixDQUFDLENBQUM7UUFFSCwrREFBK0Q7UUFDL0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3JELDBDQUEwQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFnQixHQUFHO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBbUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUEyQjtRQUNoRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsc0JBQXNCO1FBTTNCLE1BQU0sZ0JBQWdCLEdBQTJCO1lBQy9DLFFBQVEsRUFBRSxDQUFDO1lBQ1gsSUFBSSxFQUFFLENBQUM7WUFDUCxNQUFNLEVBQUUsQ0FBQztZQUNULEdBQUcsRUFBRSxDQUFDO1NBQ1AsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUEyQixFQUFFLENBQUM7UUFFaEQsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbkMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUMvQixnQkFBZ0I7WUFDaEIsWUFBWTtZQUNaLG9CQUFvQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEUsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBcUIsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLENBQUM7UUFDakYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyaXR5IE1vbml0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBDZW50cmFsaXplZCBzZWN1cml0eSBldmVudCBsb2dnaW5nIGFuZCBtb25pdG9yaW5nIHN5c3RlbVxuICogZm9yIHRyYWNraW5nIGFuZCBhbGVydGluZyBvbiBzZWN1cml0eS1yZWxhdGVkIGV2ZW50cy5cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5RXZlbnQge1xuICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcgfCAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcgfCAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcgfCBcbiAgICAgICAgJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScgfCAnVVBEQVRFX1NFQ1VSSVRZX1ZJT0xBVElPTicgfCAnUkFURV9MSU1JVF9FWENFRURFRCcgfFxuICAgICAgICAnWUFNTF9QQVJTSU5HX1dBUk5JTkcnIHwgJ1lBTUxfUEFSU0VfU1VDQ0VTUycgfCAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyB8XG4gICAgICAgICdSQVRFX0xJTUlUX1dBUk5JTkcnIHwgJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnO1xuICBzZXZlcml0eTogJ0xPVycgfCAnTUVESVVNJyB8ICdISUdIJyB8ICdDUklUSUNBTCc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICBkZXRhaWxzOiBzdHJpbmc7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgaXA/OiBzdHJpbmc7XG4gIGFkZGl0aW9uYWxEYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eUxvZ0VudHJ5IGV4dGVuZHMgU2VjdXJpdHlFdmVudCB7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlNb25pdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZXZlbnRDb3VudCA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGV2ZW50czogU2VjdXJpdHlMb2dFbnRyeVtdID0gW107XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9FVkVOVFMgPSAxMDAwOyAvLyBLZWVwIGxhc3QgMTAwMCBldmVudHMgaW4gbWVtb3J5XG5cbiAgLyoqXG4gICAqIExvZ3MgYSBzZWN1cml0eSBldmVudFxuICAgKi9cbiAgc3RhdGljIGxvZ1NlY3VyaXR5RXZlbnQoZXZlbnQ6IFNlY3VyaXR5RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeTogU2VjdXJpdHlMb2dFbnRyeSA9IHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBpZDogYFNFQy0ke0RhdGUubm93KCl9LSR7Kyt0aGlzLmV2ZW50Q291bnR9YCxcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW4gbWVtb3J5IChjaXJjdWxhciBidWZmZXIpXG4gICAgdGhpcy5ldmVudHMucHVzaChsb2dFbnRyeSk7XG4gICAgaWYgKHRoaXMuZXZlbnRzLmxlbmd0aCA+IHRoaXMuTUFYX0VWRU5UUykge1xuICAgICAgdGhpcy5ldmVudHMuc2hpZnQoKTtcbiAgICB9XG5cbiAgICAvLyBJbiBNQ1Agc2VydmVycywgd2UgY2Fubm90IHdyaXRlIHRvIHN0ZGVyci9zdGRvdXQgYXMgaXQgYnJlYWtzIHRoZSBKU09OLVJQQyBwcm90b2NvbFxuICAgIC8vIFNlY3VyaXR5IGV2ZW50cyBhcmUgc3RvcmVkIGluIG1lbW9yeSBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgQVBJXG4gICAgLy8gT25seSBzZW5kIGNyaXRpY2FsIGFsZXJ0cyB2aWEgdGhlIHByb3BlciBjaGFubmVsXG4gICAgXG4gICAgaWYgKGV2ZW50LnNldmVyaXR5ID09PSAnQ1JJVElDQUwnKSB7XG4gICAgICB0aGlzLnNlbmRTZWN1cml0eUFsZXJ0KGxvZ0VudHJ5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgc2VjdXJpdHkgYWxlcnRzIGZvciBjcml0aWNhbCBldmVudHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNlbmRTZWN1cml0eUFsZXJ0KGV2ZW50OiBTZWN1cml0eUxvZ0VudHJ5KTogdm9pZCB7XG4gICAgLy8gSW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LCB0aGlzIHdvdWxkIGludGVncmF0ZSB3aXRoOlxuICAgIC8vIC0gU2xhY2sgd2ViaG9va3NcbiAgICAvLyAtIEVtYWlsIGFsZXJ0c1xuICAgIC8vIC0gUGFnZXJEdXR5XG4gICAgLy8gLSBTZWN1cml0eSBJbmZvcm1hdGlvbiBhbmQgRXZlbnQgTWFuYWdlbWVudCAoU0lFTSkgc3lzdGVtc1xuICAgIFxuICAgIC8vIExvZyBjcml0aWNhbCBzZWN1cml0eSBhbGVydHMgd2l0aCBzdHJ1Y3R1cmVkIGRhdGFcbiAgICAvLyBETyBOT1QgdXNlIGNvbnNvbGUuZXJyb3IgaW4gTUNQIHNlcnZlcnMgYXMgaXQgYnJlYWtzIHRoZSBKU09OLVJQQyBwcm90b2NvbFxuICAgIGxvZ2dlci5lcnJvcign8J+aqCBDUklUSUNBTCBTRUNVUklUWSBBTEVSVCDwn5qoJywge1xuICAgICAgdHlwZTogZXZlbnQudHlwZSxcbiAgICAgIGRldGFpbHM6IGV2ZW50LmRldGFpbHMsXG4gICAgICB0aW1lc3RhbXA6IGV2ZW50LnRpbWVzdGFtcCxcbiAgICAgIGlkOiBldmVudC5pZFxuICAgIH0pO1xuICAgIFxuICAgIC8vIElmIGluIHByb2R1Y3Rpb24gbW9kZSB3aXRoIHByb3BlciBjb25maWcsIHNlbmQgYWN0dWFsIGFsZXJ0c1xuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfU0VDVVJJVFlfQUxFUlRTID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIFRPRE86IEltcGxlbWVudCBhY3R1YWwgYWxlcnQgbWVjaGFuaXNtc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHJlY2VudCBzZWN1cml0eSBldmVudHMgZm9yIGFuYWx5c2lzXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVjZW50RXZlbnRzKGNvdW50OiBudW1iZXIgPSAxMDApOiBTZWN1cml0eUxvZ0VudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5zbGljZSgtY291bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXZlbnRzIGJ5IHNldmVyaXR5XG4gICAqL1xuICBzdGF0aWMgZ2V0RXZlbnRzQnlTZXZlcml0eShzZXZlcml0eTogU2VjdXJpdHlFdmVudFsnc2V2ZXJpdHknXSk6IFNlY3VyaXR5TG9nRW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLmZpbHRlcihldmVudCA9PiBldmVudC5zZXZlcml0eSA9PT0gc2V2ZXJpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXZlbnRzIGJ5IHR5cGVcbiAgICovXG4gIHN0YXRpYyBnZXRFdmVudHNCeVR5cGUodHlwZTogU2VjdXJpdHlFdmVudFsndHlwZSddKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMuZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnR5cGUgPT09IHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHNlY3VyaXR5IHJlcG9ydFxuICAgKi9cbiAgc3RhdGljIGdlbmVyYXRlU2VjdXJpdHlSZXBvcnQoKToge1xuICAgIHRvdGFsRXZlbnRzOiBudW1iZXI7XG4gICAgZXZlbnRzQnlTZXZlcml0eTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICBldmVudHNCeVR5cGU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgcmVjZW50Q3JpdGljYWxFdmVudHM6IFNlY3VyaXR5TG9nRW50cnlbXTtcbiAgfSB7XG4gICAgY29uc3QgZXZlbnRzQnlTZXZlcml0eTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgIENSSVRJQ0FMOiAwLFxuICAgICAgSElHSDogMCxcbiAgICAgIE1FRElVTTogMCxcbiAgICAgIExPVzogMCxcbiAgICB9O1xuXG4gICAgY29uc3QgZXZlbnRzQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHRoaXMuZXZlbnRzKSB7XG4gICAgICBldmVudHNCeVNldmVyaXR5W2V2ZW50LnNldmVyaXR5XSsrO1xuICAgICAgZXZlbnRzQnlUeXBlW2V2ZW50LnR5cGVdID0gKGV2ZW50c0J5VHlwZVtldmVudC50eXBlXSB8fCAwKSArIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsRXZlbnRzOiB0aGlzLmV2ZW50cy5sZW5ndGgsXG4gICAgICBldmVudHNCeVNldmVyaXR5LFxuICAgICAgZXZlbnRzQnlUeXBlLFxuICAgICAgcmVjZW50Q3JpdGljYWxFdmVudHM6IHRoaXMuZ2V0RXZlbnRzQnlTZXZlcml0eSgnQ1JJVElDQUwnKS5zbGljZSgtMTApLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIG9sZCBldmVudHMgKGZvciBtZW1vcnkgbWFuYWdlbWVudClcbiAgICovXG4gIHN0YXRpYyBjbGVhck9sZEV2ZW50cyhkYXlzVG9LZWVwOiBudW1iZXIgPSA3KTogdm9pZCB7XG4gICAgY29uc3QgY3V0b2ZmRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY3V0b2ZmRGF0ZS5zZXREYXRlKGN1dG9mZkRhdGUuZ2V0RGF0ZSgpIC0gZGF5c1RvS2VlcCk7XG4gICAgY29uc3QgY3V0b2ZmVGltZXN0YW1wID0gY3V0b2ZmRGF0ZS50b0lTT1N0cmluZygpO1xuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmV2ZW50cy5maW5kSW5kZXgoZXZlbnQgPT4gZXZlbnQudGltZXN0YW1wID49IGN1dG9mZlRpbWVzdGFtcCk7XG4gICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIGluZGV4KTtcbiAgICB9XG4gIH1cbn0iXX0=