@skillsmith/core 0.1.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 -0
- package/dist/src/__tests__/errors.test.d.ts +5 -0
- package/dist/src/__tests__/errors.test.d.ts.map +1 -0
- package/dist/src/__tests__/errors.test.js +115 -0
- package/dist/src/__tests__/errors.test.js.map +1 -0
- package/dist/src/activation/ActivationManager.d.ts +141 -0
- package/dist/src/activation/ActivationManager.d.ts.map +1 -0
- package/dist/src/activation/ActivationManager.js +282 -0
- package/dist/src/activation/ActivationManager.js.map +1 -0
- package/dist/src/activation/ZeroConfigActivator.d.ts +126 -0
- package/dist/src/activation/ZeroConfigActivator.d.ts.map +1 -0
- package/dist/src/activation/ZeroConfigActivator.js +259 -0
- package/dist/src/activation/ZeroConfigActivator.js.map +1 -0
- package/dist/src/activation/index.d.ts +8 -0
- package/dist/src/activation/index.d.ts.map +1 -0
- package/dist/src/activation/index.js +8 -0
- package/dist/src/activation/index.js.map +1 -0
- package/dist/src/analysis/CodebaseAnalyzer.d.ts +175 -0
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -0
- package/dist/src/analysis/CodebaseAnalyzer.js +495 -0
- package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -0
- package/dist/src/analysis/index.d.ts +10 -0
- package/dist/src/analysis/index.d.ts.map +1 -0
- package/dist/src/analysis/index.js +10 -0
- package/dist/src/analysis/index.js.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts +97 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.js +376 -0
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -0
- package/dist/src/analytics/ExperimentService.d.ts +70 -0
- package/dist/src/analytics/ExperimentService.d.ts.map +1 -0
- package/dist/src/analytics/ExperimentService.js +251 -0
- package/dist/src/analytics/ExperimentService.js.map +1 -0
- package/dist/src/analytics/ROIDashboardService.d.ts +55 -0
- package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -0
- package/dist/src/analytics/ROIDashboardService.js +304 -0
- package/dist/src/analytics/ROIDashboardService.js.map +1 -0
- package/dist/src/analytics/UsageAnalyticsService.d.ts +55 -0
- package/dist/src/analytics/UsageAnalyticsService.d.ts.map +1 -0
- package/dist/src/analytics/UsageAnalyticsService.js +180 -0
- package/dist/src/analytics/UsageAnalyticsService.js.map +1 -0
- package/dist/src/analytics/anonymizer.d.ts +53 -0
- package/dist/src/analytics/anonymizer.d.ts.map +1 -0
- package/dist/src/analytics/anonymizer.js +107 -0
- package/dist/src/analytics/anonymizer.js.map +1 -0
- package/dist/src/analytics/constants.d.ts +19 -0
- package/dist/src/analytics/constants.d.ts.map +1 -0
- package/dist/src/analytics/constants.js +19 -0
- package/dist/src/analytics/constants.js.map +1 -0
- package/dist/src/analytics/index.d.ts +23 -0
- package/dist/src/analytics/index.d.ts.map +1 -0
- package/dist/src/analytics/index.js +23 -0
- package/dist/src/analytics/index.js.map +1 -0
- package/dist/src/analytics/metrics-aggregator.d.ts +98 -0
- package/dist/src/analytics/metrics-aggregator.d.ts.map +1 -0
- package/dist/src/analytics/metrics-aggregator.js +176 -0
- package/dist/src/analytics/metrics-aggregator.js.map +1 -0
- package/dist/src/analytics/metrics-exporter.d.ts +148 -0
- package/dist/src/analytics/metrics-exporter.d.ts.map +1 -0
- package/dist/src/analytics/metrics-exporter.js +244 -0
- package/dist/src/analytics/metrics-exporter.js.map +1 -0
- package/dist/src/analytics/schema.d.ts +20 -0
- package/dist/src/analytics/schema.d.ts.map +1 -0
- package/dist/src/analytics/schema.js +125 -0
- package/dist/src/analytics/schema.js.map +1 -0
- package/dist/src/analytics/storage.d.ts +76 -0
- package/dist/src/analytics/storage.d.ts.map +1 -0
- package/dist/src/analytics/storage.js +180 -0
- package/dist/src/analytics/storage.js.map +1 -0
- package/dist/src/analytics/types.d.ts +277 -0
- package/dist/src/analytics/types.d.ts.map +1 -0
- package/dist/src/analytics/types.js +10 -0
- package/dist/src/analytics/types.js.map +1 -0
- package/dist/src/analytics/usage-tracker.d.ts +132 -0
- package/dist/src/analytics/usage-tracker.d.ts.map +1 -0
- package/dist/src/analytics/usage-tracker.js +213 -0
- package/dist/src/analytics/usage-tracker.js.map +1 -0
- package/dist/src/benchmarks/BenchmarkRunner.d.ts +258 -0
- package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -0
- package/dist/src/benchmarks/BenchmarkRunner.js +453 -0
- package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -0
- package/dist/src/benchmarks/IndexBenchmark.d.ts +101 -0
- package/dist/src/benchmarks/IndexBenchmark.d.ts.map +1 -0
- package/dist/src/benchmarks/IndexBenchmark.js +314 -0
- package/dist/src/benchmarks/IndexBenchmark.js.map +1 -0
- package/dist/src/benchmarks/MemoryProfiler.d.ts +266 -0
- package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -0
- package/dist/src/benchmarks/MemoryProfiler.js +404 -0
- package/dist/src/benchmarks/MemoryProfiler.js.map +1 -0
- package/dist/src/benchmarks/SearchBenchmark.d.ts +71 -0
- package/dist/src/benchmarks/SearchBenchmark.d.ts.map +1 -0
- package/dist/src/benchmarks/SearchBenchmark.js +321 -0
- package/dist/src/benchmarks/SearchBenchmark.js.map +1 -0
- package/dist/src/benchmarks/cacheBenchmark.d.ts +75 -0
- package/dist/src/benchmarks/cacheBenchmark.d.ts.map +1 -0
- package/dist/src/benchmarks/cacheBenchmark.js +325 -0
- package/dist/src/benchmarks/cacheBenchmark.js.map +1 -0
- package/dist/src/benchmarks/cli.d.ts +17 -0
- package/dist/src/benchmarks/cli.d.ts.map +1 -0
- package/dist/src/benchmarks/cli.js +140 -0
- package/dist/src/benchmarks/cli.js.map +1 -0
- package/dist/src/benchmarks/embeddingBenchmark.d.ts +86 -0
- package/dist/src/benchmarks/embeddingBenchmark.d.ts.map +1 -0
- package/dist/src/benchmarks/embeddingBenchmark.js +329 -0
- package/dist/src/benchmarks/embeddingBenchmark.js.map +1 -0
- package/dist/src/benchmarks/index.d.ts +51 -0
- package/dist/src/benchmarks/index.d.ts.map +1 -0
- package/dist/src/benchmarks/index.js +201 -0
- package/dist/src/benchmarks/index.js.map +1 -0
- package/dist/src/benchmarks/stats.d.ts +56 -0
- package/dist/src/benchmarks/stats.d.ts.map +1 -0
- package/dist/src/benchmarks/stats.js +86 -0
- package/dist/src/benchmarks/stats.js.map +1 -0
- package/dist/src/cache/CacheEntry.d.ts +101 -0
- package/dist/src/cache/CacheEntry.d.ts.map +1 -0
- package/dist/src/cache/CacheEntry.js +238 -0
- package/dist/src/cache/CacheEntry.js.map +1 -0
- package/dist/src/cache/CacheManager.d.ts +167 -0
- package/dist/src/cache/CacheManager.d.ts.map +1 -0
- package/dist/src/cache/CacheManager.js +346 -0
- package/dist/src/cache/CacheManager.js.map +1 -0
- package/dist/src/cache/TieredCache.d.ts +97 -0
- package/dist/src/cache/TieredCache.d.ts.map +1 -0
- package/dist/src/cache/TieredCache.js +352 -0
- package/dist/src/cache/TieredCache.js.map +1 -0
- package/dist/src/cache/index.d.ts +63 -0
- package/dist/src/cache/index.d.ts.map +1 -0
- package/dist/src/cache/index.js +91 -0
- package/dist/src/cache/index.js.map +1 -0
- package/dist/src/cache/lru.d.ts +68 -0
- package/dist/src/cache/lru.d.ts.map +1 -0
- package/dist/src/cache/lru.js +105 -0
- package/dist/src/cache/lru.js.map +1 -0
- package/dist/src/cache/sqlite.d.ts +59 -0
- package/dist/src/cache/sqlite.d.ts.map +1 -0
- package/dist/src/cache/sqlite.js +159 -0
- package/dist/src/cache/sqlite.js.map +1 -0
- package/dist/src/db/quarantine-schema.d.ts +81 -0
- package/dist/src/db/quarantine-schema.d.ts.map +1 -0
- package/dist/src/db/quarantine-schema.js +110 -0
- package/dist/src/db/quarantine-schema.js.map +1 -0
- package/dist/src/db/schema.d.ts +65 -0
- package/dist/src/db/schema.d.ts.map +1 -0
- package/dist/src/db/schema.js +318 -0
- package/dist/src/db/schema.js.map +1 -0
- package/dist/src/embeddings/index.d.ts +158 -0
- package/dist/src/embeddings/index.d.ts.map +1 -0
- package/dist/src/embeddings/index.js +397 -0
- package/dist/src/embeddings/index.js.map +1 -0
- package/dist/src/errors/SkillsmithError.d.ts +118 -0
- package/dist/src/errors/SkillsmithError.d.ts.map +1 -0
- package/dist/src/errors/SkillsmithError.js +194 -0
- package/dist/src/errors/SkillsmithError.js.map +1 -0
- package/dist/src/errors/index.d.ts +36 -0
- package/dist/src/errors/index.d.ts.map +1 -0
- package/dist/src/errors/index.js +36 -0
- package/dist/src/errors/index.js.map +1 -0
- package/dist/src/errors.d.ts +72 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +123 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +56 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +73 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.test.d.ts +2 -0
- package/dist/src/index.test.d.ts.map +1 -0
- package/dist/src/index.test.js +35 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/indexer/GitHubIndexer.d.ts +107 -0
- package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -0
- package/dist/src/indexer/GitHubIndexer.js +202 -0
- package/dist/src/indexer/GitHubIndexer.js.map +1 -0
- package/dist/src/indexer/PartitionStrategy.d.ts +115 -0
- package/dist/src/indexer/PartitionStrategy.d.ts.map +1 -0
- package/dist/src/indexer/PartitionStrategy.js +207 -0
- package/dist/src/indexer/PartitionStrategy.js.map +1 -0
- package/dist/src/indexer/SkillParser.d.ts +112 -0
- package/dist/src/indexer/SkillParser.d.ts.map +1 -0
- package/dist/src/indexer/SkillParser.js +281 -0
- package/dist/src/indexer/SkillParser.js.map +1 -0
- package/dist/src/indexer/SwarmIndexer.d.ts +163 -0
- package/dist/src/indexer/SwarmIndexer.d.ts.map +1 -0
- package/dist/src/indexer/SwarmIndexer.js +300 -0
- package/dist/src/indexer/SwarmIndexer.js.map +1 -0
- package/dist/src/indexer/index.d.ts +12 -0
- package/dist/src/indexer/index.d.ts.map +1 -0
- package/dist/src/indexer/index.js +16 -0
- package/dist/src/indexer/index.js.map +1 -0
- package/dist/src/learning/interfaces.d.ts +338 -0
- package/dist/src/learning/interfaces.d.ts.map +1 -0
- package/dist/src/learning/interfaces.js +13 -0
- package/dist/src/learning/interfaces.js.map +1 -0
- package/dist/src/learning/types.d.ts +284 -0
- package/dist/src/learning/types.d.ts.map +1 -0
- package/dist/src/learning/types.js +112 -0
- package/dist/src/learning/types.js.map +1 -0
- package/dist/src/matching/OverlapDetector.d.ts +152 -0
- package/dist/src/matching/OverlapDetector.d.ts.map +1 -0
- package/dist/src/matching/OverlapDetector.js +218 -0
- package/dist/src/matching/OverlapDetector.js.map +1 -0
- package/dist/src/matching/SkillMatcher.d.ts +125 -0
- package/dist/src/matching/SkillMatcher.d.ts.map +1 -0
- package/dist/src/matching/SkillMatcher.js +206 -0
- package/dist/src/matching/SkillMatcher.js.map +1 -0
- package/dist/src/matching/index.d.ts +14 -0
- package/dist/src/matching/index.d.ts.map +1 -0
- package/dist/src/matching/index.js +12 -0
- package/dist/src/matching/index.js.map +1 -0
- package/dist/src/pipeline/DailyIndexPipeline.d.ts +220 -0
- package/dist/src/pipeline/DailyIndexPipeline.d.ts.map +1 -0
- package/dist/src/pipeline/DailyIndexPipeline.js +320 -0
- package/dist/src/pipeline/DailyIndexPipeline.js.map +1 -0
- package/dist/src/pipeline/index.d.ts +9 -0
- package/dist/src/pipeline/index.d.ts.map +1 -0
- package/dist/src/pipeline/index.js +9 -0
- package/dist/src/pipeline/index.js.map +1 -0
- package/dist/src/repositories/CacheRepository.d.ts +60 -0
- package/dist/src/repositories/CacheRepository.d.ts.map +1 -0
- package/dist/src/repositories/CacheRepository.js +148 -0
- package/dist/src/repositories/CacheRepository.js.map +1 -0
- package/dist/src/repositories/IndexerRepository.d.ts +126 -0
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -0
- package/dist/src/repositories/IndexerRepository.js +270 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -0
- package/dist/src/repositories/QuarantineRepository.d.ts +255 -0
- package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -0
- package/dist/src/repositories/QuarantineRepository.js +445 -0
- package/dist/src/repositories/QuarantineRepository.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts +78 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -0
- package/dist/src/repositories/SkillRepository.js +208 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -0
- package/dist/src/scoring/QualityScorer.d.ts +188 -0
- package/dist/src/scoring/QualityScorer.d.ts.map +1 -0
- package/dist/src/scoring/QualityScorer.js +342 -0
- package/dist/src/scoring/QualityScorer.js.map +1 -0
- package/dist/src/scoring/index.d.ts +9 -0
- package/dist/src/scoring/index.d.ts.map +1 -0
- package/dist/src/scoring/index.js +9 -0
- package/dist/src/scoring/index.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +5 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +365 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -0
- package/dist/src/scripts/import-github-skills.d.ts +24 -0
- package/dist/src/scripts/import-github-skills.d.ts.map +1 -0
- package/dist/src/scripts/import-github-skills.js +545 -0
- package/dist/src/scripts/import-github-skills.js.map +1 -0
- package/dist/src/scripts/import-to-database.d.ts +60 -0
- package/dist/src/scripts/import-to-database.d.ts.map +1 -0
- package/dist/src/scripts/import-to-database.js +307 -0
- package/dist/src/scripts/import-to-database.js.map +1 -0
- package/dist/src/scripts/scan-imported-skills.d.ts +15 -0
- package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -0
- package/dist/src/scripts/scan-imported-skills.js +405 -0
- package/dist/src/scripts/scan-imported-skills.js.map +1 -0
- package/dist/src/scripts/validate-skills.d.ts +180 -0
- package/dist/src/scripts/validate-skills.d.ts.map +1 -0
- package/dist/src/scripts/validate-skills.js +572 -0
- package/dist/src/scripts/validate-skills.js.map +1 -0
- package/dist/src/search/hybrid.d.ts +85 -0
- package/dist/src/search/hybrid.d.ts.map +1 -0
- package/dist/src/search/hybrid.js +291 -0
- package/dist/src/search/hybrid.js.map +1 -0
- package/dist/src/search/index.d.ts +6 -0
- package/dist/src/search/index.d.ts.map +1 -0
- package/dist/src/search/index.js +5 -0
- package/dist/src/search/index.js.map +1 -0
- package/dist/src/security/AuditLogger.d.ts +197 -0
- package/dist/src/security/AuditLogger.d.ts.map +1 -0
- package/dist/src/security/AuditLogger.js +398 -0
- package/dist/src/security/AuditLogger.js.map +1 -0
- package/dist/src/security/RateLimiter.d.ts +337 -0
- package/dist/src/security/RateLimiter.d.ts.map +1 -0
- package/dist/src/security/RateLimiter.js +782 -0
- package/dist/src/security/RateLimiter.js.map +1 -0
- package/dist/src/security/__tests__/pathValidation.test.d.ts +8 -0
- package/dist/src/security/__tests__/pathValidation.test.d.ts.map +1 -0
- package/dist/src/security/__tests__/pathValidation.test.js +249 -0
- package/dist/src/security/__tests__/pathValidation.test.js.map +1 -0
- package/dist/src/security/index.d.ts +18 -0
- package/dist/src/security/index.d.ts.map +1 -0
- package/dist/src/security/index.js +14 -0
- package/dist/src/security/index.js.map +1 -0
- package/dist/src/security/pathValidation.d.ts +95 -0
- package/dist/src/security/pathValidation.d.ts.map +1 -0
- package/dist/src/security/pathValidation.js +216 -0
- package/dist/src/security/pathValidation.js.map +1 -0
- package/dist/src/security/sanitization.d.ts +123 -0
- package/dist/src/security/sanitization.d.ts.map +1 -0
- package/dist/src/security/sanitization.js +378 -0
- package/dist/src/security/sanitization.js.map +1 -0
- package/dist/src/security/scanner.d.ts +151 -0
- package/dist/src/security/scanner.d.ts.map +1 -0
- package/dist/src/security/scanner.js +599 -0
- package/dist/src/security/scanner.js.map +1 -0
- package/dist/src/services/SearchService.d.ts +88 -0
- package/dist/src/services/SearchService.d.ts.map +1 -0
- package/dist/src/services/SearchService.js +305 -0
- package/dist/src/services/SearchService.js.map +1 -0
- package/dist/src/session/SessionContext.d.ts +116 -0
- package/dist/src/session/SessionContext.d.ts.map +1 -0
- package/dist/src/session/SessionContext.js +134 -0
- package/dist/src/session/SessionContext.js.map +1 -0
- package/dist/src/session/SessionHealthMonitor.d.ts +249 -0
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -0
- package/dist/src/session/SessionHealthMonitor.js +302 -0
- package/dist/src/session/SessionHealthMonitor.js.map +1 -0
- package/dist/src/session/SessionManager.d.ts +179 -0
- package/dist/src/session/SessionManager.d.ts.map +1 -0
- package/dist/src/session/SessionManager.js +451 -0
- package/dist/src/session/SessionManager.js.map +1 -0
- package/dist/src/session/SessionRecovery.d.ts +84 -0
- package/dist/src/session/SessionRecovery.d.ts.map +1 -0
- package/dist/src/session/SessionRecovery.js +257 -0
- package/dist/src/session/SessionRecovery.js.map +1 -0
- package/dist/src/session/index.d.ts +40 -0
- package/dist/src/session/index.d.ts.map +1 -0
- package/dist/src/session/index.js +44 -0
- package/dist/src/session/index.js.map +1 -0
- package/dist/src/sources/BaseSourceAdapter.d.ts +144 -0
- package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -0
- package/dist/src/sources/BaseSourceAdapter.js +287 -0
- package/dist/src/sources/BaseSourceAdapter.js.map +1 -0
- package/dist/src/sources/GitHubSourceAdapter.d.ts +98 -0
- package/dist/src/sources/GitHubSourceAdapter.d.ts.map +1 -0
- package/dist/src/sources/GitHubSourceAdapter.js +269 -0
- package/dist/src/sources/GitHubSourceAdapter.js.map +1 -0
- package/dist/src/sources/GitLabSourceAdapter.d.ts +102 -0
- package/dist/src/sources/GitLabSourceAdapter.d.ts.map +1 -0
- package/dist/src/sources/GitLabSourceAdapter.js +310 -0
- package/dist/src/sources/GitLabSourceAdapter.js.map +1 -0
- package/dist/src/sources/ISourceAdapter.d.ts +110 -0
- package/dist/src/sources/ISourceAdapter.d.ts.map +1 -0
- package/dist/src/sources/ISourceAdapter.js +19 -0
- package/dist/src/sources/ISourceAdapter.js.map +1 -0
- package/dist/src/sources/LocalFilesystemAdapter.d.ts +112 -0
- package/dist/src/sources/LocalFilesystemAdapter.d.ts.map +1 -0
- package/dist/src/sources/LocalFilesystemAdapter.js +340 -0
- package/dist/src/sources/LocalFilesystemAdapter.js.map +1 -0
- package/dist/src/sources/RawUrlSourceAdapter.d.ts +128 -0
- package/dist/src/sources/RawUrlSourceAdapter.d.ts.map +1 -0
- package/dist/src/sources/RawUrlSourceAdapter.js +282 -0
- package/dist/src/sources/RawUrlSourceAdapter.js.map +1 -0
- package/dist/src/sources/SourceAdapterRegistry.d.ts +156 -0
- package/dist/src/sources/SourceAdapterRegistry.d.ts.map +1 -0
- package/dist/src/sources/SourceAdapterRegistry.js +242 -0
- package/dist/src/sources/SourceAdapterRegistry.js.map +1 -0
- package/dist/src/sources/SourceIndexer.d.ts +119 -0
- package/dist/src/sources/SourceIndexer.d.ts.map +1 -0
- package/dist/src/sources/SourceIndexer.js +285 -0
- package/dist/src/sources/SourceIndexer.js.map +1 -0
- package/dist/src/sources/index.d.ts +45 -0
- package/dist/src/sources/index.d.ts.map +1 -0
- package/dist/src/sources/index.js +51 -0
- package/dist/src/sources/index.js.map +1 -0
- package/dist/src/sources/shared.d.ts +125 -0
- package/dist/src/sources/shared.d.ts.map +1 -0
- package/dist/src/sources/shared.js +191 -0
- package/dist/src/sources/shared.js.map +1 -0
- package/dist/src/sources/types.d.ts +204 -0
- package/dist/src/sources/types.d.ts.map +1 -0
- package/dist/src/sources/types.js +6 -0
- package/dist/src/sources/types.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +25 -0
- package/dist/src/telemetry/index.d.ts.map +1 -0
- package/dist/src/telemetry/index.js +32 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/metrics.d.ts +171 -0
- package/dist/src/telemetry/metrics.d.ts.map +1 -0
- package/dist/src/telemetry/metrics.js +401 -0
- package/dist/src/telemetry/metrics.js.map +1 -0
- package/dist/src/telemetry/prometheus.d.ts +81 -0
- package/dist/src/telemetry/prometheus.d.ts.map +1 -0
- package/dist/src/telemetry/prometheus.js +252 -0
- package/dist/src/telemetry/prometheus.js.map +1 -0
- package/dist/src/telemetry/tracer.d.ts +151 -0
- package/dist/src/telemetry/tracer.d.ts.map +1 -0
- package/dist/src/telemetry/tracer.js +391 -0
- package/dist/src/telemetry/tracer.js.map +1 -0
- package/dist/src/triggers/ContextScorer.d.ts +118 -0
- package/dist/src/triggers/ContextScorer.d.ts.map +1 -0
- package/dist/src/triggers/ContextScorer.js +265 -0
- package/dist/src/triggers/ContextScorer.js.map +1 -0
- package/dist/src/triggers/TriggerDetector.d.ts +178 -0
- package/dist/src/triggers/TriggerDetector.d.ts.map +1 -0
- package/dist/src/triggers/TriggerDetector.js +390 -0
- package/dist/src/triggers/TriggerDetector.js.map +1 -0
- package/dist/src/triggers/__tests__/ContextScorer.test.d.ts +6 -0
- package/dist/src/triggers/__tests__/ContextScorer.test.d.ts.map +1 -0
- package/dist/src/triggers/__tests__/ContextScorer.test.js +307 -0
- package/dist/src/triggers/__tests__/ContextScorer.test.js.map +1 -0
- package/dist/src/triggers/__tests__/TriggerDetector.test.d.ts +6 -0
- package/dist/src/triggers/__tests__/TriggerDetector.test.d.ts.map +1 -0
- package/dist/src/triggers/__tests__/TriggerDetector.test.js +249 -0
- package/dist/src/triggers/__tests__/TriggerDetector.test.js.map +1 -0
- package/dist/src/triggers/index.d.ts +8 -0
- package/dist/src/triggers/index.d.ts.map +1 -0
- package/dist/src/triggers/index.js +8 -0
- package/dist/src/triggers/index.js.map +1 -0
- package/dist/src/types/skill.d.ts +80 -0
- package/dist/src/types/skill.d.ts.map +1 -0
- package/dist/src/types/skill.js +5 -0
- package/dist/src/types/skill.js.map +1 -0
- package/dist/src/types.d.ts +88 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +13 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/index.d.ts +6 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +6 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +172 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +291 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.d.ts +97 -0
- package/dist/src/utils/retry.d.ts.map +1 -0
- package/dist/src/utils/retry.js +267 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/validation/index.d.ts +118 -0
- package/dist/src/validation/index.d.ts.map +1 -0
- package/dist/src/validation/index.js +434 -0
- package/dist/src/validation/index.js.map +1 -0
- package/dist/src/webhooks/WebhookHandler.d.ts +117 -0
- package/dist/src/webhooks/WebhookHandler.d.ts.map +1 -0
- package/dist/src/webhooks/WebhookHandler.js +349 -0
- package/dist/src/webhooks/WebhookHandler.js.map +1 -0
- package/dist/src/webhooks/WebhookPayload.d.ts +238 -0
- package/dist/src/webhooks/WebhookPayload.d.ts.map +1 -0
- package/dist/src/webhooks/WebhookPayload.js +244 -0
- package/dist/src/webhooks/WebhookPayload.js.map +1 -0
- package/dist/src/webhooks/WebhookQueue.d.ts +227 -0
- package/dist/src/webhooks/WebhookQueue.d.ts.map +1 -0
- package/dist/src/webhooks/WebhookQueue.js +328 -0
- package/dist/src/webhooks/WebhookQueue.js.map +1 -0
- package/dist/src/webhooks/index.d.ts +12 -0
- package/dist/src/webhooks/index.d.ts.map +1 -0
- package/dist/src/webhooks/index.js +15 -0
- package/dist/src/webhooks/index.js.map +1 -0
- package/dist/tests/Analytics.integration.test.d.ts +7 -0
- package/dist/tests/Analytics.integration.test.d.ts.map +1 -0
- package/dist/tests/Analytics.integration.test.js +367 -0
- package/dist/tests/Analytics.integration.test.js.map +1 -0
- package/dist/tests/AnalyticsRepository.test.d.ts +8 -0
- package/dist/tests/AnalyticsRepository.test.d.ts.map +1 -0
- package/dist/tests/AnalyticsRepository.test.js +399 -0
- package/dist/tests/AnalyticsRepository.test.js.map +1 -0
- package/dist/tests/AnalyticsStorage.test.d.ts +8 -0
- package/dist/tests/AnalyticsStorage.test.d.ts.map +1 -0
- package/dist/tests/AnalyticsStorage.test.js +271 -0
- package/dist/tests/AnalyticsStorage.test.js.map +1 -0
- package/dist/tests/AuditLogger.test.d.ts +8 -0
- package/dist/tests/AuditLogger.test.d.ts.map +1 -0
- package/dist/tests/AuditLogger.test.js +699 -0
- package/dist/tests/AuditLogger.test.js.map +1 -0
- package/dist/tests/BenchmarkRunner.test.d.ts +11 -0
- package/dist/tests/BenchmarkRunner.test.d.ts.map +1 -0
- package/dist/tests/BenchmarkRunner.test.js +641 -0
- package/dist/tests/BenchmarkRunner.test.js.map +1 -0
- package/dist/tests/CacheRepository.test.d.ts +5 -0
- package/dist/tests/CacheRepository.test.d.ts.map +1 -0
- package/dist/tests/CacheRepository.test.js +184 -0
- package/dist/tests/CacheRepository.test.js.map +1 -0
- package/dist/tests/CacheSecurity.test.d.ts +8 -0
- package/dist/tests/CacheSecurity.test.d.ts.map +1 -0
- package/dist/tests/CacheSecurity.test.js +273 -0
- package/dist/tests/CacheSecurity.test.js.map +1 -0
- package/dist/tests/CodebaseAnalyzer.test.d.ts +2 -0
- package/dist/tests/CodebaseAnalyzer.test.d.ts.map +1 -0
- package/dist/tests/CodebaseAnalyzer.test.js +347 -0
- package/dist/tests/CodebaseAnalyzer.test.js.map +1 -0
- package/dist/tests/DailyIndexPipeline.test.d.ts +7 -0
- package/dist/tests/DailyIndexPipeline.test.d.ts.map +1 -0
- package/dist/tests/DailyIndexPipeline.test.js +539 -0
- package/dist/tests/DailyIndexPipeline.test.js.map +1 -0
- package/dist/tests/EmbeddingService.test.d.ts +2 -0
- package/dist/tests/EmbeddingService.test.d.ts.map +1 -0
- package/dist/tests/EmbeddingService.test.js +252 -0
- package/dist/tests/EmbeddingService.test.js.map +1 -0
- package/dist/tests/ExperimentService.test.d.ts +7 -0
- package/dist/tests/ExperimentService.test.d.ts.map +1 -0
- package/dist/tests/ExperimentService.test.js +293 -0
- package/dist/tests/ExperimentService.test.js.map +1 -0
- package/dist/tests/GitHubIndexer.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.test.js +524 -0
- package/dist/tests/GitHubIndexer.test.js.map +1 -0
- package/dist/tests/GitHubSourceAdapter.test.d.ts +5 -0
- package/dist/tests/GitHubSourceAdapter.test.d.ts.map +1 -0
- package/dist/tests/GitHubSourceAdapter.test.js +385 -0
- package/dist/tests/GitHubSourceAdapter.test.js.map +1 -0
- package/dist/tests/MemoryProfiler.test.d.ts +12 -0
- package/dist/tests/MemoryProfiler.test.d.ts.map +1 -0
- package/dist/tests/MemoryProfiler.test.js +402 -0
- package/dist/tests/MemoryProfiler.test.js.map +1 -0
- package/dist/tests/OverlapDetector.test.d.ts +2 -0
- package/dist/tests/OverlapDetector.test.d.ts.map +1 -0
- package/dist/tests/OverlapDetector.test.js +340 -0
- package/dist/tests/OverlapDetector.test.js.map +1 -0
- package/dist/tests/QualityScorer.test.d.ts +7 -0
- package/dist/tests/QualityScorer.test.d.ts.map +1 -0
- package/dist/tests/QualityScorer.test.js +340 -0
- package/dist/tests/QualityScorer.test.js.map +1 -0
- package/dist/tests/QuarantineRepository.test.d.ts +7 -0
- package/dist/tests/QuarantineRepository.test.d.ts.map +1 -0
- package/dist/tests/QuarantineRepository.test.js +582 -0
- package/dist/tests/QuarantineRepository.test.js.map +1 -0
- package/dist/tests/ROIDashboardService.test.d.ts +7 -0
- package/dist/tests/ROIDashboardService.test.d.ts.map +1 -0
- package/dist/tests/ROIDashboardService.test.js +324 -0
- package/dist/tests/ROIDashboardService.test.js.map +1 -0
- package/dist/tests/RateLimiter.test.d.ts +7 -0
- package/dist/tests/RateLimiter.test.d.ts.map +1 -0
- package/dist/tests/RateLimiter.test.js +1017 -0
- package/dist/tests/RateLimiter.test.js.map +1 -0
- package/dist/tests/RawUrlSourceAdapter.security.test.d.ts +7 -0
- package/dist/tests/RawUrlSourceAdapter.security.test.d.ts.map +1 -0
- package/dist/tests/RawUrlSourceAdapter.security.test.js +455 -0
- package/dist/tests/RawUrlSourceAdapter.security.test.js.map +1 -0
- package/dist/tests/ScraperAdapters.test.d.ts +7 -0
- package/dist/tests/ScraperAdapters.test.d.ts.map +1 -0
- package/dist/tests/ScraperAdapters.test.js +748 -0
- package/dist/tests/ScraperAdapters.test.js.map +1 -0
- package/dist/tests/SearchQuality.test.d.ts +8 -0
- package/dist/tests/SearchQuality.test.d.ts.map +1 -0
- package/dist/tests/SearchQuality.test.js +397 -0
- package/dist/tests/SearchQuality.test.js.map +1 -0
- package/dist/tests/SearchService.test.d.ts +5 -0
- package/dist/tests/SearchService.test.d.ts.map +1 -0
- package/dist/tests/SearchService.test.js +218 -0
- package/dist/tests/SearchService.test.js.map +1 -0
- package/dist/tests/SecurityScanner.test.d.ts +6 -0
- package/dist/tests/SecurityScanner.test.d.ts.map +1 -0
- package/dist/tests/SecurityScanner.test.js +449 -0
- package/dist/tests/SecurityScanner.test.js.map +1 -0
- package/dist/tests/SessionHealthMonitor.test.d.ts +5 -0
- package/dist/tests/SessionHealthMonitor.test.d.ts.map +1 -0
- package/dist/tests/SessionHealthMonitor.test.js +449 -0
- package/dist/tests/SessionHealthMonitor.test.js.map +1 -0
- package/dist/tests/SessionManager.security.test.d.ts +10 -0
- package/dist/tests/SessionManager.security.test.d.ts.map +1 -0
- package/dist/tests/SessionManager.security.test.js +395 -0
- package/dist/tests/SessionManager.security.test.js.map +1 -0
- package/dist/tests/SessionManager.test.d.ts +8 -0
- package/dist/tests/SessionManager.test.d.ts.map +1 -0
- package/dist/tests/SessionManager.test.js +446 -0
- package/dist/tests/SessionManager.test.js.map +1 -0
- package/dist/tests/SkillMatcher.test.d.ts +2 -0
- package/dist/tests/SkillMatcher.test.d.ts.map +1 -0
- package/dist/tests/SkillMatcher.test.js +253 -0
- package/dist/tests/SkillMatcher.test.js.map +1 -0
- package/dist/tests/SkillRepository.test.d.ts +5 -0
- package/dist/tests/SkillRepository.test.d.ts.map +1 -0
- package/dist/tests/SkillRepository.test.js +237 -0
- package/dist/tests/SkillRepository.test.js.map +1 -0
- package/dist/tests/SwarmIndexer.test.d.ts +11 -0
- package/dist/tests/SwarmIndexer.test.d.ts.map +1 -0
- package/dist/tests/SwarmIndexer.test.js +374 -0
- package/dist/tests/SwarmIndexer.test.js.map +1 -0
- package/dist/tests/TieredCache.test.d.ts +7 -0
- package/dist/tests/TieredCache.test.d.ts.map +1 -0
- package/dist/tests/TieredCache.test.js +529 -0
- package/dist/tests/TieredCache.test.js.map +1 -0
- package/dist/tests/UsageAnalyticsService.test.d.ts +7 -0
- package/dist/tests/UsageAnalyticsService.test.d.ts.map +1 -0
- package/dist/tests/UsageAnalyticsService.test.js +238 -0
- package/dist/tests/UsageAnalyticsService.test.js.map +1 -0
- package/dist/tests/UsageTracker.test.d.ts +7 -0
- package/dist/tests/UsageTracker.test.d.ts.map +1 -0
- package/dist/tests/UsageTracker.test.js +196 -0
- package/dist/tests/UsageTracker.test.js.map +1 -0
- package/dist/tests/WebhookHandler.test.d.ts +10 -0
- package/dist/tests/WebhookHandler.test.d.ts.map +1 -0
- package/dist/tests/WebhookHandler.test.js +592 -0
- package/dist/tests/WebhookHandler.test.js.map +1 -0
- package/dist/tests/analytics/metrics-aggregator.test.d.ts +11 -0
- package/dist/tests/analytics/metrics-aggregator.test.d.ts.map +1 -0
- package/dist/tests/analytics/metrics-aggregator.test.js +273 -0
- package/dist/tests/analytics/metrics-aggregator.test.js.map +1 -0
- package/dist/tests/analytics/metrics-exporter.test.d.ts +11 -0
- package/dist/tests/analytics/metrics-exporter.test.d.ts.map +1 -0
- package/dist/tests/analytics/metrics-exporter.test.js +371 -0
- package/dist/tests/analytics/metrics-exporter.test.js.map +1 -0
- package/dist/tests/analytics/usage-tracker.test.d.ts +10 -0
- package/dist/tests/analytics/usage-tracker.test.d.ts.map +1 -0
- package/dist/tests/analytics/usage-tracker.test.js +151 -0
- package/dist/tests/analytics/usage-tracker.test.js.map +1 -0
- package/dist/tests/anonymizer.test.d.ts +8 -0
- package/dist/tests/anonymizer.test.d.ts.map +1 -0
- package/dist/tests/anonymizer.test.js +153 -0
- package/dist/tests/anonymizer.test.js.map +1 -0
- package/dist/tests/cache.test.d.ts +6 -0
- package/dist/tests/cache.test.d.ts.map +1 -0
- package/dist/tests/cache.test.js +170 -0
- package/dist/tests/cache.test.js.map +1 -0
- package/dist/tests/e2e/security/security.e2e.test.d.ts +8 -0
- package/dist/tests/e2e/security/security.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/security/security.e2e.test.js +448 -0
- package/dist/tests/e2e/security/security.e2e.test.js.map +1 -0
- package/dist/tests/edge-cases/EdgeCases.test.d.ts +13 -0
- package/dist/tests/edge-cases/EdgeCases.test.d.ts.map +1 -0
- package/dist/tests/edge-cases/EdgeCases.test.js +844 -0
- package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -0
- package/dist/tests/import-github-skills.test.d.ts +8 -0
- package/dist/tests/import-github-skills.test.d.ts.map +1 -0
- package/dist/tests/import-github-skills.test.js +390 -0
- package/dist/tests/import-github-skills.test.js.map +1 -0
- package/dist/tests/logger.test.d.ts +2 -0
- package/dist/tests/logger.test.d.ts.map +1 -0
- package/dist/tests/logger.test.js +417 -0
- package/dist/tests/logger.test.js.map +1 -0
- package/dist/tests/performance/LargeScalePerformance.test.d.ts +14 -0
- package/dist/tests/performance/LargeScalePerformance.test.d.ts.map +1 -0
- package/dist/tests/performance/LargeScalePerformance.test.js +558 -0
- package/dist/tests/performance/LargeScalePerformance.test.js.map +1 -0
- package/dist/tests/retry.test.d.ts +7 -0
- package/dist/tests/retry.test.d.ts.map +1 -0
- package/dist/tests/retry.test.js +302 -0
- package/dist/tests/retry.test.js.map +1 -0
- package/dist/tests/sanitization.test.d.ts +8 -0
- package/dist/tests/sanitization.test.d.ts.map +1 -0
- package/dist/tests/sanitization.test.js +413 -0
- package/dist/tests/sanitization.test.js.map +1 -0
- package/dist/tests/schema.test.d.ts +5 -0
- package/dist/tests/schema.test.d.ts.map +1 -0
- package/dist/tests/schema.test.js +167 -0
- package/dist/tests/schema.test.js.map +1 -0
- package/dist/tests/scripts/import-to-database.test.d.ts +11 -0
- package/dist/tests/scripts/import-to-database.test.d.ts.map +1 -0
- package/dist/tests/scripts/import-to-database.test.js +325 -0
- package/dist/tests/scripts/import-to-database.test.js.map +1 -0
- package/dist/tests/security/ContinuousSecurity.test.d.ts +6 -0
- package/dist/tests/security/ContinuousSecurity.test.d.ts.map +1 -0
- package/dist/tests/security/ContinuousSecurity.test.js +595 -0
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -0
- package/dist/tests/security/ReDoS.test.d.ts +8 -0
- package/dist/tests/security/ReDoS.test.d.ts.map +1 -0
- package/dist/tests/security/ReDoS.test.js +213 -0
- package/dist/tests/security/ReDoS.test.js.map +1 -0
- package/dist/tests/security.test.d.ts +5 -0
- package/dist/tests/security.test.d.ts.map +1 -0
- package/dist/tests/security.test.js +134 -0
- package/dist/tests/security.test.js.map +1 -0
- package/dist/tests/shared.test.d.ts +7 -0
- package/dist/tests/shared.test.d.ts.map +1 -0
- package/dist/tests/shared.test.js +480 -0
- package/dist/tests/shared.test.js.map +1 -0
- package/dist/tests/sources.test.d.ts +5 -0
- package/dist/tests/sources.test.d.ts.map +1 -0
- package/dist/tests/sources.test.js +369 -0
- package/dist/tests/sources.test.js.map +1 -0
- package/dist/tests/stats.test.d.ts +11 -0
- package/dist/tests/stats.test.d.ts.map +1 -0
- package/dist/tests/stats.test.js +124 -0
- package/dist/tests/stats.test.js.map +1 -0
- package/dist/tests/telemetry.test.d.ts +11 -0
- package/dist/tests/telemetry.test.d.ts.map +1 -0
- package/dist/tests/telemetry.test.js +424 -0
- package/dist/tests/telemetry.test.js.map +1 -0
- package/dist/tests/test-utils.d.ts +74 -0
- package/dist/tests/test-utils.d.ts.map +1 -0
- package/dist/tests/test-utils.js +98 -0
- package/dist/tests/test-utils.js.map +1 -0
- package/dist/tests/validate-skills.test.d.ts +5 -0
- package/dist/tests/validate-skills.test.d.ts.map +1 -0
- package/dist/tests/validate-skills.test.js +649 -0
- package/dist/tests/validate-skills.test.js.map +1 -0
- package/dist/tests/validation.test.d.ts +7 -0
- package/dist/tests/validation.test.d.ts.map +1 -0
- package/dist/tests/validation.test.js +495 -0
- package/dist/tests/validation.test.js.map +1 -0
- package/dist/tests/webhooks/WebhookHandler.idempotency.test.d.ts +8 -0
- package/dist/tests/webhooks/WebhookHandler.idempotency.test.d.ts.map +1 -0
- package/dist/tests/webhooks/WebhookHandler.idempotency.test.js +190 -0
- package/dist/tests/webhooks/WebhookHandler.idempotency.test.js.map +1 -0
- package/dist/tests/webhooks/WebhookPayload.security.test.d.ts +8 -0
- package/dist/tests/webhooks/WebhookPayload.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/WebhookPayload.security.test.js +204 -0
- package/dist/tests/webhooks/WebhookPayload.security.test.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-585: L1 In-Memory LRU Cache
|
|
3
|
+
* Fast in-memory cache for frequently accessed search results
|
|
4
|
+
*/
|
|
5
|
+
import { LRUCache } from 'lru-cache';
|
|
6
|
+
export class L1Cache {
|
|
7
|
+
cache;
|
|
8
|
+
hits = 0;
|
|
9
|
+
misses = 0;
|
|
10
|
+
constructor(maxSize = 100) {
|
|
11
|
+
this.cache = new LRUCache({
|
|
12
|
+
max: maxSize,
|
|
13
|
+
// Items expire after 5 minutes in L1
|
|
14
|
+
ttl: 5 * 60 * 1000,
|
|
15
|
+
updateAgeOnGet: true,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate cache key from query and filters
|
|
20
|
+
*/
|
|
21
|
+
static generateKey(query, filters) {
|
|
22
|
+
// Normalize query: lowercase, trim, collapse whitespace
|
|
23
|
+
const normalizedQuery = query.toLowerCase().trim().replace(/\s+/g, ' ');
|
|
24
|
+
// Sort and stringify filters for consistent keys
|
|
25
|
+
const sortedFilters = filters
|
|
26
|
+
? JSON.stringify(Object.keys(filters)
|
|
27
|
+
.sort()
|
|
28
|
+
.reduce((acc, key) => {
|
|
29
|
+
acc[key] = filters[key];
|
|
30
|
+
return acc;
|
|
31
|
+
}, {}))
|
|
32
|
+
: '';
|
|
33
|
+
return `search:${normalizedQuery}:${sortedFilters}`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get cached search results
|
|
37
|
+
*/
|
|
38
|
+
get(key) {
|
|
39
|
+
const entry = this.cache.get(key);
|
|
40
|
+
if (entry) {
|
|
41
|
+
this.hits++;
|
|
42
|
+
return entry;
|
|
43
|
+
}
|
|
44
|
+
this.misses++;
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Store search results in cache
|
|
49
|
+
*/
|
|
50
|
+
set(key, results, totalCount) {
|
|
51
|
+
this.cache.set(key, {
|
|
52
|
+
results,
|
|
53
|
+
totalCount,
|
|
54
|
+
timestamp: Date.now(),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if key exists in cache
|
|
59
|
+
*/
|
|
60
|
+
has(key) {
|
|
61
|
+
return this.cache.has(key);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Delete specific cache entry
|
|
65
|
+
*/
|
|
66
|
+
delete(key) {
|
|
67
|
+
return this.cache.delete(key);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Clear all cache entries
|
|
71
|
+
*/
|
|
72
|
+
clear() {
|
|
73
|
+
this.cache.clear();
|
|
74
|
+
this.hits = 0;
|
|
75
|
+
this.misses = 0;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Invalidate all search-related entries
|
|
79
|
+
* Called when the skill index is updated
|
|
80
|
+
*/
|
|
81
|
+
invalidateAll() {
|
|
82
|
+
this.clear();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get cache statistics
|
|
86
|
+
*/
|
|
87
|
+
getStats() {
|
|
88
|
+
const total = this.hits + this.misses;
|
|
89
|
+
return {
|
|
90
|
+
hits: this.hits,
|
|
91
|
+
misses: this.misses,
|
|
92
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
93
|
+
size: this.cache.size,
|
|
94
|
+
maxSize: this.cache.max,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Prune expired entries
|
|
99
|
+
*/
|
|
100
|
+
prune() {
|
|
101
|
+
this.cache.purgeStale();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export default L1Cache;
|
|
105
|
+
//# sourceMappingURL=lru.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru.js","sourceRoot":"","sources":["../../../src/cache/lru.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAwBpC,MAAM,OAAO,OAAO;IACV,KAAK,CAAoC;IACzC,IAAI,GAAG,CAAC,CAAA;IACR,MAAM,GAAG,CAAC,CAAA;IAElB,YAAY,UAAkB,GAAG;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAA2B;YAClD,GAAG,EAAE,OAAO;YACZ,qCAAqC;YACrC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;YAClB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAa,EAAE,OAAiC;QACjE,wDAAwD;QACxD,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAEvE,iDAAiD;QACjD,MAAM,aAAa,GAAG,OAAO;YAC3B,CAAC,CAAC,IAAI,CAAC,SAAS,CACZ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;iBACjB,IAAI,EAAE;iBACN,MAAM,CACL,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACX,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;gBACvB,OAAO,GAAG,CAAA;YACZ,CAAC,EACD,EAA6B,CAC9B,CACJ;YACH,CAAC,CAAC,EAAE,CAAA;QAEN,OAAO,UAAU,eAAe,IAAI,aAAa,EAAE,CAAA;IACrD,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEjC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,EAAE,CAAA;YACX,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW,EAAE,OAAuB,EAAE,UAAkB;QAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,OAAO;YACP,UAAU;YACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;QACb,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACjB,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA;QACrC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG;SACxB,CAAA;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAA;IACzB,CAAC;CACF;AAED,eAAe,OAAO,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-585: L2 SQLite Persistent Cache
|
|
3
|
+
* Persistent cache layer with configurable TTL
|
|
4
|
+
*/
|
|
5
|
+
import type { SearchResult, SearchCacheEntry, CacheStats } from './lru.js';
|
|
6
|
+
export interface L2CacheOptions {
|
|
7
|
+
dbPath: string;
|
|
8
|
+
ttlSeconds?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class L2Cache {
|
|
11
|
+
private db;
|
|
12
|
+
private readonly ttlSeconds;
|
|
13
|
+
private hits;
|
|
14
|
+
private misses;
|
|
15
|
+
private stmts;
|
|
16
|
+
constructor(options: L2CacheOptions);
|
|
17
|
+
private initTable;
|
|
18
|
+
private prepareStatements;
|
|
19
|
+
/**
|
|
20
|
+
* Get cached search results
|
|
21
|
+
*/
|
|
22
|
+
get(key: string): SearchCacheEntry | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Store search results in cache
|
|
25
|
+
*/
|
|
26
|
+
set(key: string, results: SearchResult[], totalCount: number): void;
|
|
27
|
+
/**
|
|
28
|
+
* Check if key exists and is not expired
|
|
29
|
+
*/
|
|
30
|
+
has(key: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Delete specific cache entry
|
|
33
|
+
*/
|
|
34
|
+
delete(key: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Clear all cache entries
|
|
37
|
+
*/
|
|
38
|
+
clear(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Invalidate all entries (called when index updates)
|
|
41
|
+
*/
|
|
42
|
+
invalidateAll(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Remove expired entries
|
|
45
|
+
*/
|
|
46
|
+
prune(): number;
|
|
47
|
+
/**
|
|
48
|
+
* Get cache statistics
|
|
49
|
+
*/
|
|
50
|
+
getStats(): CacheStats & {
|
|
51
|
+
expiredCount: number;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Close database connection
|
|
55
|
+
*/
|
|
56
|
+
close(): void;
|
|
57
|
+
}
|
|
58
|
+
export default L2Cache;
|
|
59
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/cache/sqlite.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAG1E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,MAAM,CAAI;IAGlB,OAAO,CAAC,KAAK,CAOZ;gBAEW,OAAO,EAAE,cAAc;IAOnC,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IA4B9C;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAUnE;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAMzB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,KAAK,IAAI,MAAM;IAMf;;OAEG;IACH,QAAQ,IAAI,UAAU,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE;IAejD;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,eAAe,OAAO,CAAA"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-585: L2 SQLite Persistent Cache
|
|
3
|
+
* Persistent cache layer with configurable TTL
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
import { isValidCacheKey } from './CacheEntry.js';
|
|
7
|
+
export class L2Cache {
|
|
8
|
+
db;
|
|
9
|
+
ttlSeconds;
|
|
10
|
+
hits = 0;
|
|
11
|
+
misses = 0;
|
|
12
|
+
// Prepared statements (created once, reused for performance)
|
|
13
|
+
stmts;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.db = new Database(options.dbPath);
|
|
16
|
+
this.ttlSeconds = options.ttlSeconds ?? 3600; // 1 hour default
|
|
17
|
+
this.initTable();
|
|
18
|
+
this.stmts = this.prepareStatements();
|
|
19
|
+
}
|
|
20
|
+
initTable() {
|
|
21
|
+
this.db.exec(`
|
|
22
|
+
CREATE TABLE IF NOT EXISTS search_cache (
|
|
23
|
+
cache_key TEXT PRIMARY KEY,
|
|
24
|
+
results_json TEXT NOT NULL,
|
|
25
|
+
total_count INTEGER NOT NULL,
|
|
26
|
+
created_at INTEGER NOT NULL,
|
|
27
|
+
expires_at INTEGER NOT NULL
|
|
28
|
+
)
|
|
29
|
+
`);
|
|
30
|
+
this.db.exec(`
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_cache_expires
|
|
32
|
+
ON search_cache(expires_at)
|
|
33
|
+
`);
|
|
34
|
+
}
|
|
35
|
+
prepareStatements() {
|
|
36
|
+
return {
|
|
37
|
+
get: this.db.prepare(`
|
|
38
|
+
SELECT results_json, total_count, created_at
|
|
39
|
+
FROM search_cache
|
|
40
|
+
WHERE cache_key = ? AND expires_at > ?
|
|
41
|
+
`),
|
|
42
|
+
set: this.db.prepare(`
|
|
43
|
+
INSERT OR REPLACE INTO search_cache
|
|
44
|
+
(cache_key, results_json, total_count, created_at, expires_at)
|
|
45
|
+
VALUES (?, ?, ?, ?, ?)
|
|
46
|
+
`),
|
|
47
|
+
has: this.db.prepare(`
|
|
48
|
+
SELECT 1 FROM search_cache
|
|
49
|
+
WHERE cache_key = ? AND expires_at > ?
|
|
50
|
+
`),
|
|
51
|
+
delete: this.db.prepare(`
|
|
52
|
+
DELETE FROM search_cache WHERE cache_key = ?
|
|
53
|
+
`),
|
|
54
|
+
prune: this.db.prepare(`
|
|
55
|
+
DELETE FROM search_cache WHERE expires_at <= ?
|
|
56
|
+
`),
|
|
57
|
+
stats: this.db.prepare(`
|
|
58
|
+
SELECT
|
|
59
|
+
COUNT(*) as total,
|
|
60
|
+
SUM(CASE WHEN expires_at <= ? THEN 1 ELSE 0 END) as expired
|
|
61
|
+
FROM search_cache
|
|
62
|
+
`),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get cached search results
|
|
67
|
+
*/
|
|
68
|
+
get(key) {
|
|
69
|
+
if (!isValidCacheKey(key)) {
|
|
70
|
+
this.misses++;
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
const now = Math.floor(Date.now() / 1000);
|
|
74
|
+
const row = this.stmts.get.get(key, now);
|
|
75
|
+
if (row) {
|
|
76
|
+
this.hits++;
|
|
77
|
+
return {
|
|
78
|
+
results: JSON.parse(row.results_json),
|
|
79
|
+
totalCount: row.total_count,
|
|
80
|
+
timestamp: row.created_at * 1000,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
this.misses++;
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Store search results in cache
|
|
88
|
+
*/
|
|
89
|
+
set(key, results, totalCount) {
|
|
90
|
+
if (!isValidCacheKey(key)) {
|
|
91
|
+
throw new Error('Invalid cache key');
|
|
92
|
+
}
|
|
93
|
+
const now = Math.floor(Date.now() / 1000);
|
|
94
|
+
const expiresAt = now + this.ttlSeconds;
|
|
95
|
+
this.stmts.set.run(key, JSON.stringify(results), totalCount, now, expiresAt);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if key exists and is not expired
|
|
99
|
+
*/
|
|
100
|
+
has(key) {
|
|
101
|
+
if (!isValidCacheKey(key))
|
|
102
|
+
return false;
|
|
103
|
+
const now = Math.floor(Date.now() / 1000);
|
|
104
|
+
return this.stmts.has.get(key, now) !== undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Delete specific cache entry
|
|
108
|
+
*/
|
|
109
|
+
delete(key) {
|
|
110
|
+
const result = this.stmts.delete.run(key);
|
|
111
|
+
return result.changes > 0;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Clear all cache entries
|
|
115
|
+
*/
|
|
116
|
+
clear() {
|
|
117
|
+
this.db.exec('DELETE FROM search_cache');
|
|
118
|
+
this.hits = 0;
|
|
119
|
+
this.misses = 0;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Invalidate all entries (called when index updates)
|
|
123
|
+
*/
|
|
124
|
+
invalidateAll() {
|
|
125
|
+
this.clear();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Remove expired entries
|
|
129
|
+
*/
|
|
130
|
+
prune() {
|
|
131
|
+
const now = Math.floor(Date.now() / 1000);
|
|
132
|
+
const result = this.stmts.prune.run(now);
|
|
133
|
+
return result.changes;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get cache statistics
|
|
137
|
+
*/
|
|
138
|
+
getStats() {
|
|
139
|
+
const total = this.hits + this.misses;
|
|
140
|
+
const now = Math.floor(Date.now() / 1000);
|
|
141
|
+
const counts = this.stmts.stats.get(now);
|
|
142
|
+
return {
|
|
143
|
+
hits: this.hits,
|
|
144
|
+
misses: this.misses,
|
|
145
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
146
|
+
size: counts.total - (counts.expired ?? 0),
|
|
147
|
+
maxSize: -1, // -1 indicates no limit for L2
|
|
148
|
+
expiredCount: counts.expired ?? 0,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Close database connection
|
|
153
|
+
*/
|
|
154
|
+
close() {
|
|
155
|
+
this.db.close();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export default L2Cache;
|
|
159
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/cache/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-865: Quarantine Management System Database Schema
|
|
3
|
+
*
|
|
4
|
+
* Provides database schema for skill quarantine management:
|
|
5
|
+
* - Quarantine table with severity levels and review status
|
|
6
|
+
* - Indexes for efficient querying
|
|
7
|
+
* - Migration support for existing databases
|
|
8
|
+
*
|
|
9
|
+
* Severity Categories:
|
|
10
|
+
* - MALICIOUS: Permanent quarantine, security threat detected
|
|
11
|
+
* - SUSPICIOUS: Manual review required before import
|
|
12
|
+
* - RISKY: Can import with warnings displayed
|
|
13
|
+
* - LOW_QUALITY: Can import with reduced quality score
|
|
14
|
+
*/
|
|
15
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
16
|
+
/**
|
|
17
|
+
* Severity levels for quarantined skills
|
|
18
|
+
*/
|
|
19
|
+
export type QuarantineSeverity = 'MALICIOUS' | 'SUSPICIOUS' | 'RISKY' | 'LOW_QUALITY';
|
|
20
|
+
/**
|
|
21
|
+
* Review status for quarantined skills
|
|
22
|
+
*/
|
|
23
|
+
export type QuarantineReviewStatus = 'pending' | 'approved' | 'rejected';
|
|
24
|
+
/**
|
|
25
|
+
* Quarantine severity descriptions and policies
|
|
26
|
+
*/
|
|
27
|
+
export declare const QUARANTINE_SEVERITY_POLICIES: {
|
|
28
|
+
readonly MALICIOUS: {
|
|
29
|
+
readonly level: 4;
|
|
30
|
+
readonly description: "Permanent quarantine - security threat detected";
|
|
31
|
+
readonly allowImport: false;
|
|
32
|
+
readonly requiresReview: true;
|
|
33
|
+
readonly autoReject: false;
|
|
34
|
+
};
|
|
35
|
+
readonly SUSPICIOUS: {
|
|
36
|
+
readonly level: 3;
|
|
37
|
+
readonly description: "Manual review required before import";
|
|
38
|
+
readonly allowImport: false;
|
|
39
|
+
readonly requiresReview: true;
|
|
40
|
+
readonly autoReject: false;
|
|
41
|
+
};
|
|
42
|
+
readonly RISKY: {
|
|
43
|
+
readonly level: 2;
|
|
44
|
+
readonly description: "Can import with warnings displayed";
|
|
45
|
+
readonly allowImport: true;
|
|
46
|
+
readonly requiresReview: false;
|
|
47
|
+
readonly autoReject: false;
|
|
48
|
+
};
|
|
49
|
+
readonly LOW_QUALITY: {
|
|
50
|
+
readonly level: 1;
|
|
51
|
+
readonly description: "Can import with reduced quality score";
|
|
52
|
+
readonly allowImport: true;
|
|
53
|
+
readonly requiresReview: false;
|
|
54
|
+
readonly autoReject: false;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* SQL statement to create the quarantine table
|
|
59
|
+
*/
|
|
60
|
+
export declare const QUARANTINE_SCHEMA_SQL = "\n-- SMI-865: Quarantine table for skill security management\nCREATE TABLE IF NOT EXISTS quarantine (\n id TEXT PRIMARY KEY,\n skill_id TEXT NOT NULL,\n source TEXT NOT NULL,\n quarantine_reason TEXT NOT NULL,\n severity TEXT NOT NULL CHECK(severity IN ('MALICIOUS', 'SUSPICIOUS', 'RISKY', 'LOW_QUALITY')),\n detected_patterns TEXT DEFAULT '[]', -- JSON array of detected security patterns\n quarantine_date TEXT NOT NULL DEFAULT (datetime('now')),\n reviewed_by TEXT,\n review_status TEXT NOT NULL CHECK(review_status IN ('pending', 'approved', 'rejected')) DEFAULT 'pending',\n review_notes TEXT,\n review_date TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Indexes for efficient querying\nCREATE INDEX IF NOT EXISTS idx_quarantine_skill_id ON quarantine(skill_id);\nCREATE INDEX IF NOT EXISTS idx_quarantine_severity ON quarantine(severity);\nCREATE INDEX IF NOT EXISTS idx_quarantine_review_status ON quarantine(review_status);\nCREATE INDEX IF NOT EXISTS idx_quarantine_source ON quarantine(source);\nCREATE INDEX IF NOT EXISTS idx_quarantine_date ON quarantine(quarantine_date);\nCREATE INDEX IF NOT EXISTS idx_quarantine_reviewed_by ON quarantine(reviewed_by);\n";
|
|
61
|
+
/**
|
|
62
|
+
* Initialize the quarantine schema in the database
|
|
63
|
+
*
|
|
64
|
+
* @param db - Database connection
|
|
65
|
+
*/
|
|
66
|
+
export declare function initializeQuarantineSchema(db: DatabaseType): void;
|
|
67
|
+
/**
|
|
68
|
+
* Check if the quarantine table exists
|
|
69
|
+
*
|
|
70
|
+
* @param db - Database connection
|
|
71
|
+
* @returns True if quarantine table exists
|
|
72
|
+
*/
|
|
73
|
+
export declare function hasQuarantineTable(db: DatabaseType): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Run quarantine schema migration if needed
|
|
76
|
+
*
|
|
77
|
+
* @param db - Database connection
|
|
78
|
+
* @returns True if migration was run
|
|
79
|
+
*/
|
|
80
|
+
export declare function migrateQuarantineSchema(db: DatabaseType): boolean;
|
|
81
|
+
//# sourceMappingURL=quarantine-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quarantine-schema.d.ts","sourceRoot":"","sources":["../../../src/db/quarantine-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE9D;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,GAAG,aAAa,CAAA;AAErF;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAA;AAExE;;GAEG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B/B,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,qBAAqB,+uCAyBjC,CAAA;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAK5D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAMjE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-865: Quarantine Management System Database Schema
|
|
3
|
+
*
|
|
4
|
+
* Provides database schema for skill quarantine management:
|
|
5
|
+
* - Quarantine table with severity levels and review status
|
|
6
|
+
* - Indexes for efficient querying
|
|
7
|
+
* - Migration support for existing databases
|
|
8
|
+
*
|
|
9
|
+
* Severity Categories:
|
|
10
|
+
* - MALICIOUS: Permanent quarantine, security threat detected
|
|
11
|
+
* - SUSPICIOUS: Manual review required before import
|
|
12
|
+
* - RISKY: Can import with warnings displayed
|
|
13
|
+
* - LOW_QUALITY: Can import with reduced quality score
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Quarantine severity descriptions and policies
|
|
17
|
+
*/
|
|
18
|
+
export const QUARANTINE_SEVERITY_POLICIES = {
|
|
19
|
+
MALICIOUS: {
|
|
20
|
+
level: 4,
|
|
21
|
+
description: 'Permanent quarantine - security threat detected',
|
|
22
|
+
allowImport: false,
|
|
23
|
+
requiresReview: true,
|
|
24
|
+
autoReject: false,
|
|
25
|
+
},
|
|
26
|
+
SUSPICIOUS: {
|
|
27
|
+
level: 3,
|
|
28
|
+
description: 'Manual review required before import',
|
|
29
|
+
allowImport: false,
|
|
30
|
+
requiresReview: true,
|
|
31
|
+
autoReject: false,
|
|
32
|
+
},
|
|
33
|
+
RISKY: {
|
|
34
|
+
level: 2,
|
|
35
|
+
description: 'Can import with warnings displayed',
|
|
36
|
+
allowImport: true,
|
|
37
|
+
requiresReview: false,
|
|
38
|
+
autoReject: false,
|
|
39
|
+
},
|
|
40
|
+
LOW_QUALITY: {
|
|
41
|
+
level: 1,
|
|
42
|
+
description: 'Can import with reduced quality score',
|
|
43
|
+
allowImport: true,
|
|
44
|
+
requiresReview: false,
|
|
45
|
+
autoReject: false,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* SQL statement to create the quarantine table
|
|
50
|
+
*/
|
|
51
|
+
export const QUARANTINE_SCHEMA_SQL = `
|
|
52
|
+
-- SMI-865: Quarantine table for skill security management
|
|
53
|
+
CREATE TABLE IF NOT EXISTS quarantine (
|
|
54
|
+
id TEXT PRIMARY KEY,
|
|
55
|
+
skill_id TEXT NOT NULL,
|
|
56
|
+
source TEXT NOT NULL,
|
|
57
|
+
quarantine_reason TEXT NOT NULL,
|
|
58
|
+
severity TEXT NOT NULL CHECK(severity IN ('MALICIOUS', 'SUSPICIOUS', 'RISKY', 'LOW_QUALITY')),
|
|
59
|
+
detected_patterns TEXT DEFAULT '[]', -- JSON array of detected security patterns
|
|
60
|
+
quarantine_date TEXT NOT NULL DEFAULT (datetime('now')),
|
|
61
|
+
reviewed_by TEXT,
|
|
62
|
+
review_status TEXT NOT NULL CHECK(review_status IN ('pending', 'approved', 'rejected')) DEFAULT 'pending',
|
|
63
|
+
review_notes TEXT,
|
|
64
|
+
review_date TEXT,
|
|
65
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
66
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
-- Indexes for efficient querying
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_quarantine_skill_id ON quarantine(skill_id);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_quarantine_severity ON quarantine(severity);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_quarantine_review_status ON quarantine(review_status);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_quarantine_source ON quarantine(source);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_quarantine_date ON quarantine(quarantine_date);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_quarantine_reviewed_by ON quarantine(reviewed_by);
|
|
76
|
+
`;
|
|
77
|
+
/**
|
|
78
|
+
* Initialize the quarantine schema in the database
|
|
79
|
+
*
|
|
80
|
+
* @param db - Database connection
|
|
81
|
+
*/
|
|
82
|
+
export function initializeQuarantineSchema(db) {
|
|
83
|
+
db.exec(QUARANTINE_SCHEMA_SQL);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if the quarantine table exists
|
|
87
|
+
*
|
|
88
|
+
* @param db - Database connection
|
|
89
|
+
* @returns True if quarantine table exists
|
|
90
|
+
*/
|
|
91
|
+
export function hasQuarantineTable(db) {
|
|
92
|
+
const result = db
|
|
93
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='quarantine'")
|
|
94
|
+
.get();
|
|
95
|
+
return !!result;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Run quarantine schema migration if needed
|
|
99
|
+
*
|
|
100
|
+
* @param db - Database connection
|
|
101
|
+
* @returns True if migration was run
|
|
102
|
+
*/
|
|
103
|
+
export function migrateQuarantineSchema(db) {
|
|
104
|
+
if (!hasQuarantineTable(db)) {
|
|
105
|
+
initializeQuarantineSchema(db);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=quarantine-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quarantine-schema.js","sourceRoot":"","sources":["../../../src/db/quarantine-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,SAAS,EAAE;QACT,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,iDAAiD;QAC9D,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,IAAI;QACpB,UAAU,EAAE,KAAK;KAClB;IACD,UAAU,EAAE;QACV,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,IAAI;QACpB,UAAU,EAAE,KAAK;KAClB;IACD,KAAK,EAAE;QACL,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,oCAAoC;QACjD,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,KAAK;QACrB,UAAU,EAAE,KAAK;KAClB;IACD,WAAW,EAAE;QACX,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,uCAAuC;QACpD,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,KAAK;QACrB,UAAU,EAAE,KAAK;KAClB;CACO,CAAA;AAEV;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,EAAgB;IACzD,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAgB;IACjD,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CAAC,yEAAyE,CAAC;SAClF,GAAG,EAAE,CAAA;IACR,OAAO,CAAC,CAAC,MAAM,CAAA;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAgB;IACtD,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5B,0BAA0B,CAAC,EAAE,CAAC,CAAA;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-577: SQLite Database Schema with FTS5
|
|
3
|
+
*
|
|
4
|
+
* Implements the core database schema for Skillsmith including:
|
|
5
|
+
* - Skills table with full metadata
|
|
6
|
+
* - FTS5 virtual table for full-text search
|
|
7
|
+
* - Sources, Categories, and Cache tables
|
|
8
|
+
* - WAL mode for performance
|
|
9
|
+
* - Indexes for common query patterns
|
|
10
|
+
*/
|
|
11
|
+
import type { Database as BetterSqliteDatabase } from 'better-sqlite3';
|
|
12
|
+
export type DatabaseType = BetterSqliteDatabase;
|
|
13
|
+
export declare const SCHEMA_VERSION = 2;
|
|
14
|
+
/**
|
|
15
|
+
* SQL statements for creating the database schema
|
|
16
|
+
*/
|
|
17
|
+
export declare const SCHEMA_SQL = "\n-- Enable WAL mode for better concurrent performance\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA cache_size = -64000; -- 64MB cache\nPRAGMA temp_store = MEMORY;\n\n-- Schema version tracking\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Skills table - main storage for discovered skills\nCREATE TABLE IF NOT EXISTS skills (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n author TEXT,\n repo_url TEXT UNIQUE,\n quality_score REAL CHECK(quality_score IS NULL OR (quality_score >= 0 AND quality_score <= 1)),\n trust_tier TEXT CHECK(trust_tier IN ('verified', 'community', 'experimental', 'unknown')) DEFAULT 'unknown',\n tags TEXT DEFAULT '[]', -- JSON array of tags\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- FTS5 virtual table for full-text search with BM25 ranking\nCREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(\n name,\n description,\n tags,\n author,\n content='skills',\n content_rowid='rowid',\n tokenize='porter unicode61'\n);\n\n-- Triggers to keep FTS index in sync with skills table\nCREATE TRIGGER IF NOT EXISTS skills_ai AFTER INSERT ON skills BEGIN\n INSERT INTO skills_fts(rowid, name, description, tags, author)\n VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS skills_ad AFTER DELETE ON skills BEGIN\n INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)\n VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS skills_au AFTER UPDATE ON skills BEGIN\n INSERT INTO skills_fts(skills_fts, rowid, name, description, tags, author)\n VALUES ('delete', OLD.rowid, OLD.name, OLD.description, OLD.tags, OLD.author);\n INSERT INTO skills_fts(rowid, name, description, tags, author)\n VALUES (NEW.rowid, NEW.name, NEW.description, NEW.tags, NEW.author);\nEND;\n\n-- Sources table - tracks where skills are discovered from\nCREATE TABLE IF NOT EXISTS sources (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n type TEXT NOT NULL CHECK(type IN ('github', 'gitlab', 'local', 'registry')),\n url TEXT NOT NULL UNIQUE,\n last_sync_at TEXT,\n is_active INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Categories table - hierarchical organization of skills\nCREATE TABLE IF NOT EXISTS categories (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n description TEXT,\n parent_id TEXT REFERENCES categories(id) ON DELETE SET NULL,\n skill_count INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Skill-Category junction table\nCREATE TABLE IF NOT EXISTS skill_categories (\n skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,\n category_id TEXT NOT NULL REFERENCES categories(id) ON DELETE CASCADE,\n PRIMARY KEY (skill_id, category_id)\n);\n\n-- Cache table for search results and API responses\nCREATE TABLE IF NOT EXISTS cache (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n expires_at INTEGER, -- Unix timestamp, NULL for no expiry\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Indexes for common query patterns\nCREATE INDEX IF NOT EXISTS idx_skills_author ON skills(author);\nCREATE INDEX IF NOT EXISTS idx_skills_trust_tier ON skills(trust_tier);\nCREATE INDEX IF NOT EXISTS idx_skills_quality_score ON skills(quality_score);\nCREATE INDEX IF NOT EXISTS idx_skills_updated_at ON skills(updated_at);\nCREATE INDEX IF NOT EXISTS idx_skills_created_at ON skills(created_at);\nCREATE INDEX IF NOT EXISTS idx_sources_type ON sources(type);\nCREATE INDEX IF NOT EXISTS idx_sources_is_active ON sources(is_active);\nCREATE INDEX IF NOT EXISTS idx_categories_parent ON categories(parent_id);\nCREATE INDEX IF NOT EXISTS idx_cache_expires ON cache(expires_at);\n\n-- SMI-733: Audit logs table for security monitoring\n-- See: docs/security/index.md \u00A73 Audit Logging\nCREATE TABLE IF NOT EXISTS audit_logs (\n id TEXT PRIMARY KEY,\n event_type TEXT NOT NULL,\n timestamp TEXT NOT NULL DEFAULT (datetime('now')),\n actor TEXT,\n resource TEXT,\n action TEXT,\n result TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_audit_event_type ON audit_logs(event_type);\nCREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit_logs(timestamp);\nCREATE INDEX IF NOT EXISTS idx_audit_resource ON audit_logs(resource);\nCREATE INDEX IF NOT EXISTS idx_audit_result ON audit_logs(result);\nCREATE INDEX IF NOT EXISTS idx_audit_actor ON audit_logs(actor);\n";
|
|
18
|
+
/**
|
|
19
|
+
* Migration definitions for schema upgrades
|
|
20
|
+
*/
|
|
21
|
+
export interface Migration {
|
|
22
|
+
version: number;
|
|
23
|
+
description: string;
|
|
24
|
+
sql: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const MIGRATIONS: Migration[];
|
|
27
|
+
/**
|
|
28
|
+
* SMI-974: Migration SQL for adding FTS5 to existing database
|
|
29
|
+
* Run separately as FTS5 creation can fail if table exists
|
|
30
|
+
*/
|
|
31
|
+
export declare const FTS5_MIGRATION_SQL = "\n-- Create FTS5 virtual table if not exists\nCREATE VIRTUAL TABLE IF NOT EXISTS skills_fts USING fts5(\n name,\n description,\n tags,\n author,\n content='skills',\n content_rowid='rowid',\n tokenize='porter unicode61'\n);\n\n-- Populate FTS from existing skills (safe to run multiple times)\nINSERT OR IGNORE INTO skills_fts(rowid, name, description, tags, author)\nSELECT rowid, name, description, tags, author FROM skills;\n";
|
|
32
|
+
/**
|
|
33
|
+
* Initialize the database with the complete schema
|
|
34
|
+
*/
|
|
35
|
+
export declare function initializeSchema(db: DatabaseType): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get the current schema version from the database
|
|
38
|
+
*/
|
|
39
|
+
export declare function getSchemaVersion(db: DatabaseType): number;
|
|
40
|
+
/**
|
|
41
|
+
* Run pending migrations to upgrade the schema
|
|
42
|
+
* Handles duplicate column errors gracefully since the initial schema
|
|
43
|
+
* already includes all columns, but migrations need to support databases
|
|
44
|
+
* created by other means (e.g., Phase 5 import scripts)
|
|
45
|
+
*/
|
|
46
|
+
export declare function runMigrations(db: DatabaseType): number;
|
|
47
|
+
/**
|
|
48
|
+
* Create a new database connection with proper configuration
|
|
49
|
+
* This initializes the full schema - use openDatabase for existing databases
|
|
50
|
+
*/
|
|
51
|
+
export declare function createDatabase(path?: string): DatabaseType;
|
|
52
|
+
/**
|
|
53
|
+
* SMI-974: Open an existing database and run any pending migrations
|
|
54
|
+
* Use this for databases that may have been created by different versions
|
|
55
|
+
*/
|
|
56
|
+
export declare function openDatabase(path: string): DatabaseType;
|
|
57
|
+
/**
|
|
58
|
+
* SMI-974: Run migrations with error handling for existing columns
|
|
59
|
+
*/
|
|
60
|
+
export declare function runMigrationsSafe(db: DatabaseType): number;
|
|
61
|
+
/**
|
|
62
|
+
* Close the database connection safely
|
|
63
|
+
*/
|
|
64
|
+
export declare function closeDatabase(db: DatabaseType): void;
|
|
65
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAEtE,MAAM,MAAM,YAAY,GAAG,oBAAoB,CAAA;AAE/C,eAAO,MAAM,cAAc,IAAI,CAAA;AAE/B;;GAEG;AACH,eAAO,MAAM,UAAU,8oJA0HtB,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,eAAO,MAAM,UAAU,EAAE,SAAS,EAoBjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,wbAe9B,CAAA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAMvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CASzD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAyBtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAmB,GAAG,YAAY,CAUtE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA2BvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAqC1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAEpD"}
|