@skillsmith/core 0.1.2 → 2.0.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/README.md +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.d.ts +4 -134
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.js +7 -315
- package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/framework-detector.d.ts +47 -0
- package/dist/src/analysis/framework-detector.d.ts.map +1 -0
- package/dist/src/analysis/framework-detector.js +151 -0
- package/dist/src/analysis/framework-detector.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +29 -2
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +53 -2
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/parsers.d.ts +43 -0
- package/dist/src/analysis/parsers.d.ts.map +1 -0
- package/dist/src/analysis/parsers.js +219 -0
- package/dist/src/analysis/parsers.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +201 -0
- package/dist/src/analysis/types.d.ts.map +1 -0
- package/dist/src/analysis/types.js +46 -0
- package/dist/src/analysis/types.js.map +1 -0
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.js +4 -4
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +131 -0
- package/dist/src/api/cache.d.ts.map +1 -0
- package/dist/src/api/cache.js +264 -0
- package/dist/src/api/cache.js.map +1 -0
- package/dist/src/api/client.d.ts +282 -0
- package/dist/src/api/client.d.ts.map +1 -0
- package/dist/src/api/client.js +417 -0
- package/dist/src/api/client.js.map +1 -0
- package/dist/src/api/index.d.ts +12 -0
- package/dist/src/api/index.d.ts.map +1 -0
- package/dist/src/api/index.js +17 -0
- package/dist/src/api/index.js.map +1 -0
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/BenchmarkRunner.d.ts +6 -175
- package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js +6 -123
- package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.d.ts +4 -262
- package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.js +4 -400
- package/dist/src/benchmarks/MemoryProfiler.js.map +1 -1
- package/dist/src/benchmarks/comparator.d.ts +38 -0
- package/dist/src/benchmarks/comparator.d.ts.map +1 -0
- package/dist/src/benchmarks/comparator.js +81 -0
- package/dist/src/benchmarks/comparator.js.map +1 -0
- package/dist/src/benchmarks/formatters.d.ts +30 -0
- package/dist/src/benchmarks/formatters.d.ts.map +1 -0
- package/dist/src/benchmarks/formatters.js +88 -0
- package/dist/src/benchmarks/formatters.js.map +1 -0
- package/dist/src/benchmarks/index.d.ts +5 -1
- package/dist/src/benchmarks/index.d.ts.map +1 -1
- package/dist/src/benchmarks/index.js +9 -2
- package/dist/src/benchmarks/index.js.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts +165 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js +312 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts +64 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.js +95 -0
- package/dist/src/benchmarks/memory/baseline-manager.js.map +1 -0
- package/dist/src/benchmarks/memory/index.d.ts +12 -0
- package/dist/src/benchmarks/memory/index.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/index.js +12 -0
- package/dist/src/benchmarks/memory/index.js.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts +23 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.js +46 -0
- package/dist/src/benchmarks/memory/leak-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts +17 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.js +56 -0
- package/dist/src/benchmarks/memory/regression-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/types.d.ts +111 -0
- package/dist/src/benchmarks/memory/types.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/types.js +7 -0
- package/dist/src/benchmarks/memory/types.js.map +1 -0
- package/dist/src/benchmarks/memory/utils.d.ts +17 -0
- package/dist/src/benchmarks/memory/utils.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/utils.js +29 -0
- package/dist/src/benchmarks/memory/utils.js.map +1 -0
- package/dist/src/benchmarks/types.d.ts +175 -0
- package/dist/src/benchmarks/types.d.ts.map +1 -0
- package/dist/src/benchmarks/types.js +20 -0
- package/dist/src/benchmarks/types.js.map +1 -0
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/QuarantineRepository.d.ts +4 -251
- package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/QuarantineRepository.js +4 -441
- package/dist/src/repositories/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +168 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js +341 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -0
- package/dist/src/repositories/quarantine/index.d.ts +10 -0
- package/dist/src/repositories/quarantine/index.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/index.js +10 -0
- package/dist/src/repositories/quarantine/index.js.map +1 -0
- package/dist/src/repositories/quarantine/queries.d.ts +58 -0
- package/dist/src/repositories/quarantine/queries.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/queries.js +88 -0
- package/dist/src/repositories/quarantine/queries.js.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts +44 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.js +87 -0
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -0
- package/dist/src/repositories/quarantine/types.d.ts +155 -0
- package/dist/src/repositories/quarantine/types.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/types.js +13 -0
- package/dist/src/repositories/quarantine/types.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +7 -43
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/checkpoint.d.ts +21 -0
- package/dist/src/scripts/github-import/checkpoint.d.ts.map +1 -0
- package/dist/src/scripts/github-import/checkpoint.js +52 -0
- package/dist/src/scripts/github-import/checkpoint.js.map +1 -0
- package/dist/src/scripts/github-import/deduplication.d.ts +15 -0
- package/dist/src/scripts/github-import/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/github-import/deduplication.js +33 -0
- package/dist/src/scripts/github-import/deduplication.js.map +1 -0
- package/dist/src/scripts/github-import/github-client.d.ts +29 -0
- package/dist/src/scripts/github-import/github-client.d.ts.map +1 -0
- package/dist/src/scripts/github-import/github-client.js +184 -0
- package/dist/src/scripts/github-import/github-client.js.map +1 -0
- package/dist/src/scripts/github-import/index.d.ts +29 -0
- package/dist/src/scripts/github-import/index.d.ts.map +1 -0
- package/dist/src/scripts/github-import/index.js +198 -0
- package/dist/src/scripts/github-import/index.js.map +1 -0
- package/dist/src/scripts/github-import/output.d.ts +12 -0
- package/dist/src/scripts/github-import/output.d.ts.map +1 -0
- package/dist/src/scripts/github-import/output.js +34 -0
- package/dist/src/scripts/github-import/output.js.map +1 -0
- package/dist/src/scripts/github-import/types.d.ts +108 -0
- package/dist/src/scripts/github-import/types.d.ts.map +1 -0
- package/dist/src/scripts/github-import/types.js +44 -0
- package/dist/src/scripts/github-import/types.js.map +1 -0
- package/dist/src/scripts/github-import/utils.d.ts +13 -0
- package/dist/src/scripts/github-import/utils.d.ts.map +1 -0
- package/dist/src/scripts/github-import/utils.js +28 -0
- package/dist/src/scripts/github-import/utils.js.map +1 -0
- package/dist/src/scripts/import-github-skills.d.ts +3 -12
- package/dist/src/scripts/import-github-skills.d.ts.map +1 -1
- package/dist/src/scripts/import-github-skills.js +18 -398
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/scan-imported-skills.d.ts +7 -7
- package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
- package/dist/src/scripts/scan-imported-skills.js +8 -397
- package/dist/src/scripts/scan-imported-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/categorizer.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/categorizer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/categorizer.js +61 -0
- package/dist/src/scripts/skill-scanner/categorizer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js +90 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/index.d.ts +22 -0
- package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/index.js +43 -0
- package/dist/src/scripts/skill-scanner/index.js.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.js +104 -0
- package/dist/src/scripts/skill-scanner/logger.js.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts +56 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.js +166 -0
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts +44 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.js +140 -0
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js +62 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/types.d.ts +98 -0
- package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/types.js +7 -0
- package/dist/src/scripts/skill-scanner/types.js.map +1 -0
- package/dist/src/scripts/validate-skills.d.ts +3 -172
- package/dist/src/scripts/validate-skills.d.ts.map +1 -1
- package/dist/src/scripts/validate-skills.js +6 -519
- package/dist/src/scripts/validate-skills.js.map +1 -1
- package/dist/src/scripts/validation/deduplication.d.ts +23 -0
- package/dist/src/scripts/validation/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/validation/deduplication.js +127 -0
- package/dist/src/scripts/validation/deduplication.js.map +1 -0
- package/dist/src/scripts/validation/field-validators.d.ts +9 -0
- package/dist/src/scripts/validation/field-validators.d.ts.map +1 -0
- package/dist/src/scripts/validation/field-validators.js +135 -0
- package/dist/src/scripts/validation/field-validators.js.map +1 -0
- package/dist/src/scripts/validation/index.d.ts +29 -0
- package/dist/src/scripts/validation/index.d.ts.map +1 -0
- package/dist/src/scripts/validation/index.js +83 -0
- package/dist/src/scripts/validation/index.js.map +1 -0
- package/dist/src/scripts/validation/normalizers.d.ts +29 -0
- package/dist/src/scripts/validation/normalizers.d.ts.map +1 -0
- package/dist/src/scripts/validation/normalizers.js +79 -0
- package/dist/src/scripts/validation/normalizers.js.map +1 -0
- package/dist/src/scripts/validation/pipeline.d.ts +13 -0
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -0
- package/dist/src/scripts/validation/pipeline.js +126 -0
- package/dist/src/scripts/validation/pipeline.js.map +1 -0
- package/dist/src/scripts/validation/types.d.ts +128 -0
- package/dist/src/scripts/validation/types.d.ts.map +1 -0
- package/dist/src/scripts/validation/types.js +43 -0
- package/dist/src/scripts/validation/types.js.map +1 -0
- package/dist/src/security/index.d.ts +5 -4
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +8 -2
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/rate-limiter/RateLimiter.d.ts +86 -0
- package/dist/src/security/rate-limiter/RateLimiter.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/RateLimiter.js +260 -0
- package/dist/src/security/rate-limiter/RateLimiter.js.map +1 -0
- package/dist/src/security/rate-limiter/constants.d.ts +15 -0
- package/dist/src/security/rate-limiter/constants.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/constants.js +15 -0
- package/dist/src/security/rate-limiter/constants.js.map +1 -0
- package/dist/src/security/rate-limiter/errors.d.ts +22 -0
- package/dist/src/security/rate-limiter/errors.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/errors.js +32 -0
- package/dist/src/security/rate-limiter/errors.js.map +1 -0
- package/dist/src/security/rate-limiter/index.d.ts +12 -0
- package/dist/src/security/rate-limiter/index.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/index.js +16 -0
- package/dist/src/security/rate-limiter/index.js.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts +55 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.js +144 -0
- package/dist/src/security/rate-limiter/metrics-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/presets.d.ts +52 -0
- package/dist/src/security/rate-limiter/presets.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/presets.js +53 -0
- package/dist/src/security/rate-limiter/presets.js.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts +59 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.js +189 -0
- package/dist/src/security/rate-limiter/queue-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/storage.d.ts +34 -0
- package/dist/src/security/rate-limiter/storage.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/storage.js +80 -0
- package/dist/src/security/rate-limiter/storage.js.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts +44 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.js +99 -0
- package/dist/src/security/rate-limiter/token-bucket.js.map +1 -0
- package/dist/src/security/rate-limiter/types.d.ts +104 -0
- package/dist/src/security/rate-limiter/types.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/types.js +7 -0
- package/dist/src/security/rate-limiter/types.js.map +1 -0
- package/dist/src/security/{scanner.d.ts → scanner/SecurityScanner.d.ts} +5 -62
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -0
- package/dist/src/security/{scanner.js → scanner/SecurityScanner.js} +6 -202
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +11 -0
- package/dist/src/security/scanner/index.d.ts.map +1 -0
- package/dist/src/security/scanner/index.js +14 -0
- package/dist/src/security/scanner/index.js.map +1 -0
- package/dist/src/security/scanner/patterns.d.ts +14 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.js +147 -0
- package/dist/src/security/scanner/patterns.js.map +1 -0
- package/dist/src/security/scanner/regex-utils.d.ts +33 -0
- package/dist/src/security/scanner/regex-utils.d.ts.map +1 -0
- package/dist/src/security/scanner/regex-utils.js +41 -0
- package/dist/src/security/scanner/regex-utils.js.map +1 -0
- package/dist/src/security/scanner/types.d.ts +63 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -0
- package/dist/src/security/scanner/types.js +7 -0
- package/dist/src/security/scanner/types.js.map +1 -0
- package/dist/src/security/scanner/weights.d.ts +15 -0
- package/dist/src/security/scanner/weights.d.ts.map +1 -0
- package/dist/src/security/scanner/weights.js +28 -0
- package/dist/src/security/scanner/weights.js.map +1 -0
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +5 -168
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +22 -91
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/session/health-checks.d.ts +37 -0
- package/dist/src/session/health-checks.d.ts.map +1 -0
- package/dist/src/session/health-checks.js +64 -0
- package/dist/src/session/health-checks.js.map +1 -0
- package/dist/src/session/health-types.d.ts +78 -0
- package/dist/src/session/health-types.d.ts.map +1 -0
- package/dist/src/session/health-types.js +16 -0
- package/dist/src/session/health-types.js.map +1 -0
- package/dist/src/session/index.d.ts +5 -1
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +9 -0
- package/dist/src/session/index.js.map +1 -1
- package/dist/src/session/metrics-collector.d.ts +23 -0
- package/dist/src/session/metrics-collector.d.ts.map +1 -0
- package/dist/src/session/metrics-collector.js +44 -0
- package/dist/src/session/metrics-collector.js.map +1 -0
- package/dist/src/session/typed-event-emitter.d.ts +70 -0
- package/dist/src/session/typed-event-emitter.d.ts.map +1 -0
- package/dist/src/session/typed-event-emitter.js +79 -0
- package/dist/src/session/typed-event-emitter.js.map +1 -0
- package/dist/src/sources/BaseSourceAdapter.d.ts +1 -1
- package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -1
- package/dist/src/sources/BaseSourceAdapter.js +2 -2
- package/dist/src/sources/BaseSourceAdapter.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +147 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -0
- package/dist/src/telemetry/posthog.js +213 -0
- package/dist/src/telemetry/posthog.js.map +1 -0
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/RateLimiter.test.js +4 -4
- package/dist/tests/RateLimiter.test.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/e2e/security/security.e2e.test.js +3 -3
- package/dist/tests/e2e/security/security.e2e.test.js.map +1 -1
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -5
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Response Cache
|
|
3
|
+
* @module api/cache
|
|
4
|
+
*
|
|
5
|
+
* SMI-1245: Caching layer for API responses
|
|
6
|
+
*
|
|
7
|
+
* Provides in-memory caching with TTL for offline support.
|
|
8
|
+
* Uses a simple LRU-like eviction strategy.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Cache configuration
|
|
12
|
+
*/
|
|
13
|
+
export interface CacheConfig {
|
|
14
|
+
/** Default TTL in milliseconds (default: 1 hour) */
|
|
15
|
+
defaultTtl?: number;
|
|
16
|
+
/** Max entries in cache (default: 1000) */
|
|
17
|
+
maxEntries?: number;
|
|
18
|
+
/** Enable cache statistics (default: false) */
|
|
19
|
+
enableStats?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Cache statistics
|
|
23
|
+
*/
|
|
24
|
+
export interface CacheStats {
|
|
25
|
+
hits: number;
|
|
26
|
+
misses: number;
|
|
27
|
+
entries: number;
|
|
28
|
+
evictions: number;
|
|
29
|
+
hitRate: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* TTL configuration for different endpoints
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEFAULT_TTL: Record<string, number>;
|
|
35
|
+
/**
|
|
36
|
+
* API Response Cache
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const cache = new ApiCache({ defaultTtl: 3600000 });
|
|
41
|
+
*
|
|
42
|
+
* // Cache a search result
|
|
43
|
+
* cache.set('search:testing', results, 'search');
|
|
44
|
+
*
|
|
45
|
+
* // Get from cache
|
|
46
|
+
* const cached = cache.get<ApiSearchResult[]>('search:testing');
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare class ApiCache {
|
|
50
|
+
private cache;
|
|
51
|
+
private defaultTtl;
|
|
52
|
+
private maxEntries;
|
|
53
|
+
private enableStats;
|
|
54
|
+
private hits;
|
|
55
|
+
private misses;
|
|
56
|
+
private evictions;
|
|
57
|
+
private operationCount;
|
|
58
|
+
private readonly PRUNE_INTERVAL;
|
|
59
|
+
constructor(config?: CacheConfig);
|
|
60
|
+
/**
|
|
61
|
+
* Generate cache key from endpoint and parameters
|
|
62
|
+
*/
|
|
63
|
+
static createKey(endpoint: string, params?: Record<string, unknown>): string;
|
|
64
|
+
/**
|
|
65
|
+
* Get item from cache
|
|
66
|
+
*/
|
|
67
|
+
get<T>(key: string): T | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Set item in cache
|
|
70
|
+
*/
|
|
71
|
+
set<T>(key: string, data: T, endpointType?: keyof typeof DEFAULT_TTL): void;
|
|
72
|
+
/**
|
|
73
|
+
* Check if key exists and is not expired
|
|
74
|
+
*/
|
|
75
|
+
has(key: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Delete item from cache
|
|
78
|
+
*/
|
|
79
|
+
delete(key: string): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Clear all cache entries
|
|
82
|
+
*/
|
|
83
|
+
clear(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Clear expired entries
|
|
86
|
+
*/
|
|
87
|
+
prune(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Invalidate entries matching a pattern.
|
|
90
|
+
*
|
|
91
|
+
* When a string is provided, it is treated as a literal string and
|
|
92
|
+
* special RegExp characters are escaped to prevent RegExp injection.
|
|
93
|
+
* To use regex patterns, pass a RegExp object directly.
|
|
94
|
+
*
|
|
95
|
+
* @param pattern - Literal string to match or RegExp for pattern matching
|
|
96
|
+
* @returns Number of entries invalidated
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* // Literal string matching (special chars are escaped)
|
|
101
|
+
* cache.invalidatePattern('search:user.name') // Matches exactly 'search:user.name'
|
|
102
|
+
*
|
|
103
|
+
* // RegExp for pattern matching
|
|
104
|
+
* cache.invalidatePattern(/^search:/) // Matches all keys starting with 'search:'
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
invalidatePattern(pattern: string | RegExp): number;
|
|
108
|
+
/**
|
|
109
|
+
* Get cache statistics
|
|
110
|
+
*/
|
|
111
|
+
getStats(): CacheStats;
|
|
112
|
+
/**
|
|
113
|
+
* Automatically prune expired entries every PRUNE_INTERVAL operations.
|
|
114
|
+
* SMI-1262: Prevents expired entries from accumulating until maxEntries is reached.
|
|
115
|
+
*/
|
|
116
|
+
private maybeAutoPrune;
|
|
117
|
+
/**
|
|
118
|
+
* Evict least recently used entries
|
|
119
|
+
*/
|
|
120
|
+
private evictLeastUsed;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a cache instance with default configuration
|
|
124
|
+
*/
|
|
125
|
+
export declare function createCache(config?: CacheConfig): ApiCache;
|
|
126
|
+
/**
|
|
127
|
+
* Get or create the global cache instance
|
|
128
|
+
*/
|
|
129
|
+
export declare function getGlobalCache(): ApiCache;
|
|
130
|
+
export default ApiCache;
|
|
131
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/api/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiCH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI9C,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,SAAS,CAAI;IAGrB,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAM;gBAEzB,MAAM,GAAE,WAAgB;IAOpC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAa5E;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAuBlC;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,OAAO,WAAW,GAAG,IAAI;IAmB3E;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAUzB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,KAAK,IAAI,MAAM;IAcf;;;;;;;;;;;;;;;;;;OAkBG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM;IAcnD;;OAEG;IACH,QAAQ,IAAI,UAAU;IAWtB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAwBvB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,CAE1D;AAOD;;GAEG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAKzC;AAED,eAAe,QAAQ,CAAA"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Response Cache
|
|
3
|
+
* @module api/cache
|
|
4
|
+
*
|
|
5
|
+
* SMI-1245: Caching layer for API responses
|
|
6
|
+
*
|
|
7
|
+
* Provides in-memory caching with TTL for offline support.
|
|
8
|
+
* Uses a simple LRU-like eviction strategy.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Escape special RegExp characters in a string.
|
|
12
|
+
*
|
|
13
|
+
* This prevents RegExp injection when user-provided strings are
|
|
14
|
+
* used to construct regular expressions.
|
|
15
|
+
*
|
|
16
|
+
* @param str - The string to escape
|
|
17
|
+
* @returns The escaped string safe for use in RegExp constructor
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* escapeRegExp('foo.bar') // Returns 'foo\\.bar'
|
|
22
|
+
* escapeRegExp('a*b+c?') // Returns 'a\\*b\\+c\\?'
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function escapeRegExp(str) {
|
|
26
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* TTL configuration for different endpoints
|
|
30
|
+
*/
|
|
31
|
+
export const DEFAULT_TTL = {
|
|
32
|
+
search: 60 * 60 * 1000, // 1 hour
|
|
33
|
+
getSkill: 24 * 60 * 60 * 1000, // 24 hours
|
|
34
|
+
recommend: 60 * 60 * 1000, // 1 hour
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* API Response Cache
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const cache = new ApiCache({ defaultTtl: 3600000 });
|
|
42
|
+
*
|
|
43
|
+
* // Cache a search result
|
|
44
|
+
* cache.set('search:testing', results, 'search');
|
|
45
|
+
*
|
|
46
|
+
* // Get from cache
|
|
47
|
+
* const cached = cache.get<ApiSearchResult[]>('search:testing');
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export class ApiCache {
|
|
51
|
+
cache;
|
|
52
|
+
defaultTtl;
|
|
53
|
+
maxEntries;
|
|
54
|
+
enableStats;
|
|
55
|
+
// Statistics
|
|
56
|
+
hits = 0;
|
|
57
|
+
misses = 0;
|
|
58
|
+
evictions = 0;
|
|
59
|
+
// Auto-pruning (SMI-1262)
|
|
60
|
+
operationCount = 0;
|
|
61
|
+
PRUNE_INTERVAL = 100;
|
|
62
|
+
constructor(config = {}) {
|
|
63
|
+
this.cache = new Map();
|
|
64
|
+
this.defaultTtl = config.defaultTtl ?? DEFAULT_TTL.search;
|
|
65
|
+
this.maxEntries = config.maxEntries ?? 1000;
|
|
66
|
+
this.enableStats = config.enableStats ?? false;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Generate cache key from endpoint and parameters
|
|
70
|
+
*/
|
|
71
|
+
static createKey(endpoint, params) {
|
|
72
|
+
if (!params || Object.keys(params).length === 0) {
|
|
73
|
+
return endpoint;
|
|
74
|
+
}
|
|
75
|
+
const sortedParams = Object.keys(params)
|
|
76
|
+
.sort()
|
|
77
|
+
.map((key) => `${key}=${JSON.stringify(params[key])}`)
|
|
78
|
+
.join('&');
|
|
79
|
+
return `${endpoint}?${sortedParams}`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get item from cache
|
|
83
|
+
*/
|
|
84
|
+
get(key) {
|
|
85
|
+
this.maybeAutoPrune();
|
|
86
|
+
const entry = this.cache.get(key);
|
|
87
|
+
if (!entry) {
|
|
88
|
+
if (this.enableStats)
|
|
89
|
+
this.misses++;
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
// Check if expired
|
|
93
|
+
if (Date.now() > entry.expiresAt) {
|
|
94
|
+
this.cache.delete(key);
|
|
95
|
+
if (this.enableStats)
|
|
96
|
+
this.misses++;
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
// Update hit count and statistics
|
|
100
|
+
entry.hitCount++;
|
|
101
|
+
if (this.enableStats)
|
|
102
|
+
this.hits++;
|
|
103
|
+
return entry.data;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Set item in cache
|
|
107
|
+
*/
|
|
108
|
+
set(key, data, endpointType) {
|
|
109
|
+
this.maybeAutoPrune();
|
|
110
|
+
// Evict if at capacity
|
|
111
|
+
if (this.cache.size >= this.maxEntries) {
|
|
112
|
+
this.evictLeastUsed();
|
|
113
|
+
}
|
|
114
|
+
const ttl = endpointType ? DEFAULT_TTL[endpointType] : this.defaultTtl;
|
|
115
|
+
const now = Date.now();
|
|
116
|
+
this.cache.set(key, {
|
|
117
|
+
data,
|
|
118
|
+
expiresAt: now + ttl,
|
|
119
|
+
createdAt: now,
|
|
120
|
+
hitCount: 0,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check if key exists and is not expired
|
|
125
|
+
*/
|
|
126
|
+
has(key) {
|
|
127
|
+
const entry = this.cache.get(key);
|
|
128
|
+
if (!entry)
|
|
129
|
+
return false;
|
|
130
|
+
if (Date.now() > entry.expiresAt) {
|
|
131
|
+
this.cache.delete(key);
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Delete item from cache
|
|
138
|
+
*/
|
|
139
|
+
delete(key) {
|
|
140
|
+
return this.cache.delete(key);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Clear all cache entries
|
|
144
|
+
*/
|
|
145
|
+
clear() {
|
|
146
|
+
this.cache.clear();
|
|
147
|
+
this.hits = 0;
|
|
148
|
+
this.misses = 0;
|
|
149
|
+
this.evictions = 0;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Clear expired entries
|
|
153
|
+
*/
|
|
154
|
+
prune() {
|
|
155
|
+
const now = Date.now();
|
|
156
|
+
let pruned = 0;
|
|
157
|
+
for (const [key, entry] of this.cache) {
|
|
158
|
+
if (now > entry.expiresAt) {
|
|
159
|
+
this.cache.delete(key);
|
|
160
|
+
pruned++;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return pruned;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Invalidate entries matching a pattern.
|
|
167
|
+
*
|
|
168
|
+
* When a string is provided, it is treated as a literal string and
|
|
169
|
+
* special RegExp characters are escaped to prevent RegExp injection.
|
|
170
|
+
* To use regex patterns, pass a RegExp object directly.
|
|
171
|
+
*
|
|
172
|
+
* @param pattern - Literal string to match or RegExp for pattern matching
|
|
173
|
+
* @returns Number of entries invalidated
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```typescript
|
|
177
|
+
* // Literal string matching (special chars are escaped)
|
|
178
|
+
* cache.invalidatePattern('search:user.name') // Matches exactly 'search:user.name'
|
|
179
|
+
*
|
|
180
|
+
* // RegExp for pattern matching
|
|
181
|
+
* cache.invalidatePattern(/^search:/) // Matches all keys starting with 'search:'
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
invalidatePattern(pattern) {
|
|
185
|
+
const regex = typeof pattern === 'string' ? new RegExp(escapeRegExp(pattern)) : pattern;
|
|
186
|
+
let invalidated = 0;
|
|
187
|
+
for (const key of this.cache.keys()) {
|
|
188
|
+
if (regex.test(key)) {
|
|
189
|
+
this.cache.delete(key);
|
|
190
|
+
invalidated++;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return invalidated;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get cache statistics
|
|
197
|
+
*/
|
|
198
|
+
getStats() {
|
|
199
|
+
const total = this.hits + this.misses;
|
|
200
|
+
return {
|
|
201
|
+
hits: this.hits,
|
|
202
|
+
misses: this.misses,
|
|
203
|
+
entries: this.cache.size,
|
|
204
|
+
evictions: this.evictions,
|
|
205
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Automatically prune expired entries every PRUNE_INTERVAL operations.
|
|
210
|
+
* SMI-1262: Prevents expired entries from accumulating until maxEntries is reached.
|
|
211
|
+
*/
|
|
212
|
+
maybeAutoPrune() {
|
|
213
|
+
if (++this.operationCount % this.PRUNE_INTERVAL === 0) {
|
|
214
|
+
this.prune();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Evict least recently used entries
|
|
219
|
+
*/
|
|
220
|
+
evictLeastUsed() {
|
|
221
|
+
// Find entry with lowest hit count
|
|
222
|
+
let lowestKey;
|
|
223
|
+
let lowestHits = Infinity;
|
|
224
|
+
for (const [key, entry] of this.cache) {
|
|
225
|
+
// Also check for expired while iterating
|
|
226
|
+
if (Date.now() > entry.expiresAt) {
|
|
227
|
+
this.cache.delete(key);
|
|
228
|
+
if (this.enableStats)
|
|
229
|
+
this.evictions++;
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (entry.hitCount < lowestHits) {
|
|
233
|
+
lowestHits = entry.hitCount;
|
|
234
|
+
lowestKey = key;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (lowestKey) {
|
|
238
|
+
this.cache.delete(lowestKey);
|
|
239
|
+
if (this.enableStats)
|
|
240
|
+
this.evictions++;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Create a cache instance with default configuration
|
|
246
|
+
*/
|
|
247
|
+
export function createCache(config) {
|
|
248
|
+
return new ApiCache(config);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Global cache instance for sharing across the application
|
|
252
|
+
*/
|
|
253
|
+
let globalCache;
|
|
254
|
+
/**
|
|
255
|
+
* Get or create the global cache instance
|
|
256
|
+
*/
|
|
257
|
+
export function getGlobalCache() {
|
|
258
|
+
if (!globalCache) {
|
|
259
|
+
globalCache = new ApiCache({ enableStats: true });
|
|
260
|
+
}
|
|
261
|
+
return globalCache;
|
|
262
|
+
}
|
|
263
|
+
export default ApiCache;
|
|
264
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/api/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;;;;;;;GAcG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACnD,CAAC;AAmCD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS;IACjC,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,WAAW;IAC1C,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS;CACrC,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,QAAQ;IACX,KAAK,CAAkC;IACvC,UAAU,CAAQ;IAClB,UAAU,CAAQ;IAClB,WAAW,CAAS;IAE5B,aAAa;IACL,IAAI,GAAG,CAAC,CAAA;IACR,MAAM,GAAG,CAAC,CAAA;IACV,SAAS,GAAG,CAAC,CAAA;IAErB,0BAA0B;IAClB,cAAc,GAAG,CAAC,CAAA;IACT,cAAc,GAAG,GAAG,CAAA;IAErC,YAAY,SAAsB,EAAE;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,MAAM,CAAA;QACzD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAA;QAC3C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,KAAK,CAAA;IAChD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,QAAgB,EAAE,MAAgC;QACjE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aACrC,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aACrD,IAAI,CAAC,GAAG,CAAC,CAAA;QAEZ,OAAO,GAAG,QAAQ,IAAI,YAAY,EAAE,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,GAAG,CAAI,GAAW;QAChB,IAAI,CAAC,cAAc,EAAE,CAAA;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAA8B,CAAA;QAE9D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,WAAW;gBAAE,IAAI,CAAC,MAAM,EAAE,CAAA;YACnC,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,IAAI,IAAI,CAAC,WAAW;gBAAE,IAAI,CAAC,MAAM,EAAE,CAAA;YACnC,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,kCAAkC;QAClC,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChB,IAAI,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,IAAI,EAAE,CAAA;QAEjC,OAAO,KAAK,CAAC,IAAI,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,GAAG,CAAI,GAAW,EAAE,IAAO,EAAE,YAAuC;QAClE,IAAI,CAAC,cAAc,EAAE,CAAA;QAErB,uBAAuB;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,EAAE,CAAA;QACvB,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACtE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,IAAI;YACJ,SAAS,EAAE,GAAG,GAAG,GAAG;YACpB,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;QACb,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;QACf,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,MAAM,GAAG,CAAC,CAAA;QAEd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACtB,MAAM,EAAE,CAAA;YACV,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,iBAAiB,CAAC,OAAwB;QACxC,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QACvF,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACtB,WAAW,EAAE,CAAA;YACf,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA;QACrC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3C,CAAA;IACH,CAAC;IAED;;;OAGG;IACK,cAAc;QACpB,IAAI,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,mCAAmC;QACnC,IAAI,SAA6B,CAAA;QACjC,IAAI,UAAU,GAAG,QAAQ,CAAA;QAEzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,yCAAyC;YACzC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACtB,IAAI,IAAI,CAAC,WAAW;oBAAE,IAAI,CAAC,SAAS,EAAE,CAAA;gBACtC,OAAM;YACR,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,GAAG,UAAU,EAAE,CAAC;gBAChC,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAA;gBAC3B,SAAS,GAAG,GAAG,CAAA;YACjB,CAAC;QACH,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC5B,IAAI,IAAI,CAAC,WAAW;gBAAE,IAAI,CAAC,SAAS,EAAE,CAAA;QACxC,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC7B,CAAC;AAED;;GAEG;AACH,IAAI,WAAiC,CAAA;AAErC;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,IAAI,QAAQ,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,eAAe,QAAQ,CAAA"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skillsmith API Client
|
|
3
|
+
* @module api/client
|
|
4
|
+
*
|
|
5
|
+
* SMI-1244: API client for fetching skills from live Supabase endpoints
|
|
6
|
+
* SMI-1258: Runtime validation for API responses using zod
|
|
7
|
+
*
|
|
8
|
+
* Provides methods to interact with the Skillsmith API:
|
|
9
|
+
* - search: Search skills with filters
|
|
10
|
+
* - getSkill: Get skill by ID
|
|
11
|
+
* - getRecommendations: Get skill recommendations based on tech stack
|
|
12
|
+
* - recordEvent: Record telemetry event
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import type { Skill, TrustTier, SearchOptions } from '../types/skill.js';
|
|
16
|
+
/**
|
|
17
|
+
* Trust tier enum values
|
|
18
|
+
*/
|
|
19
|
+
declare const TrustTierSchema: z.ZodEnum<{
|
|
20
|
+
verified: "verified";
|
|
21
|
+
community: "community";
|
|
22
|
+
experimental: "experimental";
|
|
23
|
+
unknown: "unknown";
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Schema for individual search result from API
|
|
27
|
+
*/
|
|
28
|
+
declare const ApiSearchResultSchema: z.ZodObject<{
|
|
29
|
+
id: z.ZodString;
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
description: z.ZodNullable<z.ZodString>;
|
|
32
|
+
author: z.ZodNullable<z.ZodString>;
|
|
33
|
+
repo_url: z.ZodNullable<z.ZodString>;
|
|
34
|
+
quality_score: z.ZodNullable<z.ZodNumber>;
|
|
35
|
+
trust_tier: z.ZodEnum<{
|
|
36
|
+
verified: "verified";
|
|
37
|
+
community: "community";
|
|
38
|
+
experimental: "experimental";
|
|
39
|
+
unknown: "unknown";
|
|
40
|
+
}>;
|
|
41
|
+
tags: z.ZodArray<z.ZodString>;
|
|
42
|
+
stars: z.ZodNullable<z.ZodNumber>;
|
|
43
|
+
installable: z.ZodNullable<z.ZodBoolean>;
|
|
44
|
+
created_at: z.ZodString;
|
|
45
|
+
updated_at: z.ZodString;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
/**
|
|
48
|
+
* Schema for telemetry response
|
|
49
|
+
*/
|
|
50
|
+
declare const TelemetryResponseSchema: z.ZodObject<{
|
|
51
|
+
data: z.ZodObject<{
|
|
52
|
+
ok: z.ZodBoolean;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
55
|
+
}, z.core.$strip>;
|
|
56
|
+
declare const SearchResponseSchema: z.ZodObject<{
|
|
57
|
+
data: z.ZodArray<z.ZodObject<{
|
|
58
|
+
id: z.ZodString;
|
|
59
|
+
name: z.ZodString;
|
|
60
|
+
description: z.ZodNullable<z.ZodString>;
|
|
61
|
+
author: z.ZodNullable<z.ZodString>;
|
|
62
|
+
repo_url: z.ZodNullable<z.ZodString>;
|
|
63
|
+
quality_score: z.ZodNullable<z.ZodNumber>;
|
|
64
|
+
trust_tier: z.ZodEnum<{
|
|
65
|
+
verified: "verified";
|
|
66
|
+
community: "community";
|
|
67
|
+
experimental: "experimental";
|
|
68
|
+
unknown: "unknown";
|
|
69
|
+
}>;
|
|
70
|
+
tags: z.ZodArray<z.ZodString>;
|
|
71
|
+
stars: z.ZodNullable<z.ZodNumber>;
|
|
72
|
+
installable: z.ZodNullable<z.ZodBoolean>;
|
|
73
|
+
created_at: z.ZodString;
|
|
74
|
+
updated_at: z.ZodString;
|
|
75
|
+
}, z.core.$strip>>;
|
|
76
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
77
|
+
}, z.core.$strip>;
|
|
78
|
+
declare const SingleSkillResponseSchema: z.ZodObject<{
|
|
79
|
+
data: z.ZodObject<{
|
|
80
|
+
id: z.ZodString;
|
|
81
|
+
name: z.ZodString;
|
|
82
|
+
description: z.ZodNullable<z.ZodString>;
|
|
83
|
+
author: z.ZodNullable<z.ZodString>;
|
|
84
|
+
repo_url: z.ZodNullable<z.ZodString>;
|
|
85
|
+
quality_score: z.ZodNullable<z.ZodNumber>;
|
|
86
|
+
trust_tier: z.ZodEnum<{
|
|
87
|
+
verified: "verified";
|
|
88
|
+
community: "community";
|
|
89
|
+
experimental: "experimental";
|
|
90
|
+
unknown: "unknown";
|
|
91
|
+
}>;
|
|
92
|
+
tags: z.ZodArray<z.ZodString>;
|
|
93
|
+
stars: z.ZodNullable<z.ZodNumber>;
|
|
94
|
+
installable: z.ZodNullable<z.ZodBoolean>;
|
|
95
|
+
created_at: z.ZodString;
|
|
96
|
+
updated_at: z.ZodString;
|
|
97
|
+
}, z.core.$strip>;
|
|
98
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
99
|
+
}, z.core.$strip>;
|
|
100
|
+
/**
|
|
101
|
+
* API response wrapper
|
|
102
|
+
*/
|
|
103
|
+
export interface ApiResponse<T> {
|
|
104
|
+
data: T;
|
|
105
|
+
meta?: Record<string, unknown>;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* API error response
|
|
109
|
+
*/
|
|
110
|
+
export interface ApiErrorResponse {
|
|
111
|
+
error: string;
|
|
112
|
+
details?: Record<string, unknown>;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Custom error class for API client errors with retry control
|
|
116
|
+
* SMI-1257: Replace string-based retry skip with custom error class
|
|
117
|
+
*/
|
|
118
|
+
export declare class ApiClientError extends Error {
|
|
119
|
+
readonly retryable: boolean;
|
|
120
|
+
readonly statusCode?: number | undefined;
|
|
121
|
+
constructor(message: string, retryable?: boolean, statusCode?: number | undefined);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Search result from API
|
|
125
|
+
*/
|
|
126
|
+
export interface ApiSearchResult {
|
|
127
|
+
id: string;
|
|
128
|
+
name: string;
|
|
129
|
+
description: string | null;
|
|
130
|
+
author: string | null;
|
|
131
|
+
repo_url: string | null;
|
|
132
|
+
quality_score: number | null;
|
|
133
|
+
trust_tier: TrustTier;
|
|
134
|
+
tags: string[];
|
|
135
|
+
stars: number | null;
|
|
136
|
+
installable: boolean | null;
|
|
137
|
+
created_at: string;
|
|
138
|
+
updated_at: string;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Recommendation request
|
|
142
|
+
*/
|
|
143
|
+
export interface RecommendationRequest {
|
|
144
|
+
stack: string[];
|
|
145
|
+
project_type?: string;
|
|
146
|
+
limit?: number;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Telemetry event
|
|
150
|
+
*/
|
|
151
|
+
export interface TelemetryEvent {
|
|
152
|
+
event: 'skill_view' | 'skill_install' | 'skill_uninstall' | 'skill_rate' | 'search' | 'recommend' | 'compare' | 'validate';
|
|
153
|
+
skill_id?: string;
|
|
154
|
+
anonymous_id: string;
|
|
155
|
+
metadata?: Record<string, unknown>;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* API client configuration
|
|
159
|
+
*/
|
|
160
|
+
export interface ApiClientConfig {
|
|
161
|
+
/** Base URL for the API (defaults to production Supabase) */
|
|
162
|
+
baseUrl?: string;
|
|
163
|
+
/** Supabase anon key for authentication */
|
|
164
|
+
anonKey?: string;
|
|
165
|
+
/** Request timeout in ms (default 30000) */
|
|
166
|
+
timeout?: number;
|
|
167
|
+
/** Max retry attempts (default 3) */
|
|
168
|
+
maxRetries?: number;
|
|
169
|
+
/** Enable debug logging */
|
|
170
|
+
debug?: boolean;
|
|
171
|
+
/** Enable offline mode (disables API calls) */
|
|
172
|
+
offlineMode?: boolean;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Generate anonymous ID for telemetry using cryptographic randomness.
|
|
176
|
+
* Returns a UUID v4 format string (e.g., "550e8400-e29b-41d4-a716-446655440000").
|
|
177
|
+
*
|
|
178
|
+
* Note: This generates a fresh ID per session - it is NOT stored persistently.
|
|
179
|
+
* For persistent anonymous IDs, the caller must handle storage.
|
|
180
|
+
*/
|
|
181
|
+
export declare function generateAnonymousId(): string;
|
|
182
|
+
/**
|
|
183
|
+
* Skillsmith API Client
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```typescript
|
|
187
|
+
* const client = new SkillsmithApiClient({
|
|
188
|
+
* anonKey: process.env.SUPABASE_ANON_KEY,
|
|
189
|
+
* });
|
|
190
|
+
*
|
|
191
|
+
* const results = await client.search({ query: 'testing' });
|
|
192
|
+
* console.log(results.data);
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export declare class SkillsmithApiClient {
|
|
196
|
+
private baseUrl;
|
|
197
|
+
private anonKey;
|
|
198
|
+
private timeout;
|
|
199
|
+
private maxRetries;
|
|
200
|
+
private debug;
|
|
201
|
+
private offlineMode;
|
|
202
|
+
constructor(config?: ApiClientConfig);
|
|
203
|
+
/**
|
|
204
|
+
* Check if client is running in offline mode
|
|
205
|
+
*/
|
|
206
|
+
isOffline(): boolean;
|
|
207
|
+
/**
|
|
208
|
+
* Log debug message
|
|
209
|
+
*/
|
|
210
|
+
private log;
|
|
211
|
+
/**
|
|
212
|
+
* Build request headers
|
|
213
|
+
*/
|
|
214
|
+
private buildHeaders;
|
|
215
|
+
/**
|
|
216
|
+
* Make API request with retry logic and optional schema validation
|
|
217
|
+
* SMI-1258: Added runtime validation for API responses
|
|
218
|
+
*
|
|
219
|
+
* @param endpoint - API endpoint path
|
|
220
|
+
* @param options - Fetch options
|
|
221
|
+
* @param schema - Optional zod schema for response validation
|
|
222
|
+
*/
|
|
223
|
+
private request;
|
|
224
|
+
/**
|
|
225
|
+
* Search for skills
|
|
226
|
+
* SMI-1258: Validates response against SearchResponseSchema
|
|
227
|
+
*
|
|
228
|
+
* @param options - Search options
|
|
229
|
+
* @returns Search results
|
|
230
|
+
*/
|
|
231
|
+
search(options: SearchOptions): Promise<ApiResponse<ApiSearchResult[]>>;
|
|
232
|
+
/**
|
|
233
|
+
* Get skill by ID
|
|
234
|
+
* SMI-1258: Validates response against SingleSkillResponseSchema
|
|
235
|
+
*
|
|
236
|
+
* @param id - Skill ID (UUID or author/name format)
|
|
237
|
+
* @returns Skill details
|
|
238
|
+
*/
|
|
239
|
+
getSkill(id: string): Promise<ApiResponse<ApiSearchResult>>;
|
|
240
|
+
/**
|
|
241
|
+
* Get skill recommendations based on tech stack
|
|
242
|
+
* SMI-1258: Validates response against SearchResponseSchema
|
|
243
|
+
*
|
|
244
|
+
* @param request - Recommendation request
|
|
245
|
+
* @returns Recommended skills
|
|
246
|
+
*/
|
|
247
|
+
getRecommendations(request: RecommendationRequest): Promise<ApiResponse<ApiSearchResult[]>>;
|
|
248
|
+
/**
|
|
249
|
+
* Record telemetry event
|
|
250
|
+
* SMI-1258: Validates response against TelemetryResponseSchema
|
|
251
|
+
*
|
|
252
|
+
* @param event - Telemetry event
|
|
253
|
+
* @returns Success response
|
|
254
|
+
*/
|
|
255
|
+
recordEvent(event: TelemetryEvent): Promise<{
|
|
256
|
+
ok: boolean;
|
|
257
|
+
}>;
|
|
258
|
+
/**
|
|
259
|
+
* Check API health status
|
|
260
|
+
*
|
|
261
|
+
* Returns service health information including status, timestamp, and version.
|
|
262
|
+
* In offline mode, returns a synthetic healthy response.
|
|
263
|
+
*
|
|
264
|
+
* @returns Health status object
|
|
265
|
+
*/
|
|
266
|
+
checkHealth(): Promise<{
|
|
267
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
268
|
+
timestamp: string;
|
|
269
|
+
version: string;
|
|
270
|
+
}>;
|
|
271
|
+
/**
|
|
272
|
+
* Convert API result to Skill type
|
|
273
|
+
*/
|
|
274
|
+
static toSkill(result: ApiSearchResult): Skill;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Create a default API client instance
|
|
278
|
+
*/
|
|
279
|
+
export declare function createApiClient(config?: ApiClientConfig): SkillsmithApiClient;
|
|
280
|
+
export { ApiSearchResultSchema, SearchResponseSchema, SingleSkillResponseSchema, TelemetryResponseSchema, TrustTierSchema, };
|
|
281
|
+
export default SkillsmithApiClient;
|
|
282
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"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"}
|