@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,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger Utility with Audit Support (SMI-728)
|
|
3
|
+
*
|
|
4
|
+
* Enhanced logger with structured logging, audit trails, and security events.
|
|
5
|
+
* Provides environment-aware logging with different verbosity levels and
|
|
6
|
+
* support for audit event tracking.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Log severity levels
|
|
10
|
+
*/
|
|
11
|
+
export var LogLevel;
|
|
12
|
+
(function (LogLevel) {
|
|
13
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
14
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
15
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
16
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
17
|
+
LogLevel[LogLevel["AUDIT"] = 4] = "AUDIT";
|
|
18
|
+
LogLevel[LogLevel["SECURITY"] = 5] = "SECURITY";
|
|
19
|
+
})(LogLevel || (LogLevel = {}));
|
|
20
|
+
/**
|
|
21
|
+
* In-memory log aggregator
|
|
22
|
+
*/
|
|
23
|
+
class MemoryLogAggregator {
|
|
24
|
+
logs = [];
|
|
25
|
+
auditEvents = [];
|
|
26
|
+
securityEvents = [];
|
|
27
|
+
maxSize;
|
|
28
|
+
constructor(maxSize = 10000) {
|
|
29
|
+
this.maxSize = maxSize;
|
|
30
|
+
}
|
|
31
|
+
add(entry) {
|
|
32
|
+
this.logs.push(entry);
|
|
33
|
+
if (this.logs.length > this.maxSize) {
|
|
34
|
+
this.logs.shift();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
addAudit(event) {
|
|
38
|
+
this.auditEvents.push(event);
|
|
39
|
+
if (this.auditEvents.length > this.maxSize) {
|
|
40
|
+
this.auditEvents.shift();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
addSecurity(event) {
|
|
44
|
+
this.securityEvents.push(event);
|
|
45
|
+
if (this.securityEvents.length > this.maxSize) {
|
|
46
|
+
this.securityEvents.shift();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async flush() {
|
|
50
|
+
// Future: Persist to database
|
|
51
|
+
// For now, this is a no-op
|
|
52
|
+
}
|
|
53
|
+
getLogs() {
|
|
54
|
+
return [...this.logs];
|
|
55
|
+
}
|
|
56
|
+
getAuditEvents() {
|
|
57
|
+
return [...this.auditEvents];
|
|
58
|
+
}
|
|
59
|
+
getSecurityEvents() {
|
|
60
|
+
return [...this.securityEvents];
|
|
61
|
+
}
|
|
62
|
+
clear() {
|
|
63
|
+
this.logs = [];
|
|
64
|
+
this.auditEvents = [];
|
|
65
|
+
this.securityEvents = [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Global log aggregator instance
|
|
70
|
+
*/
|
|
71
|
+
let globalAggregator = new MemoryLogAggregator();
|
|
72
|
+
/**
|
|
73
|
+
* Set the global log aggregator
|
|
74
|
+
*/
|
|
75
|
+
export function setLogAggregator(aggregator) {
|
|
76
|
+
globalAggregator = aggregator;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the global log aggregator
|
|
80
|
+
*/
|
|
81
|
+
export function getLogAggregator() {
|
|
82
|
+
return globalAggregator;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Format log entry for output
|
|
86
|
+
*/
|
|
87
|
+
function formatLogEntry(entry, useJson) {
|
|
88
|
+
if (useJson) {
|
|
89
|
+
return JSON.stringify({
|
|
90
|
+
level: LogLevel[entry.level],
|
|
91
|
+
timestamp: entry.timestamp,
|
|
92
|
+
namespace: entry.namespace,
|
|
93
|
+
message: entry.message,
|
|
94
|
+
context: entry.context,
|
|
95
|
+
error: entry.error
|
|
96
|
+
? {
|
|
97
|
+
message: entry.error.message,
|
|
98
|
+
stack: entry.error.stack,
|
|
99
|
+
}
|
|
100
|
+
: undefined,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const prefix = entry.namespace ? `[skillsmith:${entry.namespace}]` : '[skillsmith]';
|
|
104
|
+
const contextStr = entry.context ? ` ${JSON.stringify(entry.context)}` : '';
|
|
105
|
+
return `${prefix} ${entry.message}${contextStr}`;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Format audit event for output
|
|
109
|
+
*/
|
|
110
|
+
function formatAuditEvent(event, useJson) {
|
|
111
|
+
if (useJson) {
|
|
112
|
+
return JSON.stringify(event);
|
|
113
|
+
}
|
|
114
|
+
const metaStr = event.metadata ? ` ${JSON.stringify(event.metadata)}` : '';
|
|
115
|
+
return `[AUDIT] ${event.eventType} | ${event.actor} -> ${event.action} on ${event.resource} = ${event.result}${metaStr}`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Format security event for output
|
|
119
|
+
*/
|
|
120
|
+
function formatSecurityEvent(event, useJson) {
|
|
121
|
+
if (useJson) {
|
|
122
|
+
return JSON.stringify(event);
|
|
123
|
+
}
|
|
124
|
+
const metaStr = event.metadata ? ` ${JSON.stringify(event.metadata)}` : '';
|
|
125
|
+
return `[SECURITY:${event.severity.toUpperCase()}] ${event.eventType} | ${event.action} on ${event.resource} - ${event.details}${metaStr}`;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Create a logger instance
|
|
129
|
+
*/
|
|
130
|
+
function createLoggerInstance(namespace) {
|
|
131
|
+
const useJson = process.env.LOG_FORMAT === 'json';
|
|
132
|
+
const minLevel = process.env.LOG_LEVEL ? parseInt(process.env.LOG_LEVEL, 10) : LogLevel.WARN;
|
|
133
|
+
const shouldLog = (level) => {
|
|
134
|
+
// In test mode, suppress WARN to keep test output clean
|
|
135
|
+
// (but don't suppress INFO/DEBUG if DEBUG is enabled, or ERROR which is always shown)
|
|
136
|
+
if (process.env.NODE_ENV === 'test' && level === LogLevel.WARN) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
// DEBUG flag enables info and debug output
|
|
140
|
+
if (level === LogLevel.DEBUG || level === LogLevel.INFO) {
|
|
141
|
+
return !!process.env.DEBUG;
|
|
142
|
+
}
|
|
143
|
+
return level >= minLevel;
|
|
144
|
+
};
|
|
145
|
+
const createLogEntry = (level, message, context, error) => ({
|
|
146
|
+
level,
|
|
147
|
+
timestamp: new Date().toISOString(),
|
|
148
|
+
namespace,
|
|
149
|
+
message,
|
|
150
|
+
context,
|
|
151
|
+
error,
|
|
152
|
+
});
|
|
153
|
+
return {
|
|
154
|
+
warn: (message, context) => {
|
|
155
|
+
const entry = createLogEntry(LogLevel.WARN, message, context);
|
|
156
|
+
if (shouldLog(LogLevel.WARN)) {
|
|
157
|
+
console.warn(formatLogEntry(entry, useJson));
|
|
158
|
+
}
|
|
159
|
+
globalAggregator.add(entry);
|
|
160
|
+
},
|
|
161
|
+
error: (message, error, context) => {
|
|
162
|
+
const entry = createLogEntry(LogLevel.ERROR, message, context, error);
|
|
163
|
+
if (shouldLog(LogLevel.ERROR)) {
|
|
164
|
+
console.error(formatLogEntry(entry, useJson));
|
|
165
|
+
if (error && !useJson) {
|
|
166
|
+
console.error(error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
globalAggregator.add(entry);
|
|
170
|
+
},
|
|
171
|
+
info: (message, context) => {
|
|
172
|
+
const entry = createLogEntry(LogLevel.INFO, message, context);
|
|
173
|
+
if (shouldLog(LogLevel.INFO)) {
|
|
174
|
+
console.info(formatLogEntry(entry, useJson));
|
|
175
|
+
}
|
|
176
|
+
globalAggregator.add(entry);
|
|
177
|
+
},
|
|
178
|
+
debug: (message, context) => {
|
|
179
|
+
const entry = createLogEntry(LogLevel.DEBUG, message, context);
|
|
180
|
+
if (shouldLog(LogLevel.DEBUG)) {
|
|
181
|
+
console.debug(formatLogEntry(entry, useJson));
|
|
182
|
+
}
|
|
183
|
+
globalAggregator.add(entry);
|
|
184
|
+
},
|
|
185
|
+
auditLog: (event) => {
|
|
186
|
+
const entry = createLogEntry(LogLevel.AUDIT, formatAuditEvent(event, false));
|
|
187
|
+
if (shouldLog(LogLevel.AUDIT) || process.env.AUDIT_LOG === 'true') {
|
|
188
|
+
console.log(formatAuditEvent(event, useJson));
|
|
189
|
+
}
|
|
190
|
+
globalAggregator.add(entry);
|
|
191
|
+
globalAggregator.addAudit(event);
|
|
192
|
+
},
|
|
193
|
+
securityLog: (event) => {
|
|
194
|
+
const entry = createLogEntry(LogLevel.SECURITY, formatSecurityEvent(event, false));
|
|
195
|
+
// Security events always log unless in test mode
|
|
196
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
197
|
+
console.warn(formatSecurityEvent(event, useJson));
|
|
198
|
+
}
|
|
199
|
+
globalAggregator.add(entry);
|
|
200
|
+
globalAggregator.addSecurity(event);
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Default logger instance
|
|
206
|
+
*
|
|
207
|
+
* Environment variables:
|
|
208
|
+
* - NODE_ENV=test: Suppress warn/info/debug output
|
|
209
|
+
* - DEBUG=true: Enable info and debug output
|
|
210
|
+
* - LOG_FORMAT=json: Output logs in JSON format
|
|
211
|
+
* - LOG_LEVEL=0-5: Minimum log level to output
|
|
212
|
+
* - AUDIT_LOG=true: Enable audit log output
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* logger.info('Processing skill', { skillId: 'foo' })
|
|
217
|
+
* logger.error('Failed to fetch', new Error('Network error'))
|
|
218
|
+
* logger.auditLog({
|
|
219
|
+
* eventType: 'skill.install',
|
|
220
|
+
* timestamp: new Date().toISOString(),
|
|
221
|
+
* actor: 'user',
|
|
222
|
+
* resource: 'skill-id',
|
|
223
|
+
* action: 'install',
|
|
224
|
+
* result: 'success'
|
|
225
|
+
* })
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
export const logger = createLoggerInstance();
|
|
229
|
+
/**
|
|
230
|
+
* Create a namespaced logger
|
|
231
|
+
*
|
|
232
|
+
* @param namespace - The namespace prefix for log messages
|
|
233
|
+
* @returns A Logger instance with namespaced messages
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```typescript
|
|
237
|
+
* const log = createLogger('GitLabAdapter')
|
|
238
|
+
* log.warn('Rate limit exceeded', { remaining: 0 })
|
|
239
|
+
* log.auditLog({
|
|
240
|
+
* eventType: 'adapter.request',
|
|
241
|
+
* timestamp: new Date().toISOString(),
|
|
242
|
+
* actor: 'GitLabAdapter',
|
|
243
|
+
* resource: 'https://gitlab.com/api/v4/projects',
|
|
244
|
+
* action: 'fetch',
|
|
245
|
+
* result: 'success'
|
|
246
|
+
* })
|
|
247
|
+
* ```
|
|
248
|
+
*/
|
|
249
|
+
export function createLogger(namespace) {
|
|
250
|
+
return createLoggerInstance(namespace);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* No-op logger for testing or silent operation
|
|
254
|
+
*/
|
|
255
|
+
export const silentLogger = {
|
|
256
|
+
warn: () => { },
|
|
257
|
+
error: () => { },
|
|
258
|
+
info: () => { },
|
|
259
|
+
debug: () => { },
|
|
260
|
+
auditLog: () => { },
|
|
261
|
+
securityLog: () => { },
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* Helper to create audit events with current timestamp
|
|
265
|
+
*/
|
|
266
|
+
export function createAuditEvent(eventType, actor, resource, action, result, metadata) {
|
|
267
|
+
return {
|
|
268
|
+
eventType,
|
|
269
|
+
timestamp: new Date().toISOString(),
|
|
270
|
+
actor,
|
|
271
|
+
resource,
|
|
272
|
+
action,
|
|
273
|
+
result,
|
|
274
|
+
metadata,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Helper to create security events with current timestamp
|
|
279
|
+
*/
|
|
280
|
+
export function createSecurityEvent(eventType, severity, resource, action, details, metadata) {
|
|
281
|
+
return {
|
|
282
|
+
eventType,
|
|
283
|
+
timestamp: new Date().toISOString(),
|
|
284
|
+
severity,
|
|
285
|
+
resource,
|
|
286
|
+
action,
|
|
287
|
+
details,
|
|
288
|
+
metadata,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Utility - SMI-880
|
|
3
|
+
*
|
|
4
|
+
* Exponential backoff retry logic for transient network failures.
|
|
5
|
+
* Handles ETIMEDOUT, ECONNRESET, and 5xx HTTP errors.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for retry behavior
|
|
9
|
+
*/
|
|
10
|
+
export interface RetryConfig {
|
|
11
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
12
|
+
maxRetries?: number;
|
|
13
|
+
/** Initial delay in milliseconds (default: 1000) */
|
|
14
|
+
initialDelayMs?: number;
|
|
15
|
+
/** Maximum delay in milliseconds (default: 30000) */
|
|
16
|
+
maxDelayMs?: number;
|
|
17
|
+
/** Backoff multiplier (default: 2) */
|
|
18
|
+
backoffMultiplier?: number;
|
|
19
|
+
/** Add jitter to prevent thundering herd (default: true) */
|
|
20
|
+
jitter?: boolean;
|
|
21
|
+
/** Custom function to determine if error is retryable */
|
|
22
|
+
isRetryable?: (error: unknown) => boolean;
|
|
23
|
+
/** Callback on each retry attempt */
|
|
24
|
+
onRetry?: (attempt: number, error: unknown, delayMs: number) => void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Default retry configuration
|
|
28
|
+
*/
|
|
29
|
+
export declare const DEFAULT_RETRY_CONFIG: Required<Omit<RetryConfig, 'isRetryable' | 'onRetry'>>;
|
|
30
|
+
/**
|
|
31
|
+
* Determines if an error is a transient network error
|
|
32
|
+
*/
|
|
33
|
+
export declare function isTransientError(error: unknown): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Determines if an HTTP response status is retryable
|
|
36
|
+
*/
|
|
37
|
+
export declare function isRetryableStatus(status: number): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Error class for retry exhaustion.
|
|
40
|
+
*
|
|
41
|
+
* Note: This class is exported for use by external callers who may want to
|
|
42
|
+
* wrap retry failures in a structured error type. The withRetry function
|
|
43
|
+
* itself throws the original error when retries are exhausted, allowing
|
|
44
|
+
* callers to handle the specific error type rather than a generic wrapper.
|
|
45
|
+
*/
|
|
46
|
+
export declare class RetryExhaustedError extends Error {
|
|
47
|
+
readonly attempts: number;
|
|
48
|
+
readonly lastError: unknown;
|
|
49
|
+
constructor(message: string, attempts: number, lastError: unknown);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Retry a function with exponential backoff
|
|
53
|
+
*
|
|
54
|
+
* @param fn - Async function to retry
|
|
55
|
+
* @param config - Retry configuration
|
|
56
|
+
* @returns Result of the function
|
|
57
|
+
* @throws The original error when retries are exhausted or error is not retryable
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const result = await withRetry(
|
|
62
|
+
* () => fetch('https://api.example.com/data'),
|
|
63
|
+
* { maxRetries: 3, initialDelayMs: 1000 }
|
|
64
|
+
* )
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function withRetry<T>(fn: () => Promise<T>, config?: RetryConfig): Promise<T>;
|
|
68
|
+
/**
|
|
69
|
+
* Retry a fetch request with exponential backoff
|
|
70
|
+
*
|
|
71
|
+
* Automatically retries on:
|
|
72
|
+
* - Network errors (ETIMEDOUT, ECONNRESET, etc.)
|
|
73
|
+
* - 5xx HTTP errors
|
|
74
|
+
* - 429 Too Many Requests (with Retry-After header support)
|
|
75
|
+
*
|
|
76
|
+
* @param url - URL to fetch
|
|
77
|
+
* @param options - Fetch options
|
|
78
|
+
* @param retryConfig - Retry configuration
|
|
79
|
+
* @returns Fetch Response
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const response = await fetchWithRetry(
|
|
84
|
+
* 'https://api.github.com/repos/owner/repo',
|
|
85
|
+
* { headers: { Authorization: 'token xxx' } },
|
|
86
|
+
* { maxRetries: 3 }
|
|
87
|
+
* )
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export declare function fetchWithRetry(url: string, options?: RequestInit, retryConfig?: RetryConfig): Promise<Response>;
|
|
91
|
+
/**
|
|
92
|
+
* Parse Retry-After header value
|
|
93
|
+
* @param value - Retry-After header value (seconds or HTTP-date)
|
|
94
|
+
* @returns Delay in milliseconds, or null if invalid
|
|
95
|
+
*/
|
|
96
|
+
export declare function parseRetryAfter(value: string | null): number | null;
|
|
97
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,yDAAyD;IACzD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAA;IACzC,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACrE;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC,CAMvF,CAAA;AA4BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAoBxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;GAOG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,OAAO;gBAFlC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO;CASrC;AAkCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAiD7F;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,EACrB,WAAW,GAAE,WAAgB,GAC5B,OAAO,CAAC,QAAQ,CAAC,CA8CnB;AAeD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CA2BnE"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Utility - SMI-880
|
|
3
|
+
*
|
|
4
|
+
* Exponential backoff retry logic for transient network failures.
|
|
5
|
+
* Handles ETIMEDOUT, ECONNRESET, and 5xx HTTP errors.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from './logger.js';
|
|
8
|
+
const log = createLogger('RetryUtil');
|
|
9
|
+
/**
|
|
10
|
+
* Default retry configuration
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_RETRY_CONFIG = {
|
|
13
|
+
maxRetries: 3,
|
|
14
|
+
initialDelayMs: 1000,
|
|
15
|
+
maxDelayMs: 30000,
|
|
16
|
+
backoffMultiplier: 2,
|
|
17
|
+
jitter: true,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Error codes that indicate transient network failures
|
|
21
|
+
*/
|
|
22
|
+
const TRANSIENT_ERROR_CODES = new Set([
|
|
23
|
+
'ETIMEDOUT',
|
|
24
|
+
'ECONNRESET',
|
|
25
|
+
'ECONNREFUSED',
|
|
26
|
+
'ENOTFOUND',
|
|
27
|
+
'ENETUNREACH',
|
|
28
|
+
'EHOSTUNREACH',
|
|
29
|
+
'EPIPE',
|
|
30
|
+
'EAI_AGAIN',
|
|
31
|
+
]);
|
|
32
|
+
/**
|
|
33
|
+
* HTTP status codes that are retryable
|
|
34
|
+
*/
|
|
35
|
+
const RETRYABLE_STATUS_CODES = new Set([
|
|
36
|
+
408, // Request Timeout
|
|
37
|
+
429, // Too Many Requests
|
|
38
|
+
500, // Internal Server Error
|
|
39
|
+
502, // Bad Gateway
|
|
40
|
+
503, // Service Unavailable
|
|
41
|
+
504, // Gateway Timeout
|
|
42
|
+
]);
|
|
43
|
+
/**
|
|
44
|
+
* Determines if an error is a transient network error
|
|
45
|
+
*/
|
|
46
|
+
export function isTransientError(error) {
|
|
47
|
+
if (error instanceof Error) {
|
|
48
|
+
// Check for Node.js network error codes
|
|
49
|
+
const code = error.code;
|
|
50
|
+
if (code && TRANSIENT_ERROR_CODES.has(code)) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
// Check for fetch abort errors (timeout)
|
|
54
|
+
if (error.name === 'AbortError') {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
// Check for network errors in fetch
|
|
58
|
+
if (error.message.includes('network') || error.message.includes('fetch failed')) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Determines if an HTTP response status is retryable
|
|
66
|
+
*/
|
|
67
|
+
export function isRetryableStatus(status) {
|
|
68
|
+
return RETRYABLE_STATUS_CODES.has(status);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Error class for retry exhaustion.
|
|
72
|
+
*
|
|
73
|
+
* Note: This class is exported for use by external callers who may want to
|
|
74
|
+
* wrap retry failures in a structured error type. The withRetry function
|
|
75
|
+
* itself throws the original error when retries are exhausted, allowing
|
|
76
|
+
* callers to handle the specific error type rather than a generic wrapper.
|
|
77
|
+
*/
|
|
78
|
+
export class RetryExhaustedError extends Error {
|
|
79
|
+
attempts;
|
|
80
|
+
lastError;
|
|
81
|
+
constructor(message, attempts, lastError) {
|
|
82
|
+
super(message);
|
|
83
|
+
this.attempts = attempts;
|
|
84
|
+
this.lastError = lastError;
|
|
85
|
+
this.name = 'RetryExhaustedError';
|
|
86
|
+
// Preserve cause chain
|
|
87
|
+
if (lastError instanceof Error) {
|
|
88
|
+
this.cause = lastError;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Calculate delay with exponential backoff and optional jitter
|
|
94
|
+
*/
|
|
95
|
+
function calculateDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier, jitter) {
|
|
96
|
+
// Exponential backoff: initialDelay * (multiplier ^ attempt)
|
|
97
|
+
let delay = initialDelayMs * Math.pow(backoffMultiplier, attempt);
|
|
98
|
+
// Cap at max delay
|
|
99
|
+
delay = Math.min(delay, maxDelayMs);
|
|
100
|
+
// Add jitter (±25%) to prevent thundering herd
|
|
101
|
+
if (jitter) {
|
|
102
|
+
const jitterFactor = 0.75 + Math.random() * 0.5; // 0.75 to 1.25
|
|
103
|
+
delay = Math.floor(delay * jitterFactor);
|
|
104
|
+
}
|
|
105
|
+
return delay;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Sleep for a specified duration
|
|
109
|
+
*/
|
|
110
|
+
function sleep(ms) {
|
|
111
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Retry a function with exponential backoff
|
|
115
|
+
*
|
|
116
|
+
* @param fn - Async function to retry
|
|
117
|
+
* @param config - Retry configuration
|
|
118
|
+
* @returns Result of the function
|
|
119
|
+
* @throws The original error when retries are exhausted or error is not retryable
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const result = await withRetry(
|
|
124
|
+
* () => fetch('https://api.example.com/data'),
|
|
125
|
+
* { maxRetries: 3, initialDelayMs: 1000 }
|
|
126
|
+
* )
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export async function withRetry(fn, config = {}) {
|
|
130
|
+
const { maxRetries = DEFAULT_RETRY_CONFIG.maxRetries, initialDelayMs = DEFAULT_RETRY_CONFIG.initialDelayMs, maxDelayMs = DEFAULT_RETRY_CONFIG.maxDelayMs, backoffMultiplier = DEFAULT_RETRY_CONFIG.backoffMultiplier, jitter = DEFAULT_RETRY_CONFIG.jitter, isRetryable = isTransientError, onRetry, } = config;
|
|
131
|
+
let lastError;
|
|
132
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
133
|
+
try {
|
|
134
|
+
return await fn();
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
lastError = error;
|
|
138
|
+
// Check if we should retry
|
|
139
|
+
if (attempt >= maxRetries || !isRetryable(error)) {
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
// Calculate delay for this attempt
|
|
143
|
+
const delayMs = calculateDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier, jitter);
|
|
144
|
+
// Log retry attempt
|
|
145
|
+
log.debug(`Retry attempt ${attempt + 1}/${maxRetries}`, {
|
|
146
|
+
error: error instanceof Error ? error.message : String(error),
|
|
147
|
+
delayMs,
|
|
148
|
+
});
|
|
149
|
+
// Call retry callback if provided
|
|
150
|
+
if (onRetry) {
|
|
151
|
+
onRetry(attempt + 1, error, delayMs);
|
|
152
|
+
}
|
|
153
|
+
// Wait before retrying
|
|
154
|
+
await sleep(delayMs);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// This point is unreachable: the loop always exits via return (on success)
|
|
158
|
+
// or throw (when retries exhausted or error not retryable). The loop runs
|
|
159
|
+
// attempt from 0 to maxRetries inclusive. On the final iteration
|
|
160
|
+
// (attempt === maxRetries), if fn() throws, the condition `attempt >= maxRetries`
|
|
161
|
+
// is true, causing the original error to be thrown immediately.
|
|
162
|
+
throw new Error('Unreachable: loop invariant violated');
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Retry a fetch request with exponential backoff
|
|
166
|
+
*
|
|
167
|
+
* Automatically retries on:
|
|
168
|
+
* - Network errors (ETIMEDOUT, ECONNRESET, etc.)
|
|
169
|
+
* - 5xx HTTP errors
|
|
170
|
+
* - 429 Too Many Requests (with Retry-After header support)
|
|
171
|
+
*
|
|
172
|
+
* @param url - URL to fetch
|
|
173
|
+
* @param options - Fetch options
|
|
174
|
+
* @param retryConfig - Retry configuration
|
|
175
|
+
* @returns Fetch Response
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```typescript
|
|
179
|
+
* const response = await fetchWithRetry(
|
|
180
|
+
* 'https://api.github.com/repos/owner/repo',
|
|
181
|
+
* { headers: { Authorization: 'token xxx' } },
|
|
182
|
+
* { maxRetries: 3 }
|
|
183
|
+
* )
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
export async function fetchWithRetry(url, options, retryConfig = {}) {
|
|
187
|
+
const config = {
|
|
188
|
+
...retryConfig,
|
|
189
|
+
isRetryable: (error) => {
|
|
190
|
+
// Check for network errors
|
|
191
|
+
if (isTransientError(error)) {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
// Check for HTTP response errors (from our custom throw below)
|
|
195
|
+
if (error instanceof HttpRetryableError) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
return withRetry(async () => {
|
|
202
|
+
const response = await fetch(url, options);
|
|
203
|
+
// Check if we should retry based on status code
|
|
204
|
+
if (isRetryableStatus(response.status)) {
|
|
205
|
+
// Check for Retry-After header
|
|
206
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
207
|
+
const retryAfterMs = parseRetryAfter(retryAfter);
|
|
208
|
+
if (retryAfterMs !== null && retryAfterMs > 0) {
|
|
209
|
+
// SMI-1029: Double-delay behavior is intentional
|
|
210
|
+
// We sleep here for the Retry-After duration, then throw HttpRetryableError.
|
|
211
|
+
// When withRetry catches this error, it will apply its own exponential backoff
|
|
212
|
+
// delay before the next attempt. This results in a total delay of:
|
|
213
|
+
// Retry-After + exponential backoff
|
|
214
|
+
//
|
|
215
|
+
// This is by design for two reasons:
|
|
216
|
+
// 1. Safety margin: The server's Retry-After is a minimum; adding backoff
|
|
217
|
+
// provides buffer for clock skew and processing time.
|
|
218
|
+
// 2. Thundering herd prevention: If many clients received the same Retry-After,
|
|
219
|
+
// the additional jittered backoff spreads out retry attempts.
|
|
220
|
+
await sleep(retryAfterMs);
|
|
221
|
+
}
|
|
222
|
+
throw new HttpRetryableError(response.status, `HTTP ${response.status} - retryable`);
|
|
223
|
+
}
|
|
224
|
+
return response;
|
|
225
|
+
}, config);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Error thrown for HTTP responses that should be retried
|
|
229
|
+
*/
|
|
230
|
+
class HttpRetryableError extends Error {
|
|
231
|
+
status;
|
|
232
|
+
constructor(status, message) {
|
|
233
|
+
super(message);
|
|
234
|
+
this.status = status;
|
|
235
|
+
this.name = 'HttpRetryableError';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Parse Retry-After header value
|
|
240
|
+
* @param value - Retry-After header value (seconds or HTTP-date)
|
|
241
|
+
* @returns Delay in milliseconds, or null if invalid
|
|
242
|
+
*/
|
|
243
|
+
export function parseRetryAfter(value) {
|
|
244
|
+
if (value === null || value.trim() === '') {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
const trimmed = value.trim();
|
|
248
|
+
// Try parsing as seconds (must be non-negative integer string)
|
|
249
|
+
// Matches only pure integer strings like "120", not "12.5" or "12abc"
|
|
250
|
+
if (/^-?\d+$/.test(trimmed)) {
|
|
251
|
+
const seconds = parseInt(trimmed, 10);
|
|
252
|
+
if (seconds < 0) {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
return seconds * 1000;
|
|
256
|
+
}
|
|
257
|
+
// Try parsing as HTTP-date (must contain letters, e.g., "Wed, 21 Oct 2015 07:28:00 GMT")
|
|
258
|
+
// This prevents numeric-like strings like "12.5" from being parsed as dates
|
|
259
|
+
if (/[a-zA-Z]/.test(trimmed)) {
|
|
260
|
+
const date = Date.parse(trimmed);
|
|
261
|
+
if (!isNaN(date)) {
|
|
262
|
+
return Math.max(0, date - Date.now());
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAA;AAsBrC;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA2D;IAC1F,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,KAAK;IACjB,iBAAiB,EAAE,CAAC;IACpB,MAAM,EAAE,IAAI;CACb,CAAA;AAED;;GAEG;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,WAAW;IACX,YAAY;IACZ,cAAc;IACd,WAAW;IACX,aAAa;IACb,cAAc;IACd,OAAO;IACP,WAAW;CACZ,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,wBAAwB;IAC7B,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,sBAAsB;IAC3B,GAAG,EAAE,kBAAkB;CACxB,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,wCAAwC;QACxC,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAA;QAClD,IAAI,IAAI,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,yCAAyC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,oCAAoC;QACpC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAChF,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAG1B;IACA;IAHlB,YACE,OAAe,EACC,QAAgB,EAChB,SAAkB;QAElC,KAAK,CAAC,OAAO,CAAC,CAAA;QAHE,aAAQ,GAAR,QAAQ,CAAQ;QAChB,cAAS,GAAT,SAAS,CAAS;QAGlC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,uBAAuB;QACvB,IAAI,SAAS,YAAY,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;QACxB,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,OAAe,EACf,cAAsB,EACtB,UAAkB,EAClB,iBAAyB,EACzB,MAAe;IAEf,6DAA6D;IAC7D,IAAI,KAAK,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;IAEjE,mBAAmB;IACnB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IAEnC,+CAA+C;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAA,CAAC,eAAe;QAC/D,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,CAAA;IAC1C,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,EAAoB,EAAE,SAAsB,EAAE;IAC/E,MAAM,EACJ,UAAU,GAAG,oBAAoB,CAAC,UAAU,EAC5C,cAAc,GAAG,oBAAoB,CAAC,cAAc,EACpD,UAAU,GAAG,oBAAoB,CAAC,UAAU,EAC5C,iBAAiB,GAAG,oBAAoB,CAAC,iBAAiB,EAC1D,MAAM,GAAG,oBAAoB,CAAC,MAAM,EACpC,WAAW,GAAG,gBAAgB,EAC9B,OAAO,GACR,GAAG,MAAM,CAAA;IAEV,IAAI,SAAkB,CAAA;IAEtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAA;YAEjB,2BAA2B;YAC3B,IAAI,OAAO,IAAI,UAAU,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,MAAM,KAAK,CAAA;YACb,CAAC;YAED,mCAAmC;YACnC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAA;YAE9F,oBAAoB;YACpB,GAAG,CAAC,KAAK,CAAC,iBAAiB,OAAO,GAAG,CAAC,IAAI,UAAU,EAAE,EAAE;gBACtD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO;aACR,CAAC,CAAA;YAEF,kCAAkC;YAClC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YACtC,CAAC;YAED,uBAAuB;YACvB,MAAM,KAAK,CAAC,OAAO,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,iEAAiE;IACjE,kFAAkF;IAClF,gEAAgE;IAChE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;AACzD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,OAAqB,EACrB,cAA2B,EAAE;IAE7B,MAAM,MAAM,GAAgB;QAC1B,GAAG,WAAW;QACd,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;YACrB,2BAA2B;YAC3B,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAA;YACb,CAAC;YAED,+DAA+D;YAC/D,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAA;YACb,CAAC;YAED,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAA;IAED,OAAO,SAAS,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAE1C,gDAAgD;QAChD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,+BAA+B;YAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YACtD,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;YAChD,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC9C,iDAAiD;gBACjD,6EAA6E;gBAC7E,+EAA+E;gBAC/E,mEAAmE;gBACnE,sCAAsC;gBACtC,EAAE;gBACF,qCAAqC;gBACrC,0EAA0E;gBAC1E,yDAAyD;gBACzD,gFAAgF;gBAChF,iEAAiE;gBACjE,MAAM,KAAK,CAAC,YAAY,CAAC,CAAA;YAC3B,CAAC;YAED,MAAM,IAAI,kBAAkB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAA;QACtF,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC,EAAE,MAAM,CAAC,CAAA;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,kBAAmB,SAAQ,KAAK;IAElB;IADlB,YACkB,MAAc,EAC9B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHE,WAAM,GAAN,MAAM,CAAQ;QAI9B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAE5B,+DAA+D;IAC/D,sEAAsE;IACtE,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACrC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,OAAO,GAAG,IAAI,CAAA;IACvB,CAAC;IAED,yFAAyF;IACzF,4EAA4E;IAC5E,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
|