@skillsmith/core 0.4.1 → 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/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 +17 -131
- 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 +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/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 +10 -54
- 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/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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SMI-
|
|
2
|
+
* SMI-1788: TransformationService - Orchestrate skill optimization pipeline
|
|
3
3
|
*
|
|
4
4
|
* The central service for transforming community skills into optimized versions.
|
|
5
5
|
* Coordinates the full pipeline:
|
|
@@ -98,14 +98,17 @@ export declare class TransformationService {
|
|
|
98
98
|
*/
|
|
99
99
|
transform(skillId: string, skillName: string, description: string, content: string): Promise<TransformationResult>;
|
|
100
100
|
/**
|
|
101
|
-
*
|
|
101
|
+
* Transform without caching (for testing or one-off transforms)
|
|
102
|
+
*
|
|
103
|
+
* SMI-1798: Note that this is NOT a synchronous I/O operation - the name
|
|
104
|
+
* indicates it runs without async cache operations.
|
|
102
105
|
*
|
|
103
106
|
* @param skillName - Human-readable skill name
|
|
104
107
|
* @param description - Skill description
|
|
105
108
|
* @param content - The full SKILL.md content
|
|
106
109
|
* @returns Transformation result
|
|
107
110
|
*/
|
|
108
|
-
|
|
111
|
+
transformWithoutCache(skillName: string, description: string, content: string): TransformationResult;
|
|
109
112
|
/**
|
|
110
113
|
* Check if a skill would benefit from transformation without fully transforming
|
|
111
114
|
*
|
|
@@ -126,7 +129,8 @@ export declare class TransformationService {
|
|
|
126
129
|
*/
|
|
127
130
|
private buildCacheKey;
|
|
128
131
|
/**
|
|
129
|
-
*
|
|
132
|
+
* SMI-1790: Compute SHA-256 hash for content comparison
|
|
133
|
+
* Uses cryptographic hash for reliable cache invalidation
|
|
130
134
|
*/
|
|
131
135
|
private hashContent;
|
|
132
136
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformationService.d.ts","sourceRoot":"","sources":["../../../src/services/TransformationService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"TransformationService.d.ts","sourceRoot":"","sources":["../../../src/services/TransformationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SMI-
|
|
2
|
+
* SMI-1788: TransformationService - Orchestrate skill optimization pipeline
|
|
3
3
|
*
|
|
4
4
|
* The central service for transforming community skills into optimized versions.
|
|
5
5
|
* Coordinates the full pipeline:
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*
|
|
16
16
|
* Part of the Skillsmith Optimization Layer.
|
|
17
17
|
*/
|
|
18
|
+
import { createHash } from 'crypto';
|
|
18
19
|
import { CacheRepository } from '../repositories/CacheRepository.js';
|
|
19
20
|
import { analyzeSkill, quickTransformCheck } from './SkillAnalyzer.js';
|
|
20
21
|
import { decomposeSkill, parallelizeTaskCalls, } from './SkillDecomposer.js';
|
|
@@ -25,6 +26,11 @@ const DEFAULT_OPTIONS = {
|
|
|
25
26
|
forceTransform: false,
|
|
26
27
|
version: '1.0.0',
|
|
27
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* SMI-1791: Maximum content length to process (2MB)
|
|
31
|
+
* Prevents DoS from extremely large inputs
|
|
32
|
+
*/
|
|
33
|
+
const MAX_CONTENT_LENGTH = 2 * 1024 * 1024;
|
|
28
34
|
/** Cache key prefix for transformed skills */
|
|
29
35
|
const CACHE_KEY_PREFIX = 'transform:';
|
|
30
36
|
/** Attribution text added to optimized skills */
|
|
@@ -56,6 +62,10 @@ export class TransformationService {
|
|
|
56
62
|
*/
|
|
57
63
|
async transform(skillId, skillName, description, content) {
|
|
58
64
|
const startTime = Date.now();
|
|
65
|
+
// SMI-1791: Validate content length to prevent DoS
|
|
66
|
+
if (content.length > MAX_CONTENT_LENGTH) {
|
|
67
|
+
throw new Error(`Content exceeds maximum length of ${MAX_CONTENT_LENGTH} bytes (got ${content.length})`);
|
|
68
|
+
}
|
|
59
69
|
// Check cache first (unless force transform)
|
|
60
70
|
if (!this.options.forceTransform && this.cache) {
|
|
61
71
|
const cached = this.getCachedTransformation(skillId, content);
|
|
@@ -96,15 +106,22 @@ export class TransformationService {
|
|
|
96
106
|
return result;
|
|
97
107
|
}
|
|
98
108
|
/**
|
|
99
|
-
*
|
|
109
|
+
* Transform without caching (for testing or one-off transforms)
|
|
110
|
+
*
|
|
111
|
+
* SMI-1798: Note that this is NOT a synchronous I/O operation - the name
|
|
112
|
+
* indicates it runs without async cache operations.
|
|
100
113
|
*
|
|
101
114
|
* @param skillName - Human-readable skill name
|
|
102
115
|
* @param description - Skill description
|
|
103
116
|
* @param content - The full SKILL.md content
|
|
104
117
|
* @returns Transformation result
|
|
105
118
|
*/
|
|
106
|
-
|
|
119
|
+
transformWithoutCache(skillName, description, content) {
|
|
107
120
|
const startTime = Date.now();
|
|
121
|
+
// SMI-1791: Validate content length to prevent DoS
|
|
122
|
+
if (content.length > MAX_CONTENT_LENGTH) {
|
|
123
|
+
throw new Error(`Content exceeds maximum length of ${MAX_CONTENT_LENGTH} bytes (got ${content.length})`);
|
|
124
|
+
}
|
|
108
125
|
// Quick check if transformation is needed
|
|
109
126
|
if (!quickTransformCheck(content)) {
|
|
110
127
|
return this.createMinimalResult(content, startTime);
|
|
@@ -140,21 +157,28 @@ export class TransformationService {
|
|
|
140
157
|
getCachedTransformation(skillId, content) {
|
|
141
158
|
if (!this.cache)
|
|
142
159
|
return null;
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
160
|
+
try {
|
|
161
|
+
const cacheKey = this.buildCacheKey(skillId);
|
|
162
|
+
const cached = this.cache.get(cacheKey);
|
|
163
|
+
if (!cached)
|
|
164
|
+
return null;
|
|
165
|
+
// Validate cache entry
|
|
166
|
+
const contentHash = this.hashContent(content);
|
|
167
|
+
if (cached.skillHash !== contentHash) {
|
|
168
|
+
// Content changed, invalidate cache
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
if (cached.version !== this.options.version) {
|
|
172
|
+
// Version mismatch, invalidate cache
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
return cached.result;
|
|
152
176
|
}
|
|
153
|
-
|
|
154
|
-
//
|
|
177
|
+
catch (error) {
|
|
178
|
+
// Log error but continue with fresh transformation
|
|
179
|
+
console.warn(`Cache read failed for ${skillId}:`, error);
|
|
155
180
|
return null;
|
|
156
181
|
}
|
|
157
|
-
return cached.result;
|
|
158
182
|
}
|
|
159
183
|
/**
|
|
160
184
|
* Cache a transformation result
|
|
@@ -162,15 +186,21 @@ export class TransformationService {
|
|
|
162
186
|
cacheTransformation(skillId, content, result) {
|
|
163
187
|
if (!this.cache)
|
|
164
188
|
return;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
189
|
+
try {
|
|
190
|
+
const cacheKey = this.buildCacheKey(skillId);
|
|
191
|
+
const contentHash = this.hashContent(content);
|
|
192
|
+
const cacheEntry = {
|
|
193
|
+
result,
|
|
194
|
+
skillHash: contentHash,
|
|
195
|
+
cachedAt: new Date().toISOString(),
|
|
196
|
+
version: this.options.version,
|
|
197
|
+
};
|
|
198
|
+
this.cache.set(cacheKey, cacheEntry, this.options.cacheTtl);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
// Log error but continue - caching is non-critical
|
|
202
|
+
console.warn(`Cache write failed for ${skillId}:`, error);
|
|
203
|
+
}
|
|
174
204
|
}
|
|
175
205
|
/**
|
|
176
206
|
* Build cache key for a skill
|
|
@@ -179,17 +209,11 @@ export class TransformationService {
|
|
|
179
209
|
return `${CACHE_KEY_PREFIX}${skillId}`;
|
|
180
210
|
}
|
|
181
211
|
/**
|
|
182
|
-
*
|
|
212
|
+
* SMI-1790: Compute SHA-256 hash for content comparison
|
|
213
|
+
* Uses cryptographic hash for reliable cache invalidation
|
|
183
214
|
*/
|
|
184
215
|
hashContent(content) {
|
|
185
|
-
|
|
186
|
-
let hash = 0;
|
|
187
|
-
for (let i = 0; i < content.length; i++) {
|
|
188
|
-
const char = content.charCodeAt(i);
|
|
189
|
-
hash = (hash << 5) - hash + char;
|
|
190
|
-
hash = hash & hash; // Convert to 32-bit integer
|
|
191
|
-
}
|
|
192
|
-
return hash.toString(16);
|
|
216
|
+
return createHash('sha256').update(content, 'utf8').digest('hex');
|
|
193
217
|
}
|
|
194
218
|
/**
|
|
195
219
|
* Create minimal result for skills that don't need transformation
|
|
@@ -285,7 +309,7 @@ export class TransformationService {
|
|
|
285
309
|
*/
|
|
286
310
|
export function transformSkill(skillName, description, content) {
|
|
287
311
|
const service = new TransformationService();
|
|
288
|
-
return service.
|
|
312
|
+
return service.transformWithoutCache(skillName, description, content);
|
|
289
313
|
}
|
|
290
314
|
export default TransformationService;
|
|
291
315
|
//# sourceMappingURL=TransformationService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformationService.js","sourceRoot":"","sources":["../../../src/services/TransformationService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TransformationService.js","sourceRoot":"","sources":["../../../src/services/TransformationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskRunner.test.d.ts","sourceRoot":"","sources":["../../../../src/services/__tests__/TaskRunner.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1662: TaskRunner Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for background task timeout management functionality.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
7
|
+
import { TaskRunner, createTaskRunner, getGlobalTaskRunner, setGlobalTaskRunner, disposeGlobalTaskRunner, DEFAULT_TASK_TIMEOUT_MS, SIGKILL_GRACE_PERIOD_MS, WARNING_THRESHOLD_RATIO, } from '../TaskRunner.js';
|
|
8
|
+
import { silentLogger } from '../../utils/logger.js';
|
|
9
|
+
describe('TaskRunner', () => {
|
|
10
|
+
let runner;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
vi.useFakeTimers();
|
|
13
|
+
runner = new TaskRunner({
|
|
14
|
+
timeoutMs: 10000, // 10 seconds for faster tests
|
|
15
|
+
logger: silentLogger,
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
runner.dispose();
|
|
20
|
+
vi.useRealTimers();
|
|
21
|
+
});
|
|
22
|
+
describe('constructor', () => {
|
|
23
|
+
it('should use default timeout if not specified', () => {
|
|
24
|
+
const defaultRunner = new TaskRunner({ logger: silentLogger });
|
|
25
|
+
expect(defaultRunner.getTimeoutMs()).toBe(DEFAULT_TASK_TIMEOUT_MS);
|
|
26
|
+
defaultRunner.dispose();
|
|
27
|
+
});
|
|
28
|
+
it('should use custom timeout when provided', () => {
|
|
29
|
+
const customRunner = new TaskRunner({ timeoutMs: 5000, logger: silentLogger });
|
|
30
|
+
expect(customRunner.getTimeoutMs()).toBe(5000);
|
|
31
|
+
customRunner.dispose();
|
|
32
|
+
});
|
|
33
|
+
it('should read timeout from environment variable', () => {
|
|
34
|
+
const originalEnv = process.env.TASK_TIMEOUT_MS;
|
|
35
|
+
process.env.TASK_TIMEOUT_MS = '120000';
|
|
36
|
+
const envRunner = new TaskRunner({ logger: silentLogger });
|
|
37
|
+
expect(envRunner.getTimeoutMs()).toBe(120000);
|
|
38
|
+
envRunner.dispose();
|
|
39
|
+
if (originalEnv !== undefined) {
|
|
40
|
+
process.env.TASK_TIMEOUT_MS = originalEnv;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
delete process.env.TASK_TIMEOUT_MS;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
it('should prefer explicit config over environment variable', () => {
|
|
47
|
+
const originalEnv = process.env.TASK_TIMEOUT_MS;
|
|
48
|
+
process.env.TASK_TIMEOUT_MS = '120000';
|
|
49
|
+
const configRunner = new TaskRunner({ timeoutMs: 5000, logger: silentLogger });
|
|
50
|
+
expect(configRunner.getTimeoutMs()).toBe(5000);
|
|
51
|
+
configRunner.dispose();
|
|
52
|
+
if (originalEnv !== undefined) {
|
|
53
|
+
process.env.TASK_TIMEOUT_MS = originalEnv;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
delete process.env.TASK_TIMEOUT_MS;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('register', () => {
|
|
61
|
+
it('should register a task and return an ID', () => {
|
|
62
|
+
const taskId = runner.register(12345, 'Test task');
|
|
63
|
+
expect(taskId).toBeDefined();
|
|
64
|
+
expect(typeof taskId).toBe('string');
|
|
65
|
+
expect(taskId.length).toBeGreaterThan(0);
|
|
66
|
+
});
|
|
67
|
+
it('should track the registered task', () => {
|
|
68
|
+
const taskId = runner.register(12345, 'Test task');
|
|
69
|
+
const task = runner.getTask(taskId);
|
|
70
|
+
expect(task).toBeDefined();
|
|
71
|
+
expect(task?.pid).toBe(12345);
|
|
72
|
+
expect(task?.description).toBe('Test task');
|
|
73
|
+
expect(task?.status).toBe('running');
|
|
74
|
+
expect(task?.warningIssued).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
it('should set correct start time', () => {
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
const taskId = runner.register(12345, 'Test task');
|
|
79
|
+
const task = runner.getTask(taskId);
|
|
80
|
+
expect(task?.startedAt).toBeGreaterThanOrEqual(now);
|
|
81
|
+
expect(task?.startedAt).toBeLessThanOrEqual(now + 100);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('complete', () => {
|
|
85
|
+
it('should mark task as completed', () => {
|
|
86
|
+
const taskId = runner.register(12345, 'Test task');
|
|
87
|
+
runner.complete(taskId);
|
|
88
|
+
const task = runner.getTask(taskId);
|
|
89
|
+
expect(task?.status).toBe('completed');
|
|
90
|
+
expect(task?.endedAt).toBeDefined();
|
|
91
|
+
expect(task?.durationMs).toBeDefined();
|
|
92
|
+
});
|
|
93
|
+
it('should calculate duration correctly', () => {
|
|
94
|
+
const taskId = runner.register(12345, 'Test task');
|
|
95
|
+
// Advance time by 1 second
|
|
96
|
+
vi.advanceTimersByTime(1000);
|
|
97
|
+
runner.complete(taskId);
|
|
98
|
+
const task = runner.getTask(taskId);
|
|
99
|
+
expect(task?.durationMs).toBeGreaterThanOrEqual(1000);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('fail', () => {
|
|
103
|
+
it('should mark task as failed with error message', () => {
|
|
104
|
+
const taskId = runner.register(12345, 'Test task');
|
|
105
|
+
runner.fail(taskId, 'Something went wrong');
|
|
106
|
+
const task = runner.getTask(taskId);
|
|
107
|
+
expect(task?.status).toBe('failed');
|
|
108
|
+
expect(task?.error).toBe('Something went wrong');
|
|
109
|
+
});
|
|
110
|
+
it('should extract message from Error object', () => {
|
|
111
|
+
const taskId = runner.register(12345, 'Test task');
|
|
112
|
+
runner.fail(taskId, new Error('Error object message'));
|
|
113
|
+
const task = runner.getTask(taskId);
|
|
114
|
+
expect(task?.error).toBe('Error object message');
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('getTasks', () => {
|
|
118
|
+
it('should return all tasks when no filter specified', () => {
|
|
119
|
+
runner.register(1, 'Task 1');
|
|
120
|
+
runner.register(2, 'Task 2');
|
|
121
|
+
runner.register(3, 'Task 3');
|
|
122
|
+
const tasks = runner.getTasks();
|
|
123
|
+
expect(tasks).toHaveLength(3);
|
|
124
|
+
});
|
|
125
|
+
it('should filter tasks by status', () => {
|
|
126
|
+
const task1 = runner.register(1, 'Task 1');
|
|
127
|
+
runner.register(2, 'Task 2');
|
|
128
|
+
const task3 = runner.register(3, 'Task 3');
|
|
129
|
+
runner.complete(task1);
|
|
130
|
+
runner.fail(task3, 'error');
|
|
131
|
+
const runningTasks = runner.getTasks('running');
|
|
132
|
+
expect(runningTasks).toHaveLength(1);
|
|
133
|
+
const completedTasks = runner.getTasks('completed');
|
|
134
|
+
expect(completedTasks).toHaveLength(1);
|
|
135
|
+
const failedTasks = runner.getTasks('failed');
|
|
136
|
+
expect(failedTasks).toHaveLength(1);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('getStats', () => {
|
|
140
|
+
it('should return correct statistics', () => {
|
|
141
|
+
const task1 = runner.register(1, 'Task 1');
|
|
142
|
+
runner.register(2, 'Task 2');
|
|
143
|
+
const task3 = runner.register(3, 'Task 3');
|
|
144
|
+
runner.register(4, 'Task 4');
|
|
145
|
+
runner.complete(task1);
|
|
146
|
+
runner.fail(task3, 'error');
|
|
147
|
+
const stats = runner.getStats();
|
|
148
|
+
expect(stats.total).toBe(4);
|
|
149
|
+
expect(stats.running).toBe(2);
|
|
150
|
+
expect(stats.completed).toBe(1);
|
|
151
|
+
expect(stats.failed).toBe(1);
|
|
152
|
+
expect(stats.timeout).toBe(0);
|
|
153
|
+
expect(stats.killed).toBe(0);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('warning callback', () => {
|
|
157
|
+
it('should issue warning at 80% of timeout', () => {
|
|
158
|
+
const warningCallback = vi.fn();
|
|
159
|
+
const testRunner = new TaskRunner({
|
|
160
|
+
timeoutMs: 10000,
|
|
161
|
+
logger: silentLogger,
|
|
162
|
+
onWarning: warningCallback,
|
|
163
|
+
});
|
|
164
|
+
testRunner.register(12345, 'Test task');
|
|
165
|
+
// Advance to just before warning threshold (80%)
|
|
166
|
+
vi.advanceTimersByTime(7900);
|
|
167
|
+
expect(warningCallback).not.toHaveBeenCalled();
|
|
168
|
+
// Advance past warning threshold
|
|
169
|
+
vi.advanceTimersByTime(200);
|
|
170
|
+
expect(warningCallback).toHaveBeenCalled();
|
|
171
|
+
const call = warningCallback.mock.calls[0];
|
|
172
|
+
expect(call[0].pid).toBe(12345);
|
|
173
|
+
expect(call[1]).toBeGreaterThan(0); // remaining time
|
|
174
|
+
testRunner.dispose();
|
|
175
|
+
});
|
|
176
|
+
it('should set warningIssued flag', () => {
|
|
177
|
+
const taskId = runner.register(12345, 'Test task');
|
|
178
|
+
// Advance past warning threshold (80% of 10s = 8s)
|
|
179
|
+
vi.advanceTimersByTime(8100);
|
|
180
|
+
const task = runner.getTask(taskId);
|
|
181
|
+
expect(task?.warningIssued).toBe(true);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe('timeout handling', () => {
|
|
185
|
+
it('should call onTimeout callback when task times out', async () => {
|
|
186
|
+
const timeoutCallback = vi.fn();
|
|
187
|
+
const testRunner = new TaskRunner({
|
|
188
|
+
timeoutMs: 10000,
|
|
189
|
+
logger: silentLogger,
|
|
190
|
+
onTimeout: timeoutCallback,
|
|
191
|
+
});
|
|
192
|
+
// Mock process.kill to prevent actual signals
|
|
193
|
+
const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
|
|
194
|
+
testRunner.register(12345, 'Test task');
|
|
195
|
+
// Advance past timeout and allow async operations to complete
|
|
196
|
+
vi.advanceTimersByTime(10100);
|
|
197
|
+
await vi.runAllTimersAsync();
|
|
198
|
+
expect(timeoutCallback).toHaveBeenCalled();
|
|
199
|
+
expect(timeoutCallback.mock.calls[0][0].pid).toBe(12345);
|
|
200
|
+
killSpy.mockRestore();
|
|
201
|
+
testRunner.dispose();
|
|
202
|
+
});
|
|
203
|
+
it('should mark task as timeout after timeout', async () => {
|
|
204
|
+
const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
|
|
205
|
+
const taskId = runner.register(12345, 'Test task');
|
|
206
|
+
// Advance past timeout + grace period and allow async operations to complete
|
|
207
|
+
vi.advanceTimersByTime(10000 + SIGKILL_GRACE_PERIOD_MS + 100);
|
|
208
|
+
await vi.runAllTimersAsync();
|
|
209
|
+
const task = runner.getTask(taskId);
|
|
210
|
+
expect(task?.status).toBe('timeout');
|
|
211
|
+
killSpy.mockRestore();
|
|
212
|
+
});
|
|
213
|
+
it('should send SIGTERM first during graceful shutdown', () => {
|
|
214
|
+
const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
|
|
215
|
+
runner.register(12345, 'Test task');
|
|
216
|
+
// Advance to timeout
|
|
217
|
+
vi.advanceTimersByTime(10100);
|
|
218
|
+
// First call should be SIGTERM
|
|
219
|
+
expect(killSpy).toHaveBeenCalledWith(12345, 'SIGTERM');
|
|
220
|
+
killSpy.mockRestore();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe('cleanup', () => {
|
|
224
|
+
it('should clean up old completed tasks', () => {
|
|
225
|
+
const task1 = runner.register(1, 'Task 1');
|
|
226
|
+
runner.register(2, 'Task 2');
|
|
227
|
+
runner.complete(task1);
|
|
228
|
+
// Advance time past max age
|
|
229
|
+
vi.advanceTimersByTime(3700000); // > 1 hour
|
|
230
|
+
const cleaned = runner.cleanup();
|
|
231
|
+
expect(cleaned).toBe(1);
|
|
232
|
+
});
|
|
233
|
+
it('should not clean up running tasks', () => {
|
|
234
|
+
runner.register(1, 'Task 1');
|
|
235
|
+
// Advance time
|
|
236
|
+
vi.advanceTimersByTime(3700000);
|
|
237
|
+
// Need to prevent timeout from firing
|
|
238
|
+
const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
|
|
239
|
+
const cleaned = runner.cleanup();
|
|
240
|
+
expect(cleaned).toBe(0);
|
|
241
|
+
killSpy.mockRestore();
|
|
242
|
+
});
|
|
243
|
+
it('should respect custom maxAgeMs', () => {
|
|
244
|
+
const task1 = runner.register(1, 'Task 1');
|
|
245
|
+
runner.complete(task1);
|
|
246
|
+
// Advance time by 30 minutes
|
|
247
|
+
vi.advanceTimersByTime(1800000);
|
|
248
|
+
// Clean with 1 hour max age - should not clean
|
|
249
|
+
const cleaned1 = runner.cleanup(3600000);
|
|
250
|
+
expect(cleaned1).toBe(0);
|
|
251
|
+
// Clean with 15 minute max age - should clean
|
|
252
|
+
const cleaned2 = runner.cleanup(900000);
|
|
253
|
+
expect(cleaned2).toBe(1);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('dispose', () => {
|
|
257
|
+
it('should clear all timers', () => {
|
|
258
|
+
runner.register(1, 'Task 1');
|
|
259
|
+
runner.register(2, 'Task 2');
|
|
260
|
+
runner.dispose();
|
|
261
|
+
// Advance time - no callbacks should fire
|
|
262
|
+
const killSpy = vi.spyOn(process, 'kill');
|
|
263
|
+
vi.advanceTimersByTime(20000);
|
|
264
|
+
expect(killSpy).not.toHaveBeenCalled();
|
|
265
|
+
killSpy.mockRestore();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe('constants', () => {
|
|
269
|
+
it('should have correct default timeout', () => {
|
|
270
|
+
expect(DEFAULT_TASK_TIMEOUT_MS).toBe(600000); // 10 minutes
|
|
271
|
+
});
|
|
272
|
+
it('should have correct grace period', () => {
|
|
273
|
+
expect(SIGKILL_GRACE_PERIOD_MS).toBe(5000); // 5 seconds
|
|
274
|
+
});
|
|
275
|
+
it('should have correct warning threshold', () => {
|
|
276
|
+
expect(WARNING_THRESHOLD_RATIO).toBe(0.8); // 80%
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
describe('Global TaskRunner', () => {
|
|
281
|
+
afterEach(() => {
|
|
282
|
+
disposeGlobalTaskRunner();
|
|
283
|
+
});
|
|
284
|
+
it('should create singleton on first access', () => {
|
|
285
|
+
const runner1 = getGlobalTaskRunner();
|
|
286
|
+
const runner2 = getGlobalTaskRunner();
|
|
287
|
+
expect(runner1).toBe(runner2);
|
|
288
|
+
});
|
|
289
|
+
it('should allow setting custom global runner', () => {
|
|
290
|
+
const customRunner = new TaskRunner({ timeoutMs: 5000, logger: silentLogger });
|
|
291
|
+
setGlobalTaskRunner(customRunner);
|
|
292
|
+
const retrieved = getGlobalTaskRunner();
|
|
293
|
+
expect(retrieved).toBe(customRunner);
|
|
294
|
+
expect(retrieved.getTimeoutMs()).toBe(5000);
|
|
295
|
+
});
|
|
296
|
+
it('should dispose global runner', () => {
|
|
297
|
+
const runner = getGlobalTaskRunner();
|
|
298
|
+
disposeGlobalTaskRunner();
|
|
299
|
+
// Next call should create new instance
|
|
300
|
+
const newRunner = getGlobalTaskRunner();
|
|
301
|
+
expect(newRunner).not.toBe(runner);
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
describe('createTaskRunner', () => {
|
|
305
|
+
it('should create new TaskRunner instance', () => {
|
|
306
|
+
const runner = createTaskRunner({ logger: silentLogger });
|
|
307
|
+
expect(runner).toBeInstanceOf(TaskRunner);
|
|
308
|
+
runner.dispose();
|
|
309
|
+
});
|
|
310
|
+
it('should pass config to TaskRunner', () => {
|
|
311
|
+
const runner = createTaskRunner({ timeoutMs: 5000, logger: silentLogger });
|
|
312
|
+
expect(runner.getTimeoutMs()).toBe(5000);
|
|
313
|
+
runner.dispose();
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
//# sourceMappingURL=TaskRunner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskRunner.test.js","sourceRoot":"","sources":["../../../../src/services/__tests__/TaskRunner.test.ts"],"names":[],"mappings":"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"}
|