@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,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Utilities (SMI-726)
|
|
3
|
+
*
|
|
4
|
+
* Centralized validation patterns for security-critical operations.
|
|
5
|
+
* Extracted from RawUrlSourceAdapter and LocalFilesystemAdapter.
|
|
6
|
+
*
|
|
7
|
+
* Security Features:
|
|
8
|
+
* - SSRF prevention (SMI-721, SMI-729)
|
|
9
|
+
* - Path traversal prevention (SMI-720)
|
|
10
|
+
* - RegExp injection prevention (SMI-722)
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Validation error thrown when input fails security checks
|
|
14
|
+
*/
|
|
15
|
+
export declare class ValidationError extends Error {
|
|
16
|
+
readonly code: string;
|
|
17
|
+
readonly details?: unknown | undefined;
|
|
18
|
+
constructor(message: string, code: string, details?: unknown | undefined);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate URL to prevent SSRF attacks (SMI-721, SMI-729)
|
|
22
|
+
*
|
|
23
|
+
* Blocks:
|
|
24
|
+
* - Non-http(s) protocols
|
|
25
|
+
* - Private IPv4 ranges (10.x, 172.16-31.x, 192.168.x)
|
|
26
|
+
* - Private IPv6 ranges (fe80::/10, fc00::/7, ff00::/8, ::ffff:0:0/96)
|
|
27
|
+
* - Localhost variants (127.x, localhost, ::1, 0.0.0.0)
|
|
28
|
+
* - Link-local addresses (169.254.x, fe80::/10)
|
|
29
|
+
* - Current network (0.x)
|
|
30
|
+
*
|
|
31
|
+
* @param url - URL to validate
|
|
32
|
+
* @throws {ValidationError} if URL is not allowed
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* validateUrl('https://example.com/api') // OK
|
|
37
|
+
* validateUrl('http://localhost:3000') // Throws ValidationError
|
|
38
|
+
* validateUrl('ftp://example.com') // Throws ValidationError
|
|
39
|
+
* validateUrl('http://192.168.1.1') // Throws ValidationError
|
|
40
|
+
* validateUrl('http://[fe80::1]') // Throws ValidationError (IPv6 link-local)
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function validateUrl(url: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Validate file path to prevent path traversal attacks (SMI-720)
|
|
46
|
+
*
|
|
47
|
+
* Ensures the resolved path remains within the allowed root directory.
|
|
48
|
+
*
|
|
49
|
+
* @param path - Path to validate (can be relative or absolute)
|
|
50
|
+
* @param rootDir - Root directory that must contain the path
|
|
51
|
+
* @throws {ValidationError} if path escapes root directory
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* validatePath('skills/my-skill', '/home/user/.claude') // OK
|
|
56
|
+
* validatePath('../etc/passwd', '/home/user/.claude') // Throws ValidationError
|
|
57
|
+
* validatePath('/etc/passwd', '/home/user/.claude') // Throws ValidationError
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function validatePath(path: string, rootDir: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Sanitize input string for safe use in various contexts
|
|
63
|
+
*
|
|
64
|
+
* Removes or escapes potentially dangerous characters.
|
|
65
|
+
*
|
|
66
|
+
* @param input - Input string to sanitize
|
|
67
|
+
* @param options - Sanitization options
|
|
68
|
+
* @returns Sanitized string
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* sanitizeInput('<script>alert(1)</script>') // Returns: '<script>alert(1)</script>'
|
|
73
|
+
* sanitizeInput('../../etc/passwd') // Returns: 'etc/passwd'
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function sanitizeInput(input: string, options?: {
|
|
77
|
+
/** Remove path traversal sequences like '../' (default: true) */
|
|
78
|
+
removePathTraversal?: boolean;
|
|
79
|
+
/** HTML-escape special characters (default: true) */
|
|
80
|
+
escapeHtml?: boolean;
|
|
81
|
+
/** Remove null bytes (default: true) */
|
|
82
|
+
removeNullBytes?: boolean;
|
|
83
|
+
}): string;
|
|
84
|
+
/**
|
|
85
|
+
* Safely test a string against a pattern, preventing RegExp injection (SMI-722)
|
|
86
|
+
*
|
|
87
|
+
* Tries exact match, prefix match, and regex match (with error handling).
|
|
88
|
+
* Falls back to includes check if regex is invalid.
|
|
89
|
+
*
|
|
90
|
+
* @param value - Value to test
|
|
91
|
+
* @param pattern - Pattern to match (string or regex)
|
|
92
|
+
* @returns True if value matches pattern
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* safePatternMatch('node_modules', 'node_modules') // true (exact)
|
|
97
|
+
* safePatternMatch('node_modules/pkg', 'node_') // true (prefix)
|
|
98
|
+
* safePatternMatch('test.js', '\\.js$') // true (regex)
|
|
99
|
+
* safePatternMatch('test.js', '(evil') // false (invalid regex, falls back)
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export declare function safePatternMatch(value: string, pattern: string): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Validate that patterns array is safe to use
|
|
105
|
+
*
|
|
106
|
+
* Checks for potentially dangerous regex patterns that could cause ReDoS.
|
|
107
|
+
*
|
|
108
|
+
* @param patterns - Array of patterns to validate
|
|
109
|
+
* @returns Array of validation warnings (empty if all patterns are safe)
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* validatePatterns(['node_modules', '\\.js$']) // []
|
|
114
|
+
* validatePatterns(['(a+)+b']) // ['Pattern may cause ReDoS: (a+)+b']
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export declare function validatePatterns(patterns: string[]): string[];
|
|
118
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,IAAI,EAAE,MAAM;aACZ,OAAO,CAAC,EAAE,OAAO;gBAFjC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAoE7C;AA+OD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA2BhE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAA;CACrB,GACL,MAAM,CA6BR;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAuBxE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAyB7D"}
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Utilities (SMI-726)
|
|
3
|
+
*
|
|
4
|
+
* Centralized validation patterns for security-critical operations.
|
|
5
|
+
* Extracted from RawUrlSourceAdapter and LocalFilesystemAdapter.
|
|
6
|
+
*
|
|
7
|
+
* Security Features:
|
|
8
|
+
* - SSRF prevention (SMI-721, SMI-729)
|
|
9
|
+
* - Path traversal prevention (SMI-720)
|
|
10
|
+
* - RegExp injection prevention (SMI-722)
|
|
11
|
+
*/
|
|
12
|
+
import { resolve } from 'path';
|
|
13
|
+
/**
|
|
14
|
+
* Validation error thrown when input fails security checks
|
|
15
|
+
*/
|
|
16
|
+
export class ValidationError extends Error {
|
|
17
|
+
code;
|
|
18
|
+
details;
|
|
19
|
+
constructor(message, code, details) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.details = details;
|
|
23
|
+
this.name = 'ValidationError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Validate URL to prevent SSRF attacks (SMI-721, SMI-729)
|
|
28
|
+
*
|
|
29
|
+
* Blocks:
|
|
30
|
+
* - Non-http(s) protocols
|
|
31
|
+
* - Private IPv4 ranges (10.x, 172.16-31.x, 192.168.x)
|
|
32
|
+
* - Private IPv6 ranges (fe80::/10, fc00::/7, ff00::/8, ::ffff:0:0/96)
|
|
33
|
+
* - Localhost variants (127.x, localhost, ::1, 0.0.0.0)
|
|
34
|
+
* - Link-local addresses (169.254.x, fe80::/10)
|
|
35
|
+
* - Current network (0.x)
|
|
36
|
+
*
|
|
37
|
+
* @param url - URL to validate
|
|
38
|
+
* @throws {ValidationError} if URL is not allowed
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* validateUrl('https://example.com/api') // OK
|
|
43
|
+
* validateUrl('http://localhost:3000') // Throws ValidationError
|
|
44
|
+
* validateUrl('ftp://example.com') // Throws ValidationError
|
|
45
|
+
* validateUrl('http://192.168.1.1') // Throws ValidationError
|
|
46
|
+
* validateUrl('http://[fe80::1]') // Throws ValidationError (IPv6 link-local)
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function validateUrl(url) {
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = new URL(url);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
throw new ValidationError(`Invalid URL format: ${url}`, 'INVALID_URL_FORMAT', error);
|
|
56
|
+
}
|
|
57
|
+
// Only allow http/https protocols
|
|
58
|
+
if (!['http:', 'https:'].includes(parsed.protocol)) {
|
|
59
|
+
throw new ValidationError(`Invalid protocol: ${parsed.protocol}. Only http and https are allowed.`, 'INVALID_PROTOCOL', { protocol: parsed.protocol, url });
|
|
60
|
+
}
|
|
61
|
+
let hostname = parsed.hostname.toLowerCase();
|
|
62
|
+
// Strip brackets from IPv6 addresses for easier comparison
|
|
63
|
+
// Node.js URL keeps brackets in hostname for IPv6 (e.g., "[::1]")
|
|
64
|
+
if (hostname.startsWith('[') && hostname.endsWith(']')) {
|
|
65
|
+
hostname = hostname.slice(1, -1);
|
|
66
|
+
}
|
|
67
|
+
// Block localhost variants
|
|
68
|
+
if (hostname === 'localhost' || hostname === '::1' || hostname === '0.0.0.0') {
|
|
69
|
+
throw new ValidationError(`Access to localhost is blocked: ${hostname}`, 'LOCALHOST_BLOCKED', {
|
|
70
|
+
hostname,
|
|
71
|
+
url,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Check for IPv4 addresses
|
|
75
|
+
const ipv4Match = hostname.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
|
|
76
|
+
if (ipv4Match) {
|
|
77
|
+
const [, a, b, c, d] = ipv4Match.map(Number);
|
|
78
|
+
// Validate IPv4 octets are in valid range
|
|
79
|
+
if (a > 255 || b > 255 || c > 255 || d > 255) {
|
|
80
|
+
throw new ValidationError(`Invalid IPv4 address: ${hostname}`, 'INVALID_IPV4', {
|
|
81
|
+
hostname,
|
|
82
|
+
url,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Block private/internal IP ranges
|
|
86
|
+
if (a === 10 || // 10.0.0.0/8 - Private network
|
|
87
|
+
(a === 172 && b >= 16 && b <= 31) || // 172.16.0.0/12 - Private network
|
|
88
|
+
(a === 192 && b === 168) || // 192.168.0.0/16 - Private network
|
|
89
|
+
a === 127 || // 127.0.0.0/8 - Loopback
|
|
90
|
+
(a === 169 && b === 254) || // 169.254.0.0/16 - Link-local
|
|
91
|
+
a === 0 // 0.0.0.0/8 - Current network
|
|
92
|
+
) {
|
|
93
|
+
throw new ValidationError(`Access to private/internal network blocked: ${hostname}`, 'PRIVATE_NETWORK_BLOCKED', { hostname, url, ipRange: getIpRangeName(a, b) });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Check for IPv6 addresses (SMI-729)
|
|
97
|
+
// IPv6 addresses in URLs are enclosed in square brackets, but hostname strips them
|
|
98
|
+
if (hostname.includes(':')) {
|
|
99
|
+
validateIPv6(hostname, url);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Validate IPv6 address to prevent SSRF attacks (SMI-729)
|
|
104
|
+
*
|
|
105
|
+
* Blocks:
|
|
106
|
+
* - Link-local: fe80::/10
|
|
107
|
+
* - Unique local addresses (ULA): fc00::/7
|
|
108
|
+
* - Multicast: ff00::/8
|
|
109
|
+
* - IPv4-mapped IPv6: ::ffff:0:0/96
|
|
110
|
+
* - Loopback ::1 (already blocked above)
|
|
111
|
+
*
|
|
112
|
+
* @param hostname - IPv6 hostname to validate
|
|
113
|
+
* @param url - Full URL for error context
|
|
114
|
+
* @throws {ValidationError} if IPv6 address is not allowed
|
|
115
|
+
*/
|
|
116
|
+
function validateIPv6(hostname, url) {
|
|
117
|
+
// Normalize IPv6 address
|
|
118
|
+
const normalized = hostname.toLowerCase();
|
|
119
|
+
// Block IPv6 loopback (::1 and its full form)
|
|
120
|
+
// This is defense-in-depth since line 76 should also catch ::1
|
|
121
|
+
if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1') {
|
|
122
|
+
throw new ValidationError(`Access to localhost is blocked: ${hostname}`, 'LOCALHOST_BLOCKED', {
|
|
123
|
+
hostname,
|
|
124
|
+
url,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// Block link-local addresses (fe80::/10)
|
|
128
|
+
// fe80 to febf range
|
|
129
|
+
if (normalized.startsWith('fe8') ||
|
|
130
|
+
normalized.startsWith('fe9') ||
|
|
131
|
+
normalized.startsWith('fea') ||
|
|
132
|
+
normalized.startsWith('feb')) {
|
|
133
|
+
throw new ValidationError(`Access to IPv6 link-local address blocked: ${hostname}`, 'IPV6_LINK_LOCAL_BLOCKED', { hostname, url });
|
|
134
|
+
}
|
|
135
|
+
// Block unique local addresses (fc00::/7)
|
|
136
|
+
// fc00 to fdff range
|
|
137
|
+
if (normalized.startsWith('fc') || normalized.startsWith('fd')) {
|
|
138
|
+
throw new ValidationError(`Access to IPv6 unique local address blocked: ${hostname}`, 'IPV6_ULA_BLOCKED', { hostname, url });
|
|
139
|
+
}
|
|
140
|
+
// Block multicast addresses (ff00::/8)
|
|
141
|
+
if (normalized.startsWith('ff')) {
|
|
142
|
+
throw new ValidationError(`Access to IPv6 multicast address blocked: ${hostname}`, 'IPV6_MULTICAST_BLOCKED', { hostname, url });
|
|
143
|
+
}
|
|
144
|
+
// Block IPv4-mapped IPv6 addresses (::ffff:0:0/96)
|
|
145
|
+
// These map IPv4 addresses into IPv6 space
|
|
146
|
+
if (normalized.includes('::ffff:')) {
|
|
147
|
+
// Extract the IPv4 part and validate it
|
|
148
|
+
const ipv4Part = normalized.split('::ffff:')[1];
|
|
149
|
+
if (ipv4Part) {
|
|
150
|
+
// Check if it's in dotted decimal notation
|
|
151
|
+
const ipv4Match = ipv4Part.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/);
|
|
152
|
+
if (ipv4Match) {
|
|
153
|
+
const [, a, b] = ipv4Match.map(Number);
|
|
154
|
+
// Apply same private IP checks as IPv4
|
|
155
|
+
if (a === 10 ||
|
|
156
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
157
|
+
(a === 192 && b === 168) ||
|
|
158
|
+
a === 127 ||
|
|
159
|
+
(a === 169 && b === 254) ||
|
|
160
|
+
a === 0) {
|
|
161
|
+
throw new ValidationError(`Access to IPv4-mapped IPv6 private address blocked: ${hostname}`, 'IPV4_MAPPED_IPV6_BLOCKED', { hostname, url, ipRange: getIpRangeName(a, b) });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// IPv4 in hex notation (e.g., ::ffff:7f00:1 for 127.0.0.1)
|
|
166
|
+
// Parse hex format: high:low where high = (a<<8)|b, low = (c<<8)|d
|
|
167
|
+
const hexMatch = ipv4Part.match(/^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
|
|
168
|
+
if (hexMatch) {
|
|
169
|
+
const high = parseInt(hexMatch[1], 16);
|
|
170
|
+
const low = parseInt(hexMatch[2], 16);
|
|
171
|
+
const a = (high >> 8) & 0xff;
|
|
172
|
+
const b = high & 0xff;
|
|
173
|
+
// Apply same private IP checks as IPv4
|
|
174
|
+
if (a === 10 ||
|
|
175
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
176
|
+
(a === 192 && b === 168) ||
|
|
177
|
+
a === 127 ||
|
|
178
|
+
(a === 169 && b === 254) ||
|
|
179
|
+
a === 0) {
|
|
180
|
+
throw new ValidationError(`Access to IPv4-mapped IPv6 private address blocked: ${hostname}`, 'IPV4_MAPPED_IPV6_BLOCKED', { hostname, url, ipRange: getIpRangeName(a, b) });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// If we can't parse it, block it to be safe
|
|
184
|
+
throw new ValidationError(`Access to IPv4-mapped IPv6 address blocked: ${hostname}`, 'IPV4_MAPPED_IPV6_BLOCKED', { hostname, url });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Block 6to4 addresses with embedded private IPv4 (2002::/16) - SMI-1004
|
|
189
|
+
// 6to4 embeds IPv4 in bits 16-48: 2002:AABB:CCDD::/48 where IPv4 is AA.BB.CC.DD
|
|
190
|
+
if (normalized.startsWith('2002:')) {
|
|
191
|
+
// Extract the two hex segments after 2002:
|
|
192
|
+
const segments = normalized.split(':');
|
|
193
|
+
if (segments.length >= 3 && segments[1] && segments[2]) {
|
|
194
|
+
// Parse hex segments: 2002:AABB:CCDD -> IPv4 is 0xAA.0xBB.0xCC.0xDD
|
|
195
|
+
const highHex = segments[1].padStart(4, '0');
|
|
196
|
+
const lowHex = segments[2].padStart(4, '0');
|
|
197
|
+
const a = parseInt(highHex.slice(0, 2), 16);
|
|
198
|
+
const b = parseInt(highHex.slice(2, 4), 16);
|
|
199
|
+
const c = parseInt(lowHex.slice(0, 2), 16);
|
|
200
|
+
const d = parseInt(lowHex.slice(2, 4), 16);
|
|
201
|
+
// Check if embedded IPv4 is private
|
|
202
|
+
if (a === 10 ||
|
|
203
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
204
|
+
(a === 192 && b === 168) ||
|
|
205
|
+
a === 127 ||
|
|
206
|
+
(a === 169 && b === 254) ||
|
|
207
|
+
a === 0) {
|
|
208
|
+
throw new ValidationError(`Access to 6to4 address with embedded private IPv4 blocked: ${hostname}`, 'IPV6_6TO4_PRIVATE', { hostname, url, embeddedIPv4: `${a}.${b}.${c}.${d}`, ipRange: getIpRangeName(a, b) });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Block IPv4-compatible addresses (::IPv4) without ffff prefix - SMI-1005
|
|
213
|
+
// Pattern: ::x.x.x.x (deprecated but still valid)
|
|
214
|
+
// Note: URL parser normalizes ::192.168.1.1 to ::c0a8:101 (hex format)
|
|
215
|
+
// So we need to match both dotted-decimal and the normalized hex format
|
|
216
|
+
const ipv4CompatibleMatch = normalized.match(/^::(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
|
|
217
|
+
if (ipv4CompatibleMatch) {
|
|
218
|
+
const [, aStr, bStr, cStr, dStr] = ipv4CompatibleMatch;
|
|
219
|
+
const a = parseInt(aStr, 10);
|
|
220
|
+
const b = parseInt(bStr, 10);
|
|
221
|
+
const c = parseInt(cStr, 10);
|
|
222
|
+
const d = parseInt(dStr, 10);
|
|
223
|
+
// Validate octets
|
|
224
|
+
if (a <= 255 && b <= 255 && c <= 255 && d <= 255) {
|
|
225
|
+
// Check if embedded IPv4 is private
|
|
226
|
+
if (a === 10 ||
|
|
227
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
228
|
+
(a === 192 && b === 168) ||
|
|
229
|
+
a === 127 ||
|
|
230
|
+
(a === 169 && b === 254) ||
|
|
231
|
+
a === 0) {
|
|
232
|
+
throw new ValidationError(`Access to IPv4-compatible IPv6 address with private IPv4 blocked: ${hostname}`, 'IPV6_COMPATIBLE_PRIVATE', { hostname, url, embeddedIPv4: `${a}.${b}.${c}.${d}`, ipRange: getIpRangeName(a, b) });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Also check for normalized hex format: ::XXXX:XXXX (without ffff: prefix)
|
|
237
|
+
// URL parser normalizes ::192.168.1.1 to ::c0a8:101
|
|
238
|
+
const ipv4CompatibleHexMatch = normalized.match(/^::([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
|
|
239
|
+
if (ipv4CompatibleHexMatch) {
|
|
240
|
+
const high = parseInt(ipv4CompatibleHexMatch[1], 16);
|
|
241
|
+
const low = parseInt(ipv4CompatibleHexMatch[2], 16);
|
|
242
|
+
const a = (high >> 8) & 0xff;
|
|
243
|
+
const b = high & 0xff;
|
|
244
|
+
const c = (low >> 8) & 0xff;
|
|
245
|
+
const d = low & 0xff;
|
|
246
|
+
// Check if embedded IPv4 is private
|
|
247
|
+
if (a === 10 ||
|
|
248
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
249
|
+
(a === 192 && b === 168) ||
|
|
250
|
+
a === 127 ||
|
|
251
|
+
(a === 169 && b === 254) ||
|
|
252
|
+
a === 0) {
|
|
253
|
+
throw new ValidationError(`Access to IPv4-compatible IPv6 address with private IPv4 blocked: ${hostname}`, 'IPV6_COMPATIBLE_PRIVATE', { hostname, url, embeddedIPv4: `${a}.${b}.${c}.${d}`, ipRange: getIpRangeName(a, b) });
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Block Teredo addresses (2001:0::/32) - SMI-1006
|
|
257
|
+
// Teredo tunneling can bypass firewall rules
|
|
258
|
+
if (normalized.startsWith('2001:0000:') || normalized.startsWith('2001:0:')) {
|
|
259
|
+
throw new ValidationError(`Access to Teredo tunnel address blocked: ${hostname}`, 'IPV6_TEREDO_BLOCKED', { hostname, url });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get human-readable IP range name for error messages
|
|
264
|
+
*/
|
|
265
|
+
function getIpRangeName(a, b) {
|
|
266
|
+
if (a === 10)
|
|
267
|
+
return '10.0.0.0/8 (Private)';
|
|
268
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
269
|
+
return '172.16.0.0/12 (Private)';
|
|
270
|
+
if (a === 192 && b === 168)
|
|
271
|
+
return '192.168.0.0/16 (Private)';
|
|
272
|
+
if (a === 127)
|
|
273
|
+
return '127.0.0.0/8 (Loopback)';
|
|
274
|
+
if (a === 169 && b === 254)
|
|
275
|
+
return '169.254.0.0/16 (Link-local)';
|
|
276
|
+
if (a === 0)
|
|
277
|
+
return '0.0.0.0/8 (Current network)';
|
|
278
|
+
return 'Unknown';
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Validate file path to prevent path traversal attacks (SMI-720)
|
|
282
|
+
*
|
|
283
|
+
* Ensures the resolved path remains within the allowed root directory.
|
|
284
|
+
*
|
|
285
|
+
* @param path - Path to validate (can be relative or absolute)
|
|
286
|
+
* @param rootDir - Root directory that must contain the path
|
|
287
|
+
* @throws {ValidationError} if path escapes root directory
|
|
288
|
+
*
|
|
289
|
+
* @example
|
|
290
|
+
* ```typescript
|
|
291
|
+
* validatePath('skills/my-skill', '/home/user/.claude') // OK
|
|
292
|
+
* validatePath('../etc/passwd', '/home/user/.claude') // Throws ValidationError
|
|
293
|
+
* validatePath('/etc/passwd', '/home/user/.claude') // Throws ValidationError
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
export function validatePath(path, rootDir) {
|
|
297
|
+
if (!path) {
|
|
298
|
+
throw new ValidationError('Path cannot be empty', 'EMPTY_PATH');
|
|
299
|
+
}
|
|
300
|
+
if (!rootDir) {
|
|
301
|
+
throw new ValidationError('Root directory cannot be empty', 'EMPTY_ROOT_DIR');
|
|
302
|
+
}
|
|
303
|
+
// Normalize both paths to resolve '..' and '.'
|
|
304
|
+
// Resolve path relative to rootDir so relative paths work correctly
|
|
305
|
+
const normalizedPath = resolve(rootDir, path);
|
|
306
|
+
const normalizedRoot = resolve(rootDir);
|
|
307
|
+
// Check that normalized path is within root directory
|
|
308
|
+
// Handle edge case where path equals root exactly
|
|
309
|
+
const isWithinRoot = normalizedPath.startsWith(normalizedRoot + '/') || normalizedPath === normalizedRoot;
|
|
310
|
+
if (!isWithinRoot) {
|
|
311
|
+
throw new ValidationError(`Path traversal detected: ${path}`, 'PATH_TRAVERSAL', {
|
|
312
|
+
originalPath: path,
|
|
313
|
+
normalizedPath,
|
|
314
|
+
rootDir,
|
|
315
|
+
normalizedRoot,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Sanitize input string for safe use in various contexts
|
|
321
|
+
*
|
|
322
|
+
* Removes or escapes potentially dangerous characters.
|
|
323
|
+
*
|
|
324
|
+
* @param input - Input string to sanitize
|
|
325
|
+
* @param options - Sanitization options
|
|
326
|
+
* @returns Sanitized string
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```typescript
|
|
330
|
+
* sanitizeInput('<script>alert(1)</script>') // Returns: '<script>alert(1)</script>'
|
|
331
|
+
* sanitizeInput('../../etc/passwd') // Returns: 'etc/passwd'
|
|
332
|
+
* ```
|
|
333
|
+
*/
|
|
334
|
+
export function sanitizeInput(input, options = {}) {
|
|
335
|
+
const { removePathTraversal = true, escapeHtml = true, removeNullBytes = true } = options;
|
|
336
|
+
let sanitized = input;
|
|
337
|
+
// Remove null bytes (security risk)
|
|
338
|
+
if (removeNullBytes) {
|
|
339
|
+
sanitized = sanitized.replace(/\0/g, '');
|
|
340
|
+
}
|
|
341
|
+
// Remove path traversal sequences
|
|
342
|
+
if (removePathTraversal) {
|
|
343
|
+
// Remove '../' and '..\' patterns
|
|
344
|
+
sanitized = sanitized.replace(/\.\.[\\/]/g, '');
|
|
345
|
+
// Remove leading '../' or '..\'
|
|
346
|
+
sanitized = sanitized.replace(/^\.\.[\\/]+/, '');
|
|
347
|
+
}
|
|
348
|
+
// HTML escape
|
|
349
|
+
if (escapeHtml) {
|
|
350
|
+
sanitized = sanitized
|
|
351
|
+
.replace(/&/g, '&')
|
|
352
|
+
.replace(/</g, '<')
|
|
353
|
+
.replace(/>/g, '>')
|
|
354
|
+
.replace(/"/g, '"')
|
|
355
|
+
.replace(/'/g, ''');
|
|
356
|
+
}
|
|
357
|
+
return sanitized;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Safely test a string against a pattern, preventing RegExp injection (SMI-722)
|
|
361
|
+
*
|
|
362
|
+
* Tries exact match, prefix match, and regex match (with error handling).
|
|
363
|
+
* Falls back to includes check if regex is invalid.
|
|
364
|
+
*
|
|
365
|
+
* @param value - Value to test
|
|
366
|
+
* @param pattern - Pattern to match (string or regex)
|
|
367
|
+
* @returns True if value matches pattern
|
|
368
|
+
*
|
|
369
|
+
* @example
|
|
370
|
+
* ```typescript
|
|
371
|
+
* safePatternMatch('node_modules', 'node_modules') // true (exact)
|
|
372
|
+
* safePatternMatch('node_modules/pkg', 'node_') // true (prefix)
|
|
373
|
+
* safePatternMatch('test.js', '\\.js$') // true (regex)
|
|
374
|
+
* safePatternMatch('test.js', '(evil') // false (invalid regex, falls back)
|
|
375
|
+
* ```
|
|
376
|
+
*/
|
|
377
|
+
export function safePatternMatch(value, pattern) {
|
|
378
|
+
// Exact match
|
|
379
|
+
if (value === pattern) {
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
382
|
+
// Check if pattern looks like a regex (contains special chars)
|
|
383
|
+
// If it's a simple alphanumeric pattern, only do prefix matching
|
|
384
|
+
const isLikelyRegex = /[\\^$.*+?()[\]{}|]/.test(pattern);
|
|
385
|
+
if (!isLikelyRegex) {
|
|
386
|
+
// Simple pattern - only match as prefix
|
|
387
|
+
return value.startsWith(pattern);
|
|
388
|
+
}
|
|
389
|
+
// Try regex match with error handling for patterns that look like regex
|
|
390
|
+
try {
|
|
391
|
+
const regex = new RegExp(pattern);
|
|
392
|
+
return regex.test(value);
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
// Invalid regex - fall back to safe includes check
|
|
396
|
+
return value.includes(pattern);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Validate that patterns array is safe to use
|
|
401
|
+
*
|
|
402
|
+
* Checks for potentially dangerous regex patterns that could cause ReDoS.
|
|
403
|
+
*
|
|
404
|
+
* @param patterns - Array of patterns to validate
|
|
405
|
+
* @returns Array of validation warnings (empty if all patterns are safe)
|
|
406
|
+
*
|
|
407
|
+
* @example
|
|
408
|
+
* ```typescript
|
|
409
|
+
* validatePatterns(['node_modules', '\\.js$']) // []
|
|
410
|
+
* validatePatterns(['(a+)+b']) // ['Pattern may cause ReDoS: (a+)+b']
|
|
411
|
+
* ```
|
|
412
|
+
*/
|
|
413
|
+
export function validatePatterns(patterns) {
|
|
414
|
+
const warnings = [];
|
|
415
|
+
for (const pattern of patterns) {
|
|
416
|
+
// Check for potentially dangerous nested quantifiers (ReDoS)
|
|
417
|
+
if (/(\(.*\+.*\))\+/.test(pattern) || /(\(.*\*.*\))\*/.test(pattern)) {
|
|
418
|
+
warnings.push(`Pattern may cause ReDoS (nested quantifiers): ${pattern}`);
|
|
419
|
+
}
|
|
420
|
+
// Check for extremely long patterns
|
|
421
|
+
if (pattern.length > 1000) {
|
|
422
|
+
warnings.push(`Pattern is suspiciously long (${pattern.length} chars): ${pattern.slice(0, 50)}...`);
|
|
423
|
+
}
|
|
424
|
+
// Try to compile as regex to check validity
|
|
425
|
+
try {
|
|
426
|
+
new RegExp(pattern);
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
warnings.push(`Invalid regex pattern: ${pattern}`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return warnings;
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"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"}
|