@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,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-632/SMI-677: Shared statistical utilities for benchmark calculations
|
|
3
|
+
*
|
|
4
|
+
* This module provides consistent statistical calculations across
|
|
5
|
+
* BenchmarkRunner and IndexBenchmark.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Calculate percentile value from sorted array using linear interpolation
|
|
9
|
+
*
|
|
10
|
+
* Uses the percentile rank method with linear interpolation between adjacent values.
|
|
11
|
+
* This provides more accurate percentile estimates than simple nearest-rank method.
|
|
12
|
+
*
|
|
13
|
+
* @param sorted - Sorted array of values (ascending order)
|
|
14
|
+
* @param p - Percentile to calculate (0-100)
|
|
15
|
+
* @returns The interpolated percentile value, rounded to 3 decimal places
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* percentile([1, 2, 3, 4, 5], 50) // returns 3
|
|
19
|
+
* percentile([1, 2, 3, 4, 5], 95) // returns 4.8 (interpolated)
|
|
20
|
+
*/
|
|
21
|
+
export declare function percentile(sorted: number[], p: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* Calculate mean of an array of values
|
|
24
|
+
*
|
|
25
|
+
* @param values - Array of numeric values
|
|
26
|
+
* @returns The arithmetic mean, or 0 for empty array
|
|
27
|
+
*/
|
|
28
|
+
export declare function mean(values: number[]): number;
|
|
29
|
+
/**
|
|
30
|
+
* Calculate sample standard deviation
|
|
31
|
+
*
|
|
32
|
+
* Uses Bessel's correction (n-1 denominator) for sample standard deviation,
|
|
33
|
+
* which provides an unbiased estimate of population standard deviation.
|
|
34
|
+
*
|
|
35
|
+
* @param values - Array of numeric values
|
|
36
|
+
* @returns The sample standard deviation, or 0 for arrays with less than 2 elements
|
|
37
|
+
*/
|
|
38
|
+
export declare function sampleStddev(values: number[]): number;
|
|
39
|
+
/**
|
|
40
|
+
* Calculate all common statistics from a set of latencies
|
|
41
|
+
*
|
|
42
|
+
* @param latencies - Array of latency measurements
|
|
43
|
+
* @returns Statistical summary including percentiles, mean, stddev, min, max
|
|
44
|
+
*/
|
|
45
|
+
export interface LatencyStats {
|
|
46
|
+
count: number;
|
|
47
|
+
p50: number;
|
|
48
|
+
p95: number;
|
|
49
|
+
p99: number;
|
|
50
|
+
mean: number;
|
|
51
|
+
stddev: number;
|
|
52
|
+
min: number;
|
|
53
|
+
max: number;
|
|
54
|
+
}
|
|
55
|
+
export declare function calculateLatencyStats(latencies: number[]): LatencyStats;
|
|
56
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/stats.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAG7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAOrD;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CA2BvE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-632/SMI-677: Shared statistical utilities for benchmark calculations
|
|
3
|
+
*
|
|
4
|
+
* This module provides consistent statistical calculations across
|
|
5
|
+
* BenchmarkRunner and IndexBenchmark.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Calculate percentile value from sorted array using linear interpolation
|
|
9
|
+
*
|
|
10
|
+
* Uses the percentile rank method with linear interpolation between adjacent values.
|
|
11
|
+
* This provides more accurate percentile estimates than simple nearest-rank method.
|
|
12
|
+
*
|
|
13
|
+
* @param sorted - Sorted array of values (ascending order)
|
|
14
|
+
* @param p - Percentile to calculate (0-100)
|
|
15
|
+
* @returns The interpolated percentile value, rounded to 3 decimal places
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* percentile([1, 2, 3, 4, 5], 50) // returns 3
|
|
19
|
+
* percentile([1, 2, 3, 4, 5], 95) // returns 4.8 (interpolated)
|
|
20
|
+
*/
|
|
21
|
+
export function percentile(sorted, p) {
|
|
22
|
+
if (sorted.length === 0)
|
|
23
|
+
return 0;
|
|
24
|
+
if (sorted.length === 1)
|
|
25
|
+
return sorted[0];
|
|
26
|
+
const rank = (p / 100) * (sorted.length - 1);
|
|
27
|
+
const lower = Math.floor(rank);
|
|
28
|
+
const upper = Math.ceil(rank);
|
|
29
|
+
const weight = rank - lower;
|
|
30
|
+
const value = sorted[lower] * (1 - weight) + sorted[upper] * weight;
|
|
31
|
+
return Math.round(value * 1000) / 1000;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calculate mean of an array of values
|
|
35
|
+
*
|
|
36
|
+
* @param values - Array of numeric values
|
|
37
|
+
* @returns The arithmetic mean, or 0 for empty array
|
|
38
|
+
*/
|
|
39
|
+
export function mean(values) {
|
|
40
|
+
if (values.length === 0)
|
|
41
|
+
return 0;
|
|
42
|
+
return values.reduce((sum, val) => sum + val, 0) / values.length;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Calculate sample standard deviation
|
|
46
|
+
*
|
|
47
|
+
* Uses Bessel's correction (n-1 denominator) for sample standard deviation,
|
|
48
|
+
* which provides an unbiased estimate of population standard deviation.
|
|
49
|
+
*
|
|
50
|
+
* @param values - Array of numeric values
|
|
51
|
+
* @returns The sample standard deviation, or 0 for arrays with less than 2 elements
|
|
52
|
+
*/
|
|
53
|
+
export function sampleStddev(values) {
|
|
54
|
+
if (values.length < 2)
|
|
55
|
+
return 0;
|
|
56
|
+
const avg = mean(values);
|
|
57
|
+
const variance = values.reduce((sum, val) => sum + Math.pow(val - avg, 2), 0) / (values.length - 1);
|
|
58
|
+
return Math.sqrt(variance);
|
|
59
|
+
}
|
|
60
|
+
export function calculateLatencyStats(latencies) {
|
|
61
|
+
if (latencies.length === 0) {
|
|
62
|
+
return {
|
|
63
|
+
count: 0,
|
|
64
|
+
p50: 0,
|
|
65
|
+
p95: 0,
|
|
66
|
+
p99: 0,
|
|
67
|
+
mean: 0,
|
|
68
|
+
stddev: 0,
|
|
69
|
+
min: 0,
|
|
70
|
+
max: 0,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const sorted = [...latencies].sort((a, b) => a - b);
|
|
74
|
+
const n = sorted.length;
|
|
75
|
+
return {
|
|
76
|
+
count: n,
|
|
77
|
+
p50: percentile(sorted, 50),
|
|
78
|
+
p95: percentile(sorted, 95),
|
|
79
|
+
p99: percentile(sorted, 99),
|
|
80
|
+
mean: Math.round(mean(sorted) * 1000) / 1000,
|
|
81
|
+
stddev: Math.round(sampleStddev(sorted) * 1000) / 1000,
|
|
82
|
+
min: sorted[0],
|
|
83
|
+
max: sorted[n - 1],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/benchmarks/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-644: Cache Entry Data Structure
|
|
3
|
+
* Enhanced cache entry with TTL tracking and hit count for popularity detection
|
|
4
|
+
*/
|
|
5
|
+
import type { SearchResult } from './lru.js';
|
|
6
|
+
/**
|
|
7
|
+
* TTL tiers based on query popularity
|
|
8
|
+
*/
|
|
9
|
+
export declare enum TTLTier {
|
|
10
|
+
/** Popular queries (>10 hits/hour): 4 hours */
|
|
11
|
+
POPULAR = 14400000,
|
|
12
|
+
/** Standard queries: 1 hour */
|
|
13
|
+
STANDARD = 3600000,
|
|
14
|
+
/** Rare queries (<1 hit/day): 15 minutes */
|
|
15
|
+
RARE = 900000
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Popularity thresholds for TTL determination
|
|
19
|
+
*/
|
|
20
|
+
export declare const POPULARITY_THRESHOLDS: {
|
|
21
|
+
/** Hits per hour to be considered "popular" */
|
|
22
|
+
readonly POPULAR_HITS_PER_HOUR: 10;
|
|
23
|
+
/** Minimum age (ms) before evaluating popularity */
|
|
24
|
+
readonly MIN_AGE_FOR_EVALUATION: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Enhanced cache entry with TTL and popularity tracking
|
|
28
|
+
*/
|
|
29
|
+
export interface CacheEntry<T = SearchResult[]> {
|
|
30
|
+
/** Unique cache key */
|
|
31
|
+
key: string;
|
|
32
|
+
/** Cached data */
|
|
33
|
+
data: T;
|
|
34
|
+
/** Total count for search results */
|
|
35
|
+
totalCount: number;
|
|
36
|
+
/** Creation timestamp (ms) */
|
|
37
|
+
createdAt: number;
|
|
38
|
+
/** Expiration timestamp (ms) */
|
|
39
|
+
expiresAt: number;
|
|
40
|
+
/** Number of cache hits */
|
|
41
|
+
hitCount: number;
|
|
42
|
+
/** Last access timestamp (ms) */
|
|
43
|
+
lastAccessedAt: number;
|
|
44
|
+
/** Current TTL tier */
|
|
45
|
+
ttlTier: TTLTier;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Serialized format for persistent storage
|
|
49
|
+
*/
|
|
50
|
+
export interface SerializedCacheEntry {
|
|
51
|
+
key: string;
|
|
52
|
+
data_json: string;
|
|
53
|
+
total_count: number;
|
|
54
|
+
created_at: number;
|
|
55
|
+
expires_at: number;
|
|
56
|
+
hit_count: number;
|
|
57
|
+
last_accessed_at: number;
|
|
58
|
+
ttl_tier: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create a new cache entry with default TTL
|
|
62
|
+
*/
|
|
63
|
+
export declare function createCacheEntry<T = SearchResult[]>(key: string, data: T, totalCount: number, ttlTier?: TTLTier): CacheEntry<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Record a hit on a cache entry
|
|
66
|
+
* Returns updated entry (immutable pattern)
|
|
67
|
+
*/
|
|
68
|
+
export declare function recordHit<T>(entry: CacheEntry<T>): CacheEntry<T>;
|
|
69
|
+
/**
|
|
70
|
+
* Calculate TTL tier based on hit rate
|
|
71
|
+
*/
|
|
72
|
+
export declare function calculateTTLTier(createdAt: number, hitCount: number, now?: number): TTLTier;
|
|
73
|
+
/**
|
|
74
|
+
* Check if cache entry is expired
|
|
75
|
+
*/
|
|
76
|
+
export declare function isExpired<T>(entry: CacheEntry<T>, now?: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Check if entry should be refreshed (approaching expiration)
|
|
79
|
+
* Returns true if within 10% of TTL remaining
|
|
80
|
+
*/
|
|
81
|
+
export declare function shouldRefresh<T>(entry: CacheEntry<T>, now?: number): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Validate cache key for security (standards.md §4)
|
|
84
|
+
* Prevents injection attacks through cache keys
|
|
85
|
+
*/
|
|
86
|
+
export declare function isValidCacheKey(key: string): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Serialize cache entry for persistence
|
|
89
|
+
* Uses safe JSON serialization to prevent prototype pollution
|
|
90
|
+
*/
|
|
91
|
+
export declare function serializeCacheEntry<T>(entry: CacheEntry<T>): SerializedCacheEntry;
|
|
92
|
+
/**
|
|
93
|
+
* Deserialize cache entry from persistence
|
|
94
|
+
* Validates data to prevent prototype pollution (security: standards.md §4)
|
|
95
|
+
*/
|
|
96
|
+
export declare function deserializeCacheEntry<T = SearchResult[]>(serialized: SerializedCacheEntry): CacheEntry<T>;
|
|
97
|
+
/**
|
|
98
|
+
* Get human-readable TTL tier name
|
|
99
|
+
*/
|
|
100
|
+
export declare function getTTLTierName(tier: TTLTier): string;
|
|
101
|
+
//# sourceMappingURL=CacheEntry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheEntry.d.ts","sourceRoot":"","sources":["../../../src/cache/CacheEntry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C;;GAEG;AACH,oBAAY,OAAO;IACjB,+CAA+C;IAC/C,OAAO,WAAqB;IAC5B,+BAA+B;IAC/B,QAAQ,UAAiB;IACzB,4CAA4C;IAC5C,IAAI,SAAiB;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB;IAChC,+CAA+C;;IAE/C,oDAAoD;;CAE5C,CAAA;AAEV;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,YAAY,EAAE;IAC5C,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,kBAAkB;IAClB,IAAI,EAAE,CAAC,CAAA;IACP,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,YAAY,EAAE,EACjD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAA0B,GAClC,UAAU,CAAC,CAAC,CAAC,CAiBf;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAiBhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAuBT;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAEpF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAIxF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAkBpD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAWjF;AA8CD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,YAAY,EAAE,EACtD,UAAU,EAAE,oBAAoB,GAC/B,UAAU,CAAC,CAAC,CAAC,CA+Cf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAWpD"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-644: Cache Entry Data Structure
|
|
3
|
+
* Enhanced cache entry with TTL tracking and hit count for popularity detection
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* TTL tiers based on query popularity
|
|
7
|
+
*/
|
|
8
|
+
export var TTLTier;
|
|
9
|
+
(function (TTLTier) {
|
|
10
|
+
/** Popular queries (>10 hits/hour): 4 hours */
|
|
11
|
+
TTLTier[TTLTier["POPULAR"] = 14400000] = "POPULAR";
|
|
12
|
+
/** Standard queries: 1 hour */
|
|
13
|
+
TTLTier[TTLTier["STANDARD"] = 3600000] = "STANDARD";
|
|
14
|
+
/** Rare queries (<1 hit/day): 15 minutes */
|
|
15
|
+
TTLTier[TTLTier["RARE"] = 900000] = "RARE";
|
|
16
|
+
})(TTLTier || (TTLTier = {}));
|
|
17
|
+
/**
|
|
18
|
+
* Popularity thresholds for TTL determination
|
|
19
|
+
*/
|
|
20
|
+
export const POPULARITY_THRESHOLDS = {
|
|
21
|
+
/** Hits per hour to be considered "popular" */
|
|
22
|
+
POPULAR_HITS_PER_HOUR: 10,
|
|
23
|
+
/** Minimum age (ms) before evaluating popularity */
|
|
24
|
+
MIN_AGE_FOR_EVALUATION: 60 * 1000, // 1 minute
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Create a new cache entry with default TTL
|
|
28
|
+
*/
|
|
29
|
+
export function createCacheEntry(key, data, totalCount, ttlTier = TTLTier.STANDARD) {
|
|
30
|
+
// Validate key to prevent injection (security: standards.md §4)
|
|
31
|
+
if (!isValidCacheKey(key)) {
|
|
32
|
+
throw new Error('Invalid cache key: contains disallowed characters');
|
|
33
|
+
}
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
return {
|
|
36
|
+
key,
|
|
37
|
+
data,
|
|
38
|
+
totalCount,
|
|
39
|
+
createdAt: now,
|
|
40
|
+
expiresAt: now + ttlTier,
|
|
41
|
+
hitCount: 0,
|
|
42
|
+
lastAccessedAt: now,
|
|
43
|
+
ttlTier,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Record a hit on a cache entry
|
|
48
|
+
* Returns updated entry (immutable pattern)
|
|
49
|
+
*/
|
|
50
|
+
export function recordHit(entry) {
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
const newHitCount = entry.hitCount + 1;
|
|
53
|
+
// Calculate new TTL tier based on popularity
|
|
54
|
+
const newTier = calculateTTLTier(entry.createdAt, newHitCount, now);
|
|
55
|
+
// If tier upgraded, extend expiration
|
|
56
|
+
const newExpiresAt = newTier > entry.ttlTier ? now + newTier : entry.expiresAt;
|
|
57
|
+
return {
|
|
58
|
+
...entry,
|
|
59
|
+
hitCount: newHitCount,
|
|
60
|
+
lastAccessedAt: now,
|
|
61
|
+
ttlTier: newTier,
|
|
62
|
+
expiresAt: newExpiresAt,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Calculate TTL tier based on hit rate
|
|
67
|
+
*/
|
|
68
|
+
export function calculateTTLTier(createdAt, hitCount, now = Date.now()) {
|
|
69
|
+
const ageMs = now - createdAt;
|
|
70
|
+
// Need minimum age to evaluate popularity
|
|
71
|
+
if (ageMs < POPULARITY_THRESHOLDS.MIN_AGE_FOR_EVALUATION) {
|
|
72
|
+
return TTLTier.STANDARD;
|
|
73
|
+
}
|
|
74
|
+
// Calculate hits per hour
|
|
75
|
+
const ageHours = ageMs / (60 * 60 * 1000);
|
|
76
|
+
const hitsPerHour = hitCount / Math.max(ageHours, 1 / 60); // Min 1 minute
|
|
77
|
+
if (hitsPerHour >= POPULARITY_THRESHOLDS.POPULAR_HITS_PER_HOUR) {
|
|
78
|
+
return TTLTier.POPULAR;
|
|
79
|
+
}
|
|
80
|
+
// Check for rare: less than 1 hit per day equivalent
|
|
81
|
+
const hitsPerDay = hitsPerHour * 24;
|
|
82
|
+
if (hitsPerDay < 1 && ageHours >= 1) {
|
|
83
|
+
return TTLTier.RARE;
|
|
84
|
+
}
|
|
85
|
+
return TTLTier.STANDARD;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if cache entry is expired
|
|
89
|
+
*/
|
|
90
|
+
export function isExpired(entry, now = Date.now()) {
|
|
91
|
+
return now >= entry.expiresAt;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if entry should be refreshed (approaching expiration)
|
|
95
|
+
* Returns true if within 10% of TTL remaining
|
|
96
|
+
*/
|
|
97
|
+
export function shouldRefresh(entry, now = Date.now()) {
|
|
98
|
+
const ttl = entry.expiresAt - entry.createdAt;
|
|
99
|
+
const remaining = entry.expiresAt - now;
|
|
100
|
+
return remaining > 0 && remaining < ttl * 0.1;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Validate cache key for security (standards.md §4)
|
|
104
|
+
* Prevents injection attacks through cache keys
|
|
105
|
+
*/
|
|
106
|
+
export function isValidCacheKey(key) {
|
|
107
|
+
// Max key length
|
|
108
|
+
if (key.length > 1024) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
// Must be non-empty string
|
|
112
|
+
if (!key || typeof key !== 'string') {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
// Block null bytes and control characters
|
|
116
|
+
// eslint-disable-next-line no-control-regex
|
|
117
|
+
if (/[\x00-\x1f\x7f]/.test(key)) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Serialize cache entry for persistence
|
|
124
|
+
* Uses safe JSON serialization to prevent prototype pollution
|
|
125
|
+
*/
|
|
126
|
+
export function serializeCacheEntry(entry) {
|
|
127
|
+
return {
|
|
128
|
+
key: entry.key,
|
|
129
|
+
data_json: JSON.stringify(entry.data),
|
|
130
|
+
total_count: entry.totalCount,
|
|
131
|
+
created_at: entry.createdAt,
|
|
132
|
+
expires_at: entry.expiresAt,
|
|
133
|
+
hit_count: entry.hitCount,
|
|
134
|
+
last_accessed_at: entry.lastAccessedAt,
|
|
135
|
+
ttl_tier: entry.ttlTier,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** Pattern to detect prototype pollution attempts (standards.md §4.4) */
|
|
139
|
+
const PROTOTYPE_POLLUTION_PATTERN = /"(__proto__|prototype|constructor)"\s*:/i;
|
|
140
|
+
/**
|
|
141
|
+
* SMI-684: Recursively check for dangerous keys in parsed objects
|
|
142
|
+
* Prevents prototype pollution bypass via unicode escapes (e.g., \u005f\u005fproto\u005f\u005f)
|
|
143
|
+
* which are decoded by JSON.parse before we can detect them with regex
|
|
144
|
+
*/
|
|
145
|
+
function hasDangerousKeys(obj, depth = 0) {
|
|
146
|
+
// Prevent stack overflow on deeply nested objects
|
|
147
|
+
if (depth > 100)
|
|
148
|
+
return false;
|
|
149
|
+
// Handle null, primitives
|
|
150
|
+
if (typeof obj !== 'object' || obj === null)
|
|
151
|
+
return false;
|
|
152
|
+
// Handle arrays - check each element
|
|
153
|
+
if (Array.isArray(obj)) {
|
|
154
|
+
for (const item of obj) {
|
|
155
|
+
if (hasDangerousKeys(item, depth + 1)) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
// Handle objects - check keys and recurse into values
|
|
162
|
+
const keys = Object.keys(obj);
|
|
163
|
+
for (const key of keys) {
|
|
164
|
+
// Check for dangerous keys
|
|
165
|
+
if (key === '__proto__' || key === 'prototype' || key === 'constructor') {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
// Recursively check nested objects
|
|
169
|
+
if (hasDangerousKeys(obj[key], depth + 1)) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
/** Valid TTL tier values */
|
|
176
|
+
const VALID_TTL_TIERS = new Set([TTLTier.POPULAR, TTLTier.STANDARD, TTLTier.RARE]);
|
|
177
|
+
/**
|
|
178
|
+
* Deserialize cache entry from persistence
|
|
179
|
+
* Validates data to prevent prototype pollution (security: standards.md §4)
|
|
180
|
+
*/
|
|
181
|
+
export function deserializeCacheEntry(serialized) {
|
|
182
|
+
// Check for prototype pollution before parsing (standards.md §4.4)
|
|
183
|
+
// This catches simple cases like {"__proto__": {}}
|
|
184
|
+
if (PROTOTYPE_POLLUTION_PATTERN.test(serialized.data_json)) {
|
|
185
|
+
throw new Error('Prototype pollution attempt detected in cache data');
|
|
186
|
+
}
|
|
187
|
+
// Parse JSON safely
|
|
188
|
+
let data;
|
|
189
|
+
try {
|
|
190
|
+
data = JSON.parse(serialized.data_json);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
throw new Error('Failed to deserialize cache entry data');
|
|
194
|
+
}
|
|
195
|
+
// SMI-684: Post-parse validation to catch unicode escape bypasses
|
|
196
|
+
// e.g., {"\\u005f\\u005fproto\\u005f\\u005f": {}} becomes {"__proto__": {}} after parse
|
|
197
|
+
if (hasDangerousKeys(data)) {
|
|
198
|
+
throw new Error('Prototype pollution attempt detected in cache data');
|
|
199
|
+
}
|
|
200
|
+
// Validate all numeric fields
|
|
201
|
+
if (typeof serialized.created_at !== 'number' ||
|
|
202
|
+
typeof serialized.expires_at !== 'number' ||
|
|
203
|
+
typeof serialized.hit_count !== 'number' ||
|
|
204
|
+
typeof serialized.last_accessed_at !== 'number' ||
|
|
205
|
+
typeof serialized.total_count !== 'number') {
|
|
206
|
+
throw new Error('Invalid cache entry: numeric fields must be numbers');
|
|
207
|
+
}
|
|
208
|
+
// Validate TTL tier is a known value
|
|
209
|
+
if (!VALID_TTL_TIERS.has(serialized.ttl_tier)) {
|
|
210
|
+
throw new Error('Invalid cache entry: unknown TTL tier');
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
key: serialized.key,
|
|
214
|
+
data,
|
|
215
|
+
totalCount: serialized.total_count,
|
|
216
|
+
createdAt: serialized.created_at,
|
|
217
|
+
expiresAt: serialized.expires_at,
|
|
218
|
+
hitCount: serialized.hit_count,
|
|
219
|
+
lastAccessedAt: serialized.last_accessed_at,
|
|
220
|
+
ttlTier: serialized.ttl_tier,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get human-readable TTL tier name
|
|
225
|
+
*/
|
|
226
|
+
export function getTTLTierName(tier) {
|
|
227
|
+
switch (tier) {
|
|
228
|
+
case TTLTier.POPULAR:
|
|
229
|
+
return 'popular';
|
|
230
|
+
case TTLTier.STANDARD:
|
|
231
|
+
return 'standard';
|
|
232
|
+
case TTLTier.RARE:
|
|
233
|
+
return 'rare';
|
|
234
|
+
default:
|
|
235
|
+
return 'unknown';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=CacheEntry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheEntry.js","sourceRoot":"","sources":["../../../src/cache/CacheEntry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-644: Unified Cache Manager
|
|
3
|
+
* Provides high-level cache operations with:
|
|
4
|
+
* - Popular query detection (dynamic TTL)
|
|
5
|
+
* - Background refresh for hot entries
|
|
6
|
+
* - Cache invalidation coordination
|
|
7
|
+
* - Statistics and monitoring
|
|
8
|
+
*/
|
|
9
|
+
import type { SearchResult } from './lru.js';
|
|
10
|
+
import { TTLTier, POPULARITY_THRESHOLDS, getTTLTierName } from './CacheEntry.js';
|
|
11
|
+
import { type TieredCacheConfig, type TieredCacheStats } from './TieredCache.js';
|
|
12
|
+
/**
|
|
13
|
+
* Search options for cache key generation
|
|
14
|
+
*/
|
|
15
|
+
export interface SearchOptions {
|
|
16
|
+
query: string;
|
|
17
|
+
filters?: Record<string, unknown>;
|
|
18
|
+
limit?: number;
|
|
19
|
+
offset?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Refresh callback type
|
|
23
|
+
*/
|
|
24
|
+
export type RefreshCallback = (options: SearchOptions) => Promise<{
|
|
25
|
+
results: SearchResult[];
|
|
26
|
+
totalCount: number;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Cache manager configuration
|
|
30
|
+
*/
|
|
31
|
+
export interface CacheManagerConfig extends TieredCacheConfig {
|
|
32
|
+
/** Enable background refresh for hot entries (default: true) */
|
|
33
|
+
enableBackgroundRefresh?: boolean;
|
|
34
|
+
/** Background refresh interval in ms (default: 30 seconds) */
|
|
35
|
+
refreshIntervalMs?: number;
|
|
36
|
+
/** Maximum concurrent refreshes (default: 3) */
|
|
37
|
+
maxConcurrentRefreshes?: number;
|
|
38
|
+
/** Callback to refresh cache entries */
|
|
39
|
+
refreshCallback?: RefreshCallback;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Unified Cache Manager
|
|
43
|
+
* Coordinates L1/L2 caching with intelligent TTL management
|
|
44
|
+
*/
|
|
45
|
+
export declare class CacheManager {
|
|
46
|
+
private cache;
|
|
47
|
+
private readonly config;
|
|
48
|
+
private queryFrequencies;
|
|
49
|
+
private refreshTimer;
|
|
50
|
+
/** SMI-683: Use Map<key, Promise> for proper deduplication of concurrent refreshes */
|
|
51
|
+
private activeRefreshes;
|
|
52
|
+
private refreshCallback;
|
|
53
|
+
private lastInvalidation;
|
|
54
|
+
private invalidationCallbacks;
|
|
55
|
+
constructor(config?: CacheManagerConfig);
|
|
56
|
+
/**
|
|
57
|
+
* Generate cache key from search options
|
|
58
|
+
*/
|
|
59
|
+
static generateKey(options: SearchOptions): string;
|
|
60
|
+
/**
|
|
61
|
+
* Parse search options from cache key
|
|
62
|
+
* SMI-683: Fixed regex to handle empty filters (was: .+? requires at least 1 char)
|
|
63
|
+
*/
|
|
64
|
+
static parseKey(key: string): SearchOptions | null;
|
|
65
|
+
/**
|
|
66
|
+
* Get cached results for search options
|
|
67
|
+
*/
|
|
68
|
+
get(options: SearchOptions): {
|
|
69
|
+
results: SearchResult[];
|
|
70
|
+
totalCount: number;
|
|
71
|
+
} | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Get or compute cached results
|
|
74
|
+
* @param options Search options
|
|
75
|
+
* @param compute Function to compute results if not cached
|
|
76
|
+
*/
|
|
77
|
+
getOrCompute(options: SearchOptions, compute: () => Promise<{
|
|
78
|
+
results: SearchResult[];
|
|
79
|
+
totalCount: number;
|
|
80
|
+
}>): Promise<{
|
|
81
|
+
results: SearchResult[];
|
|
82
|
+
totalCount: number;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Store results in cache with automatic TTL detection
|
|
86
|
+
*/
|
|
87
|
+
set(options: SearchOptions, results: SearchResult[], totalCount: number): void;
|
|
88
|
+
/**
|
|
89
|
+
* Check if results are cached
|
|
90
|
+
*/
|
|
91
|
+
has(options: SearchOptions): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Delete specific cached result
|
|
94
|
+
*/
|
|
95
|
+
delete(options: SearchOptions): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Invalidate all cached results
|
|
98
|
+
* Should be called when the skill index is updated
|
|
99
|
+
*/
|
|
100
|
+
invalidateAll(): void;
|
|
101
|
+
/**
|
|
102
|
+
* Register callback for invalidation events
|
|
103
|
+
*/
|
|
104
|
+
onInvalidate(callback: () => void): () => void;
|
|
105
|
+
/**
|
|
106
|
+
* Get time since last invalidation
|
|
107
|
+
*/
|
|
108
|
+
getTimeSinceInvalidation(): number;
|
|
109
|
+
/**
|
|
110
|
+
* Prune expired entries
|
|
111
|
+
*/
|
|
112
|
+
prune(): number;
|
|
113
|
+
/**
|
|
114
|
+
* Get comprehensive cache statistics
|
|
115
|
+
*/
|
|
116
|
+
getStats(): TieredCacheStats & {
|
|
117
|
+
queryFrequencies: {
|
|
118
|
+
popular: number;
|
|
119
|
+
standard: number;
|
|
120
|
+
rare: number;
|
|
121
|
+
};
|
|
122
|
+
backgroundRefresh: {
|
|
123
|
+
active: number;
|
|
124
|
+
lastRun: number;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Get detailed hit rate by TTL tier
|
|
129
|
+
*/
|
|
130
|
+
getHitRateByTier(): Record<string, number>;
|
|
131
|
+
/**
|
|
132
|
+
* Set the refresh callback for background refresh
|
|
133
|
+
*/
|
|
134
|
+
setRefreshCallback(callback: RefreshCallback): void;
|
|
135
|
+
/**
|
|
136
|
+
* Close cache manager and cleanup resources
|
|
137
|
+
*/
|
|
138
|
+
close(): void;
|
|
139
|
+
/**
|
|
140
|
+
* Record a hit for query frequency tracking
|
|
141
|
+
*/
|
|
142
|
+
private recordQueryHit;
|
|
143
|
+
/**
|
|
144
|
+
* Determine TTL tier based on query frequency
|
|
145
|
+
*/
|
|
146
|
+
private determineTTLTier;
|
|
147
|
+
/**
|
|
148
|
+
* Prune old query frequency entries
|
|
149
|
+
*/
|
|
150
|
+
private pruneQueryFrequencies;
|
|
151
|
+
/**
|
|
152
|
+
* Start background refresh loop
|
|
153
|
+
*/
|
|
154
|
+
private startBackgroundRefresh;
|
|
155
|
+
/**
|
|
156
|
+
* Perform background refresh for entries approaching expiration
|
|
157
|
+
*/
|
|
158
|
+
private performBackgroundRefresh;
|
|
159
|
+
/**
|
|
160
|
+
* Refresh a single cache entry
|
|
161
|
+
* SMI-683: Fixed race condition by using Map<string, Promise<void>> for proper deduplication.
|
|
162
|
+
* Concurrent calls for the same key now return the same promise instance.
|
|
163
|
+
*/
|
|
164
|
+
private refreshEntry;
|
|
165
|
+
}
|
|
166
|
+
export { TTLTier, getTTLTierName, POPULARITY_THRESHOLDS };
|
|
167
|
+
//# sourceMappingURL=CacheManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../../../src/cache/CacheManager.ts"],"names":[],"mappings":"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"}
|