@skillsmith/core 0.4.1 → 0.4.3
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/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/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/api/client.d.ts +5 -121
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +24 -136
- 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/utils.d.ts +46 -0
- package/dist/src/api/utils.d.ts.map +1 -0
- package/dist/src/api/utils.js +96 -0
- package/dist/src/api/utils.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 +3 -62
- package/dist/src/billing/StripeClient.d.ts.map +1 -1
- package/dist/src/billing/StripeClient.js +10 -68
- 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 -59
- package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -1
- package/dist/src/billing/StripeWebhookHandler.js +14 -304
- 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 +7 -104
- package/dist/src/db/migration.d.ts.map +1 -1
- package/dist/src/db/migration.js +15 -65
- package/dist/src/db/migration.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/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/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 +11 -55
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +24 -59
- package/dist/src/index.js.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/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 -203
- package/dist/src/scripts/github-import/github-client.js.map +1 -1
- 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 +1 -0
- package/dist/src/scripts/review-lenny-skills.d.ts.map +1 -1
- package/dist/src/scripts/review-lenny-skills.js +5 -310
- package/dist/src/scripts/review-lenny-skills.js.map +1 -1
- 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 +2 -11
- package/dist/src/security/AuditLogger.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/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 +2 -31
- 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 +14 -132
- 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 +6 -86
- package/dist/src/services/SkillAnalyzer.d.ts.map +1 -1
- 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 +16 -167
- package/dist/src/services/SkillAnalyzer.js.map +1 -1
- 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 +4 -70
- package/dist/src/services/SkillDecomposer.d.ts.map +1 -1
- 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 +6 -249
- package/dist/src/services/SkillDecomposer.js.map +1 -1
- 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 +12 -3
- package/dist/src/services/SubagentGenerator.d.ts.map +1 -1
- package/dist/src/services/SubagentGenerator.js +43 -10
- package/dist/src/services/SubagentGenerator.js.map +1 -1
- 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 +8 -4
- package/dist/src/services/TransformationService.d.ts.map +1 -1
- package/dist/src/services/TransformationService.js +58 -34
- package/dist/src/services/TransformationService.js.map +1 -1
- 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.js +12 -10
- package/dist/src/services/__tests__/TransformationService.test.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 +23 -168
- package/dist/src/telemetry/tracer.js.map +1 -1
- 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/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 +4 -1
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +6 -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/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/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/api/utils.test.d.ts +7 -0
- package/dist/tests/api/utils.test.d.ts.map +1 -0
- package/dist/tests/api/utils.test.js +121 -0
- package/dist/tests/api/utils.test.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/package.json +4 -4
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1535: Neural Test Infrastructure - Privacy and Repository Mocks
|
|
3
|
+
*
|
|
4
|
+
* Mock implementations of privacy manager and user preference repository.
|
|
5
|
+
*
|
|
6
|
+
* @see packages/core/src/learning/interfaces.js
|
|
7
|
+
* @see packages/core/src/learning/types.js
|
|
8
|
+
*/
|
|
9
|
+
import { SignalType, } from '../../../src/learning/types.js';
|
|
10
|
+
import { createDefaultProfile } from './neural-fixtures.js';
|
|
11
|
+
/**
|
|
12
|
+
* Mock implementation of IPrivacyManager for testing
|
|
13
|
+
*/
|
|
14
|
+
export class MockPrivacyManager {
|
|
15
|
+
signalCollector;
|
|
16
|
+
profileRepo;
|
|
17
|
+
auditLog = [];
|
|
18
|
+
constructor(signalCollector, profileRepo) {
|
|
19
|
+
this.signalCollector = signalCollector;
|
|
20
|
+
this.profileRepo = profileRepo;
|
|
21
|
+
}
|
|
22
|
+
async purgeOldSignals(retentionDays) {
|
|
23
|
+
const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
|
|
24
|
+
const deleted = this.signalCollector.removeOldSignals(cutoff);
|
|
25
|
+
this.auditLog.push({
|
|
26
|
+
operation: 'purgeOldSignals',
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
details: `Deleted ${deleted} signals older than ${retentionDays} days`,
|
|
29
|
+
});
|
|
30
|
+
return deleted;
|
|
31
|
+
}
|
|
32
|
+
async exportUserData() {
|
|
33
|
+
const profile = (await this.profileRepo.getProfile()) ?? createDefaultProfile();
|
|
34
|
+
const signals = this.signalCollector.getAllSignals();
|
|
35
|
+
this.auditLog.push({
|
|
36
|
+
operation: 'exportUserData',
|
|
37
|
+
timestamp: Date.now(),
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
exported_at: Date.now(),
|
|
41
|
+
version: profile.version,
|
|
42
|
+
profile,
|
|
43
|
+
signals,
|
|
44
|
+
stats: [], // Simplified for testing
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async wipeAllData() {
|
|
48
|
+
const signalCount = await this.signalCollector.getSignalCount();
|
|
49
|
+
this.signalCollector.clear();
|
|
50
|
+
await this.profileRepo.deleteProfile();
|
|
51
|
+
this.auditLog.push({
|
|
52
|
+
operation: 'wipeAllData',
|
|
53
|
+
timestamp: Date.now(),
|
|
54
|
+
details: `Wiped ${signalCount} signals and profile`,
|
|
55
|
+
});
|
|
56
|
+
return signalCount + 1; // signals + profile
|
|
57
|
+
}
|
|
58
|
+
async anonymizeForAnalytics() {
|
|
59
|
+
const signals = this.signalCollector.getAllSignals();
|
|
60
|
+
const signalCounts = {};
|
|
61
|
+
const categoryCounts = new Map();
|
|
62
|
+
for (const signal of signals) {
|
|
63
|
+
signalCounts[signal.type] = (signalCounts[signal.type] ?? 0) + 1;
|
|
64
|
+
const cat = signal.context.category;
|
|
65
|
+
if (cat) {
|
|
66
|
+
categoryCounts.set(cat, (categoryCounts.get(cat) ?? 0) + 1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const acceptCount = signalCounts[SignalType.ACCEPT] ?? 0;
|
|
70
|
+
const dismissCount = signalCounts[SignalType.DISMISS] ?? 0;
|
|
71
|
+
const acceptRate = acceptCount + dismissCount > 0 ? acceptCount / (acceptCount + dismissCount) : 0;
|
|
72
|
+
return {
|
|
73
|
+
date: new Date().toISOString().split('T')[0],
|
|
74
|
+
total_signals: signals.length,
|
|
75
|
+
signal_counts: signalCounts,
|
|
76
|
+
avg_accept_rate: acceptRate,
|
|
77
|
+
avg_utilization_rate: 0, // Simplified
|
|
78
|
+
popular_categories: Array.from(categoryCounts.entries())
|
|
79
|
+
.sort((a, b) => b[1] - a[1])
|
|
80
|
+
.slice(0, 5)
|
|
81
|
+
.map(([category, count]) => ({ category, count })),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async getStorageSize() {
|
|
85
|
+
const signals = this.signalCollector.getAllSignals();
|
|
86
|
+
return JSON.stringify(signals).length; // Approximate size in bytes
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Verify that no PII (Personally Identifiable Information) is stored.
|
|
90
|
+
*
|
|
91
|
+
* Mock Implementation Details
|
|
92
|
+
* ---------------------------
|
|
93
|
+
* This mock always returns true because the test environment uses
|
|
94
|
+
* controlled, synthetic data that never contains real PII.
|
|
95
|
+
*
|
|
96
|
+
* A real implementation should:
|
|
97
|
+
* 1. Scan signal events for PII patterns (emails, names, IPs, etc.)
|
|
98
|
+
* 2. Check that skill_id values don't contain user identifiers
|
|
99
|
+
* 3. Verify context fields don't leak sensitive project paths
|
|
100
|
+
* 4. Ensure keyword_weights don't contain personal identifiers
|
|
101
|
+
* 5. Validate that exported data is properly anonymized
|
|
102
|
+
*
|
|
103
|
+
* The mock skips these checks since test data is constructed with
|
|
104
|
+
* known-safe values (UUIDs, generic skill names, etc.).
|
|
105
|
+
*
|
|
106
|
+
* @returns Promise<boolean> - Always true in mock (no real PII checks)
|
|
107
|
+
*/
|
|
108
|
+
async verifyPrivacy() {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
// Test helper to get audit log
|
|
112
|
+
getAuditLog() {
|
|
113
|
+
return [...this.auditLog];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Clear the audit log.
|
|
117
|
+
* Used in test cleanup to reset state between tests.
|
|
118
|
+
*/
|
|
119
|
+
clearAuditLog() {
|
|
120
|
+
this.auditLog = [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Mock implementation of IUserPreferenceRepository for testing
|
|
125
|
+
*/
|
|
126
|
+
export class MockUserPreferenceRepository {
|
|
127
|
+
profiles = new Map();
|
|
128
|
+
defaultUserId = 'default';
|
|
129
|
+
async getProfile(userId) {
|
|
130
|
+
return this.profiles.get(userId ?? this.defaultUserId) ?? null;
|
|
131
|
+
}
|
|
132
|
+
async saveProfile(profile, userId) {
|
|
133
|
+
this.profiles.set(userId ?? this.defaultUserId, { ...profile });
|
|
134
|
+
}
|
|
135
|
+
async deleteProfile(userId) {
|
|
136
|
+
this.profiles.delete(userId ?? this.defaultUserId);
|
|
137
|
+
}
|
|
138
|
+
async exists(userId) {
|
|
139
|
+
return this.profiles.has(userId ?? this.defaultUserId);
|
|
140
|
+
}
|
|
141
|
+
// Test helper
|
|
142
|
+
clear() {
|
|
143
|
+
this.profiles.clear();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=neural-mocks-privacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neural-mocks-privacy.js","sourceRoot":"","sources":["../../../../tests/integration/neural/neural-mocks-privacy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1535: Neural Test Infrastructure - Mock Implementations
|
|
3
|
+
*
|
|
4
|
+
* Mock implementations of learning interfaces for testing.
|
|
5
|
+
*
|
|
6
|
+
* @see packages/core/src/learning/interfaces.ts
|
|
7
|
+
* @see packages/core/src/learning/types.ts
|
|
8
|
+
*/
|
|
9
|
+
import type { ISignalCollector, IPreferenceLearner, IPersonalizationEngine, IUserPreferenceRepository } from '../../../src/learning/interfaces.js';
|
|
10
|
+
import { type SignalEvent, type SignalFilter, type RecommendationContext, type SignalMetadata, type DismissReason, type UserPreferenceProfile, type LearningConfig, type PersonalizedRecommendation } from '../../../src/learning/types.js';
|
|
11
|
+
export { MockPrivacyManager, MockUserPreferenceRepository } from './neural-mocks-privacy.js';
|
|
12
|
+
/**
|
|
13
|
+
* Mock implementation of ISignalCollector for testing
|
|
14
|
+
*/
|
|
15
|
+
export declare class MockSignalCollector implements ISignalCollector {
|
|
16
|
+
private signals;
|
|
17
|
+
recordAccept(skillId: string, context: RecommendationContext, metadata?: SignalMetadata): Promise<void>;
|
|
18
|
+
recordDismiss(skillId: string, context: RecommendationContext, reason?: DismissReason): Promise<void>;
|
|
19
|
+
recordUsage(skillId: string, frequency: 'daily' | 'weekly'): Promise<void>;
|
|
20
|
+
recordAbandonment(skillId: string, daysSinceInstall: number): Promise<void>;
|
|
21
|
+
recordUninstall(skillId: string, daysSinceInstall: number): Promise<void>;
|
|
22
|
+
getSignals(filter: SignalFilter, limit?: number): Promise<SignalEvent[]>;
|
|
23
|
+
getSignalCount(): Promise<number>;
|
|
24
|
+
getSignalsForSkill(skillId: string): Promise<SignalEvent[]>;
|
|
25
|
+
clear(): void;
|
|
26
|
+
getAllSignals(): SignalEvent[];
|
|
27
|
+
addSignal(signal: SignalEvent): void;
|
|
28
|
+
removeOldSignals(cutoffTimestamp: number): number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Mock implementation of IPreferenceLearner for testing
|
|
32
|
+
*/
|
|
33
|
+
export declare class MockPreferenceLearner implements IPreferenceLearner {
|
|
34
|
+
private config;
|
|
35
|
+
updateProfile(profile: UserPreferenceProfile, signal: SignalEvent): Promise<UserPreferenceProfile>;
|
|
36
|
+
batchUpdateProfile(profile: UserPreferenceProfile, signals: SignalEvent[]): Promise<UserPreferenceProfile>;
|
|
37
|
+
decayWeights(profile: UserPreferenceProfile, decayFactor?: number): Promise<UserPreferenceProfile>;
|
|
38
|
+
calculatePersonalizedScore(skillData: {
|
|
39
|
+
id: string;
|
|
40
|
+
category?: string;
|
|
41
|
+
trustTier?: string;
|
|
42
|
+
keywords?: string[];
|
|
43
|
+
triggerPhrases?: string[];
|
|
44
|
+
}, baseScore: number, profile: UserPreferenceProfile): PersonalizedRecommendation;
|
|
45
|
+
getConfig(): LearningConfig;
|
|
46
|
+
setConfig(config: Partial<LearningConfig>): void;
|
|
47
|
+
private clampWeight;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Mock implementation of IPersonalizationEngine for testing
|
|
51
|
+
*/
|
|
52
|
+
export declare class MockPersonalizationEngine implements IPersonalizationEngine {
|
|
53
|
+
private learner;
|
|
54
|
+
private profileRepo;
|
|
55
|
+
private signalCollector;
|
|
56
|
+
constructor(learner: MockPreferenceLearner, profileRepo: IUserPreferenceRepository, signalCollector: MockSignalCollector);
|
|
57
|
+
personalizeRecommendations(baseRecommendations: Array<{
|
|
58
|
+
skill_id: string;
|
|
59
|
+
base_score: number;
|
|
60
|
+
skill_data: {
|
|
61
|
+
category?: string;
|
|
62
|
+
trustTier?: string;
|
|
63
|
+
keywords?: string[];
|
|
64
|
+
};
|
|
65
|
+
}>, userId?: string): Promise<PersonalizedRecommendation[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Determine if personalization should be applied.
|
|
68
|
+
*
|
|
69
|
+
* IMPORTANT: Mock Implementation Limitation
|
|
70
|
+
* -----------------------------------------
|
|
71
|
+
* This mock checks the GLOBAL signal count across all users, not the
|
|
72
|
+
* per-user signal count. This is a simplification for testing purposes.
|
|
73
|
+
*
|
|
74
|
+
* In a real implementation, shouldPersonalize should:
|
|
75
|
+
* 1. Look up the user's profile by userId
|
|
76
|
+
* 2. Check that user's individual signal_count against the threshold
|
|
77
|
+
* 3. Return true only if that specific user has enough signals
|
|
78
|
+
*
|
|
79
|
+
* The mock behavior works for single-user test scenarios but does not
|
|
80
|
+
* accurately model multi-user environments where each user has their
|
|
81
|
+
* own signal history and personalization threshold.
|
|
82
|
+
*
|
|
83
|
+
* @param _userId - User ID (ignored in mock - uses global count)
|
|
84
|
+
* @returns Promise<boolean> - True if global signal count meets threshold
|
|
85
|
+
*/
|
|
86
|
+
shouldPersonalize(_userId?: string): Promise<boolean>;
|
|
87
|
+
getUserProfile(userId?: string): Promise<UserPreferenceProfile>;
|
|
88
|
+
resetToDefault(userId?: string): Promise<void>;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=neural-mocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neural-mocks.d.ts","sourceRoot":"","sources":["../../../../tests/integration/neural/neural-mocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1535: Neural Test Infrastructure - Mock Implementations
|
|
3
|
+
*
|
|
4
|
+
* Mock implementations of learning interfaces for testing.
|
|
5
|
+
*
|
|
6
|
+
* @see packages/core/src/learning/interfaces.ts
|
|
7
|
+
* @see packages/core/src/learning/types.ts
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from 'node:crypto';
|
|
10
|
+
import { SignalType, DEFAULT_LEARNING_CONFIG, SIGNAL_WEIGHTS, } from '../../../src/learning/types.js';
|
|
11
|
+
import { createDefaultProfile } from './neural-fixtures.js';
|
|
12
|
+
// Re-export privacy mocks
|
|
13
|
+
export { MockPrivacyManager, MockUserPreferenceRepository } from './neural-mocks-privacy.js';
|
|
14
|
+
/**
|
|
15
|
+
* Mock implementation of ISignalCollector for testing
|
|
16
|
+
*/
|
|
17
|
+
export class MockSignalCollector {
|
|
18
|
+
signals = [];
|
|
19
|
+
async recordAccept(skillId, context, metadata) {
|
|
20
|
+
this.signals.push({
|
|
21
|
+
id: randomUUID(),
|
|
22
|
+
type: SignalType.ACCEPT,
|
|
23
|
+
skill_id: skillId,
|
|
24
|
+
timestamp: Date.now(),
|
|
25
|
+
context,
|
|
26
|
+
metadata,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async recordDismiss(skillId, context, reason) {
|
|
30
|
+
this.signals.push({
|
|
31
|
+
id: randomUUID(),
|
|
32
|
+
type: SignalType.DISMISS,
|
|
33
|
+
skill_id: skillId,
|
|
34
|
+
timestamp: Date.now(),
|
|
35
|
+
context,
|
|
36
|
+
dismiss_reason: reason,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async recordUsage(skillId, frequency) {
|
|
40
|
+
const type = frequency === 'daily' ? SignalType.USAGE_DAILY : SignalType.USAGE_WEEKLY;
|
|
41
|
+
this.signals.push({
|
|
42
|
+
id: randomUUID(),
|
|
43
|
+
type,
|
|
44
|
+
skill_id: skillId,
|
|
45
|
+
timestamp: Date.now(),
|
|
46
|
+
context: { installed_skills: [], original_score: 0 },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async recordAbandonment(skillId, daysSinceInstall) {
|
|
50
|
+
this.signals.push({
|
|
51
|
+
id: randomUUID(),
|
|
52
|
+
type: SignalType.ABANDONED,
|
|
53
|
+
skill_id: skillId,
|
|
54
|
+
timestamp: Date.now(),
|
|
55
|
+
context: { installed_skills: [], original_score: 0 },
|
|
56
|
+
metadata: { extra: { days_since_install: daysSinceInstall } },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async recordUninstall(skillId, daysSinceInstall) {
|
|
60
|
+
this.signals.push({
|
|
61
|
+
id: randomUUID(),
|
|
62
|
+
type: SignalType.UNINSTALL,
|
|
63
|
+
skill_id: skillId,
|
|
64
|
+
timestamp: Date.now(),
|
|
65
|
+
context: { installed_skills: [], original_score: 0 },
|
|
66
|
+
metadata: { extra: { days_since_install: daysSinceInstall } },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async getSignals(filter, limit) {
|
|
70
|
+
let result = [...this.signals];
|
|
71
|
+
if (filter.skill_id) {
|
|
72
|
+
result = result.filter((s) => s.skill_id === filter.skill_id);
|
|
73
|
+
}
|
|
74
|
+
if (filter.type) {
|
|
75
|
+
const types = Array.isArray(filter.type) ? filter.type : [filter.type];
|
|
76
|
+
result = result.filter((s) => types.includes(s.type));
|
|
77
|
+
}
|
|
78
|
+
if (filter.time_range) {
|
|
79
|
+
result = result.filter((s) => s.timestamp >= filter.time_range.start && s.timestamp <= filter.time_range.end);
|
|
80
|
+
}
|
|
81
|
+
if (filter.category) {
|
|
82
|
+
result = result.filter((s) => s.context.category === filter.category);
|
|
83
|
+
}
|
|
84
|
+
if (limit) {
|
|
85
|
+
result = result.slice(0, limit);
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
async getSignalCount() {
|
|
90
|
+
return this.signals.length;
|
|
91
|
+
}
|
|
92
|
+
async getSignalsForSkill(skillId) {
|
|
93
|
+
return this.signals.filter((s) => s.skill_id === skillId);
|
|
94
|
+
}
|
|
95
|
+
// Test helpers
|
|
96
|
+
clear() {
|
|
97
|
+
this.signals = [];
|
|
98
|
+
}
|
|
99
|
+
getAllSignals() {
|
|
100
|
+
return [...this.signals];
|
|
101
|
+
}
|
|
102
|
+
addSignal(signal) {
|
|
103
|
+
this.signals.push(signal);
|
|
104
|
+
}
|
|
105
|
+
removeOldSignals(cutoffTimestamp) {
|
|
106
|
+
const before = this.signals.length;
|
|
107
|
+
this.signals = this.signals.filter((s) => s.timestamp >= cutoffTimestamp);
|
|
108
|
+
return before - this.signals.length;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Mock implementation of IPreferenceLearner for testing
|
|
113
|
+
*/
|
|
114
|
+
export class MockPreferenceLearner {
|
|
115
|
+
config = { ...DEFAULT_LEARNING_CONFIG };
|
|
116
|
+
async updateProfile(profile, signal) {
|
|
117
|
+
const weight = SIGNAL_WEIGHTS[signal.type];
|
|
118
|
+
const category = signal.context.category;
|
|
119
|
+
const trustTier = signal.context.trust_tier;
|
|
120
|
+
const updated = { ...profile };
|
|
121
|
+
updated.last_updated = Date.now();
|
|
122
|
+
updated.signal_count++;
|
|
123
|
+
// Update category weight
|
|
124
|
+
if (category) {
|
|
125
|
+
const currentWeight = updated.category_weights[category] ?? 0;
|
|
126
|
+
const newWeight = this.clampWeight(currentWeight + weight * this.config.learning_rate);
|
|
127
|
+
updated.category_weights = { ...updated.category_weights, [category]: newWeight };
|
|
128
|
+
}
|
|
129
|
+
// Update trust tier weight
|
|
130
|
+
if (trustTier) {
|
|
131
|
+
const currentWeight = updated.trust_tier_weights[trustTier] ?? 0;
|
|
132
|
+
const newWeight = this.clampWeight(currentWeight + weight * this.config.learning_rate);
|
|
133
|
+
updated.trust_tier_weights = { ...updated.trust_tier_weights, [trustTier]: newWeight };
|
|
134
|
+
}
|
|
135
|
+
// Track negative patterns for dismiss/uninstall
|
|
136
|
+
if (signal.type === SignalType.DISMISS || signal.type === SignalType.UNINSTALL) {
|
|
137
|
+
if (!updated.negative_patterns.skill_ids.includes(signal.skill_id)) {
|
|
138
|
+
updated.negative_patterns = {
|
|
139
|
+
...updated.negative_patterns,
|
|
140
|
+
skill_ids: [...updated.negative_patterns.skill_ids, signal.skill_id],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return updated;
|
|
145
|
+
}
|
|
146
|
+
async batchUpdateProfile(profile, signals) {
|
|
147
|
+
let updated = profile;
|
|
148
|
+
for (const signal of signals) {
|
|
149
|
+
updated = await this.updateProfile(updated, signal);
|
|
150
|
+
}
|
|
151
|
+
return updated;
|
|
152
|
+
}
|
|
153
|
+
async decayWeights(profile, decayFactor) {
|
|
154
|
+
const factor = decayFactor ?? this.config.decay_factor;
|
|
155
|
+
const updated = { ...profile };
|
|
156
|
+
// Decay category weights
|
|
157
|
+
const newCategoryWeights = {};
|
|
158
|
+
for (const [cat, weight] of Object.entries(updated.category_weights)) {
|
|
159
|
+
newCategoryWeights[cat] = weight * factor;
|
|
160
|
+
}
|
|
161
|
+
updated.category_weights = newCategoryWeights;
|
|
162
|
+
// Decay trust tier weights
|
|
163
|
+
const newTrustWeights = {};
|
|
164
|
+
for (const [tier, weight] of Object.entries(updated.trust_tier_weights)) {
|
|
165
|
+
newTrustWeights[tier] = weight * factor;
|
|
166
|
+
}
|
|
167
|
+
updated.trust_tier_weights = newTrustWeights;
|
|
168
|
+
// Decay keyword weights
|
|
169
|
+
const newKeywordWeights = {};
|
|
170
|
+
for (const [keyword, weight] of Object.entries(updated.keyword_weights)) {
|
|
171
|
+
newKeywordWeights[keyword] = weight * factor;
|
|
172
|
+
}
|
|
173
|
+
updated.keyword_weights = newKeywordWeights;
|
|
174
|
+
updated.last_updated = Date.now();
|
|
175
|
+
return updated;
|
|
176
|
+
}
|
|
177
|
+
calculatePersonalizedScore(skillData, baseScore, profile) {
|
|
178
|
+
let categoryBoost = 0;
|
|
179
|
+
let trustBoost = 0;
|
|
180
|
+
let keywordBoost = 0;
|
|
181
|
+
let antiPenalty = 0;
|
|
182
|
+
// Category boost
|
|
183
|
+
if (skillData.category) {
|
|
184
|
+
categoryBoost = profile.category_weights[skillData.category] ?? 0;
|
|
185
|
+
}
|
|
186
|
+
// Trust tier boost
|
|
187
|
+
if (skillData.trustTier) {
|
|
188
|
+
trustBoost = profile.trust_tier_weights[skillData.trustTier] ?? 0;
|
|
189
|
+
}
|
|
190
|
+
// Keyword boost
|
|
191
|
+
if (skillData.keywords) {
|
|
192
|
+
for (const kw of skillData.keywords) {
|
|
193
|
+
keywordBoost += profile.keyword_weights[kw] ?? 0;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Anti-penalty for skills in negative patterns
|
|
197
|
+
if (profile.negative_patterns.skill_ids.includes(skillData.id)) {
|
|
198
|
+
antiPenalty = -0.5; // Strong penalty
|
|
199
|
+
}
|
|
200
|
+
// Calculate personalized score, clamped to [0, 1]
|
|
201
|
+
const totalAdjustment = (categoryBoost + trustBoost + keywordBoost + antiPenalty) * 0.1;
|
|
202
|
+
const personalizedScore = Math.max(0, Math.min(1, baseScore + totalAdjustment));
|
|
203
|
+
return {
|
|
204
|
+
skill_id: skillData.id,
|
|
205
|
+
base_score: baseScore,
|
|
206
|
+
personalized_score: personalizedScore,
|
|
207
|
+
personalization_applied: profile.signal_count >= this.config.min_signals_threshold,
|
|
208
|
+
score_breakdown: {
|
|
209
|
+
category_boost: categoryBoost,
|
|
210
|
+
trust_boost: trustBoost,
|
|
211
|
+
keyword_boost: keywordBoost,
|
|
212
|
+
anti_penalty: antiPenalty,
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
getConfig() {
|
|
217
|
+
return { ...this.config };
|
|
218
|
+
}
|
|
219
|
+
setConfig(config) {
|
|
220
|
+
this.config = { ...this.config, ...config };
|
|
221
|
+
}
|
|
222
|
+
clampWeight(weight) {
|
|
223
|
+
return Math.max(this.config.weight_bounds.min, Math.min(this.config.weight_bounds.max, weight));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Mock implementation of IPersonalizationEngine for testing
|
|
228
|
+
*/
|
|
229
|
+
export class MockPersonalizationEngine {
|
|
230
|
+
learner;
|
|
231
|
+
profileRepo;
|
|
232
|
+
signalCollector;
|
|
233
|
+
constructor(learner, profileRepo, signalCollector) {
|
|
234
|
+
this.learner = learner;
|
|
235
|
+
this.profileRepo = profileRepo;
|
|
236
|
+
this.signalCollector = signalCollector;
|
|
237
|
+
}
|
|
238
|
+
async personalizeRecommendations(baseRecommendations, userId) {
|
|
239
|
+
const profile = await this.getUserProfile(userId);
|
|
240
|
+
const shouldApply = await this.shouldPersonalize(userId);
|
|
241
|
+
const results = baseRecommendations.map((rec) => {
|
|
242
|
+
const result = this.learner.calculatePersonalizedScore({ id: rec.skill_id, ...rec.skill_data }, rec.base_score, profile);
|
|
243
|
+
// Only apply personalization if threshold met
|
|
244
|
+
if (!shouldApply) {
|
|
245
|
+
return {
|
|
246
|
+
...result,
|
|
247
|
+
personalized_score: rec.base_score,
|
|
248
|
+
personalization_applied: false,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
return result;
|
|
252
|
+
});
|
|
253
|
+
// Sort by personalized score descending
|
|
254
|
+
return results.sort((a, b) => b.personalized_score - a.personalized_score);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Determine if personalization should be applied.
|
|
258
|
+
*
|
|
259
|
+
* IMPORTANT: Mock Implementation Limitation
|
|
260
|
+
* -----------------------------------------
|
|
261
|
+
* This mock checks the GLOBAL signal count across all users, not the
|
|
262
|
+
* per-user signal count. This is a simplification for testing purposes.
|
|
263
|
+
*
|
|
264
|
+
* In a real implementation, shouldPersonalize should:
|
|
265
|
+
* 1. Look up the user's profile by userId
|
|
266
|
+
* 2. Check that user's individual signal_count against the threshold
|
|
267
|
+
* 3. Return true only if that specific user has enough signals
|
|
268
|
+
*
|
|
269
|
+
* The mock behavior works for single-user test scenarios but does not
|
|
270
|
+
* accurately model multi-user environments where each user has their
|
|
271
|
+
* own signal history and personalization threshold.
|
|
272
|
+
*
|
|
273
|
+
* @param _userId - User ID (ignored in mock - uses global count)
|
|
274
|
+
* @returns Promise<boolean> - True if global signal count meets threshold
|
|
275
|
+
*/
|
|
276
|
+
async shouldPersonalize(_userId) {
|
|
277
|
+
const count = await this.signalCollector.getSignalCount();
|
|
278
|
+
return count >= this.learner.getConfig().min_signals_threshold;
|
|
279
|
+
}
|
|
280
|
+
async getUserProfile(userId) {
|
|
281
|
+
const profile = await this.profileRepo.getProfile(userId);
|
|
282
|
+
return profile ?? createDefaultProfile();
|
|
283
|
+
}
|
|
284
|
+
async resetToDefault(userId) {
|
|
285
|
+
await this.profileRepo.deleteProfile(userId);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=neural-mocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neural-mocks.js","sourceRoot":"","sources":["../../../../tests/integration/neural/neural-mocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1535: Neural Test Infrastructure - Test Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for creating and cleaning up neural test contexts.
|
|
5
|
+
*
|
|
6
|
+
* @see packages/core/src/learning/interfaces.ts
|
|
7
|
+
*/
|
|
8
|
+
import { MockSignalCollector, MockPreferenceLearner, MockPersonalizationEngine, MockPrivacyManager, MockUserPreferenceRepository } from './neural-mocks.js';
|
|
9
|
+
/**
|
|
10
|
+
* Neural test context containing all mock service instances
|
|
11
|
+
*/
|
|
12
|
+
export interface NeuralTestContext {
|
|
13
|
+
signalCollector: MockSignalCollector;
|
|
14
|
+
preferenceLearner: MockPreferenceLearner;
|
|
15
|
+
personalizationEngine: MockPersonalizationEngine;
|
|
16
|
+
privacyManager: MockPrivacyManager;
|
|
17
|
+
profileRepository: MockUserPreferenceRepository;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a fresh neural test context with all mock services
|
|
21
|
+
*/
|
|
22
|
+
export declare function createNeuralTestContext(): NeuralTestContext;
|
|
23
|
+
/**
|
|
24
|
+
* Clean up a neural test context (release resources)
|
|
25
|
+
*/
|
|
26
|
+
export declare function cleanupNeuralTestContext(ctx: NeuralTestContext): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=neural-test-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neural-test-utils.d.ts","sourceRoot":"","sources":["../../../../tests/integration/neural/neural-test-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,4BAA4B,EAC7B,MAAM,mBAAmB,CAAA;AAE1B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,mBAAmB,CAAA;IACpC,iBAAiB,EAAE,qBAAqB,CAAA;IACxC,qBAAqB,EAAE,yBAAyB,CAAA;IAChD,cAAc,EAAE,kBAAkB,CAAA;IAClC,iBAAiB,EAAE,4BAA4B,CAAA;CAChD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAkB3D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1535: Neural Test Infrastructure - Test Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for creating and cleaning up neural test contexts.
|
|
5
|
+
*
|
|
6
|
+
* @see packages/core/src/learning/interfaces.ts
|
|
7
|
+
*/
|
|
8
|
+
import { MockSignalCollector, MockPreferenceLearner, MockPersonalizationEngine, MockPrivacyManager, MockUserPreferenceRepository, } from './neural-mocks.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a fresh neural test context with all mock services
|
|
11
|
+
*/
|
|
12
|
+
export function createNeuralTestContext() {
|
|
13
|
+
const profileRepository = new MockUserPreferenceRepository();
|
|
14
|
+
const signalCollector = new MockSignalCollector();
|
|
15
|
+
const preferenceLearner = new MockPreferenceLearner();
|
|
16
|
+
const personalizationEngine = new MockPersonalizationEngine(preferenceLearner, profileRepository, signalCollector);
|
|
17
|
+
const privacyManager = new MockPrivacyManager(signalCollector, profileRepository);
|
|
18
|
+
return {
|
|
19
|
+
signalCollector,
|
|
20
|
+
preferenceLearner,
|
|
21
|
+
personalizationEngine,
|
|
22
|
+
privacyManager,
|
|
23
|
+
profileRepository,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Clean up a neural test context (release resources)
|
|
28
|
+
*/
|
|
29
|
+
export async function cleanupNeuralTestContext(ctx) {
|
|
30
|
+
// Clear all stored data
|
|
31
|
+
ctx.signalCollector.clear();
|
|
32
|
+
ctx.profileRepository.clear();
|
|
33
|
+
ctx.privacyManager.clearAuditLog();
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=neural-test-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neural-test-utils.js","sourceRoot":"","sources":["../../../../tests/integration/neural/neural-test-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,mBAAmB,CAAA;AAa1B;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,iBAAiB,GAAG,IAAI,4BAA4B,EAAE,CAAA;IAC5D,MAAM,eAAe,GAAG,IAAI,mBAAmB,EAAE,CAAA;IACjD,MAAM,iBAAiB,GAAG,IAAI,qBAAqB,EAAE,CAAA;IACrD,MAAM,qBAAqB,GAAG,IAAI,yBAAyB,CACzD,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,CAChB,CAAA;IACD,MAAM,cAAc,GAAG,IAAI,kBAAkB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAA;IAEjF,OAAO;QACL,eAAe;QACf,iBAAiB;QACjB,qBAAqB;QACrB,cAAc;QACd,iBAAiB;KAClB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAsB;IACnE,wBAAwB;IACxB,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;IAC3B,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAA;IAC7B,GAAG,CAAC,cAAc,CAAC,aAAa,EAAE,CAAA;AACpC,CAAC"}
|