@dollhousemcp/mcp-server 1.4.4 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (667) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +68 -7
  3. package/dist/auth/GitHubAuthManager.d.ts +93 -0
  4. package/dist/auth/GitHubAuthManager.d.ts.map +1 -0
  5. package/dist/auth/GitHubAuthManager.js +465 -0
  6. package/dist/generated/version.d.ts +2 -2
  7. package/dist/generated/version.js +3 -3
  8. package/dist/index.d.ts +23 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +244 -5
  11. package/dist/security/tokenManager.d.ts +34 -0
  12. package/dist/security/tokenManager.d.ts.map +1 -1
  13. package/dist/security/tokenManager.js +199 -1
  14. package/dist/server/ServerSetup.d.ts.map +1 -1
  15. package/dist/server/ServerSetup.js +4 -1
  16. package/dist/server/tools/AuthTools.d.ts +10 -0
  17. package/dist/server/tools/AuthTools.d.ts.map +1 -0
  18. package/dist/server/tools/AuthTools.js +41 -0
  19. package/dist/server/types.d.ts +3 -0
  20. package/dist/server/types.d.ts.map +1 -1
  21. package/dist/server/types.js +1 -1
  22. package/package.json +1 -1
  23. package/dist/collection/MarketplaceBrowser.d.ts +0 -24
  24. package/dist/collection/MarketplaceBrowser.d.ts.map +0 -1
  25. package/dist/collection/MarketplaceBrowser.js +0 -115
  26. package/dist/collection/MarketplaceSearch.d.ts +0 -18
  27. package/dist/collection/MarketplaceSearch.d.ts.map +0 -1
  28. package/dist/collection/MarketplaceSearch.js +0 -48
  29. package/dist/collection/PersonaInstaller.d.ts +0 -26
  30. package/dist/collection/PersonaInstaller.d.ts.map +0 -1
  31. package/dist/collection/PersonaInstaller.js +0 -103
  32. package/dist/elements/ensembles/Ensemble.d.ts +0 -144
  33. package/dist/elements/ensembles/Ensemble.d.ts.map +0 -1
  34. package/dist/elements/ensembles/Ensemble.js +0 -860
  35. package/dist/elements/ensembles/EnsembleManager.d.ts +0 -85
  36. package/dist/elements/ensembles/EnsembleManager.d.ts.map +0 -1
  37. package/dist/elements/ensembles/EnsembleManager.js +0 -378
  38. package/dist/elements/ensembles/constants.d.ts +0 -73
  39. package/dist/elements/ensembles/constants.d.ts.map +0 -1
  40. package/dist/elements/ensembles/constants.js +0 -92
  41. package/dist/elements/ensembles/index.d.ts +0 -8
  42. package/dist/elements/ensembles/index.d.ts.map +0 -1
  43. package/dist/elements/ensembles/index.js +0 -8
  44. package/dist/elements/ensembles/types.d.ts +0 -92
  45. package/dist/elements/ensembles/types.d.ts.map +0 -1
  46. package/dist/elements/ensembles/types.js +0 -8
  47. package/dist/elements/memories/Memory.d.ts +0 -110
  48. package/dist/elements/memories/Memory.d.ts.map +0 -1
  49. package/dist/elements/memories/Memory.js +0 -470
  50. package/dist/elements/memories/MemoryManager.d.ts +0 -86
  51. package/dist/elements/memories/MemoryManager.d.ts.map +0 -1
  52. package/dist/elements/memories/MemoryManager.js +0 -435
  53. package/dist/elements/memories/constants.d.ts +0 -42
  54. package/dist/elements/memories/constants.d.ts.map +0 -1
  55. package/dist/elements/memories/constants.js +0 -49
  56. package/dist/elements/memories/index.d.ts +0 -6
  57. package/dist/elements/memories/index.d.ts.map +0 -1
  58. package/dist/elements/memories/index.js +0 -6
  59. package/dist/marketplace/GitHubClient.d.ts +0 -22
  60. package/dist/marketplace/GitHubClient.d.ts.map +0 -1
  61. package/dist/marketplace/GitHubClient.js +0 -112
  62. package/dist/marketplace/MarketplaceBrowser.d.ts +0 -24
  63. package/dist/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  64. package/dist/marketplace/MarketplaceBrowser.js +0 -115
  65. package/dist/marketplace/MarketplaceSearch.d.ts +0 -18
  66. package/dist/marketplace/MarketplaceSearch.d.ts.map +0 -1
  67. package/dist/marketplace/MarketplaceSearch.js +0 -48
  68. package/dist/marketplace/PersonaDetails.d.ts +0 -22
  69. package/dist/marketplace/PersonaDetails.d.ts.map +0 -1
  70. package/dist/marketplace/PersonaDetails.js +0 -71
  71. package/dist/marketplace/PersonaInstaller.d.ts +0 -25
  72. package/dist/marketplace/PersonaInstaller.d.ts.map +0 -1
  73. package/dist/marketplace/PersonaInstaller.js +0 -100
  74. package/dist/marketplace/PersonaSubmitter.d.ts +0 -19
  75. package/dist/marketplace/PersonaSubmitter.d.ts.map +0 -1
  76. package/dist/marketplace/PersonaSubmitter.js +0 -57
  77. package/dist/marketplace/index.d.ts +0 -10
  78. package/dist/marketplace/index.d.ts.map +0 -1
  79. package/dist/marketplace/index.js +0 -10
  80. package/dist/server/tools/MarketplaceTools.d.ts +0 -10
  81. package/dist/server/tools/MarketplaceTools.d.ts.map +0 -1
  82. package/dist/server/tools/MarketplaceTools.js +0 -96
  83. package/dist/src/cache/APICache.d.ts +0 -23
  84. package/dist/src/cache/APICache.d.ts.map +0 -1
  85. package/dist/src/cache/APICache.js +0 -42
  86. package/dist/src/cache/index.d.ts +0 -5
  87. package/dist/src/cache/index.d.ts.map +0 -1
  88. package/dist/src/cache/index.js +0 -5
  89. package/dist/src/config/constants.d.ts +0 -25
  90. package/dist/src/config/constants.d.ts.map +0 -1
  91. package/dist/src/config/constants.js +0 -30
  92. package/dist/src/config/index.d.ts +0 -6
  93. package/dist/src/config/index.d.ts.map +0 -1
  94. package/dist/src/config/index.js +0 -6
  95. package/dist/src/config/indicator-config.d.ts +0 -107
  96. package/dist/src/config/indicator-config.d.ts.map +0 -1
  97. package/dist/src/config/indicator-config.js +0 -158
  98. package/dist/src/constants/defaultPersonas.d.ts +0 -10
  99. package/dist/src/constants/defaultPersonas.d.ts.map +0 -1
  100. package/dist/src/constants/defaultPersonas.js +0 -18
  101. package/dist/src/constants/limits.d.ts +0 -10
  102. package/dist/src/constants/limits.d.ts.map +0 -1
  103. package/dist/src/constants/limits.js +0 -13
  104. package/dist/src/errors/SecurityError.d.ts +0 -29
  105. package/dist/src/errors/SecurityError.d.ts.map +0 -1
  106. package/dist/src/errors/SecurityError.js +0 -47
  107. package/dist/src/errors/index.d.ts +0 -2
  108. package/dist/src/errors/index.d.ts.map +0 -1
  109. package/dist/src/errors/index.js +0 -2
  110. package/dist/src/index.barrel.d.ts +0 -21
  111. package/dist/src/index.barrel.d.ts.map +0 -1
  112. package/dist/src/index.barrel.js +0 -31
  113. package/dist/src/index.d.ts +0 -220
  114. package/dist/src/index.d.ts.map +0 -1
  115. package/dist/src/index.js +0 -1559
  116. package/dist/src/marketplace/GitHubClient.d.ts +0 -22
  117. package/dist/src/marketplace/GitHubClient.d.ts.map +0 -1
  118. package/dist/src/marketplace/GitHubClient.js +0 -112
  119. package/dist/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  120. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  121. package/dist/src/marketplace/MarketplaceBrowser.js +0 -45
  122. package/dist/src/marketplace/MarketplaceSearch.d.ts +0 -18
  123. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  124. package/dist/src/marketplace/MarketplaceSearch.js +0 -36
  125. package/dist/src/marketplace/PersonaDetails.d.ts +0 -22
  126. package/dist/src/marketplace/PersonaDetails.d.ts.map +0 -1
  127. package/dist/src/marketplace/PersonaDetails.js +0 -71
  128. package/dist/src/marketplace/PersonaInstaller.d.ts +0 -25
  129. package/dist/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  130. package/dist/src/marketplace/PersonaInstaller.js +0 -100
  131. package/dist/src/marketplace/PersonaSubmitter.d.ts +0 -19
  132. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  133. package/dist/src/marketplace/PersonaSubmitter.js +0 -57
  134. package/dist/src/marketplace/index.d.ts +0 -10
  135. package/dist/src/marketplace/index.d.ts.map +0 -1
  136. package/dist/src/marketplace/index.js +0 -10
  137. package/dist/src/persona/PersonaLoader.d.ts +0 -33
  138. package/dist/src/persona/PersonaLoader.d.ts.map +0 -1
  139. package/dist/src/persona/PersonaLoader.js +0 -139
  140. package/dist/src/persona/PersonaManager.d.ts +0 -112
  141. package/dist/src/persona/PersonaManager.d.ts.map +0 -1
  142. package/dist/src/persona/PersonaManager.js +0 -341
  143. package/dist/src/persona/PersonaValidator.d.ts +0 -33
  144. package/dist/src/persona/PersonaValidator.d.ts.map +0 -1
  145. package/dist/src/persona/PersonaValidator.js +0 -157
  146. package/dist/src/persona/export-import/PersonaExporter.d.ts +0 -43
  147. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  148. package/dist/src/persona/export-import/PersonaExporter.js +0 -99
  149. package/dist/src/persona/export-import/PersonaImporter.d.ts +0 -65
  150. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  151. package/dist/src/persona/export-import/PersonaImporter.js +0 -313
  152. package/dist/src/persona/export-import/PersonaSharer.d.ts +0 -60
  153. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  154. package/dist/src/persona/export-import/PersonaSharer.js +0 -363
  155. package/dist/src/persona/export-import/index.d.ts +0 -10
  156. package/dist/src/persona/export-import/index.d.ts.map +0 -1
  157. package/dist/src/persona/export-import/index.js +0 -7
  158. package/dist/src/persona/index.d.ts +0 -7
  159. package/dist/src/persona/index.d.ts.map +0 -1
  160. package/dist/src/persona/index.js +0 -7
  161. package/dist/src/security/InputValidator.d.ts +0 -69
  162. package/dist/src/security/InputValidator.d.ts.map +0 -1
  163. package/dist/src/security/InputValidator.js +0 -381
  164. package/dist/src/security/commandValidator.d.ts +0 -7
  165. package/dist/src/security/commandValidator.d.ts.map +0 -1
  166. package/dist/src/security/commandValidator.js +0 -77
  167. package/dist/src/security/constants.d.ts +0 -21
  168. package/dist/src/security/constants.d.ts.map +0 -1
  169. package/dist/src/security/constants.js +0 -23
  170. package/dist/src/security/contentValidator.d.ts +0 -47
  171. package/dist/src/security/contentValidator.d.ts.map +0 -1
  172. package/dist/src/security/contentValidator.js +0 -188
  173. package/dist/src/security/fileLockManager.d.ts +0 -70
  174. package/dist/src/security/fileLockManager.d.ts.map +0 -1
  175. package/dist/src/security/fileLockManager.js +0 -187
  176. package/dist/src/security/index.d.ts +0 -12
  177. package/dist/src/security/index.d.ts.map +0 -1
  178. package/dist/src/security/index.js +0 -14
  179. package/dist/src/security/pathValidator.d.ts +0 -9
  180. package/dist/src/security/pathValidator.d.ts.map +0 -1
  181. package/dist/src/security/pathValidator.js +0 -97
  182. package/dist/src/security/secureYamlParser.d.ts +0 -46
  183. package/dist/src/security/secureYamlParser.d.ts.map +0 -1
  184. package/dist/src/security/secureYamlParser.js +0 -203
  185. package/dist/src/security/securityMonitor.d.ts +0 -58
  186. package/dist/src/security/securityMonitor.d.ts.map +0 -1
  187. package/dist/src/security/securityMonitor.js +0 -108
  188. package/dist/src/security/tokenManager.d.ts +0 -59
  189. package/dist/src/security/tokenManager.d.ts.map +0 -1
  190. package/dist/src/security/tokenManager.js +0 -216
  191. package/dist/src/security/yamlValidator.d.ts +0 -20
  192. package/dist/src/security/yamlValidator.d.ts.map +0 -1
  193. package/dist/src/security/yamlValidator.js +0 -138
  194. package/dist/src/server/ServerSetup.d.ts +0 -31
  195. package/dist/src/server/ServerSetup.d.ts.map +0 -1
  196. package/dist/src/server/ServerSetup.js +0 -79
  197. package/dist/src/server/index.d.ts +0 -7
  198. package/dist/src/server/index.d.ts.map +0 -1
  199. package/dist/src/server/index.js +0 -7
  200. package/dist/src/server/tools/ConfigTools.d.ts +0 -10
  201. package/dist/src/server/tools/ConfigTools.d.ts.map +0 -1
  202. package/dist/src/server/tools/ConfigTools.js +0 -63
  203. package/dist/src/server/tools/MarketplaceTools.d.ts +0 -10
  204. package/dist/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  205. package/dist/src/server/tools/MarketplaceTools.js +0 -92
  206. package/dist/src/server/tools/PersonaTools.d.ts +0 -10
  207. package/dist/src/server/tools/PersonaTools.d.ts.map +0 -1
  208. package/dist/src/server/tools/PersonaTools.js +0 -257
  209. package/dist/src/server/tools/ToolRegistry.d.ts +0 -37
  210. package/dist/src/server/tools/ToolRegistry.d.ts.map +0 -1
  211. package/dist/src/server/tools/ToolRegistry.js +0 -40
  212. package/dist/src/server/tools/UpdateTools.d.ts +0 -10
  213. package/dist/src/server/tools/UpdateTools.d.ts.map +0 -1
  214. package/dist/src/server/tools/UpdateTools.js +0 -64
  215. package/dist/src/server/tools/UserTools.d.ts +0 -10
  216. package/dist/src/server/tools/UserTools.d.ts.map +0 -1
  217. package/dist/src/server/tools/UserTools.js +0 -51
  218. package/dist/src/server/tools/index.d.ts +0 -10
  219. package/dist/src/server/tools/index.d.ts.map +0 -1
  220. package/dist/src/server/tools/index.js +0 -10
  221. package/dist/src/server/types.d.ts +0 -34
  222. package/dist/src/server/types.d.ts.map +0 -1
  223. package/dist/src/server/types.js +0 -5
  224. package/dist/src/tools/debug.d.ts +0 -20
  225. package/dist/src/tools/debug.d.ts.map +0 -1
  226. package/dist/src/tools/debug.js +0 -37
  227. package/dist/src/types/cache.d.ts +0 -8
  228. package/dist/src/types/cache.d.ts.map +0 -1
  229. package/dist/src/types/cache.js +0 -5
  230. package/dist/src/types/index.d.ts +0 -8
  231. package/dist/src/types/index.d.ts.map +0 -1
  232. package/dist/src/types/index.js +0 -8
  233. package/dist/src/types/marketplace.d.ts +0 -23
  234. package/dist/src/types/marketplace.d.ts.map +0 -1
  235. package/dist/src/types/marketplace.js +0 -5
  236. package/dist/src/types/mcp.d.ts +0 -161
  237. package/dist/src/types/mcp.d.ts.map +0 -1
  238. package/dist/src/types/mcp.js +0 -75
  239. package/dist/src/types/persona.d.ts +0 -30
  240. package/dist/src/types/persona.d.ts.map +0 -1
  241. package/dist/src/types/persona.js +0 -5
  242. package/dist/src/update/BackupManager.d.ts +0 -46
  243. package/dist/src/update/BackupManager.d.ts.map +0 -1
  244. package/dist/src/update/BackupManager.js +0 -261
  245. package/dist/src/update/DependencyChecker.d.ts +0 -41
  246. package/dist/src/update/DependencyChecker.d.ts.map +0 -1
  247. package/dist/src/update/DependencyChecker.js +0 -132
  248. package/dist/src/update/RateLimiter.d.ts +0 -80
  249. package/dist/src/update/RateLimiter.d.ts.map +0 -1
  250. package/dist/src/update/RateLimiter.js +0 -172
  251. package/dist/src/update/SignatureVerifier.d.ts +0 -71
  252. package/dist/src/update/SignatureVerifier.d.ts.map +0 -1
  253. package/dist/src/update/SignatureVerifier.js +0 -214
  254. package/dist/src/update/UpdateChecker.d.ts +0 -127
  255. package/dist/src/update/UpdateChecker.d.ts.map +0 -1
  256. package/dist/src/update/UpdateChecker.js +0 -460
  257. package/dist/src/update/UpdateManager.d.ts +0 -41
  258. package/dist/src/update/UpdateManager.d.ts.map +0 -1
  259. package/dist/src/update/UpdateManager.js +0 -260
  260. package/dist/src/update/VersionManager.d.ts +0 -31
  261. package/dist/src/update/VersionManager.d.ts.map +0 -1
  262. package/dist/src/update/VersionManager.js +0 -134
  263. package/dist/src/update/index.d.ts +0 -9
  264. package/dist/src/update/index.d.ts.map +0 -1
  265. package/dist/src/update/index.js +0 -9
  266. package/dist/src/utils/filesystem.d.ts +0 -32
  267. package/dist/src/utils/filesystem.d.ts.map +0 -1
  268. package/dist/src/utils/filesystem.js +0 -73
  269. package/dist/src/utils/git.d.ts +0 -32
  270. package/dist/src/utils/git.d.ts.map +0 -1
  271. package/dist/src/utils/git.js +0 -65
  272. package/dist/src/utils/index.d.ts +0 -7
  273. package/dist/src/utils/index.d.ts.map +0 -1
  274. package/dist/src/utils/index.js +0 -7
  275. package/dist/src/utils/logger.d.ts +0 -45
  276. package/dist/src/utils/logger.d.ts.map +0 -1
  277. package/dist/src/utils/logger.js +0 -91
  278. package/dist/src/utils/version.d.ts +0 -25
  279. package/dist/src/utils/version.d.ts.map +0 -1
  280. package/dist/src/utils/version.js +0 -97
  281. package/dist/test/src/cache/APICache.d.ts +0 -23
  282. package/dist/test/src/cache/APICache.d.ts.map +0 -1
  283. package/dist/test/src/cache/APICache.js +0 -42
  284. package/dist/test/src/cache/index.d.ts +0 -5
  285. package/dist/test/src/cache/index.d.ts.map +0 -1
  286. package/dist/test/src/cache/index.js +0 -5
  287. package/dist/test/src/collection/CollectionBrowser.d.ts +0 -24
  288. package/dist/test/src/collection/CollectionBrowser.d.ts.map +0 -1
  289. package/dist/test/src/collection/CollectionBrowser.js +0 -115
  290. package/dist/test/src/collection/CollectionSearch.d.ts +0 -18
  291. package/dist/test/src/collection/CollectionSearch.d.ts.map +0 -1
  292. package/dist/test/src/collection/CollectionSearch.js +0 -48
  293. package/dist/test/src/collection/GitHubClient.d.ts +0 -22
  294. package/dist/test/src/collection/GitHubClient.d.ts.map +0 -1
  295. package/dist/test/src/collection/GitHubClient.js +0 -114
  296. package/dist/test/src/collection/PersonaDetails.d.ts +0 -22
  297. package/dist/test/src/collection/PersonaDetails.d.ts.map +0 -1
  298. package/dist/test/src/collection/PersonaDetails.js +0 -71
  299. package/dist/test/src/collection/PersonaInstaller.d.ts +0 -26
  300. package/dist/test/src/collection/PersonaInstaller.d.ts.map +0 -1
  301. package/dist/test/src/collection/PersonaInstaller.js +0 -103
  302. package/dist/test/src/collection/PersonaSubmitter.d.ts +0 -19
  303. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +0 -1
  304. package/dist/test/src/collection/PersonaSubmitter.js +0 -57
  305. package/dist/test/src/collection/index.d.ts +0 -10
  306. package/dist/test/src/collection/index.d.ts.map +0 -1
  307. package/dist/test/src/collection/index.js +0 -10
  308. package/dist/test/src/config/constants.d.ts +0 -25
  309. package/dist/test/src/config/constants.d.ts.map +0 -1
  310. package/dist/test/src/config/constants.js +0 -30
  311. package/dist/test/src/config/index.d.ts +0 -6
  312. package/dist/test/src/config/index.d.ts.map +0 -1
  313. package/dist/test/src/config/index.js +0 -6
  314. package/dist/test/src/config/indicator-config.d.ts +0 -107
  315. package/dist/test/src/config/indicator-config.d.ts.map +0 -1
  316. package/dist/test/src/config/indicator-config.js +0 -158
  317. package/dist/test/src/constants/defaultPersonas.d.ts +0 -10
  318. package/dist/test/src/constants/defaultPersonas.d.ts.map +0 -1
  319. package/dist/test/src/constants/defaultPersonas.js +0 -18
  320. package/dist/test/src/constants/limits.d.ts +0 -10
  321. package/dist/test/src/constants/limits.d.ts.map +0 -1
  322. package/dist/test/src/constants/limits.js +0 -13
  323. package/dist/test/src/elements/BaseElement.d.ts +0 -81
  324. package/dist/test/src/elements/BaseElement.d.ts.map +0 -1
  325. package/dist/test/src/elements/BaseElement.js +0 -381
  326. package/dist/test/src/elements/FeedbackProcessor.d.ts +0 -57
  327. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +0 -1
  328. package/dist/test/src/elements/FeedbackProcessor.js +0 -418
  329. package/dist/test/src/elements/agents/Agent.d.ts +0 -145
  330. package/dist/test/src/elements/agents/Agent.d.ts.map +0 -1
  331. package/dist/test/src/elements/agents/Agent.js +0 -848
  332. package/dist/test/src/elements/agents/AgentManager.d.ts +0 -125
  333. package/dist/test/src/elements/agents/AgentManager.d.ts.map +0 -1
  334. package/dist/test/src/elements/agents/AgentManager.js +0 -608
  335. package/dist/test/src/elements/agents/constants.d.ts +0 -42
  336. package/dist/test/src/elements/agents/constants.d.ts.map +0 -1
  337. package/dist/test/src/elements/agents/constants.js +0 -45
  338. package/dist/test/src/elements/agents/goalTemplates.d.ts +0 -44
  339. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +0 -1
  340. package/dist/test/src/elements/agents/goalTemplates.js +0 -297
  341. package/dist/test/src/elements/agents/index.d.ts +0 -8
  342. package/dist/test/src/elements/agents/index.d.ts.map +0 -1
  343. package/dist/test/src/elements/agents/index.js +0 -8
  344. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +0 -76
  345. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +0 -1
  346. package/dist/test/src/elements/agents/ruleEngineConfig.js +0 -143
  347. package/dist/test/src/elements/agents/types.d.ts +0 -97
  348. package/dist/test/src/elements/agents/types.d.ts.map +0 -1
  349. package/dist/test/src/elements/agents/types.js +0 -5
  350. package/dist/test/src/elements/index.d.ts +0 -6
  351. package/dist/test/src/elements/index.d.ts.map +0 -1
  352. package/dist/test/src/elements/index.js +0 -6
  353. package/dist/test/src/elements/memories/Memory.d.ts +0 -110
  354. package/dist/test/src/elements/memories/Memory.d.ts.map +0 -1
  355. package/dist/test/src/elements/memories/Memory.js +0 -470
  356. package/dist/test/src/elements/memories/MemoryManager.d.ts +0 -86
  357. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +0 -1
  358. package/dist/test/src/elements/memories/MemoryManager.js +0 -435
  359. package/dist/test/src/elements/memories/constants.d.ts +0 -42
  360. package/dist/test/src/elements/memories/constants.d.ts.map +0 -1
  361. package/dist/test/src/elements/memories/constants.js +0 -49
  362. package/dist/test/src/elements/memories/index.d.ts +0 -6
  363. package/dist/test/src/elements/memories/index.d.ts.map +0 -1
  364. package/dist/test/src/elements/memories/index.js +0 -6
  365. package/dist/test/src/elements/skills/Skill.d.ts +0 -109
  366. package/dist/test/src/elements/skills/Skill.d.ts.map +0 -1
  367. package/dist/test/src/elements/skills/Skill.js +0 -381
  368. package/dist/test/src/elements/templates/Template.d.ts +0 -138
  369. package/dist/test/src/elements/templates/Template.d.ts.map +0 -1
  370. package/dist/test/src/elements/templates/Template.js +0 -673
  371. package/dist/test/src/elements/templates/TemplateManager.d.ts +0 -104
  372. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +0 -1
  373. package/dist/test/src/elements/templates/TemplateManager.js +0 -496
  374. package/dist/test/src/elements/templates/index.d.ts +0 -6
  375. package/dist/test/src/elements/templates/index.d.ts.map +0 -1
  376. package/dist/test/src/elements/templates/index.js +0 -6
  377. package/dist/test/src/errors/SecurityError.d.ts +0 -29
  378. package/dist/test/src/errors/SecurityError.d.ts.map +0 -1
  379. package/dist/test/src/errors/SecurityError.js +0 -47
  380. package/dist/test/src/errors/index.d.ts +0 -2
  381. package/dist/test/src/errors/index.d.ts.map +0 -1
  382. package/dist/test/src/errors/index.js +0 -2
  383. package/dist/test/src/index.barrel.d.ts +0 -21
  384. package/dist/test/src/index.barrel.d.ts.map +0 -1
  385. package/dist/test/src/index.barrel.js +0 -31
  386. package/dist/test/src/index.d.ts +0 -223
  387. package/dist/test/src/index.d.ts.map +0 -1
  388. package/dist/test/src/index.js +0 -1594
  389. package/dist/test/src/marketplace/GitHubClient.d.ts +0 -22
  390. package/dist/test/src/marketplace/GitHubClient.d.ts.map +0 -1
  391. package/dist/test/src/marketplace/GitHubClient.js +0 -112
  392. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  393. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  394. package/dist/test/src/marketplace/MarketplaceBrowser.js +0 -45
  395. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +0 -18
  396. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  397. package/dist/test/src/marketplace/MarketplaceSearch.js +0 -36
  398. package/dist/test/src/marketplace/PersonaDetails.d.ts +0 -22
  399. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +0 -1
  400. package/dist/test/src/marketplace/PersonaDetails.js +0 -71
  401. package/dist/test/src/marketplace/PersonaInstaller.d.ts +0 -25
  402. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  403. package/dist/test/src/marketplace/PersonaInstaller.js +0 -100
  404. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +0 -19
  405. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  406. package/dist/test/src/marketplace/PersonaSubmitter.js +0 -57
  407. package/dist/test/src/marketplace/index.d.ts +0 -10
  408. package/dist/test/src/marketplace/index.d.ts.map +0 -1
  409. package/dist/test/src/marketplace/index.js +0 -10
  410. package/dist/test/src/persona/PersonaElement.d.ts +0 -64
  411. package/dist/test/src/persona/PersonaElement.d.ts.map +0 -1
  412. package/dist/test/src/persona/PersonaElement.js +0 -223
  413. package/dist/test/src/persona/PersonaElementManager.d.ts +0 -97
  414. package/dist/test/src/persona/PersonaElementManager.d.ts.map +0 -1
  415. package/dist/test/src/persona/PersonaElementManager.js +0 -342
  416. package/dist/test/src/persona/PersonaLoader.d.ts +0 -34
  417. package/dist/test/src/persona/PersonaLoader.d.ts.map +0 -1
  418. package/dist/test/src/persona/PersonaLoader.js +0 -145
  419. package/dist/test/src/persona/PersonaManager.d.ts +0 -112
  420. package/dist/test/src/persona/PersonaManager.d.ts.map +0 -1
  421. package/dist/test/src/persona/PersonaManager.js +0 -341
  422. package/dist/test/src/persona/PersonaValidator.d.ts +0 -33
  423. package/dist/test/src/persona/PersonaValidator.d.ts.map +0 -1
  424. package/dist/test/src/persona/PersonaValidator.js +0 -157
  425. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +0 -43
  426. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  427. package/dist/test/src/persona/export-import/PersonaExporter.js +0 -99
  428. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +0 -65
  429. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  430. package/dist/test/src/persona/export-import/PersonaImporter.js +0 -315
  431. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +0 -60
  432. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  433. package/dist/test/src/persona/export-import/PersonaSharer.js +0 -502
  434. package/dist/test/src/persona/export-import/index.d.ts +0 -10
  435. package/dist/test/src/persona/export-import/index.d.ts.map +0 -1
  436. package/dist/test/src/persona/export-import/index.js +0 -7
  437. package/dist/test/src/persona/index.d.ts +0 -7
  438. package/dist/test/src/persona/index.d.ts.map +0 -1
  439. package/dist/test/src/persona/index.js +0 -7
  440. package/dist/test/src/portfolio/MigrationManager.d.ts +0 -44
  441. package/dist/test/src/portfolio/MigrationManager.d.ts.map +0 -1
  442. package/dist/test/src/portfolio/MigrationManager.js +0 -163
  443. package/dist/test/src/portfolio/PortfolioManager.d.ts +0 -54
  444. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +0 -1
  445. package/dist/test/src/portfolio/PortfolioManager.js +0 -224
  446. package/dist/test/src/portfolio/types.d.ts +0 -18
  447. package/dist/test/src/portfolio/types.d.ts.map +0 -1
  448. package/dist/test/src/portfolio/types.js +0 -13
  449. package/dist/test/src/security/InputValidator.d.ts +0 -80
  450. package/dist/test/src/security/InputValidator.d.ts.map +0 -1
  451. package/dist/test/src/security/InputValidator.js +0 -436
  452. package/dist/test/src/security/audit/SecurityAuditor.d.ts +0 -44
  453. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +0 -1
  454. package/dist/test/src/security/audit/SecurityAuditor.js +0 -274
  455. package/dist/test/src/security/audit/config/suppressions.d.ts +0 -34
  456. package/dist/test/src/security/audit/config/suppressions.d.ts.map +0 -1
  457. package/dist/test/src/security/audit/config/suppressions.js +0 -575
  458. package/dist/test/src/security/audit/index.d.ts +0 -14
  459. package/dist/test/src/security/audit/index.d.ts.map +0 -1
  460. package/dist/test/src/security/audit/index.js +0 -15
  461. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +0 -46
  462. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +0 -1
  463. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +0 -174
  464. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +0 -13
  465. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +0 -1
  466. package/dist/test/src/security/audit/reporters/JsonReporter.js +0 -25
  467. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +0 -13
  468. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +0 -1
  469. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +0 -79
  470. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +0 -20
  471. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +0 -1
  472. package/dist/test/src/security/audit/rules/SecurityRules.js +0 -244
  473. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +0 -47
  474. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +0 -1
  475. package/dist/test/src/security/audit/scanners/CodeScanner.js +0 -174
  476. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +0 -13
  477. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +0 -1
  478. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +0 -22
  479. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +0 -13
  480. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +0 -1
  481. package/dist/test/src/security/audit/scanners/DependencyScanner.js +0 -22
  482. package/dist/test/src/security/audit/types.d.ts +0 -94
  483. package/dist/test/src/security/audit/types.d.ts.map +0 -1
  484. package/dist/test/src/security/audit/types.js +0 -6
  485. package/dist/test/src/security/commandValidator.d.ts +0 -7
  486. package/dist/test/src/security/commandValidator.d.ts.map +0 -1
  487. package/dist/test/src/security/commandValidator.js +0 -78
  488. package/dist/test/src/security/constants.d.ts +0 -24
  489. package/dist/test/src/security/constants.d.ts.map +0 -1
  490. package/dist/test/src/security/constants.js +0 -26
  491. package/dist/test/src/security/contentValidator.d.ts +0 -47
  492. package/dist/test/src/security/contentValidator.d.ts.map +0 -1
  493. package/dist/test/src/security/contentValidator.js +0 -301
  494. package/dist/test/src/security/errors.d.ts +0 -14
  495. package/dist/test/src/security/errors.d.ts.map +0 -1
  496. package/dist/test/src/security/errors.js +0 -28
  497. package/dist/test/src/security/fileLockManager.d.ts +0 -70
  498. package/dist/test/src/security/fileLockManager.d.ts.map +0 -1
  499. package/dist/test/src/security/fileLockManager.js +0 -187
  500. package/dist/test/src/security/index.d.ts +0 -12
  501. package/dist/test/src/security/index.d.ts.map +0 -1
  502. package/dist/test/src/security/index.js +0 -14
  503. package/dist/test/src/security/pathValidator.d.ts +0 -9
  504. package/dist/test/src/security/pathValidator.d.ts.map +0 -1
  505. package/dist/test/src/security/pathValidator.js +0 -98
  506. package/dist/test/src/security/regexValidator.d.ts +0 -59
  507. package/dist/test/src/security/regexValidator.d.ts.map +0 -1
  508. package/dist/test/src/security/regexValidator.js +0 -214
  509. package/dist/test/src/security/secureYamlParser.d.ts +0 -46
  510. package/dist/test/src/security/secureYamlParser.d.ts.map +0 -1
  511. package/dist/test/src/security/secureYamlParser.js +0 -203
  512. package/dist/test/src/security/securityMonitor.d.ts +0 -58
  513. package/dist/test/src/security/securityMonitor.d.ts.map +0 -1
  514. package/dist/test/src/security/securityMonitor.js +0 -108
  515. package/dist/test/src/security/tokenManager.d.ts +0 -85
  516. package/dist/test/src/security/tokenManager.d.ts.map +0 -1
  517. package/dist/test/src/security/tokenManager.js +0 -286
  518. package/dist/test/src/security/validators/unicodeValidator.d.ts +0 -97
  519. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +0 -1
  520. package/dist/test/src/security/validators/unicodeValidator.js +0 -312
  521. package/dist/test/src/security/yamlValidator.d.ts +0 -21
  522. package/dist/test/src/security/yamlValidator.d.ts.map +0 -1
  523. package/dist/test/src/security/yamlValidator.js +0 -164
  524. package/dist/test/src/server/ServerSetup.d.ts +0 -35
  525. package/dist/test/src/server/ServerSetup.d.ts.map +0 -1
  526. package/dist/test/src/server/ServerSetup.js +0 -116
  527. package/dist/test/src/server/index.d.ts +0 -7
  528. package/dist/test/src/server/index.d.ts.map +0 -1
  529. package/dist/test/src/server/index.js +0 -7
  530. package/dist/test/src/server/startup.d.ts +0 -31
  531. package/dist/test/src/server/startup.d.ts.map +0 -1
  532. package/dist/test/src/server/startup.js +0 -67
  533. package/dist/test/src/server/tools/CollectionTools.d.ts +0 -10
  534. package/dist/test/src/server/tools/CollectionTools.d.ts.map +0 -1
  535. package/dist/test/src/server/tools/CollectionTools.js +0 -96
  536. package/dist/test/src/server/tools/ConfigTools.d.ts +0 -10
  537. package/dist/test/src/server/tools/ConfigTools.d.ts.map +0 -1
  538. package/dist/test/src/server/tools/ConfigTools.js +0 -63
  539. package/dist/test/src/server/tools/MarketplaceTools.d.ts +0 -10
  540. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  541. package/dist/test/src/server/tools/MarketplaceTools.js +0 -92
  542. package/dist/test/src/server/tools/PersonaTools.d.ts +0 -10
  543. package/dist/test/src/server/tools/PersonaTools.d.ts.map +0 -1
  544. package/dist/test/src/server/tools/PersonaTools.js +0 -257
  545. package/dist/test/src/server/tools/ToolRegistry.d.ts +0 -37
  546. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +0 -1
  547. package/dist/test/src/server/tools/ToolRegistry.js +0 -40
  548. package/dist/test/src/server/tools/UpdateTools.d.ts +0 -10
  549. package/dist/test/src/server/tools/UpdateTools.d.ts.map +0 -1
  550. package/dist/test/src/server/tools/UpdateTools.js +0 -64
  551. package/dist/test/src/server/tools/UserTools.d.ts +0 -10
  552. package/dist/test/src/server/tools/UserTools.d.ts.map +0 -1
  553. package/dist/test/src/server/tools/UserTools.js +0 -51
  554. package/dist/test/src/server/tools/index.d.ts +0 -10
  555. package/dist/test/src/server/tools/index.d.ts.map +0 -1
  556. package/dist/test/src/server/tools/index.js +0 -10
  557. package/dist/test/src/server/types.d.ts +0 -34
  558. package/dist/test/src/server/types.d.ts.map +0 -1
  559. package/dist/test/src/server/types.js +0 -5
  560. package/dist/test/src/tools/debug.d.ts +0 -20
  561. package/dist/test/src/tools/debug.d.ts.map +0 -1
  562. package/dist/test/src/tools/debug.js +0 -37
  563. package/dist/test/src/types/cache.d.ts +0 -8
  564. package/dist/test/src/types/cache.d.ts.map +0 -1
  565. package/dist/test/src/types/cache.js +0 -5
  566. package/dist/test/src/types/collection.d.ts +0 -23
  567. package/dist/test/src/types/collection.d.ts.map +0 -1
  568. package/dist/test/src/types/collection.js +0 -5
  569. package/dist/test/src/types/elements/IElement.d.ts +0 -123
  570. package/dist/test/src/types/elements/IElement.d.ts.map +0 -1
  571. package/dist/test/src/types/elements/IElement.js +0 -30
  572. package/dist/test/src/types/elements/IElementManager.d.ts +0 -65
  573. package/dist/test/src/types/elements/IElementManager.d.ts.map +0 -1
  574. package/dist/test/src/types/elements/IElementManager.js +0 -6
  575. package/dist/test/src/types/elements/IRatingManager.d.ts +0 -109
  576. package/dist/test/src/types/elements/IRatingManager.d.ts.map +0 -1
  577. package/dist/test/src/types/elements/IRatingManager.js +0 -6
  578. package/dist/test/src/types/elements/IReferenceResolver.d.ts +0 -52
  579. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +0 -1
  580. package/dist/test/src/types/elements/IReferenceResolver.js +0 -6
  581. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +0 -49
  582. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +0 -1
  583. package/dist/test/src/types/elements/RatingBreakdowns.js +0 -6
  584. package/dist/test/src/types/elements/index.d.ts +0 -9
  585. package/dist/test/src/types/elements/index.d.ts.map +0 -1
  586. package/dist/test/src/types/elements/index.js +0 -11
  587. package/dist/test/src/types/index.d.ts +0 -9
  588. package/dist/test/src/types/index.d.ts.map +0 -1
  589. package/dist/test/src/types/index.js +0 -9
  590. package/dist/test/src/types/marketplace.d.ts +0 -23
  591. package/dist/test/src/types/marketplace.d.ts.map +0 -1
  592. package/dist/test/src/types/marketplace.js +0 -5
  593. package/dist/test/src/types/mcp.d.ts +0 -84
  594. package/dist/test/src/types/mcp.d.ts.map +0 -1
  595. package/dist/test/src/types/mcp.js +0 -80
  596. package/dist/test/src/types/persona.d.ts +0 -30
  597. package/dist/test/src/types/persona.d.ts.map +0 -1
  598. package/dist/test/src/types/persona.js +0 -5
  599. package/dist/test/src/update/BackupManager.d.ts +0 -46
  600. package/dist/test/src/update/BackupManager.d.ts.map +0 -1
  601. package/dist/test/src/update/BackupManager.js +0 -261
  602. package/dist/test/src/update/DependencyChecker.d.ts +0 -41
  603. package/dist/test/src/update/DependencyChecker.d.ts.map +0 -1
  604. package/dist/test/src/update/DependencyChecker.js +0 -132
  605. package/dist/test/src/update/RateLimiter.d.ts +0 -80
  606. package/dist/test/src/update/RateLimiter.d.ts.map +0 -1
  607. package/dist/test/src/update/RateLimiter.js +0 -172
  608. package/dist/test/src/update/SignatureVerifier.d.ts +0 -71
  609. package/dist/test/src/update/SignatureVerifier.d.ts.map +0 -1
  610. package/dist/test/src/update/SignatureVerifier.js +0 -214
  611. package/dist/test/src/update/UpdateChecker.d.ts +0 -127
  612. package/dist/test/src/update/UpdateChecker.d.ts.map +0 -1
  613. package/dist/test/src/update/UpdateChecker.js +0 -469
  614. package/dist/test/src/update/UpdateManager.d.ts +0 -41
  615. package/dist/test/src/update/UpdateManager.d.ts.map +0 -1
  616. package/dist/test/src/update/UpdateManager.js +0 -260
  617. package/dist/test/src/update/VersionManager.d.ts +0 -31
  618. package/dist/test/src/update/VersionManager.d.ts.map +0 -1
  619. package/dist/test/src/update/VersionManager.js +0 -134
  620. package/dist/test/src/update/index.d.ts +0 -9
  621. package/dist/test/src/update/index.d.ts.map +0 -1
  622. package/dist/test/src/update/index.js +0 -9
  623. package/dist/test/src/utils/filesystem.d.ts +0 -29
  624. package/dist/test/src/utils/filesystem.d.ts.map +0 -1
  625. package/dist/test/src/utils/filesystem.js +0 -94
  626. package/dist/test/src/utils/git.d.ts +0 -32
  627. package/dist/test/src/utils/git.d.ts.map +0 -1
  628. package/dist/test/src/utils/git.js +0 -65
  629. package/dist/test/src/utils/index.d.ts +0 -7
  630. package/dist/test/src/utils/index.d.ts.map +0 -1
  631. package/dist/test/src/utils/index.js +0 -7
  632. package/dist/test/src/utils/logger.d.ts +0 -45
  633. package/dist/test/src/utils/logger.d.ts.map +0 -1
  634. package/dist/test/src/utils/logger.js +0 -91
  635. package/dist/test/src/utils/version.d.ts +0 -25
  636. package/dist/test/src/utils/version.d.ts.map +0 -1
  637. package/dist/test/src/utils/version.js +0 -97
  638. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +0 -33
  639. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +0 -1
  640. package/dist/test/test/__tests__/integration/helpers/file-utils.js +0 -83
  641. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +0 -26
  642. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +0 -1
  643. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +0 -95
  644. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +0 -26
  645. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +0 -1
  646. package/dist/test/test/__tests__/integration/helpers/test-server.js +0 -41
  647. package/dist/test/test/__tests__/integration/setup.d.ts +0 -8
  648. package/dist/test/test/__tests__/integration/setup.d.ts.map +0 -1
  649. package/dist/test/test/__tests__/integration/setup.js +0 -31
  650. package/dist/test/test/__tests__/integration/teardown.d.ts +0 -5
  651. package/dist/test/test/__tests__/integration/teardown.d.ts.map +0 -1
  652. package/dist/test/test/__tests__/integration/teardown.js +0 -23
  653. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +0 -34
  654. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +0 -1
  655. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +0 -224
  656. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +0 -89
  657. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +0 -1
  658. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +0 -543
  659. package/dist/test/test/__tests__/security/index.d.ts +0 -46
  660. package/dist/test/test/__tests__/security/index.d.ts.map +0 -1
  661. package/dist/test/test/__tests__/security/index.js +0 -98
  662. package/dist/test/test/__tests__/security/setup.d.ts +0 -3
  663. package/dist/test/test/__tests__/security/setup.d.ts.map +0 -1
  664. package/dist/test/test/__tests__/security/setup.js +0 -23
  665. package/dist/types/marketplace.d.ts +0 -23
  666. package/dist/types/marketplace.d.ts.map +0 -1
  667. package/dist/types/marketplace.js +0 -5
@@ -1,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"}