@skillsmith/core 0.1.2 → 0.2.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 (325) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/analysis/CodebaseAnalyzer.d.ts +4 -134
  3. package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
  4. package/dist/src/analysis/CodebaseAnalyzer.js +7 -315
  5. package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
  6. package/dist/src/analysis/framework-detector.d.ts +47 -0
  7. package/dist/src/analysis/framework-detector.d.ts.map +1 -0
  8. package/dist/src/analysis/framework-detector.js +151 -0
  9. package/dist/src/analysis/framework-detector.js.map +1 -0
  10. package/dist/src/analysis/index.d.ts +6 -1
  11. package/dist/src/analysis/index.d.ts.map +1 -1
  12. package/dist/src/analysis/index.js +10 -1
  13. package/dist/src/analysis/index.js.map +1 -1
  14. package/dist/src/analysis/parsers.d.ts +43 -0
  15. package/dist/src/analysis/parsers.d.ts.map +1 -0
  16. package/dist/src/analysis/parsers.js +219 -0
  17. package/dist/src/analysis/parsers.js.map +1 -0
  18. package/dist/src/analysis/types.d.ts +138 -0
  19. package/dist/src/analysis/types.d.ts.map +1 -0
  20. package/dist/src/analysis/types.js +25 -0
  21. package/dist/src/analysis/types.js.map +1 -0
  22. package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
  23. package/dist/src/analytics/AnalyticsRepository.js +4 -4
  24. package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
  25. package/dist/src/api/cache.d.ts +108 -0
  26. package/dist/src/api/cache.d.ts.map +1 -0
  27. package/dist/src/api/cache.js +216 -0
  28. package/dist/src/api/cache.js.map +1 -0
  29. package/dist/src/api/client.d.ts +152 -0
  30. package/dist/src/api/client.d.ts.map +1 -0
  31. package/dist/src/api/client.js +221 -0
  32. package/dist/src/api/client.js.map +1 -0
  33. package/dist/src/api/index.d.ts +10 -0
  34. package/dist/src/api/index.d.ts.map +1 -0
  35. package/dist/src/api/index.js +10 -0
  36. package/dist/src/api/index.js.map +1 -0
  37. package/dist/src/benchmarks/BenchmarkRunner.d.ts +6 -175
  38. package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
  39. package/dist/src/benchmarks/BenchmarkRunner.js +6 -123
  40. package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
  41. package/dist/src/benchmarks/MemoryProfiler.d.ts +4 -262
  42. package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -1
  43. package/dist/src/benchmarks/MemoryProfiler.js +4 -400
  44. package/dist/src/benchmarks/MemoryProfiler.js.map +1 -1
  45. package/dist/src/benchmarks/comparator.d.ts +38 -0
  46. package/dist/src/benchmarks/comparator.d.ts.map +1 -0
  47. package/dist/src/benchmarks/comparator.js +81 -0
  48. package/dist/src/benchmarks/comparator.js.map +1 -0
  49. package/dist/src/benchmarks/formatters.d.ts +30 -0
  50. package/dist/src/benchmarks/formatters.d.ts.map +1 -0
  51. package/dist/src/benchmarks/formatters.js +88 -0
  52. package/dist/src/benchmarks/formatters.js.map +1 -0
  53. package/dist/src/benchmarks/index.d.ts +5 -1
  54. package/dist/src/benchmarks/index.d.ts.map +1 -1
  55. package/dist/src/benchmarks/index.js +9 -2
  56. package/dist/src/benchmarks/index.js.map +1 -1
  57. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts +165 -0
  58. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -0
  59. package/dist/src/benchmarks/memory/MemoryProfiler.js +312 -0
  60. package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -0
  61. package/dist/src/benchmarks/memory/baseline-manager.d.ts +64 -0
  62. package/dist/src/benchmarks/memory/baseline-manager.d.ts.map +1 -0
  63. package/dist/src/benchmarks/memory/baseline-manager.js +95 -0
  64. package/dist/src/benchmarks/memory/baseline-manager.js.map +1 -0
  65. package/dist/src/benchmarks/memory/index.d.ts +12 -0
  66. package/dist/src/benchmarks/memory/index.d.ts.map +1 -0
  67. package/dist/src/benchmarks/memory/index.js +12 -0
  68. package/dist/src/benchmarks/memory/index.js.map +1 -0
  69. package/dist/src/benchmarks/memory/leak-detector.d.ts +23 -0
  70. package/dist/src/benchmarks/memory/leak-detector.d.ts.map +1 -0
  71. package/dist/src/benchmarks/memory/leak-detector.js +46 -0
  72. package/dist/src/benchmarks/memory/leak-detector.js.map +1 -0
  73. package/dist/src/benchmarks/memory/regression-detector.d.ts +17 -0
  74. package/dist/src/benchmarks/memory/regression-detector.d.ts.map +1 -0
  75. package/dist/src/benchmarks/memory/regression-detector.js +56 -0
  76. package/dist/src/benchmarks/memory/regression-detector.js.map +1 -0
  77. package/dist/src/benchmarks/memory/types.d.ts +111 -0
  78. package/dist/src/benchmarks/memory/types.d.ts.map +1 -0
  79. package/dist/src/benchmarks/memory/types.js +7 -0
  80. package/dist/src/benchmarks/memory/types.js.map +1 -0
  81. package/dist/src/benchmarks/memory/utils.d.ts +17 -0
  82. package/dist/src/benchmarks/memory/utils.d.ts.map +1 -0
  83. package/dist/src/benchmarks/memory/utils.js +29 -0
  84. package/dist/src/benchmarks/memory/utils.js.map +1 -0
  85. package/dist/src/benchmarks/types.d.ts +175 -0
  86. package/dist/src/benchmarks/types.d.ts.map +1 -0
  87. package/dist/src/benchmarks/types.js +20 -0
  88. package/dist/src/benchmarks/types.js.map +1 -0
  89. package/dist/src/index.d.ts +4 -2
  90. package/dist/src/index.d.ts.map +1 -1
  91. package/dist/src/index.js +7 -3
  92. package/dist/src/index.js.map +1 -1
  93. package/dist/src/repositories/QuarantineRepository.d.ts +4 -251
  94. package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -1
  95. package/dist/src/repositories/QuarantineRepository.js +4 -441
  96. package/dist/src/repositories/QuarantineRepository.js.map +1 -1
  97. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +168 -0
  98. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -0
  99. package/dist/src/repositories/quarantine/QuarantineRepository.js +341 -0
  100. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -0
  101. package/dist/src/repositories/quarantine/index.d.ts +10 -0
  102. package/dist/src/repositories/quarantine/index.d.ts.map +1 -0
  103. package/dist/src/repositories/quarantine/index.js +10 -0
  104. package/dist/src/repositories/quarantine/index.js.map +1 -0
  105. package/dist/src/repositories/quarantine/queries.d.ts +58 -0
  106. package/dist/src/repositories/quarantine/queries.d.ts.map +1 -0
  107. package/dist/src/repositories/quarantine/queries.js +88 -0
  108. package/dist/src/repositories/quarantine/queries.js.map +1 -0
  109. package/dist/src/repositories/quarantine/query-builder.d.ts +44 -0
  110. package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -0
  111. package/dist/src/repositories/quarantine/query-builder.js +87 -0
  112. package/dist/src/repositories/quarantine/query-builder.js.map +1 -0
  113. package/dist/src/repositories/quarantine/types.d.ts +155 -0
  114. package/dist/src/repositories/quarantine/types.d.ts.map +1 -0
  115. package/dist/src/repositories/quarantine/types.js +13 -0
  116. package/dist/src/repositories/quarantine/types.js.map +1 -0
  117. package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +1 -0
  118. package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -1
  119. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +7 -43
  120. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  121. package/dist/src/scripts/github-import/checkpoint.d.ts +21 -0
  122. package/dist/src/scripts/github-import/checkpoint.d.ts.map +1 -0
  123. package/dist/src/scripts/github-import/checkpoint.js +52 -0
  124. package/dist/src/scripts/github-import/checkpoint.js.map +1 -0
  125. package/dist/src/scripts/github-import/deduplication.d.ts +15 -0
  126. package/dist/src/scripts/github-import/deduplication.d.ts.map +1 -0
  127. package/dist/src/scripts/github-import/deduplication.js +33 -0
  128. package/dist/src/scripts/github-import/deduplication.js.map +1 -0
  129. package/dist/src/scripts/github-import/github-client.d.ts +29 -0
  130. package/dist/src/scripts/github-import/github-client.d.ts.map +1 -0
  131. package/dist/src/scripts/github-import/github-client.js +184 -0
  132. package/dist/src/scripts/github-import/github-client.js.map +1 -0
  133. package/dist/src/scripts/github-import/index.d.ts +29 -0
  134. package/dist/src/scripts/github-import/index.d.ts.map +1 -0
  135. package/dist/src/scripts/github-import/index.js +198 -0
  136. package/dist/src/scripts/github-import/index.js.map +1 -0
  137. package/dist/src/scripts/github-import/output.d.ts +12 -0
  138. package/dist/src/scripts/github-import/output.d.ts.map +1 -0
  139. package/dist/src/scripts/github-import/output.js +34 -0
  140. package/dist/src/scripts/github-import/output.js.map +1 -0
  141. package/dist/src/scripts/github-import/types.d.ts +108 -0
  142. package/dist/src/scripts/github-import/types.d.ts.map +1 -0
  143. package/dist/src/scripts/github-import/types.js +44 -0
  144. package/dist/src/scripts/github-import/types.js.map +1 -0
  145. package/dist/src/scripts/github-import/utils.d.ts +13 -0
  146. package/dist/src/scripts/github-import/utils.d.ts.map +1 -0
  147. package/dist/src/scripts/github-import/utils.js +28 -0
  148. package/dist/src/scripts/github-import/utils.js.map +1 -0
  149. package/dist/src/scripts/import-github-skills.d.ts +3 -12
  150. package/dist/src/scripts/import-github-skills.d.ts.map +1 -1
  151. package/dist/src/scripts/import-github-skills.js +18 -398
  152. package/dist/src/scripts/import-github-skills.js.map +1 -1
  153. package/dist/src/scripts/scan-imported-skills.d.ts +7 -7
  154. package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
  155. package/dist/src/scripts/scan-imported-skills.js +8 -397
  156. package/dist/src/scripts/scan-imported-skills.js.map +1 -1
  157. package/dist/src/scripts/skill-scanner/categorizer.d.ts +43 -0
  158. package/dist/src/scripts/skill-scanner/categorizer.d.ts.map +1 -0
  159. package/dist/src/scripts/skill-scanner/categorizer.js +61 -0
  160. package/dist/src/scripts/skill-scanner/categorizer.js.map +1 -0
  161. package/dist/src/scripts/skill-scanner/file-scanner.d.ts +43 -0
  162. package/dist/src/scripts/skill-scanner/file-scanner.d.ts.map +1 -0
  163. package/dist/src/scripts/skill-scanner/file-scanner.js +90 -0
  164. package/dist/src/scripts/skill-scanner/file-scanner.js.map +1 -0
  165. package/dist/src/scripts/skill-scanner/index.d.ts +22 -0
  166. package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -0
  167. package/dist/src/scripts/skill-scanner/index.js +43 -0
  168. package/dist/src/scripts/skill-scanner/index.js.map +1 -0
  169. package/dist/src/scripts/skill-scanner/logger.d.ts +59 -0
  170. package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -0
  171. package/dist/src/scripts/skill-scanner/logger.js +104 -0
  172. package/dist/src/scripts/skill-scanner/logger.js.map +1 -0
  173. package/dist/src/scripts/skill-scanner/reporter.d.ts +56 -0
  174. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -0
  175. package/dist/src/scripts/skill-scanner/reporter.js +166 -0
  176. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -0
  177. package/dist/src/scripts/skill-scanner/scanner.d.ts +44 -0
  178. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -0
  179. package/dist/src/scripts/skill-scanner/scanner.js +140 -0
  180. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -0
  181. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +59 -0
  182. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -0
  183. package/dist/src/scripts/skill-scanner/trust-scorer.js +62 -0
  184. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -0
  185. package/dist/src/scripts/skill-scanner/types.d.ts +98 -0
  186. package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -0
  187. package/dist/src/scripts/skill-scanner/types.js +7 -0
  188. package/dist/src/scripts/skill-scanner/types.js.map +1 -0
  189. package/dist/src/scripts/validate-skills.d.ts +3 -172
  190. package/dist/src/scripts/validate-skills.d.ts.map +1 -1
  191. package/dist/src/scripts/validate-skills.js +6 -519
  192. package/dist/src/scripts/validate-skills.js.map +1 -1
  193. package/dist/src/scripts/validation/deduplication.d.ts +23 -0
  194. package/dist/src/scripts/validation/deduplication.d.ts.map +1 -0
  195. package/dist/src/scripts/validation/deduplication.js +127 -0
  196. package/dist/src/scripts/validation/deduplication.js.map +1 -0
  197. package/dist/src/scripts/validation/field-validators.d.ts +9 -0
  198. package/dist/src/scripts/validation/field-validators.d.ts.map +1 -0
  199. package/dist/src/scripts/validation/field-validators.js +135 -0
  200. package/dist/src/scripts/validation/field-validators.js.map +1 -0
  201. package/dist/src/scripts/validation/index.d.ts +29 -0
  202. package/dist/src/scripts/validation/index.d.ts.map +1 -0
  203. package/dist/src/scripts/validation/index.js +84 -0
  204. package/dist/src/scripts/validation/index.js.map +1 -0
  205. package/dist/src/scripts/validation/normalizers.d.ts +29 -0
  206. package/dist/src/scripts/validation/normalizers.d.ts.map +1 -0
  207. package/dist/src/scripts/validation/normalizers.js +79 -0
  208. package/dist/src/scripts/validation/normalizers.js.map +1 -0
  209. package/dist/src/scripts/validation/pipeline.d.ts +13 -0
  210. package/dist/src/scripts/validation/pipeline.d.ts.map +1 -0
  211. package/dist/src/scripts/validation/pipeline.js +126 -0
  212. package/dist/src/scripts/validation/pipeline.js.map +1 -0
  213. package/dist/src/scripts/validation/types.d.ts +128 -0
  214. package/dist/src/scripts/validation/types.d.ts.map +1 -0
  215. package/dist/src/scripts/validation/types.js +43 -0
  216. package/dist/src/scripts/validation/types.js.map +1 -0
  217. package/dist/src/security/index.d.ts +5 -4
  218. package/dist/src/security/index.d.ts.map +1 -1
  219. package/dist/src/security/index.js +8 -2
  220. package/dist/src/security/index.js.map +1 -1
  221. package/dist/src/security/rate-limiter/RateLimiter.d.ts +86 -0
  222. package/dist/src/security/rate-limiter/RateLimiter.d.ts.map +1 -0
  223. package/dist/src/security/rate-limiter/RateLimiter.js +260 -0
  224. package/dist/src/security/rate-limiter/RateLimiter.js.map +1 -0
  225. package/dist/src/security/rate-limiter/constants.d.ts +15 -0
  226. package/dist/src/security/rate-limiter/constants.d.ts.map +1 -0
  227. package/dist/src/security/rate-limiter/constants.js +15 -0
  228. package/dist/src/security/rate-limiter/constants.js.map +1 -0
  229. package/dist/src/security/rate-limiter/errors.d.ts +22 -0
  230. package/dist/src/security/rate-limiter/errors.d.ts.map +1 -0
  231. package/dist/src/security/rate-limiter/errors.js +32 -0
  232. package/dist/src/security/rate-limiter/errors.js.map +1 -0
  233. package/dist/src/security/rate-limiter/index.d.ts +12 -0
  234. package/dist/src/security/rate-limiter/index.d.ts.map +1 -0
  235. package/dist/src/security/rate-limiter/index.js +16 -0
  236. package/dist/src/security/rate-limiter/index.js.map +1 -0
  237. package/dist/src/security/rate-limiter/metrics-manager.d.ts +55 -0
  238. package/dist/src/security/rate-limiter/metrics-manager.d.ts.map +1 -0
  239. package/dist/src/security/rate-limiter/metrics-manager.js +144 -0
  240. package/dist/src/security/rate-limiter/metrics-manager.js.map +1 -0
  241. package/dist/src/security/rate-limiter/presets.d.ts +52 -0
  242. package/dist/src/security/rate-limiter/presets.d.ts.map +1 -0
  243. package/dist/src/security/rate-limiter/presets.js +53 -0
  244. package/dist/src/security/rate-limiter/presets.js.map +1 -0
  245. package/dist/src/security/rate-limiter/queue-manager.d.ts +59 -0
  246. package/dist/src/security/rate-limiter/queue-manager.d.ts.map +1 -0
  247. package/dist/src/security/rate-limiter/queue-manager.js +189 -0
  248. package/dist/src/security/rate-limiter/queue-manager.js.map +1 -0
  249. package/dist/src/security/rate-limiter/storage.d.ts +34 -0
  250. package/dist/src/security/rate-limiter/storage.d.ts.map +1 -0
  251. package/dist/src/security/rate-limiter/storage.js +80 -0
  252. package/dist/src/security/rate-limiter/storage.js.map +1 -0
  253. package/dist/src/security/rate-limiter/token-bucket.d.ts +44 -0
  254. package/dist/src/security/rate-limiter/token-bucket.d.ts.map +1 -0
  255. package/dist/src/security/rate-limiter/token-bucket.js +99 -0
  256. package/dist/src/security/rate-limiter/token-bucket.js.map +1 -0
  257. package/dist/src/security/rate-limiter/types.d.ts +104 -0
  258. package/dist/src/security/rate-limiter/types.d.ts.map +1 -0
  259. package/dist/src/security/rate-limiter/types.js +7 -0
  260. package/dist/src/security/rate-limiter/types.js.map +1 -0
  261. package/dist/src/security/scanner/SecurityScanner.d.ts +94 -0
  262. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -0
  263. package/dist/src/security/scanner/SecurityScanner.js +403 -0
  264. package/dist/src/security/scanner/SecurityScanner.js.map +1 -0
  265. package/dist/src/security/scanner/index.d.ts +11 -0
  266. package/dist/src/security/scanner/index.d.ts.map +1 -0
  267. package/dist/src/security/scanner/index.js +14 -0
  268. package/dist/src/security/scanner/index.js.map +1 -0
  269. package/dist/src/security/scanner/patterns.d.ts +14 -0
  270. package/dist/src/security/scanner/patterns.d.ts.map +1 -0
  271. package/dist/src/security/scanner/patterns.js +147 -0
  272. package/dist/src/security/scanner/patterns.js.map +1 -0
  273. package/dist/src/security/scanner/regex-utils.d.ts +33 -0
  274. package/dist/src/security/scanner/regex-utils.d.ts.map +1 -0
  275. package/dist/src/security/scanner/regex-utils.js +41 -0
  276. package/dist/src/security/scanner/regex-utils.js.map +1 -0
  277. package/dist/src/security/scanner/types.d.ts +63 -0
  278. package/dist/src/security/scanner/types.d.ts.map +1 -0
  279. package/dist/src/security/scanner/types.js +7 -0
  280. package/dist/src/security/scanner/types.js.map +1 -0
  281. package/dist/src/security/scanner/weights.d.ts +15 -0
  282. package/dist/src/security/scanner/weights.d.ts.map +1 -0
  283. package/dist/src/security/scanner/weights.js +28 -0
  284. package/dist/src/security/scanner/weights.js.map +1 -0
  285. package/dist/src/session/SessionHealthMonitor.d.ts +5 -168
  286. package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
  287. package/dist/src/session/SessionHealthMonitor.js +22 -91
  288. package/dist/src/session/SessionHealthMonitor.js.map +1 -1
  289. package/dist/src/session/health-checks.d.ts +37 -0
  290. package/dist/src/session/health-checks.d.ts.map +1 -0
  291. package/dist/src/session/health-checks.js +64 -0
  292. package/dist/src/session/health-checks.js.map +1 -0
  293. package/dist/src/session/health-types.d.ts +78 -0
  294. package/dist/src/session/health-types.d.ts.map +1 -0
  295. package/dist/src/session/health-types.js +16 -0
  296. package/dist/src/session/health-types.js.map +1 -0
  297. package/dist/src/session/index.d.ts +5 -1
  298. package/dist/src/session/index.d.ts.map +1 -1
  299. package/dist/src/session/index.js +9 -0
  300. package/dist/src/session/index.js.map +1 -1
  301. package/dist/src/session/metrics-collector.d.ts +23 -0
  302. package/dist/src/session/metrics-collector.d.ts.map +1 -0
  303. package/dist/src/session/metrics-collector.js +44 -0
  304. package/dist/src/session/metrics-collector.js.map +1 -0
  305. package/dist/src/session/typed-event-emitter.d.ts +70 -0
  306. package/dist/src/session/typed-event-emitter.d.ts.map +1 -0
  307. package/dist/src/session/typed-event-emitter.js +79 -0
  308. package/dist/src/session/typed-event-emitter.js.map +1 -0
  309. package/dist/src/sources/BaseSourceAdapter.d.ts +1 -1
  310. package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -1
  311. package/dist/src/sources/BaseSourceAdapter.js +2 -2
  312. package/dist/src/sources/BaseSourceAdapter.js.map +1 -1
  313. package/dist/src/telemetry/index.d.ts +1 -0
  314. package/dist/src/telemetry/index.d.ts.map +1 -1
  315. package/dist/src/telemetry/index.js +2 -0
  316. package/dist/src/telemetry/index.js.map +1 -1
  317. package/dist/src/telemetry/posthog.d.ts +125 -0
  318. package/dist/src/telemetry/posthog.d.ts.map +1 -0
  319. package/dist/src/telemetry/posthog.js +198 -0
  320. package/dist/src/telemetry/posthog.js.map +1 -0
  321. package/dist/tests/RateLimiter.test.js +4 -4
  322. package/dist/tests/RateLimiter.test.js.map +1 -1
  323. package/dist/tests/e2e/security/security.e2e.test.js +3 -3
  324. package/dist/tests/e2e/security/security.e2e.test.js.map +1 -1
  325. package/package.json +2 -1
@@ -0,0 +1,341 @@
1
+ /**
2
+ * SMI-865: Quarantine Repository - CRUD operations for skill quarantine management
3
+ *
4
+ * Provides:
5
+ * - Create, Read, Update, Delete operations for quarantine entries
6
+ * - Review workflow management
7
+ * - Integration with AuditLogger for audit trail
8
+ * - Query filtering and pagination
9
+ *
10
+ * Severity Categories:
11
+ * - MALICIOUS: Permanent quarantine, security threat detected
12
+ * - SUSPICIOUS: Manual review required before import
13
+ * - RISKY: Can import with warnings displayed
14
+ * - LOW_QUALITY: Can import with reduced quality score
15
+ */
16
+ import { randomUUID } from 'crypto';
17
+ import { initializeQuarantineSchema, QUARANTINE_SEVERITY_POLICIES, } from '../../db/quarantine-schema.js';
18
+ import { INSERT_QUERY, SELECT_BY_ID_QUERY, SELECT_BY_SKILL_ID_QUERY, SELECT_ALL_QUERY, SELECT_COUNT_QUERY, UPDATE_QUERY, DELETE_QUERY, DELETE_BY_SKILL_ID_QUERY, STATS_TOTAL_QUERY, STATS_BY_SEVERITY_QUERY, STATS_BY_STATUS_QUERY, STATS_PENDING_QUERY, STATS_RANGE_QUERY, } from './queries.js';
19
+ import { buildFilteredQuery, rowToEntry } from './query-builder.js';
20
+ /**
21
+ * Repository for quarantine CRUD operations
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const repo = new QuarantineRepository(db, auditLogger)
26
+ *
27
+ * // Quarantine a suspicious skill
28
+ * const entry = repo.create({
29
+ * skillId: 'community/suspicious-skill',
30
+ * source: 'github',
31
+ * quarantineReason: 'Obfuscated code detected',
32
+ * severity: 'SUSPICIOUS',
33
+ * detectedPatterns: ['eval()', 'obfuscated variables']
34
+ * })
35
+ *
36
+ * // Review and approve/reject
37
+ * const decision = repo.review(entry.id, {
38
+ * reviewedBy: 'security-team',
39
+ * reviewStatus: 'approved',
40
+ * reviewNotes: 'Manual review confirmed safe after code analysis'
41
+ * })
42
+ * ```
43
+ */
44
+ export class QuarantineRepository {
45
+ db;
46
+ auditLogger;
47
+ stmts;
48
+ constructor(db, auditLogger) {
49
+ this.db = db;
50
+ this.auditLogger = auditLogger;
51
+ this.ensureTableExists();
52
+ this.prepareStatements();
53
+ }
54
+ /**
55
+ * Ensure the quarantine table exists
56
+ */
57
+ ensureTableExists() {
58
+ initializeQuarantineSchema(this.db);
59
+ }
60
+ /**
61
+ * Prepare SQL statements for performance
62
+ */
63
+ prepareStatements() {
64
+ this.stmts = {
65
+ insert: this.db.prepare(INSERT_QUERY),
66
+ selectById: this.db.prepare(SELECT_BY_ID_QUERY),
67
+ selectBySkillId: this.db.prepare(SELECT_BY_SKILL_ID_QUERY),
68
+ selectAll: this.db.prepare(SELECT_ALL_QUERY),
69
+ selectCount: this.db.prepare(SELECT_COUNT_QUERY),
70
+ update: this.db.prepare(UPDATE_QUERY),
71
+ delete: this.db.prepare(DELETE_QUERY),
72
+ deleteBySkillId: this.db.prepare(DELETE_BY_SKILL_ID_QUERY),
73
+ };
74
+ }
75
+ /**
76
+ * Log audit event if AuditLogger is available
77
+ */
78
+ logAudit(action, resource, result, metadata) {
79
+ if (this.auditLogger) {
80
+ this.auditLogger.log({
81
+ event_type: 'security_scan',
82
+ actor: 'system',
83
+ resource,
84
+ action,
85
+ result,
86
+ metadata,
87
+ });
88
+ }
89
+ }
90
+ /**
91
+ * Create a new quarantine entry
92
+ *
93
+ * @param input - Quarantine entry data
94
+ * @returns Created quarantine entry
95
+ */
96
+ create(input) {
97
+ const id = input.id || randomUUID();
98
+ const patterns = JSON.stringify(input.detectedPatterns || []);
99
+ this.stmts.insert.run(id, input.skillId, input.source, input.quarantineReason, input.severity, patterns, null, // reviewed_by
100
+ 'pending', // review_status
101
+ null, // review_notes
102
+ null // review_date
103
+ );
104
+ this.logAudit('quarantine_create', input.skillId, 'success', {
105
+ quarantineId: id,
106
+ severity: input.severity,
107
+ reason: input.quarantineReason,
108
+ patterns: input.detectedPatterns,
109
+ });
110
+ const row = this.stmts.selectById.get(id);
111
+ return rowToEntry(row);
112
+ }
113
+ /**
114
+ * Find a quarantine entry by ID
115
+ *
116
+ * @param id - Quarantine entry ID
117
+ * @returns Quarantine entry or null if not found
118
+ */
119
+ findById(id) {
120
+ const row = this.stmts.selectById.get(id);
121
+ return row ? rowToEntry(row) : null;
122
+ }
123
+ /**
124
+ * Find all quarantine entries for a skill
125
+ *
126
+ * @param skillId - Skill ID
127
+ * @returns Array of quarantine entries
128
+ */
129
+ findBySkillId(skillId) {
130
+ const rows = this.stmts.selectBySkillId.all(skillId);
131
+ return rows.map((row) => rowToEntry(row));
132
+ }
133
+ /**
134
+ * Check if a skill is quarantined
135
+ *
136
+ * @param skillId - Skill ID
137
+ * @returns True if skill has any pending quarantine entries
138
+ */
139
+ isQuarantined(skillId) {
140
+ const entries = this.findBySkillId(skillId);
141
+ return entries.some((e) => e.reviewStatus === 'pending' || e.reviewStatus === 'rejected');
142
+ }
143
+ /**
144
+ * Get the most severe quarantine entry for a skill
145
+ *
146
+ * @param skillId - Skill ID
147
+ * @returns Most severe quarantine entry or null
148
+ */
149
+ getMostSevere(skillId) {
150
+ const entries = this.findBySkillId(skillId).filter((e) => e.reviewStatus !== 'approved');
151
+ if (entries.length === 0)
152
+ return null;
153
+ return entries.sort((a, b) => {
154
+ const aLevel = QUARANTINE_SEVERITY_POLICIES[a.severity].level;
155
+ const bLevel = QUARANTINE_SEVERITY_POLICIES[b.severity].level;
156
+ return bLevel - aLevel;
157
+ })[0];
158
+ }
159
+ /**
160
+ * Find all quarantine entries with pagination
161
+ *
162
+ * @param options - Pagination options
163
+ * @returns Paginated quarantine results
164
+ */
165
+ findAll(options = {}) {
166
+ const limit = options.limit ?? 20;
167
+ const offset = options.offset ?? 0;
168
+ const rows = this.stmts.selectAll.all(limit, offset);
169
+ const { count } = this.stmts.selectCount.get();
170
+ return {
171
+ items: rows.map((row) => rowToEntry(row)),
172
+ total: count,
173
+ limit,
174
+ offset,
175
+ hasMore: offset + rows.length < count,
176
+ };
177
+ }
178
+ /**
179
+ * Query quarantine entries with filters
180
+ *
181
+ * @param filter - Query filters
182
+ * @returns Paginated quarantine results
183
+ */
184
+ query(filter) {
185
+ const { limit = 20, offset = 0 } = filter;
186
+ const { query, countQuery, params, countParams } = buildFilteredQuery(filter);
187
+ const rows = this.db.prepare(query).all(...params);
188
+ const { count } = this.db.prepare(countQuery).get(...countParams);
189
+ return {
190
+ items: rows.map((row) => rowToEntry(row)),
191
+ total: count,
192
+ limit,
193
+ offset,
194
+ hasMore: offset + rows.length < count,
195
+ };
196
+ }
197
+ /**
198
+ * Update a quarantine entry
199
+ *
200
+ * @param id - Quarantine entry ID
201
+ * @param input - Update data
202
+ * @returns Updated entry or null if not found
203
+ */
204
+ update(id, input) {
205
+ const patterns = input.detectedPatterns ? JSON.stringify(input.detectedPatterns) : null;
206
+ const hasReviewUpdate = input.reviewStatus !== undefined;
207
+ const result = this.stmts.update.run(input.quarantineReason ?? null, input.severity ?? null, patterns, input.reviewedBy ?? null, input.reviewStatus ?? null, input.reviewNotes ?? null, hasReviewUpdate ? 'set' : null, // Trigger review_date update
208
+ id);
209
+ if (result.changes === 0) {
210
+ return null;
211
+ }
212
+ const updated = this.findById(id);
213
+ if (updated) {
214
+ this.logAudit('quarantine_update', updated.skillId, 'success', {
215
+ quarantineId: id,
216
+ updates: input,
217
+ });
218
+ }
219
+ return updated;
220
+ }
221
+ /**
222
+ * Review a quarantine entry
223
+ *
224
+ * @param id - Quarantine entry ID
225
+ * @param reviewInput - Review data
226
+ * @returns Review decision with import guidance
227
+ */
228
+ review(id, reviewInput) {
229
+ const entry = this.findById(id);
230
+ if (!entry)
231
+ return null;
232
+ const updated = this.update(id, {
233
+ reviewedBy: reviewInput.reviewedBy,
234
+ reviewStatus: reviewInput.reviewStatus,
235
+ reviewNotes: reviewInput.reviewNotes,
236
+ });
237
+ if (!updated)
238
+ return null;
239
+ const policy = QUARANTINE_SEVERITY_POLICIES[updated.severity];
240
+ const approved = reviewInput.reviewStatus === 'approved';
241
+ const warnings = [];
242
+ if (approved && updated.severity === 'RISKY') {
243
+ warnings.push(`Skill was flagged as RISKY: ${updated.quarantineReason}`);
244
+ }
245
+ if (approved && updated.severity === 'LOW_QUALITY') {
246
+ warnings.push(`Skill has low quality indicators: ${updated.quarantineReason}`);
247
+ }
248
+ this.logAudit('quarantine_review', updated.skillId, approved ? 'success' : 'blocked', {
249
+ quarantineId: id,
250
+ reviewStatus: reviewInput.reviewStatus,
251
+ reviewedBy: reviewInput.reviewedBy,
252
+ severity: updated.severity,
253
+ canImport: approved && policy.allowImport,
254
+ });
255
+ return {
256
+ approved,
257
+ skillId: updated.skillId,
258
+ severity: updated.severity,
259
+ canImport: approved || policy.allowImport,
260
+ warnings,
261
+ };
262
+ }
263
+ /**
264
+ * Delete a quarantine entry
265
+ *
266
+ * @param id - Quarantine entry ID
267
+ * @returns True if entry was deleted
268
+ */
269
+ delete(id) {
270
+ const entry = this.findById(id);
271
+ const result = this.stmts.delete.run(id);
272
+ if (result.changes > 0 && entry) {
273
+ this.logAudit('quarantine_delete', entry.skillId, 'success', {
274
+ quarantineId: id,
275
+ });
276
+ }
277
+ return result.changes > 0;
278
+ }
279
+ /**
280
+ * Delete all quarantine entries for a skill
281
+ *
282
+ * @param skillId - Skill ID
283
+ * @returns Number of deleted entries
284
+ */
285
+ deleteBySkillId(skillId) {
286
+ const result = this.stmts.deleteBySkillId.run(skillId);
287
+ if (result.changes > 0) {
288
+ this.logAudit('quarantine_delete_all', skillId, 'success', {
289
+ deletedCount: result.changes,
290
+ });
291
+ }
292
+ return result.changes;
293
+ }
294
+ /**
295
+ * Get quarantine statistics
296
+ *
297
+ * @returns Quarantine statistics
298
+ */
299
+ getStats() {
300
+ const totalResult = this.db.prepare(STATS_TOTAL_QUERY).get();
301
+ const severityResults = this.db.prepare(STATS_BY_SEVERITY_QUERY).all();
302
+ const bySeverity = severityResults.reduce((acc, row) => {
303
+ acc[row.severity] = row.count;
304
+ return acc;
305
+ }, {});
306
+ const statusResults = this.db.prepare(STATS_BY_STATUS_QUERY).all();
307
+ const byStatus = statusResults.reduce((acc, row) => {
308
+ acc[row.review_status] = row.count;
309
+ return acc;
310
+ }, {});
311
+ const pendingResult = this.db.prepare(STATS_PENDING_QUERY).get();
312
+ const rangeResult = this.db.prepare(STATS_RANGE_QUERY).get();
313
+ return {
314
+ total: totalResult.count,
315
+ bySeverity,
316
+ byStatus,
317
+ pendingReview: pendingResult.count,
318
+ oldestEntry: rangeResult.oldest,
319
+ newestEntry: rangeResult.newest,
320
+ };
321
+ }
322
+ /**
323
+ * Count all quarantine entries
324
+ *
325
+ * @returns Total count
326
+ */
327
+ count() {
328
+ const { count } = this.stmts.selectCount.get();
329
+ return count;
330
+ }
331
+ /**
332
+ * Execute a function within a transaction
333
+ *
334
+ * @param fn - Function to execute
335
+ * @returns Result of the function
336
+ */
337
+ transaction(fn) {
338
+ return this.db.transaction(fn)();
339
+ }
340
+ }
341
+ //# sourceMappingURL=QuarantineRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuarantineRepository.js","sourceRoot":"","sources":["../../../../src/repositories/quarantine/QuarantineRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SMI-865: Quarantine Repository Module
3
+ *
4
+ * Exports all quarantine-related types and functionality.
5
+ */
6
+ export * from './types.js';
7
+ export * from './queries.js';
8
+ export * from './query-builder.js';
9
+ export { QuarantineRepository } from './QuarantineRepository.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/repositories/quarantine/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SMI-865: Quarantine Repository Module
3
+ *
4
+ * Exports all quarantine-related types and functionality.
5
+ */
6
+ export * from './types.js';
7
+ export * from './queries.js';
8
+ export * from './query-builder.js';
9
+ export { QuarantineRepository } from './QuarantineRepository.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/repositories/quarantine/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * SMI-865: Quarantine Repository SQL Queries
3
+ *
4
+ * SQL query constants for quarantine management operations.
5
+ */
6
+ /**
7
+ * SQL query to insert a new quarantine entry
8
+ */
9
+ export declare const INSERT_QUERY = "\n INSERT INTO quarantine (\n id, skill_id, source, quarantine_reason, severity,\n detected_patterns, quarantine_date, reviewed_by, review_status,\n review_notes, review_date, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, datetime('now'), ?, ?, ?, ?, datetime('now'), datetime('now'))\n";
10
+ /**
11
+ * SQL query to select a quarantine entry by ID
12
+ */
13
+ export declare const SELECT_BY_ID_QUERY = "\n SELECT * FROM quarantine WHERE id = ?\n";
14
+ /**
15
+ * SQL query to select quarantine entries by skill ID
16
+ */
17
+ export declare const SELECT_BY_SKILL_ID_QUERY = "\n SELECT * FROM quarantine WHERE skill_id = ? ORDER BY quarantine_date DESC\n";
18
+ /**
19
+ * SQL query to select all quarantine entries with pagination
20
+ */
21
+ export declare const SELECT_ALL_QUERY = "\n SELECT * FROM quarantine ORDER BY quarantine_date DESC LIMIT ? OFFSET ?\n";
22
+ /**
23
+ * SQL query to count all quarantine entries
24
+ */
25
+ export declare const SELECT_COUNT_QUERY = "\n SELECT COUNT(*) as count FROM quarantine\n";
26
+ /**
27
+ * SQL query to update a quarantine entry
28
+ */
29
+ export declare const UPDATE_QUERY = "\n UPDATE quarantine SET\n quarantine_reason = COALESCE(?, quarantine_reason),\n severity = COALESCE(?, severity),\n detected_patterns = COALESCE(?, detected_patterns),\n reviewed_by = COALESCE(?, reviewed_by),\n review_status = COALESCE(?, review_status),\n review_notes = COALESCE(?, review_notes),\n review_date = CASE WHEN ? IS NOT NULL THEN datetime('now') ELSE review_date END,\n updated_at = datetime('now')\n WHERE id = ?\n";
30
+ /**
31
+ * SQL query to delete a quarantine entry by ID
32
+ */
33
+ export declare const DELETE_QUERY = "\n DELETE FROM quarantine WHERE id = ?\n";
34
+ /**
35
+ * SQL query to delete all quarantine entries for a skill
36
+ */
37
+ export declare const DELETE_BY_SKILL_ID_QUERY = "\n DELETE FROM quarantine WHERE skill_id = ?\n";
38
+ /**
39
+ * SQL query to get total count
40
+ */
41
+ export declare const STATS_TOTAL_QUERY = "SELECT COUNT(*) as count FROM quarantine";
42
+ /**
43
+ * SQL query to get counts by severity
44
+ */
45
+ export declare const STATS_BY_SEVERITY_QUERY = "SELECT severity, COUNT(*) as count FROM quarantine GROUP BY severity";
46
+ /**
47
+ * SQL query to get counts by review status
48
+ */
49
+ export declare const STATS_BY_STATUS_QUERY = "SELECT review_status, COUNT(*) as count FROM quarantine GROUP BY review_status";
50
+ /**
51
+ * SQL query to get pending review count
52
+ */
53
+ export declare const STATS_PENDING_QUERY = "SELECT COUNT(*) as count FROM quarantine WHERE review_status = 'pending'";
54
+ /**
55
+ * SQL query to get date range
56
+ */
57
+ export declare const STATS_RANGE_QUERY = "SELECT MIN(quarantine_date) as oldest, MAX(quarantine_date) as newest FROM quarantine";
58
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../../src/repositories/quarantine/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY,wTAOxB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,gDAE9B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,oFAEpC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,kFAE5B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,mDAE9B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,8cAWxB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,8CAExB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,oDAEpC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,6CAA6C,CAAA;AAE3E;;GAEG;AACH,eAAO,MAAM,uBAAuB,yEACoC,CAAA;AAExE;;GAEG;AACH,eAAO,MAAM,qBAAqB,mFACgD,CAAA;AAElF;;GAEG;AACH,eAAO,MAAM,mBAAmB,6EAC4C,CAAA;AAE5E;;GAEG;AACH,eAAO,MAAM,iBAAiB,0FAC2D,CAAA"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * SMI-865: Quarantine Repository SQL Queries
3
+ *
4
+ * SQL query constants for quarantine management operations.
5
+ */
6
+ /**
7
+ * SQL query to insert a new quarantine entry
8
+ */
9
+ export const INSERT_QUERY = `
10
+ INSERT INTO quarantine (
11
+ id, skill_id, source, quarantine_reason, severity,
12
+ detected_patterns, quarantine_date, reviewed_by, review_status,
13
+ review_notes, review_date, created_at, updated_at
14
+ )
15
+ VALUES (?, ?, ?, ?, ?, ?, datetime('now'), ?, ?, ?, ?, datetime('now'), datetime('now'))
16
+ `;
17
+ /**
18
+ * SQL query to select a quarantine entry by ID
19
+ */
20
+ export const SELECT_BY_ID_QUERY = `
21
+ SELECT * FROM quarantine WHERE id = ?
22
+ `;
23
+ /**
24
+ * SQL query to select quarantine entries by skill ID
25
+ */
26
+ export const SELECT_BY_SKILL_ID_QUERY = `
27
+ SELECT * FROM quarantine WHERE skill_id = ? ORDER BY quarantine_date DESC
28
+ `;
29
+ /**
30
+ * SQL query to select all quarantine entries with pagination
31
+ */
32
+ export const SELECT_ALL_QUERY = `
33
+ SELECT * FROM quarantine ORDER BY quarantine_date DESC LIMIT ? OFFSET ?
34
+ `;
35
+ /**
36
+ * SQL query to count all quarantine entries
37
+ */
38
+ export const SELECT_COUNT_QUERY = `
39
+ SELECT COUNT(*) as count FROM quarantine
40
+ `;
41
+ /**
42
+ * SQL query to update a quarantine entry
43
+ */
44
+ export const UPDATE_QUERY = `
45
+ UPDATE quarantine SET
46
+ quarantine_reason = COALESCE(?, quarantine_reason),
47
+ severity = COALESCE(?, severity),
48
+ detected_patterns = COALESCE(?, detected_patterns),
49
+ reviewed_by = COALESCE(?, reviewed_by),
50
+ review_status = COALESCE(?, review_status),
51
+ review_notes = COALESCE(?, review_notes),
52
+ review_date = CASE WHEN ? IS NOT NULL THEN datetime('now') ELSE review_date END,
53
+ updated_at = datetime('now')
54
+ WHERE id = ?
55
+ `;
56
+ /**
57
+ * SQL query to delete a quarantine entry by ID
58
+ */
59
+ export const DELETE_QUERY = `
60
+ DELETE FROM quarantine WHERE id = ?
61
+ `;
62
+ /**
63
+ * SQL query to delete all quarantine entries for a skill
64
+ */
65
+ export const DELETE_BY_SKILL_ID_QUERY = `
66
+ DELETE FROM quarantine WHERE skill_id = ?
67
+ `;
68
+ /**
69
+ * SQL query to get total count
70
+ */
71
+ export const STATS_TOTAL_QUERY = 'SELECT COUNT(*) as count FROM quarantine';
72
+ /**
73
+ * SQL query to get counts by severity
74
+ */
75
+ export const STATS_BY_SEVERITY_QUERY = 'SELECT severity, COUNT(*) as count FROM quarantine GROUP BY severity';
76
+ /**
77
+ * SQL query to get counts by review status
78
+ */
79
+ export const STATS_BY_STATUS_QUERY = 'SELECT review_status, COUNT(*) as count FROM quarantine GROUP BY review_status';
80
+ /**
81
+ * SQL query to get pending review count
82
+ */
83
+ export const STATS_PENDING_QUERY = "SELECT COUNT(*) as count FROM quarantine WHERE review_status = 'pending'";
84
+ /**
85
+ * SQL query to get date range
86
+ */
87
+ export const STATS_RANGE_QUERY = 'SELECT MIN(quarantine_date) as oldest, MAX(quarantine_date) as newest FROM quarantine';
88
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../../src/repositories/quarantine/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;CAO3B,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;CAEjC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;;CAEvC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;CAE/B,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;CAEjC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;CAW3B,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;CAE3B,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;;CAEvC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,0CAA0C,CAAA;AAE3E;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAClC,sEAAsE,CAAA;AAExE;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,gFAAgF,CAAA;AAElF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAC9B,0EAA0E,CAAA;AAE5E;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAC5B,uFAAuF,CAAA"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * SMI-865: Quarantine Query Builder
3
+ *
4
+ * Dynamic query building for filtered quarantine searches.
5
+ */
6
+ import type { QuarantineQueryFilter, QuarantineRow } from './types.js';
7
+ /**
8
+ * Query builder result containing SQL and parameters
9
+ */
10
+ export interface QueryBuilderResult {
11
+ query: string;
12
+ countQuery: string;
13
+ params: unknown[];
14
+ countParams: unknown[];
15
+ }
16
+ /**
17
+ * Build a dynamic query based on filter options
18
+ *
19
+ * @param filter - Query filter options
20
+ * @returns Query strings and parameters for execution
21
+ */
22
+ export declare function buildFilteredQuery(filter: QuarantineQueryFilter): QueryBuilderResult;
23
+ /**
24
+ * Convert a database row to a QuarantineEntry object
25
+ *
26
+ * @param row - Database row
27
+ * @returns Converted QuarantineEntry
28
+ */
29
+ export declare function rowToEntry(row: QuarantineRow): {
30
+ id: string;
31
+ skillId: string;
32
+ source: string;
33
+ quarantineReason: string;
34
+ severity: import("../../index.js").QuarantineSeverity;
35
+ detectedPatterns: any;
36
+ quarantineDate: string;
37
+ reviewedBy: string | null;
38
+ reviewStatus: import("../../index.js").QuarantineReviewStatus;
39
+ reviewNotes: string | null;
40
+ reviewDate: string | null;
41
+ createdAt: string;
42
+ updatedAt: string;
43
+ };
44
+ //# sourceMappingURL=query-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../../../src/repositories/quarantine/query-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEtE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,OAAO,EAAE,CAAA;IACjB,WAAW,EAAE,OAAO,EAAE,CAAA;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,GAAG,kBAAkB,CA6DpF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa;;;;;;;;;;;;;;EAgB5C"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * SMI-865: Quarantine Query Builder
3
+ *
4
+ * Dynamic query building for filtered quarantine searches.
5
+ */
6
+ /**
7
+ * Build a dynamic query based on filter options
8
+ *
9
+ * @param filter - Query filter options
10
+ * @returns Query strings and parameters for execution
11
+ */
12
+ export function buildFilteredQuery(filter) {
13
+ const { skillId, source, severity, reviewStatus, reviewedBy, since, until, limit = 20, offset = 0 } = filter;
14
+ let query = 'SELECT * FROM quarantine WHERE 1=1';
15
+ let countQuery = 'SELECT COUNT(*) as count FROM quarantine WHERE 1=1';
16
+ const params = [];
17
+ const countParams = [];
18
+ if (skillId) {
19
+ query += ' AND skill_id = ?';
20
+ countQuery += ' AND skill_id = ?';
21
+ params.push(skillId);
22
+ countParams.push(skillId);
23
+ }
24
+ if (source) {
25
+ query += ' AND source = ?';
26
+ countQuery += ' AND source = ?';
27
+ params.push(source);
28
+ countParams.push(source);
29
+ }
30
+ if (severity) {
31
+ query += ' AND severity = ?';
32
+ countQuery += ' AND severity = ?';
33
+ params.push(severity);
34
+ countParams.push(severity);
35
+ }
36
+ if (reviewStatus) {
37
+ query += ' AND review_status = ?';
38
+ countQuery += ' AND review_status = ?';
39
+ params.push(reviewStatus);
40
+ countParams.push(reviewStatus);
41
+ }
42
+ if (reviewedBy) {
43
+ query += ' AND reviewed_by = ?';
44
+ countQuery += ' AND reviewed_by = ?';
45
+ params.push(reviewedBy);
46
+ countParams.push(reviewedBy);
47
+ }
48
+ if (since) {
49
+ query += ' AND quarantine_date >= ?';
50
+ countQuery += ' AND quarantine_date >= ?';
51
+ params.push(since.toISOString());
52
+ countParams.push(since.toISOString());
53
+ }
54
+ if (until) {
55
+ query += ' AND quarantine_date <= ?';
56
+ countQuery += ' AND quarantine_date <= ?';
57
+ params.push(until.toISOString());
58
+ countParams.push(until.toISOString());
59
+ }
60
+ query += ' ORDER BY quarantine_date DESC LIMIT ? OFFSET ?';
61
+ params.push(limit, offset);
62
+ return { query, countQuery, params, countParams };
63
+ }
64
+ /**
65
+ * Convert a database row to a QuarantineEntry object
66
+ *
67
+ * @param row - Database row
68
+ * @returns Converted QuarantineEntry
69
+ */
70
+ export function rowToEntry(row) {
71
+ return {
72
+ id: row.id,
73
+ skillId: row.skill_id,
74
+ source: row.source,
75
+ quarantineReason: row.quarantine_reason,
76
+ severity: row.severity,
77
+ detectedPatterns: JSON.parse(row.detected_patterns || '[]'),
78
+ quarantineDate: row.quarantine_date,
79
+ reviewedBy: row.reviewed_by,
80
+ reviewStatus: row.review_status,
81
+ reviewNotes: row.review_notes,
82
+ reviewDate: row.review_date,
83
+ createdAt: row.created_at,
84
+ updatedAt: row.updated_at,
85
+ };
86
+ }
87
+ //# sourceMappingURL=query-builder.js.map