@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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UsageAnalyticsService - Epic 3: Attribution During Use
|
|
3
|
+
*
|
|
4
|
+
* Implements:
|
|
5
|
+
* - Local SQLite analytics storage
|
|
6
|
+
* - Usage tracking API with 30-day rolling window
|
|
7
|
+
* - Export functionality (JSON, CSV)
|
|
8
|
+
* - Value summary reports
|
|
9
|
+
*/
|
|
10
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
11
|
+
import type { UsageEvent, UsageEventInput, UsageAnalyticsSummary, ExportFormat } from './types.js';
|
|
12
|
+
export interface UsageStatsOptions {
|
|
13
|
+
startDate?: string;
|
|
14
|
+
endDate?: string;
|
|
15
|
+
skillId?: string;
|
|
16
|
+
userId?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class UsageAnalyticsService {
|
|
19
|
+
private repo;
|
|
20
|
+
private readonly RETENTION_DAYS;
|
|
21
|
+
constructor(db: DatabaseType);
|
|
22
|
+
/**
|
|
23
|
+
* Track a skill usage event
|
|
24
|
+
*/
|
|
25
|
+
trackUsage(input: UsageEventInput): UsageEvent;
|
|
26
|
+
/**
|
|
27
|
+
* Get usage summary for a time period (defaults to last 30 days)
|
|
28
|
+
*/
|
|
29
|
+
getUsageSummary(options?: UsageStatsOptions): UsageAnalyticsSummary;
|
|
30
|
+
/**
|
|
31
|
+
* Get weekly digest for a user
|
|
32
|
+
*/
|
|
33
|
+
getWeeklyDigest(userId: string): UsageAnalyticsSummary;
|
|
34
|
+
/**
|
|
35
|
+
* Get monthly summary for a user
|
|
36
|
+
*/
|
|
37
|
+
getMonthlySummary(userId: string): UsageAnalyticsSummary;
|
|
38
|
+
/**
|
|
39
|
+
* Export usage data in specified format
|
|
40
|
+
*/
|
|
41
|
+
exportUsageData(options: UsageStatsOptions & {
|
|
42
|
+
format: ExportFormat;
|
|
43
|
+
}): string;
|
|
44
|
+
/**
|
|
45
|
+
* Clean up events older than retention period
|
|
46
|
+
*/
|
|
47
|
+
cleanupOldData(): number;
|
|
48
|
+
private getDateRange;
|
|
49
|
+
private getAllEvents;
|
|
50
|
+
private groupEventsByType;
|
|
51
|
+
private calculateAverageValueScore;
|
|
52
|
+
private getTopSkills;
|
|
53
|
+
private convertToCSV;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=UsageAnalyticsService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsageAnalyticsService.d.ts","sourceRoot":"","sources":["../../../src/analytics/UsageAnalyticsService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAElG,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAK;gBAExB,EAAE,EAAE,YAAY;IAI5B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU;IAI9C;;OAEG;IACH,eAAe,CAAC,OAAO,GAAE,iBAAsB,GAAG,qBAAqB;IAiCvE;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAYtD;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAYxD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG;QAAE,MAAM,EAAE,YAAY,CAAA;KAAE,GAAG,MAAM;IAkB9E;;OAEG;IACH,cAAc,IAAI,MAAM;IAMxB,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,YAAY;CA8BrB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UsageAnalyticsService - Epic 3: Attribution During Use
|
|
3
|
+
*
|
|
4
|
+
* Implements:
|
|
5
|
+
* - Local SQLite analytics storage
|
|
6
|
+
* - Usage tracking API with 30-day rolling window
|
|
7
|
+
* - Export functionality (JSON, CSV)
|
|
8
|
+
* - Value summary reports
|
|
9
|
+
*/
|
|
10
|
+
import { AnalyticsRepository } from './AnalyticsRepository.js';
|
|
11
|
+
export class UsageAnalyticsService {
|
|
12
|
+
repo;
|
|
13
|
+
RETENTION_DAYS = 30;
|
|
14
|
+
constructor(db) {
|
|
15
|
+
this.repo = new AnalyticsRepository(db);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Track a skill usage event
|
|
19
|
+
*/
|
|
20
|
+
trackUsage(input) {
|
|
21
|
+
return this.repo.recordUsageEvent(input);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get usage summary for a time period (defaults to last 30 days)
|
|
25
|
+
*/
|
|
26
|
+
getUsageSummary(options = {}) {
|
|
27
|
+
const { startDate, endDate, skillId, userId } = this.getDateRange(options);
|
|
28
|
+
// Get all events in the period
|
|
29
|
+
let events;
|
|
30
|
+
if (skillId) {
|
|
31
|
+
events = this.repo.getUsageEventsForSkill(skillId, startDate, endDate);
|
|
32
|
+
}
|
|
33
|
+
else if (userId) {
|
|
34
|
+
events = this.repo.getUsageEventsForUser(userId, startDate, endDate);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Get all events (for stakeholder view)
|
|
38
|
+
events = this.getAllEvents(startDate, endDate);
|
|
39
|
+
}
|
|
40
|
+
// Calculate statistics
|
|
41
|
+
const eventsByType = this.groupEventsByType(events);
|
|
42
|
+
const uniqueUsers = new Set(events.map((e) => e.userId)).size;
|
|
43
|
+
const uniqueSkills = new Set(events.map((e) => e.skillId)).size;
|
|
44
|
+
const avgValueScore = this.calculateAverageValueScore(events);
|
|
45
|
+
const topSkills = this.getTopSkills(events, 10);
|
|
46
|
+
return {
|
|
47
|
+
periodStart: startDate,
|
|
48
|
+
periodEnd: endDate,
|
|
49
|
+
totalEvents: events.length,
|
|
50
|
+
eventsByType,
|
|
51
|
+
uniqueUsers,
|
|
52
|
+
uniqueSkills,
|
|
53
|
+
avgValueScore,
|
|
54
|
+
topSkills,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get weekly digest for a user
|
|
59
|
+
*/
|
|
60
|
+
getWeeklyDigest(userId) {
|
|
61
|
+
const endDate = new Date();
|
|
62
|
+
const startDate = new Date(endDate);
|
|
63
|
+
startDate.setDate(startDate.getDate() - 7);
|
|
64
|
+
return this.getUsageSummary({
|
|
65
|
+
userId,
|
|
66
|
+
startDate: startDate.toISOString(),
|
|
67
|
+
endDate: endDate.toISOString(),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get monthly summary for a user
|
|
72
|
+
*/
|
|
73
|
+
getMonthlySummary(userId) {
|
|
74
|
+
const endDate = new Date();
|
|
75
|
+
const startDate = new Date(endDate);
|
|
76
|
+
startDate.setDate(startDate.getDate() - 30);
|
|
77
|
+
return this.getUsageSummary({
|
|
78
|
+
userId,
|
|
79
|
+
startDate: startDate.toISOString(),
|
|
80
|
+
endDate: endDate.toISOString(),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Export usage data in specified format
|
|
85
|
+
*/
|
|
86
|
+
exportUsageData(options) {
|
|
87
|
+
const summary = this.getUsageSummary(options);
|
|
88
|
+
switch (options.format) {
|
|
89
|
+
case 'json':
|
|
90
|
+
return JSON.stringify(summary, null, 2);
|
|
91
|
+
case 'csv':
|
|
92
|
+
return this.convertToCSV(summary);
|
|
93
|
+
case 'pdf':
|
|
94
|
+
throw new Error('PDF export not yet implemented. Use json or csv format.');
|
|
95
|
+
default:
|
|
96
|
+
throw new Error(`Unsupported export format: ${options.format}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Clean up events older than retention period
|
|
101
|
+
*/
|
|
102
|
+
cleanupOldData() {
|
|
103
|
+
return this.repo.cleanupOldEvents(this.RETENTION_DAYS);
|
|
104
|
+
}
|
|
105
|
+
// ==================== Private Helper Methods ====================
|
|
106
|
+
getDateRange(options) {
|
|
107
|
+
const endDate = options.endDate || new Date().toISOString();
|
|
108
|
+
let startDate = options.startDate;
|
|
109
|
+
if (!startDate) {
|
|
110
|
+
const date = new Date(endDate);
|
|
111
|
+
date.setDate(date.getDate() - this.RETENTION_DAYS);
|
|
112
|
+
startDate = date.toISOString();
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
startDate,
|
|
116
|
+
endDate,
|
|
117
|
+
skillId: options.skillId,
|
|
118
|
+
userId: options.userId,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
getAllEvents(startDate, endDate) {
|
|
122
|
+
return this.repo.getAllUsageEvents(startDate, endDate);
|
|
123
|
+
}
|
|
124
|
+
groupEventsByType(events) {
|
|
125
|
+
const groups = {
|
|
126
|
+
activation: 0,
|
|
127
|
+
invocation: 0,
|
|
128
|
+
success: 0,
|
|
129
|
+
failure: 0,
|
|
130
|
+
};
|
|
131
|
+
for (const event of events) {
|
|
132
|
+
groups[event.eventType] = (groups[event.eventType] || 0) + 1;
|
|
133
|
+
}
|
|
134
|
+
return groups;
|
|
135
|
+
}
|
|
136
|
+
calculateAverageValueScore(events) {
|
|
137
|
+
// Filter events that have a valid valueScore (not null or undefined)
|
|
138
|
+
const eventsWithScore = events.filter((e) => e.valueScore != null);
|
|
139
|
+
if (eventsWithScore.length === 0)
|
|
140
|
+
return 0;
|
|
141
|
+
const sum = eventsWithScore.reduce((acc, e) => acc + (e.valueScore || 0), 0);
|
|
142
|
+
return sum / eventsWithScore.length;
|
|
143
|
+
}
|
|
144
|
+
getTopSkills(events, limit) {
|
|
145
|
+
const counts = new Map();
|
|
146
|
+
for (const event of events) {
|
|
147
|
+
counts.set(event.skillId, (counts.get(event.skillId) || 0) + 1);
|
|
148
|
+
}
|
|
149
|
+
return Array.from(counts.entries())
|
|
150
|
+
.map(([skillId, count]) => ({ skillId, count }))
|
|
151
|
+
.sort((a, b) => b.count - a.count)
|
|
152
|
+
.slice(0, limit);
|
|
153
|
+
}
|
|
154
|
+
convertToCSV(summary) {
|
|
155
|
+
const lines = [];
|
|
156
|
+
// Header
|
|
157
|
+
lines.push('Metric,Value');
|
|
158
|
+
// Summary stats
|
|
159
|
+
lines.push(`Period Start,${summary.periodStart}`);
|
|
160
|
+
lines.push(`Period End,${summary.periodEnd}`);
|
|
161
|
+
lines.push(`Total Events,${summary.totalEvents}`);
|
|
162
|
+
lines.push(`Unique Users,${summary.uniqueUsers}`);
|
|
163
|
+
lines.push(`Unique Skills,${summary.uniqueSkills}`);
|
|
164
|
+
lines.push(`Average Value Score,${summary.avgValueScore.toFixed(2)}`);
|
|
165
|
+
// Events by type
|
|
166
|
+
lines.push('');
|
|
167
|
+
lines.push('Event Type,Count');
|
|
168
|
+
for (const [type, count] of Object.entries(summary.eventsByType)) {
|
|
169
|
+
lines.push(`${type},${count}`);
|
|
170
|
+
}
|
|
171
|
+
// Top skills
|
|
172
|
+
lines.push('');
|
|
173
|
+
lines.push('Skill ID,Usage Count');
|
|
174
|
+
for (const { skillId, count } of summary.topSkills) {
|
|
175
|
+
lines.push(`${skillId},${count}`);
|
|
176
|
+
}
|
|
177
|
+
return lines.join('\n');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=UsageAnalyticsService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsageAnalyticsService.js","sourceRoot":"","sources":["../../../src/analytics/UsageAnalyticsService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-914: User Data Anonymization
|
|
3
|
+
* SMI-917: Per-installation salt for improved anonymization security
|
|
4
|
+
*
|
|
5
|
+
* Provides one-way hashing functions to anonymize user identifiers
|
|
6
|
+
* and project context without storing any PII.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Get the path to the installation-specific salt file
|
|
10
|
+
*
|
|
11
|
+
* @returns Path to ~/.skillsmith/anonymizer-salt
|
|
12
|
+
*/
|
|
13
|
+
export declare function getSaltPath(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Load existing salt or create a new one for this installation
|
|
16
|
+
*
|
|
17
|
+
* The salt is:
|
|
18
|
+
* - Generated once per installation (32 random bytes)
|
|
19
|
+
* - Stored at ~/.skillsmith/anonymizer-salt
|
|
20
|
+
* - Cached in memory after first load
|
|
21
|
+
* - Falls back to static salt if file operations fail
|
|
22
|
+
*
|
|
23
|
+
* @returns Buffer containing the salt
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadOrCreateSalt(): Buffer;
|
|
26
|
+
/**
|
|
27
|
+
* Clear the cached salt (primarily for testing)
|
|
28
|
+
*/
|
|
29
|
+
export declare function clearSaltCache(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Anonymize a user identifier using SHA-256 hash
|
|
32
|
+
*
|
|
33
|
+
* The hash is:
|
|
34
|
+
* - One-way: Cannot recover the original identifier
|
|
35
|
+
* - Consistent: Same input always produces same output
|
|
36
|
+
* - Truncated: 16 characters for storage efficiency
|
|
37
|
+
*
|
|
38
|
+
* @param identifier - The user identifier to anonymize (e.g., machine ID, username)
|
|
39
|
+
* @returns Anonymized 16-character hex string
|
|
40
|
+
*/
|
|
41
|
+
export declare function anonymizeUserId(identifier: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Hash project context to avoid storing PII
|
|
44
|
+
*
|
|
45
|
+
* Creates a deterministic hash of the project context object,
|
|
46
|
+
* allowing grouping of usage events by project type without
|
|
47
|
+
* storing actual project paths or names.
|
|
48
|
+
*
|
|
49
|
+
* @param context - Object containing project context (framework, language, etc.)
|
|
50
|
+
* @returns 8-character hex hash of the context
|
|
51
|
+
*/
|
|
52
|
+
export declare function hashProjectContext(context: Record<string, unknown>): string;
|
|
53
|
+
//# sourceMappingURL=anonymizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymizer.d.ts","sourceRoot":"","sources":["../../../src/analytics/anonymizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkBH;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAmBzC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAS3E"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-914: User Data Anonymization
|
|
3
|
+
* SMI-917: Per-installation salt for improved anonymization security
|
|
4
|
+
*
|
|
5
|
+
* Provides one-way hashing functions to anonymize user identifiers
|
|
6
|
+
* and project context without storing any PII.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash, randomBytes } from 'crypto';
|
|
9
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
import { CONTEXT_HASH_LENGTH, USER_ID_HASH_LENGTH } from './constants.js';
|
|
13
|
+
/**
|
|
14
|
+
* Fallback salt used when file operations fail
|
|
15
|
+
*/
|
|
16
|
+
const FALLBACK_SALT = 'skillsmith-fallback-salt-v1';
|
|
17
|
+
/**
|
|
18
|
+
* Cached salt buffer to avoid repeated file reads
|
|
19
|
+
*/
|
|
20
|
+
let cachedSalt = null;
|
|
21
|
+
/**
|
|
22
|
+
* Get the path to the installation-specific salt file
|
|
23
|
+
*
|
|
24
|
+
* @returns Path to ~/.skillsmith/anonymizer-salt
|
|
25
|
+
*/
|
|
26
|
+
export function getSaltPath() {
|
|
27
|
+
return join(homedir(), '.skillsmith', 'anonymizer-salt');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Load existing salt or create a new one for this installation
|
|
31
|
+
*
|
|
32
|
+
* The salt is:
|
|
33
|
+
* - Generated once per installation (32 random bytes)
|
|
34
|
+
* - Stored at ~/.skillsmith/anonymizer-salt
|
|
35
|
+
* - Cached in memory after first load
|
|
36
|
+
* - Falls back to static salt if file operations fail
|
|
37
|
+
*
|
|
38
|
+
* @returns Buffer containing the salt
|
|
39
|
+
*/
|
|
40
|
+
export function loadOrCreateSalt() {
|
|
41
|
+
if (cachedSalt) {
|
|
42
|
+
return cachedSalt;
|
|
43
|
+
}
|
|
44
|
+
const saltPath = getSaltPath();
|
|
45
|
+
try {
|
|
46
|
+
if (existsSync(saltPath)) {
|
|
47
|
+
cachedSalt = readFileSync(saltPath);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
mkdirSync(join(homedir(), '.skillsmith'), { recursive: true });
|
|
51
|
+
cachedSalt = randomBytes(32);
|
|
52
|
+
writeFileSync(saltPath, cachedSalt);
|
|
53
|
+
}
|
|
54
|
+
return cachedSalt;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Fallback to static salt if file operations fail
|
|
58
|
+
return Buffer.from(FALLBACK_SALT);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Clear the cached salt (primarily for testing)
|
|
63
|
+
*/
|
|
64
|
+
export function clearSaltCache() {
|
|
65
|
+
cachedSalt = null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Anonymize a user identifier using SHA-256 hash
|
|
69
|
+
*
|
|
70
|
+
* The hash is:
|
|
71
|
+
* - One-way: Cannot recover the original identifier
|
|
72
|
+
* - Consistent: Same input always produces same output
|
|
73
|
+
* - Truncated: 16 characters for storage efficiency
|
|
74
|
+
*
|
|
75
|
+
* @param identifier - The user identifier to anonymize (e.g., machine ID, username)
|
|
76
|
+
* @returns Anonymized 16-character hex string
|
|
77
|
+
*/
|
|
78
|
+
export function anonymizeUserId(identifier) {
|
|
79
|
+
if (!identifier || identifier.trim().length === 0) {
|
|
80
|
+
throw new Error('User identifier cannot be empty');
|
|
81
|
+
}
|
|
82
|
+
const salt = loadOrCreateSalt();
|
|
83
|
+
return createHash('sha256')
|
|
84
|
+
.update(identifier)
|
|
85
|
+
.update(salt)
|
|
86
|
+
.digest('hex')
|
|
87
|
+
.slice(0, USER_ID_HASH_LENGTH);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Hash project context to avoid storing PII
|
|
91
|
+
*
|
|
92
|
+
* Creates a deterministic hash of the project context object,
|
|
93
|
+
* allowing grouping of usage events by project type without
|
|
94
|
+
* storing actual project paths or names.
|
|
95
|
+
*
|
|
96
|
+
* @param context - Object containing project context (framework, language, etc.)
|
|
97
|
+
* @returns 8-character hex hash of the context
|
|
98
|
+
*/
|
|
99
|
+
export function hashProjectContext(context) {
|
|
100
|
+
if (!context || Object.keys(context).length === 0) {
|
|
101
|
+
return '00000000'; // Empty context hash
|
|
102
|
+
}
|
|
103
|
+
// Sort keys for deterministic output
|
|
104
|
+
const normalized = JSON.stringify(context, Object.keys(context).sort());
|
|
105
|
+
return createHash('sha256').update(normalized).digest('hex').slice(0, CONTEXT_HASH_LENGTH);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=anonymizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymizer.js","sourceRoot":"","sources":["../../../src/analytics/anonymizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEzE;;GAEG;AACH,MAAM,aAAa,GAAG,6BAA6B,CAAA;AAEnD;;GAEG;AACH,IAAI,UAAU,GAAkB,IAAI,CAAA;AAEpC;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAA;AAC1D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;QACrC,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC9D,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;YAC5B,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;QAClD,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,UAAU,GAAG,IAAI,CAAA;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAA;IAC/B,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAA;AAClC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgC;IACjE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,UAAU,CAAA,CAAC,qBAAqB;IACzC,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAEvE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAA;AAC5F,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-918: Analytics Constants
|
|
3
|
+
*
|
|
4
|
+
* Shared constants for analytics modules to eliminate magic numbers
|
|
5
|
+
* and improve code maintainability.
|
|
6
|
+
*/
|
|
7
|
+
/** Number of days to retain analytics data before cleanup */
|
|
8
|
+
export declare const RETENTION_DAYS = 30;
|
|
9
|
+
/** Cooldown period between suggestions in milliseconds */
|
|
10
|
+
export declare const SUGGESTION_COOLDOWN_MS: number;
|
|
11
|
+
/** Maximum suggestions per day per user */
|
|
12
|
+
export declare const MAX_SUGGESTIONS_PER_DAY = 3;
|
|
13
|
+
/** Length of truncated context hash */
|
|
14
|
+
export declare const CONTEXT_HASH_LENGTH = 8;
|
|
15
|
+
/** Milliseconds in one day */
|
|
16
|
+
export declare const MS_PER_DAY: number;
|
|
17
|
+
/** Length of truncated user ID hash */
|
|
18
|
+
export declare const USER_ID_HASH_LENGTH = 16;
|
|
19
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/analytics/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6DAA6D;AAC7D,eAAO,MAAM,cAAc,KAAK,CAAA;AAEhC,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,QAAgB,CAAA;AAEnD,2CAA2C;AAC3C,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAExC,uCAAuC;AACvC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,8BAA8B;AAC9B,eAAO,MAAM,UAAU,QAAsB,CAAA;AAE7C,uCAAuC;AACvC,eAAO,MAAM,mBAAmB,KAAK,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-918: Analytics Constants
|
|
3
|
+
*
|
|
4
|
+
* Shared constants for analytics modules to eliminate magic numbers
|
|
5
|
+
* and improve code maintainability.
|
|
6
|
+
*/
|
|
7
|
+
/** Number of days to retain analytics data before cleanup */
|
|
8
|
+
export const RETENTION_DAYS = 30;
|
|
9
|
+
/** Cooldown period between suggestions in milliseconds */
|
|
10
|
+
export const SUGGESTION_COOLDOWN_MS = 5 * 60 * 1000; // 5 minutes
|
|
11
|
+
/** Maximum suggestions per day per user */
|
|
12
|
+
export const MAX_SUGGESTIONS_PER_DAY = 3;
|
|
13
|
+
/** Length of truncated context hash */
|
|
14
|
+
export const CONTEXT_HASH_LENGTH = 8;
|
|
15
|
+
/** Milliseconds in one day */
|
|
16
|
+
export const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
17
|
+
/** Length of truncated user ID hash */
|
|
18
|
+
export const USER_ID_HASH_LENGTH = 16;
|
|
19
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/analytics/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAA;AAEhC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,YAAY;AAEhE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAA;AAExC,uCAAuC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAEpC,8BAA8B;AAC9B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAE7C,uCAAuC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Module - Phase 4 Product Strategy
|
|
3
|
+
*
|
|
4
|
+
* Exports all analytics infrastructure for:
|
|
5
|
+
* - Epic 3: Skill usage attribution and tracking
|
|
6
|
+
* - Epic 4: A/B testing and experimentation
|
|
7
|
+
* - Epic 4: ROI metrics and dashboards
|
|
8
|
+
* - SMI-914: Skill usage event tracking with anonymization
|
|
9
|
+
*/
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
export * from './schema.js';
|
|
12
|
+
export * from './AnalyticsRepository.js';
|
|
13
|
+
export * from './UsageAnalyticsService.js';
|
|
14
|
+
export * from './ExperimentService.js';
|
|
15
|
+
export * from './ROIDashboardService.js';
|
|
16
|
+
export * from './anonymizer.js';
|
|
17
|
+
export { AnalyticsStorage } from './storage.js';
|
|
18
|
+
export { UsageTracker, type UsageTrackerOptions } from './usage-tracker.js';
|
|
19
|
+
export { MetricsAggregator } from './metrics-aggregator.js';
|
|
20
|
+
export type { AggregationPeriod, GlobalMetrics } from './metrics-aggregator.js';
|
|
21
|
+
export { MetricsExporter } from './metrics-exporter.js';
|
|
22
|
+
export type { MetricsExport, ExportOptions } from './metrics-exporter.js';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analytics/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AACtC,cAAc,0BAA0B,CAAA;AAGxC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Module - Phase 4 Product Strategy
|
|
3
|
+
*
|
|
4
|
+
* Exports all analytics infrastructure for:
|
|
5
|
+
* - Epic 3: Skill usage attribution and tracking
|
|
6
|
+
* - Epic 4: A/B testing and experimentation
|
|
7
|
+
* - Epic 4: ROI metrics and dashboards
|
|
8
|
+
* - SMI-914: Skill usage event tracking with anonymization
|
|
9
|
+
*/
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
export * from './schema.js';
|
|
12
|
+
export * from './AnalyticsRepository.js';
|
|
13
|
+
export * from './UsageAnalyticsService.js';
|
|
14
|
+
export * from './ExperimentService.js';
|
|
15
|
+
export * from './ROIDashboardService.js';
|
|
16
|
+
// SMI-914: Skill usage event tracking
|
|
17
|
+
export * from './anonymizer.js';
|
|
18
|
+
export { AnalyticsStorage } from './storage.js';
|
|
19
|
+
export { UsageTracker } from './usage-tracker.js';
|
|
20
|
+
// SMI-915: Metrics aggregation and export
|
|
21
|
+
export { MetricsAggregator } from './metrics-aggregator.js';
|
|
22
|
+
export { MetricsExporter } from './metrics-exporter.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analytics/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AACtC,cAAc,0BAA0B,CAAA;AAExC,sCAAsC;AACtC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,YAAY,EAA4B,MAAM,oBAAoB,CAAA;AAE3E,0CAA0C;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-915: Metrics Aggregator
|
|
3
|
+
*
|
|
4
|
+
* Aggregates skill usage events into actionable metrics for value measurement.
|
|
5
|
+
* Provides:
|
|
6
|
+
* - Per-skill metrics aggregation
|
|
7
|
+
* - Global metrics across all skills
|
|
8
|
+
* - Retention rate calculation
|
|
9
|
+
* - Time-period filtering
|
|
10
|
+
*/
|
|
11
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
12
|
+
import type { SkillMetrics } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Time period for aggregation queries
|
|
15
|
+
*/
|
|
16
|
+
export interface AggregationPeriod {
|
|
17
|
+
/** Start timestamp in milliseconds */
|
|
18
|
+
start: number;
|
|
19
|
+
/** End timestamp in milliseconds */
|
|
20
|
+
end: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Global metrics across all skills
|
|
24
|
+
*/
|
|
25
|
+
export interface GlobalMetrics {
|
|
26
|
+
/** Total number of skill invocations */
|
|
27
|
+
totalInvocations: number;
|
|
28
|
+
/** Count of unique users */
|
|
29
|
+
uniqueUsers: number;
|
|
30
|
+
/** Overall success rate (0-1) */
|
|
31
|
+
overallSuccessRate: number;
|
|
32
|
+
/** Average task duration in milliseconds */
|
|
33
|
+
avgTaskDuration: number;
|
|
34
|
+
/** Top skills by invocation count */
|
|
35
|
+
topSkills: Array<{
|
|
36
|
+
skillId: string;
|
|
37
|
+
invocations: number;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Aggregates skill usage metrics from the database
|
|
42
|
+
*/
|
|
43
|
+
export declare class MetricsAggregator {
|
|
44
|
+
private db;
|
|
45
|
+
/**
|
|
46
|
+
* Create a metrics aggregator
|
|
47
|
+
*
|
|
48
|
+
* @param db - SQLite database instance
|
|
49
|
+
*/
|
|
50
|
+
constructor(db: DatabaseType);
|
|
51
|
+
/**
|
|
52
|
+
* Get metrics for a specific skill
|
|
53
|
+
*
|
|
54
|
+
* @param skillId - The skill identifier
|
|
55
|
+
* @param period - Optional time period filter
|
|
56
|
+
* @returns Aggregated metrics for the skill
|
|
57
|
+
*/
|
|
58
|
+
getSkillMetrics(skillId: string, period?: AggregationPeriod): SkillMetrics;
|
|
59
|
+
/**
|
|
60
|
+
* Get metrics for all skills
|
|
61
|
+
*
|
|
62
|
+
* @param period - Optional time period filter
|
|
63
|
+
* @returns Array of metrics for each skill
|
|
64
|
+
*/
|
|
65
|
+
getAllSkillMetrics(period?: AggregationPeriod): SkillMetrics[];
|
|
66
|
+
/**
|
|
67
|
+
* Get global metrics across all skills
|
|
68
|
+
*
|
|
69
|
+
* @param period - Optional time period filter
|
|
70
|
+
* @returns Aggregated metrics for all skills
|
|
71
|
+
*/
|
|
72
|
+
getGlobalMetrics(period?: AggregationPeriod): GlobalMetrics;
|
|
73
|
+
/**
|
|
74
|
+
* Calculate retention rate (users who used skill again within N days)
|
|
75
|
+
*
|
|
76
|
+
* @param skillId - The skill identifier
|
|
77
|
+
* @param days - Retention window in days (default: 7)
|
|
78
|
+
* @returns Retention rate (0-1)
|
|
79
|
+
*/
|
|
80
|
+
getRetentionRate(skillId: string, days?: number): number;
|
|
81
|
+
/**
|
|
82
|
+
* Get skills with usage in the specified period
|
|
83
|
+
*
|
|
84
|
+
* @param period - Time period filter
|
|
85
|
+
* @returns Array of skill IDs with usage
|
|
86
|
+
*/
|
|
87
|
+
getActiveSkills(period: AggregationPeriod): string[];
|
|
88
|
+
/**
|
|
89
|
+
* Get the date range of available data
|
|
90
|
+
*
|
|
91
|
+
* @returns Object with min and max timestamps, or null if no data
|
|
92
|
+
*/
|
|
93
|
+
getDataRange(): {
|
|
94
|
+
minTimestamp: number;
|
|
95
|
+
maxTimestamp: number;
|
|
96
|
+
} | null;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=metrics-aggregator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-aggregator.d.ts","sourceRoot":"","sources":["../../../src/analytics/metrics-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAA;IACxB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,iCAAiC;IACjC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAA;IACvB,qCAAqC;IACrC,SAAS,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3D;AA0CD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAc;IAExB;;;;OAIG;gBACS,EAAE,EAAE,YAAY;IAI5B;;;;;;OAMG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,YAAY;IAgC1E;;;;;OAKG;IACH,kBAAkB,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,YAAY,EAAE;IAY9D;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,aAAa;IAyC3D;;;;;;OAMG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,MAAM;IAgC3D;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE;IAcpD;;;;OAIG;IACH,YAAY,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAmBtE"}
|