@skillsmith/core 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -1
- package/dist/src/analysis/adapters/java-parsers.d.ts +64 -0
- package/dist/src/analysis/adapters/java-parsers.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java-parsers.js +114 -0
- package/dist/src/analysis/adapters/java-parsers.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +1 -51
- package/dist/src/analysis/adapters/java.d.ts.map +1 -1
- package/dist/src/analysis/adapters/java.js +94 -205
- package/dist/src/analysis/adapters/java.js.map +1 -1
- package/dist/src/analysis/adapters/python-frameworks.d.ts +21 -0
- package/dist/src/analysis/adapters/python-frameworks.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python-frameworks.js +86 -0
- package/dist/src/analysis/adapters/python-frameworks.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +0 -50
- package/dist/src/analysis/adapters/python.d.ts.map +1 -1
- package/dist/src/analysis/adapters/python.js +5 -120
- package/dist/src/analysis/adapters/python.js.map +1 -1
- package/dist/src/analysis/adapters/rust-parsers.d.ts +33 -0
- package/dist/src/analysis/adapters/rust-parsers.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust-parsers.js +94 -0
- package/dist/src/analysis/adapters/rust-parsers.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +1 -43
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -1
- package/dist/src/analysis/adapters/rust.js +74 -173
- package/dist/src/analysis/adapters/rust.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +4 -20
- package/dist/src/analysis/language-detector.d.ts.map +1 -1
- package/dist/src/analysis/language-detector.js +2 -399
- package/dist/src/analysis/language-detector.js.map +1 -1
- 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/metrics.d.ts +22 -219
- package/dist/src/analysis/metrics.d.ts.map +1 -1
- 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 +21 -224
- package/dist/src/analysis/metrics.js.map +1 -1
- 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/worker-pool.d.ts +25 -52
- package/dist/src/analysis/worker-pool.d.ts.map +1 -1
- package/dist/src/analysis/worker-pool.js +29 -181
- package/dist/src/analysis/worker-pool.js.map +1 -1
- package/dist/src/analysis/worker-types.d.ts +64 -0
- package/dist/src/analysis/worker-types.d.ts.map +1 -0
- package/dist/src/analysis/worker-types.js +11 -0
- package/dist/src/analysis/worker-types.js.map +1 -0
- package/dist/src/analysis/worker-utils.d.ts +49 -0
- package/dist/src/analysis/worker-utils.d.ts.map +1 -0
- package/dist/src/analysis/worker-utils.js +206 -0
- package/dist/src/analysis/worker-utils.js.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts +1 -5
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.helpers.d.ts +28 -0
- package/dist/src/analytics/AnalyticsRepository.helpers.d.ts.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.helpers.js +90 -0
- package/dist/src/analytics/AnalyticsRepository.helpers.js.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.js +16 -129
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.types.d.ts +82 -0
- package/dist/src/analytics/AnalyticsRepository.types.d.ts.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.types.js +8 -0
- package/dist/src/analytics/AnalyticsRepository.types.js.map +1 -0
- package/dist/src/analytics/ROIDashboardService.js +4 -2
- package/dist/src/analytics/ROIDashboardService.js.map +1 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +6 -121
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +29 -129
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/schemas.d.ts +122 -0
- package/dist/src/api/schemas.d.ts.map +1 -0
- package/dist/src/api/schemas.js +71 -0
- package/dist/src/api/schemas.js.map +1 -0
- package/dist/src/api/types.d.ts +1 -1
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/utils.d.ts +35 -0
- package/dist/src/api/utils.d.ts.map +1 -0
- package/dist/src/api/utils.js +86 -0
- package/dist/src/api/utils.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/billing/BillingService.d.ts +15 -53
- package/dist/src/billing/BillingService.d.ts.map +1 -1
- 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 +49 -179
- package/dist/src/billing/BillingService.js.map +1 -1
- 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 +2 -97
- package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -1
- package/dist/src/billing/GDPRComplianceService.js.map +1 -1
- package/dist/src/billing/StripeClient.d.ts +6 -64
- package/dist/src/billing/StripeClient.d.ts.map +1 -1
- package/dist/src/billing/StripeClient.js +14 -71
- package/dist/src/billing/StripeClient.js.map +1 -1
- package/dist/src/billing/StripeReconciliationJob.d.ts +2 -47
- package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -1
- package/dist/src/billing/StripeReconciliationJob.js +1 -41
- package/dist/src/billing/StripeReconciliationJob.js.map +1 -1
- package/dist/src/billing/StripeWebhookHandler.d.ts +3 -46
- package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -1
- package/dist/src/billing/StripeWebhookHandler.js +14 -261
- package/dist/src/billing/StripeWebhookHandler.js.map +1 -1
- package/dist/src/billing/gdpr-types.d.ts +103 -0
- package/dist/src/billing/gdpr-types.d.ts.map +1 -0
- package/dist/src/billing/gdpr-types.js +7 -0
- package/dist/src/billing/gdpr-types.js.map +1 -0
- package/dist/src/billing/reconciliation-helpers.d.ts +16 -0
- package/dist/src/billing/reconciliation-helpers.d.ts.map +1 -0
- package/dist/src/billing/reconciliation-helpers.js +53 -0
- package/dist/src/billing/reconciliation-helpers.js.map +1 -0
- package/dist/src/billing/reconciliation-types.d.ts +71 -0
- package/dist/src/billing/reconciliation-types.d.ts.map +1 -0
- package/dist/src/billing/reconciliation-types.js +7 -0
- package/dist/src/billing/reconciliation-types.js.map +1 -0
- package/dist/src/billing/stripe-client-types.d.ts +45 -0
- package/dist/src/billing/stripe-client-types.d.ts.map +1 -0
- package/dist/src/billing/stripe-client-types.js +7 -0
- package/dist/src/billing/stripe-client-types.js.map +1 -0
- package/dist/src/billing/stripe-helpers.d.ts +17 -0
- package/dist/src/billing/stripe-helpers.d.ts.map +1 -0
- package/dist/src/billing/stripe-helpers.js +50 -0
- package/dist/src/billing/stripe-helpers.js.map +1 -0
- package/dist/src/billing/webhook-handlers.d.ts +56 -0
- package/dist/src/billing/webhook-handlers.d.ts.map +1 -0
- package/dist/src/billing/webhook-handlers.js +303 -0
- package/dist/src/billing/webhook-handlers.js.map +1 -0
- package/dist/src/billing/webhook-types.d.ts +42 -0
- package/dist/src/billing/webhook-types.d.ts.map +1 -0
- package/dist/src/billing/webhook-types.js +7 -0
- package/dist/src/billing/webhook-types.js.map +1 -0
- package/dist/src/config/index.d.ts +118 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +172 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/db/migration-types.d.ts +101 -0
- package/dist/src/db/migration-types.d.ts.map +1 -0
- package/dist/src/db/migration-types.js +6 -0
- package/dist/src/db/migration-types.js.map +1 -0
- package/dist/src/db/migration.d.ts +32 -0
- package/dist/src/db/migration.d.ts.map +1 -0
- package/dist/src/db/migration.js +239 -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 +23 -1
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/embeddings/embedding-types.d.ts +44 -0
- package/dist/src/embeddings/embedding-types.d.ts.map +1 -0
- package/dist/src/embeddings/embedding-types.js +6 -0
- package/dist/src/embeddings/embedding-types.js.map +1 -0
- package/dist/src/embeddings/embedding-utils.d.ts +42 -0
- package/dist/src/embeddings/embedding-utils.d.ts.map +1 -0
- package/dist/src/embeddings/embedding-utils.js +121 -0
- package/dist/src/embeddings/embedding-utils.js.map +1 -0
- package/dist/src/embeddings/hnsw-store.d.ts +8 -518
- package/dist/src/embeddings/hnsw-store.d.ts.map +1 -1
- 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 +66 -517
- package/dist/src/embeddings/hnsw-store.js.map +1 -1
- 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 +36 -112
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js +37 -210
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +18 -0
- package/dist/src/exports/repositories.d.ts.map +1 -0
- package/dist/src/exports/repositories.js +30 -0
- package/dist/src/exports/repositories.js.map +1 -0
- package/dist/src/exports/services.d.ts +30 -0
- package/dist/src/exports/services.d.ts.map +1 -0
- package/dist/src/exports/services.js +70 -0
- package/dist/src/exports/services.js.map +1 -0
- package/dist/src/exports/types.d.ts +21 -0
- package/dist/src/exports/types.d.ts.map +1 -0
- package/dist/src/exports/types.js +12 -0
- package/dist/src/exports/types.js.map +1 -0
- package/dist/src/index.d.ts +10 -47
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +31 -48
- 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 +6 -426
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- 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 +52 -598
- package/dist/src/learning/PatternStore.js.map +1 -1
- 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 +5 -345
- package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -1
- 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 +21 -390
- package/dist/src/learning/ReasoningBankIntegration.js.map +1 -1
- 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/interfaces.d.ts.map +1 -1
- package/dist/src/pipeline/DailyIndexPipeline.d.ts +4 -176
- package/dist/src/pipeline/DailyIndexPipeline.d.ts.map +1 -1
- package/dist/src/pipeline/DailyIndexPipeline.js +9 -83
- package/dist/src/pipeline/DailyIndexPipeline.js.map +1 -1
- package/dist/src/pipeline/pipeline-types.d.ts +132 -0
- package/dist/src/pipeline/pipeline-types.d.ts.map +1 -0
- package/dist/src/pipeline/pipeline-types.js +6 -0
- package/dist/src/pipeline/pipeline-types.js.map +1 -0
- 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 +6 -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 +20 -5
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/routing/SONARouter.d.ts +3 -101
- package/dist/src/routing/SONARouter.d.ts.map +1 -1
- 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 +16 -318
- package/dist/src/routing/SONARouter.js.map +1 -1
- package/dist/src/routing/expert-types.d.ts +109 -0
- package/dist/src/routing/expert-types.d.ts.map +1 -0
- package/dist/src/routing/expert-types.js +162 -0
- package/dist/src/routing/expert-types.js.map +1 -0
- package/dist/src/routing/request-types.d.ts +113 -0
- package/dist/src/routing/request-types.d.ts.map +1 -0
- package/dist/src/routing/request-types.js +9 -0
- package/dist/src/routing/request-types.js.map +1 -0
- package/dist/src/routing/types.d.ts +5 -207
- package/dist/src/routing/types.d.ts.map +1 -1
- package/dist/src/routing/types.js +3 -153
- package/dist/src/routing/types.js.map +1 -1
- package/dist/src/scripts/github-import/github-auth.d.ts +17 -0
- package/dist/src/scripts/github-import/github-auth.d.ts.map +1 -0
- package/dist/src/scripts/github-import/github-auth.js +201 -0
- package/dist/src/scripts/github-import/github-auth.js.map +1 -0
- package/dist/src/scripts/github-import/github-client.d.ts +5 -5
- package/dist/src/scripts/github-import/github-client.d.ts.map +1 -1
- package/dist/src/scripts/github-import/github-client.js +5 -204
- package/dist/src/scripts/github-import/github-client.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 +5 -27
- package/dist/src/scripts/merge-skills.d.ts.map +1 -1
- package/dist/src/scripts/merge-skills.js +4 -144
- package/dist/src/scripts/merge-skills.js.map +1 -1
- package/dist/src/scripts/merge-types.d.ts +72 -0
- package/dist/src/scripts/merge-types.d.ts.map +1 -0
- package/dist/src/scripts/merge-types.js +7 -0
- package/dist/src/scripts/merge-types.js.map +1 -0
- package/dist/src/scripts/merge-utils.d.ts +23 -0
- package/dist/src/scripts/merge-utils.d.ts.map +1 -0
- package/dist/src/scripts/merge-utils.js +150 -0
- package/dist/src/scripts/merge-utils.js.map +1 -0
- package/dist/src/scripts/review-categories.d.ts +41 -0
- package/dist/src/scripts/review-categories.d.ts.map +1 -0
- package/dist/src/scripts/review-categories.js +316 -0
- package/dist/src/scripts/review-categories.js.map +1 -0
- package/dist/src/scripts/review-lenny-skills.d.ts +26 -0
- package/dist/src/scripts/review-lenny-skills.d.ts.map +1 -0
- package/dist/src/scripts/review-lenny-skills.js +215 -0
- package/dist/src/scripts/review-lenny-skills.js.map +1 -0
- 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/security/AuditLogger.d.ts +4 -75
- package/dist/src/security/AuditLogger.d.ts.map +1 -1
- package/dist/src/security/AuditLogger.js +3 -12
- package/dist/src/security/AuditLogger.js.map +1 -1
- package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
- package/dist/src/security/audit-types.d.ts +96 -0
- package/dist/src/security/audit-types.d.ts.map +1 -0
- package/dist/src/security/audit-types.js +15 -0
- package/dist/src/security/audit-types.js.map +1 -0
- package/dist/src/security/sanitization.d.ts +1 -85
- package/dist/src/security/sanitization.d.ts.map +1 -1
- package/dist/src/security/sanitization.js +2 -133
- package/dist/src/security/sanitization.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +12 -88
- 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 +26 -255
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/stripe-validators.d.ts +92 -0
- package/dist/src/security/stripe-validators.d.ts.map +1 -0
- package/dist/src/security/stripe-validators.js +139 -0
- package/dist/src/security/stripe-validators.js.map +1 -0
- package/dist/src/services/SearchService.d.ts +5 -29
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.d.ts +42 -0
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -0
- package/dist/src/services/SearchService.helpers.js +128 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -0
- package/dist/src/services/SearchService.js +142 -128
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +53 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -0
- package/dist/src/services/SearchService.types.js +7 -0
- package/dist/src/services/SearchService.types.js.map +1 -0
- package/dist/src/services/SkillAnalyzer.d.ts +37 -0
- package/dist/src/services/SkillAnalyzer.d.ts.map +1 -0
- package/dist/src/services/SkillAnalyzer.helpers.d.ts +103 -0
- package/dist/src/services/SkillAnalyzer.helpers.d.ts.map +1 -0
- package/dist/src/services/SkillAnalyzer.helpers.js +237 -0
- package/dist/src/services/SkillAnalyzer.helpers.js.map +1 -0
- package/dist/src/services/SkillAnalyzer.js +270 -0
- package/dist/src/services/SkillAnalyzer.js.map +1 -0
- package/dist/src/services/SkillAnalyzer.types.d.ts +110 -0
- package/dist/src/services/SkillAnalyzer.types.d.ts.map +1 -0
- package/dist/src/services/SkillAnalyzer.types.js +9 -0
- package/dist/src/services/SkillAnalyzer.types.js.map +1 -0
- package/dist/src/services/SkillDecomposer.d.ts +37 -0
- package/dist/src/services/SkillDecomposer.d.ts.map +1 -0
- package/dist/src/services/SkillDecomposer.helpers.d.ts +75 -0
- package/dist/src/services/SkillDecomposer.helpers.d.ts.map +1 -0
- package/dist/src/services/SkillDecomposer.helpers.js +277 -0
- package/dist/src/services/SkillDecomposer.helpers.js.map +1 -0
- package/dist/src/services/SkillDecomposer.js +116 -0
- package/dist/src/services/SkillDecomposer.js.map +1 -0
- package/dist/src/services/SkillDecomposer.types.d.ts +104 -0
- package/dist/src/services/SkillDecomposer.types.d.ts.map +1 -0
- package/dist/src/services/SkillDecomposer.types.js +9 -0
- package/dist/src/services/SkillDecomposer.types.js.map +1 -0
- package/dist/src/services/SubagentGenerator.d.ts +77 -0
- package/dist/src/services/SubagentGenerator.d.ts.map +1 -0
- package/dist/src/services/SubagentGenerator.js +352 -0
- package/dist/src/services/SubagentGenerator.js.map +1 -0
- package/dist/src/services/TaskRunner.d.ts +227 -0
- package/dist/src/services/TaskRunner.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.js +423 -0
- package/dist/src/services/TaskRunner.js.map +1 -0
- package/dist/src/services/TransformationService.d.ts +167 -0
- package/dist/src/services/TransformationService.d.ts.map +1 -0
- package/dist/src/services/TransformationService.js +315 -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__/TaskRunner.test.d.ts +7 -0
- package/dist/src/services/__tests__/TaskRunner.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.test.js +316 -0
- package/dist/src/services/__tests__/TaskRunner.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 +244 -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/SessionManager.d.ts +3 -67
- 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 +58 -163
- 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/telemetry/metric-helpers.d.ts +47 -0
- package/dist/src/telemetry/metric-helpers.d.ts.map +1 -0
- package/dist/src/telemetry/metric-helpers.js +96 -0
- package/dist/src/telemetry/metric-helpers.js.map +1 -0
- package/dist/src/telemetry/metric-types.d.ts +73 -0
- package/dist/src/telemetry/metric-types.d.ts.map +1 -0
- package/dist/src/telemetry/metric-types.js +9 -0
- package/dist/src/telemetry/metric-types.js.map +1 -0
- package/dist/src/telemetry/metrics.d.ts +8 -119
- package/dist/src/telemetry/metrics.d.ts.map +1 -1
- package/dist/src/telemetry/metrics.js +20 -193
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/span-utils.d.ts +30 -0
- package/dist/src/telemetry/span-utils.d.ts.map +1 -0
- package/dist/src/telemetry/span-utils.js +62 -0
- package/dist/src/telemetry/span-utils.js.map +1 -0
- package/dist/src/telemetry/tracer-types.d.ts +91 -0
- package/dist/src/telemetry/tracer-types.d.ts.map +1 -0
- package/dist/src/telemetry/tracer-types.js +6 -0
- package/dist/src/telemetry/tracer-types.js.map +1 -0
- package/dist/src/telemetry/tracer.d.ts +5 -122
- package/dist/src/telemetry/tracer.d.ts.map +1 -1
- package/dist/src/telemetry/tracer.js +24 -170
- package/dist/src/telemetry/tracer.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +17 -293
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
- 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 +50 -323
- package/dist/src/testing/MultiLLMProvider.js.map +1 -1
- 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/triggers/TriggerDetector.d.ts +6 -142
- package/dist/src/triggers/TriggerDetector.d.ts.map +1 -1
- package/dist/src/triggers/TriggerDetector.js +15 -247
- package/dist/src/triggers/TriggerDetector.js.map +1 -1
- package/dist/src/triggers/__tests__/TriggerDetector.test.js +1 -1
- package/dist/src/triggers/__tests__/TriggerDetector.test.js.map +1 -1
- package/dist/src/triggers/trigger-constants.d.ts +22 -0
- package/dist/src/triggers/trigger-constants.d.ts.map +1 -0
- package/dist/src/triggers/trigger-constants.js +185 -0
- package/dist/src/triggers/trigger-constants.js.map +1 -0
- package/dist/src/triggers/trigger-types.d.ts +90 -0
- package/dist/src/triggers/trigger-types.d.ts.map +1 -0
- package/dist/src/triggers/trigger-types.js +6 -0
- package/dist/src/triggers/trigger-types.js.map +1 -0
- package/dist/src/types/skill.d.ts +33 -1
- 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 +28 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +1 -0
- 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.d.ts +5 -105
- package/dist/src/validation/index.d.ts.map +1 -1
- package/dist/src/validation/index.js +9 -421
- package/dist/src/validation/index.js.map +1 -1
- package/dist/src/validation/input-validators.d.ts +68 -0
- package/dist/src/validation/input-validators.d.ts.map +1 -0
- package/dist/src/validation/input-validators.js +126 -0
- package/dist/src/validation/input-validators.js.map +1 -0
- package/dist/src/validation/path-validators.d.ts +23 -0
- package/dist/src/validation/path-validators.d.ts.map +1 -0
- package/dist/src/validation/path-validators.js +47 -0
- package/dist/src/validation/path-validators.js.map +1 -0
- package/dist/src/validation/url-validators.d.ts +55 -0
- package/dist/src/validation/url-validators.d.ts.map +1 -0
- package/dist/src/validation/url-validators.js +267 -0
- package/dist/src/validation/url-validators.js.map +1 -0
- package/dist/src/validation/validation-error.d.ts +14 -0
- package/dist/src/validation/validation-error.d.ts.map +1 -0
- package/dist/src/validation/validation-error.js +19 -0
- package/dist/src/validation/validation-error.js.map +1 -0
- package/dist/src/webhooks/WebhookHandler.d.ts.map +1 -1
- package/dist/src/webhooks/WebhookHandler.js.map +1 -1
- package/dist/src/webhooks/WebhookPayload.d.ts +4 -215
- package/dist/src/webhooks/WebhookPayload.d.ts.map +1 -1
- package/dist/src/webhooks/WebhookPayload.js +1 -122
- package/dist/src/webhooks/WebhookPayload.js.map +1 -1
- package/dist/src/webhooks/WebhookQueue.d.ts +2 -140
- package/dist/src/webhooks/WebhookQueue.d.ts.map +1 -1
- package/dist/src/webhooks/WebhookQueue.js +4 -11
- package/dist/src/webhooks/WebhookQueue.js.map +1 -1
- package/dist/src/webhooks/WebhookQueue.types.d.ts +149 -0
- package/dist/src/webhooks/WebhookQueue.types.d.ts.map +1 -0
- package/dist/src/webhooks/WebhookQueue.types.js +10 -0
- package/dist/src/webhooks/WebhookQueue.types.js.map +1 -0
- package/dist/src/webhooks/WebhookQueue.utils.d.ts +44 -0
- package/dist/src/webhooks/WebhookQueue.utils.d.ts.map +1 -0
- package/dist/src/webhooks/WebhookQueue.utils.js +58 -0
- package/dist/src/webhooks/WebhookQueue.utils.js.map +1 -0
- package/dist/src/webhooks/webhook-schemas.d.ts +213 -0
- package/dist/src/webhooks/webhook-schemas.d.ts.map +1 -0
- package/dist/src/webhooks/webhook-schemas.js +132 -0
- package/dist/src/webhooks/webhook-schemas.js.map +1 -0
- package/dist/src/webhooks/webhook-types.d.ts +222 -0
- package/dist/src/webhooks/webhook-types.d.ts.map +1 -0
- package/dist/src/webhooks/webhook-types.js +10 -0
- package/dist/src/webhooks/webhook-types.js.map +1 -0
- 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 +4 -4
- 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/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/neural-fixtures.d.ts +19 -0
- package/dist/tests/integration/neural/neural-fixtures.d.ts.map +1 -0
- package/dist/tests/integration/neural/neural-fixtures.js +49 -0
- package/dist/tests/integration/neural/neural-fixtures.js.map +1 -0
- package/dist/tests/integration/neural/neural-mocks-privacy.d.ts +78 -0
- package/dist/tests/integration/neural/neural-mocks-privacy.d.ts.map +1 -0
- package/dist/tests/integration/neural/neural-mocks-privacy.js +146 -0
- package/dist/tests/integration/neural/neural-mocks-privacy.js.map +1 -0
- package/dist/tests/integration/neural/neural-mocks.d.ts +90 -0
- package/dist/tests/integration/neural/neural-mocks.d.ts.map +1 -0
- package/dist/tests/integration/neural/neural-mocks.js +288 -0
- package/dist/tests/integration/neural/neural-mocks.js.map +1 -0
- package/dist/tests/integration/neural/neural-test-utils.d.ts +27 -0
- package/dist/tests/integration/neural/neural-test-utils.d.ts.map +1 -0
- package/dist/tests/integration/neural/neural-test-utils.js +35 -0
- package/dist/tests/integration/neural/neural-test-utils.js.map +1 -0
- package/dist/tests/integration/neural/setup.d.ts +6 -165
- package/dist/tests/integration/neural/setup.d.ts.map +1 -1
- package/dist/tests/integration/neural/setup.js +9 -477
- package/dist/tests/integration/neural/setup.js.map +1 -1
- 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/sanitization.test.js.map +1 -1
- 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/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 +11 -11
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
* - Search caching
|
|
11
11
|
*/
|
|
12
12
|
import { CacheRepository } from '../repositories/CacheRepository.js';
|
|
13
|
+
import { escapeFtsToken, buildFtsQuery, buildCacheKey, rowToSkill, buildSearchResult, } from './SearchService.helpers.js';
|
|
14
|
+
// Re-export helpers for testing and advanced usage
|
|
15
|
+
export { escapeFtsToken, buildFtsQuery, buildHighlights } from './SearchService.helpers.js';
|
|
13
16
|
/**
|
|
14
17
|
* Full-text search service with BM25 ranking
|
|
15
18
|
*/
|
|
@@ -26,18 +29,25 @@ export class SearchService {
|
|
|
26
29
|
* Search skills using FTS5 with BM25 ranking
|
|
27
30
|
*/
|
|
28
31
|
search(options) {
|
|
29
|
-
const { query, limit = 20, offset = 0, trustTier, minQualityScore, category
|
|
32
|
+
const { query, limit = 20, offset = 0, trustTier, minQualityScore, category,
|
|
33
|
+
// SMI-825: Security filters
|
|
34
|
+
safeOnly, maxRiskScore, } = options;
|
|
30
35
|
// Check cache first
|
|
31
|
-
const cacheKey =
|
|
36
|
+
const cacheKey = buildCacheKey(options);
|
|
32
37
|
const cached = this.cache.get(cacheKey);
|
|
33
38
|
if (cached) {
|
|
34
39
|
return cached;
|
|
35
40
|
}
|
|
41
|
+
// ADR-019: Handle empty/whitespace-only queries with filter-only search
|
|
42
|
+
const trimmedQuery = query?.trim() || '';
|
|
43
|
+
if (trimmedQuery.length === 0) {
|
|
44
|
+
return this.searchByFiltersOnly(options);
|
|
45
|
+
}
|
|
36
46
|
// Build the FTS5 query
|
|
37
|
-
const ftsQuery =
|
|
38
|
-
// Handle
|
|
47
|
+
const ftsQuery = buildFtsQuery(query);
|
|
48
|
+
// Handle case where query contains only special characters (results in empty FTS query)
|
|
39
49
|
if (!ftsQuery) {
|
|
40
|
-
return
|
|
50
|
+
return this.searchByFiltersOnly(options);
|
|
41
51
|
}
|
|
42
52
|
// Build filter conditions
|
|
43
53
|
const filters = [];
|
|
@@ -50,14 +60,27 @@ export class SearchService {
|
|
|
50
60
|
filters.push('s.quality_score >= ?');
|
|
51
61
|
params.push(minQualityScore);
|
|
52
62
|
}
|
|
53
|
-
//
|
|
54
|
-
|
|
63
|
+
// SMI-825: Security filters
|
|
64
|
+
if (safeOnly) {
|
|
65
|
+
filters.push('s.security_passed = 1');
|
|
66
|
+
}
|
|
67
|
+
if (maxRiskScore !== undefined) {
|
|
68
|
+
filters.push('(s.risk_score IS NULL OR s.risk_score <= ?)');
|
|
69
|
+
params.push(maxRiskScore);
|
|
70
|
+
}
|
|
71
|
+
// SMI-1787: Category filter - check both junction table AND tags JSON
|
|
72
|
+
// Junction table may be empty for locally indexed skills
|
|
55
73
|
if (category) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
74
|
+
filters.push(`(
|
|
75
|
+
EXISTS (
|
|
76
|
+
SELECT 1 FROM skill_categories sc
|
|
77
|
+
INNER JOIN categories c ON sc.category_id = c.id
|
|
78
|
+
WHERE sc.skill_id = s.id AND c.name = ?
|
|
79
|
+
)
|
|
80
|
+
OR s.tags LIKE ?
|
|
81
|
+
)`);
|
|
60
82
|
params.push(category);
|
|
83
|
+
params.push(`%"${category}"%`); // Match category in JSON tags array
|
|
61
84
|
}
|
|
62
85
|
const whereClause = filters.length > 0 ? `AND ${filters.join(' AND ')}` : '';
|
|
63
86
|
// Count total results
|
|
@@ -65,7 +88,6 @@ export class SearchService {
|
|
|
65
88
|
SELECT COUNT(*) as total
|
|
66
89
|
FROM skills s
|
|
67
90
|
INNER JOIN skills_fts f ON s.rowid = f.rowid
|
|
68
|
-
${categoryJoin}
|
|
69
91
|
WHERE skills_fts MATCH ?
|
|
70
92
|
${whereClause}
|
|
71
93
|
`;
|
|
@@ -77,7 +99,6 @@ export class SearchService {
|
|
|
77
99
|
bm25(skills_fts, 10.0, 5.0, 1.0, 2.0) as rank
|
|
78
100
|
FROM skills s
|
|
79
101
|
INNER JOIN skills_fts f ON s.rowid = f.rowid
|
|
80
|
-
${categoryJoin}
|
|
81
102
|
WHERE skills_fts MATCH ?
|
|
82
103
|
${whereClause}
|
|
83
104
|
ORDER BY rank
|
|
@@ -86,7 +107,7 @@ export class SearchService {
|
|
|
86
107
|
params.push(limit, offset);
|
|
87
108
|
const rows = this.db.prepare(searchSql).all(...params);
|
|
88
109
|
// Build results with highlights
|
|
89
|
-
const items = rows.map((row) =>
|
|
110
|
+
const items = rows.map((row) => buildSearchResult(row, query));
|
|
90
111
|
const result = {
|
|
91
112
|
items,
|
|
92
113
|
total,
|
|
@@ -112,13 +133,13 @@ export class SearchService {
|
|
|
112
133
|
searchBoolean(terms, options) {
|
|
113
134
|
const parts = [];
|
|
114
135
|
if (terms.must?.length) {
|
|
115
|
-
parts.push(terms.must.map((t) =>
|
|
136
|
+
parts.push(terms.must.map((t) => escapeFtsToken(t)).join(' AND '));
|
|
116
137
|
}
|
|
117
138
|
if (terms.should?.length) {
|
|
118
|
-
parts.push(`(${terms.should.map((t) =>
|
|
139
|
+
parts.push(`(${terms.should.map((t) => escapeFtsToken(t)).join(' OR ')})`);
|
|
119
140
|
}
|
|
120
141
|
if (terms.not?.length) {
|
|
121
|
-
parts.push(terms.not.map((t) => `NOT ${
|
|
142
|
+
parts.push(terms.not.map((t) => `NOT ${escapeFtsToken(t)}`).join(' AND '));
|
|
122
143
|
}
|
|
123
144
|
const query = parts.join(' AND ');
|
|
124
145
|
return this.search({ ...options, query });
|
|
@@ -147,7 +168,7 @@ export class SearchService {
|
|
|
147
168
|
// Build a query from the skill's name and tags
|
|
148
169
|
const tags = JSON.parse(skill.tags || '[]');
|
|
149
170
|
const queryParts = [skill.name, ...tags].filter(Boolean);
|
|
150
|
-
const query = queryParts.map((p) =>
|
|
171
|
+
const query = queryParts.map((p) => escapeFtsToken(p)).join(' OR ');
|
|
151
172
|
const sql = `
|
|
152
173
|
SELECT
|
|
153
174
|
s.*,
|
|
@@ -160,7 +181,7 @@ export class SearchService {
|
|
|
160
181
|
LIMIT ?
|
|
161
182
|
`;
|
|
162
183
|
const rows = this.db.prepare(sql).all(query, skillId, limit);
|
|
163
|
-
return rows.map((row) =>
|
|
184
|
+
return rows.map((row) => buildSearchResult(row, skill.name));
|
|
164
185
|
}
|
|
165
186
|
/**
|
|
166
187
|
* Get popular skills by trust tier
|
|
@@ -178,7 +199,7 @@ export class SearchService {
|
|
|
178
199
|
sql += ' ORDER BY quality_score DESC LIMIT ?';
|
|
179
200
|
params.push(limit);
|
|
180
201
|
const rows = this.db.prepare(sql).all(...params);
|
|
181
|
-
return rows.map((row) =>
|
|
202
|
+
return rows.map((row) => rowToSkill(row));
|
|
182
203
|
}
|
|
183
204
|
/**
|
|
184
205
|
* Clear the search cache
|
|
@@ -187,120 +208,113 @@ export class SearchService {
|
|
|
187
208
|
return this.cache.clear();
|
|
188
209
|
}
|
|
189
210
|
/**
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* SMI-1034: Enhanced to filter empty tokens after escaping special characters.
|
|
211
|
+
* ADR-019: Filter-only search when query is empty
|
|
212
|
+
* Queries the skills table directly instead of using FTS5
|
|
193
213
|
*/
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
//
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
// Split into tokens, escape each, and filter empty results
|
|
204
|
-
const tokens = query
|
|
205
|
-
.trim()
|
|
206
|
-
.split(/\s+/)
|
|
207
|
-
.filter(Boolean)
|
|
208
|
-
.map((t) => this.escapeFtsToken(t))
|
|
209
|
-
.filter((t) => t.length > 0); // Remove empty tokens after escaping
|
|
210
|
-
// Return empty string if no valid tokens remain
|
|
211
|
-
if (tokens.length === 0) {
|
|
212
|
-
return '';
|
|
214
|
+
searchByFiltersOnly(options) {
|
|
215
|
+
const { limit = 20, offset = 0, trustTier, minQualityScore, category,
|
|
216
|
+
// SMI-825: Security filters
|
|
217
|
+
safeOnly, maxRiskScore, } = options;
|
|
218
|
+
// Check cache first
|
|
219
|
+
const cacheKey = buildCacheKey(options);
|
|
220
|
+
const cached = this.cache.get(cacheKey);
|
|
221
|
+
if (cached) {
|
|
222
|
+
return cached;
|
|
213
223
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
.
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
.split(/\s+/)
|
|
259
|
-
.filter((t) => !['AND', 'OR', 'NOT'].includes(t.toUpperCase()))
|
|
260
|
-
.map((t) => t.replace(/\*$/, '').toLowerCase());
|
|
261
|
-
// Build regex for matching
|
|
262
|
-
if (terms.length === 0)
|
|
263
|
-
return highlights;
|
|
264
|
-
const regex = new RegExp(`(${terms.map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|')})`, 'gi');
|
|
265
|
-
// Highlight in name
|
|
266
|
-
if (skill.name && regex.test(skill.name)) {
|
|
267
|
-
highlights.name = skill.name.replace(regex, '<mark>$1</mark>');
|
|
224
|
+
// Build base query
|
|
225
|
+
const params = [];
|
|
226
|
+
let countSql;
|
|
227
|
+
let searchSql;
|
|
228
|
+
if (category) {
|
|
229
|
+
// SMI-1787: Category filter - check both junction table AND tags JSON
|
|
230
|
+
// Junction table may be empty for locally indexed skills
|
|
231
|
+
// Tags array stores category from skill metadata
|
|
232
|
+
const baseWhere = `
|
|
233
|
+
FROM skills s
|
|
234
|
+
WHERE (
|
|
235
|
+
EXISTS (
|
|
236
|
+
SELECT 1 FROM skill_categories sc
|
|
237
|
+
INNER JOIN categories c ON sc.category_id = c.id
|
|
238
|
+
WHERE sc.skill_id = s.id AND c.name = ?
|
|
239
|
+
)
|
|
240
|
+
OR s.tags LIKE ?
|
|
241
|
+
)`;
|
|
242
|
+
const filters = [];
|
|
243
|
+
params.push(category);
|
|
244
|
+
params.push(`%"${category}"%`); // Match category in JSON tags array
|
|
245
|
+
if (trustTier) {
|
|
246
|
+
filters.push('s.trust_tier = ?');
|
|
247
|
+
params.push(trustTier);
|
|
248
|
+
}
|
|
249
|
+
if (minQualityScore !== undefined) {
|
|
250
|
+
filters.push('s.quality_score >= ?');
|
|
251
|
+
params.push(minQualityScore);
|
|
252
|
+
}
|
|
253
|
+
// SMI-825: Security filters
|
|
254
|
+
if (safeOnly) {
|
|
255
|
+
filters.push('s.security_passed = 1');
|
|
256
|
+
}
|
|
257
|
+
if (maxRiskScore !== undefined) {
|
|
258
|
+
filters.push('(s.risk_score IS NULL OR s.risk_score <= ?)');
|
|
259
|
+
params.push(maxRiskScore);
|
|
260
|
+
}
|
|
261
|
+
const whereClause = filters.length > 0 ? ` AND ${filters.join(' AND ')}` : '';
|
|
262
|
+
countSql = `SELECT COUNT(*) as total ${baseWhere}${whereClause}`;
|
|
263
|
+
searchSql = `
|
|
264
|
+
SELECT s.*, 1.0 as rank
|
|
265
|
+
${baseWhere}${whereClause}
|
|
266
|
+
ORDER BY s.quality_score DESC NULLS LAST
|
|
267
|
+
LIMIT ? OFFSET ?`;
|
|
268
268
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
snippet = '...' + snippet;
|
|
280
|
-
if (end < skill.description.length)
|
|
281
|
-
snippet = snippet + '...';
|
|
282
|
-
highlights.description = snippet.replace(regex, '<mark>$1</mark>');
|
|
269
|
+
else {
|
|
270
|
+
// No category filter - simpler query
|
|
271
|
+
const filters = [];
|
|
272
|
+
if (trustTier) {
|
|
273
|
+
filters.push('s.trust_tier = ?');
|
|
274
|
+
params.push(trustTier);
|
|
275
|
+
}
|
|
276
|
+
if (minQualityScore !== undefined) {
|
|
277
|
+
filters.push('s.quality_score >= ?');
|
|
278
|
+
params.push(minQualityScore);
|
|
283
279
|
}
|
|
280
|
+
// SMI-825: Security filters
|
|
281
|
+
if (safeOnly) {
|
|
282
|
+
filters.push('s.security_passed = 1');
|
|
283
|
+
}
|
|
284
|
+
if (maxRiskScore !== undefined) {
|
|
285
|
+
filters.push('(s.risk_score IS NULL OR s.risk_score <= ?)');
|
|
286
|
+
params.push(maxRiskScore);
|
|
287
|
+
}
|
|
288
|
+
const whereClause = filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '';
|
|
289
|
+
countSql = `SELECT COUNT(*) as total FROM skills s ${whereClause}`;
|
|
290
|
+
searchSql = `
|
|
291
|
+
SELECT s.*, 1.0 as rank
|
|
292
|
+
FROM skills s
|
|
293
|
+
${whereClause}
|
|
294
|
+
ORDER BY s.quality_score DESC NULLS LAST
|
|
295
|
+
LIMIT ? OFFSET ?`;
|
|
284
296
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
updatedAt: row.updated_at,
|
|
297
|
+
// Get total count (using params without limit/offset)
|
|
298
|
+
const { total } = this.db.prepare(countSql).get(...params);
|
|
299
|
+
// Get paginated results
|
|
300
|
+
params.push(limit, offset);
|
|
301
|
+
const rows = this.db.prepare(searchSql).all(...params);
|
|
302
|
+
// Build results (no highlights for filter-only search)
|
|
303
|
+
const items = rows.map((row) => ({
|
|
304
|
+
skill: rowToSkill(row),
|
|
305
|
+
rank: 1.0,
|
|
306
|
+
highlights: {},
|
|
307
|
+
}));
|
|
308
|
+
const result = {
|
|
309
|
+
items,
|
|
310
|
+
total,
|
|
311
|
+
limit,
|
|
312
|
+
offset,
|
|
313
|
+
hasMore: offset + items.length < total,
|
|
303
314
|
};
|
|
315
|
+
// Cache the results
|
|
316
|
+
this.cache.set(cacheKey, result, this.cacheTtl);
|
|
317
|
+
return result;
|
|
304
318
|
}
|
|
305
319
|
}
|
|
306
320
|
//# sourceMappingURL=SearchService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchService.js","sourceRoot":"","sources":["../../../src/services/SearchService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"SearchService.js","sourceRoot":"","sources":["../../../src/services/SearchService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-579: SearchService Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for FTS5 search with BM25 ranking.
|
|
5
|
+
*/
|
|
6
|
+
import type { TrustTier } from '../types/skill.js';
|
|
7
|
+
/**
|
|
8
|
+
* Raw database row type for FTS search results
|
|
9
|
+
* Used for type-safe parsing of search results from SQLite
|
|
10
|
+
*/
|
|
11
|
+
export interface FTSRow {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string | null;
|
|
15
|
+
author: string | null;
|
|
16
|
+
repo_url: string | null;
|
|
17
|
+
quality_score: number | null;
|
|
18
|
+
trust_tier: string;
|
|
19
|
+
tags: string;
|
|
20
|
+
installable: boolean | null;
|
|
21
|
+
risk_score: number | null;
|
|
22
|
+
security_findings_count: number | null;
|
|
23
|
+
security_scanned_at: string | null;
|
|
24
|
+
security_passed: number | null;
|
|
25
|
+
created_at: string;
|
|
26
|
+
updated_at: string;
|
|
27
|
+
rank: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Boolean search terms for advanced queries
|
|
31
|
+
*/
|
|
32
|
+
export interface BooleanSearchTerms {
|
|
33
|
+
/** Terms that must appear */
|
|
34
|
+
must?: string[];
|
|
35
|
+
/** Terms where at least one should appear */
|
|
36
|
+
should?: string[];
|
|
37
|
+
/** Terms that must not appear */
|
|
38
|
+
not?: string[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Search cache key options
|
|
42
|
+
*/
|
|
43
|
+
export interface SearchCacheOptions {
|
|
44
|
+
query?: string;
|
|
45
|
+
limit?: number;
|
|
46
|
+
offset?: number;
|
|
47
|
+
trustTier?: TrustTier;
|
|
48
|
+
minQualityScore?: number;
|
|
49
|
+
category?: string;
|
|
50
|
+
safeOnly?: boolean;
|
|
51
|
+
maxRiskScore?: number;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=SearchService.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchService.types.d.ts","sourceRoot":"","sources":["../../../src/services/SearchService.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,GAAG,IAAI,CAAA;IAE3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchService.types.js","sourceRoot":"","sources":["../../../src/services/SearchService.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1788: SkillAnalyzer - Analyze skills for optimization patterns
|
|
3
|
+
*
|
|
4
|
+
* Detects optimization opportunities based on:
|
|
5
|
+
* - Line count (>500 lines suggests decomposition)
|
|
6
|
+
* - Tool usage patterns (heavy tool usage suggests subagent)
|
|
7
|
+
* - Sequential Task() calls (can be parallelized)
|
|
8
|
+
* - Large examples sections (can use progressive disclosure)
|
|
9
|
+
*
|
|
10
|
+
* Part of the Skillsmith Optimization Layer for transforming
|
|
11
|
+
* community skills into more performant versions.
|
|
12
|
+
*/
|
|
13
|
+
export type { SkillAnalysis, ToolUsageAnalysis, TaskPatternAnalysis, ExtractableSection, OptimizationRecommendation, ParsedSection, ConfidenceLevel, } from './SkillAnalyzer.types.js';
|
|
14
|
+
import type { SkillAnalysis } from './SkillAnalyzer.types.js';
|
|
15
|
+
export { TOOL_PATTERNS, THRESHOLDS, escapeRegex, getConfidenceLevel, } from './SkillAnalyzer.helpers.js';
|
|
16
|
+
/**
|
|
17
|
+
* Analyze a skill's content for optimization opportunities
|
|
18
|
+
*
|
|
19
|
+
* @param content - The full SKILL.md content
|
|
20
|
+
* @returns Analysis of optimization potential
|
|
21
|
+
* @remarks The lineCount for an empty string returns 1, matching standard
|
|
22
|
+
* String.split('\n') behavior where ''.split('\n') yields ['']
|
|
23
|
+
*/
|
|
24
|
+
export declare function analyzeSkill(content: string): SkillAnalysis;
|
|
25
|
+
/**
|
|
26
|
+
* Quick check if a skill needs transformation without full analysis
|
|
27
|
+
*
|
|
28
|
+
* @param content - The full SKILL.md content
|
|
29
|
+
* @returns Whether quick transformation check passed
|
|
30
|
+
*/
|
|
31
|
+
export declare function quickTransformCheck(content: string): boolean;
|
|
32
|
+
declare const _default: {
|
|
33
|
+
analyzeSkill: typeof analyzeSkill;
|
|
34
|
+
quickTransformCheck: typeof quickTransformCheck;
|
|
35
|
+
};
|
|
36
|
+
export default _default;
|
|
37
|
+
//# sourceMappingURL=SkillAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/services/SkillAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,aAAa,EACb,eAAe,GAChB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,KAAK,EACV,aAAa,EAMd,MAAM,0BAA0B,CAAA;AAgBjC,OAAO,EACL,aAAa,EACb,UAAU,EACV,WAAW,EACX,kBAAkB,GACnB,MAAM,4BAA4B,CAAA;AAEnC;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CA4C3D;AAwPD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA2B5D;;;;;AAED,wBAAoD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1788: SkillAnalyzer Helpers
|
|
3
|
+
*
|
|
4
|
+
* Tool detection patterns, thresholds, and utility functions
|
|
5
|
+
* for skill analysis and optimization.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConfidenceLevel } from './SkillAnalyzer.types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Tool detection patterns for analyzing skill content
|
|
10
|
+
*/
|
|
11
|
+
export declare const TOOL_PATTERNS: Record<string, {
|
|
12
|
+
patterns: string[];
|
|
13
|
+
weight: number;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Thresholds for optimization decisions
|
|
17
|
+
*/
|
|
18
|
+
export declare const THRESHOLDS: {
|
|
19
|
+
/** Maximum lines before recommending decomposition */
|
|
20
|
+
readonly maxLinesBeforeDecompose: 500;
|
|
21
|
+
/** Minimum lines for an extractable section */
|
|
22
|
+
readonly minSectionLines: 50;
|
|
23
|
+
/** Heavy tool usage count that suggests subagent */
|
|
24
|
+
readonly heavyToolUsageCount: 5;
|
|
25
|
+
/** Sequential Task() calls that should be parallelized */
|
|
26
|
+
readonly sequentialTaskThreshold: 2;
|
|
27
|
+
/** Minimum optimization score to recommend transformation */
|
|
28
|
+
readonly minTransformScore: 30;
|
|
29
|
+
/** Large examples section threshold */
|
|
30
|
+
readonly largeExamplesThreshold: 200;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Escape special regex characters in a string
|
|
34
|
+
* @param str - String to escape
|
|
35
|
+
* @returns Escaped string safe for use in RegExp
|
|
36
|
+
*/
|
|
37
|
+
export declare function escapeRegex(str: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Determine confidence level based on match count
|
|
40
|
+
* @param matchCount - Number of detected tools
|
|
41
|
+
* @returns Confidence level
|
|
42
|
+
*/
|
|
43
|
+
export declare function getConfidenceLevel(matchCount: number): ConfidenceLevel;
|
|
44
|
+
/**
|
|
45
|
+
* Estimate examples lines by looking for code blocks
|
|
46
|
+
* @param content - Full skill content
|
|
47
|
+
* @returns Estimated number of lines in code blocks
|
|
48
|
+
*/
|
|
49
|
+
export declare function estimateExamplesLines(content: string): number;
|
|
50
|
+
/**
|
|
51
|
+
* Detect tools in content
|
|
52
|
+
* @param content - Skill content to analyze
|
|
53
|
+
* @returns Object with detected tools and total weight
|
|
54
|
+
*/
|
|
55
|
+
export declare function detectTools(content: string): {
|
|
56
|
+
tools: string[];
|
|
57
|
+
totalWeight: number;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Count specific command patterns in content
|
|
61
|
+
* @param content - Skill content to analyze
|
|
62
|
+
* @returns Counts for bash, read, and write commands
|
|
63
|
+
*/
|
|
64
|
+
export declare function countCommandPatterns(content: string): {
|
|
65
|
+
bashCommandCount: number;
|
|
66
|
+
fileReadCount: number;
|
|
67
|
+
fileWriteCount: number;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Determine if tool usage suggests a subagent would be beneficial
|
|
71
|
+
* @param bashCount - Number of bash commands
|
|
72
|
+
* @param fileOpCount - Total file operations (read + write)
|
|
73
|
+
* @param totalWeight - Total tool weight
|
|
74
|
+
* @returns Whether subagent is suggested
|
|
75
|
+
*/
|
|
76
|
+
export declare function shouldSuggestSubagent(bashCount: number, fileOpCount: number, totalWeight: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Count sequential Task() calls in content
|
|
79
|
+
* @param content - Skill content to analyze
|
|
80
|
+
* @returns Count of sequential Task calls
|
|
81
|
+
*/
|
|
82
|
+
export declare function countSequentialTaskCalls(content: string): number;
|
|
83
|
+
/**
|
|
84
|
+
* Calculate batch savings percentage
|
|
85
|
+
* @param sequentialCalls - Number of sequential Task calls
|
|
86
|
+
* @returns Estimated savings percentage
|
|
87
|
+
*/
|
|
88
|
+
export declare function calculateBatchSavings(sequentialCalls: number): number;
|
|
89
|
+
/**
|
|
90
|
+
* Determine extraction reason for a section
|
|
91
|
+
* @param sectionName - Name of the section
|
|
92
|
+
* @param lineCount - Number of lines in section
|
|
93
|
+
* @returns Human-readable extraction reason
|
|
94
|
+
*/
|
|
95
|
+
export declare function getExtractionReason(sectionName: string, lineCount: number): string;
|
|
96
|
+
/**
|
|
97
|
+
* Calculate extraction priority based on size ratio
|
|
98
|
+
* @param lineCount - Section line count
|
|
99
|
+
* @param totalLines - Total document lines
|
|
100
|
+
* @returns Priority (1 = highest, 3 = lowest)
|
|
101
|
+
*/
|
|
102
|
+
export declare function calculateExtractionPriority(lineCount: number, totalLines: number): number;
|
|
103
|
+
//# sourceMappingURL=SkillAnalyzer.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillAnalyzer.helpers.d.ts","sourceRoot":"","sources":["../../../src/services/SkillAnalyzer.helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAyDhF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;IACrB,sDAAsD;;IAGtD,+CAA+C;;IAG/C,oDAAoD;;IAGpD,0DAA0D;;IAG1D,6DAA6D;;IAG7D,uCAAuC;;CAE/B,CAAA;AAEV;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAItE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAS7D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAmBrF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG;IACrD,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,CAMA;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsBhE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAKrE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAgBlF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAMzF"}
|