@skillsmith/core 0.2.0 → 0.4.1
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 +235 -4
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
- 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/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 +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +76 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +205 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/language-detector.patterns.d.ts +17 -0
- package/dist/src/analysis/language-detector.patterns.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.patterns.js +413 -0
- package/dist/src/analysis/language-detector.patterns.js.map +1 -0
- package/dist/src/analysis/language-detector.types.d.ts +48 -0
- package/dist/src/analysis/language-detector.types.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.types.js +6 -0
- package/dist/src/analysis/language-detector.types.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 +103 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.implementations.d.ts +39 -0
- package/dist/src/analysis/metrics.implementations.d.ts.map +1 -0
- package/dist/src/analysis/metrics.implementations.js +114 -0
- package/dist/src/analysis/metrics.implementations.js.map +1 -0
- package/dist/src/analysis/metrics.js +334 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/metrics.types.d.ts +79 -0
- package/dist/src/analysis/metrics.types.d.ts.map +1 -0
- package/dist/src/analysis/metrics.types.js +6 -0
- package/dist/src/analysis/metrics.types.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 +71 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +36 -3
- package/dist/src/analysis/types.js.map +1 -1
- 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 +4 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.js +26 -44
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/analytics/ROIDashboardService.js +4 -2
- package/dist/src/analytics/ROIDashboardService.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 +140 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +141 -6
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +238 -23
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- 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.map +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- package/dist/src/billing/BillingService.d.ts +101 -0
- package/dist/src/billing/BillingService.d.ts.map +1 -0
- package/dist/src/billing/BillingService.helpers.d.ts +15 -0
- package/dist/src/billing/BillingService.helpers.d.ts.map +1 -0
- package/dist/src/billing/BillingService.helpers.js +45 -0
- package/dist/src/billing/BillingService.helpers.js.map +1 -0
- package/dist/src/billing/BillingService.js +263 -0
- package/dist/src/billing/BillingService.js.map +1 -0
- package/dist/src/billing/BillingService.types.d.ts +52 -0
- package/dist/src/billing/BillingService.types.d.ts.map +1 -0
- package/dist/src/billing/BillingService.types.js +6 -0
- package/dist/src/billing/BillingService.types.js.map +1 -0
- package/dist/src/billing/GDPRComplianceService.d.ts +176 -0
- package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -0
- package/dist/src/billing/GDPRComplianceService.js +361 -0
- package/dist/src/billing/GDPRComplianceService.js.map +1 -0
- package/dist/src/billing/StripeClient.d.ts +178 -0
- package/dist/src/billing/StripeClient.d.ts.map +1 -0
- package/dist/src/billing/StripeClient.js +463 -0
- package/dist/src/billing/StripeClient.js.map +1 -0
- package/dist/src/billing/StripeReconciliationJob.d.ts +95 -0
- package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -0
- package/dist/src/billing/StripeReconciliationJob.js +405 -0
- package/dist/src/billing/StripeReconciliationJob.js.map +1 -0
- package/dist/src/billing/StripeWebhookHandler.d.ts +105 -0
- package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -0
- package/dist/src/billing/StripeWebhookHandler.js +452 -0
- package/dist/src/billing/StripeWebhookHandler.js.map +1 -0
- package/dist/src/billing/index.d.ts +18 -0
- package/dist/src/billing/index.d.ts.map +1 -0
- package/dist/src/billing/index.js +19 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/billing/types.d.ts +266 -0
- package/dist/src/billing/types.d.ts.map +1 -0
- package/dist/src/billing/types.js +23 -0
- package/dist/src/billing/types.js.map +1 -0
- package/dist/src/db/migration.d.ts +129 -0
- package/dist/src/db/migration.d.ts.map +1 -0
- package/dist/src/db/migration.js +289 -0
- package/dist/src/db/migration.js.map +1 -0
- package/dist/src/db/schema.d.ts +2 -2
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +63 -1
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.d.ts +58 -0
- package/dist/src/embeddings/hnsw-store.d.ts.map +1 -0
- package/dist/src/embeddings/hnsw-store.helpers.d.ts +83 -0
- package/dist/src/embeddings/hnsw-store.helpers.d.ts.map +1 -0
- package/dist/src/embeddings/hnsw-store.helpers.js +147 -0
- package/dist/src/embeddings/hnsw-store.helpers.js.map +1 -0
- package/dist/src/embeddings/hnsw-store.js +354 -0
- package/dist/src/embeddings/hnsw-store.js.map +1 -0
- package/dist/src/embeddings/hnsw-store.types.d.ts +154 -0
- package/dist/src/embeddings/hnsw-store.types.d.ts.map +1 -0
- package/dist/src/embeddings/hnsw-store.types.js +26 -0
- package/dist/src/embeddings/hnsw-store.types.js.map +1 -0
- package/dist/src/embeddings/index.d.ts +2 -0
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js +2 -0
- 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 +2 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +13 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +26 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
- package/dist/src/indexer/GitHubIndexer.js +17 -4
- package/dist/src/indexer/GitHubIndexer.js.map +1 -1
- package/dist/src/indexer/SwarmIndexer.d.ts.map +1 -1
- package/dist/src/indexer/SwarmIndexer.js +1 -1
- package/dist/src/indexer/SwarmIndexer.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +37 -0
- package/dist/src/learning/PatternStore.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.helpers.d.ts +88 -0
- package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.helpers.js +286 -0
- package/dist/src/learning/PatternStore.helpers.js.map +1 -0
- package/dist/src/learning/PatternStore.js +347 -0
- package/dist/src/learning/PatternStore.js.map +1 -0
- package/dist/src/learning/PatternStore.queries.d.ts +83 -0
- package/dist/src/learning/PatternStore.queries.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.queries.js +189 -0
- package/dist/src/learning/PatternStore.queries.js.map +1 -0
- package/dist/src/learning/PatternStore.types.d.ts +308 -0
- package/dist/src/learning/PatternStore.types.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.types.js +44 -0
- package/dist/src/learning/PatternStore.types.js.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.d.ts +63 -0
- package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts +49 -0
- package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.helpers.js +180 -0
- package/dist/src/learning/ReasoningBankIntegration.helpers.js.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.js +258 -0
- package/dist/src/learning/ReasoningBankIntegration.js.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.types.d.ts +167 -0
- package/dist/src/learning/ReasoningBankIntegration.types.d.ts.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.types.js +51 -0
- package/dist/src/learning/ReasoningBankIntegration.types.js.map +1 -0
- package/dist/src/learning/index.d.ts +15 -0
- package/dist/src/learning/index.d.ts.map +1 -0
- package/dist/src/learning/index.js +15 -0
- package/dist/src/learning/index.js.map +1 -0
- package/dist/src/learning/interfaces.d.ts.map +1 -1
- package/dist/src/pipeline/DailyIndexPipeline.js +1 -1
- package/dist/src/pipeline/DailyIndexPipeline.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts +1 -0
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +7 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +21 -5
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/SyncConfigRepository.d.ts +91 -0
- package/dist/src/repositories/SyncConfigRepository.d.ts.map +1 -0
- package/dist/src/repositories/SyncConfigRepository.js +202 -0
- package/dist/src/repositories/SyncConfigRepository.js.map +1 -0
- package/dist/src/repositories/SyncHistoryRepository.d.ts +104 -0
- package/dist/src/repositories/SyncHistoryRepository.d.ts.map +1 -0
- package/dist/src/repositories/SyncHistoryRepository.js +235 -0
- package/dist/src/repositories/SyncHistoryRepository.js.map +1 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/routing/SONARouter.d.ts +56 -0
- package/dist/src/routing/SONARouter.d.ts.map +1 -0
- package/dist/src/routing/SONARouter.helpers.d.ts +112 -0
- package/dist/src/routing/SONARouter.helpers.d.ts.map +1 -0
- package/dist/src/routing/SONARouter.helpers.js +184 -0
- package/dist/src/routing/SONARouter.helpers.js.map +1 -0
- package/dist/src/routing/SONARouter.js +377 -0
- package/dist/src/routing/SONARouter.js.map +1 -0
- package/dist/src/routing/index.d.ts +9 -0
- package/dist/src/routing/index.d.ts.map +1 -0
- package/dist/src/routing/index.js +10 -0
- package/dist/src/routing/index.js.map +1 -0
- package/dist/src/routing/types.d.ts +331 -0
- package/dist/src/routing/types.d.ts.map +1 -0
- package/dist/src/routing/types.js +203 -0
- package/dist/src/routing/types.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +8 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/github-client.d.ts +30 -2
- package/dist/src/scripts/github-import/github-client.d.ts.map +1 -1
- package/dist/src/scripts/github-import/github-client.js +292 -4
- package/dist/src/scripts/github-import/github-client.js.map +1 -1
- package/dist/src/scripts/github-import/index.js +3 -10
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/github-import/types.d.ts +6 -0
- package/dist/src/scripts/github-import/types.d.ts.map +1 -1
- package/dist/src/scripts/github-import/types.js +3 -0
- package/dist/src/scripts/github-import/types.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +10 -5
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/ingest-lenny-skills.d.ts +40 -0
- package/dist/src/scripts/ingest-lenny-skills.d.ts.map +1 -0
- package/dist/src/scripts/ingest-lenny-skills.js +346 -0
- package/dist/src/scripts/ingest-lenny-skills.js.map +1 -0
- package/dist/src/scripts/merge-skills.d.ts +56 -0
- package/dist/src/scripts/merge-skills.d.ts.map +1 -0
- package/dist/src/scripts/merge-skills.js +411 -0
- package/dist/src/scripts/merge-skills.js.map +1 -0
- package/dist/src/scripts/review-lenny-skills.d.ts +25 -0
- package/dist/src/scripts/review-lenny-skills.d.ts.map +1 -0
- package/dist/src/scripts/review-lenny-skills.js +520 -0
- package/dist/src/scripts/review-lenny-skills.js.map +1 -0
- package/dist/src/scripts/skill-scanner/index.d.ts +9 -2
- package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/index.js +98 -7
- package/dist/src/scripts/skill-scanner/index.js.map +1 -1
- package/dist/src/scripts/skill-scanner/logger.d.ts +51 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/logger.js +255 -1
- package/dist/src/scripts/skill-scanner/logger.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js +67 -15
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts +5 -2
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js +156 -39
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/skill-scanner/types.d.ts +44 -0
- package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -1
- package/dist/src/scripts/sync-to-supabase.d.ts +10 -0
- package/dist/src/scripts/sync-to-supabase.d.ts.map +1 -0
- package/dist/src/scripts/sync-to-supabase.js +93 -0
- package/dist/src/scripts/sync-to-supabase.js.map +1 -0
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/AuditLogger.js +1 -1
- package/dist/src/security/AuditLogger.js.map +1 -1
- package/dist/src/security/SkillSandbox.d.ts +156 -0
- package/dist/src/security/SkillSandbox.d.ts.map +1 -0
- package/dist/src/security/SkillSandbox.js +303 -0
- package/dist/src/security/SkillSandbox.js.map +1 -0
- package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
- package/dist/src/security/index.d.ts +3 -1
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +5 -1
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/rate-limiter/presets.d.ts +12 -0
- package/dist/src/security/rate-limiter/presets.d.ts.map +1 -1
- package/dist/src/security/rate-limiter/presets.js +12 -0
- package/dist/src/security/rate-limiter/presets.js.map +1 -1
- package/dist/src/security/sanitization.d.ts +85 -0
- package/dist/src/security/sanitization.d.ts.map +1 -1
- package/dist/src/security/sanitization.js +133 -0
- package/dist/src/security/sanitization.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +13 -66
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.formatters.d.ts +49 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.js +139 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +40 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.js +142 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.js +141 -166
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +13 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +51 -0
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +13 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +1 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/services/SearchService.d.ts +5 -0
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +144 -11
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/services/SkillAnalyzer.d.ts +117 -0
- package/dist/src/services/SkillAnalyzer.d.ts.map +1 -0
- package/dist/src/services/SkillAnalyzer.js +421 -0
- package/dist/src/services/SkillAnalyzer.js.map +1 -0
- package/dist/src/services/SkillDecomposer.d.ts +103 -0
- package/dist/src/services/SkillDecomposer.d.ts.map +1 -0
- package/dist/src/services/SkillDecomposer.js +359 -0
- package/dist/src/services/SkillDecomposer.js.map +1 -0
- package/dist/src/services/SubagentGenerator.d.ts +68 -0
- package/dist/src/services/SubagentGenerator.d.ts.map +1 -0
- package/dist/src/services/SubagentGenerator.js +319 -0
- package/dist/src/services/SubagentGenerator.js.map +1 -0
- package/dist/src/services/TransformationService.d.ts +163 -0
- package/dist/src/services/TransformationService.d.ts.map +1 -0
- package/dist/src/services/TransformationService.js +291 -0
- package/dist/src/services/TransformationService.js.map +1 -0
- package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts +6 -0
- package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/SkillAnalyzer.test.js +177 -0
- package/dist/src/services/__tests__/SkillAnalyzer.test.js.map +1 -0
- package/dist/src/services/__tests__/SkillDecomposer.test.d.ts +6 -0
- package/dist/src/services/__tests__/SkillDecomposer.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/SkillDecomposer.test.js +235 -0
- package/dist/src/services/__tests__/SkillDecomposer.test.js.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.d.ts +6 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.js +174 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.js.map +1 -0
- package/dist/src/services/__tests__/TransformationService.test.d.ts +6 -0
- package/dist/src/services/__tests__/TransformationService.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/TransformationService.test.js +242 -0
- package/dist/src/services/__tests__/TransformationService.test.js.map +1 -0
- package/dist/src/session/SessionContext.js +1 -1
- package/dist/src/session/SessionContext.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/session/SessionManager.d.ts +9 -66
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.helpers.d.ts +68 -0
- package/dist/src/session/SessionManager.helpers.d.ts.map +1 -0
- package/dist/src/session/SessionManager.helpers.js +152 -0
- package/dist/src/session/SessionManager.helpers.js.map +1 -0
- package/dist/src/session/SessionManager.js +113 -111
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionManager.types.d.ts +88 -0
- package/dist/src/session/SessionManager.types.d.ts.map +1 -0
- package/dist/src/session/SessionManager.types.js +27 -0
- package/dist/src/session/SessionManager.types.js.map +1 -0
- package/dist/src/session/SessionRecovery.d.ts.map +1 -1
- package/dist/src/session/SessionRecovery.js +3 -2
- package/dist/src/session/SessionRecovery.js.map +1 -1
- package/dist/src/sources/RawUrlSourceAdapter.js.map +1 -1
- package/dist/src/sources/SourceAdapterRegistry.js +1 -1
- package/dist/src/sources/SourceAdapterRegistry.js.map +1 -1
- package/dist/src/sync/BackgroundSyncService.d.ts +90 -0
- package/dist/src/sync/BackgroundSyncService.d.ts.map +1 -0
- package/dist/src/sync/BackgroundSyncService.js +214 -0
- package/dist/src/sync/BackgroundSyncService.js.map +1 -0
- package/dist/src/sync/SyncEngine.d.ts +76 -0
- package/dist/src/sync/SyncEngine.d.ts.map +1 -0
- package/dist/src/sync/SyncEngine.js +292 -0
- package/dist/src/sync/SyncEngine.js.map +1 -0
- package/dist/src/sync/index.d.ts +11 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +14 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/tracer.d.ts.map +1 -1
- package/dist/src/telemetry/tracer.js +2 -3
- package/dist/src/telemetry/tracer.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +98 -0
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.helpers.d.ts +54 -0
- package/dist/src/testing/MultiLLMProvider.helpers.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.helpers.js +126 -0
- package/dist/src/testing/MultiLLMProvider.helpers.js.map +1 -0
- package/dist/src/testing/MultiLLMProvider.js +447 -0
- package/dist/src/testing/MultiLLMProvider.js.map +1 -0
- package/dist/src/testing/MultiLLMProvider.types.d.ts +253 -0
- package/dist/src/testing/MultiLLMProvider.types.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.types.js +111 -0
- package/dist/src/testing/MultiLLMProvider.types.js.map +1 -0
- package/dist/src/testing/index.d.ts +8 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +9 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/triggers/__tests__/TriggerDetector.test.js +1 -1
- package/dist/src/triggers/__tests__/TriggerDetector.test.js.map +1 -1
- package/dist/src/types/skill.d.ts +32 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js +11 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +27 -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/src/utils/retry.js +2 -2
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/validation/index.js +2 -2
- package/dist/src/validation/index.js.map +1 -1
- package/dist/src/webhooks/WebhookHandler.d.ts.map +1 -1
- package/dist/src/webhooks/WebhookHandler.js.map +1 -1
- package/dist/src/webhooks/WebhookPayload.js +1 -1
- package/dist/src/webhooks/WebhookPayload.js.map +1 -1
- package/dist/tests/Analytics.integration.test.js +2 -2
- package/dist/tests/Analytics.integration.test.js.map +1 -1
- package/dist/tests/AnalyticsRepository.test.js +3 -5
- package/dist/tests/AnalyticsRepository.test.js.map +1 -1
- package/dist/tests/AnalyticsStorage.test.js.map +1 -1
- package/dist/tests/ApiPartialResponses.test.d.ts +12 -0
- package/dist/tests/ApiPartialResponses.test.d.ts.map +1 -0
- package/dist/tests/ApiPartialResponses.test.js +202 -0
- package/dist/tests/ApiPartialResponses.test.js.map +1 -0
- package/dist/tests/AuditLogger.test.js.map +1 -1
- package/dist/tests/BenchmarkRunner.test.js +6 -6
- package/dist/tests/BenchmarkRunner.test.js.map +1 -1
- package/dist/tests/CacheSecurity.test.js.map +1 -1
- package/dist/tests/CodebaseAnalyzer.test.js.map +1 -1
- package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
- package/dist/tests/EmbeddingService.test.js.map +1 -1
- package/dist/tests/GitHubIndexer.test.js +4 -3
- package/dist/tests/GitHubIndexer.test.js.map +1 -1
- package/dist/tests/MemoryProfiler.test.js +3 -3
- package/dist/tests/MemoryProfiler.test.js.map +1 -1
- package/dist/tests/QualityScorer.test.js.map +1 -1
- package/dist/tests/RateLimiter.test.js.map +1 -1
- package/dist/tests/ScraperAdapters.test.js.map +1 -1
- package/dist/tests/SecurityScanner.test.js +337 -1
- package/dist/tests/SecurityScanner.test.js.map +1 -1
- package/dist/tests/SessionManager.security.test.js +1 -1
- package/dist/tests/SessionManager.security.test.js.map +1 -1
- package/dist/tests/SessionManager.test.js +4 -4
- package/dist/tests/SessionManager.test.js.map +1 -1
- package/dist/tests/SwarmIndexer.test.js +1 -1
- package/dist/tests/SwarmIndexer.test.js.map +1 -1
- package/dist/tests/TieredCache.test.js +2 -11
- package/dist/tests/TieredCache.test.js.map +1 -1
- package/dist/tests/WebhookHandler.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/billing/BillingService.test.d.ts +7 -0
- package/dist/tests/billing/BillingService.test.d.ts.map +1 -0
- package/dist/tests/billing/BillingService.test.js +168 -0
- package/dist/tests/billing/BillingService.test.js.map +1 -0
- package/dist/tests/billing/GDPRCompliance.test.d.ts +7 -0
- package/dist/tests/billing/GDPRCompliance.test.d.ts.map +1 -0
- package/dist/tests/billing/GDPRCompliance.test.js +195 -0
- package/dist/tests/billing/GDPRCompliance.test.js.map +1 -0
- package/dist/tests/billing/StripeReconciliation.test.d.ts +7 -0
- package/dist/tests/billing/StripeReconciliation.test.d.ts.map +1 -0
- package/dist/tests/billing/StripeReconciliation.test.js +266 -0
- package/dist/tests/billing/StripeReconciliation.test.js.map +1 -0
- package/dist/tests/billing/stripe-validators.test.d.ts +7 -0
- package/dist/tests/billing/stripe-validators.test.d.ts.map +1 -0
- package/dist/tests/billing/stripe-validators.test.js +107 -0
- package/dist/tests/billing/stripe-validators.test.js.map +1 -0
- package/dist/tests/embeddings/hnsw-store.test.d.ts +7 -0
- package/dist/tests/embeddings/hnsw-store.test.d.ts.map +1 -0
- package/dist/tests/embeddings/hnsw-store.test.js +295 -0
- package/dist/tests/embeddings/hnsw-store.test.js.map +1 -0
- package/dist/tests/fixtures/api-responses/index.d.ts +119 -0
- package/dist/tests/fixtures/api-responses/index.d.ts.map +1 -0
- package/dist/tests/fixtures/api-responses/index.js +419 -0
- package/dist/tests/fixtures/api-responses/index.js.map +1 -0
- package/dist/tests/integration/neural/e2e-learning.test.d.ts +17 -0
- package/dist/tests/integration/neural/e2e-learning.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/e2e-learning.test.js +238 -0
- package/dist/tests/integration/neural/e2e-learning.test.js.map +1 -0
- package/dist/tests/integration/neural/helpers.d.ts +132 -0
- package/dist/tests/integration/neural/helpers.d.ts.map +1 -0
- package/dist/tests/integration/neural/helpers.js +287 -0
- package/dist/tests/integration/neural/helpers.js.map +1 -0
- package/dist/tests/integration/neural/personalization.test.d.ts +21 -0
- package/dist/tests/integration/neural/personalization.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/personalization.test.js +304 -0
- package/dist/tests/integration/neural/personalization.test.js.map +1 -0
- package/dist/tests/integration/neural/preference-learner.test.d.ts +23 -0
- package/dist/tests/integration/neural/preference-learner.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/preference-learner.test.js +289 -0
- package/dist/tests/integration/neural/preference-learner.test.js.map +1 -0
- package/dist/tests/integration/neural/privacy.test.d.ts +19 -0
- package/dist/tests/integration/neural/privacy.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/privacy.test.js +249 -0
- package/dist/tests/integration/neural/privacy.test.js.map +1 -0
- package/dist/tests/integration/neural/setup.d.ts +175 -0
- package/dist/tests/integration/neural/setup.d.ts.map +1 -0
- package/dist/tests/integration/neural/setup.js +487 -0
- package/dist/tests/integration/neural/setup.js.map +1 -0
- package/dist/tests/integration/neural/signal-collection.test.d.ts +21 -0
- package/dist/tests/integration/neural/signal-collection.test.d.ts.map +1 -0
- package/dist/tests/integration/neural/signal-collection.test.js +232 -0
- package/dist/tests/integration/neural/signal-collection.test.js.map +1 -0
- 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/learning/PatternStore.test.d.ts +8 -0
- package/dist/tests/learning/PatternStore.test.d.ts.map +1 -0
- package/dist/tests/learning/PatternStore.test.js +589 -0
- package/dist/tests/learning/PatternStore.test.js.map +1 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.d.ts +8 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.d.ts.map +1 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.js +269 -0
- package/dist/tests/learning/ReasoningBankIntegration.test.js.map +1 -0
- package/dist/tests/logger.test.js +1 -1
- package/dist/tests/logger.test.js.map +1 -1
- package/dist/tests/performance/LargeScalePerformance.test.js +1 -1
- package/dist/tests/performance/LargeScalePerformance.test.js.map +1 -1
- package/dist/tests/routing/SONARouter.test.d.ts +8 -0
- package/dist/tests/routing/SONARouter.test.d.ts.map +1 -0
- package/dist/tests/routing/SONARouter.test.js +400 -0
- package/dist/tests/routing/SONARouter.test.js.map +1 -0
- package/dist/tests/sanitization.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.test.js +10 -12
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/SkillSandbox.test.d.ts +8 -0
- package/dist/tests/security/SkillSandbox.test.d.ts.map +1 -0
- package/dist/tests/security/SkillSandbox.test.js +321 -0
- package/dist/tests/security/SkillSandbox.test.js.map +1 -0
- package/dist/tests/session/SessionManager.helpers.test.d.ts +8 -0
- package/dist/tests/session/SessionManager.helpers.test.d.ts.map +1 -0
- package/dist/tests/session/SessionManager.helpers.test.js +105 -0
- package/dist/tests/session/SessionManager.helpers.test.js.map +1 -0
- package/dist/tests/sources.test.js.map +1 -1
- package/dist/tests/sync/SyncConfigRepository.test.d.ts +7 -0
- package/dist/tests/sync/SyncConfigRepository.test.d.ts.map +1 -0
- package/dist/tests/sync/SyncConfigRepository.test.js +154 -0
- package/dist/tests/sync/SyncConfigRepository.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.test.d.ts +7 -0
- package/dist/tests/sync/SyncEngine.test.d.ts.map +1 -0
- package/dist/tests/sync/SyncEngine.test.js +300 -0
- package/dist/tests/sync/SyncEngine.test.js.map +1 -0
- package/dist/tests/sync/SyncHistoryRepository.test.d.ts +7 -0
- package/dist/tests/sync/SyncHistoryRepository.test.d.ts.map +1 -0
- package/dist/tests/sync/SyncHistoryRepository.test.js +220 -0
- package/dist/tests/sync/SyncHistoryRepository.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/dist/tests/testing/MultiLLMProvider.test.d.ts +14 -0
- package/dist/tests/testing/MultiLLMProvider.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.test.js +438 -0
- package/dist/tests/testing/MultiLLMProvider.test.js.map +1 -0
- package/dist/tests/webhooks/WebhookHandler.idempotency.test.js +1 -1
- package/dist/tests/webhooks/WebhookHandler.idempotency.test.js.map +1 -1
- package/dist/tests/webhooks/WebhookPayload.security.test.js.map +1 -1
- package/package.json +27 -13
- 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 +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
package/dist/src/api/client.d.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @module api/client
|
|
4
4
|
*
|
|
5
5
|
* SMI-1244: API client for fetching skills from live Supabase endpoints
|
|
6
|
+
* SMI-1258: Runtime validation for API responses using zod
|
|
6
7
|
*
|
|
7
8
|
* Provides methods to interact with the Skillsmith API:
|
|
8
9
|
* - search: Search skills with filters
|
|
@@ -10,7 +11,93 @@
|
|
|
10
11
|
* - getRecommendations: Get skill recommendations based on tech stack
|
|
11
12
|
* - recordEvent: Record telemetry event
|
|
12
13
|
*/
|
|
14
|
+
import { z } from 'zod';
|
|
13
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
|
+
* SMI-1577: Added .optional() and .default() to handle partial API responses
|
|
28
|
+
*/
|
|
29
|
+
declare const ApiSearchResultSchema: z.ZodObject<{
|
|
30
|
+
id: z.ZodString;
|
|
31
|
+
name: z.ZodString;
|
|
32
|
+
description: z.ZodNullable<z.ZodString>;
|
|
33
|
+
author: z.ZodNullable<z.ZodString>;
|
|
34
|
+
repo_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
35
|
+
quality_score: z.ZodNullable<z.ZodNumber>;
|
|
36
|
+
trust_tier: z.ZodDefault<z.ZodEnum<{
|
|
37
|
+
verified: "verified";
|
|
38
|
+
community: "community";
|
|
39
|
+
experimental: "experimental";
|
|
40
|
+
unknown: "unknown";
|
|
41
|
+
}>>;
|
|
42
|
+
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
43
|
+
stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
44
|
+
installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
45
|
+
created_at: z.ZodOptional<z.ZodString>;
|
|
46
|
+
updated_at: z.ZodOptional<z.ZodString>;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
/**
|
|
49
|
+
* Schema for telemetry response
|
|
50
|
+
*/
|
|
51
|
+
declare const TelemetryResponseSchema: z.ZodObject<{
|
|
52
|
+
data: z.ZodObject<{
|
|
53
|
+
ok: z.ZodBoolean;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
declare const SearchResponseSchema: z.ZodObject<{
|
|
58
|
+
data: z.ZodArray<z.ZodObject<{
|
|
59
|
+
id: z.ZodString;
|
|
60
|
+
name: z.ZodString;
|
|
61
|
+
description: z.ZodNullable<z.ZodString>;
|
|
62
|
+
author: z.ZodNullable<z.ZodString>;
|
|
63
|
+
repo_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
64
|
+
quality_score: z.ZodNullable<z.ZodNumber>;
|
|
65
|
+
trust_tier: z.ZodDefault<z.ZodEnum<{
|
|
66
|
+
verified: "verified";
|
|
67
|
+
community: "community";
|
|
68
|
+
experimental: "experimental";
|
|
69
|
+
unknown: "unknown";
|
|
70
|
+
}>>;
|
|
71
|
+
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
72
|
+
stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
73
|
+
installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
74
|
+
created_at: z.ZodOptional<z.ZodString>;
|
|
75
|
+
updated_at: z.ZodOptional<z.ZodString>;
|
|
76
|
+
}, z.core.$strip>>;
|
|
77
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
78
|
+
}, z.core.$strip>;
|
|
79
|
+
declare const SingleSkillResponseSchema: z.ZodObject<{
|
|
80
|
+
data: z.ZodObject<{
|
|
81
|
+
id: z.ZodString;
|
|
82
|
+
name: z.ZodString;
|
|
83
|
+
description: z.ZodNullable<z.ZodString>;
|
|
84
|
+
author: z.ZodNullable<z.ZodString>;
|
|
85
|
+
repo_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
86
|
+
quality_score: z.ZodNullable<z.ZodNumber>;
|
|
87
|
+
trust_tier: z.ZodDefault<z.ZodEnum<{
|
|
88
|
+
verified: "verified";
|
|
89
|
+
community: "community";
|
|
90
|
+
experimental: "experimental";
|
|
91
|
+
unknown: "unknown";
|
|
92
|
+
}>>;
|
|
93
|
+
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
94
|
+
stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
95
|
+
installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
96
|
+
created_at: z.ZodOptional<z.ZodString>;
|
|
97
|
+
updated_at: z.ZodOptional<z.ZodString>;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
100
|
+
}, z.core.$strip>;
|
|
14
101
|
/**
|
|
15
102
|
* API response wrapper
|
|
16
103
|
*/
|
|
@@ -25,21 +112,32 @@ export interface ApiErrorResponse {
|
|
|
25
112
|
error: string;
|
|
26
113
|
details?: Record<string, unknown>;
|
|
27
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Custom error class for API client errors with retry control
|
|
117
|
+
* SMI-1257: Replace string-based retry skip with custom error class
|
|
118
|
+
*/
|
|
119
|
+
export declare class ApiClientError extends Error {
|
|
120
|
+
readonly retryable: boolean;
|
|
121
|
+
readonly statusCode?: number | undefined;
|
|
122
|
+
constructor(message: string, retryable?: boolean, statusCode?: number | undefined);
|
|
123
|
+
}
|
|
28
124
|
/**
|
|
29
125
|
* Search result from API
|
|
126
|
+
* SMI-1577: Made repo_url, created_at, updated_at optional to match schema
|
|
30
127
|
*/
|
|
31
128
|
export interface ApiSearchResult {
|
|
32
129
|
id: string;
|
|
33
130
|
name: string;
|
|
34
131
|
description: string | null;
|
|
35
132
|
author: string | null;
|
|
36
|
-
repo_url
|
|
133
|
+
repo_url?: string | null;
|
|
37
134
|
quality_score: number | null;
|
|
38
135
|
trust_tier: TrustTier;
|
|
39
136
|
tags: string[];
|
|
40
|
-
stars
|
|
41
|
-
|
|
42
|
-
|
|
137
|
+
stars?: number | null;
|
|
138
|
+
installable?: boolean | null;
|
|
139
|
+
created_at?: string;
|
|
140
|
+
updated_at?: string;
|
|
43
141
|
}
|
|
44
142
|
/**
|
|
45
143
|
* Recommendation request
|
|
@@ -72,9 +170,15 @@ export interface ApiClientConfig {
|
|
|
72
170
|
maxRetries?: number;
|
|
73
171
|
/** Enable debug logging */
|
|
74
172
|
debug?: boolean;
|
|
173
|
+
/** Enable offline mode (disables API calls) */
|
|
174
|
+
offlineMode?: boolean;
|
|
75
175
|
}
|
|
76
176
|
/**
|
|
77
|
-
* Generate anonymous ID for telemetry
|
|
177
|
+
* Generate anonymous ID for telemetry using cryptographic randomness.
|
|
178
|
+
* Returns a UUID v4 format string (e.g., "550e8400-e29b-41d4-a716-446655440000").
|
|
179
|
+
*
|
|
180
|
+
* Note: This generates a fresh ID per session - it is NOT stored persistently.
|
|
181
|
+
* For persistent anonymous IDs, the caller must handle storage.
|
|
78
182
|
*/
|
|
79
183
|
export declare function generateAnonymousId(): string;
|
|
80
184
|
/**
|
|
@@ -96,7 +200,12 @@ export declare class SkillsmithApiClient {
|
|
|
96
200
|
private timeout;
|
|
97
201
|
private maxRetries;
|
|
98
202
|
private debug;
|
|
203
|
+
private offlineMode;
|
|
99
204
|
constructor(config?: ApiClientConfig);
|
|
205
|
+
/**
|
|
206
|
+
* Check if client is running in offline mode
|
|
207
|
+
*/
|
|
208
|
+
isOffline(): boolean;
|
|
100
209
|
/**
|
|
101
210
|
* Log debug message
|
|
102
211
|
*/
|
|
@@ -106,11 +215,17 @@ export declare class SkillsmithApiClient {
|
|
|
106
215
|
*/
|
|
107
216
|
private buildHeaders;
|
|
108
217
|
/**
|
|
109
|
-
* Make API request with retry logic
|
|
218
|
+
* Make API request with retry logic and optional schema validation
|
|
219
|
+
* SMI-1258: Added runtime validation for API responses
|
|
220
|
+
*
|
|
221
|
+
* @param endpoint - API endpoint path
|
|
222
|
+
* @param options - Fetch options
|
|
223
|
+
* @param schema - Optional zod schema for response validation
|
|
110
224
|
*/
|
|
111
225
|
private request;
|
|
112
226
|
/**
|
|
113
227
|
* Search for skills
|
|
228
|
+
* SMI-1258: Validates response against SearchResponseSchema
|
|
114
229
|
*
|
|
115
230
|
* @param options - Search options
|
|
116
231
|
* @returns Search results
|
|
@@ -118,6 +233,7 @@ export declare class SkillsmithApiClient {
|
|
|
118
233
|
search(options: SearchOptions): Promise<ApiResponse<ApiSearchResult[]>>;
|
|
119
234
|
/**
|
|
120
235
|
* Get skill by ID
|
|
236
|
+
* SMI-1258: Validates response against SingleSkillResponseSchema
|
|
121
237
|
*
|
|
122
238
|
* @param id - Skill ID (UUID or author/name format)
|
|
123
239
|
* @returns Skill details
|
|
@@ -125,6 +241,7 @@ export declare class SkillsmithApiClient {
|
|
|
125
241
|
getSkill(id: string): Promise<ApiResponse<ApiSearchResult>>;
|
|
126
242
|
/**
|
|
127
243
|
* Get skill recommendations based on tech stack
|
|
244
|
+
* SMI-1258: Validates response against SearchResponseSchema
|
|
128
245
|
*
|
|
129
246
|
* @param request - Recommendation request
|
|
130
247
|
* @returns Recommended skills
|
|
@@ -132,6 +249,7 @@ export declare class SkillsmithApiClient {
|
|
|
132
249
|
getRecommendations(request: RecommendationRequest): Promise<ApiResponse<ApiSearchResult[]>>;
|
|
133
250
|
/**
|
|
134
251
|
* Record telemetry event
|
|
252
|
+
* SMI-1258: Validates response against TelemetryResponseSchema
|
|
135
253
|
*
|
|
136
254
|
* @param event - Telemetry event
|
|
137
255
|
* @returns Success response
|
|
@@ -139,8 +257,24 @@ export declare class SkillsmithApiClient {
|
|
|
139
257
|
recordEvent(event: TelemetryEvent): Promise<{
|
|
140
258
|
ok: boolean;
|
|
141
259
|
}>;
|
|
260
|
+
/**
|
|
261
|
+
* Check API health status
|
|
262
|
+
*
|
|
263
|
+
* Returns service health information including status, timestamp, and version.
|
|
264
|
+
* In offline mode, returns a synthetic healthy response.
|
|
265
|
+
*
|
|
266
|
+
* @returns Health status object
|
|
267
|
+
*/
|
|
268
|
+
checkHealth(): Promise<{
|
|
269
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
270
|
+
timestamp: string;
|
|
271
|
+
version: string;
|
|
272
|
+
}>;
|
|
142
273
|
/**
|
|
143
274
|
* Convert API result to Skill type
|
|
275
|
+
* SMI-1577: Handle optional fields with sensible defaults
|
|
276
|
+
* Uses epoch timestamp as sentinel for missing dates to avoid data integrity issues
|
|
277
|
+
* SMI-825: Added security scan fields
|
|
144
278
|
*/
|
|
145
279
|
static toSkill(result: ApiSearchResult): Skill;
|
|
146
280
|
}
|
|
@@ -148,5 +282,6 @@ export declare class SkillsmithApiClient {
|
|
|
148
282
|
* Create a default API client instance
|
|
149
283
|
*/
|
|
150
284
|
export declare function createApiClient(config?: ApiClientConfig): SkillsmithApiClient;
|
|
285
|
+
export { ApiSearchResultSchema, SearchResponseSchema, SingleSkillResponseSchema, TelemetryResponseSchema, TrustTierSchema, };
|
|
151
286
|
export default SkillsmithApiClient;
|
|
152
287
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/api/client.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @module api/client
|
|
4
4
|
*
|
|
5
5
|
* SMI-1244: API client for fetching skills from live Supabase endpoints
|
|
6
|
+
* SMI-1258: Runtime validation for API responses using zod
|
|
6
7
|
*
|
|
7
8
|
* Provides methods to interact with the Skillsmith API:
|
|
8
9
|
* - search: Search skills with filters
|
|
@@ -10,7 +11,73 @@
|
|
|
10
11
|
* - getRecommendations: Get skill recommendations based on tech stack
|
|
11
12
|
* - recordEvent: Record telemetry event
|
|
12
13
|
*/
|
|
13
|
-
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { SkillsmithError, ErrorCodes } from '../errors.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Zod Schemas for API Response Validation (SMI-1258)
|
|
18
|
+
// ============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Trust tier enum values
|
|
21
|
+
*/
|
|
22
|
+
const TrustTierSchema = z.enum(['verified', 'community', 'experimental', 'unknown']);
|
|
23
|
+
/**
|
|
24
|
+
* Schema for individual search result from API
|
|
25
|
+
* SMI-1577: Added .optional() and .default() to handle partial API responses
|
|
26
|
+
*/
|
|
27
|
+
const ApiSearchResultSchema = z.object({
|
|
28
|
+
id: z.string(),
|
|
29
|
+
name: z.string(),
|
|
30
|
+
description: z.string().nullable(),
|
|
31
|
+
author: z.string().nullable(),
|
|
32
|
+
repo_url: z.string().nullable().optional(),
|
|
33
|
+
quality_score: z.number().nullable(),
|
|
34
|
+
trust_tier: TrustTierSchema.default('unknown'),
|
|
35
|
+
tags: z.array(z.string()).default([]),
|
|
36
|
+
stars: z.number().nullable().optional(),
|
|
37
|
+
installable: z.boolean().nullable().optional(),
|
|
38
|
+
created_at: z.string().optional(),
|
|
39
|
+
updated_at: z.string().optional(),
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Schema for generic API response wrapper
|
|
43
|
+
*/
|
|
44
|
+
function createApiResponseSchema(dataSchema) {
|
|
45
|
+
return z.object({
|
|
46
|
+
data: dataSchema,
|
|
47
|
+
meta: z.record(z.string(), z.unknown()).optional(),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Schema for telemetry response
|
|
52
|
+
*/
|
|
53
|
+
const TelemetryResponseSchema = z.object({
|
|
54
|
+
data: z.object({
|
|
55
|
+
ok: z.boolean(),
|
|
56
|
+
}),
|
|
57
|
+
meta: z.record(z.string(), z.unknown()).optional(),
|
|
58
|
+
});
|
|
59
|
+
// Pre-built schemas for common responses
|
|
60
|
+
const SearchResponseSchema = createApiResponseSchema(z.array(ApiSearchResultSchema));
|
|
61
|
+
const SingleSkillResponseSchema = createApiResponseSchema(ApiSearchResultSchema);
|
|
62
|
+
/**
|
|
63
|
+
* Custom error class for API client errors with retry control
|
|
64
|
+
* SMI-1257: Replace string-based retry skip with custom error class
|
|
65
|
+
*/
|
|
66
|
+
export class ApiClientError extends Error {
|
|
67
|
+
retryable;
|
|
68
|
+
statusCode;
|
|
69
|
+
constructor(message, retryable = false, statusCode) {
|
|
70
|
+
super(message);
|
|
71
|
+
this.retryable = retryable;
|
|
72
|
+
this.statusCode = statusCode;
|
|
73
|
+
this.name = 'ApiClientError';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Default base URL is constructed from SUPABASE_URL environment variable
|
|
77
|
+
// Falls back to undefined to fail explicitly if not configured
|
|
78
|
+
const DEFAULT_BASE_URL = process.env.SUPABASE_URL
|
|
79
|
+
? `${process.env.SUPABASE_URL}/functions/v1`
|
|
80
|
+
: undefined;
|
|
14
81
|
/**
|
|
15
82
|
* Calculate delay with exponential backoff and jitter
|
|
16
83
|
*/
|
|
@@ -20,15 +87,35 @@ function calculateBackoff(attempt, baseDelay = 1000) {
|
|
|
20
87
|
return Math.min(exponentialDelay + jitter, 30000); // Max 30s
|
|
21
88
|
}
|
|
22
89
|
/**
|
|
23
|
-
* Generate anonymous ID for telemetry
|
|
90
|
+
* Generate anonymous ID for telemetry using cryptographic randomness.
|
|
91
|
+
* Returns a UUID v4 format string (e.g., "550e8400-e29b-41d4-a716-446655440000").
|
|
92
|
+
*
|
|
93
|
+
* Note: This generates a fresh ID per session - it is NOT stored persistently.
|
|
94
|
+
* For persistent anonymous IDs, the caller must handle storage.
|
|
24
95
|
*/
|
|
25
96
|
export function generateAnonymousId() {
|
|
97
|
+
// Use Node.js crypto.randomUUID() for cryptographically secure random IDs
|
|
98
|
+
// This is available in Node.js 14.17.0+ and all modern browsers
|
|
99
|
+
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
|
|
100
|
+
return crypto.randomUUID();
|
|
101
|
+
}
|
|
102
|
+
// Fallback for older environments: use crypto.getRandomValues if available
|
|
103
|
+
if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {
|
|
104
|
+
const bytes = new Uint8Array(16);
|
|
105
|
+
crypto.getRandomValues(bytes);
|
|
106
|
+
// Set version (4) and variant (RFC4122) bits
|
|
107
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
108
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
109
|
+
const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
110
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
111
|
+
}
|
|
112
|
+
// Last resort fallback (not cryptographically secure, but functional)
|
|
26
113
|
const chars = 'abcdef0123456789';
|
|
27
114
|
let id = '';
|
|
28
115
|
for (let i = 0; i < 32; i++) {
|
|
29
116
|
id += chars[Math.floor(Math.random() * chars.length)];
|
|
30
117
|
}
|
|
31
|
-
return id
|
|
118
|
+
return `${id.slice(0, 8)}-${id.slice(8, 12)}-${id.slice(12, 16)}-${id.slice(16, 20)}-${id.slice(20)}`;
|
|
32
119
|
}
|
|
33
120
|
/**
|
|
34
121
|
* Skillsmith API Client
|
|
@@ -49,13 +136,25 @@ export class SkillsmithApiClient {
|
|
|
49
136
|
timeout;
|
|
50
137
|
maxRetries;
|
|
51
138
|
debug;
|
|
139
|
+
offlineMode;
|
|
52
140
|
constructor(config = {}) {
|
|
53
|
-
|
|
141
|
+
const baseUrl = config.baseUrl || process.env.SKILLSMITH_API_URL || DEFAULT_BASE_URL;
|
|
142
|
+
// Auto-enable offline mode if no URL is configured (graceful degradation)
|
|
143
|
+
// This allows the client to work in test/dev environments without explicit configuration
|
|
144
|
+
const explicitOfflineMode = config.offlineMode ?? process.env.SKILLSMITH_OFFLINE_MODE === 'true';
|
|
145
|
+
this.offlineMode = explicitOfflineMode || !baseUrl;
|
|
146
|
+
this.baseUrl = baseUrl || 'offline://not-configured';
|
|
54
147
|
this.anonKey = config.anonKey || process.env.SUPABASE_ANON_KEY;
|
|
55
148
|
this.timeout = config.timeout ?? 30000;
|
|
56
149
|
this.maxRetries = config.maxRetries ?? 3;
|
|
57
150
|
this.debug = config.debug ?? false;
|
|
58
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if client is running in offline mode
|
|
154
|
+
*/
|
|
155
|
+
isOffline() {
|
|
156
|
+
return this.offlineMode;
|
|
157
|
+
}
|
|
59
158
|
/**
|
|
60
159
|
* Log debug message
|
|
61
160
|
*/
|
|
@@ -79,9 +178,14 @@ export class SkillsmithApiClient {
|
|
|
79
178
|
return headers;
|
|
80
179
|
}
|
|
81
180
|
/**
|
|
82
|
-
* Make API request with retry logic
|
|
181
|
+
* Make API request with retry logic and optional schema validation
|
|
182
|
+
* SMI-1258: Added runtime validation for API responses
|
|
183
|
+
*
|
|
184
|
+
* @param endpoint - API endpoint path
|
|
185
|
+
* @param options - Fetch options
|
|
186
|
+
* @param schema - Optional zod schema for response validation
|
|
83
187
|
*/
|
|
84
|
-
async request(endpoint, options = {}) {
|
|
188
|
+
async request(endpoint, options = {}, schema) {
|
|
85
189
|
const url = `${this.baseUrl}${endpoint}`;
|
|
86
190
|
let lastError;
|
|
87
191
|
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
@@ -99,26 +203,59 @@ export class SkillsmithApiClient {
|
|
|
99
203
|
});
|
|
100
204
|
clearTimeout(timeoutId);
|
|
101
205
|
if (!response.ok) {
|
|
102
|
-
const errorBody = await response
|
|
103
|
-
|
|
206
|
+
const errorBody = (await response
|
|
207
|
+
.json()
|
|
208
|
+
.catch(() => ({ error: 'Unknown error' })));
|
|
209
|
+
// Don't retry on client errors (4xx) - not retryable
|
|
104
210
|
if (response.status >= 400 && response.status < 500) {
|
|
105
|
-
throw new
|
|
211
|
+
throw new ApiClientError(errorBody.error || `API error: ${response.status}`, false, // not retryable
|
|
212
|
+
response.status);
|
|
106
213
|
}
|
|
107
|
-
// Retry on server errors (5xx) and rate limits (429)
|
|
214
|
+
// Retry on server errors (5xx) and rate limits (429) - retryable
|
|
108
215
|
if (response.status === 429 || response.status >= 500) {
|
|
109
|
-
throw new
|
|
216
|
+
throw new ApiClientError(`Server error: ${response.status}`, true, response.status);
|
|
110
217
|
}
|
|
111
|
-
|
|
218
|
+
// Default: not retryable
|
|
219
|
+
throw new ApiClientError(errorBody.error || `API error: ${response.status}`, false, response.status);
|
|
112
220
|
}
|
|
113
|
-
const
|
|
221
|
+
const rawData = await response.json();
|
|
222
|
+
// SMI-1258: Validate response against schema if provided
|
|
223
|
+
if (schema) {
|
|
224
|
+
const validated = schema.safeParse(rawData);
|
|
225
|
+
if (!validated.success) {
|
|
226
|
+
const errorMessage = validated.error.issues
|
|
227
|
+
.map((issue) => `${issue.path.join('.')}: ${issue.message}`)
|
|
228
|
+
.join(', ');
|
|
229
|
+
this.log('Response validation failed:', validated.error.issues);
|
|
230
|
+
throw new SkillsmithError(ErrorCodes.NETWORK_INVALID_RESPONSE, `Invalid API response: ${errorMessage}`, {
|
|
231
|
+
details: {
|
|
232
|
+
endpoint,
|
|
233
|
+
validationErrors: validated.error.issues,
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
this.log('Response received and validated:', { status: response.status });
|
|
238
|
+
return validated.data;
|
|
239
|
+
}
|
|
240
|
+
// Fallback: return unvalidated data (for backwards compatibility)
|
|
114
241
|
this.log('Response received:', { status: response.status });
|
|
115
|
-
return
|
|
242
|
+
return rawData;
|
|
116
243
|
}
|
|
117
244
|
catch (error) {
|
|
118
245
|
lastError = error instanceof Error ? error : new Error(String(error));
|
|
119
246
|
this.log(`Attempt ${attempt + 1} failed:`, lastError.message);
|
|
120
|
-
// Don't retry on abort
|
|
121
|
-
if (lastError.name === 'AbortError'
|
|
247
|
+
// Don't retry on abort errors
|
|
248
|
+
if (lastError.name === 'AbortError') {
|
|
249
|
+
throw lastError;
|
|
250
|
+
}
|
|
251
|
+
// Don't retry on validation errors - malformed responses won't fix themselves
|
|
252
|
+
if (lastError instanceof SkillsmithError &&
|
|
253
|
+
lastError.code === ErrorCodes.NETWORK_INVALID_RESPONSE) {
|
|
254
|
+
throw lastError;
|
|
255
|
+
}
|
|
256
|
+
// SMI-1257: Use custom error class instead of string matching
|
|
257
|
+
// Don't retry on non-retryable API errors
|
|
258
|
+
if (lastError instanceof ApiClientError && !lastError.retryable) {
|
|
122
259
|
throw lastError;
|
|
123
260
|
}
|
|
124
261
|
if (attempt < this.maxRetries) {
|
|
@@ -132,6 +269,7 @@ export class SkillsmithApiClient {
|
|
|
132
269
|
}
|
|
133
270
|
/**
|
|
134
271
|
* Search for skills
|
|
272
|
+
* SMI-1258: Validates response against SearchResponseSchema
|
|
135
273
|
*
|
|
136
274
|
* @param options - Search options
|
|
137
275
|
* @returns Search results
|
|
@@ -149,20 +287,22 @@ export class SkillsmithApiClient {
|
|
|
149
287
|
params.set('min_score', String(options.minQualityScore));
|
|
150
288
|
if (options.category)
|
|
151
289
|
params.set('category', options.category);
|
|
152
|
-
return this.request(`/skills-search?${params.toString()}
|
|
290
|
+
return this.request(`/skills-search?${params.toString()}`, {}, SearchResponseSchema);
|
|
153
291
|
}
|
|
154
292
|
/**
|
|
155
293
|
* Get skill by ID
|
|
294
|
+
* SMI-1258: Validates response against SingleSkillResponseSchema
|
|
156
295
|
*
|
|
157
296
|
* @param id - Skill ID (UUID or author/name format)
|
|
158
297
|
* @returns Skill details
|
|
159
298
|
*/
|
|
160
299
|
async getSkill(id) {
|
|
161
300
|
const encodedId = encodeURIComponent(id);
|
|
162
|
-
return this.request(`/skills-get?id=${encodedId}
|
|
301
|
+
return this.request(`/skills-get?id=${encodedId}`, {}, SingleSkillResponseSchema);
|
|
163
302
|
}
|
|
164
303
|
/**
|
|
165
304
|
* Get skill recommendations based on tech stack
|
|
305
|
+
* SMI-1258: Validates response against SearchResponseSchema
|
|
166
306
|
*
|
|
167
307
|
* @param request - Recommendation request
|
|
168
308
|
* @returns Recommended skills
|
|
@@ -171,10 +311,11 @@ export class SkillsmithApiClient {
|
|
|
171
311
|
return this.request('/skills-recommend', {
|
|
172
312
|
method: 'POST',
|
|
173
313
|
body: JSON.stringify(request),
|
|
174
|
-
});
|
|
314
|
+
}, SearchResponseSchema);
|
|
175
315
|
}
|
|
176
316
|
/**
|
|
177
317
|
* Record telemetry event
|
|
318
|
+
* SMI-1258: Validates response against TelemetryResponseSchema
|
|
178
319
|
*
|
|
179
320
|
* @param event - Telemetry event
|
|
180
321
|
* @returns Success response
|
|
@@ -184,7 +325,7 @@ export class SkillsmithApiClient {
|
|
|
184
325
|
const response = await this.request('/events', {
|
|
185
326
|
method: 'POST',
|
|
186
327
|
body: JSON.stringify(event),
|
|
187
|
-
});
|
|
328
|
+
}, TelemetryResponseSchema);
|
|
188
329
|
return response.data;
|
|
189
330
|
}
|
|
190
331
|
catch {
|
|
@@ -193,21 +334,93 @@ export class SkillsmithApiClient {
|
|
|
193
334
|
return { ok: false };
|
|
194
335
|
}
|
|
195
336
|
}
|
|
337
|
+
/**
|
|
338
|
+
* Check API health status
|
|
339
|
+
*
|
|
340
|
+
* Returns service health information including status, timestamp, and version.
|
|
341
|
+
* In offline mode, returns a synthetic healthy response.
|
|
342
|
+
*
|
|
343
|
+
* @returns Health status object
|
|
344
|
+
*/
|
|
345
|
+
async checkHealth() {
|
|
346
|
+
// In offline mode, return synthetic healthy status
|
|
347
|
+
if (this.offlineMode) {
|
|
348
|
+
return {
|
|
349
|
+
status: 'healthy',
|
|
350
|
+
timestamp: new Date().toISOString(),
|
|
351
|
+
version: 'offline',
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
try {
|
|
355
|
+
// Simple health check - try to reach the API
|
|
356
|
+
const controller = new AbortController();
|
|
357
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000); // 5s timeout for health
|
|
358
|
+
const response = await fetch(`${this.baseUrl}/health`, {
|
|
359
|
+
headers: this.buildHeaders(),
|
|
360
|
+
signal: controller.signal,
|
|
361
|
+
});
|
|
362
|
+
clearTimeout(timeoutId);
|
|
363
|
+
if (response.ok) {
|
|
364
|
+
// Try to parse JSON response, fall back to basic healthy status
|
|
365
|
+
try {
|
|
366
|
+
const data = (await response.json());
|
|
367
|
+
return {
|
|
368
|
+
status: 'healthy',
|
|
369
|
+
timestamp: new Date().toISOString(),
|
|
370
|
+
version: data.version || '1.0.0',
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
return {
|
|
375
|
+
status: 'healthy',
|
|
376
|
+
timestamp: new Date().toISOString(),
|
|
377
|
+
version: '1.0.0',
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// Non-OK response indicates degraded service
|
|
382
|
+
return {
|
|
383
|
+
status: response.status >= 500 ? 'unhealthy' : 'degraded',
|
|
384
|
+
timestamp: new Date().toISOString(),
|
|
385
|
+
version: 'unknown',
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
this.log('Health check failed:', error);
|
|
390
|
+
// Network errors indicate unhealthy service
|
|
391
|
+
return {
|
|
392
|
+
status: 'unhealthy',
|
|
393
|
+
timestamp: new Date().toISOString(),
|
|
394
|
+
version: 'unknown',
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
}
|
|
196
398
|
/**
|
|
197
399
|
* Convert API result to Skill type
|
|
400
|
+
* SMI-1577: Handle optional fields with sensible defaults
|
|
401
|
+
* Uses epoch timestamp as sentinel for missing dates to avoid data integrity issues
|
|
402
|
+
* SMI-825: Added security scan fields
|
|
198
403
|
*/
|
|
199
404
|
static toSkill(result) {
|
|
405
|
+
// Sentinel value for missing timestamps - clearly indicates unknown date
|
|
406
|
+
const UNKNOWN_DATE = '1970-01-01T00:00:00.000Z';
|
|
200
407
|
return {
|
|
201
408
|
id: result.id,
|
|
202
409
|
name: result.name,
|
|
203
410
|
description: result.description,
|
|
204
411
|
author: result.author,
|
|
205
|
-
repoUrl: result.repo_url,
|
|
412
|
+
repoUrl: result.repo_url ?? null,
|
|
206
413
|
qualityScore: result.quality_score,
|
|
207
414
|
trustTier: result.trust_tier,
|
|
208
415
|
tags: result.tags || [],
|
|
209
|
-
|
|
210
|
-
|
|
416
|
+
installable: result.installable ?? false,
|
|
417
|
+
// SMI-825: Security scan fields (default to not scanned for API results)
|
|
418
|
+
riskScore: null,
|
|
419
|
+
securityFindingsCount: 0,
|
|
420
|
+
securityScannedAt: null,
|
|
421
|
+
securityPassed: null,
|
|
422
|
+
createdAt: result.created_at ?? UNKNOWN_DATE,
|
|
423
|
+
updatedAt: result.updated_at ?? UNKNOWN_DATE,
|
|
211
424
|
};
|
|
212
425
|
}
|
|
213
426
|
}
|
|
@@ -217,5 +430,7 @@ export class SkillsmithApiClient {
|
|
|
217
430
|
export function createApiClient(config) {
|
|
218
431
|
return new SkillsmithApiClient(config);
|
|
219
432
|
}
|
|
433
|
+
// SMI-1258: Export schemas for testing and external validation
|
|
434
|
+
export { ApiSearchResultSchema, SearchResponseSchema, SingleSkillResponseSchema, TelemetryResponseSchema, TrustTierSchema, };
|
|
220
435
|
export default SkillsmithApiClient;
|
|
221
436
|
//# sourceMappingURL=client.js.map
|