@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.d.ts +4 -134
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.js +7 -315
- package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
- package/dist/src/analysis/framework-detector.d.ts +47 -0
- package/dist/src/analysis/framework-detector.d.ts.map +1 -0
- package/dist/src/analysis/framework-detector.js +151 -0
- package/dist/src/analysis/framework-detector.js.map +1 -0
- package/dist/src/analysis/index.d.ts +6 -1
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +10 -1
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/parsers.d.ts +43 -0
- package/dist/src/analysis/parsers.d.ts.map +1 -0
- package/dist/src/analysis/parsers.js +219 -0
- package/dist/src/analysis/parsers.js.map +1 -0
- package/dist/src/analysis/types.d.ts +138 -0
- package/dist/src/analysis/types.d.ts.map +1 -0
- package/dist/src/analysis/types.js +25 -0
- package/dist/src/analysis/types.js.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.js +4 -4
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/api/cache.d.ts +108 -0
- package/dist/src/api/cache.d.ts.map +1 -0
- package/dist/src/api/cache.js +216 -0
- package/dist/src/api/cache.js.map +1 -0
- package/dist/src/api/client.d.ts +152 -0
- package/dist/src/api/client.d.ts.map +1 -0
- package/dist/src/api/client.js +221 -0
- package/dist/src/api/client.js.map +1 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.d.ts.map +1 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/api/index.js.map +1 -0
- package/dist/src/benchmarks/BenchmarkRunner.d.ts +6 -175
- package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js +6 -123
- package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.d.ts +4 -262
- package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.js +4 -400
- package/dist/src/benchmarks/MemoryProfiler.js.map +1 -1
- package/dist/src/benchmarks/comparator.d.ts +38 -0
- package/dist/src/benchmarks/comparator.d.ts.map +1 -0
- package/dist/src/benchmarks/comparator.js +81 -0
- package/dist/src/benchmarks/comparator.js.map +1 -0
- package/dist/src/benchmarks/formatters.d.ts +30 -0
- package/dist/src/benchmarks/formatters.d.ts.map +1 -0
- package/dist/src/benchmarks/formatters.js +88 -0
- package/dist/src/benchmarks/formatters.js.map +1 -0
- package/dist/src/benchmarks/index.d.ts +5 -1
- package/dist/src/benchmarks/index.d.ts.map +1 -1
- package/dist/src/benchmarks/index.js +9 -2
- package/dist/src/benchmarks/index.js.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts +165 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js +312 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts +64 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.js +95 -0
- package/dist/src/benchmarks/memory/baseline-manager.js.map +1 -0
- package/dist/src/benchmarks/memory/index.d.ts +12 -0
- package/dist/src/benchmarks/memory/index.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/index.js +12 -0
- package/dist/src/benchmarks/memory/index.js.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts +23 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.js +46 -0
- package/dist/src/benchmarks/memory/leak-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts +17 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.js +56 -0
- package/dist/src/benchmarks/memory/regression-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/types.d.ts +111 -0
- package/dist/src/benchmarks/memory/types.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/types.js +7 -0
- package/dist/src/benchmarks/memory/types.js.map +1 -0
- package/dist/src/benchmarks/memory/utils.d.ts +17 -0
- package/dist/src/benchmarks/memory/utils.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/utils.js +29 -0
- package/dist/src/benchmarks/memory/utils.js.map +1 -0
- package/dist/src/benchmarks/types.d.ts +175 -0
- package/dist/src/benchmarks/types.d.ts.map +1 -0
- package/dist/src/benchmarks/types.js +20 -0
- package/dist/src/benchmarks/types.js.map +1 -0
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/QuarantineRepository.d.ts +4 -251
- package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/QuarantineRepository.js +4 -441
- package/dist/src/repositories/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +168 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js +341 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -0
- package/dist/src/repositories/quarantine/index.d.ts +10 -0
- package/dist/src/repositories/quarantine/index.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/index.js +10 -0
- package/dist/src/repositories/quarantine/index.js.map +1 -0
- package/dist/src/repositories/quarantine/queries.d.ts +58 -0
- package/dist/src/repositories/quarantine/queries.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/queries.js +88 -0
- package/dist/src/repositories/quarantine/queries.js.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts +44 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.js +87 -0
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -0
- package/dist/src/repositories/quarantine/types.d.ts +155 -0
- package/dist/src/repositories/quarantine/types.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/types.js +13 -0
- package/dist/src/repositories/quarantine/types.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +7 -43
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/checkpoint.d.ts +21 -0
- package/dist/src/scripts/github-import/checkpoint.d.ts.map +1 -0
- package/dist/src/scripts/github-import/checkpoint.js +52 -0
- package/dist/src/scripts/github-import/checkpoint.js.map +1 -0
- package/dist/src/scripts/github-import/deduplication.d.ts +15 -0
- package/dist/src/scripts/github-import/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/github-import/deduplication.js +33 -0
- package/dist/src/scripts/github-import/deduplication.js.map +1 -0
- package/dist/src/scripts/github-import/github-client.d.ts +29 -0
- package/dist/src/scripts/github-import/github-client.d.ts.map +1 -0
- package/dist/src/scripts/github-import/github-client.js +184 -0
- package/dist/src/scripts/github-import/github-client.js.map +1 -0
- package/dist/src/scripts/github-import/index.d.ts +29 -0
- package/dist/src/scripts/github-import/index.d.ts.map +1 -0
- package/dist/src/scripts/github-import/index.js +198 -0
- package/dist/src/scripts/github-import/index.js.map +1 -0
- package/dist/src/scripts/github-import/output.d.ts +12 -0
- package/dist/src/scripts/github-import/output.d.ts.map +1 -0
- package/dist/src/scripts/github-import/output.js +34 -0
- package/dist/src/scripts/github-import/output.js.map +1 -0
- package/dist/src/scripts/github-import/types.d.ts +108 -0
- package/dist/src/scripts/github-import/types.d.ts.map +1 -0
- package/dist/src/scripts/github-import/types.js +44 -0
- package/dist/src/scripts/github-import/types.js.map +1 -0
- package/dist/src/scripts/github-import/utils.d.ts +13 -0
- package/dist/src/scripts/github-import/utils.d.ts.map +1 -0
- package/dist/src/scripts/github-import/utils.js +28 -0
- package/dist/src/scripts/github-import/utils.js.map +1 -0
- package/dist/src/scripts/import-github-skills.d.ts +3 -12
- package/dist/src/scripts/import-github-skills.d.ts.map +1 -1
- package/dist/src/scripts/import-github-skills.js +18 -398
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/scan-imported-skills.d.ts +7 -7
- package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
- package/dist/src/scripts/scan-imported-skills.js +8 -397
- package/dist/src/scripts/scan-imported-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/categorizer.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/categorizer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/categorizer.js +61 -0
- package/dist/src/scripts/skill-scanner/categorizer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js +90 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/index.d.ts +22 -0
- package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/index.js +43 -0
- package/dist/src/scripts/skill-scanner/index.js.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.js +104 -0
- package/dist/src/scripts/skill-scanner/logger.js.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts +56 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.js +166 -0
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts +44 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.js +140 -0
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js +62 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/types.d.ts +98 -0
- package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/types.js +7 -0
- package/dist/src/scripts/skill-scanner/types.js.map +1 -0
- package/dist/src/scripts/validate-skills.d.ts +3 -172
- package/dist/src/scripts/validate-skills.d.ts.map +1 -1
- package/dist/src/scripts/validate-skills.js +6 -519
- package/dist/src/scripts/validate-skills.js.map +1 -1
- package/dist/src/scripts/validation/deduplication.d.ts +23 -0
- package/dist/src/scripts/validation/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/validation/deduplication.js +127 -0
- package/dist/src/scripts/validation/deduplication.js.map +1 -0
- package/dist/src/scripts/validation/field-validators.d.ts +9 -0
- package/dist/src/scripts/validation/field-validators.d.ts.map +1 -0
- package/dist/src/scripts/validation/field-validators.js +135 -0
- package/dist/src/scripts/validation/field-validators.js.map +1 -0
- package/dist/src/scripts/validation/index.d.ts +29 -0
- package/dist/src/scripts/validation/index.d.ts.map +1 -0
- package/dist/src/scripts/validation/index.js +84 -0
- package/dist/src/scripts/validation/index.js.map +1 -0
- package/dist/src/scripts/validation/normalizers.d.ts +29 -0
- package/dist/src/scripts/validation/normalizers.d.ts.map +1 -0
- package/dist/src/scripts/validation/normalizers.js +79 -0
- package/dist/src/scripts/validation/normalizers.js.map +1 -0
- package/dist/src/scripts/validation/pipeline.d.ts +13 -0
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -0
- package/dist/src/scripts/validation/pipeline.js +126 -0
- package/dist/src/scripts/validation/pipeline.js.map +1 -0
- package/dist/src/scripts/validation/types.d.ts +128 -0
- package/dist/src/scripts/validation/types.d.ts.map +1 -0
- package/dist/src/scripts/validation/types.js +43 -0
- package/dist/src/scripts/validation/types.js.map +1 -0
- package/dist/src/security/index.d.ts +5 -4
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +8 -2
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/rate-limiter/RateLimiter.d.ts +86 -0
- package/dist/src/security/rate-limiter/RateLimiter.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/RateLimiter.js +260 -0
- package/dist/src/security/rate-limiter/RateLimiter.js.map +1 -0
- package/dist/src/security/rate-limiter/constants.d.ts +15 -0
- package/dist/src/security/rate-limiter/constants.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/constants.js +15 -0
- package/dist/src/security/rate-limiter/constants.js.map +1 -0
- package/dist/src/security/rate-limiter/errors.d.ts +22 -0
- package/dist/src/security/rate-limiter/errors.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/errors.js +32 -0
- package/dist/src/security/rate-limiter/errors.js.map +1 -0
- package/dist/src/security/rate-limiter/index.d.ts +12 -0
- package/dist/src/security/rate-limiter/index.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/index.js +16 -0
- package/dist/src/security/rate-limiter/index.js.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts +55 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.js +144 -0
- package/dist/src/security/rate-limiter/metrics-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/presets.d.ts +52 -0
- package/dist/src/security/rate-limiter/presets.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/presets.js +53 -0
- package/dist/src/security/rate-limiter/presets.js.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts +59 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.js +189 -0
- package/dist/src/security/rate-limiter/queue-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/storage.d.ts +34 -0
- package/dist/src/security/rate-limiter/storage.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/storage.js +80 -0
- package/dist/src/security/rate-limiter/storage.js.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts +44 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.js +99 -0
- package/dist/src/security/rate-limiter/token-bucket.js.map +1 -0
- package/dist/src/security/rate-limiter/types.d.ts +104 -0
- package/dist/src/security/rate-limiter/types.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/types.js +7 -0
- package/dist/src/security/rate-limiter/types.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts +94 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.js +403 -0
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +11 -0
- package/dist/src/security/scanner/index.d.ts.map +1 -0
- package/dist/src/security/scanner/index.js +14 -0
- package/dist/src/security/scanner/index.js.map +1 -0
- package/dist/src/security/scanner/patterns.d.ts +14 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.js +147 -0
- package/dist/src/security/scanner/patterns.js.map +1 -0
- package/dist/src/security/scanner/regex-utils.d.ts +33 -0
- package/dist/src/security/scanner/regex-utils.d.ts.map +1 -0
- package/dist/src/security/scanner/regex-utils.js +41 -0
- package/dist/src/security/scanner/regex-utils.js.map +1 -0
- package/dist/src/security/scanner/types.d.ts +63 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -0
- package/dist/src/security/scanner/types.js +7 -0
- package/dist/src/security/scanner/types.js.map +1 -0
- package/dist/src/security/scanner/weights.d.ts +15 -0
- package/dist/src/security/scanner/weights.d.ts.map +1 -0
- package/dist/src/security/scanner/weights.js +28 -0
- package/dist/src/security/scanner/weights.js.map +1 -0
- package/dist/src/session/SessionHealthMonitor.d.ts +5 -168
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +22 -91
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/session/health-checks.d.ts +37 -0
- package/dist/src/session/health-checks.d.ts.map +1 -0
- package/dist/src/session/health-checks.js +64 -0
- package/dist/src/session/health-checks.js.map +1 -0
- package/dist/src/session/health-types.d.ts +78 -0
- package/dist/src/session/health-types.d.ts.map +1 -0
- package/dist/src/session/health-types.js +16 -0
- package/dist/src/session/health-types.js.map +1 -0
- package/dist/src/session/index.d.ts +5 -1
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +9 -0
- package/dist/src/session/index.js.map +1 -1
- package/dist/src/session/metrics-collector.d.ts +23 -0
- package/dist/src/session/metrics-collector.d.ts.map +1 -0
- package/dist/src/session/metrics-collector.js +44 -0
- package/dist/src/session/metrics-collector.js.map +1 -0
- package/dist/src/session/typed-event-emitter.d.ts +70 -0
- package/dist/src/session/typed-event-emitter.d.ts.map +1 -0
- package/dist/src/session/typed-event-emitter.js +79 -0
- package/dist/src/session/typed-event-emitter.js.map +1 -0
- package/dist/src/sources/BaseSourceAdapter.d.ts +1 -1
- package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -1
- package/dist/src/sources/BaseSourceAdapter.js +2 -2
- package/dist/src/sources/BaseSourceAdapter.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +125 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -0
- package/dist/src/telemetry/posthog.js +198 -0
- package/dist/src/telemetry/posthog.js.map +1 -0
- package/dist/tests/RateLimiter.test.js +4 -4
- package/dist/tests/RateLimiter.test.js.map +1 -1
- package/dist/tests/e2e/security/security.e2e.test.js +3 -3
- package/dist/tests/e2e/security/security.e2e.test.js.map +1 -1
- 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
|