@dollhousemcp/mcp-server 1.3.0 → 1.3.2

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 (623) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +12 -12
  3. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  4. package/dist/server/tools/CollectionTools.js +47 -2
  5. package/package.json +1 -1
  6. package/dist/collection/MarketplaceBrowser.d.ts +0 -24
  7. package/dist/collection/MarketplaceBrowser.d.ts.map +0 -1
  8. package/dist/collection/MarketplaceBrowser.js +0 -115
  9. package/dist/collection/MarketplaceSearch.d.ts +0 -18
  10. package/dist/collection/MarketplaceSearch.d.ts.map +0 -1
  11. package/dist/collection/MarketplaceSearch.js +0 -48
  12. package/dist/collection/PersonaInstaller.d.ts +0 -26
  13. package/dist/collection/PersonaInstaller.d.ts.map +0 -1
  14. package/dist/collection/PersonaInstaller.js +0 -103
  15. package/dist/marketplace/GitHubClient.d.ts +0 -22
  16. package/dist/marketplace/GitHubClient.d.ts.map +0 -1
  17. package/dist/marketplace/GitHubClient.js +0 -112
  18. package/dist/marketplace/MarketplaceBrowser.d.ts +0 -24
  19. package/dist/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  20. package/dist/marketplace/MarketplaceBrowser.js +0 -115
  21. package/dist/marketplace/MarketplaceSearch.d.ts +0 -18
  22. package/dist/marketplace/MarketplaceSearch.d.ts.map +0 -1
  23. package/dist/marketplace/MarketplaceSearch.js +0 -48
  24. package/dist/marketplace/PersonaDetails.d.ts +0 -22
  25. package/dist/marketplace/PersonaDetails.d.ts.map +0 -1
  26. package/dist/marketplace/PersonaDetails.js +0 -71
  27. package/dist/marketplace/PersonaInstaller.d.ts +0 -25
  28. package/dist/marketplace/PersonaInstaller.d.ts.map +0 -1
  29. package/dist/marketplace/PersonaInstaller.js +0 -100
  30. package/dist/marketplace/PersonaSubmitter.d.ts +0 -19
  31. package/dist/marketplace/PersonaSubmitter.d.ts.map +0 -1
  32. package/dist/marketplace/PersonaSubmitter.js +0 -57
  33. package/dist/marketplace/index.d.ts +0 -10
  34. package/dist/marketplace/index.d.ts.map +0 -1
  35. package/dist/marketplace/index.js +0 -10
  36. package/dist/server/tools/MarketplaceTools.d.ts +0 -10
  37. package/dist/server/tools/MarketplaceTools.d.ts.map +0 -1
  38. package/dist/server/tools/MarketplaceTools.js +0 -96
  39. package/dist/src/cache/APICache.d.ts +0 -23
  40. package/dist/src/cache/APICache.d.ts.map +0 -1
  41. package/dist/src/cache/APICache.js +0 -42
  42. package/dist/src/cache/index.d.ts +0 -5
  43. package/dist/src/cache/index.d.ts.map +0 -1
  44. package/dist/src/cache/index.js +0 -5
  45. package/dist/src/config/constants.d.ts +0 -25
  46. package/dist/src/config/constants.d.ts.map +0 -1
  47. package/dist/src/config/constants.js +0 -30
  48. package/dist/src/config/index.d.ts +0 -6
  49. package/dist/src/config/index.d.ts.map +0 -1
  50. package/dist/src/config/index.js +0 -6
  51. package/dist/src/config/indicator-config.d.ts +0 -107
  52. package/dist/src/config/indicator-config.d.ts.map +0 -1
  53. package/dist/src/config/indicator-config.js +0 -158
  54. package/dist/src/constants/defaultPersonas.d.ts +0 -10
  55. package/dist/src/constants/defaultPersonas.d.ts.map +0 -1
  56. package/dist/src/constants/defaultPersonas.js +0 -18
  57. package/dist/src/constants/limits.d.ts +0 -10
  58. package/dist/src/constants/limits.d.ts.map +0 -1
  59. package/dist/src/constants/limits.js +0 -13
  60. package/dist/src/errors/SecurityError.d.ts +0 -29
  61. package/dist/src/errors/SecurityError.d.ts.map +0 -1
  62. package/dist/src/errors/SecurityError.js +0 -47
  63. package/dist/src/errors/index.d.ts +0 -2
  64. package/dist/src/errors/index.d.ts.map +0 -1
  65. package/dist/src/errors/index.js +0 -2
  66. package/dist/src/index.barrel.d.ts +0 -21
  67. package/dist/src/index.barrel.d.ts.map +0 -1
  68. package/dist/src/index.barrel.js +0 -31
  69. package/dist/src/index.d.ts +0 -220
  70. package/dist/src/index.d.ts.map +0 -1
  71. package/dist/src/index.js +0 -1559
  72. package/dist/src/marketplace/GitHubClient.d.ts +0 -22
  73. package/dist/src/marketplace/GitHubClient.d.ts.map +0 -1
  74. package/dist/src/marketplace/GitHubClient.js +0 -112
  75. package/dist/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  76. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  77. package/dist/src/marketplace/MarketplaceBrowser.js +0 -45
  78. package/dist/src/marketplace/MarketplaceSearch.d.ts +0 -18
  79. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  80. package/dist/src/marketplace/MarketplaceSearch.js +0 -36
  81. package/dist/src/marketplace/PersonaDetails.d.ts +0 -22
  82. package/dist/src/marketplace/PersonaDetails.d.ts.map +0 -1
  83. package/dist/src/marketplace/PersonaDetails.js +0 -71
  84. package/dist/src/marketplace/PersonaInstaller.d.ts +0 -25
  85. package/dist/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  86. package/dist/src/marketplace/PersonaInstaller.js +0 -100
  87. package/dist/src/marketplace/PersonaSubmitter.d.ts +0 -19
  88. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  89. package/dist/src/marketplace/PersonaSubmitter.js +0 -57
  90. package/dist/src/marketplace/index.d.ts +0 -10
  91. package/dist/src/marketplace/index.d.ts.map +0 -1
  92. package/dist/src/marketplace/index.js +0 -10
  93. package/dist/src/persona/PersonaLoader.d.ts +0 -33
  94. package/dist/src/persona/PersonaLoader.d.ts.map +0 -1
  95. package/dist/src/persona/PersonaLoader.js +0 -139
  96. package/dist/src/persona/PersonaManager.d.ts +0 -112
  97. package/dist/src/persona/PersonaManager.d.ts.map +0 -1
  98. package/dist/src/persona/PersonaManager.js +0 -341
  99. package/dist/src/persona/PersonaValidator.d.ts +0 -33
  100. package/dist/src/persona/PersonaValidator.d.ts.map +0 -1
  101. package/dist/src/persona/PersonaValidator.js +0 -157
  102. package/dist/src/persona/export-import/PersonaExporter.d.ts +0 -43
  103. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  104. package/dist/src/persona/export-import/PersonaExporter.js +0 -99
  105. package/dist/src/persona/export-import/PersonaImporter.d.ts +0 -65
  106. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  107. package/dist/src/persona/export-import/PersonaImporter.js +0 -313
  108. package/dist/src/persona/export-import/PersonaSharer.d.ts +0 -60
  109. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  110. package/dist/src/persona/export-import/PersonaSharer.js +0 -363
  111. package/dist/src/persona/export-import/index.d.ts +0 -10
  112. package/dist/src/persona/export-import/index.d.ts.map +0 -1
  113. package/dist/src/persona/export-import/index.js +0 -7
  114. package/dist/src/persona/index.d.ts +0 -7
  115. package/dist/src/persona/index.d.ts.map +0 -1
  116. package/dist/src/persona/index.js +0 -7
  117. package/dist/src/security/InputValidator.d.ts +0 -69
  118. package/dist/src/security/InputValidator.d.ts.map +0 -1
  119. package/dist/src/security/InputValidator.js +0 -381
  120. package/dist/src/security/commandValidator.d.ts +0 -7
  121. package/dist/src/security/commandValidator.d.ts.map +0 -1
  122. package/dist/src/security/commandValidator.js +0 -77
  123. package/dist/src/security/constants.d.ts +0 -21
  124. package/dist/src/security/constants.d.ts.map +0 -1
  125. package/dist/src/security/constants.js +0 -23
  126. package/dist/src/security/contentValidator.d.ts +0 -47
  127. package/dist/src/security/contentValidator.d.ts.map +0 -1
  128. package/dist/src/security/contentValidator.js +0 -188
  129. package/dist/src/security/fileLockManager.d.ts +0 -70
  130. package/dist/src/security/fileLockManager.d.ts.map +0 -1
  131. package/dist/src/security/fileLockManager.js +0 -187
  132. package/dist/src/security/index.d.ts +0 -12
  133. package/dist/src/security/index.d.ts.map +0 -1
  134. package/dist/src/security/index.js +0 -14
  135. package/dist/src/security/pathValidator.d.ts +0 -9
  136. package/dist/src/security/pathValidator.d.ts.map +0 -1
  137. package/dist/src/security/pathValidator.js +0 -97
  138. package/dist/src/security/secureYamlParser.d.ts +0 -46
  139. package/dist/src/security/secureYamlParser.d.ts.map +0 -1
  140. package/dist/src/security/secureYamlParser.js +0 -203
  141. package/dist/src/security/securityMonitor.d.ts +0 -58
  142. package/dist/src/security/securityMonitor.d.ts.map +0 -1
  143. package/dist/src/security/securityMonitor.js +0 -108
  144. package/dist/src/security/tokenManager.d.ts +0 -59
  145. package/dist/src/security/tokenManager.d.ts.map +0 -1
  146. package/dist/src/security/tokenManager.js +0 -216
  147. package/dist/src/security/yamlValidator.d.ts +0 -20
  148. package/dist/src/security/yamlValidator.d.ts.map +0 -1
  149. package/dist/src/security/yamlValidator.js +0 -138
  150. package/dist/src/server/ServerSetup.d.ts +0 -31
  151. package/dist/src/server/ServerSetup.d.ts.map +0 -1
  152. package/dist/src/server/ServerSetup.js +0 -79
  153. package/dist/src/server/index.d.ts +0 -7
  154. package/dist/src/server/index.d.ts.map +0 -1
  155. package/dist/src/server/index.js +0 -7
  156. package/dist/src/server/tools/ConfigTools.d.ts +0 -10
  157. package/dist/src/server/tools/ConfigTools.d.ts.map +0 -1
  158. package/dist/src/server/tools/ConfigTools.js +0 -63
  159. package/dist/src/server/tools/MarketplaceTools.d.ts +0 -10
  160. package/dist/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  161. package/dist/src/server/tools/MarketplaceTools.js +0 -92
  162. package/dist/src/server/tools/PersonaTools.d.ts +0 -10
  163. package/dist/src/server/tools/PersonaTools.d.ts.map +0 -1
  164. package/dist/src/server/tools/PersonaTools.js +0 -257
  165. package/dist/src/server/tools/ToolRegistry.d.ts +0 -37
  166. package/dist/src/server/tools/ToolRegistry.d.ts.map +0 -1
  167. package/dist/src/server/tools/ToolRegistry.js +0 -40
  168. package/dist/src/server/tools/UpdateTools.d.ts +0 -10
  169. package/dist/src/server/tools/UpdateTools.d.ts.map +0 -1
  170. package/dist/src/server/tools/UpdateTools.js +0 -64
  171. package/dist/src/server/tools/UserTools.d.ts +0 -10
  172. package/dist/src/server/tools/UserTools.d.ts.map +0 -1
  173. package/dist/src/server/tools/UserTools.js +0 -51
  174. package/dist/src/server/tools/index.d.ts +0 -10
  175. package/dist/src/server/tools/index.d.ts.map +0 -1
  176. package/dist/src/server/tools/index.js +0 -10
  177. package/dist/src/server/types.d.ts +0 -34
  178. package/dist/src/server/types.d.ts.map +0 -1
  179. package/dist/src/server/types.js +0 -5
  180. package/dist/src/tools/debug.d.ts +0 -20
  181. package/dist/src/tools/debug.d.ts.map +0 -1
  182. package/dist/src/tools/debug.js +0 -37
  183. package/dist/src/types/cache.d.ts +0 -8
  184. package/dist/src/types/cache.d.ts.map +0 -1
  185. package/dist/src/types/cache.js +0 -5
  186. package/dist/src/types/index.d.ts +0 -8
  187. package/dist/src/types/index.d.ts.map +0 -1
  188. package/dist/src/types/index.js +0 -8
  189. package/dist/src/types/marketplace.d.ts +0 -23
  190. package/dist/src/types/marketplace.d.ts.map +0 -1
  191. package/dist/src/types/marketplace.js +0 -5
  192. package/dist/src/types/mcp.d.ts +0 -161
  193. package/dist/src/types/mcp.d.ts.map +0 -1
  194. package/dist/src/types/mcp.js +0 -75
  195. package/dist/src/types/persona.d.ts +0 -30
  196. package/dist/src/types/persona.d.ts.map +0 -1
  197. package/dist/src/types/persona.js +0 -5
  198. package/dist/src/update/BackupManager.d.ts +0 -46
  199. package/dist/src/update/BackupManager.d.ts.map +0 -1
  200. package/dist/src/update/BackupManager.js +0 -261
  201. package/dist/src/update/DependencyChecker.d.ts +0 -41
  202. package/dist/src/update/DependencyChecker.d.ts.map +0 -1
  203. package/dist/src/update/DependencyChecker.js +0 -132
  204. package/dist/src/update/RateLimiter.d.ts +0 -80
  205. package/dist/src/update/RateLimiter.d.ts.map +0 -1
  206. package/dist/src/update/RateLimiter.js +0 -172
  207. package/dist/src/update/SignatureVerifier.d.ts +0 -71
  208. package/dist/src/update/SignatureVerifier.d.ts.map +0 -1
  209. package/dist/src/update/SignatureVerifier.js +0 -214
  210. package/dist/src/update/UpdateChecker.d.ts +0 -127
  211. package/dist/src/update/UpdateChecker.d.ts.map +0 -1
  212. package/dist/src/update/UpdateChecker.js +0 -460
  213. package/dist/src/update/UpdateManager.d.ts +0 -41
  214. package/dist/src/update/UpdateManager.d.ts.map +0 -1
  215. package/dist/src/update/UpdateManager.js +0 -260
  216. package/dist/src/update/VersionManager.d.ts +0 -31
  217. package/dist/src/update/VersionManager.d.ts.map +0 -1
  218. package/dist/src/update/VersionManager.js +0 -134
  219. package/dist/src/update/index.d.ts +0 -9
  220. package/dist/src/update/index.d.ts.map +0 -1
  221. package/dist/src/update/index.js +0 -9
  222. package/dist/src/utils/filesystem.d.ts +0 -32
  223. package/dist/src/utils/filesystem.d.ts.map +0 -1
  224. package/dist/src/utils/filesystem.js +0 -73
  225. package/dist/src/utils/git.d.ts +0 -32
  226. package/dist/src/utils/git.d.ts.map +0 -1
  227. package/dist/src/utils/git.js +0 -65
  228. package/dist/src/utils/index.d.ts +0 -7
  229. package/dist/src/utils/index.d.ts.map +0 -1
  230. package/dist/src/utils/index.js +0 -7
  231. package/dist/src/utils/logger.d.ts +0 -45
  232. package/dist/src/utils/logger.d.ts.map +0 -1
  233. package/dist/src/utils/logger.js +0 -91
  234. package/dist/src/utils/version.d.ts +0 -25
  235. package/dist/src/utils/version.d.ts.map +0 -1
  236. package/dist/src/utils/version.js +0 -97
  237. package/dist/test/src/cache/APICache.d.ts +0 -23
  238. package/dist/test/src/cache/APICache.d.ts.map +0 -1
  239. package/dist/test/src/cache/APICache.js +0 -42
  240. package/dist/test/src/cache/index.d.ts +0 -5
  241. package/dist/test/src/cache/index.d.ts.map +0 -1
  242. package/dist/test/src/cache/index.js +0 -5
  243. package/dist/test/src/collection/CollectionBrowser.d.ts +0 -24
  244. package/dist/test/src/collection/CollectionBrowser.d.ts.map +0 -1
  245. package/dist/test/src/collection/CollectionBrowser.js +0 -115
  246. package/dist/test/src/collection/CollectionSearch.d.ts +0 -18
  247. package/dist/test/src/collection/CollectionSearch.d.ts.map +0 -1
  248. package/dist/test/src/collection/CollectionSearch.js +0 -48
  249. package/dist/test/src/collection/GitHubClient.d.ts +0 -22
  250. package/dist/test/src/collection/GitHubClient.d.ts.map +0 -1
  251. package/dist/test/src/collection/GitHubClient.js +0 -114
  252. package/dist/test/src/collection/PersonaDetails.d.ts +0 -22
  253. package/dist/test/src/collection/PersonaDetails.d.ts.map +0 -1
  254. package/dist/test/src/collection/PersonaDetails.js +0 -71
  255. package/dist/test/src/collection/PersonaInstaller.d.ts +0 -26
  256. package/dist/test/src/collection/PersonaInstaller.d.ts.map +0 -1
  257. package/dist/test/src/collection/PersonaInstaller.js +0 -103
  258. package/dist/test/src/collection/PersonaSubmitter.d.ts +0 -19
  259. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +0 -1
  260. package/dist/test/src/collection/PersonaSubmitter.js +0 -57
  261. package/dist/test/src/collection/index.d.ts +0 -10
  262. package/dist/test/src/collection/index.d.ts.map +0 -1
  263. package/dist/test/src/collection/index.js +0 -10
  264. package/dist/test/src/config/constants.d.ts +0 -25
  265. package/dist/test/src/config/constants.d.ts.map +0 -1
  266. package/dist/test/src/config/constants.js +0 -30
  267. package/dist/test/src/config/index.d.ts +0 -6
  268. package/dist/test/src/config/index.d.ts.map +0 -1
  269. package/dist/test/src/config/index.js +0 -6
  270. package/dist/test/src/config/indicator-config.d.ts +0 -107
  271. package/dist/test/src/config/indicator-config.d.ts.map +0 -1
  272. package/dist/test/src/config/indicator-config.js +0 -158
  273. package/dist/test/src/constants/defaultPersonas.d.ts +0 -10
  274. package/dist/test/src/constants/defaultPersonas.d.ts.map +0 -1
  275. package/dist/test/src/constants/defaultPersonas.js +0 -18
  276. package/dist/test/src/constants/limits.d.ts +0 -10
  277. package/dist/test/src/constants/limits.d.ts.map +0 -1
  278. package/dist/test/src/constants/limits.js +0 -13
  279. package/dist/test/src/elements/BaseElement.d.ts +0 -81
  280. package/dist/test/src/elements/BaseElement.d.ts.map +0 -1
  281. package/dist/test/src/elements/BaseElement.js +0 -381
  282. package/dist/test/src/elements/FeedbackProcessor.d.ts +0 -57
  283. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +0 -1
  284. package/dist/test/src/elements/FeedbackProcessor.js +0 -418
  285. package/dist/test/src/elements/agents/Agent.d.ts +0 -145
  286. package/dist/test/src/elements/agents/Agent.d.ts.map +0 -1
  287. package/dist/test/src/elements/agents/Agent.js +0 -848
  288. package/dist/test/src/elements/agents/AgentManager.d.ts +0 -125
  289. package/dist/test/src/elements/agents/AgentManager.d.ts.map +0 -1
  290. package/dist/test/src/elements/agents/AgentManager.js +0 -608
  291. package/dist/test/src/elements/agents/constants.d.ts +0 -42
  292. package/dist/test/src/elements/agents/constants.d.ts.map +0 -1
  293. package/dist/test/src/elements/agents/constants.js +0 -45
  294. package/dist/test/src/elements/agents/goalTemplates.d.ts +0 -44
  295. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +0 -1
  296. package/dist/test/src/elements/agents/goalTemplates.js +0 -297
  297. package/dist/test/src/elements/agents/index.d.ts +0 -8
  298. package/dist/test/src/elements/agents/index.d.ts.map +0 -1
  299. package/dist/test/src/elements/agents/index.js +0 -8
  300. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +0 -76
  301. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +0 -1
  302. package/dist/test/src/elements/agents/ruleEngineConfig.js +0 -143
  303. package/dist/test/src/elements/agents/types.d.ts +0 -97
  304. package/dist/test/src/elements/agents/types.d.ts.map +0 -1
  305. package/dist/test/src/elements/agents/types.js +0 -5
  306. package/dist/test/src/elements/index.d.ts +0 -6
  307. package/dist/test/src/elements/index.d.ts.map +0 -1
  308. package/dist/test/src/elements/index.js +0 -6
  309. package/dist/test/src/elements/memories/Memory.d.ts +0 -110
  310. package/dist/test/src/elements/memories/Memory.d.ts.map +0 -1
  311. package/dist/test/src/elements/memories/Memory.js +0 -470
  312. package/dist/test/src/elements/memories/MemoryManager.d.ts +0 -86
  313. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +0 -1
  314. package/dist/test/src/elements/memories/MemoryManager.js +0 -435
  315. package/dist/test/src/elements/memories/constants.d.ts +0 -42
  316. package/dist/test/src/elements/memories/constants.d.ts.map +0 -1
  317. package/dist/test/src/elements/memories/constants.js +0 -49
  318. package/dist/test/src/elements/memories/index.d.ts +0 -6
  319. package/dist/test/src/elements/memories/index.d.ts.map +0 -1
  320. package/dist/test/src/elements/memories/index.js +0 -6
  321. package/dist/test/src/elements/skills/Skill.d.ts +0 -109
  322. package/dist/test/src/elements/skills/Skill.d.ts.map +0 -1
  323. package/dist/test/src/elements/skills/Skill.js +0 -381
  324. package/dist/test/src/elements/templates/Template.d.ts +0 -138
  325. package/dist/test/src/elements/templates/Template.d.ts.map +0 -1
  326. package/dist/test/src/elements/templates/Template.js +0 -673
  327. package/dist/test/src/elements/templates/TemplateManager.d.ts +0 -104
  328. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +0 -1
  329. package/dist/test/src/elements/templates/TemplateManager.js +0 -496
  330. package/dist/test/src/elements/templates/index.d.ts +0 -6
  331. package/dist/test/src/elements/templates/index.d.ts.map +0 -1
  332. package/dist/test/src/elements/templates/index.js +0 -6
  333. package/dist/test/src/errors/SecurityError.d.ts +0 -29
  334. package/dist/test/src/errors/SecurityError.d.ts.map +0 -1
  335. package/dist/test/src/errors/SecurityError.js +0 -47
  336. package/dist/test/src/errors/index.d.ts +0 -2
  337. package/dist/test/src/errors/index.d.ts.map +0 -1
  338. package/dist/test/src/errors/index.js +0 -2
  339. package/dist/test/src/index.barrel.d.ts +0 -21
  340. package/dist/test/src/index.barrel.d.ts.map +0 -1
  341. package/dist/test/src/index.barrel.js +0 -31
  342. package/dist/test/src/index.d.ts +0 -223
  343. package/dist/test/src/index.d.ts.map +0 -1
  344. package/dist/test/src/index.js +0 -1594
  345. package/dist/test/src/marketplace/GitHubClient.d.ts +0 -22
  346. package/dist/test/src/marketplace/GitHubClient.d.ts.map +0 -1
  347. package/dist/test/src/marketplace/GitHubClient.js +0 -112
  348. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  349. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  350. package/dist/test/src/marketplace/MarketplaceBrowser.js +0 -45
  351. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +0 -18
  352. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  353. package/dist/test/src/marketplace/MarketplaceSearch.js +0 -36
  354. package/dist/test/src/marketplace/PersonaDetails.d.ts +0 -22
  355. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +0 -1
  356. package/dist/test/src/marketplace/PersonaDetails.js +0 -71
  357. package/dist/test/src/marketplace/PersonaInstaller.d.ts +0 -25
  358. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  359. package/dist/test/src/marketplace/PersonaInstaller.js +0 -100
  360. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +0 -19
  361. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  362. package/dist/test/src/marketplace/PersonaSubmitter.js +0 -57
  363. package/dist/test/src/marketplace/index.d.ts +0 -10
  364. package/dist/test/src/marketplace/index.d.ts.map +0 -1
  365. package/dist/test/src/marketplace/index.js +0 -10
  366. package/dist/test/src/persona/PersonaElement.d.ts +0 -64
  367. package/dist/test/src/persona/PersonaElement.d.ts.map +0 -1
  368. package/dist/test/src/persona/PersonaElement.js +0 -223
  369. package/dist/test/src/persona/PersonaElementManager.d.ts +0 -97
  370. package/dist/test/src/persona/PersonaElementManager.d.ts.map +0 -1
  371. package/dist/test/src/persona/PersonaElementManager.js +0 -342
  372. package/dist/test/src/persona/PersonaLoader.d.ts +0 -34
  373. package/dist/test/src/persona/PersonaLoader.d.ts.map +0 -1
  374. package/dist/test/src/persona/PersonaLoader.js +0 -145
  375. package/dist/test/src/persona/PersonaManager.d.ts +0 -112
  376. package/dist/test/src/persona/PersonaManager.d.ts.map +0 -1
  377. package/dist/test/src/persona/PersonaManager.js +0 -341
  378. package/dist/test/src/persona/PersonaValidator.d.ts +0 -33
  379. package/dist/test/src/persona/PersonaValidator.d.ts.map +0 -1
  380. package/dist/test/src/persona/PersonaValidator.js +0 -157
  381. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +0 -43
  382. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  383. package/dist/test/src/persona/export-import/PersonaExporter.js +0 -99
  384. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +0 -65
  385. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  386. package/dist/test/src/persona/export-import/PersonaImporter.js +0 -315
  387. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +0 -60
  388. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  389. package/dist/test/src/persona/export-import/PersonaSharer.js +0 -502
  390. package/dist/test/src/persona/export-import/index.d.ts +0 -10
  391. package/dist/test/src/persona/export-import/index.d.ts.map +0 -1
  392. package/dist/test/src/persona/export-import/index.js +0 -7
  393. package/dist/test/src/persona/index.d.ts +0 -7
  394. package/dist/test/src/persona/index.d.ts.map +0 -1
  395. package/dist/test/src/persona/index.js +0 -7
  396. package/dist/test/src/portfolio/MigrationManager.d.ts +0 -44
  397. package/dist/test/src/portfolio/MigrationManager.d.ts.map +0 -1
  398. package/dist/test/src/portfolio/MigrationManager.js +0 -163
  399. package/dist/test/src/portfolio/PortfolioManager.d.ts +0 -54
  400. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +0 -1
  401. package/dist/test/src/portfolio/PortfolioManager.js +0 -224
  402. package/dist/test/src/portfolio/types.d.ts +0 -18
  403. package/dist/test/src/portfolio/types.d.ts.map +0 -1
  404. package/dist/test/src/portfolio/types.js +0 -13
  405. package/dist/test/src/security/InputValidator.d.ts +0 -80
  406. package/dist/test/src/security/InputValidator.d.ts.map +0 -1
  407. package/dist/test/src/security/InputValidator.js +0 -436
  408. package/dist/test/src/security/audit/SecurityAuditor.d.ts +0 -44
  409. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +0 -1
  410. package/dist/test/src/security/audit/SecurityAuditor.js +0 -274
  411. package/dist/test/src/security/audit/config/suppressions.d.ts +0 -34
  412. package/dist/test/src/security/audit/config/suppressions.d.ts.map +0 -1
  413. package/dist/test/src/security/audit/config/suppressions.js +0 -575
  414. package/dist/test/src/security/audit/index.d.ts +0 -14
  415. package/dist/test/src/security/audit/index.d.ts.map +0 -1
  416. package/dist/test/src/security/audit/index.js +0 -15
  417. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +0 -46
  418. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +0 -1
  419. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +0 -174
  420. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +0 -13
  421. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +0 -1
  422. package/dist/test/src/security/audit/reporters/JsonReporter.js +0 -25
  423. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +0 -13
  424. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +0 -1
  425. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +0 -79
  426. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +0 -20
  427. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +0 -1
  428. package/dist/test/src/security/audit/rules/SecurityRules.js +0 -244
  429. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +0 -47
  430. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +0 -1
  431. package/dist/test/src/security/audit/scanners/CodeScanner.js +0 -174
  432. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +0 -13
  433. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +0 -1
  434. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +0 -22
  435. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +0 -13
  436. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +0 -1
  437. package/dist/test/src/security/audit/scanners/DependencyScanner.js +0 -22
  438. package/dist/test/src/security/audit/types.d.ts +0 -94
  439. package/dist/test/src/security/audit/types.d.ts.map +0 -1
  440. package/dist/test/src/security/audit/types.js +0 -6
  441. package/dist/test/src/security/commandValidator.d.ts +0 -7
  442. package/dist/test/src/security/commandValidator.d.ts.map +0 -1
  443. package/dist/test/src/security/commandValidator.js +0 -78
  444. package/dist/test/src/security/constants.d.ts +0 -24
  445. package/dist/test/src/security/constants.d.ts.map +0 -1
  446. package/dist/test/src/security/constants.js +0 -26
  447. package/dist/test/src/security/contentValidator.d.ts +0 -47
  448. package/dist/test/src/security/contentValidator.d.ts.map +0 -1
  449. package/dist/test/src/security/contentValidator.js +0 -301
  450. package/dist/test/src/security/errors.d.ts +0 -14
  451. package/dist/test/src/security/errors.d.ts.map +0 -1
  452. package/dist/test/src/security/errors.js +0 -28
  453. package/dist/test/src/security/fileLockManager.d.ts +0 -70
  454. package/dist/test/src/security/fileLockManager.d.ts.map +0 -1
  455. package/dist/test/src/security/fileLockManager.js +0 -187
  456. package/dist/test/src/security/index.d.ts +0 -12
  457. package/dist/test/src/security/index.d.ts.map +0 -1
  458. package/dist/test/src/security/index.js +0 -14
  459. package/dist/test/src/security/pathValidator.d.ts +0 -9
  460. package/dist/test/src/security/pathValidator.d.ts.map +0 -1
  461. package/dist/test/src/security/pathValidator.js +0 -98
  462. package/dist/test/src/security/regexValidator.d.ts +0 -59
  463. package/dist/test/src/security/regexValidator.d.ts.map +0 -1
  464. package/dist/test/src/security/regexValidator.js +0 -214
  465. package/dist/test/src/security/secureYamlParser.d.ts +0 -46
  466. package/dist/test/src/security/secureYamlParser.d.ts.map +0 -1
  467. package/dist/test/src/security/secureYamlParser.js +0 -203
  468. package/dist/test/src/security/securityMonitor.d.ts +0 -58
  469. package/dist/test/src/security/securityMonitor.d.ts.map +0 -1
  470. package/dist/test/src/security/securityMonitor.js +0 -108
  471. package/dist/test/src/security/tokenManager.d.ts +0 -85
  472. package/dist/test/src/security/tokenManager.d.ts.map +0 -1
  473. package/dist/test/src/security/tokenManager.js +0 -286
  474. package/dist/test/src/security/validators/unicodeValidator.d.ts +0 -97
  475. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +0 -1
  476. package/dist/test/src/security/validators/unicodeValidator.js +0 -312
  477. package/dist/test/src/security/yamlValidator.d.ts +0 -21
  478. package/dist/test/src/security/yamlValidator.d.ts.map +0 -1
  479. package/dist/test/src/security/yamlValidator.js +0 -164
  480. package/dist/test/src/server/ServerSetup.d.ts +0 -35
  481. package/dist/test/src/server/ServerSetup.d.ts.map +0 -1
  482. package/dist/test/src/server/ServerSetup.js +0 -116
  483. package/dist/test/src/server/index.d.ts +0 -7
  484. package/dist/test/src/server/index.d.ts.map +0 -1
  485. package/dist/test/src/server/index.js +0 -7
  486. package/dist/test/src/server/startup.d.ts +0 -31
  487. package/dist/test/src/server/startup.d.ts.map +0 -1
  488. package/dist/test/src/server/startup.js +0 -67
  489. package/dist/test/src/server/tools/CollectionTools.d.ts +0 -10
  490. package/dist/test/src/server/tools/CollectionTools.d.ts.map +0 -1
  491. package/dist/test/src/server/tools/CollectionTools.js +0 -96
  492. package/dist/test/src/server/tools/ConfigTools.d.ts +0 -10
  493. package/dist/test/src/server/tools/ConfigTools.d.ts.map +0 -1
  494. package/dist/test/src/server/tools/ConfigTools.js +0 -63
  495. package/dist/test/src/server/tools/MarketplaceTools.d.ts +0 -10
  496. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  497. package/dist/test/src/server/tools/MarketplaceTools.js +0 -92
  498. package/dist/test/src/server/tools/PersonaTools.d.ts +0 -10
  499. package/dist/test/src/server/tools/PersonaTools.d.ts.map +0 -1
  500. package/dist/test/src/server/tools/PersonaTools.js +0 -257
  501. package/dist/test/src/server/tools/ToolRegistry.d.ts +0 -37
  502. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +0 -1
  503. package/dist/test/src/server/tools/ToolRegistry.js +0 -40
  504. package/dist/test/src/server/tools/UpdateTools.d.ts +0 -10
  505. package/dist/test/src/server/tools/UpdateTools.d.ts.map +0 -1
  506. package/dist/test/src/server/tools/UpdateTools.js +0 -64
  507. package/dist/test/src/server/tools/UserTools.d.ts +0 -10
  508. package/dist/test/src/server/tools/UserTools.d.ts.map +0 -1
  509. package/dist/test/src/server/tools/UserTools.js +0 -51
  510. package/dist/test/src/server/tools/index.d.ts +0 -10
  511. package/dist/test/src/server/tools/index.d.ts.map +0 -1
  512. package/dist/test/src/server/tools/index.js +0 -10
  513. package/dist/test/src/server/types.d.ts +0 -34
  514. package/dist/test/src/server/types.d.ts.map +0 -1
  515. package/dist/test/src/server/types.js +0 -5
  516. package/dist/test/src/tools/debug.d.ts +0 -20
  517. package/dist/test/src/tools/debug.d.ts.map +0 -1
  518. package/dist/test/src/tools/debug.js +0 -37
  519. package/dist/test/src/types/cache.d.ts +0 -8
  520. package/dist/test/src/types/cache.d.ts.map +0 -1
  521. package/dist/test/src/types/cache.js +0 -5
  522. package/dist/test/src/types/collection.d.ts +0 -23
  523. package/dist/test/src/types/collection.d.ts.map +0 -1
  524. package/dist/test/src/types/collection.js +0 -5
  525. package/dist/test/src/types/elements/IElement.d.ts +0 -123
  526. package/dist/test/src/types/elements/IElement.d.ts.map +0 -1
  527. package/dist/test/src/types/elements/IElement.js +0 -30
  528. package/dist/test/src/types/elements/IElementManager.d.ts +0 -65
  529. package/dist/test/src/types/elements/IElementManager.d.ts.map +0 -1
  530. package/dist/test/src/types/elements/IElementManager.js +0 -6
  531. package/dist/test/src/types/elements/IRatingManager.d.ts +0 -109
  532. package/dist/test/src/types/elements/IRatingManager.d.ts.map +0 -1
  533. package/dist/test/src/types/elements/IRatingManager.js +0 -6
  534. package/dist/test/src/types/elements/IReferenceResolver.d.ts +0 -52
  535. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +0 -1
  536. package/dist/test/src/types/elements/IReferenceResolver.js +0 -6
  537. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +0 -49
  538. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +0 -1
  539. package/dist/test/src/types/elements/RatingBreakdowns.js +0 -6
  540. package/dist/test/src/types/elements/index.d.ts +0 -9
  541. package/dist/test/src/types/elements/index.d.ts.map +0 -1
  542. package/dist/test/src/types/elements/index.js +0 -11
  543. package/dist/test/src/types/index.d.ts +0 -9
  544. package/dist/test/src/types/index.d.ts.map +0 -1
  545. package/dist/test/src/types/index.js +0 -9
  546. package/dist/test/src/types/marketplace.d.ts +0 -23
  547. package/dist/test/src/types/marketplace.d.ts.map +0 -1
  548. package/dist/test/src/types/marketplace.js +0 -5
  549. package/dist/test/src/types/mcp.d.ts +0 -84
  550. package/dist/test/src/types/mcp.d.ts.map +0 -1
  551. package/dist/test/src/types/mcp.js +0 -80
  552. package/dist/test/src/types/persona.d.ts +0 -30
  553. package/dist/test/src/types/persona.d.ts.map +0 -1
  554. package/dist/test/src/types/persona.js +0 -5
  555. package/dist/test/src/update/BackupManager.d.ts +0 -46
  556. package/dist/test/src/update/BackupManager.d.ts.map +0 -1
  557. package/dist/test/src/update/BackupManager.js +0 -261
  558. package/dist/test/src/update/DependencyChecker.d.ts +0 -41
  559. package/dist/test/src/update/DependencyChecker.d.ts.map +0 -1
  560. package/dist/test/src/update/DependencyChecker.js +0 -132
  561. package/dist/test/src/update/RateLimiter.d.ts +0 -80
  562. package/dist/test/src/update/RateLimiter.d.ts.map +0 -1
  563. package/dist/test/src/update/RateLimiter.js +0 -172
  564. package/dist/test/src/update/SignatureVerifier.d.ts +0 -71
  565. package/dist/test/src/update/SignatureVerifier.d.ts.map +0 -1
  566. package/dist/test/src/update/SignatureVerifier.js +0 -214
  567. package/dist/test/src/update/UpdateChecker.d.ts +0 -127
  568. package/dist/test/src/update/UpdateChecker.d.ts.map +0 -1
  569. package/dist/test/src/update/UpdateChecker.js +0 -469
  570. package/dist/test/src/update/UpdateManager.d.ts +0 -41
  571. package/dist/test/src/update/UpdateManager.d.ts.map +0 -1
  572. package/dist/test/src/update/UpdateManager.js +0 -260
  573. package/dist/test/src/update/VersionManager.d.ts +0 -31
  574. package/dist/test/src/update/VersionManager.d.ts.map +0 -1
  575. package/dist/test/src/update/VersionManager.js +0 -134
  576. package/dist/test/src/update/index.d.ts +0 -9
  577. package/dist/test/src/update/index.d.ts.map +0 -1
  578. package/dist/test/src/update/index.js +0 -9
  579. package/dist/test/src/utils/filesystem.d.ts +0 -29
  580. package/dist/test/src/utils/filesystem.d.ts.map +0 -1
  581. package/dist/test/src/utils/filesystem.js +0 -94
  582. package/dist/test/src/utils/git.d.ts +0 -32
  583. package/dist/test/src/utils/git.d.ts.map +0 -1
  584. package/dist/test/src/utils/git.js +0 -65
  585. package/dist/test/src/utils/index.d.ts +0 -7
  586. package/dist/test/src/utils/index.d.ts.map +0 -1
  587. package/dist/test/src/utils/index.js +0 -7
  588. package/dist/test/src/utils/logger.d.ts +0 -45
  589. package/dist/test/src/utils/logger.d.ts.map +0 -1
  590. package/dist/test/src/utils/logger.js +0 -91
  591. package/dist/test/src/utils/version.d.ts +0 -25
  592. package/dist/test/src/utils/version.d.ts.map +0 -1
  593. package/dist/test/src/utils/version.js +0 -97
  594. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +0 -33
  595. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +0 -1
  596. package/dist/test/test/__tests__/integration/helpers/file-utils.js +0 -83
  597. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +0 -26
  598. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +0 -1
  599. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +0 -95
  600. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +0 -26
  601. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +0 -1
  602. package/dist/test/test/__tests__/integration/helpers/test-server.js +0 -41
  603. package/dist/test/test/__tests__/integration/setup.d.ts +0 -8
  604. package/dist/test/test/__tests__/integration/setup.d.ts.map +0 -1
  605. package/dist/test/test/__tests__/integration/setup.js +0 -31
  606. package/dist/test/test/__tests__/integration/teardown.d.ts +0 -5
  607. package/dist/test/test/__tests__/integration/teardown.d.ts.map +0 -1
  608. package/dist/test/test/__tests__/integration/teardown.js +0 -23
  609. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +0 -34
  610. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +0 -1
  611. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +0 -224
  612. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +0 -89
  613. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +0 -1
  614. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +0 -543
  615. package/dist/test/test/__tests__/security/index.d.ts +0 -46
  616. package/dist/test/test/__tests__/security/index.d.ts.map +0 -1
  617. package/dist/test/test/__tests__/security/index.js +0 -98
  618. package/dist/test/test/__tests__/security/setup.d.ts +0 -3
  619. package/dist/test/test/__tests__/security/setup.d.ts.map +0 -1
  620. package/dist/test/test/__tests__/security/setup.js +0 -23
  621. package/dist/types/marketplace.d.ts +0 -23
  622. package/dist/types/marketplace.d.ts.map +0 -1
  623. package/dist/types/marketplace.js +0 -5
@@ -1,172 +0,0 @@
1
- /**
2
- * RateLimiter - Implements rate limiting for API calls to prevent abuse
3
- *
4
- * Features:
5
- * - Token bucket algorithm for flexible rate limiting
6
- * - Configurable limits per time window
7
- * - Memory-efficient implementation
8
- * - Thread-safe for concurrent requests
9
- */
10
- export class RateLimiter {
11
- tokens;
12
- lastRefill;
13
- lastRequest;
14
- maxTokens;
15
- refillRate;
16
- minDelay;
17
- constructor(config) {
18
- if (config.maxRequests <= 0) {
19
- throw new Error('maxRequests must be positive');
20
- }
21
- if (config.windowMs <= 0) {
22
- throw new Error('windowMs must be positive');
23
- }
24
- this.maxTokens = config.maxRequests;
25
- this.tokens = this.maxTokens;
26
- this.refillRate = this.maxTokens / config.windowMs;
27
- // Validate refill rate to prevent division by zero
28
- if (this.refillRate <= 0 || !isFinite(this.refillRate)) {
29
- throw new Error('Invalid configuration: refill rate must be positive and finite');
30
- }
31
- this.lastRefill = Date.now();
32
- this.lastRequest = 0;
33
- this.minDelay = config.minDelayMs || 0;
34
- }
35
- /**
36
- * Check if a request is allowed under the rate limit
37
- * @returns Status object indicating if request is allowed
38
- */
39
- checkLimit() {
40
- const now = Date.now();
41
- // Refill tokens based on time elapsed
42
- this.refillTokens(now);
43
- // Check minimum delay between requests
44
- if (this.minDelay > 0 && this.lastRequest > 0) {
45
- const timeSinceLastRequest = now - this.lastRequest;
46
- if (timeSinceLastRequest < this.minDelay) {
47
- const retryAfterMs = this.minDelay - timeSinceLastRequest;
48
- return {
49
- allowed: false,
50
- retryAfterMs,
51
- remainingTokens: Math.floor(this.tokens),
52
- resetTime: new Date(now + retryAfterMs)
53
- };
54
- }
55
- }
56
- // Check if we have tokens available
57
- if (this.tokens < 1) {
58
- // Calculate when the next token will be available
59
- const tokensNeeded = 1 - this.tokens;
60
- const msUntilNextToken = tokensNeeded / this.refillRate;
61
- return {
62
- allowed: false,
63
- retryAfterMs: Math.ceil(msUntilNextToken),
64
- remainingTokens: 0,
65
- resetTime: new Date(now + msUntilNextToken)
66
- };
67
- }
68
- // Request is allowed
69
- return {
70
- allowed: true,
71
- remainingTokens: Math.floor(this.tokens),
72
- resetTime: this.getResetTime()
73
- };
74
- }
75
- /**
76
- * Consume a token for an allowed request
77
- * Should be called after checkLimit() returns allowed: true
78
- */
79
- consumeToken() {
80
- const now = Date.now();
81
- this.refillTokens(now);
82
- if (this.tokens >= 1) {
83
- this.tokens -= 1;
84
- this.lastRequest = now;
85
- }
86
- }
87
- /**
88
- * Get current rate limit status without consuming a token
89
- */
90
- getStatus() {
91
- const now = Date.now();
92
- this.refillTokens(now);
93
- return {
94
- allowed: this.tokens >= 1,
95
- remainingTokens: Math.floor(this.tokens),
96
- resetTime: this.getResetTime()
97
- };
98
- }
99
- /**
100
- * Reset the rate limiter to full capacity
101
- * Useful for testing or manual intervention
102
- */
103
- reset() {
104
- this.tokens = this.maxTokens;
105
- this.lastRefill = Date.now();
106
- this.lastRequest = 0;
107
- }
108
- /**
109
- * Refill tokens based on time elapsed
110
- */
111
- refillTokens(now) {
112
- const timeSinceLastRefill = now - this.lastRefill;
113
- const tokensToAdd = timeSinceLastRefill * this.refillRate;
114
- this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);
115
- this.lastRefill = now;
116
- }
117
- /**
118
- * Calculate when the rate limit window will reset
119
- */
120
- getResetTime() {
121
- const now = Date.now();
122
- const tokensToFull = this.maxTokens - this.tokens;
123
- const msUntilFull = tokensToFull / this.refillRate;
124
- return new Date(now + msUntilFull);
125
- }
126
- /**
127
- * Get human-readable rate limit information
128
- */
129
- toString() {
130
- const status = this.getStatus();
131
- return `RateLimit: ${status.remainingTokens}/${this.maxTokens} tokens, ` +
132
- `resets at ${status.resetTime.toISOString()}`;
133
- }
134
- }
135
- /**
136
- * Factory function to create common rate limiters
137
- */
138
- export class RateLimiterFactory {
139
- /**
140
- * GitHub API rate limiter (60 requests per hour for unauthenticated)
141
- */
142
- static createGitHubLimiter() {
143
- return new RateLimiter({
144
- maxRequests: 60,
145
- windowMs: 60 * 60 * 1000, // 1 hour
146
- minDelayMs: 1000 // 1 second minimum between requests
147
- });
148
- }
149
- /**
150
- * Conservative rate limiter for update checks
151
- * Allows 10 checks per hour with 30 second minimum delay
152
- */
153
- static createUpdateCheckLimiter() {
154
- return new RateLimiter({
155
- maxRequests: 10,
156
- windowMs: 60 * 60 * 1000, // 1 hour
157
- minDelayMs: 30 * 1000 // 30 seconds between checks
158
- });
159
- }
160
- /**
161
- * Strict rate limiter for sensitive operations
162
- * Allows 5 requests per hour with 1 minute minimum delay
163
- */
164
- static createStrictLimiter() {
165
- return new RateLimiter({
166
- maxRequests: 5,
167
- windowMs: 60 * 60 * 1000, // 1 hour
168
- minDelayMs: 60 * 1000 // 1 minute between requests
169
- });
170
- }
171
- }
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmF0ZUxpbWl0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXBkYXRlL1JhdGVMaW1pdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBZUgsTUFBTSxPQUFPLFdBQVc7SUFDZCxNQUFNLENBQVM7SUFDZixVQUFVLENBQVM7SUFDbkIsV0FBVyxDQUFTO0lBQ1gsU0FBUyxDQUFTO0lBQ2xCLFVBQVUsQ0FBUztJQUNuQixRQUFRLENBQVM7SUFFbEMsWUFBWSxNQUF5QjtRQUNuQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBRW5ELG1EQUFtRDtRQUNuRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFN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QUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLFdBQVcsQ0FBQztZQUNyQixXQUFXLEVBQUUsRUFBRTtZQUNmLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxTQUFTO1lBQ25DLFVBQVUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLDRCQUE0QjtTQUNuRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLG1CQUFtQjtRQUN4QixPQUFPLElBQUksV0FBVyxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVM7WUFDbkMsVUFBVSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsNEJBQTRCO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmF0ZUxpbWl0ZXIgLSBJbXBsZW1lbnRzIHJhdGUgbGltaXRpbmcgZm9yIEFQSSBjYWxscyB0byBwcmV2ZW50IGFidXNlXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBUb2tlbiBidWNrZXQgYWxnb3JpdGhtIGZvciBmbGV4aWJsZSByYXRlIGxpbWl0aW5nXG4gKiAtIENvbmZpZ3VyYWJsZSBsaW1pdHMgcGVyIHRpbWUgd2luZG93XG4gKiAtIE1lbW9yeS1lZmZpY2llbnQgaW1wbGVtZW50YXRpb25cbiAqIC0gVGhyZWFkLXNhZmUgZm9yIGNvbmN1cnJlbnQgcmVxdWVzdHNcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGVMaW1pdGVyQ29uZmlnIHtcbiAgbWF4UmVxdWVzdHM6IG51bWJlcjsgICAgICAvLyBNYXhpbXVtIHJlcXVlc3RzIGFsbG93ZWRcbiAgd2luZG93TXM6IG51bWJlcjsgICAgICAgICAvLyBUaW1lIHdpbmRvdyBpbiBtaWxsaXNlY29uZHNcbiAgbWluRGVsYXlNcz86IG51bWJlcjsgICAgICAvLyBNaW5pbXVtIGRlbGF5IGJldHdlZW4gcmVxdWVzdHMgKG9wdGlvbmFsKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGVMaW1pdFN0YXR1cyB7XG4gIGFsbG93ZWQ6IGJvb2xlYW47XG4gIHJldHJ5QWZ0ZXJNcz86IG51bWJlcjtcbiAgcmVtYWluaW5nVG9rZW5zOiBudW1iZXI7XG4gIHJlc2V0VGltZTogRGF0ZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdGVyIHtcbiAgcHJpdmF0ZSB0b2tlbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSBsYXN0UmVmaWxsOiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdFJlcXVlc3Q6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhUb2tlbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByZWZpbGxSYXRlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWluRGVsYXk6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFJhdGVMaW1pdGVyQ29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5tYXhSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFJlcXVlc3RzIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy53aW5kb3dNcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpbmRvd01zIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG5cbiAgICB0aGlzLm1heFRva2VucyA9IGNvbmZpZy5tYXhSZXF1ZXN0cztcbiAgICB0aGlzLnRva2VucyA9IHRoaXMubWF4VG9rZW5zO1xuICAgIHRoaXMucmVmaWxsUmF0ZSA9IHRoaXMubWF4VG9rZW5zIC8gY29uZmlnLndpbmRvd01zO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJlZmlsbCByYXRlIHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVyb1xuICAgIGlmICh0aGlzLnJlZmlsbFJhdGUgPD0gMCB8fCAhaXNGaW5pdGUodGhpcy5yZWZpbGxSYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246IHJlZmlsbCByYXRlIG11c3QgYmUgcG9zaXRpdmUgYW5kIGZpbml0ZScpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmxhc3RSZWZpbGwgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMubGFzdFJlcXVlc3QgPSAwO1xuICAgIHRoaXMubWluRGVsYXkgPSBjb25maWcubWluRGVsYXlNcyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcmVxdWVzdCBpcyBhbGxvd2VkIHVuZGVyIHRoZSByYXRlIGxpbWl0XG4gICAqIEByZXR1cm5zIFN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyBpZiByZXF1ZXN0IGlzIGFsbG93ZWRcbiAgICovXG4gIGNoZWNrTGltaXQoKTogUmF0ZUxpbWl0U3RhdHVzIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIFxuICAgIC8vIFJlZmlsbCB0b2tlbnMgYmFzZWQgb24gdGltZSBlbGFwc2VkXG4gICAgdGhpcy5yZWZpbGxUb2tlbnMobm93KTtcblxuICAgIC8vIENoZWNrIG1pbmltdW0gZGVsYXkgYmV0d2VlbiByZXF1ZXN0c1xuICAgIGlmICh0aGlzLm1pbkRlbGF5ID4gMCAmJiB0aGlzLmxhc3RSZXF1ZXN0ID4gMCkge1xuICAgICAgY29uc3QgdGltZVNpbmNlTGFzdFJlcXVlc3QgPSBub3cgLSB0aGlzLmxhc3RSZXF1ZXN0O1xuICAgICAgaWYgKHRpbWVTaW5jZUxhc3RSZXF1ZXN0IDwgdGhpcy5taW5EZWxheSkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyTXMgPSB0aGlzLm1pbkRlbGF5IC0gdGltZVNpbmNlTGFzdFJlcXVlc3Q7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICAgICAgcmV0cnlBZnRlck1zLFxuICAgICAgICAgIHJlbWFpbmluZ1Rva2VuczogTWF0aC5mbG9vcih0aGlzLnRva2VucyksXG4gICAgICAgICAgcmVzZXRUaW1lOiBuZXcgRGF0ZShub3cgKyByZXRyeUFmdGVyTXMpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0b2tlbnMgYXZhaWxhYmxlXG4gICAgaWYgKHRoaXMudG9rZW5zIDwgMSkge1xuICAgICAgLy8gQ2FsY3VsYXRlIHdoZW4gdGhlIG5leHQgdG9rZW4gd2lsbCBiZSBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHRva2Vuc05lZWRlZCA9IDEgLSB0aGlzLnRva2VucztcbiAgICAgIGNvbnN0IG1zVW50aWxOZXh0VG9rZW4gPSB0b2tlbnNOZWVkZWQgLyB0aGlzLnJlZmlsbFJhdGU7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICByZXRyeUFmdGVyTXM6IE1hdGguY2VpbChtc1VudGlsTmV4dFRva2VuKSxcbiAgICAgICAgcmVtYWluaW5nVG9rZW5zOiAwLFxuICAgICAgICByZXNldFRpbWU6IG5ldyBEYXRlKG5vdyArIG1zVW50aWxOZXh0VG9rZW4pXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgaXMgYWxsb3dlZFxuICAgIHJldHVybiB7XG4gICAgICBhbGxvd2VkOiB0cnVlLFxuICAgICAgcmVtYWluaW5nVG9rZW5zOiBNYXRoLmZsb29yKHRoaXMudG9rZW5zKSxcbiAgICAgIHJlc2V0VGltZTogdGhpcy5nZXRSZXNldFRpbWUoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZSBhIHRva2VuIGZvciBhbiBhbGxvd2VkIHJlcXVlc3RcbiAgICogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjaGVja0xpbWl0KCkgcmV0dXJucyBhbGxvd2VkOiB0cnVlXG4gICAqL1xuICBjb25zdW1lVG9rZW4oKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLnJlZmlsbFRva2Vucyhub3cpO1xuICAgIFxuICAgIGlmICh0aGlzLnRva2VucyA+PSAxKSB7XG4gICAgICB0aGlzLnRva2VucyAtPSAxO1xuICAgICAgdGhpcy5sYXN0UmVxdWVzdCA9IG5vdztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgcmF0ZSBsaW1pdCBzdGF0dXMgd2l0aG91dCBjb25zdW1pbmcgYSB0b2tlblxuICAgKi9cbiAgZ2V0U3RhdHVzKCk6IFJhdGVMaW1pdFN0YXR1cyB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLnJlZmlsbFRva2Vucyhub3cpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWQ6IHRoaXMudG9rZW5zID49IDEsXG4gICAgICByZW1haW5pbmdUb2tlbnM6IE1hdGguZmxvb3IodGhpcy50b2tlbnMpLFxuICAgICAgcmVzZXRUaW1lOiB0aGlzLmdldFJlc2V0VGltZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgcmF0ZSBsaW1pdGVyIHRvIGZ1bGwgY2FwYWNpdHlcbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIG1hbnVhbCBpbnRlcnZlbnRpb25cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gdGhpcy5tYXhUb2tlbnM7XG4gICAgdGhpcy5sYXN0UmVmaWxsID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0ID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZpbGwgdG9rZW5zIGJhc2VkIG9uIHRpbWUgZWxhcHNlZFxuICAgKi9cbiAgcHJpdmF0ZSByZWZpbGxUb2tlbnMobm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lU2luY2VMYXN0UmVmaWxsID0gbm93IC0gdGhpcy5sYXN0UmVmaWxsO1xuICAgIGNvbnN0IHRva2Vuc1RvQWRkID0gdGltZVNpbmNlTGFzdFJlZmlsbCAqIHRoaXMucmVmaWxsUmF0ZTtcbiAgICBcbiAgICB0aGlzLnRva2VucyA9IE1hdGgubWluKHRoaXMubWF4VG9rZW5zLCB0aGlzLnRva2VucyArIHRva2Vuc1RvQWRkKTtcbiAgICB0aGlzLmxhc3RSZWZpbGwgPSBub3c7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHdoZW4gdGhlIHJhdGUgbGltaXQgd2luZG93IHdpbGwgcmVzZXRcbiAgICovXG4gIHByaXZhdGUgZ2V0UmVzZXRUaW1lKCk6IERhdGUge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdG9rZW5zVG9GdWxsID0gdGhpcy5tYXhUb2tlbnMgLSB0aGlzLnRva2VucztcbiAgICBjb25zdCBtc1VudGlsRnVsbCA9IHRva2Vuc1RvRnVsbCAvIHRoaXMucmVmaWxsUmF0ZTtcbiAgICByZXR1cm4gbmV3IERhdGUobm93ICsgbXNVbnRpbEZ1bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBodW1hbi1yZWFkYWJsZSByYXRlIGxpbWl0IGluZm9ybWF0aW9uXG4gICAqL1xuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgcmV0dXJuIGBSYXRlTGltaXQ6ICR7c3RhdHVzLnJlbWFpbmluZ1Rva2Vuc30vJHt0aGlzLm1heFRva2Vuc30gdG9rZW5zLCBgICtcbiAgICAgICAgICAgYHJlc2V0cyBhdCAke3N0YXR1cy5yZXNldFRpbWUudG9JU09TdHJpbmcoKX1gO1xuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgY29tbW9uIHJhdGUgbGltaXRlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdGVyRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBHaXRIdWIgQVBJIHJhdGUgbGltaXRlciAoNjAgcmVxdWVzdHMgcGVyIGhvdXIgZm9yIHVuYXV0aGVudGljYXRlZClcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVHaXRIdWJMaW1pdGVyKCk6IFJhdGVMaW1pdGVyIHtcbiAgICByZXR1cm4gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgIG1heFJlcXVlc3RzOiA2MCxcbiAgICAgIHdpbmRvd01zOiA2MCAqIDYwICogMTAwMCwgLy8gMSBob3VyXG4gICAgICBtaW5EZWxheU1zOiAxMDAwIC8vIDEgc2Vjb25kIG1pbmltdW0gYmV0d2VlbiByZXF1ZXN0c1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNlcnZhdGl2ZSByYXRlIGxpbWl0ZXIgZm9yIHVwZGF0ZSBjaGVja3NcbiAgICogQWxsb3dzIDEwIGNoZWNrcyBwZXIgaG91ciB3aXRoIDMwIHNlY29uZCBtaW5pbXVtIGRlbGF5XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlVXBkYXRlQ2hlY2tMaW1pdGVyKCk6IFJhdGVMaW1pdGVyIHtcbiAgICByZXR1cm4gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgIG1heFJlcXVlc3RzOiAxMCxcbiAgICAgIHdpbmRvd01zOiA2MCAqIDYwICogMTAwMCwgLy8gMSBob3VyXG4gICAgICBtaW5EZWxheU1zOiAzMCAqIDEwMDAgLy8gMzAgc2Vjb25kcyBiZXR3ZWVuIGNoZWNrc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmljdCByYXRlIGxpbWl0ZXIgZm9yIHNlbnNpdGl2ZSBvcGVyYXRpb25zXG4gICAqIEFsbG93cyA1IHJlcXVlc3RzIHBlciBob3VyIHdpdGggMSBtaW51dGUgbWluaW11bSBkZWxheVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVN0cmljdExpbWl0ZXIoKTogUmF0ZUxpbWl0ZXIge1xuICAgIHJldHVybiBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IDUsXG4gICAgICB3aW5kb3dNczogNjAgKiA2MCAqIDEwMDAsIC8vIDEgaG91clxuICAgICAgbWluRGVsYXlNczogNjAgKiAxMDAwIC8vIDEgbWludXRlIGJldHdlZW4gcmVxdWVzdHNcbiAgICB9KTtcbiAgfVxufSJdfQ==
@@ -1,71 +0,0 @@
1
- /**
2
- * SignatureVerifier - Verifies GitHub release signatures to ensure authenticity
3
- *
4
- * Security features:
5
- * - Verifies GPG signatures on git tags
6
- * - Validates release artifacts checksums
7
- * - Ensures releases come from trusted sources
8
- * - Prevents tampering and supply chain attacks
9
- */
10
- export interface SignatureVerificationResult {
11
- verified: boolean;
12
- signerKey?: string;
13
- signerEmail?: string;
14
- signatureDate?: Date;
15
- error?: string;
16
- }
17
- export interface ChecksumVerificationResult {
18
- verified: boolean;
19
- expectedChecksum?: string;
20
- actualChecksum?: string;
21
- error?: string;
22
- }
23
- export declare class SignatureVerifier {
24
- private trustedKeys;
25
- private allowUnsignedInDev;
26
- constructor(options?: {
27
- trustedKeys?: string[];
28
- allowUnsignedInDev?: boolean;
29
- });
30
- /**
31
- * Verify a git tag signature
32
- * @param tagName The tag to verify (e.g., 'v1.2.0')
33
- * @returns Verification result with signer information
34
- */
35
- verifyTagSignature(tagName: string): Promise<SignatureVerificationResult>;
36
- /**
37
- * Verify a file checksum against expected value
38
- * @param filePath Path to the file to verify
39
- * @param expectedChecksum Expected SHA256 checksum
40
- * @returns Verification result
41
- */
42
- verifyChecksum(filePath: string, expectedChecksum: string): Promise<ChecksumVerificationResult>;
43
- /**
44
- * Verify release artifacts using a checksums file
45
- * @param checksumsFile Path to checksums file (e.g., SHA256SUMS)
46
- * @param artifactDir Directory containing artifacts to verify
47
- * @returns Map of filename to verification result
48
- */
49
- verifyReleaseArtifacts(checksumsFile: string, artifactDir: string): Promise<Map<string, ChecksumVerificationResult>>;
50
- /**
51
- * Add a trusted key for signature verification
52
- * @param keyId GPG key ID or fingerprint
53
- */
54
- addTrustedKey(keyId: string): void;
55
- /**
56
- * Remove a trusted key
57
- * @param keyId GPG key ID or fingerprint
58
- */
59
- removeTrustedKey(keyId: string): void;
60
- /**
61
- * Get list of trusted keys
62
- */
63
- getTrustedKeys(): string[];
64
- /**
65
- * Import a GPG public key
66
- * @param keyData The public key data to import
67
- * @returns Success status
68
- */
69
- importPublicKey(keyData: string): Promise<boolean>;
70
- }
71
- //# sourceMappingURL=SignatureVerifier.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SignatureVerifier.d.ts","sourceRoot":"","sources":["../../../../src/update/SignatureVerifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAU;gBAExB,OAAO,CAAC,EAAE;QACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IAWD;;;;OAIG;IACG,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAkF/E;;;;;OAKG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA2BrG;;;;;OAKG;IACG,sBAAsB,CAC1B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IAiCnD;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIlC;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAI1B;;;;OAIG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAoBzD"}
@@ -1,214 +0,0 @@
1
- /**
2
- * SignatureVerifier - Verifies GitHub release signatures to ensure authenticity
3
- *
4
- * Security features:
5
- * - Verifies GPG signatures on git tags
6
- * - Validates release artifacts checksums
7
- * - Ensures releases come from trusted sources
8
- * - Prevents tampering and supply chain attacks
9
- */
10
- import { safeExec } from '../utils/git.js';
11
- import * as crypto from 'crypto';
12
- import * as fs from 'fs/promises';
13
- import * as path from 'path';
14
- import { randomBytes } from 'crypto';
15
- import { logger } from '../utils/logger.js';
16
- export class SignatureVerifier {
17
- trustedKeys;
18
- allowUnsignedInDev;
19
- constructor(options) {
20
- // Default trusted keys - should be GPG key IDs of maintainers
21
- this.trustedKeys = new Set(options?.trustedKeys || [
22
- // Add trusted GPG key fingerprints here
23
- // Example: '1234567890ABCDEF1234567890ABCDEF12345678'
24
- ]);
25
- // Allow unsigned releases in development mode
26
- this.allowUnsignedInDev = options?.allowUnsignedInDev ?? true;
27
- }
28
- /**
29
- * Verify a git tag signature
30
- * @param tagName The tag to verify (e.g., 'v1.2.0')
31
- * @returns Verification result with signer information
32
- */
33
- async verifyTagSignature(tagName) {
34
- try {
35
- // Check if GPG is available
36
- try {
37
- await safeExec('gpg', ['--version']);
38
- }
39
- catch {
40
- return {
41
- verified: false,
42
- error: 'GPG is not installed or not available in PATH'
43
- };
44
- }
45
- // Verify the tag signature
46
- const { stdout, stderr } = await safeExec('git', ['verify-tag', tagName]);
47
- // Parse GPG output (comes on stderr)
48
- const output = stderr || stdout;
49
- // Check for good signature
50
- if (!output.includes('Good signature')) {
51
- // Check if tag is unsigned
52
- if (output.includes('error: no signature found')) {
53
- if (this.allowUnsignedInDev && process.env.NODE_ENV !== 'production') {
54
- return {
55
- verified: true,
56
- error: 'Tag is unsigned (allowed in development mode)'
57
- };
58
- }
59
- return {
60
- verified: false,
61
- error: 'Tag is not signed'
62
- };
63
- }
64
- return {
65
- verified: false,
66
- error: 'Invalid signature'
67
- };
68
- }
69
- // Extract signer information
70
- const keyMatch = output.match(/key (?:ID )?([A-F0-9]+)/i);
71
- const emailMatch = output.match(/"([^"]+)"/);
72
- const dateMatch = output.match(/made (\w+ \w+ \d+ \d+:\d+:\d+ \d+ \w+)/);
73
- const signerKey = keyMatch ? keyMatch[1] : undefined;
74
- const signerEmail = emailMatch ? emailMatch[1] : undefined;
75
- const signatureDate = dateMatch ? new Date(dateMatch[1]) : undefined;
76
- // Check if key is trusted
77
- if (this.trustedKeys.size > 0 && signerKey) {
78
- // Check if the key ID ends with any of our trusted keys
79
- const isTrusted = Array.from(this.trustedKeys).some(trustedKey => signerKey.endsWith(trustedKey.toUpperCase()));
80
- if (!isTrusted) {
81
- return {
82
- verified: false,
83
- signerKey,
84
- signerEmail,
85
- signatureDate,
86
- error: `Signature is valid but key ${signerKey} is not in trusted keys list`
87
- };
88
- }
89
- }
90
- return {
91
- verified: true,
92
- signerKey,
93
- signerEmail,
94
- signatureDate
95
- };
96
- }
97
- catch (error) {
98
- return {
99
- verified: false,
100
- error: `Failed to verify signature: ${error instanceof Error ? error.message : String(error)}`
101
- };
102
- }
103
- }
104
- /**
105
- * Verify a file checksum against expected value
106
- * @param filePath Path to the file to verify
107
- * @param expectedChecksum Expected SHA256 checksum
108
- * @returns Verification result
109
- */
110
- async verifyChecksum(filePath, expectedChecksum) {
111
- try {
112
- // Read file and calculate checksum
113
- const fileBuffer = await fs.readFile(filePath);
114
- const hash = crypto.createHash('sha256');
115
- hash.update(fileBuffer);
116
- const actualChecksum = hash.digest('hex');
117
- // Compare checksums
118
- const verified = actualChecksum.toLowerCase() === expectedChecksum.toLowerCase();
119
- return {
120
- verified,
121
- expectedChecksum,
122
- actualChecksum,
123
- error: verified ? undefined : 'Checksum mismatch'
124
- };
125
- }
126
- catch (error) {
127
- return {
128
- verified: false,
129
- expectedChecksum,
130
- error: `Failed to verify checksum: ${error instanceof Error ? error.message : String(error)}`
131
- };
132
- }
133
- }
134
- /**
135
- * Verify release artifacts using a checksums file
136
- * @param checksumsFile Path to checksums file (e.g., SHA256SUMS)
137
- * @param artifactDir Directory containing artifacts to verify
138
- * @returns Map of filename to verification result
139
- */
140
- async verifyReleaseArtifacts(checksumsFile, artifactDir) {
141
- const results = new Map();
142
- try {
143
- // Read checksums file
144
- const checksumsContent = await fs.readFile(checksumsFile, 'utf-8');
145
- const lines = checksumsContent.split('\n').filter(line => line.trim());
146
- // Parse checksums (format: "checksum filename" or "checksum *filename")
147
- for (const line of lines) {
148
- const match = line.match(/^([a-f0-9]+)\s+\*?(.+)$/i);
149
- if (!match)
150
- continue;
151
- const [, checksum, filename] = match;
152
- const filePath = path.join(artifactDir, filename);
153
- // Verify each file
154
- const result = await this.verifyChecksum(filePath, checksum);
155
- results.set(filename, result);
156
- }
157
- return results;
158
- }
159
- catch (error) {
160
- // If we can't read the checksums file, mark all as unverified
161
- results.set('*', {
162
- verified: false,
163
- error: `Failed to read checksums file: ${error instanceof Error ? error.message : String(error)}`
164
- });
165
- return results;
166
- }
167
- }
168
- /**
169
- * Add a trusted key for signature verification
170
- * @param keyId GPG key ID or fingerprint
171
- */
172
- addTrustedKey(keyId) {
173
- this.trustedKeys.add(keyId.toUpperCase());
174
- }
175
- /**
176
- * Remove a trusted key
177
- * @param keyId GPG key ID or fingerprint
178
- */
179
- removeTrustedKey(keyId) {
180
- this.trustedKeys.delete(keyId.toUpperCase());
181
- }
182
- /**
183
- * Get list of trusted keys
184
- */
185
- getTrustedKeys() {
186
- return Array.from(this.trustedKeys);
187
- }
188
- /**
189
- * Import a GPG public key
190
- * @param keyData The public key data to import
191
- * @returns Success status
192
- */
193
- async importPublicKey(keyData) {
194
- try {
195
- // Write key data to temporary file with secure random name
196
- const tempFile = path.join(process.cwd(), `.gpg-import-${randomBytes(8).toString('hex')}.asc`);
197
- await fs.writeFile(tempFile, keyData);
198
- try {
199
- // Import the key
200
- await safeExec('gpg', ['--import', tempFile]);
201
- return true;
202
- }
203
- finally {
204
- // Clean up temp file
205
- await fs.unlink(tempFile).catch(() => { });
206
- }
207
- }
208
- catch (error) {
209
- logger.error('Failed to import GPG key:', error);
210
- return false;
211
- }
212
- }
213
- }
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbmF0dXJlVmVyaWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXBkYXRlL1NpZ25hdHVyZVZlcmlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBaUI1QyxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLFdBQVcsQ0FBYztJQUN6QixrQkFBa0IsQ0FBVTtJQUVwQyxZQUFZLE9BR1g7UUFDQyw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxJQUFJO1FBQ2pELHdDQUF3QztRQUN4QyxzREFBc0Q7U0FDdkQsQ0FBQyxDQUFDO1FBRUgsOENBQThDO1FBQzlDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLEVBQUUsa0JBQWtCLElBQUksSUFBSSxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQWU7UUFDdEMsSUFBSSxDQUFDO1lBQ0gsNEJBQTRCO1lBQzVCLElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTztvQkFDTCxRQUFRLEVBQUUsS0FBSztvQkFDZixLQUFLLEVBQUUsK0NBQStDO2lCQUN2RCxDQUFD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dCI6WyIvKipcbiAqIFNpZ25hdHVyZVZlcmlmaWVyIC0gVmVyaWZpZXMgR2l0SHViIHJlbGVhc2Ugc2lnbmF0dXJlcyB0byBlbnN1cmUgYXV0aGVudGljaXR5XG4gKiBcbiAqIFNlY3VyaXR5IGZlYXR1cmVzOlxuICogLSBWZXJpZmllcyBHUEcgc2lnbmF0dXJlcyBvbiBnaXQgdGFnc1xuICogLSBWYWxpZGF0ZXMgcmVsZWFzZSBhcnRpZmFjdHMgY2hlY2tzdW1zXG4gKiAtIEVuc3VyZXMgcmVsZWFzZXMgY29tZSBmcm9tIHRydXN0ZWQgc291cmNlc1xuICogLSBQcmV2ZW50cyB0YW1wZXJpbmcgYW5kIHN1cHBseSBjaGFpbiBhdHRhY2tzXG4gKi9cblxuaW1wb3J0IHsgc2FmZUV4ZWMgfSBmcm9tICcuLi91dGlscy9naXQuanMnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYXR1cmVWZXJpZmljYXRpb25SZXN1bHQge1xuICB2ZXJpZmllZDogYm9vbGVhbjtcbiAgc2lnbmVyS2V5Pzogc3RyaW5nO1xuICBzaWduZXJFbWFpbD86IHN0cmluZztcbiAgc2lnbmF0dXJlRGF0ZT86IERhdGU7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrc3VtVmVyaWZpY2F0aW9uUmVzdWx0IHtcbiAgdmVyaWZpZWQ6IGJvb2xlYW47XG4gIGV4cGVjdGVkQ2hlY2tzdW0/OiBzdHJpbmc7XG4gIGFjdHVhbENoZWNrc3VtPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNpZ25hdHVyZVZlcmlmaWVyIHtcbiAgcHJpdmF0ZSB0cnVzdGVkS2V5czogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgYWxsb3dVbnNpZ25lZEluRGV2OiBib29sZWFuO1xuICBcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IHtcbiAgICB0cnVzdGVkS2V5cz86IHN0cmluZ1tdO1xuICAgIGFsbG93VW5zaWduZWRJbkRldj86IGJvb2xlYW47XG4gIH0pIHtcbiAgICAvLyBEZWZhdWx0IHRydXN0ZWQga2V5cyAtIHNob3VsZCBiZSBHUEcga2V5IElEcyBvZiBtYWludGFpbmVyc1xuICAgIHRoaXMudHJ1c3RlZEtleXMgPSBuZXcgU2V0KG9wdGlvbnM/LnRydXN0ZWRLZXlzIHx8IFtcbiAgICAgIC8vIEFkZCB0cnVzdGVkIEdQRyBrZXkgZmluZ2VycHJpbnRzIGhlcmVcbiAgICAgIC8vIEV4YW1wbGU6ICcxMjM0NTY3ODkwQUJDREVGMTIzNDU2Nzg5MEFCQ0RFRjEyMzQ1Njc4J1xuICAgIF0pO1xuICAgIFxuICAgIC8vIEFsbG93IHVuc2lnbmVkIHJlbGVhc2VzIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICB0aGlzLmFsbG93VW5zaWduZWRJbkRldiA9IG9wdGlvbnM/LmFsbG93VW5zaWduZWRJbkRldiA/PyB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogVmVyaWZ5IGEgZ2l0IHRhZyBzaWduYXR1cmVcbiAgICogQHBhcmFtIHRhZ05hbWUgVGhlIHRhZyB0byB2ZXJpZnkgKGUuZy4sICd2MS4yLjAnKVxuICAgKiBAcmV0dXJucyBWZXJpZmljYXRpb24gcmVzdWx0IHdpdGggc2lnbmVyIGluZm9ybWF0aW9uXG4gICAqL1xuICBhc3luYyB2ZXJpZnlUYWdTaWduYXR1cmUodGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTaWduYXR1cmVWZXJpZmljYXRpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgR1BHIGlzIGF2YWlsYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2FmZUV4ZWMoJ2dwZycsIFsnLS12ZXJzaW9uJ10pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiAnR1BHIGlzIG5vdCBpbnN0YWxsZWQgb3Igbm90IGF2YWlsYWJsZSBpbiBQQVRIJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBWZXJpZnkgdGhlIHRhZyBzaWduYXR1cmVcbiAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHNhZmVFeGVjKCdnaXQnLCBbJ3ZlcmlmeS10YWcnLCB0YWdOYW1lXSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIEdQRyBvdXRwdXQgKGNvbWVzIG9uIHN0ZGVycilcbiAgICAgIGNvbnN0IG91dHB1dCA9IHN0ZGVyciB8fCBzdGRvdXQ7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciBnb29kIHNpZ25hdHVyZVxuICAgICAgaWYgKCFvdXRwdXQuaW5jbHVkZXMoJ0dvb2Qgc2lnbmF0dXJlJykpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGFnIGlzIHVuc2lnbmVkXG4gICAgICAgIGlmIChvdXRwdXQuaW5jbHVkZXMoJ2Vycm9yOiBubyBzaWduYXR1cmUgZm91bmQnKSkge1xuICAgICAgICAgIGlmICh0aGlzLmFsbG93VW5zaWduZWRJbkRldiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZXJyb3I6ICdUYWcgaXMgdW5zaWduZWQgKGFsbG93ZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZSknXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6ICdUYWcgaXMgbm90IHNpZ25lZCdcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogJ0ludmFsaWQgc2lnbmF0dXJlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFeHRyYWN0IHNpZ25lciBpbmZvcm1hdGlvblxuICAgICAgY29uc3Qga2V5TWF0Y2ggPSBvdXRwdXQubWF0Y2goL2tleSAoPzpJRCApPyhbQS1GMC05XSspL2kpO1xuICAgICAgY29uc3QgZW1haWxNYXRjaCA9IG91dHB1dC5tYXRjaCgvXCIoW15cIl0rKVwiLyk7XG4gICAgICBjb25zdCBkYXRlTWF0Y2ggPSBvdXRwdXQubWF0Y2goL21hZGUgKFxcdysgXFx3KyBcXGQrIFxcZCs6XFxkKzpcXGQrIFxcZCsgXFx3KykvKTtcbiAgICAgIFxuICAgICAgY29uc3Qgc2lnbmVyS2V5ID0ga2V5TWF0Y2ggPyBrZXlNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNpZ25lckVtYWlsID0gZW1haWxNYXRjaCA/IGVtYWlsTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzaWduYXR1cmVEYXRlID0gZGF0ZU1hdGNoID8gbmV3IERhdGUoZGF0ZU1hdGNoWzFdKSA6IHVuZGVmaW5lZDtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYga2V5IGlzIHRydXN0ZWRcbiAgICAgIGlmICh0aGlzLnRydXN0ZWRLZXlzLnNpemUgPiAwICYmIHNpZ25lcktleSkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IElEIGVuZHMgd2l0aCBhbnkgb2Ygb3VyIHRydXN0ZWQga2V5c1xuICAgICAgICBjb25zdCBpc1RydXN0ZWQgPSBBcnJheS5mcm9tKHRoaXMudHJ1c3RlZEtleXMpLnNvbWUodHJ1c3RlZEtleSA9PiBcbiAgICAgICAgICBzaWduZXJLZXkuZW5kc1dpdGgodHJ1c3RlZEtleS50b1VwcGVyQ2FzZSgpKVxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFpc1RydXN0ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgc2lnbmVyS2V5LFxuICAgICAgICAgICAgc2lnbmVyRW1haWwsXG4gICAgICAgICAgICBzaWduYXR1cmVEYXRlLFxuICAgICAgICAgICAgZXJyb3I6IGBTaWduYXR1cmUgaXMgdmFsaWQgYnV0IGtleSAke3NpZ25lcktleX0gaXMgbm90IGluIHRydXN0ZWQga2V5cyBsaXN0YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmVyaWZpZWQ6IHRydWUsXG4gICAgICAgIHNpZ25lcktleSxcbiAgICAgICAgc2lnbmVyRW1haWwsXG4gICAgICAgIHNpZ25hdHVyZURhdGVcbiAgICAgIH07XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYEZhaWxlZCB0byB2ZXJpZnkgc2lnbmF0dXJlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFZlcmlmeSBhIGZpbGUgY2hlY2tzdW0gYWdhaW5zdCBleHBlY3RlZCB2YWx1ZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGV4cGVjdGVkQ2hlY2tzdW0gRXhwZWN0ZWQgU0hBMjU2IGNoZWNrc3VtXG4gICAqIEByZXR1cm5zIFZlcmlmaWNhdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHZlcmlmeUNoZWNrc3VtKGZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkQ2hlY2tzdW06IHN0cmluZyk6IFByb21pc2U8Q2hlY2tzdW1WZXJpZmljYXRpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUmVhZCBmaWxlIGFuZCBjYWxjdWxhdGUgY2hlY2tzdW1cbiAgICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICAgICAgaGFzaC51cGRhdGUoZmlsZUJ1ZmZlcik7XG4gICAgICBjb25zdCBhY3R1YWxDaGVja3N1bSA9IGhhc2guZGlnZXN0KCdoZXgnKTtcbiAgICAgIFxuICAgICAgLy8gQ29tcGFyZSBjaGVja3N1bXNcbiAgICAgIGNvbnN0IHZlcmlmaWVkID0gYWN0dWFsQ2hlY2tzdW0udG9Mb3dlckNhc2UoKSA9PT0gZXhwZWN0ZWRDaGVja3N1bS50b0xvd2VyQ2FzZSgpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2ZXJpZmllZCxcbiAgICAgICAgZXhwZWN0ZWRDaGVja3N1bSxcbiAgICAgICAgYWN0dWFsQ2hlY2tzdW0sXG4gICAgICAgIGVycm9yOiB2ZXJpZmllZCA/IHVuZGVmaW5lZCA6ICdDaGVja3N1bSBtaXNtYXRjaCdcbiAgICAgIH07XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICBleHBlY3RlZENoZWNrc3VtLFxuICAgICAgICBlcnJvcjogYEZhaWxlZCB0byB2ZXJpZnkgY2hlY2tzdW06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogVmVyaWZ5IHJlbGVhc2UgYXJ0aWZhY3RzIHVzaW5nIGEgY2hlY2tzdW1zIGZpbGVcbiAgICogQHBhcmFtIGNoZWNrc3Vtc0ZpbGUgUGF0aCB0byBjaGVja3N1bXMgZmlsZSAoZS5nLiwgU0hBMjU2U1VNUylcbiAgICogQHBhcmFtIGFydGlmYWN0RGlyIERpcmVjdG9yeSBjb250YWluaW5nIGFydGlmYWN0cyB0byB2ZXJpZnlcbiAgICogQHJldHVybnMgTWFwIG9mIGZpbGVuYW1lIHRvIHZlcmlmaWNhdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHZlcmlmeVJlbGVhc2VBcnRpZmFjdHMoXG4gICAgY2hlY2tzdW1zRmlsZTogc3RyaW5nLCBcbiAgICBhcnRpZmFjdERpcjogc3RyaW5nXG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgQ2hlY2tzdW1WZXJpZmljYXRpb25SZXN1bHQ+PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBNYXA8c3RyaW5nLCBDaGVja3N1bVZlcmlmaWNhdGlvblJlc3VsdD4oKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gUmVhZCBjaGVja3N1bXMgZmlsZVxuICAgICAgY29uc3QgY2hlY2tzdW1zQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGNoZWNrc3Vtc0ZpbGUsICd1dGYtOCcpO1xuICAgICAgY29uc3QgbGluZXMgPSBjaGVja3N1bXNDb250ZW50LnNwbGl0KCdcXG4nKS5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIGNoZWNrc3VtcyAoZm9ybWF0OiBcImNoZWNrc3VtICBmaWxlbmFtZVwiIG9yIFwiY2hlY2tzdW0gKmZpbGVuYW1lXCIpXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFthLWYwLTldKylcXHMrXFwqPyguKykkL2kpO1xuICAgICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IFssIGNoZWNrc3VtLCBmaWxlbmFtZV0gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXJ0aWZhY3REaXIsIGZpbGVuYW1lKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBlYWNoIGZpbGVcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52ZXJpZnlDaGVja3N1bShmaWxlUGF0aCwgY2hlY2tzdW0pO1xuICAgICAgICByZXN1bHRzLnNldChmaWxlbmFtZSwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgd2UgY2FuJ3QgcmVhZCB0aGUgY2hlY2tzdW1zIGZpbGUsIG1hcmsgYWxsIGFzIHVudmVyaWZpZWRcbiAgICAgIHJlc3VsdHMuc2V0KCcqJywge1xuICAgICAgICB2ZXJpZmllZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBgRmFpbGVkIHRvIHJlYWQgY2hlY2tzdW1zIGZpbGU6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQWRkIGEgdHJ1c3RlZCBrZXkgZm9yIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGtleUlkIEdQRyBrZXkgSUQgb3IgZmluZ2VycHJpbnRcbiAgICovXG4gIGFkZFRydXN0ZWRLZXkoa2V5SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudHJ1c3RlZEtleXMuYWRkKGtleUlkLnRvVXBwZXJDYXNlKCkpO1xuICB9XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGEgdHJ1c3RlZCBrZXlcbiAgICogQHBhcmFtIGtleUlkIEdQRyBrZXkgSUQgb3IgZmluZ2VycHJpbnRcbiAgICovXG4gIHJlbW92ZVRydXN0ZWRLZXkoa2V5SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudHJ1c3RlZEtleXMuZGVsZXRlKGtleUlkLnRvVXBwZXJDYXNlKCkpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgdHJ1c3RlZCBrZXlzXG4gICAqL1xuICBnZXRUcnVzdGVkS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy50cnVzdGVkS2V5cyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBHUEcgcHVibGljIGtleVxuICAgKiBAcGFyYW0ga2V5RGF0YSBUaGUgcHVibGljIGtleSBkYXRhIHRvIGltcG9ydFxuICAgKiBAcmV0dXJucyBTdWNjZXNzIHN0YXR1c1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0UHVibGljS2V5KGtleURhdGE6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBXcml0ZSBrZXkgZGF0YSB0byB0ZW1wb3JhcnkgZmlsZSB3aXRoIHNlY3VyZSByYW5kb20gbmFtZVxuICAgICAgY29uc3QgdGVtcEZpbGUgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgYC5ncGctaW1wb3J0LSR7cmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoJ2hleCcpfS5hc2NgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wRmlsZSwga2V5RGF0YSk7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEltcG9ydCB0aGUga2V5XG4gICAgICAgIGF3YWl0IHNhZmVFeGVjKCdncGcnLCBbJy0taW1wb3J0JywgdGVtcEZpbGVdKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBDbGVhbiB1cCB0ZW1wIGZpbGVcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKHRlbXBGaWxlKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW1wb3J0IEdQRyBrZXk6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -1,127 +0,0 @@
1
- /**
2
- * UpdateChecker - Secure GitHub release update checking with comprehensive sanitization
3
- *
4
- * Security measures implemented:
5
- * 1. XSS Protection: DOMPurify with strict no-tags/no-attributes policy
6
- * 2. Command Injection Prevention: Multiple regex patterns for various escape sequences
7
- * 3. URL Validation: Whitelist approach allowing only http/https schemes
8
- * 4. Information Disclosure Prevention: Sanitized logging of sensitive data
9
- * 5. Length Limits: Configurable limits to prevent DoS attacks
10
- * 6. OWASP Patterns: Protection against PHP, ASP, hex, unicode, and octal escapes
11
- *
12
- * Performance optimizations:
13
- * - Cached DOMPurify instance to avoid recreation overhead
14
- * - Single-pass regex processing for injection patterns
15
- * - Exponential backoff for network retries
16
- */
17
- import { VersionManager } from './VersionManager.js';
18
- import { RateLimiter } from './RateLimiter.js';
19
- import { SignatureVerifier } from './SignatureVerifier.js';
20
- export interface UpdateCheckResult {
21
- currentVersion: string;
22
- latestVersion: string;
23
- isUpdateAvailable: boolean;
24
- releaseDate: string;
25
- releaseNotes: string;
26
- releaseUrl: string;
27
- tagName?: string;
28
- signatureVerified?: boolean;
29
- signerInfo?: string;
30
- }
31
- export declare class UpdateChecker {
32
- private versionManager;
33
- private rateLimiter;
34
- private signatureVerifier;
35
- private static purifyWindow;
36
- private static purify;
37
- private readonly releaseNotesMaxLength;
38
- private readonly urlMaxLength;
39
- private readonly securityLogger?;
40
- private readonly requireSignedReleases;
41
- constructor(versionManager: VersionManager, options?: {
42
- releaseNotesMaxLength?: number;
43
- urlMaxLength?: number;
44
- securityLogger?: (event: string, details: any) => void;
45
- rateLimiter?: RateLimiter;
46
- signatureVerifier?: SignatureVerifier;
47
- requireSignedReleases?: boolean;
48
- });
49
- /**
50
- * Execute a network operation with retry logic and exponential backoff
51
- * @param operation - The async operation to execute
52
- * @param maxRetries - Maximum number of retry attempts (default: 3)
53
- * @param baseDelay - Base delay in milliseconds for exponential backoff (default: 1000ms)
54
- * @returns Promise resolving to the operation result
55
- * @throws The last error if all retries fail
56
- */
57
- private retryNetworkOperation;
58
- /**
59
- * Check for updates from GitHub releases with security and error handling
60
- * @returns UpdateCheckResult if update info is available, null if no releases found
61
- * @throws Error for network or API failures or rate limit exceeded
62
- */
63
- checkForUpdates(): Promise<UpdateCheckResult | null>;
64
- /**
65
- * Get current rate limit status
66
- * @returns Current rate limit status including remaining requests and reset time
67
- */
68
- getRateLimitStatus(): {
69
- allowed: boolean;
70
- remainingRequests: number;
71
- resetTime: Date;
72
- waitTimeSeconds?: number;
73
- };
74
- /**
75
- * Format update check results for display with comprehensive sanitization
76
- * @param result - The update check result to format
77
- * @param error - Optional error from update check
78
- * @param personaIndicator - Optional persona indicator prefix
79
- * @returns Formatted string safe for display
80
- */
81
- formatUpdateCheckResult(result: UpdateCheckResult | null, error?: Error, personaIndicator?: string): string;
82
- /**
83
- * Sanitize URLs to prevent dangerous schemes and information disclosure
84
- *
85
- * Security measures:
86
- * - Length validation to prevent DoS
87
- * - Whitelist approach: only http/https allowed
88
- * - Sanitized logging to prevent sensitive data exposure
89
- *
90
- * @param url - The URL to sanitize
91
- * @returns Empty string if invalid/dangerous, original URL if safe
92
- */
93
- private sanitizeUrl;
94
- /**
95
- * Sanitize release notes to prevent XSS, command injection, and DoS
96
- *
97
- * Security layers:
98
- * 1. Length limiting (configurable, default 5000 chars)
99
- * 2. HTML/JS sanitization via DOMPurify (no tags/attributes allowed)
100
- * 3. Command injection pattern removal (backticks, command substitution)
101
- * 4. OWASP pattern removal (PHP, ASP, hex/unicode/octal escapes)
102
- *
103
- * @param notes - The release notes to sanitize
104
- * @returns Sanitized release notes safe for display
105
- */
106
- private sanitizeReleaseNotes;
107
- /**
108
- * Format date to human-readable format with consistent timezone handling
109
- * @param dateStr - ISO date string to format
110
- * @returns Human-readable date string (e.g., "January 5, 2025")
111
- */
112
- private formatDate;
113
- /**
114
- * Log security events for monitoring and alerting
115
- * Only logs if securityLogger callback was provided in constructor
116
- * @param event - The security event type
117
- * @param details - Event details (sanitized to prevent info disclosure)
118
- */
119
- private logSecurityEvent;
120
- /**
121
- * Reset static DOMPurify cache (useful for long-running processes)
122
- * This prevents memory accumulation in services that run for extended periods
123
- * @static
124
- */
125
- static resetCache(): void;
126
- }
127
- //# sourceMappingURL=UpdateChecker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UpdateChecker.d.ts","sourceRoot":"","sources":["../../../../src/update/UpdateChecker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,iBAAiB,CAAoB;IAK7C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAkC;IAGvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAwC;IACxE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;gBAG9C,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;QACvD,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;QACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC;IA+CH;;;;;;;OAOG;YACW,qBAAqB;IAgCnC;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IA4H1D;;;OAGG;IACH,kBAAkB,IAAI;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IAUD;;;;;;OAMG;IACH,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;IAoF/G;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IAiCnB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IA+E5B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAmBlB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;OAIG;WACW,UAAU,IAAI,IAAI;CAIjC"}