@dollhousemcp/mcp-server 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (667) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +49 -6
  3. package/dist/collection/MarketplaceBrowser.d.ts +24 -0
  4. package/dist/collection/MarketplaceBrowser.d.ts.map +1 -0
  5. package/dist/collection/MarketplaceBrowser.js +115 -0
  6. package/dist/collection/MarketplaceSearch.d.ts +18 -0
  7. package/dist/collection/MarketplaceSearch.d.ts.map +1 -0
  8. package/dist/collection/MarketplaceSearch.js +48 -0
  9. package/dist/collection/PersonaInstaller.d.ts +26 -0
  10. package/dist/collection/PersonaInstaller.d.ts.map +1 -0
  11. package/dist/collection/PersonaInstaller.js +103 -0
  12. package/dist/elements/ensembles/Ensemble.d.ts +144 -0
  13. package/dist/elements/ensembles/Ensemble.d.ts.map +1 -0
  14. package/dist/elements/ensembles/Ensemble.js +860 -0
  15. package/dist/elements/ensembles/EnsembleManager.d.ts +85 -0
  16. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -0
  17. package/dist/elements/ensembles/EnsembleManager.js +378 -0
  18. package/dist/elements/ensembles/constants.d.ts +73 -0
  19. package/dist/elements/ensembles/constants.d.ts.map +1 -0
  20. package/dist/elements/ensembles/constants.js +92 -0
  21. package/dist/elements/ensembles/index.d.ts +8 -0
  22. package/dist/elements/ensembles/index.d.ts.map +1 -0
  23. package/dist/elements/ensembles/index.js +8 -0
  24. package/dist/elements/ensembles/types.d.ts +92 -0
  25. package/dist/elements/ensembles/types.d.ts.map +1 -0
  26. package/dist/elements/ensembles/types.js +8 -0
  27. package/dist/elements/memories/Memory.d.ts +110 -0
  28. package/dist/elements/memories/Memory.d.ts.map +1 -0
  29. package/dist/elements/memories/Memory.js +470 -0
  30. package/dist/elements/memories/MemoryManager.d.ts +86 -0
  31. package/dist/elements/memories/MemoryManager.d.ts.map +1 -0
  32. package/dist/elements/memories/MemoryManager.js +435 -0
  33. package/dist/elements/memories/constants.d.ts +42 -0
  34. package/dist/elements/memories/constants.d.ts.map +1 -0
  35. package/dist/elements/memories/constants.js +49 -0
  36. package/dist/elements/memories/index.d.ts +6 -0
  37. package/dist/elements/memories/index.d.ts.map +1 -0
  38. package/dist/elements/memories/index.js +6 -0
  39. package/dist/generated/version.d.ts +2 -2
  40. package/dist/generated/version.js +3 -3
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +71 -10
  44. package/dist/marketplace/GitHubClient.d.ts +22 -0
  45. package/dist/marketplace/GitHubClient.d.ts.map +1 -0
  46. package/dist/marketplace/GitHubClient.js +112 -0
  47. package/dist/marketplace/MarketplaceBrowser.d.ts +24 -0
  48. package/dist/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  49. package/dist/marketplace/MarketplaceBrowser.js +115 -0
  50. package/dist/marketplace/MarketplaceSearch.d.ts +18 -0
  51. package/dist/marketplace/MarketplaceSearch.d.ts.map +1 -0
  52. package/dist/marketplace/MarketplaceSearch.js +48 -0
  53. package/dist/marketplace/PersonaDetails.d.ts +22 -0
  54. package/dist/marketplace/PersonaDetails.d.ts.map +1 -0
  55. package/dist/marketplace/PersonaDetails.js +71 -0
  56. package/dist/marketplace/PersonaInstaller.d.ts +25 -0
  57. package/dist/marketplace/PersonaInstaller.d.ts.map +1 -0
  58. package/dist/marketplace/PersonaInstaller.js +100 -0
  59. package/dist/marketplace/PersonaSubmitter.d.ts +19 -0
  60. package/dist/marketplace/PersonaSubmitter.d.ts.map +1 -0
  61. package/dist/marketplace/PersonaSubmitter.js +57 -0
  62. package/dist/marketplace/index.d.ts +10 -0
  63. package/dist/marketplace/index.d.ts.map +1 -0
  64. package/dist/marketplace/index.js +10 -0
  65. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  66. package/dist/portfolio/DefaultElementProvider.js +8 -20
  67. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  68. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  69. package/dist/portfolio/PortfolioManager.js +78 -2
  70. package/dist/portfolio/types.d.ts +6 -6
  71. package/dist/portfolio/types.d.ts.map +1 -1
  72. package/dist/portfolio/types.js +7 -7
  73. package/dist/security/securityMonitor.d.ts +1 -1
  74. package/dist/security/securityMonitor.d.ts.map +1 -1
  75. package/dist/security/securityMonitor.js +1 -1
  76. package/dist/server/tools/MarketplaceTools.d.ts +10 -0
  77. package/dist/server/tools/MarketplaceTools.d.ts.map +1 -0
  78. package/dist/server/tools/MarketplaceTools.js +96 -0
  79. package/dist/src/cache/APICache.d.ts +23 -0
  80. package/dist/src/cache/APICache.d.ts.map +1 -0
  81. package/dist/src/cache/APICache.js +42 -0
  82. package/dist/src/cache/index.d.ts +5 -0
  83. package/dist/src/cache/index.d.ts.map +1 -0
  84. package/dist/src/cache/index.js +5 -0
  85. package/dist/src/config/constants.d.ts +25 -0
  86. package/dist/src/config/constants.d.ts.map +1 -0
  87. package/dist/src/config/constants.js +30 -0
  88. package/dist/src/config/index.d.ts +6 -0
  89. package/dist/src/config/index.d.ts.map +1 -0
  90. package/dist/src/config/index.js +6 -0
  91. package/dist/src/config/indicator-config.d.ts +107 -0
  92. package/dist/src/config/indicator-config.d.ts.map +1 -0
  93. package/dist/src/config/indicator-config.js +158 -0
  94. package/dist/src/constants/defaultPersonas.d.ts +10 -0
  95. package/dist/src/constants/defaultPersonas.d.ts.map +1 -0
  96. package/dist/src/constants/defaultPersonas.js +18 -0
  97. package/dist/src/constants/limits.d.ts +10 -0
  98. package/dist/src/constants/limits.d.ts.map +1 -0
  99. package/dist/src/constants/limits.js +13 -0
  100. package/dist/src/errors/SecurityError.d.ts +29 -0
  101. package/dist/src/errors/SecurityError.d.ts.map +1 -0
  102. package/dist/src/errors/SecurityError.js +47 -0
  103. package/dist/src/errors/index.d.ts +2 -0
  104. package/dist/src/errors/index.d.ts.map +1 -0
  105. package/dist/src/errors/index.js +2 -0
  106. package/dist/src/index.barrel.d.ts +21 -0
  107. package/dist/src/index.barrel.d.ts.map +1 -0
  108. package/dist/src/index.barrel.js +31 -0
  109. package/dist/src/index.d.ts +220 -0
  110. package/dist/src/index.d.ts.map +1 -0
  111. package/dist/src/index.js +1559 -0
  112. package/dist/src/marketplace/GitHubClient.d.ts +22 -0
  113. package/dist/src/marketplace/GitHubClient.d.ts.map +1 -0
  114. package/dist/src/marketplace/GitHubClient.js +112 -0
  115. package/dist/src/marketplace/MarketplaceBrowser.d.ts +21 -0
  116. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  117. package/dist/src/marketplace/MarketplaceBrowser.js +45 -0
  118. package/dist/src/marketplace/MarketplaceSearch.d.ts +18 -0
  119. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
  120. package/dist/src/marketplace/MarketplaceSearch.js +36 -0
  121. package/dist/src/marketplace/PersonaDetails.d.ts +22 -0
  122. package/dist/src/marketplace/PersonaDetails.d.ts.map +1 -0
  123. package/dist/src/marketplace/PersonaDetails.js +71 -0
  124. package/dist/src/marketplace/PersonaInstaller.d.ts +25 -0
  125. package/dist/src/marketplace/PersonaInstaller.d.ts.map +1 -0
  126. package/dist/src/marketplace/PersonaInstaller.js +100 -0
  127. package/dist/src/marketplace/PersonaSubmitter.d.ts +19 -0
  128. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
  129. package/dist/src/marketplace/PersonaSubmitter.js +57 -0
  130. package/dist/src/marketplace/index.d.ts +10 -0
  131. package/dist/src/marketplace/index.d.ts.map +1 -0
  132. package/dist/src/marketplace/index.js +10 -0
  133. package/dist/src/persona/PersonaLoader.d.ts +33 -0
  134. package/dist/src/persona/PersonaLoader.d.ts.map +1 -0
  135. package/dist/src/persona/PersonaLoader.js +139 -0
  136. package/dist/src/persona/PersonaManager.d.ts +112 -0
  137. package/dist/src/persona/PersonaManager.d.ts.map +1 -0
  138. package/dist/src/persona/PersonaManager.js +341 -0
  139. package/dist/src/persona/PersonaValidator.d.ts +33 -0
  140. package/dist/src/persona/PersonaValidator.d.ts.map +1 -0
  141. package/dist/src/persona/PersonaValidator.js +157 -0
  142. package/dist/src/persona/export-import/PersonaExporter.d.ts +43 -0
  143. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
  144. package/dist/src/persona/export-import/PersonaExporter.js +99 -0
  145. package/dist/src/persona/export-import/PersonaImporter.d.ts +65 -0
  146. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
  147. package/dist/src/persona/export-import/PersonaImporter.js +313 -0
  148. package/dist/src/persona/export-import/PersonaSharer.d.ts +60 -0
  149. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
  150. package/dist/src/persona/export-import/PersonaSharer.js +363 -0
  151. package/dist/src/persona/export-import/index.d.ts +10 -0
  152. package/dist/src/persona/export-import/index.d.ts.map +1 -0
  153. package/dist/src/persona/export-import/index.js +7 -0
  154. package/dist/src/persona/index.d.ts +7 -0
  155. package/dist/src/persona/index.d.ts.map +1 -0
  156. package/dist/src/persona/index.js +7 -0
  157. package/dist/src/security/InputValidator.d.ts +69 -0
  158. package/dist/src/security/InputValidator.d.ts.map +1 -0
  159. package/dist/src/security/InputValidator.js +381 -0
  160. package/dist/src/security/commandValidator.d.ts +7 -0
  161. package/dist/src/security/commandValidator.d.ts.map +1 -0
  162. package/dist/src/security/commandValidator.js +77 -0
  163. package/dist/src/security/constants.d.ts +21 -0
  164. package/dist/src/security/constants.d.ts.map +1 -0
  165. package/dist/src/security/constants.js +23 -0
  166. package/dist/src/security/contentValidator.d.ts +47 -0
  167. package/dist/src/security/contentValidator.d.ts.map +1 -0
  168. package/dist/src/security/contentValidator.js +188 -0
  169. package/dist/src/security/fileLockManager.d.ts +70 -0
  170. package/dist/src/security/fileLockManager.d.ts.map +1 -0
  171. package/dist/src/security/fileLockManager.js +187 -0
  172. package/dist/src/security/index.d.ts +12 -0
  173. package/dist/src/security/index.d.ts.map +1 -0
  174. package/dist/src/security/index.js +14 -0
  175. package/dist/src/security/pathValidator.d.ts +9 -0
  176. package/dist/src/security/pathValidator.d.ts.map +1 -0
  177. package/dist/src/security/pathValidator.js +97 -0
  178. package/dist/src/security/secureYamlParser.d.ts +46 -0
  179. package/dist/src/security/secureYamlParser.d.ts.map +1 -0
  180. package/dist/src/security/secureYamlParser.js +203 -0
  181. package/dist/src/security/securityMonitor.d.ts +58 -0
  182. package/dist/src/security/securityMonitor.d.ts.map +1 -0
  183. package/dist/src/security/securityMonitor.js +108 -0
  184. package/dist/src/security/tokenManager.d.ts +59 -0
  185. package/dist/src/security/tokenManager.d.ts.map +1 -0
  186. package/dist/src/security/tokenManager.js +216 -0
  187. package/dist/src/security/yamlValidator.d.ts +20 -0
  188. package/dist/src/security/yamlValidator.d.ts.map +1 -0
  189. package/dist/src/security/yamlValidator.js +138 -0
  190. package/dist/src/server/ServerSetup.d.ts +31 -0
  191. package/dist/src/server/ServerSetup.d.ts.map +1 -0
  192. package/dist/src/server/ServerSetup.js +79 -0
  193. package/dist/src/server/index.d.ts +7 -0
  194. package/dist/src/server/index.d.ts.map +1 -0
  195. package/dist/src/server/index.js +7 -0
  196. package/dist/src/server/tools/ConfigTools.d.ts +10 -0
  197. package/dist/src/server/tools/ConfigTools.d.ts.map +1 -0
  198. package/dist/src/server/tools/ConfigTools.js +63 -0
  199. package/dist/src/server/tools/MarketplaceTools.d.ts +10 -0
  200. package/dist/src/server/tools/MarketplaceTools.d.ts.map +1 -0
  201. package/dist/src/server/tools/MarketplaceTools.js +92 -0
  202. package/dist/src/server/tools/PersonaTools.d.ts +10 -0
  203. package/dist/src/server/tools/PersonaTools.d.ts.map +1 -0
  204. package/dist/src/server/tools/PersonaTools.js +257 -0
  205. package/dist/src/server/tools/ToolRegistry.d.ts +37 -0
  206. package/dist/src/server/tools/ToolRegistry.d.ts.map +1 -0
  207. package/dist/src/server/tools/ToolRegistry.js +40 -0
  208. package/dist/src/server/tools/UpdateTools.d.ts +10 -0
  209. package/dist/src/server/tools/UpdateTools.d.ts.map +1 -0
  210. package/dist/src/server/tools/UpdateTools.js +64 -0
  211. package/dist/src/server/tools/UserTools.d.ts +10 -0
  212. package/dist/src/server/tools/UserTools.d.ts.map +1 -0
  213. package/dist/src/server/tools/UserTools.js +51 -0
  214. package/dist/src/server/tools/index.d.ts +10 -0
  215. package/dist/src/server/tools/index.d.ts.map +1 -0
  216. package/dist/src/server/tools/index.js +10 -0
  217. package/dist/src/server/types.d.ts +34 -0
  218. package/dist/src/server/types.d.ts.map +1 -0
  219. package/dist/src/server/types.js +5 -0
  220. package/dist/src/tools/debug.d.ts +20 -0
  221. package/dist/src/tools/debug.d.ts.map +1 -0
  222. package/dist/src/tools/debug.js +37 -0
  223. package/dist/src/types/cache.d.ts +8 -0
  224. package/dist/src/types/cache.d.ts.map +1 -0
  225. package/dist/src/types/cache.js +5 -0
  226. package/dist/src/types/index.d.ts +8 -0
  227. package/dist/src/types/index.d.ts.map +1 -0
  228. package/dist/src/types/index.js +8 -0
  229. package/dist/src/types/marketplace.d.ts +23 -0
  230. package/dist/src/types/marketplace.d.ts.map +1 -0
  231. package/dist/src/types/marketplace.js +5 -0
  232. package/dist/src/types/mcp.d.ts +161 -0
  233. package/dist/src/types/mcp.d.ts.map +1 -0
  234. package/dist/src/types/mcp.js +75 -0
  235. package/dist/src/types/persona.d.ts +30 -0
  236. package/dist/src/types/persona.d.ts.map +1 -0
  237. package/dist/src/types/persona.js +5 -0
  238. package/dist/src/update/BackupManager.d.ts +46 -0
  239. package/dist/src/update/BackupManager.d.ts.map +1 -0
  240. package/dist/src/update/BackupManager.js +261 -0
  241. package/dist/src/update/DependencyChecker.d.ts +41 -0
  242. package/dist/src/update/DependencyChecker.d.ts.map +1 -0
  243. package/dist/src/update/DependencyChecker.js +132 -0
  244. package/dist/src/update/RateLimiter.d.ts +80 -0
  245. package/dist/src/update/RateLimiter.d.ts.map +1 -0
  246. package/dist/src/update/RateLimiter.js +172 -0
  247. package/dist/src/update/SignatureVerifier.d.ts +71 -0
  248. package/dist/src/update/SignatureVerifier.d.ts.map +1 -0
  249. package/dist/src/update/SignatureVerifier.js +214 -0
  250. package/dist/src/update/UpdateChecker.d.ts +127 -0
  251. package/dist/src/update/UpdateChecker.d.ts.map +1 -0
  252. package/dist/src/update/UpdateChecker.js +460 -0
  253. package/dist/src/update/UpdateManager.d.ts +41 -0
  254. package/dist/src/update/UpdateManager.d.ts.map +1 -0
  255. package/dist/src/update/UpdateManager.js +260 -0
  256. package/dist/src/update/VersionManager.d.ts +31 -0
  257. package/dist/src/update/VersionManager.d.ts.map +1 -0
  258. package/dist/src/update/VersionManager.js +134 -0
  259. package/dist/src/update/index.d.ts +9 -0
  260. package/dist/src/update/index.d.ts.map +1 -0
  261. package/dist/src/update/index.js +9 -0
  262. package/dist/src/utils/filesystem.d.ts +32 -0
  263. package/dist/src/utils/filesystem.d.ts.map +1 -0
  264. package/dist/src/utils/filesystem.js +73 -0
  265. package/dist/src/utils/git.d.ts +32 -0
  266. package/dist/src/utils/git.d.ts.map +1 -0
  267. package/dist/src/utils/git.js +65 -0
  268. package/dist/src/utils/index.d.ts +7 -0
  269. package/dist/src/utils/index.d.ts.map +1 -0
  270. package/dist/src/utils/index.js +7 -0
  271. package/dist/src/utils/logger.d.ts +45 -0
  272. package/dist/src/utils/logger.d.ts.map +1 -0
  273. package/dist/src/utils/logger.js +91 -0
  274. package/dist/src/utils/version.d.ts +25 -0
  275. package/dist/src/utils/version.d.ts.map +1 -0
  276. package/dist/src/utils/version.js +97 -0
  277. package/dist/test/src/cache/APICache.d.ts +23 -0
  278. package/dist/test/src/cache/APICache.d.ts.map +1 -0
  279. package/dist/test/src/cache/APICache.js +42 -0
  280. package/dist/test/src/cache/index.d.ts +5 -0
  281. package/dist/test/src/cache/index.d.ts.map +1 -0
  282. package/dist/test/src/cache/index.js +5 -0
  283. package/dist/test/src/collection/CollectionBrowser.d.ts +24 -0
  284. package/dist/test/src/collection/CollectionBrowser.d.ts.map +1 -0
  285. package/dist/test/src/collection/CollectionBrowser.js +115 -0
  286. package/dist/test/src/collection/CollectionSearch.d.ts +18 -0
  287. package/dist/test/src/collection/CollectionSearch.d.ts.map +1 -0
  288. package/dist/test/src/collection/CollectionSearch.js +48 -0
  289. package/dist/test/src/collection/GitHubClient.d.ts +22 -0
  290. package/dist/test/src/collection/GitHubClient.d.ts.map +1 -0
  291. package/dist/test/src/collection/GitHubClient.js +114 -0
  292. package/dist/test/src/collection/PersonaDetails.d.ts +22 -0
  293. package/dist/test/src/collection/PersonaDetails.d.ts.map +1 -0
  294. package/dist/test/src/collection/PersonaDetails.js +71 -0
  295. package/dist/test/src/collection/PersonaInstaller.d.ts +26 -0
  296. package/dist/test/src/collection/PersonaInstaller.d.ts.map +1 -0
  297. package/dist/test/src/collection/PersonaInstaller.js +103 -0
  298. package/dist/test/src/collection/PersonaSubmitter.d.ts +19 -0
  299. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +1 -0
  300. package/dist/test/src/collection/PersonaSubmitter.js +57 -0
  301. package/dist/test/src/collection/index.d.ts +10 -0
  302. package/dist/test/src/collection/index.d.ts.map +1 -0
  303. package/dist/test/src/collection/index.js +10 -0
  304. package/dist/test/src/config/constants.d.ts +25 -0
  305. package/dist/test/src/config/constants.d.ts.map +1 -0
  306. package/dist/test/src/config/constants.js +30 -0
  307. package/dist/test/src/config/index.d.ts +6 -0
  308. package/dist/test/src/config/index.d.ts.map +1 -0
  309. package/dist/test/src/config/index.js +6 -0
  310. package/dist/test/src/config/indicator-config.d.ts +107 -0
  311. package/dist/test/src/config/indicator-config.d.ts.map +1 -0
  312. package/dist/test/src/config/indicator-config.js +158 -0
  313. package/dist/test/src/constants/defaultPersonas.d.ts +10 -0
  314. package/dist/test/src/constants/defaultPersonas.d.ts.map +1 -0
  315. package/dist/test/src/constants/defaultPersonas.js +18 -0
  316. package/dist/test/src/constants/limits.d.ts +10 -0
  317. package/dist/test/src/constants/limits.d.ts.map +1 -0
  318. package/dist/test/src/constants/limits.js +13 -0
  319. package/dist/test/src/elements/BaseElement.d.ts +81 -0
  320. package/dist/test/src/elements/BaseElement.d.ts.map +1 -0
  321. package/dist/test/src/elements/BaseElement.js +381 -0
  322. package/dist/test/src/elements/FeedbackProcessor.d.ts +57 -0
  323. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +1 -0
  324. package/dist/test/src/elements/FeedbackProcessor.js +418 -0
  325. package/dist/test/src/elements/agents/Agent.d.ts +145 -0
  326. package/dist/test/src/elements/agents/Agent.d.ts.map +1 -0
  327. package/dist/test/src/elements/agents/Agent.js +848 -0
  328. package/dist/test/src/elements/agents/AgentManager.d.ts +125 -0
  329. package/dist/test/src/elements/agents/AgentManager.d.ts.map +1 -0
  330. package/dist/test/src/elements/agents/AgentManager.js +608 -0
  331. package/dist/test/src/elements/agents/constants.d.ts +42 -0
  332. package/dist/test/src/elements/agents/constants.d.ts.map +1 -0
  333. package/dist/test/src/elements/agents/constants.js +45 -0
  334. package/dist/test/src/elements/agents/goalTemplates.d.ts +44 -0
  335. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +1 -0
  336. package/dist/test/src/elements/agents/goalTemplates.js +297 -0
  337. package/dist/test/src/elements/agents/index.d.ts +8 -0
  338. package/dist/test/src/elements/agents/index.d.ts.map +1 -0
  339. package/dist/test/src/elements/agents/index.js +8 -0
  340. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +76 -0
  341. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +1 -0
  342. package/dist/test/src/elements/agents/ruleEngineConfig.js +143 -0
  343. package/dist/test/src/elements/agents/types.d.ts +97 -0
  344. package/dist/test/src/elements/agents/types.d.ts.map +1 -0
  345. package/dist/test/src/elements/agents/types.js +5 -0
  346. package/dist/test/src/elements/index.d.ts +6 -0
  347. package/dist/test/src/elements/index.d.ts.map +1 -0
  348. package/dist/test/src/elements/index.js +6 -0
  349. package/dist/test/src/elements/memories/Memory.d.ts +110 -0
  350. package/dist/test/src/elements/memories/Memory.d.ts.map +1 -0
  351. package/dist/test/src/elements/memories/Memory.js +470 -0
  352. package/dist/test/src/elements/memories/MemoryManager.d.ts +86 -0
  353. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +1 -0
  354. package/dist/test/src/elements/memories/MemoryManager.js +435 -0
  355. package/dist/test/src/elements/memories/constants.d.ts +42 -0
  356. package/dist/test/src/elements/memories/constants.d.ts.map +1 -0
  357. package/dist/test/src/elements/memories/constants.js +49 -0
  358. package/dist/test/src/elements/memories/index.d.ts +6 -0
  359. package/dist/test/src/elements/memories/index.d.ts.map +1 -0
  360. package/dist/test/src/elements/memories/index.js +6 -0
  361. package/dist/test/src/elements/skills/Skill.d.ts +109 -0
  362. package/dist/test/src/elements/skills/Skill.d.ts.map +1 -0
  363. package/dist/test/src/elements/skills/Skill.js +381 -0
  364. package/dist/test/src/elements/templates/Template.d.ts +138 -0
  365. package/dist/test/src/elements/templates/Template.d.ts.map +1 -0
  366. package/dist/test/src/elements/templates/Template.js +673 -0
  367. package/dist/test/src/elements/templates/TemplateManager.d.ts +104 -0
  368. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +1 -0
  369. package/dist/test/src/elements/templates/TemplateManager.js +496 -0
  370. package/dist/test/src/elements/templates/index.d.ts +6 -0
  371. package/dist/test/src/elements/templates/index.d.ts.map +1 -0
  372. package/dist/test/src/elements/templates/index.js +6 -0
  373. package/dist/test/src/errors/SecurityError.d.ts +29 -0
  374. package/dist/test/src/errors/SecurityError.d.ts.map +1 -0
  375. package/dist/test/src/errors/SecurityError.js +47 -0
  376. package/dist/test/src/errors/index.d.ts +2 -0
  377. package/dist/test/src/errors/index.d.ts.map +1 -0
  378. package/dist/test/src/errors/index.js +2 -0
  379. package/dist/test/src/index.barrel.d.ts +21 -0
  380. package/dist/test/src/index.barrel.d.ts.map +1 -0
  381. package/dist/test/src/index.barrel.js +31 -0
  382. package/dist/test/src/index.d.ts +223 -0
  383. package/dist/test/src/index.d.ts.map +1 -0
  384. package/dist/test/src/index.js +1594 -0
  385. package/dist/test/src/marketplace/GitHubClient.d.ts +22 -0
  386. package/dist/test/src/marketplace/GitHubClient.d.ts.map +1 -0
  387. package/dist/test/src/marketplace/GitHubClient.js +112 -0
  388. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +21 -0
  389. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  390. package/dist/test/src/marketplace/MarketplaceBrowser.js +45 -0
  391. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +18 -0
  392. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
  393. package/dist/test/src/marketplace/MarketplaceSearch.js +36 -0
  394. package/dist/test/src/marketplace/PersonaDetails.d.ts +22 -0
  395. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +1 -0
  396. package/dist/test/src/marketplace/PersonaDetails.js +71 -0
  397. package/dist/test/src/marketplace/PersonaInstaller.d.ts +25 -0
  398. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +1 -0
  399. package/dist/test/src/marketplace/PersonaInstaller.js +100 -0
  400. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +19 -0
  401. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
  402. package/dist/test/src/marketplace/PersonaSubmitter.js +57 -0
  403. package/dist/test/src/marketplace/index.d.ts +10 -0
  404. package/dist/test/src/marketplace/index.d.ts.map +1 -0
  405. package/dist/test/src/marketplace/index.js +10 -0
  406. package/dist/test/src/persona/PersonaElement.d.ts +64 -0
  407. package/dist/test/src/persona/PersonaElement.d.ts.map +1 -0
  408. package/dist/test/src/persona/PersonaElement.js +223 -0
  409. package/dist/test/src/persona/PersonaElementManager.d.ts +97 -0
  410. package/dist/test/src/persona/PersonaElementManager.d.ts.map +1 -0
  411. package/dist/test/src/persona/PersonaElementManager.js +342 -0
  412. package/dist/test/src/persona/PersonaLoader.d.ts +34 -0
  413. package/dist/test/src/persona/PersonaLoader.d.ts.map +1 -0
  414. package/dist/test/src/persona/PersonaLoader.js +145 -0
  415. package/dist/test/src/persona/PersonaManager.d.ts +112 -0
  416. package/dist/test/src/persona/PersonaManager.d.ts.map +1 -0
  417. package/dist/test/src/persona/PersonaManager.js +341 -0
  418. package/dist/test/src/persona/PersonaValidator.d.ts +33 -0
  419. package/dist/test/src/persona/PersonaValidator.d.ts.map +1 -0
  420. package/dist/test/src/persona/PersonaValidator.js +157 -0
  421. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +43 -0
  422. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
  423. package/dist/test/src/persona/export-import/PersonaExporter.js +99 -0
  424. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +65 -0
  425. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
  426. package/dist/test/src/persona/export-import/PersonaImporter.js +315 -0
  427. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +60 -0
  428. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
  429. package/dist/test/src/persona/export-import/PersonaSharer.js +502 -0
  430. package/dist/test/src/persona/export-import/index.d.ts +10 -0
  431. package/dist/test/src/persona/export-import/index.d.ts.map +1 -0
  432. package/dist/test/src/persona/export-import/index.js +7 -0
  433. package/dist/test/src/persona/index.d.ts +7 -0
  434. package/dist/test/src/persona/index.d.ts.map +1 -0
  435. package/dist/test/src/persona/index.js +7 -0
  436. package/dist/test/src/portfolio/MigrationManager.d.ts +44 -0
  437. package/dist/test/src/portfolio/MigrationManager.d.ts.map +1 -0
  438. package/dist/test/src/portfolio/MigrationManager.js +163 -0
  439. package/dist/test/src/portfolio/PortfolioManager.d.ts +54 -0
  440. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +1 -0
  441. package/dist/test/src/portfolio/PortfolioManager.js +224 -0
  442. package/dist/test/src/portfolio/types.d.ts +18 -0
  443. package/dist/test/src/portfolio/types.d.ts.map +1 -0
  444. package/dist/test/src/portfolio/types.js +13 -0
  445. package/dist/test/src/security/InputValidator.d.ts +80 -0
  446. package/dist/test/src/security/InputValidator.d.ts.map +1 -0
  447. package/dist/test/src/security/InputValidator.js +436 -0
  448. package/dist/test/src/security/audit/SecurityAuditor.d.ts +44 -0
  449. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +1 -0
  450. package/dist/test/src/security/audit/SecurityAuditor.js +274 -0
  451. package/dist/test/src/security/audit/config/suppressions.d.ts +34 -0
  452. package/dist/test/src/security/audit/config/suppressions.d.ts.map +1 -0
  453. package/dist/test/src/security/audit/config/suppressions.js +575 -0
  454. package/dist/test/src/security/audit/index.d.ts +14 -0
  455. package/dist/test/src/security/audit/index.d.ts.map +1 -0
  456. package/dist/test/src/security/audit/index.js +15 -0
  457. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +46 -0
  458. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +1 -0
  459. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +174 -0
  460. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +13 -0
  461. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +1 -0
  462. package/dist/test/src/security/audit/reporters/JsonReporter.js +25 -0
  463. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +13 -0
  464. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +1 -0
  465. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +79 -0
  466. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +20 -0
  467. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +1 -0
  468. package/dist/test/src/security/audit/rules/SecurityRules.js +244 -0
  469. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +47 -0
  470. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +1 -0
  471. package/dist/test/src/security/audit/scanners/CodeScanner.js +174 -0
  472. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +13 -0
  473. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +1 -0
  474. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +22 -0
  475. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +13 -0
  476. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +1 -0
  477. package/dist/test/src/security/audit/scanners/DependencyScanner.js +22 -0
  478. package/dist/test/src/security/audit/types.d.ts +94 -0
  479. package/dist/test/src/security/audit/types.d.ts.map +1 -0
  480. package/dist/test/src/security/audit/types.js +6 -0
  481. package/dist/test/src/security/commandValidator.d.ts +7 -0
  482. package/dist/test/src/security/commandValidator.d.ts.map +1 -0
  483. package/dist/test/src/security/commandValidator.js +78 -0
  484. package/dist/test/src/security/constants.d.ts +24 -0
  485. package/dist/test/src/security/constants.d.ts.map +1 -0
  486. package/dist/test/src/security/constants.js +26 -0
  487. package/dist/test/src/security/contentValidator.d.ts +47 -0
  488. package/dist/test/src/security/contentValidator.d.ts.map +1 -0
  489. package/dist/test/src/security/contentValidator.js +301 -0
  490. package/dist/test/src/security/errors.d.ts +14 -0
  491. package/dist/test/src/security/errors.d.ts.map +1 -0
  492. package/dist/test/src/security/errors.js +28 -0
  493. package/dist/test/src/security/fileLockManager.d.ts +70 -0
  494. package/dist/test/src/security/fileLockManager.d.ts.map +1 -0
  495. package/dist/test/src/security/fileLockManager.js +187 -0
  496. package/dist/test/src/security/index.d.ts +12 -0
  497. package/dist/test/src/security/index.d.ts.map +1 -0
  498. package/dist/test/src/security/index.js +14 -0
  499. package/dist/test/src/security/pathValidator.d.ts +9 -0
  500. package/dist/test/src/security/pathValidator.d.ts.map +1 -0
  501. package/dist/test/src/security/pathValidator.js +98 -0
  502. package/dist/test/src/security/regexValidator.d.ts +59 -0
  503. package/dist/test/src/security/regexValidator.d.ts.map +1 -0
  504. package/dist/test/src/security/regexValidator.js +214 -0
  505. package/dist/test/src/security/secureYamlParser.d.ts +46 -0
  506. package/dist/test/src/security/secureYamlParser.d.ts.map +1 -0
  507. package/dist/test/src/security/secureYamlParser.js +203 -0
  508. package/dist/test/src/security/securityMonitor.d.ts +58 -0
  509. package/dist/test/src/security/securityMonitor.d.ts.map +1 -0
  510. package/dist/test/src/security/securityMonitor.js +108 -0
  511. package/dist/test/src/security/tokenManager.d.ts +85 -0
  512. package/dist/test/src/security/tokenManager.d.ts.map +1 -0
  513. package/dist/test/src/security/tokenManager.js +286 -0
  514. package/dist/test/src/security/validators/unicodeValidator.d.ts +97 -0
  515. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +1 -0
  516. package/dist/test/src/security/validators/unicodeValidator.js +312 -0
  517. package/dist/test/src/security/yamlValidator.d.ts +21 -0
  518. package/dist/test/src/security/yamlValidator.d.ts.map +1 -0
  519. package/dist/test/src/security/yamlValidator.js +164 -0
  520. package/dist/test/src/server/ServerSetup.d.ts +35 -0
  521. package/dist/test/src/server/ServerSetup.d.ts.map +1 -0
  522. package/dist/test/src/server/ServerSetup.js +116 -0
  523. package/dist/test/src/server/index.d.ts +7 -0
  524. package/dist/test/src/server/index.d.ts.map +1 -0
  525. package/dist/test/src/server/index.js +7 -0
  526. package/dist/test/src/server/startup.d.ts +31 -0
  527. package/dist/test/src/server/startup.d.ts.map +1 -0
  528. package/dist/test/src/server/startup.js +67 -0
  529. package/dist/test/src/server/tools/CollectionTools.d.ts +10 -0
  530. package/dist/test/src/server/tools/CollectionTools.d.ts.map +1 -0
  531. package/dist/test/src/server/tools/CollectionTools.js +96 -0
  532. package/dist/test/src/server/tools/ConfigTools.d.ts +10 -0
  533. package/dist/test/src/server/tools/ConfigTools.d.ts.map +1 -0
  534. package/dist/test/src/server/tools/ConfigTools.js +63 -0
  535. package/dist/test/src/server/tools/MarketplaceTools.d.ts +10 -0
  536. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +1 -0
  537. package/dist/test/src/server/tools/MarketplaceTools.js +92 -0
  538. package/dist/test/src/server/tools/PersonaTools.d.ts +10 -0
  539. package/dist/test/src/server/tools/PersonaTools.d.ts.map +1 -0
  540. package/dist/test/src/server/tools/PersonaTools.js +257 -0
  541. package/dist/test/src/server/tools/ToolRegistry.d.ts +37 -0
  542. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +1 -0
  543. package/dist/test/src/server/tools/ToolRegistry.js +40 -0
  544. package/dist/test/src/server/tools/UpdateTools.d.ts +10 -0
  545. package/dist/test/src/server/tools/UpdateTools.d.ts.map +1 -0
  546. package/dist/test/src/server/tools/UpdateTools.js +64 -0
  547. package/dist/test/src/server/tools/UserTools.d.ts +10 -0
  548. package/dist/test/src/server/tools/UserTools.d.ts.map +1 -0
  549. package/dist/test/src/server/tools/UserTools.js +51 -0
  550. package/dist/test/src/server/tools/index.d.ts +10 -0
  551. package/dist/test/src/server/tools/index.d.ts.map +1 -0
  552. package/dist/test/src/server/tools/index.js +10 -0
  553. package/dist/test/src/server/types.d.ts +34 -0
  554. package/dist/test/src/server/types.d.ts.map +1 -0
  555. package/dist/test/src/server/types.js +5 -0
  556. package/dist/test/src/tools/debug.d.ts +20 -0
  557. package/dist/test/src/tools/debug.d.ts.map +1 -0
  558. package/dist/test/src/tools/debug.js +37 -0
  559. package/dist/test/src/types/cache.d.ts +8 -0
  560. package/dist/test/src/types/cache.d.ts.map +1 -0
  561. package/dist/test/src/types/cache.js +5 -0
  562. package/dist/test/src/types/collection.d.ts +23 -0
  563. package/dist/test/src/types/collection.d.ts.map +1 -0
  564. package/dist/test/src/types/collection.js +5 -0
  565. package/dist/test/src/types/elements/IElement.d.ts +123 -0
  566. package/dist/test/src/types/elements/IElement.d.ts.map +1 -0
  567. package/dist/test/src/types/elements/IElement.js +30 -0
  568. package/dist/test/src/types/elements/IElementManager.d.ts +65 -0
  569. package/dist/test/src/types/elements/IElementManager.d.ts.map +1 -0
  570. package/dist/test/src/types/elements/IElementManager.js +6 -0
  571. package/dist/test/src/types/elements/IRatingManager.d.ts +109 -0
  572. package/dist/test/src/types/elements/IRatingManager.d.ts.map +1 -0
  573. package/dist/test/src/types/elements/IRatingManager.js +6 -0
  574. package/dist/test/src/types/elements/IReferenceResolver.d.ts +52 -0
  575. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +1 -0
  576. package/dist/test/src/types/elements/IReferenceResolver.js +6 -0
  577. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +49 -0
  578. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +1 -0
  579. package/dist/test/src/types/elements/RatingBreakdowns.js +6 -0
  580. package/dist/test/src/types/elements/index.d.ts +9 -0
  581. package/dist/test/src/types/elements/index.d.ts.map +1 -0
  582. package/dist/test/src/types/elements/index.js +11 -0
  583. package/dist/test/src/types/index.d.ts +9 -0
  584. package/dist/test/src/types/index.d.ts.map +1 -0
  585. package/dist/test/src/types/index.js +9 -0
  586. package/dist/test/src/types/marketplace.d.ts +23 -0
  587. package/dist/test/src/types/marketplace.d.ts.map +1 -0
  588. package/dist/test/src/types/marketplace.js +5 -0
  589. package/dist/test/src/types/mcp.d.ts +84 -0
  590. package/dist/test/src/types/mcp.d.ts.map +1 -0
  591. package/dist/test/src/types/mcp.js +80 -0
  592. package/dist/test/src/types/persona.d.ts +30 -0
  593. package/dist/test/src/types/persona.d.ts.map +1 -0
  594. package/dist/test/src/types/persona.js +5 -0
  595. package/dist/test/src/update/BackupManager.d.ts +46 -0
  596. package/dist/test/src/update/BackupManager.d.ts.map +1 -0
  597. package/dist/test/src/update/BackupManager.js +261 -0
  598. package/dist/test/src/update/DependencyChecker.d.ts +41 -0
  599. package/dist/test/src/update/DependencyChecker.d.ts.map +1 -0
  600. package/dist/test/src/update/DependencyChecker.js +132 -0
  601. package/dist/test/src/update/RateLimiter.d.ts +80 -0
  602. package/dist/test/src/update/RateLimiter.d.ts.map +1 -0
  603. package/dist/test/src/update/RateLimiter.js +172 -0
  604. package/dist/test/src/update/SignatureVerifier.d.ts +71 -0
  605. package/dist/test/src/update/SignatureVerifier.d.ts.map +1 -0
  606. package/dist/test/src/update/SignatureVerifier.js +214 -0
  607. package/dist/test/src/update/UpdateChecker.d.ts +127 -0
  608. package/dist/test/src/update/UpdateChecker.d.ts.map +1 -0
  609. package/dist/test/src/update/UpdateChecker.js +469 -0
  610. package/dist/test/src/update/UpdateManager.d.ts +41 -0
  611. package/dist/test/src/update/UpdateManager.d.ts.map +1 -0
  612. package/dist/test/src/update/UpdateManager.js +260 -0
  613. package/dist/test/src/update/VersionManager.d.ts +31 -0
  614. package/dist/test/src/update/VersionManager.d.ts.map +1 -0
  615. package/dist/test/src/update/VersionManager.js +134 -0
  616. package/dist/test/src/update/index.d.ts +9 -0
  617. package/dist/test/src/update/index.d.ts.map +1 -0
  618. package/dist/test/src/update/index.js +9 -0
  619. package/dist/test/src/utils/filesystem.d.ts +29 -0
  620. package/dist/test/src/utils/filesystem.d.ts.map +1 -0
  621. package/dist/test/src/utils/filesystem.js +94 -0
  622. package/dist/test/src/utils/git.d.ts +32 -0
  623. package/dist/test/src/utils/git.d.ts.map +1 -0
  624. package/dist/test/src/utils/git.js +65 -0
  625. package/dist/test/src/utils/index.d.ts +7 -0
  626. package/dist/test/src/utils/index.d.ts.map +1 -0
  627. package/dist/test/src/utils/index.js +7 -0
  628. package/dist/test/src/utils/logger.d.ts +45 -0
  629. package/dist/test/src/utils/logger.d.ts.map +1 -0
  630. package/dist/test/src/utils/logger.js +91 -0
  631. package/dist/test/src/utils/version.d.ts +25 -0
  632. package/dist/test/src/utils/version.d.ts.map +1 -0
  633. package/dist/test/src/utils/version.js +97 -0
  634. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +33 -0
  635. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +1 -0
  636. package/dist/test/test/__tests__/integration/helpers/file-utils.js +83 -0
  637. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +26 -0
  638. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +1 -0
  639. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +95 -0
  640. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +26 -0
  641. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +1 -0
  642. package/dist/test/test/__tests__/integration/helpers/test-server.js +41 -0
  643. package/dist/test/test/__tests__/integration/setup.d.ts +8 -0
  644. package/dist/test/test/__tests__/integration/setup.d.ts.map +1 -0
  645. package/dist/test/test/__tests__/integration/setup.js +31 -0
  646. package/dist/test/test/__tests__/integration/teardown.d.ts +5 -0
  647. package/dist/test/test/__tests__/integration/teardown.d.ts.map +1 -0
  648. package/dist/test/test/__tests__/integration/teardown.js +23 -0
  649. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +34 -0
  650. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +1 -0
  651. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +224 -0
  652. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +89 -0
  653. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +1 -0
  654. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +543 -0
  655. package/dist/test/test/__tests__/security/index.d.ts +46 -0
  656. package/dist/test/test/__tests__/security/index.d.ts.map +1 -0
  657. package/dist/test/test/__tests__/security/index.js +98 -0
  658. package/dist/test/test/__tests__/security/setup.d.ts +3 -0
  659. package/dist/test/test/__tests__/security/setup.d.ts.map +1 -0
  660. package/dist/test/test/__tests__/security/setup.js +23 -0
  661. package/dist/types/marketplace.d.ts +23 -0
  662. package/dist/types/marketplace.d.ts.map +1 -0
  663. package/dist/types/marketplace.js +5 -0
  664. package/dist/update/UpdateChecker.d.ts +5 -0
  665. package/dist/update/UpdateChecker.d.ts.map +1 -1
  666. package/dist/update/UpdateChecker.js +44 -7
  667. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,74 @@ All notable changes to DollhouseMCP will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.4.4] - 2025-08-04
9
+
10
+ ### 🚨 Emergency Hotfix
11
+ - **v1.4.3 was completely broken** - this release fixes critical initialization failures
12
+ - Users on v1.4.3 must upgrade immediately as the server crashes 100% of the time
13
+
14
+ ### Fixed
15
+ - **Initialization order bug**: Migration now runs before directory access
16
+ - Previously: Portfolio directories were created before migration could fix them
17
+ - Now: Migration completes before any directory operations
18
+ - **jsdom crash on startup**: Heavy dependencies now load lazily
19
+ - Previously: UpdateChecker crashed during MCP initialization
20
+ - Now: jsdom/DOMPurify load only when needed with error handling
21
+ - **Docker compatibility**: Server now handles read-only environments gracefully
22
+ - Added proper error handling for directory creation failures
23
+ - Server continues with limited functionality instead of crashing
24
+
25
+ ### Changed
26
+ - Made UpdateManager and PersonaImporter optional during initialization
27
+ - Improved error visibility with console.error for critical failures
28
+ - Better fallback HTML sanitization using entity escaping
29
+
30
+ ## [1.4.3] - 2025-08-04
31
+
32
+ ### 🚨 Critical Fix
33
+ - **Fixed NPM installation crash** caused by directory name mismatch
34
+ - v1.4.2 installations were completely broken on clean machines
35
+ - Server would crash silently with no error output
36
+
37
+ ### Changed
38
+ - **BREAKING**: All element directories now use plural names consistently
39
+ - Portfolio directories: `personas/`, `skills/`, `templates/`, etc.
40
+ - Data directories: `personas/`, `skills/`, `templates/`, etc.
41
+ - This aligns with semantic correctness (directories contain multiple items)
42
+ - Simplified DefaultElementProvider implementation
43
+ - Removed unnecessary mapping layer between directory names
44
+ - Code is now cleaner and more maintainable
45
+ - Improved error logging for initialization failures
46
+ - Added console.error output for Claude Desktop visibility
47
+ - Better debugging information when issues occur
48
+
49
+ ### Added
50
+ - **Automatic migration** for existing v1.4.2 installations
51
+ - Renames singular directories to plural automatically
52
+ - Preserves all existing content
53
+ - Logs migration progress for transparency
54
+ - Comprehensive troubleshooting section in README
55
+ - Clear instructions for v1.4.2 users
56
+ - Directory structure documentation
57
+ - NPM upgrade instructions
58
+
59
+ ### Technical Details
60
+ - ElementType enum values changed from singular to plural
61
+ - `'persona'` → `'personas'`
62
+ - `'skill'` → `'skills'`
63
+ - `'template'` → `'templates'`
64
+ - `'agent'` → `'agents'`
65
+ - `'memory'` → `'memories'`
66
+ - `'ensemble'` → `'ensembles'`
67
+ - Removed `elementMappings` object from DefaultElementProvider
68
+ - Portfolio directories now match data directory names exactly
69
+
70
+ ### Migration Instructions
71
+ If upgrading from v1.4.2:
72
+ 1. Update: `npm install -g @dollhousemcp/mcp-server@latest`
73
+ 2. The server will automatically migrate your directories on first run
74
+ 3. No manual intervention required
75
+
8
76
  ## [1.4.0] - 2025-08-02
9
77
 
10
78
  ### Changed
package/README.md CHANGED
@@ -23,7 +23,7 @@ A comprehensive Model Context Protocol (MCP) server that enables dynamic AI pers
23
23
  **🏪 Collection**: https://github.com/DollhouseMCP/collection
24
24
  **📦 NPM Package**: https://www.npmjs.com/package/@dollhousemcp/mcp-server
25
25
  **🌍 Website**: https://dollhousemcp.com (planned)
26
- **📦 Version**: v1.4.1
26
+ **📦 Version**: v1.4.4
27
27
 
28
28
  > **⚠️ Breaking Change Notice**: Tool names have changed from "marketplace" to "collection" terminology. Old names still work but are deprecated. See [Migration Guide](docs/MIGRATION_GUIDE_COLLECTION_RENAME.md) for details.
29
29
 
@@ -33,6 +33,9 @@ A comprehensive Model Context Protocol (MCP) server that enables dynamic AI pers
33
33
  # Install globally
34
34
  npm install -g @dollhousemcp/mcp-server
35
35
 
36
+ # ⚠️ IMPORTANT: If you have v1.4.2 or v1.4.3, upgrade immediately:
37
+ # npm install -g @dollhousemcp/mcp-server@latest
38
+
36
39
  # Add to Claude Desktop config (see path below for your OS)
37
40
  # macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
38
41
  # Windows: %APPDATA%\Claude\claude_desktop_config.json
@@ -268,9 +271,9 @@ Add DollhouseMCP to your Claude Desktop configuration:
268
271
  **🔄 After configuration:**
269
272
  1. Save the file
270
273
  2. Restart Claude Desktop completely
271
- 3. All 30 DollhouseMCP tools will be available
274
+ 3. All 46 DollhouseMCP tools will be available
272
275
 
273
- ## 🛠️ Available Tools (30 Total)
276
+ ## 🛠️ Available Tools (46 Total)
274
277
 
275
278
  ### Portfolio Element Management (NEW!)
276
279
  - **`list_elements`** - List all elements of a specific type
@@ -748,7 +751,7 @@ DollhouseMCP/
748
751
  ├── scripts/ # Management and utility scripts
749
752
  ├── Dockerfile # Multi-stage Docker build
750
753
  ├── docker-compose.yml # Production and development configs
751
- ├── package.json # Project config (dollhousemcp v1.4.1)
754
+ ├── package.json # Project config (dollhousemcp v1.4.2)
752
755
  ├── tsconfig.json # TypeScript configuration
753
756
  ├── jest.config.cjs # Jest test configuration
754
757
  ├── setup.sh # Automated installation script
@@ -898,11 +901,33 @@ export DEBUG="dollhousemcp:*" # Debug logging (optional)
898
901
 
899
902
  ## 🔧 Troubleshooting
900
903
 
904
+ ### ⚠️ NPM Installation Issues (v1.4.2)
905
+
906
+ If the MCP server crashes on startup after NPM installation:
907
+ 1. Check your version: `npm list -g @dollhousemcp/mcp-server`
908
+ 2. If you have v1.4.2, upgrade immediately: `npm install -g @dollhousemcp/mcp-server@latest`
909
+ 3. Clear your portfolio and let it regenerate: `rm -rf ~/.dollhouse/portfolio`
910
+
911
+ **Note**: v1.4.2 had a critical bug that prevented proper initialization. v1.4.3 attempted to fix this but introduced new crashes. Both issues are fixed in v1.4.4.
912
+
913
+ ### Directory Structure (v1.4.3+)
914
+
915
+ As of v1.4.3, all element directories use plural names:
916
+ - `~/.dollhouse/portfolio/personas/` (was `persona/` in v1.4.2)
917
+ - `~/.dollhouse/portfolio/skills/` (was `skill/` in v1.4.2)
918
+ - `~/.dollhouse/portfolio/templates/` (was `template/` in v1.4.2)
919
+ - `~/.dollhouse/portfolio/agents/` (was `agent/` in v1.4.2)
920
+ - `~/.dollhouse/portfolio/memories/` (was `memory/` in v1.4.2)
921
+ - `~/.dollhouse/portfolio/ensembles/` (was `ensemble/` in v1.4.2)
922
+
923
+ If you upgraded from v1.4.2, the server will automatically migrate your directories.
924
+
901
925
  ### Common Issues
902
926
 
903
927
  | Issue | Solution |
904
928
  |-------|----------|
905
- | **Personas not loading** | Check `personas/` directory exists and has read permissions |
929
+ | **v1.4.2 or v1.4.3 installation broken** | Upgrade to v1.4.4+ immediately |
930
+ | **Personas not loading** | Check `~/.dollhouse/portfolio/personas/` directory exists |
906
931
  | **Server won't start** | Run `npm run rebuild` to clean and rebuild |
907
932
  | **Collection not working** | Check internet connection and GitHub API access |
908
933
  | **User identity not saving** | Set `DOLLHOUSE_USER` environment variable before starting Claude |
@@ -1129,7 +1154,25 @@ This project is licensed under the **AGPL-3.0** License with Platform Stability
1129
1154
 
1130
1155
  ## 🏷️ Version History
1131
1156
 
1132
- ### v1.4.1 - August 2, 2025 (Current)
1157
+ ### v1.4.4 - August 4, 2025 (Current)
1158
+ **Emergency Hotfix**:
1159
+ - 🚨 **Fixed v1.4.3 total failure** - initialization crashes fixed
1160
+ - 🔧 **Fixed jsdom crash** - heavy dependencies now load lazily
1161
+ - 🐳 **Fixed Docker compatibility** - handles read-only environments
1162
+
1163
+ ### v1.4.3 - August 4, 2025
1164
+ **Directory Structure Fix**:
1165
+ - 🚨 **Fixed NPM installation failure** but introduced new crashes
1166
+
1167
+ ### v1.4.2 - August 4, 2025
1168
+ **Critical NPM Installation Fix**:
1169
+ - 🚨 **Fixed NPM installation failure** where empty portfolios caused server crashes
1170
+ - 📦 **DefaultElementProvider** automatically populates default content on first run
1171
+ - 🔍 **Smart path detection** searches multiple NPM/Git installation locations
1172
+ - 💬 **Helpful error messages** guide new users when portfolios are empty
1173
+ - 🔒 **Security hardened** with audit logging and file integrity verification
1174
+
1175
+ ### v1.4.1 - August 2, 2025
1133
1176
  **NPM Installation Support**:
1134
1177
  - 📦 **Install MCP servers from npm packages** with full cross-platform support
1135
1178
  - 🔄 **Atomic operations** with transaction-based rollback on failure
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Browse collection content from GitHub
3
+ */
4
+ import { GitHubClient } from './GitHubClient.js';
5
+ export declare class MarketplaceBrowser {
6
+ private githubClient;
7
+ private baseUrl;
8
+ constructor(githubClient: GitHubClient);
9
+ /**
10
+ * Browse collection content by section and category
11
+ * @param section - Top level section: library, showcase, or catalog
12
+ * @param category - Optional category within the section
13
+ */
14
+ browseCollection(section?: string, category?: string): Promise<{
15
+ items: any[];
16
+ categories: any[];
17
+ sections?: any[];
18
+ }>;
19
+ /**
20
+ * Format collection browse results
21
+ */
22
+ formatBrowseResults(items: any[], categories: any[], section?: string, category?: string, personaIndicator?: string): string;
23
+ }
24
+ //# sourceMappingURL=MarketplaceBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketplaceBrowser.d.ts","sourceRoot":"","sources":["../../src/collection/MarketplaceBrowser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAmE;gBAEtE,YAAY,EAAE,YAAY;IAItC;;;;OAIG;IACG,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IA2C3H;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;CA8EjI"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Browse collection content from GitHub
3
+ */
4
+ export class MarketplaceBrowser {
5
+ githubClient;
6
+ baseUrl = 'https://api.github.com/repos/DollhouseMCP/collection/contents';
7
+ constructor(githubClient) {
8
+ this.githubClient = githubClient;
9
+ }
10
+ /**
11
+ * Browse collection content by section and category
12
+ * @param section - Top level section: library, showcase, or catalog
13
+ * @param category - Optional category within the section
14
+ */
15
+ async browseCollection(section, category) {
16
+ let url = this.baseUrl;
17
+ // If no section provided, show top-level sections
18
+ if (!section) {
19
+ const data = await this.githubClient.fetchFromGitHub(url);
20
+ if (!Array.isArray(data)) {
21
+ throw new Error('Invalid collection response. Expected directory listing.');
22
+ }
23
+ // Filter to only show content directories
24
+ const sections = data.filter((item) => item.type === 'dir' && ['library', 'showcase', 'catalog'].includes(item.name));
25
+ return { items: [], categories: [], sections };
26
+ }
27
+ // Browse within a section
28
+ url = category
29
+ ? `${this.baseUrl}/${section}/${category}`
30
+ : `${this.baseUrl}/${section}`;
31
+ const data = await this.githubClient.fetchFromGitHub(url);
32
+ if (!Array.isArray(data)) {
33
+ throw new Error('Invalid marketplace response. Expected directory listing.');
34
+ }
35
+ // In the library section, we have content type directories
36
+ if (section === 'library' && !category) {
37
+ const contentTypes = data.filter((item) => item.type === 'dir' && ['personas', 'skills', 'agents', 'prompts', 'templates', 'tools', 'ensembles'].includes(item.name));
38
+ return { items: [], categories: contentTypes };
39
+ }
40
+ const items = data.filter((item) => item.type === 'file' && item.name.endsWith('.md'));
41
+ const categories = data.filter((item) => item.type === 'dir');
42
+ return { items, categories };
43
+ }
44
+ /**
45
+ * Format collection browse results
46
+ */
47
+ formatBrowseResults(items, categories, section, category, personaIndicator = '') {
48
+ const textParts = [`${personaIndicator}🏪 **DollhouseMCP Collection**\n\n`];
49
+ // Show top-level sections if no section specified
50
+ if (!section && categories.length > 0) {
51
+ textParts.push(`**📚 Collection Sections (${categories.length}):**\n`);
52
+ categories.forEach((sec) => {
53
+ const sectionIcons = {
54
+ 'library': '📖',
55
+ 'showcase': '⭐',
56
+ 'catalog': '💎'
57
+ };
58
+ const icon = sectionIcons[sec.name] || '📁';
59
+ const descriptions = {
60
+ 'library': 'Free community content',
61
+ 'showcase': 'Featured high-quality content',
62
+ 'catalog': 'Premium content (coming soon)'
63
+ };
64
+ textParts.push(` ${icon} **${sec.name}** - ${descriptions[sec.name] || 'Content collection'}\n`, ` Browse: \`browse_collection "${sec.name}"\`\n\n`);
65
+ });
66
+ return textParts.join('');
67
+ }
68
+ // Show content types within library section
69
+ if (section === 'library' && !category && categories.length > 0) {
70
+ textParts.push(`**📖 Library Content Types (${categories.length}):**\n`);
71
+ categories.forEach((cat) => {
72
+ const typeIcons = {
73
+ 'personas': '🎭',
74
+ 'skills': '🛠️',
75
+ 'agents': '🤖',
76
+ 'prompts': '💬',
77
+ 'templates': '📄',
78
+ 'tools': '🔧',
79
+ 'ensembles': '🎼'
80
+ };
81
+ const icon = typeIcons[cat.name] || '📁';
82
+ textParts.push(` ${icon} **${cat.name}** - Browse: \`browse_collection "library" "${cat.name}"\`\n`);
83
+ });
84
+ textParts.push('\n');
85
+ }
86
+ else if (categories.length > 0) {
87
+ textParts.push(`**📁 Categories in ${section}${category ? `/${category}` : ''} (${categories.length}):**\n`);
88
+ categories.forEach((cat) => {
89
+ const browsePath = category ? `"${section}" "${category}/${cat.name}"` : `"${section}" "${cat.name}"`;
90
+ textParts.push(` 📂 **${cat.name}** - Browse: \`browse_collection ${browsePath}\`\n`);
91
+ });
92
+ textParts.push('\n');
93
+ }
94
+ if (items.length > 0) {
95
+ const contentType = category?.split('/').pop() || 'content';
96
+ const contentIcons = {
97
+ 'personas': '🎭',
98
+ 'skills': '🛠️',
99
+ 'agents': '🤖',
100
+ 'prompts': '💬',
101
+ 'templates': '📄',
102
+ 'tools': '🔧',
103
+ 'ensembles': '🎼'
104
+ };
105
+ const icon = contentIcons[contentType] || '📄';
106
+ textParts.push(`**${icon} ${contentType.charAt(0).toUpperCase() + contentType.slice(1)} in ${section}${category ? `/${category}` : ''} (${items.length}):**\n`);
107
+ items.forEach((item) => {
108
+ const fullPath = section + (category ? `/${category}` : '') + `/${item.name}`;
109
+ textParts.push(` ▫️ **${item.name.replace('.md', '')}**\n`, ` 📥 Install: \`install_content "${fullPath}"\`\n`, ` 👁️ Details: \`get_collection_content "${fullPath}"\`\n\n`);
110
+ });
111
+ }
112
+ return textParts.join('');
113
+ }
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFya2V0cGxhY2VCcm93c2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbGxlY3Rpb24vTWFya2V0cGxhY2VCcm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBSUgsTUFBTSxPQUFPLGtCQUFrQjtJQUNyQixZQUFZLENBQWU7SUFDM0IsT0FBTyxHQUFHLCtEQUErRCxDQUFDO0lBRWxGLFlBQVksWUFBMEI7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBZ0IsRUFBRSxRQUFpQjtRQUN4RCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRXZCLGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztZQUM5RSxDQUFDO1lBRUQsMENBQTBDO1lBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUN6QyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDOUUsQ0FBQztZQUVGLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDakQsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixHQUFHLEdB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SUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlFLFNBQVMsQ0FBQyxJQUFJLENBQ1osV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFDN0Msd0NBQXdDLFFBQVEsT0FBTyxFQUN2RCxnREFBZ0QsUUFBUSxTQUFTLENBQ2xFLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2UgY29sbGVjdGlvbiBjb250ZW50IGZyb20gR2l0SHViXG4gKi9cblxuaW1wb3J0IHsgR2l0SHViQ2xpZW50IH0gZnJvbSAnLi9HaXRIdWJDbGllbnQuanMnO1xuXG5leHBvcnQgY2xhc3MgTWFya2V0cGxhY2VCcm93c2VyIHtcbiAgcHJpdmF0ZSBnaXRodWJDbGllbnQ6IEdpdEh1YkNsaWVudDtcbiAgcHJpdmF0ZSBiYXNlVXJsID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vY29udGVudHMnO1xuICBcbiAgY29uc3RydWN0b3IoZ2l0aHViQ2xpZW50OiBHaXRIdWJDbGllbnQpIHtcbiAgICB0aGlzLmdpdGh1YkNsaWVudCA9IGdpdGh1YkNsaWVudDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEJyb3dzZSBjb2xsZWN0aW9uIGNvbnRlbnQgYnkgc2VjdGlvbiBhbmQgY2F0ZWdvcnlcbiAgICogQHBhcmFtIHNlY3Rpb24gLSBUb3AgbGV2ZWwgc2VjdGlvbjogbGlicmFyeSwgc2hvd2Nhc2UsIG9yIGNhdGFsb2dcbiAgICogQHBhcmFtIGNhdGVnb3J5IC0gT3B0aW9uYWwgY2F0ZWdvcnkgd2l0aGluIHRoZSBzZWN0aW9uXG4gICAqL1xuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIGNhdGVnb3J5Pzogc3RyaW5nKTogUHJvbWlzZTx7IGl0ZW1zOiBhbnlbXSwgY2F0ZWdvcmllczogYW55W10sIHNlY3Rpb25zPzogYW55W10gfT4ge1xuICAgIGxldCB1cmwgPSB0aGlzLmJhc2VVcmw7XG4gICAgXG4gICAgLy8gSWYgbm8gc2VjdGlvbiBwcm92aWRlZCwgc2hvdyB0b3AtbGV2ZWwgc2VjdGlvbnNcbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdpdGh1YkNsaWVudC5mZXRjaEZyb21HaXRIdWIodXJsKTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29sbGVjdGlvbiByZXNwb25zZS4gRXhwZWN0ZWQgZGlyZWN0b3J5IGxpc3RpbmcuJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZpbHRlciB0byBvbmx5IHNob3cgY29udGVudCBkaXJlY3Rvcmllc1xuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiBcbiAgICAgICAgaXRlbS50eXBlID09PSAnZGlyJyAmJiBbJ2xpYnJhcnknLCAnc2hvd2Nhc2UnLCAnY2F0YWxvZyddLmluY2x1ZGVzKGl0ZW0ubmFtZSlcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgY2F0ZWdvcmllczogW10sIHNlY3Rpb25zIH07XG4gICAgfVxuICAgIFxuICAgIC8vIEJyb3dzZSB3aXRoaW4gYSBzZWN0aW9uXG4gICAgdXJsID0gY2F0ZWdvcnkgXG4gICAgICA/IGAke3RoaXMuYmFzZVVybH0vJHtzZWN0aW9ufS8ke2NhdGVnb3J5fWAgXG4gICAgICA6IGAke3RoaXMuYmFzZVVybH0vJHtzZWN0aW9ufWA7XG4gICAgXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ2l0aHViQ2xpZW50LmZldGNoRnJvbUdpdEh1Yih1cmwpO1xuICAgIFxuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcmtldHBsYWNlIHJlc3BvbnNlLiBFeHBlY3RlZCBkaXJlY3RvcnkgbGlzdGluZy4nKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSW4gdGhlIGxpYnJhcnkgc2VjdGlvbiwgd2UgaGF2ZSBjb250ZW50IHR5cGUgZGlyZWN0b3JpZXNcbiAgICBpZiAoc2VjdGlvbiA9PT0gJ2xpYnJhcnknICYmICFjYXRlZ29yeSkge1xuICAgICAgY29uc3QgY29udGVudFR5cGVzID0gZGF0YS5maWx0ZXIoKGl0ZW06IGFueSkgPT4gXG4gICAgICAgIGl0ZW0udHlwZSA9PT0gJ2RpcicgJiYgWydwZXJzb25hcycsICdza2lsbHMnLCAnYWdlbnRzJywgJ3Byb21wdHMnLCAndGVtcGxhdGVzJywgJ3Rvb2xzJywgJ2Vuc2VtYmxlcyddLmluY2x1ZGVzKGl0ZW0ubmFtZSlcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBpdGVtczogW10sIGNhdGVnb3JpZXM6IGNvbnRlbnRUeXBlcyB9O1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBpdGVtcyA9IGRhdGEuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0udHlwZSA9PT0gJ2ZpbGUnICYmIGl0ZW0ubmFtZS5lbmRzV2l0aCgnLm1kJykpO1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnR5cGUgPT09ICdkaXInKTtcbiAgICBcbiAgICByZXR1cm4geyBpdGVtcywgY2F0ZWdvcmllcyB9O1xuICB9XG4gIFxuICAvKipcbiAgICogRm9ybWF0IGNvbGxlY3Rpb24gYnJvd3NlIHJlc3VsdHNcbiAgICovXG4gIGZvcm1hdEJyb3dzZVJlc3VsdHMoaXRlbXM6IGFueVtdLCBjYXRlZ29yaWVzOiBhbnlbXSwgc2VjdGlvbj86IHN0cmluZywgY2F0ZWdvcnk/OiBzdHJpbmcsIHBlcnNvbmFJbmRpY2F0b3I6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXh0UGFydHMgPSBbYCR7cGVyc29uYUluZGljYXRvcn3wn4+qICoqRG9sbGhvdXNlTUNQIENvbGxlY3Rpb24qKlxcblxcbmBdO1xuICAgIFxuICAgIC8vIFNob3cgdG9wLWxldmVsIHNlY3Rpb25zIGlmIG5vIHNlY3Rpb24gc3BlY2lmaWVkXG4gICAgaWYgKCFzZWN0aW9uICYmIGNhdGVnb3JpZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGV4dFBhcnRzLnB1c2goYCoq8J+TmiBDb2xsZWN0aW9uIFNlY3Rpb25zICgke2NhdGVnb3JpZXMubGVuZ3RofSk6KipcXG5gKTtcbiAgICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoc2VjOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbkljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICdsaWJyYXJ5JzogJ/Cfk5YnLFxuICAgICAgICAgICdzaG93Y2FzZSc6ICfirZAnLFxuICAgICAgICAgICdjYXRhbG9nJzogJ/Cfko4nXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGljb24gPSBzZWN0aW9uSWNvbnNbc2VjLm5hbWVdIHx8ICfwn5OBJztcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICdsaWJyYXJ5JzogJ0ZyZWUgY29tbXVuaXR5IGNvbnRlbnQnLFxuICAgICAgICAgICdzaG93Y2FzZSc6ICdGZWF0dXJlZCBoaWdoLXF1YWxpdHkgY29udGVudCcsXG4gICAgICAgICAgJ2NhdGFsb2cnOiAnUHJlbWl1bSBjb250ZW50IChjb21pbmcgc29vbiknXG4gICAgICAgIH07XG4gICAgICAgIHRleHRQYXJ0cy5wdXNoKFxuICAgICAgICAgIGAgICAke2ljb259ICoqJHtzZWMubmFtZX0qKiAtICR7ZGVzY3JpcHRpb25zW3NlYy5uYW1lXSB8fCAnQ29udGVudCBjb2xsZWN0aW9uJ31cXG5gLFxuICAgICAgICAgIGAgICAgICBCcm93c2U6IFxcYGJyb3dzZV9jb2xsZWN0aW9uIFwiJHtzZWMubmFtZX1cIlxcYFxcblxcbmBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRleHRQYXJ0cy5qb2luKCcnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU2hvdyBjb250ZW50IHR5cGVzIHdpdGhpbiBsaWJyYXJ5IHNlY3Rpb25cbiAgICBpZiAoc2VjdGlvbiA9PT0gJ2xpYnJhcnknICYmICFjYXRlZ29yeSAmJiBjYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRleHRQYXJ0cy5wdXNoKGAqKvCfk5YgTGlicmFyeSBDb250ZW50IFR5cGVzICgke2NhdGVnb3JpZXMubGVuZ3RofSk6KipcXG5gKTtcbiAgICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZUljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICdwZXJzb25hcyc6ICfwn46tJyxcbiAgICAgICAgICAnc2tpbGxzJzogJ/Cfm6DvuI8nLFxuICAgICAgICAgICdhZ2VudHMnOiAn8J+klicsXG4gICAgICAgICAgJ3Byb21wdHMnOiAn8J+SrCcsXG4gICAgICAgICAgJ3RlbXBsYXRlcyc6ICfwn5OEJyxcbiAgICAgICAgICAndG9vbHMnOiAn8J+UpycsXG4gICAgICAgICAgJ2Vuc2VtYmxlcyc6ICfwn468J1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpY29uID0gdHlwZUljb25zW2NhdC5uYW1lXSB8fCAn8J+TgSc7XG4gICAgICAgIHRleHRQYXJ0cy5wdXNoKGAgICAke2ljb259ICoqJHtjYXQubmFtZX0qKiAtIEJyb3dzZTogXFxgYnJvd3NlX2NvbGxlY3Rpb24gXCJsaWJyYXJ5XCIgXCIke2NhdC5uYW1lfVwiXFxgXFxuYCk7XG4gICAgICB9KTtcbiAgICAgIHRleHRQYXJ0cy5wdXNoKCdcXG4nKTtcbiAgICB9IGVsc2UgaWYgKGNhdGVnb3JpZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGV4dFBhcnRzLnB1c2goYCoq8J+TgSBDYXRlZ29yaWVzIGluICR7c2VjdGlvbn0ke2NhdGVnb3J5ID8gYC8ke2NhdGVnb3J5fWAgOiAnJ30gKCR7Y2F0ZWdvcmllcy5sZW5ndGh9KToqKlxcbmApO1xuICAgICAgY2F0ZWdvcmllcy5mb3JFYWNoKChjYXQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBicm93c2VQYXRoID0gY2F0ZWdvcnkgPyBgXCIke3NlY3Rpb259XCIgXCIke2NhdGVnb3J5fS8ke2NhdC5uYW1lfVwiYCA6IGBcIiR7c2VjdGlvbn1cIiBcIiR7Y2F0Lm5hbWV9XCJgO1xuICAgICAgICB0ZXh0UGFydHMucHVzaChgICAg8J+TgiAqKiR7Y2F0Lm5hbWV9KiogLSBCcm93c2U6IFxcYGJyb3dzZV9jb2xsZWN0aW9uICR7YnJvd3NlUGF0aH1cXGBcXG5gKTtcbiAgICAgIH0pO1xuICAgICAgdGV4dFBhcnRzLnB1c2goJ1xcbicpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBjYXRlZ29yeT8uc3BsaXQoJy8nKS5wb3AoKSB8fCAnY29udGVudCc7XG4gICAgICBjb25zdCBjb250ZW50SWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICdwZXJzb25hcyc6ICfwn46tJyxcbiAgICAgICAgJ3NraWxscyc6ICfwn5ug77iPJyxcbiAgICAgICAgJ2FnZW50cyc6ICfwn6SWJyxcbiAgICAgICAgJ3Byb21wdHMnOiAn8J+SrCcsXG4gICAgICAgICd0ZW1wbGF0ZXMnOiAn8J+ThCcsXG4gICAgICAgICd0b29scyc6ICfwn5SnJyxcbiAgICAgICAgJ2Vuc2VtYmxlcyc6ICfwn468J1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGljb24gPSBjb250ZW50SWNvbnNbY29udGVudFR5cGVdIHx8ICfwn5OEJztcbiAgICAgIFxuICAgICAgdGV4dFBhcnRzLnB1c2goYCoqJHtpY29ufSAke2NvbnRlbnRUeXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgY29udGVudFR5cGUuc2xpY2UoMSl9IGluICR7c2VjdGlvbn0ke2NhdGVnb3J5ID8gYC8ke2NhdGVnb3J5fWAgOiAnJ30gKCR7aXRlbXMubGVuZ3RofSk6KipcXG5gKTtcbiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHNlY3Rpb24gKyAoY2F0ZWdvcnkgPyBgLyR7Y2F0ZWdvcnl9YCA6ICcnKSArIGAvJHtpdGVtLm5hbWV9YDtcbiAgICAgICAgdGV4dFBhcnRzLnB1c2goXG4gICAgICAgICAgYCAgIOKWq++4jyAqKiR7aXRlbS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKX0qKlxcbmAsXG4gICAgICAgICAgYCAgICAgIPCfk6UgSW5zdGFsbDogXFxgaW5zdGFsbF9jb250ZW50IFwiJHtmdWxsUGF0aH1cIlxcYFxcbmAsXG4gICAgICAgICAgYCAgICAgIPCfkYHvuI8gRGV0YWlsczogXFxgZ2V0X2NvbGxlY3Rpb25fY29udGVudCBcIiR7ZnVsbFBhdGh9XCJcXGBcXG5cXG5gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRleHRQYXJ0cy5qb2luKCcnKTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Search for content in the collection
3
+ */
4
+ import { GitHubClient } from './GitHubClient.js';
5
+ export declare class MarketplaceSearch {
6
+ private githubClient;
7
+ private searchBaseUrl;
8
+ constructor(githubClient: GitHubClient);
9
+ /**
10
+ * Search collection for content matching query
11
+ */
12
+ searchCollection(query: string): Promise<any[]>;
13
+ /**
14
+ * Format search results
15
+ */
16
+ formatSearchResults(items: any[], query: string, personaIndicator?: string): string;
17
+ }
18
+ //# sourceMappingURL=MarketplaceSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketplaceSearch.d.ts","sourceRoot":"","sources":["../../src/collection/MarketplaceSearch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAwC;gBAEjD,YAAY,EAAE,YAAY;IAItC;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAYrD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;CAiCxF"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Search for content in the collection
3
+ */
4
+ export class MarketplaceSearch {
5
+ githubClient;
6
+ searchBaseUrl = 'https://api.github.com/search/code';
7
+ constructor(githubClient) {
8
+ this.githubClient = githubClient;
9
+ }
10
+ /**
11
+ * Search collection for content matching query
12
+ */
13
+ async searchCollection(query) {
14
+ const searchUrl = `${this.searchBaseUrl}?q=${encodeURIComponent(query)}+repo:DollhouseMCP/collection+path:library+extension:md`;
15
+ const data = await this.githubClient.fetchFromGitHub(searchUrl);
16
+ if (!data.items) {
17
+ return [];
18
+ }
19
+ return data.items;
20
+ }
21
+ /**
22
+ * Format search results
23
+ */
24
+ formatSearchResults(items, query, personaIndicator = '') {
25
+ if (items.length === 0) {
26
+ return `${personaIndicator}🔍 No content found for query: "${query}"`;
27
+ }
28
+ const textParts = [`${personaIndicator}🔍 **Search Results for "${query}"** (${items.length} found)\n\n`];
29
+ items.forEach((item) => {
30
+ // Extract content type from path (library/personas/creative/writer.md -> personas)
31
+ const pathParts = item.path.split('/');
32
+ const contentType = pathParts[1] || 'content';
33
+ const contentIcons = {
34
+ 'personas': '🎭',
35
+ 'skills': '🛠️',
36
+ 'agents': '🤖',
37
+ 'prompts': '💬',
38
+ 'templates': '📄',
39
+ 'tools': '🔧',
40
+ 'ensembles': '🎼'
41
+ };
42
+ const icon = contentIcons[contentType] || '📄';
43
+ textParts.push(` ${icon} **${item.name.replace('.md', '')}**\n`, ` 📂 Path: ${item.path}\n`, ` 📥 Install: \`install_content "${item.path}"\`\n`, ` 👁️ Details: \`get_marketplace_content "${item.path}"\`\n\n`);
44
+ });
45
+ return textParts.join('');
46
+ }
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFya2V0cGxhY2VTZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sbGVjdGlvbi9NYXJrZXRwbGFjZVNlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUFDcEIsWUFBWSxDQUFlO0lBQzNCLGFBQWEsR0FBRyxvQ0FBb0MsQ0FBQztJQUU3RCxZQUFZLFlBQTBCO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsTUFBTSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMseURBQXlELENBQUM7UUFFaEksTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUIsQ0FBQyxLQUFZLEVBQUUsS0FBYSxFQUFFLG1CQUEyQixFQUFFO1FBQzVFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEdBQUcsZ0JBQWdCLG1DQUFtQyxLQUFLLEdBQUcsQ0FBQztRQUN4RSxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQiw0QkFBNEIsS0FBSyxRQUFRLEtBQUssQ0FBQyxNQUFNLGFBQWEsQ0FBQyxDQUFDO1FBRTFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUMxQixtRkFBbUY7WUFDbkYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUU5QyxNQUFNLFlBQVksR0FBOEI7Z0JBQzlDLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixRQUFRLEVBQUUsS0FBSztnQkFDZixRQUFRLEVBQUUsSUFBSTtnQkFDZCxTQUFTLEVBQUUsSUFBSTtnQkFDZixXQUFXLEVBQUUsSUFBSTtnQkFDakIsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsV0FBVyxFQUFFLElBQUk7YUFDbEIsQ0FBQztZQUNGLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUM7WUFFL0MsU0FBUyxDQUFDLElBQUksQ0FDWixNQUFNLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFDbEQsa0JBQWtCLElBQUksQ0FBQyxJQUFJLElBQUksRUFDL0Isd0NBQXdDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFDeEQsaURBQWlELElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FDcEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VhcmNoIGZvciBjb250ZW50IGluIHRoZSBjb2xsZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgR2l0SHViQ2xpZW50IH0gZnJvbSAnLi9HaXRIdWJDbGllbnQuanMnO1xuXG5leHBvcnQgY2xhc3MgTWFya2V0cGxhY2VTZWFyY2gge1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIHNlYXJjaEJhc2VVcmwgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9zZWFyY2gvY29kZSc7XG4gIFxuICBjb25zdHJ1Y3RvcihnaXRodWJDbGllbnQ6IEdpdEh1YkNsaWVudCkge1xuICAgIHRoaXMuZ2l0aHViQ2xpZW50ID0gZ2l0aHViQ2xpZW50O1xuICB9XG4gIFxuICAvKipcbiAgICogU2VhcmNoIGNvbGxlY3Rpb24gZm9yIGNvbnRlbnQgbWF0Y2hpbmcgcXVlcnlcbiAgICovXG4gIGFzeW5jIHNlYXJjaENvbGxlY3Rpb24ocXVlcnk6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBzZWFyY2hVcmwgPSBgJHt0aGlzLnNlYXJjaEJhc2VVcmx9P3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfStyZXBvOkRvbGxob3VzZU1DUC9jb2xsZWN0aW9uK3BhdGg6bGlicmFyeStleHRlbnNpb246bWRgO1xuICAgIFxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdpdGh1YkNsaWVudC5mZXRjaEZyb21HaXRIdWIoc2VhcmNoVXJsKTtcbiAgICBcbiAgICBpZiAoIWRhdGEuaXRlbXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGRhdGEuaXRlbXM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgc2VhcmNoIHJlc3VsdHNcbiAgICovXG4gIGZvcm1hdFNlYXJjaFJlc3VsdHMoaXRlbXM6IGFueVtdLCBxdWVyeTogc3RyaW5nLCBwZXJzb25hSW5kaWNhdG9yOiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGAke3BlcnNvbmFJbmRpY2F0b3J98J+UjSBObyBjb250ZW50IGZvdW5kIGZvciBxdWVyeTogXCIke3F1ZXJ5fVwiYDtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdGV4dFBhcnRzID0gW2Ake3BlcnNvbmFJbmRpY2F0b3J98J+UjSAqKlNlYXJjaCBSZXN1bHRzIGZvciBcIiR7cXVlcnl9XCIqKiAoJHtpdGVtcy5sZW5ndGh9IGZvdW5kKVxcblxcbmBdO1xuICAgIFxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgLy8gRXh0cmFjdCBjb250ZW50IHR5cGUgZnJvbSBwYXRoIChsaWJyYXJ5L3BlcnNvbmFzL2NyZWF0aXZlL3dyaXRlci5tZCAtPiBwZXJzb25hcylcbiAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IGl0ZW0ucGF0aC5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBwYXRoUGFydHNbMV0gfHwgJ2NvbnRlbnQnO1xuICAgICAgXG4gICAgICBjb25zdCBjb250ZW50SWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICdwZXJzb25hcyc6ICfwn46tJyxcbiAgICAgICAgJ3NraWxscyc6ICfwn5ug77iPJyxcbiAgICAgICAgJ2FnZW50cyc6ICfwn6SWJyxcbiAgICAgICAgJ3Byb21wdHMnOiAn8J+SrCcsXG4gICAgICAgICd0ZW1wbGF0ZXMnOiAn8J+ThCcsXG4gICAgICAgICd0b29scyc6ICfwn5SnJyxcbiAgICAgICAgJ2Vuc2VtYmxlcyc6ICfwn468J1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGljb24gPSBjb250ZW50SWNvbnNbY29udGVudFR5cGVdIHx8ICfwn5OEJztcbiAgICAgIFxuICAgICAgdGV4dFBhcnRzLnB1c2goXG4gICAgICAgIGAgICAke2ljb259ICoqJHtpdGVtLm5hbWUucmVwbGFjZSgnLm1kJywgJycpfSoqXFxuYCxcbiAgICAgICAgYCAgICAgIPCfk4IgUGF0aDogJHtpdGVtLnBhdGh9XFxuYCxcbiAgICAgICAgYCAgICAgIPCfk6UgSW5zdGFsbDogXFxgaW5zdGFsbF9jb250ZW50IFwiJHtpdGVtLnBhdGh9XCJcXGBcXG5gLFxuICAgICAgICBgICAgICAg8J+Rge+4jyBEZXRhaWxzOiBcXGBnZXRfbWFya2V0cGxhY2VfY29udGVudCBcIiR7aXRlbS5wYXRofVwiXFxgXFxuXFxuYFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gdGV4dFBhcnRzLmpvaW4oJycpO1xuICB9XG59Il19
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Install content from collection
3
+ */
4
+ import { GitHubClient } from './GitHubClient.js';
5
+ import { PersonaMetadata } from '../types/persona.js';
6
+ export declare class PersonaInstaller {
7
+ private githubClient;
8
+ private personasDir;
9
+ private portfolioManager;
10
+ private baseUrl;
11
+ constructor(githubClient: GitHubClient, personasDir?: string);
12
+ /**
13
+ * Install content from the collection
14
+ */
15
+ installContent(inputPath: string): Promise<{
16
+ success: boolean;
17
+ message: string;
18
+ metadata?: PersonaMetadata;
19
+ filename?: string;
20
+ }>;
21
+ /**
22
+ * Format installation success message
23
+ */
24
+ formatInstallSuccess(metadata: PersonaMetadata, filename: string, totalPersonas: number, personaIndicator?: string): string;
25
+ }
26
+ //# sourceMappingURL=PersonaInstaller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonaInstaller.d.ts","sourceRoot":"","sources":["../../src/collection/PersonaInstaller.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAQtD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,OAAO,CAAmE;gBAEtE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM;IAM5D;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,eAAe,CAAC;QAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAiFF;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;CAOhI"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Install content from collection
3
+ */
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ import { validatePath, validateFilename, validateContentSize } from '../security/InputValidator.js';
7
+ import { SECURITY_LIMITS } from '../security/constants.js';
8
+ import { ContentValidator } from '../security/contentValidator.js';
9
+ import { SecureYamlParser } from '../security/secureYamlParser.js';
10
+ import { SecurityError } from '../errors/SecurityError.js';
11
+ import { PortfolioManager, ElementType } from '../portfolio/PortfolioManager.js';
12
+ export class PersonaInstaller {
13
+ githubClient;
14
+ personasDir;
15
+ portfolioManager;
16
+ baseUrl = 'https://api.github.com/repos/DollhouseMCP/collection/contents';
17
+ constructor(githubClient, personasDir) {
18
+ this.githubClient = githubClient;
19
+ this.portfolioManager = PortfolioManager.getInstance();
20
+ this.personasDir = personasDir || this.portfolioManager.getElementDir(ElementType.PERSONA);
21
+ }
22
+ /**
23
+ * Install content from the collection
24
+ */
25
+ async installContent(inputPath) {
26
+ // Validate and sanitize the input path
27
+ const sanitizedPath = validatePath(inputPath);
28
+ // Ensure the path ends with .md
29
+ if (!sanitizedPath.endsWith('.md')) {
30
+ throw new Error('Invalid file type. Only .md files are allowed.');
31
+ }
32
+ const url = `${this.baseUrl}/${sanitizedPath}`;
33
+ const data = await this.githubClient.fetchFromGitHub(url);
34
+ if (data.type !== 'file') {
35
+ throw new Error('Path does not point to a file');
36
+ }
37
+ // Check file size before downloading
38
+ if (data.size > SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES) {
39
+ throw new Error(`File too large (${data.size} bytes, max ${SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES} bytes)`);
40
+ }
41
+ // Decode Base64 content
42
+ const content = Buffer.from(data.content, 'base64').toString('utf-8');
43
+ // Validate content size after decoding
44
+ validateContentSize(content, SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES);
45
+ // Sanitize content for security threats
46
+ const sanitizedContent = ContentValidator.sanitizePersonaContent(content);
47
+ // Use secure YAML parser
48
+ let parsed;
49
+ try {
50
+ parsed = SecureYamlParser.safeMatter(sanitizedContent);
51
+ }
52
+ catch (error) {
53
+ if (error instanceof SecurityError) {
54
+ throw new Error(`Security threat in content: ${error.message}`);
55
+ }
56
+ throw error;
57
+ }
58
+ const metadata = parsed.data;
59
+ // Additional metadata validation for injection attacks
60
+ const metadataValidation = ContentValidator.validateMetadata(metadata);
61
+ if (!metadataValidation.isValid) {
62
+ throw new Error(`Security validation failed: ${metadataValidation.detectedPatterns?.join(', ')}`);
63
+ }
64
+ // Validate metadata
65
+ if (!metadata.name || !metadata.description) {
66
+ throw new Error('Invalid content: missing required name or description');
67
+ }
68
+ // Generate and validate local filename
69
+ const originalFilename = sanitizedPath.split('/').pop() || 'downloaded-persona.md';
70
+ const filename = validateFilename(originalFilename);
71
+ const localPath = path.join(this.personasDir, filename);
72
+ // Check if file already exists
73
+ try {
74
+ await fs.access(localPath);
75
+ return {
76
+ success: false,
77
+ message: `Content already exists: ${filename}\n\nUse \`reload_personas\` to refresh if you've updated it manually.`
78
+ };
79
+ }
80
+ catch {
81
+ // File doesn't exist, proceed with installation
82
+ }
83
+ // Write the sanitized file
84
+ await fs.writeFile(localPath, sanitizedContent, 'utf-8');
85
+ return {
86
+ success: true,
87
+ message: `Content installed successfully!`,
88
+ metadata,
89
+ filename
90
+ };
91
+ }
92
+ /**
93
+ * Format installation success message
94
+ */
95
+ formatInstallSuccess(metadata, filename, totalPersonas, personaIndicator = '') {
96
+ return `${personaIndicator}✅ **Content Installed Successfully!**\n\n` +
97
+ `🎭 **${metadata.name}** by ${metadata.author}\n` +
98
+ `📁 Saved as: ${filename}\n` +
99
+ `📊 Total personas: ${totalPersonas}\n\n` +
100
+ `🎯 **Ready to use:** \`activate_persona "${metadata.name}"\``;
101
+ }
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYUluc3RhbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2xsZWN0aW9uL1BlcnNvbmFJbnN0YWxsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUk3QixPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFakYsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixZQUFZLENBQWU7SUFDM0IsV0FBVyxDQUFTO0lBQ3BCLGdCQUFnQixDQUFtQjtJQUNuQyxPQUFPLEdBQUcsK0RBQStELENBQUM7SUFFbEYsWUFBWSxZQUEwQixFQUFFLFdBQW9CO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQWlCO1FBTXBDLHVDQUF1QztRQUN2QyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFOUMsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksYUFBYSxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUxRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxJQUFJLGVBQWUsZUFBZSxDQUFDLHNCQUFzQixTQUFTLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEUsdUNBQXVDO1FBQ3ZDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVyRSx3Q0FBd0M7UUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxRSx5QkFBeUI7UUFDekIsSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSxhQUFhLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUF1QixDQUFDO1FBRWhELHVEQUF1RDtRQUN2RCxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFFRCx1Q0FBdUM7UUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLHVCQUF1QixDQUFDO1FBQ25GLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXhELCtCQUErQjtRQUMvQixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0IsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsMkJBQTJCLFFBQVEsdUVBQXVFO2FBQ3BILENBQUM7UUFDSixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsZ0RBQWdEO1FBQ2xELENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV6RCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsaUNBQWlDO1lBQzFDLFFBQVE7WUFDUixRQUFRO1NBQ1QsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixDQUFDLFFBQXlCLEVBQUUsUUFBZ0IsRUFBRSxhQUFxQixFQUFFLG1CQUEyQixFQUFFO1FBQ3BILE9BQU8sR0FBRyxnQkFBZ0IsMkNBQTJDO1lBQ25FLFFBQVEsUUFBUSxDQUFDLElBQUksU0FBUyxRQUFRLENBQUMsTUFBTSxJQUFJO1lBQ2pELGdCQUFnQixRQUFRLElBQUk7WUFDNUIsc0JBQXNCLGFBQWEsTUFBTTtZQUN6Qyw0Q0FBNEMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ25FLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW5zdGFsbCBjb250ZW50IGZyb20gY29sbGVjdGlvblxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbWF0dGVyIGZyb20gJ2dyYXktbWF0dGVyJztcbmltcG9ydCB7IEdpdEh1YkNsaWVudCB9IGZyb20gJy4vR2l0SHViQ2xpZW50LmpzJztcbmltcG9ydCB7IFBlcnNvbmFNZXRhZGF0YSB9IGZyb20gJy4uL3R5cGVzL3BlcnNvbmEuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQYXRoLCB2YWxpZGF0ZUZpbGVuYW1lLCB2YWxpZGF0ZUNvbnRlbnRTaXplIH0gZnJvbSAnLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvU2VjdXJpdHlFcnJvci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyLCBFbGVtZW50VHlwZSB9IGZyb20gJy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcblxuZXhwb3J0IGNsYXNzIFBlcnNvbmFJbnN0YWxsZXIge1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIHBlcnNvbmFzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSBiYXNlVXJsID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vY29udGVudHMnO1xuICBcbiAgY29uc3RydWN0b3IoZ2l0aHViQ2xpZW50OiBHaXRIdWJDbGllbnQsIHBlcnNvbmFzRGlyPzogc3RyaW5nKSB7XG4gICAgdGhpcy5naXRodWJDbGllbnQgPSBnaXRodWJDbGllbnQ7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHRoaXMucGVyc29uYXNEaXIgPSBwZXJzb25hc0RpciB8fCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5QRVJTT05BKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEluc3RhbGwgY29udGVudCBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAqL1xuICBhc3luYyBpbnN0YWxsQ29udGVudChpbnB1dFBhdGg6IHN0cmluZyk6IFByb21pc2U8eyBcbiAgICBzdWNjZXNzOiBib29sZWFuOyBcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBQZXJzb25hTWV0YWRhdGE7XG4gICAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICAvLyBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGlucHV0IHBhdGhcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gdmFsaWRhdGVQYXRoKGlucHV0UGF0aCk7XG4gICAgXG4gICAgLy8gRW5zdXJlIHRoZSBwYXRoIGVuZHMgd2l0aCAubWRcbiAgICBpZiAoIXNhbml0aXplZFBhdGguZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmlsZSB0eXBlLiBPbmx5IC5tZCBmaWxlcyBhcmUgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS8ke3Nhbml0aXplZFBhdGh9YDtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5naXRodWJDbGllbnQuZmV0Y2hGcm9tR2l0SHViKHVybCk7XG4gICAgXG4gICAgaWYgKGRhdGEudHlwZSAhPT0gJ2ZpbGUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggZG9lcyBub3QgcG9pbnQgdG8gYSBmaWxlJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZpbGUgc2l6ZSBiZWZvcmUgZG93bmxvYWRpbmdcbiAgICBpZiAoZGF0YS5zaXplID4gU0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSB0b28gbGFyZ2UgKCR7ZGF0YS5zaXplfSBieXRlcywgbWF4ICR7U0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVN9IGJ5dGVzKWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZWNvZGUgQmFzZTY0IGNvbnRlbnRcbiAgICBjb25zdCBjb250ZW50ID0gQnVmZmVyLmZyb20oZGF0YS5jb250ZW50LCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgY29udGVudCBzaXplIGFmdGVyIGRlY29kaW5nXG4gICAgdmFsaWRhdGVDb250ZW50U2l6ZShjb250ZW50LCBTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFUyk7XG4gICAgXG4gICAgLy8gU2FuaXRpemUgY29udGVudCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBDb250ZW50VmFsaWRhdG9yLnNhbml0aXplUGVyc29uYUNvbnRlbnQoY29udGVudCk7XG4gICAgXG4gICAgLy8gVXNlIHNlY3VyZSBZQU1MIHBhcnNlclxuICAgIGxldCBwYXJzZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihzYW5pdGl6ZWRDb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlY3VyaXR5IHRocmVhdCBpbiBjb250ZW50OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWQuZGF0YSBhcyBQZXJzb25hTWV0YWRhdGE7XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCBtZXRhZGF0YSB2YWxpZGF0aW9uIGZvciBpbmplY3Rpb24gYXR0YWNrc1xuICAgIGNvbnN0IG1ldGFkYXRhVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgaWYgKCFtZXRhZGF0YVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWN1cml0eSB2YWxpZGF0aW9uIGZhaWxlZDogJHttZXRhZGF0YVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgbWV0YWRhdGFcbiAgICBpZiAoIW1ldGFkYXRhLm5hbWUgfHwgIW1ldGFkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29udGVudDogbWlzc2luZyByZXF1aXJlZCBuYW1lIG9yIGRlc2NyaXB0aW9uJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEdlbmVyYXRlIGFuZCB2YWxpZGF0ZSBsb2NhbCBmaWxlbmFtZVxuICAgIGNvbnN0IG9yaWdpbmFsRmlsZW5hbWUgPSBzYW5pdGl6ZWRQYXRoLnNwbGl0KCcvJykucG9wKCkgfHwgJ2Rvd25sb2FkZWQtcGVyc29uYS5tZCc7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB2YWxpZGF0ZUZpbGVuYW1lKG9yaWdpbmFsRmlsZW5hbWUpO1xuICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBmaWxlbmFtZSk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MobG9jYWxQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgQ29udGVudCBhbHJlYWR5IGV4aXN0czogJHtmaWxlbmFtZX1cXG5cXG5Vc2UgXFxgcmVsb2FkX3BlcnNvbmFzXFxgIHRvIHJlZnJlc2ggaWYgeW91J3ZlIHVwZGF0ZWQgaXQgbWFudWFsbHkuYFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZCB3aXRoIGluc3RhbGxhdGlvblxuICAgIH1cbiAgICBcbiAgICAvLyBXcml0ZSB0aGUgc2FuaXRpemVkIGZpbGVcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxQYXRoLCBzYW5pdGl6ZWRDb250ZW50LCAndXRmLTgnKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBDb250ZW50IGluc3RhbGxlZCBzdWNjZXNzZnVsbHkhYCxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgZmlsZW5hbWVcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogRm9ybWF0IGluc3RhbGxhdGlvbiBzdWNjZXNzIG1lc3NhZ2VcbiAgICovXG4gIGZvcm1hdEluc3RhbGxTdWNjZXNzKG1ldGFkYXRhOiBQZXJzb25hTWV0YWRhdGEsIGZpbGVuYW1lOiBzdHJpbmcsIHRvdGFsUGVyc29uYXM6IG51bWJlciwgcGVyc29uYUluZGljYXRvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwZXJzb25hSW5kaWNhdG9yfeKchSAqKkNvbnRlbnQgSW5zdGFsbGVkIFN1Y2Nlc3NmdWxseSEqKlxcblxcbmAgK1xuICAgICAgYPCfjq0gKioke21ldGFkYXRhLm5hbWV9KiogYnkgJHttZXRhZGF0YS5hdXRob3J9XFxuYCArXG4gICAgICBg8J+TgSBTYXZlZCBhczogJHtmaWxlbmFtZX1cXG5gICtcbiAgICAgIGDwn5OKIFRvdGFsIHBlcnNvbmFzOiAke3RvdGFsUGVyc29uYXN9XFxuXFxuYCArXG4gICAgICBg8J+OryAqKlJlYWR5IHRvIHVzZToqKiBcXGBhY3RpdmF0ZV9wZXJzb25hIFwiJHttZXRhZGF0YS5uYW1lfVwiXFxgYDtcbiAgfVxufSJdfQ==