@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
|
@@ -1,231 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* PatternStore with EWC++ for catastrophic forgetting prevention
|
|
3
3
|
* @module @skillsmith/core/learning/PatternStore
|
|
4
|
-
* @see SMI-1522: Add EWC++ pattern storage for successful matches
|
|
5
|
-
*
|
|
6
|
-
* Implements Elastic Weight Consolidation++ (EWC++) to store successful
|
|
7
|
-
* recommendation patterns without catastrophic forgetting. Unlike traditional
|
|
8
|
-
* storage that overwrites old patterns, EWC++ preserves important learned
|
|
9
|
-
* patterns while integrating new ones.
|
|
10
|
-
*
|
|
11
|
-
* Key capabilities:
|
|
12
|
-
* - storePattern(): Encodes successful matches with Fisher Information tracking
|
|
13
|
-
* - findSimilarPatterns(): Retrieves relevant patterns using importance-weighted similarity
|
|
14
|
-
* - consolidate(): Updates Fisher Information matrix without forgetting important patterns
|
|
15
|
-
* - 95%+ pattern preservation: New patterns do not overwrite important historical patterns
|
|
16
|
-
*
|
|
17
4
|
* @see https://arxiv.org/abs/1801.10112 (Progress & Compress)
|
|
18
5
|
*/
|
|
19
6
|
import Database from 'better-sqlite3';
|
|
20
7
|
import { randomUUID } from 'crypto';
|
|
21
8
|
import { EmbeddingService } from '../embeddings/index.js';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
importanceThreshold: 0.01,
|
|
29
|
-
fisherSampleSize: 100,
|
|
30
|
-
consolidationThreshold: 0.1,
|
|
31
|
-
maxPatterns: 10000,
|
|
32
|
-
};
|
|
33
|
-
/**
|
|
34
|
-
* Default PatternStore configuration
|
|
35
|
-
*/
|
|
36
|
-
export const DEFAULT_PATTERN_STORE_CONFIG = {
|
|
37
|
-
dbPath: undefined,
|
|
38
|
-
ewc: DEFAULT_EWC_CONFIG,
|
|
39
|
-
dimensions: 384,
|
|
40
|
-
autoConsolidate: true,
|
|
41
|
-
trackAccess: true,
|
|
42
|
-
useV3Integration: true,
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* Reward values for pattern outcomes
|
|
46
|
-
* Matches ReasoningBankIntegration.TRAJECTORY_REWARDS
|
|
47
|
-
*/
|
|
48
|
-
export const PATTERN_REWARDS = {
|
|
49
|
-
accept: 1.0,
|
|
50
|
-
usage: 0.3,
|
|
51
|
-
frequent: 0.5,
|
|
52
|
-
dismiss: -0.5,
|
|
53
|
-
abandonment: -0.3,
|
|
54
|
-
uninstall: -0.7,
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* Fisher Information Matrix implementation for EWC++
|
|
58
|
-
*
|
|
59
|
-
* Stores diagonal approximation of Fisher Information,
|
|
60
|
-
* indicating which "weights" (pattern dimensions) are important.
|
|
61
|
-
*
|
|
62
|
-
* In the context of pattern storage:
|
|
63
|
-
* - Each dimension of the context embedding has an importance value
|
|
64
|
-
* - High importance = changing this dimension would harm prediction
|
|
65
|
-
* - Low importance = safe to overwrite with new patterns
|
|
66
|
-
*/
|
|
67
|
-
export class FisherInformationMatrix {
|
|
68
|
-
dimensions;
|
|
69
|
-
/** Diagonal of Fisher Information (importance per dimension) */
|
|
70
|
-
importance;
|
|
71
|
-
/** Running sum for online updates */
|
|
72
|
-
runningSum;
|
|
73
|
-
/** Number of updates performed */
|
|
74
|
-
updateCount = 0;
|
|
75
|
-
constructor(dimensions) {
|
|
76
|
-
this.dimensions = dimensions;
|
|
77
|
-
this.importance = new Float32Array(dimensions);
|
|
78
|
-
this.runningSum = new Float32Array(dimensions);
|
|
79
|
-
}
|
|
80
|
-
getImportance(dimensionIndex) {
|
|
81
|
-
return this.importance[dimensionIndex] ?? 0;
|
|
82
|
-
}
|
|
83
|
-
update(gradient) {
|
|
84
|
-
// EWC++: F = decay * F + gradient^2
|
|
85
|
-
for (let i = 0; i < Math.min(gradient.length, this.dimensions); i++) {
|
|
86
|
-
this.runningSum[i] += gradient[i] * gradient[i];
|
|
87
|
-
}
|
|
88
|
-
this.updateCount++;
|
|
89
|
-
// Update importance as running mean
|
|
90
|
-
for (let i = 0; i < this.importance.length; i++) {
|
|
91
|
-
this.importance[i] = this.runningSum[i] / this.updateCount;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
decay(decayFactor) {
|
|
95
|
-
for (let i = 0; i < this.runningSum.length; i++) {
|
|
96
|
-
this.runningSum[i] *= decayFactor;
|
|
97
|
-
}
|
|
98
|
-
// Recalculate importance after decay
|
|
99
|
-
for (let i = 0; i < this.importance.length; i++) {
|
|
100
|
-
this.importance[i] = this.runningSum[i] / Math.max(1, this.updateCount);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
getImportanceVector() {
|
|
104
|
-
return new Float32Array(this.importance);
|
|
105
|
-
}
|
|
106
|
-
getAverageImportance() {
|
|
107
|
-
let sum = 0;
|
|
108
|
-
for (let i = 0; i < this.importance.length; i++) {
|
|
109
|
-
sum += this.importance[i];
|
|
110
|
-
}
|
|
111
|
-
return sum / this.importance.length;
|
|
112
|
-
}
|
|
113
|
-
serialize() {
|
|
114
|
-
const buffer = Buffer.alloc(4 + // updateCount
|
|
115
|
-
4 * this.importance.length + // importance
|
|
116
|
-
4 * this.runningSum.length // runningSum
|
|
117
|
-
);
|
|
118
|
-
buffer.writeUInt32LE(this.updateCount, 0);
|
|
119
|
-
Buffer.from(this.importance.buffer).copy(buffer, 4);
|
|
120
|
-
Buffer.from(this.runningSum.buffer).copy(buffer, 4 + 4 * this.importance.length);
|
|
121
|
-
return buffer;
|
|
122
|
-
}
|
|
123
|
-
deserialize(buffer) {
|
|
124
|
-
const expectedSize = 4 + 4 * this.dimensions * 2;
|
|
125
|
-
if (buffer.length < expectedSize) {
|
|
126
|
-
throw new Error(`Invalid Fisher matrix buffer: expected ${expectedSize} bytes, got ${buffer.length}`);
|
|
127
|
-
}
|
|
128
|
-
this.updateCount = buffer.readUInt32LE(0);
|
|
129
|
-
const importanceOffset = 4;
|
|
130
|
-
const runningSumOffset = 4 + 4 * this.dimensions;
|
|
131
|
-
// Copy importance values
|
|
132
|
-
for (let i = 0; i < this.dimensions; i++) {
|
|
133
|
-
this.importance[i] = buffer.readFloatLE(importanceOffset + i * 4);
|
|
134
|
-
}
|
|
135
|
-
// Copy runningSum values
|
|
136
|
-
for (let i = 0; i < this.dimensions; i++) {
|
|
137
|
-
this.runningSum[i] = buffer.readFloatLE(runningSumOffset + i * 4);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
reset() {
|
|
141
|
-
this.importance.fill(0);
|
|
142
|
-
this.runningSum.fill(0);
|
|
143
|
-
this.updateCount = 0;
|
|
144
|
-
}
|
|
145
|
-
getUpdateCount() {
|
|
146
|
-
return this.updateCount;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// ============================================================================
|
|
150
|
-
// PatternStore Implementation
|
|
151
|
-
// ============================================================================
|
|
152
|
-
/**
|
|
153
|
-
* SQLite schema for pattern storage
|
|
154
|
-
*/
|
|
155
|
-
const PATTERN_STORE_SCHEMA = `
|
|
156
|
-
-- Patterns table: stores recommendation patterns with outcomes
|
|
157
|
-
CREATE TABLE IF NOT EXISTS patterns (
|
|
158
|
-
pattern_id TEXT PRIMARY KEY,
|
|
159
|
-
context_embedding BLOB NOT NULL,
|
|
160
|
-
skill_id TEXT NOT NULL,
|
|
161
|
-
skill_features TEXT NOT NULL,
|
|
162
|
-
context_data TEXT NOT NULL,
|
|
163
|
-
outcome_type TEXT NOT NULL,
|
|
164
|
-
outcome_reward REAL NOT NULL,
|
|
165
|
-
importance REAL NOT NULL DEFAULT 0.1,
|
|
166
|
-
original_score REAL NOT NULL,
|
|
167
|
-
source TEXT NOT NULL,
|
|
168
|
-
access_count INTEGER NOT NULL DEFAULT 0,
|
|
169
|
-
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
170
|
-
last_accessed_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
-- Indexes for efficient queries
|
|
174
|
-
CREATE INDEX IF NOT EXISTS idx_patterns_skill_id ON patterns(skill_id);
|
|
175
|
-
CREATE INDEX IF NOT EXISTS idx_patterns_outcome_type ON patterns(outcome_type);
|
|
176
|
-
CREATE INDEX IF NOT EXISTS idx_patterns_importance ON patterns(importance DESC);
|
|
177
|
-
CREATE INDEX IF NOT EXISTS idx_patterns_created_at ON patterns(created_at DESC);
|
|
178
|
-
|
|
179
|
-
-- Fisher Information matrix state
|
|
180
|
-
CREATE TABLE IF NOT EXISTS fisher_info (
|
|
181
|
-
id INTEGER PRIMARY KEY DEFAULT 1,
|
|
182
|
-
matrix_data BLOB NOT NULL,
|
|
183
|
-
update_count INTEGER NOT NULL DEFAULT 0,
|
|
184
|
-
last_decay_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
185
|
-
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
-- Consolidation history for monitoring
|
|
189
|
-
CREATE TABLE IF NOT EXISTS consolidation_history (
|
|
190
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
191
|
-
timestamp INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
192
|
-
patterns_processed INTEGER NOT NULL,
|
|
193
|
-
patterns_preserved INTEGER NOT NULL,
|
|
194
|
-
patterns_pruned INTEGER NOT NULL,
|
|
195
|
-
preservation_rate REAL NOT NULL,
|
|
196
|
-
duration_ms INTEGER NOT NULL,
|
|
197
|
-
average_importance REAL NOT NULL
|
|
198
|
-
);
|
|
199
|
-
`;
|
|
200
|
-
/**
|
|
201
|
-
* PatternStore - EWC++ pattern storage for successful recommendation matches
|
|
202
|
-
*
|
|
203
|
-
* Prevents catastrophic forgetting by tracking which pattern dimensions
|
|
204
|
-
* are important via Fisher Information Matrix and preserving high-importance
|
|
205
|
-
* patterns during consolidation.
|
|
206
|
-
*
|
|
207
|
-
* @example
|
|
208
|
-
* ```typescript
|
|
209
|
-
* const store = new PatternStore({ dbPath: './patterns.db' })
|
|
210
|
-
* await store.initialize()
|
|
211
|
-
*
|
|
212
|
-
* // Store a successful pattern
|
|
213
|
-
* await store.storePattern(
|
|
214
|
-
* {
|
|
215
|
-
* context: { installedSkills: ['commit'], frameworks: ['react'] },
|
|
216
|
-
* skill: { skillId: 'jest-helper', category: 'testing' },
|
|
217
|
-
* originalScore: 0.85,
|
|
218
|
-
* source: 'recommend'
|
|
219
|
-
* },
|
|
220
|
-
* { type: 'accept', reward: 1.0 }
|
|
221
|
-
* )
|
|
222
|
-
*
|
|
223
|
-
* // Find similar patterns
|
|
224
|
-
* const similar = await store.findSimilarPatterns({
|
|
225
|
-
* context: { installedSkills: ['commit'], frameworks: ['react', 'typescript'] }
|
|
226
|
-
* })
|
|
227
|
-
* ```
|
|
228
|
-
*/
|
|
9
|
+
export { DEFAULT_EWC_CONFIG, DEFAULT_PATTERN_STORE_CONFIG, PATTERN_REWARDS, } from './PatternStore.types.js';
|
|
10
|
+
export { FisherInformationMatrix } from './PatternStore.helpers.js';
|
|
11
|
+
import { DEFAULT_EWC_CONFIG, DEFAULT_PATTERN_STORE_CONFIG } from './PatternStore.types.js';
|
|
12
|
+
import { PATTERN_STORE_SCHEMA, FisherInformationMatrix, contextToText, computeGradient, deserializeEmbedding, cosineSimilarity, importanceWeightedSimilarity, calculatePatternImportance, calculateDimensionImportance, rowToStoredPattern, } from './PatternStore.helpers.js';
|
|
13
|
+
import { getPatternCount, getDatabaseSize, getSamplePatterns, getAllPatterns, updatePatternInDB, updatePatternImportance, updateAccessCount, deletePattern, loadFisherMatrixData, saveFisherMatrixData, recordConsolidation, getPatternsByOutcome, getAverageImportance, getHighImportanceCount, getConsolidationStats, getContextEmbeddings, } from './PatternStore.queries.js';
|
|
14
|
+
/** PatternStore - EWC++ pattern storage for successful recommendation matches */
|
|
229
15
|
export class PatternStore {
|
|
230
16
|
db;
|
|
231
17
|
fisherMatrix;
|
|
@@ -234,7 +20,6 @@ export class PatternStore {
|
|
|
234
20
|
config;
|
|
235
21
|
ewcConfig;
|
|
236
22
|
initialized = false;
|
|
237
|
-
// Query performance tracking
|
|
238
23
|
queryLatencies = [];
|
|
239
24
|
maxQuerySamples = 100;
|
|
240
25
|
constructor(config = {}) {
|
|
@@ -250,41 +35,26 @@ export class PatternStore {
|
|
|
250
35
|
totalPatterns: 0,
|
|
251
36
|
};
|
|
252
37
|
}
|
|
253
|
-
/**
|
|
254
|
-
* Initialize the PatternStore
|
|
255
|
-
*/
|
|
256
38
|
async initialize() {
|
|
257
39
|
if (this.initialized)
|
|
258
40
|
return;
|
|
259
|
-
// Initialize database
|
|
260
41
|
this.db = new Database(this.config.dbPath || ':memory:');
|
|
261
42
|
this.db.exec(PATTERN_STORE_SCHEMA);
|
|
262
|
-
// Initialize Fisher Information Matrix
|
|
263
43
|
this.fisherMatrix = new FisherInformationMatrix(this.config.dimensions);
|
|
264
|
-
// Load persisted Fisher matrix if exists
|
|
265
44
|
this.loadFisherMatrix();
|
|
266
|
-
// Initialize embedding service (fallback mode for context encoding)
|
|
267
45
|
this.embeddingService = new EmbeddingService({ useFallback: true });
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
// Try V3 integration
|
|
46
|
+
this.consolidationState.totalPatterns = getPatternCount(this.db);
|
|
47
|
+
// IMPORTANT: Keep dynamic import here for lazy loading / graceful degradation
|
|
271
48
|
if (this.config.useV3Integration) {
|
|
272
49
|
await this.initializeV3Integration();
|
|
273
50
|
}
|
|
274
51
|
this.initialized = true;
|
|
275
52
|
}
|
|
276
|
-
/**
|
|
277
|
-
* Check if PatternStore is initialized
|
|
278
|
-
*/
|
|
279
53
|
isInitialized() {
|
|
280
54
|
return this.initialized;
|
|
281
55
|
}
|
|
282
|
-
/**
|
|
283
|
-
* Attempt to initialize V3 ReasoningBank integration
|
|
284
|
-
*/
|
|
285
56
|
async initializeV3Integration() {
|
|
286
57
|
try {
|
|
287
|
-
// Attempt to import V3 ReasoningBank for future integration
|
|
288
58
|
await import(
|
|
289
59
|
// @ts-expect-error - V3 types not available at compile time
|
|
290
60
|
'claude-flow/v3/@claude-flow/cli/dist/src/intelligence/index.js');
|
|
@@ -294,46 +64,28 @@ export class PatternStore {
|
|
|
294
64
|
console.log('[PatternStore] V3 not available, using standalone mode');
|
|
295
65
|
}
|
|
296
66
|
}
|
|
297
|
-
/**
|
|
298
|
-
* Store a pattern with EWC++ protection
|
|
299
|
-
*
|
|
300
|
-
* @param pattern - Pattern to store
|
|
301
|
-
* @param outcome - Outcome of the recommendation
|
|
302
|
-
* @returns Pattern ID
|
|
303
|
-
*/
|
|
304
67
|
async storePattern(pattern, outcome) {
|
|
305
68
|
this.ensureInitialized();
|
|
306
|
-
|
|
307
|
-
const contextText = this.contextToText(pattern.context);
|
|
69
|
+
const contextText = contextToText(pattern.context);
|
|
308
70
|
const contextEmbedding = await this.embeddingService.embed(contextText);
|
|
309
|
-
|
|
310
|
-
const existingPatterns = await this.findSimilarPatterns({
|
|
311
|
-
context: pattern.context,
|
|
312
|
-
skillId: pattern.skill.skillId,
|
|
313
|
-
positiveOnly: false,
|
|
314
|
-
}, 5);
|
|
71
|
+
const existingPatterns = await this.findSimilarPatterns({ context: pattern.context, skillId: pattern.skill.skillId, positiveOnly: false }, 5);
|
|
315
72
|
if (existingPatterns.length > 0 && existingPatterns[0].similarity > 0.95) {
|
|
316
|
-
// Update existing pattern instead of creating new
|
|
317
73
|
const existingPattern = existingPatterns[0].pattern;
|
|
318
|
-
const gradient =
|
|
74
|
+
const gradient = computeGradient(contextEmbedding, existingPattern.contextEmbedding);
|
|
319
75
|
this.fisherMatrix.update(gradient);
|
|
320
|
-
const newImportance =
|
|
321
|
-
this.
|
|
76
|
+
const newImportance = calculatePatternImportance(existingPattern, outcome);
|
|
77
|
+
updatePatternInDB(this.db, existingPattern.id, {
|
|
322
78
|
importance: newImportance,
|
|
323
79
|
accessCount: existingPattern.accessCount + 1,
|
|
324
80
|
});
|
|
325
81
|
return existingPattern.id;
|
|
326
82
|
}
|
|
327
|
-
// Calculate initial importance
|
|
328
83
|
let baseImportance = Math.abs(outcome.reward);
|
|
329
|
-
if (outcome.reward > 0)
|
|
84
|
+
if (outcome.reward > 0)
|
|
330
85
|
baseImportance *= 1.5;
|
|
331
|
-
|
|
332
|
-
if (outcome.confidence !== undefined) {
|
|
86
|
+
if (outcome.confidence !== undefined)
|
|
333
87
|
baseImportance *= outcome.confidence;
|
|
334
|
-
}
|
|
335
88
|
const importance = baseImportance * this.ewcConfig.importanceThreshold * 10;
|
|
336
|
-
// Store new pattern
|
|
337
89
|
const patternId = pattern.id || randomUUID();
|
|
338
90
|
const stmt = this.db.prepare(`
|
|
339
91
|
INSERT INTO patterns (
|
|
@@ -343,35 +95,22 @@ export class PatternStore {
|
|
|
343
95
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, unixepoch(), unixepoch())
|
|
344
96
|
`);
|
|
345
97
|
stmt.run(patternId, Buffer.from(contextEmbedding.buffer), pattern.skill.skillId, JSON.stringify(pattern.skill), JSON.stringify(pattern.context), outcome.type, outcome.reward, importance, pattern.originalScore, pattern.source);
|
|
346
|
-
// Update Fisher Information
|
|
347
98
|
const avgEmbedding = await this.computeAverageEmbedding();
|
|
348
|
-
const gradient =
|
|
99
|
+
const gradient = computeGradient(contextEmbedding, avgEmbedding);
|
|
349
100
|
this.fisherMatrix.update(gradient);
|
|
350
|
-
// Update consolidation state
|
|
351
101
|
this.consolidationState.patternsSinceLastConsolidation++;
|
|
352
102
|
this.consolidationState.totalPatterns++;
|
|
353
|
-
// Trigger consolidation if needed
|
|
354
103
|
if (this.config.autoConsolidate && this.shouldConsolidate()) {
|
|
355
104
|
await this.consolidate();
|
|
356
105
|
}
|
|
357
|
-
// Persist Fisher matrix
|
|
358
106
|
this.saveFisherMatrix();
|
|
359
107
|
return patternId;
|
|
360
108
|
}
|
|
361
|
-
/**
|
|
362
|
-
* Find similar patterns using importance-weighted similarity
|
|
363
|
-
*
|
|
364
|
-
* @param query - Pattern query
|
|
365
|
-
* @param limit - Maximum results
|
|
366
|
-
* @returns Similar patterns sorted by weighted similarity
|
|
367
|
-
*/
|
|
368
109
|
async findSimilarPatterns(query, limit = 10) {
|
|
369
110
|
this.ensureInitialized();
|
|
370
111
|
const startTime = Date.now();
|
|
371
|
-
|
|
372
|
-
const queryText = this.contextToText(query.context);
|
|
112
|
+
const queryText = contextToText(query.context);
|
|
373
113
|
const queryEmbedding = await this.embeddingService.embed(queryText);
|
|
374
|
-
// Build SQL query with filters
|
|
375
114
|
let sql = 'SELECT * FROM patterns WHERE 1=1';
|
|
376
115
|
const params = [];
|
|
377
116
|
if (query.skillId) {
|
|
@@ -393,52 +132,30 @@ export class PatternStore {
|
|
|
393
132
|
if (query.positiveOnly) {
|
|
394
133
|
sql += ' AND outcome_reward > 0';
|
|
395
134
|
}
|
|
396
|
-
// Fetch candidate patterns
|
|
397
135
|
const stmt = this.db.prepare(sql);
|
|
398
136
|
const candidates = stmt.all(...params);
|
|
399
|
-
// Calculate similarity scores
|
|
400
137
|
const importanceVector = this.fisherMatrix.getImportanceVector();
|
|
401
138
|
const results = [];
|
|
402
139
|
for (const candidate of candidates) {
|
|
403
|
-
const candidateEmbedding =
|
|
404
|
-
const similarity =
|
|
405
|
-
const weightedSimilarity =
|
|
406
|
-
const storedPattern = {
|
|
407
|
-
id: candidate.pattern_id,
|
|
408
|
-
context: JSON.parse(candidate.context_data),
|
|
409
|
-
skill: JSON.parse(candidate.skill_features),
|
|
410
|
-
originalScore: candidate.original_score,
|
|
411
|
-
source: candidate.source,
|
|
412
|
-
contextEmbedding: candidateEmbedding,
|
|
413
|
-
outcome: {
|
|
414
|
-
type: candidate.outcome_type,
|
|
415
|
-
reward: candidate.outcome_reward,
|
|
416
|
-
},
|
|
417
|
-
importance: candidate.importance,
|
|
418
|
-
accessCount: candidate.access_count,
|
|
419
|
-
createdAt: new Date(candidate.created_at * 1000),
|
|
420
|
-
lastAccessedAt: new Date(candidate.last_accessed_at * 1000),
|
|
421
|
-
};
|
|
140
|
+
const candidateEmbedding = deserializeEmbedding(candidate.context_embedding, this.config.dimensions);
|
|
141
|
+
const similarity = cosineSimilarity(queryEmbedding, candidateEmbedding);
|
|
142
|
+
const weightedSimilarity = importanceWeightedSimilarity(queryEmbedding, candidateEmbedding, importanceVector);
|
|
422
143
|
results.push({
|
|
423
|
-
pattern:
|
|
144
|
+
pattern: rowToStoredPattern(candidate, this.config.dimensions),
|
|
424
145
|
similarity,
|
|
425
146
|
weightedSimilarity,
|
|
426
147
|
rank: 0,
|
|
427
148
|
});
|
|
428
149
|
}
|
|
429
|
-
// Sort by weighted similarity
|
|
430
150
|
results.sort((a, b) => b.weightedSimilarity - a.weightedSimilarity);
|
|
431
|
-
// Assign ranks
|
|
432
151
|
for (let i = 0; i < results.length; i++) {
|
|
433
152
|
results[i].rank = i + 1;
|
|
434
153
|
}
|
|
435
|
-
// Update access tracking
|
|
436
154
|
if (this.config.trackAccess) {
|
|
437
155
|
for (const result of results.slice(0, limit)) {
|
|
438
|
-
this.
|
|
156
|
+
updateAccessCount(this.db, result.pattern.id);
|
|
439
157
|
}
|
|
440
158
|
}
|
|
441
|
-
// Track query latency
|
|
442
159
|
const latency = Date.now() - startTime;
|
|
443
160
|
this.queryLatencies.push(latency);
|
|
444
161
|
if (this.queryLatencies.length > this.maxQuerySamples) {
|
|
@@ -446,20 +163,11 @@ export class PatternStore {
|
|
|
446
163
|
}
|
|
447
164
|
return results.slice(0, limit);
|
|
448
165
|
}
|
|
449
|
-
/**
|
|
450
|
-
* Consolidate patterns using EWC++
|
|
451
|
-
*
|
|
452
|
-
* Applies Fisher decay, recalculates importance, and prunes low-importance patterns.
|
|
453
|
-
* Guarantees 95%+ preservation of important patterns.
|
|
454
|
-
*
|
|
455
|
-
* @returns Consolidation result
|
|
456
|
-
*/
|
|
457
166
|
async consolidate() {
|
|
458
167
|
this.ensureInitialized();
|
|
459
168
|
const startTime = Date.now();
|
|
460
|
-
const totalPatterns = this.
|
|
169
|
+
const totalPatterns = getPatternCount(this.db);
|
|
461
170
|
const newPatternsRatio = totalPatterns > 0 ? this.consolidationState.patternsSinceLastConsolidation / totalPatterns : 0;
|
|
462
|
-
// Check if consolidation is needed
|
|
463
171
|
if (newPatternsRatio < this.ewcConfig.consolidationThreshold) {
|
|
464
172
|
return {
|
|
465
173
|
consolidated: false,
|
|
@@ -471,32 +179,27 @@ export class PatternStore {
|
|
|
471
179
|
averageImportance: this.fisherMatrix.getAverageImportance(),
|
|
472
180
|
};
|
|
473
181
|
}
|
|
474
|
-
// Apply Fisher decay
|
|
475
182
|
this.fisherMatrix.decay(this.ewcConfig.fisherDecay);
|
|
476
|
-
|
|
477
|
-
const samplePatterns = this.getSamplePatterns(this.ewcConfig.fisherSampleSize);
|
|
183
|
+
const samplePatterns = getSamplePatterns(this.db, this.ewcConfig.fisherSampleSize, this.config.dimensions);
|
|
478
184
|
const avgEmbedding = await this.computeAverageEmbedding();
|
|
479
185
|
for (const pattern of samplePatterns) {
|
|
480
|
-
const gradient =
|
|
186
|
+
const gradient = computeGradient(pattern.contextEmbedding, avgEmbedding);
|
|
481
187
|
this.fisherMatrix.update(gradient);
|
|
482
188
|
}
|
|
483
|
-
|
|
484
|
-
const allPatterns = this.getAllPatterns();
|
|
189
|
+
const allPatterns = getAllPatterns(this.db, this.config.dimensions);
|
|
485
190
|
const importanceVector = this.fisherMatrix.getImportanceVector();
|
|
486
191
|
for (const pattern of allPatterns) {
|
|
487
|
-
const newImportance =
|
|
488
|
-
this.
|
|
192
|
+
const newImportance = calculateDimensionImportance(pattern, importanceVector, this.config.dimensions, this.ewcConfig.lambda);
|
|
193
|
+
updatePatternImportance(this.db, pattern.id, newImportance);
|
|
489
194
|
}
|
|
490
|
-
// Prune low-importance patterns
|
|
491
195
|
let prunedCount = 0;
|
|
492
196
|
let preservedCount = 0;
|
|
493
|
-
// Sort by importance (ascending) for pruning
|
|
494
197
|
const sortedPatterns = [...allPatterns].sort((a, b) => a.importance - b.importance);
|
|
495
198
|
if (sortedPatterns.length > this.ewcConfig.maxPatterns) {
|
|
496
199
|
const pruneCandidates = sortedPatterns.slice(0, sortedPatterns.length - this.ewcConfig.maxPatterns);
|
|
497
200
|
for (const candidate of pruneCandidates) {
|
|
498
201
|
if (candidate.importance < this.ewcConfig.importanceThreshold) {
|
|
499
|
-
this.
|
|
202
|
+
deletePattern(this.db, candidate.id);
|
|
500
203
|
prunedCount++;
|
|
501
204
|
}
|
|
502
205
|
else {
|
|
@@ -506,10 +209,9 @@ export class PatternStore {
|
|
|
506
209
|
preservedCount += this.ewcConfig.maxPatterns;
|
|
507
210
|
}
|
|
508
211
|
else {
|
|
509
|
-
// Prune very low importance patterns even if under limit
|
|
510
212
|
for (const pattern of sortedPatterns) {
|
|
511
213
|
if (pattern.importance < this.ewcConfig.importanceThreshold * 0.1) {
|
|
512
|
-
this.
|
|
214
|
+
deletePattern(this.db, pattern.id);
|
|
513
215
|
prunedCount++;
|
|
514
216
|
}
|
|
515
217
|
else {
|
|
@@ -518,21 +220,12 @@ export class PatternStore {
|
|
|
518
220
|
}
|
|
519
221
|
}
|
|
520
222
|
const preservationRate = preservedCount / (preservedCount + prunedCount) || 1.0;
|
|
521
|
-
// Update consolidation state
|
|
522
223
|
this.consolidationState.lastConsolidation = new Date();
|
|
523
224
|
this.consolidationState.patternsSinceLastConsolidation = 0;
|
|
524
|
-
this.consolidationState.totalPatterns = this.
|
|
525
|
-
// Record consolidation history
|
|
225
|
+
this.consolidationState.totalPatterns = getPatternCount(this.db);
|
|
526
226
|
const durationMs = Date.now() - startTime;
|
|
527
227
|
const avgImportance = this.fisherMatrix.getAverageImportance();
|
|
528
|
-
|
|
529
|
-
INSERT INTO consolidation_history (
|
|
530
|
-
patterns_processed, patterns_preserved, patterns_pruned,
|
|
531
|
-
preservation_rate, duration_ms, average_importance
|
|
532
|
-
) VALUES (?, ?, ?, ?, ?, ?)
|
|
533
|
-
`);
|
|
534
|
-
historyStmt.run(preservedCount + prunedCount, preservedCount, prunedCount, preservationRate, durationMs, avgImportance);
|
|
535
|
-
// Persist Fisher matrix
|
|
228
|
+
recordConsolidation(this.db, preservedCount + prunedCount, preservedCount, prunedCount, preservationRate, durationMs, avgImportance);
|
|
536
229
|
this.saveFisherMatrix();
|
|
537
230
|
return {
|
|
538
231
|
consolidated: true,
|
|
@@ -544,64 +237,19 @@ export class PatternStore {
|
|
|
544
237
|
averageImportance: avgImportance,
|
|
545
238
|
};
|
|
546
239
|
}
|
|
547
|
-
/**
|
|
548
|
-
* Get pattern importance value
|
|
549
|
-
*
|
|
550
|
-
* @param patternId - Pattern identifier
|
|
551
|
-
* @returns Importance value or 0 if not found
|
|
552
|
-
*/
|
|
553
240
|
getPatternImportance(patternId) {
|
|
554
241
|
this.ensureInitialized();
|
|
555
242
|
const stmt = this.db.prepare('SELECT importance FROM patterns WHERE pattern_id = ?');
|
|
556
243
|
const result = stmt.get(patternId);
|
|
557
244
|
return result?.importance ?? 0;
|
|
558
245
|
}
|
|
559
|
-
/**
|
|
560
|
-
* Get PatternStore metrics
|
|
561
|
-
*/
|
|
562
246
|
getMetrics() {
|
|
563
247
|
this.ensureInitialized();
|
|
564
|
-
|
|
565
|
-
const
|
|
566
|
-
|
|
567
|
-
const
|
|
568
|
-
|
|
569
|
-
`);
|
|
570
|
-
const outcomeCounts = outcomeStmt.all();
|
|
571
|
-
const patternsByOutcome = {
|
|
572
|
-
accept: 0,
|
|
573
|
-
usage: 0,
|
|
574
|
-
frequent: 0,
|
|
575
|
-
dismiss: 0,
|
|
576
|
-
abandonment: 0,
|
|
577
|
-
uninstall: 0,
|
|
578
|
-
};
|
|
579
|
-
for (const row of outcomeCounts) {
|
|
580
|
-
patternsByOutcome[row.outcome_type] = row.count;
|
|
581
|
-
}
|
|
582
|
-
// Average importance
|
|
583
|
-
const avgStmt = this.db.prepare('SELECT AVG(importance) as avg FROM patterns');
|
|
584
|
-
const avgResult = avgStmt.get();
|
|
585
|
-
const averageImportance = avgResult?.avg ?? 0;
|
|
586
|
-
// High importance patterns (above 90th percentile)
|
|
587
|
-
const percentileStmt = this.db.prepare(`
|
|
588
|
-
SELECT importance FROM patterns ORDER BY importance DESC
|
|
589
|
-
LIMIT CAST((SELECT COUNT(*) FROM patterns) * 0.1 AS INTEGER)
|
|
590
|
-
`);
|
|
591
|
-
const highImportancePatterns = percentileStmt.all().length;
|
|
592
|
-
// Consolidation stats
|
|
593
|
-
const consolidationStmt = this.db.prepare(`
|
|
594
|
-
SELECT
|
|
595
|
-
COUNT(*) as total,
|
|
596
|
-
MAX(timestamp) as last_timestamp,
|
|
597
|
-
AVG(preservation_rate) as avg_rate,
|
|
598
|
-
SUM(patterns_pruned) as total_pruned
|
|
599
|
-
FROM consolidation_history
|
|
600
|
-
`);
|
|
601
|
-
const consolidationResult = consolidationStmt.get();
|
|
602
|
-
// Storage size
|
|
603
|
-
const fisherMatrixSize = 4 + this.config.dimensions * 4 * 2; // updateCount + importance + runningSum
|
|
604
|
-
// Query performance
|
|
248
|
+
const totalPatterns = getPatternCount(this.db);
|
|
249
|
+
const patternsByOutcome = getPatternsByOutcome(this.db);
|
|
250
|
+
const averageImportance = getAverageImportance(this.db);
|
|
251
|
+
const highImportancePatterns = getHighImportanceCount(this.db);
|
|
252
|
+
const consolidationStats = getConsolidationStats(this.db);
|
|
605
253
|
const avgLatency = this.queryLatencies.length > 0
|
|
606
254
|
? this.queryLatencies.reduce((a, b) => a + b, 0) / this.queryLatencies.length
|
|
607
255
|
: 0;
|
|
@@ -611,16 +259,16 @@ export class PatternStore {
|
|
|
611
259
|
averageImportance,
|
|
612
260
|
highImportancePatterns,
|
|
613
261
|
consolidation: {
|
|
614
|
-
totalConsolidations:
|
|
615
|
-
lastConsolidation:
|
|
616
|
-
? new Date(
|
|
262
|
+
totalConsolidations: consolidationStats.total,
|
|
263
|
+
lastConsolidation: consolidationStats.lastTimestamp
|
|
264
|
+
? new Date(consolidationStats.lastTimestamp * 1000)
|
|
617
265
|
: null,
|
|
618
|
-
averagePreservationRate:
|
|
619
|
-
patternsPruned:
|
|
266
|
+
averagePreservationRate: consolidationStats.avgRate ?? 1.0,
|
|
267
|
+
patternsPruned: consolidationStats.totalPruned ?? 0,
|
|
620
268
|
},
|
|
621
269
|
storage: {
|
|
622
|
-
sizeBytes: this.
|
|
623
|
-
fisherMatrixSizeBytes:
|
|
270
|
+
sizeBytes: getDatabaseSize(this.db),
|
|
271
|
+
fisherMatrixSizeBytes: 4 + this.config.dimensions * 4 * 2,
|
|
624
272
|
},
|
|
625
273
|
queryPerformance: {
|
|
626
274
|
averageLatencyMs: avgLatency,
|
|
@@ -628,57 +276,25 @@ export class PatternStore {
|
|
|
628
276
|
},
|
|
629
277
|
};
|
|
630
278
|
}
|
|
631
|
-
/**
|
|
632
|
-
* Close the PatternStore and release resources
|
|
633
|
-
*/
|
|
634
279
|
close() {
|
|
635
280
|
if (this.db) {
|
|
636
281
|
this.db.close();
|
|
637
282
|
}
|
|
638
283
|
}
|
|
639
|
-
//
|
|
640
|
-
// Private Helper Methods
|
|
641
|
-
// ============================================================================
|
|
284
|
+
// Private helpers
|
|
642
285
|
ensureInitialized() {
|
|
643
286
|
if (!this.initialized) {
|
|
644
287
|
throw new Error('PatternStore not initialized. Call initialize() first.');
|
|
645
288
|
}
|
|
646
289
|
}
|
|
647
|
-
contextToText(context) {
|
|
648
|
-
const parts = [];
|
|
649
|
-
if (context.installedSkills && context.installedSkills.length > 0) {
|
|
650
|
-
parts.push(`installed: ${context.installedSkills.join(', ')}`);
|
|
651
|
-
}
|
|
652
|
-
if (context.frameworks && context.frameworks.length > 0) {
|
|
653
|
-
parts.push(`frameworks: ${context.frameworks.join(', ')}`);
|
|
654
|
-
}
|
|
655
|
-
if (context.keywords && context.keywords.length > 0) {
|
|
656
|
-
parts.push(`keywords: ${context.keywords.join(', ')}`);
|
|
657
|
-
}
|
|
658
|
-
if (context.timeOfDay) {
|
|
659
|
-
parts.push(`time: ${context.timeOfDay}`);
|
|
660
|
-
}
|
|
661
|
-
if (context.dayType) {
|
|
662
|
-
parts.push(`day: ${context.dayType}`);
|
|
663
|
-
}
|
|
664
|
-
return parts.join(' | ') || 'empty context';
|
|
665
|
-
}
|
|
666
|
-
computeGradient(a, b) {
|
|
667
|
-
const gradient = new Float32Array(a.length);
|
|
668
|
-
for (let i = 0; i < a.length; i++) {
|
|
669
|
-
gradient[i] = a[i] - (b[i] ?? 0);
|
|
670
|
-
}
|
|
671
|
-
return gradient;
|
|
672
|
-
}
|
|
673
290
|
async computeAverageEmbedding() {
|
|
674
|
-
const
|
|
675
|
-
const rows = stmt.all();
|
|
291
|
+
const rows = getContextEmbeddings(this.db, 100);
|
|
676
292
|
if (rows.length === 0) {
|
|
677
293
|
return new Float32Array(this.config.dimensions);
|
|
678
294
|
}
|
|
679
295
|
const sum = new Float32Array(this.config.dimensions);
|
|
680
296
|
for (const row of rows) {
|
|
681
|
-
const embedding =
|
|
297
|
+
const embedding = deserializeEmbedding(row.context_embedding, this.config.dimensions);
|
|
682
298
|
for (let i = 0; i < embedding.length; i++) {
|
|
683
299
|
sum[i] += embedding[i];
|
|
684
300
|
}
|
|
@@ -688,73 +304,7 @@ export class PatternStore {
|
|
|
688
304
|
}
|
|
689
305
|
return sum;
|
|
690
306
|
}
|
|
691
|
-
deserializeEmbedding(buffer) {
|
|
692
|
-
const floatArray = new Float32Array(this.config.dimensions);
|
|
693
|
-
for (let i = 0; i < this.config.dimensions; i++) {
|
|
694
|
-
floatArray[i] = buffer.readFloatLE(i * 4);
|
|
695
|
-
}
|
|
696
|
-
return floatArray;
|
|
697
|
-
}
|
|
698
|
-
cosineSimilarity(a, b) {
|
|
699
|
-
let dotProduct = 0;
|
|
700
|
-
let normA = 0;
|
|
701
|
-
let normB = 0;
|
|
702
|
-
for (let i = 0; i < a.length; i++) {
|
|
703
|
-
dotProduct += a[i] * b[i];
|
|
704
|
-
normA += a[i] * a[i];
|
|
705
|
-
normB += b[i] * b[i];
|
|
706
|
-
}
|
|
707
|
-
if (normA === 0 || normB === 0)
|
|
708
|
-
return 0;
|
|
709
|
-
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
710
|
-
}
|
|
711
|
-
importanceWeightedSimilarity(a, b, importance) {
|
|
712
|
-
let weightedDotProduct = 0;
|
|
713
|
-
let normA = 0;
|
|
714
|
-
let normB = 0;
|
|
715
|
-
for (let i = 0; i < a.length; i++) {
|
|
716
|
-
const weight = 1 + (importance[i] ?? 0);
|
|
717
|
-
weightedDotProduct += weight * a[i] * b[i];
|
|
718
|
-
normA += weight * a[i] * a[i];
|
|
719
|
-
normB += weight * b[i] * b[i];
|
|
720
|
-
}
|
|
721
|
-
if (normA === 0 || normB === 0)
|
|
722
|
-
return 0;
|
|
723
|
-
return weightedDotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
724
|
-
}
|
|
725
|
-
calculatePatternImportance(pattern, outcome) {
|
|
726
|
-
let baseImportance = Math.abs(outcome.reward);
|
|
727
|
-
if (outcome.reward > 0) {
|
|
728
|
-
baseImportance *= 1.5;
|
|
729
|
-
}
|
|
730
|
-
// Recency factor
|
|
731
|
-
const ageInDays = (Date.now() - pattern.createdAt.getTime()) / (24 * 60 * 60 * 1000);
|
|
732
|
-
const recencyFactor = Math.exp(-ageInDays / 30);
|
|
733
|
-
// Access frequency factor
|
|
734
|
-
const accessFactor = 1 + Math.log(1 + pattern.accessCount);
|
|
735
|
-
return baseImportance * recencyFactor * accessFactor * pattern.importance;
|
|
736
|
-
}
|
|
737
|
-
calculateDimensionImportance(pattern, importanceVector) {
|
|
738
|
-
let baseImportance = Math.abs(pattern.outcome.reward);
|
|
739
|
-
if (pattern.outcome.reward > 0) {
|
|
740
|
-
baseImportance *= 1.5;
|
|
741
|
-
}
|
|
742
|
-
const ageInDays = (Date.now() - pattern.createdAt.getTime()) / (24 * 60 * 60 * 1000);
|
|
743
|
-
const recencyFactor = Math.exp(-ageInDays / 30);
|
|
744
|
-
const accessFactor = 1 + Math.log(1 + pattern.accessCount);
|
|
745
|
-
// Fisher dimension importance (EWC++ core)
|
|
746
|
-
// Lambda scales how much we weight Fisher importance in preservation
|
|
747
|
-
let dimensionImportance = 0;
|
|
748
|
-
for (let i = 0; i < this.config.dimensions; i++) {
|
|
749
|
-
dimensionImportance += (importanceVector[i] ?? 0) * Math.abs(pattern.contextEmbedding[i] ?? 0);
|
|
750
|
-
}
|
|
751
|
-
dimensionImportance /= this.config.dimensions;
|
|
752
|
-
// Apply lambda regularization: higher lambda = stronger importance preservation
|
|
753
|
-
const lambdaScaled = 1 + (this.ewcConfig.lambda * dimensionImportance) / 10;
|
|
754
|
-
return baseImportance * recencyFactor * accessFactor * lambdaScaled;
|
|
755
|
-
}
|
|
756
307
|
shouldConsolidate() {
|
|
757
|
-
// Minimum 1 hour between consolidations
|
|
758
308
|
if (this.consolidationState.lastConsolidation) {
|
|
759
309
|
const hoursSinceLast = (Date.now() - this.consolidationState.lastConsolidation.getTime()) / (60 * 60 * 1000);
|
|
760
310
|
if (hoursSinceLast < 1)
|
|
@@ -765,103 +315,17 @@ export class PatternStore {
|
|
|
765
315
|
const newPatternsRatio = this.consolidationState.patternsSinceLastConsolidation / this.consolidationState.totalPatterns;
|
|
766
316
|
if (newPatternsRatio >= this.ewcConfig.consolidationThreshold)
|
|
767
317
|
return true;
|
|
768
|
-
// Force consolidation if approaching max patterns
|
|
769
318
|
if (this.consolidationState.totalPatterns > this.ewcConfig.maxPatterns * 0.9)
|
|
770
319
|
return true;
|
|
771
320
|
return false;
|
|
772
321
|
}
|
|
773
|
-
getPatternCount() {
|
|
774
|
-
const stmt = this.db.prepare('SELECT COUNT(*) as count FROM patterns');
|
|
775
|
-
const result = stmt.get();
|
|
776
|
-
return result.count;
|
|
777
|
-
}
|
|
778
|
-
getSamplePatterns(limit) {
|
|
779
|
-
const stmt = this.db.prepare(`
|
|
780
|
-
SELECT * FROM patterns ORDER BY RANDOM() LIMIT ?
|
|
781
|
-
`);
|
|
782
|
-
const rows = stmt.all(limit);
|
|
783
|
-
return rows.map((row) => ({
|
|
784
|
-
id: row.pattern_id,
|
|
785
|
-
context: JSON.parse(row.context_data),
|
|
786
|
-
skill: JSON.parse(row.skill_features),
|
|
787
|
-
originalScore: row.original_score,
|
|
788
|
-
source: row.source,
|
|
789
|
-
contextEmbedding: this.deserializeEmbedding(row.context_embedding),
|
|
790
|
-
outcome: {
|
|
791
|
-
type: row.outcome_type,
|
|
792
|
-
reward: row.outcome_reward,
|
|
793
|
-
},
|
|
794
|
-
importance: row.importance,
|
|
795
|
-
accessCount: row.access_count,
|
|
796
|
-
createdAt: new Date(row.created_at * 1000),
|
|
797
|
-
lastAccessedAt: new Date(row.last_accessed_at * 1000),
|
|
798
|
-
}));
|
|
799
|
-
}
|
|
800
|
-
getAllPatterns() {
|
|
801
|
-
const stmt = this.db.prepare('SELECT * FROM patterns');
|
|
802
|
-
const rows = stmt.all();
|
|
803
|
-
return rows.map((row) => ({
|
|
804
|
-
id: row.pattern_id,
|
|
805
|
-
context: JSON.parse(row.context_data),
|
|
806
|
-
skill: JSON.parse(row.skill_features),
|
|
807
|
-
originalScore: row.original_score,
|
|
808
|
-
source: row.source,
|
|
809
|
-
contextEmbedding: this.deserializeEmbedding(row.context_embedding),
|
|
810
|
-
outcome: {
|
|
811
|
-
type: row.outcome_type,
|
|
812
|
-
reward: row.outcome_reward,
|
|
813
|
-
},
|
|
814
|
-
importance: row.importance,
|
|
815
|
-
accessCount: row.access_count,
|
|
816
|
-
createdAt: new Date(row.created_at * 1000),
|
|
817
|
-
lastAccessedAt: new Date(row.last_accessed_at * 1000),
|
|
818
|
-
}));
|
|
819
|
-
}
|
|
820
|
-
updatePatternInDB(patternId, updates) {
|
|
821
|
-
const sets = [];
|
|
822
|
-
const params = [];
|
|
823
|
-
if (updates.importance !== undefined) {
|
|
824
|
-
sets.push('importance = ?');
|
|
825
|
-
params.push(updates.importance);
|
|
826
|
-
}
|
|
827
|
-
if (updates.accessCount !== undefined) {
|
|
828
|
-
sets.push('access_count = ?');
|
|
829
|
-
params.push(updates.accessCount);
|
|
830
|
-
}
|
|
831
|
-
sets.push('last_accessed_at = unixepoch()');
|
|
832
|
-
params.push(patternId);
|
|
833
|
-
const stmt = this.db.prepare(`UPDATE patterns SET ${sets.join(', ')} WHERE pattern_id = ?`);
|
|
834
|
-
stmt.run(...params);
|
|
835
|
-
}
|
|
836
|
-
updatePatternImportance(patternId, importance) {
|
|
837
|
-
const stmt = this.db.prepare('UPDATE patterns SET importance = ? WHERE pattern_id = ?');
|
|
838
|
-
stmt.run(importance, patternId);
|
|
839
|
-
}
|
|
840
|
-
updateAccessCount(patternId) {
|
|
841
|
-
const stmt = this.db.prepare(`
|
|
842
|
-
UPDATE patterns SET access_count = access_count + 1, last_accessed_at = unixepoch()
|
|
843
|
-
WHERE pattern_id = ?
|
|
844
|
-
`);
|
|
845
|
-
stmt.run(patternId);
|
|
846
|
-
}
|
|
847
|
-
deletePattern(patternId) {
|
|
848
|
-
const stmt = this.db.prepare('DELETE FROM patterns WHERE pattern_id = ?');
|
|
849
|
-
stmt.run(patternId);
|
|
850
|
-
}
|
|
851
|
-
getDatabaseSize() {
|
|
852
|
-
const stmt = this.db.prepare('SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size()');
|
|
853
|
-
const result = stmt.get();
|
|
854
|
-
return result?.size ?? 0;
|
|
855
|
-
}
|
|
856
322
|
loadFisherMatrix() {
|
|
857
|
-
const
|
|
858
|
-
|
|
859
|
-
if (result?.matrix_data) {
|
|
323
|
+
const matrixData = loadFisherMatrixData(this.db);
|
|
324
|
+
if (matrixData) {
|
|
860
325
|
try {
|
|
861
|
-
this.fisherMatrix.deserialize(
|
|
326
|
+
this.fisherMatrix.deserialize(matrixData);
|
|
862
327
|
}
|
|
863
328
|
catch {
|
|
864
|
-
// Corrupted matrix data - reset to fresh state
|
|
865
329
|
console.warn('[PatternStore] Fisher matrix data corrupted, resetting');
|
|
866
330
|
this.fisherMatrix.reset();
|
|
867
331
|
}
|
|
@@ -869,21 +333,11 @@ export class PatternStore {
|
|
|
869
333
|
}
|
|
870
334
|
saveFisherMatrix() {
|
|
871
335
|
const matrixData = this.fisherMatrix.serialize();
|
|
872
|
-
|
|
873
|
-
INSERT OR REPLACE INTO fisher_info (id, matrix_data, update_count, last_decay_at, updated_at)
|
|
874
|
-
VALUES (1, ?, ?, unixepoch(), unixepoch())
|
|
875
|
-
`);
|
|
876
|
-
stmt.run(matrixData, this.fisherMatrix.getUpdateCount());
|
|
336
|
+
saveFisherMatrixData(this.db, matrixData, this.fisherMatrix.getUpdateCount());
|
|
877
337
|
}
|
|
878
338
|
}
|
|
879
|
-
// ============================================================================
|
|
880
|
-
// Factory Function
|
|
881
|
-
// ============================================================================
|
|
882
339
|
/**
|
|
883
340
|
* Create and initialize a PatternStore instance
|
|
884
|
-
*
|
|
885
|
-
* @param config - Configuration options
|
|
886
|
-
* @returns Initialized PatternStore
|
|
887
341
|
*/
|
|
888
342
|
export async function createPatternStore(config = {}) {
|
|
889
343
|
const store = new PatternStore(config);
|