@dollhousemcp/mcp-server 1.4.4 → 1.4.5

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