@skillsmith/core 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.d.ts +4 -134
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.js +7 -315
- package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
- package/dist/src/analysis/framework-detector.d.ts +47 -0
- package/dist/src/analysis/framework-detector.d.ts.map +1 -0
- package/dist/src/analysis/framework-detector.js +151 -0
- package/dist/src/analysis/framework-detector.js.map +1 -0
- package/dist/src/analysis/index.d.ts +6 -1
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +10 -1
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/parsers.d.ts +43 -0
- package/dist/src/analysis/parsers.d.ts.map +1 -0
- package/dist/src/analysis/parsers.js +219 -0
- package/dist/src/analysis/parsers.js.map +1 -0
- package/dist/src/analysis/types.d.ts +138 -0
- package/dist/src/analysis/types.d.ts.map +1 -0
- package/dist/src/analysis/types.js +25 -0
- package/dist/src/analysis/types.js.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.js +4 -4
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/api/cache.d.ts +108 -0
- package/dist/src/api/cache.d.ts.map +1 -0
- package/dist/src/api/cache.js +216 -0
- package/dist/src/api/cache.js.map +1 -0
- package/dist/src/api/client.d.ts +152 -0
- package/dist/src/api/client.d.ts.map +1 -0
- package/dist/src/api/client.js +221 -0
- package/dist/src/api/client.js.map +1 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.d.ts.map +1 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/api/index.js.map +1 -0
- package/dist/src/benchmarks/BenchmarkRunner.d.ts +6 -175
- package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js +6 -123
- package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.d.ts +4 -262
- package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.js +4 -400
- package/dist/src/benchmarks/MemoryProfiler.js.map +1 -1
- package/dist/src/benchmarks/comparator.d.ts +38 -0
- package/dist/src/benchmarks/comparator.d.ts.map +1 -0
- package/dist/src/benchmarks/comparator.js +81 -0
- package/dist/src/benchmarks/comparator.js.map +1 -0
- package/dist/src/benchmarks/formatters.d.ts +30 -0
- package/dist/src/benchmarks/formatters.d.ts.map +1 -0
- package/dist/src/benchmarks/formatters.js +88 -0
- package/dist/src/benchmarks/formatters.js.map +1 -0
- package/dist/src/benchmarks/index.d.ts +5 -1
- package/dist/src/benchmarks/index.d.ts.map +1 -1
- package/dist/src/benchmarks/index.js +9 -2
- package/dist/src/benchmarks/index.js.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts +165 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js +312 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts +64 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.js +95 -0
- package/dist/src/benchmarks/memory/baseline-manager.js.map +1 -0
- package/dist/src/benchmarks/memory/index.d.ts +12 -0
- package/dist/src/benchmarks/memory/index.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/index.js +12 -0
- package/dist/src/benchmarks/memory/index.js.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts +23 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.js +46 -0
- package/dist/src/benchmarks/memory/leak-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts +17 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.js +56 -0
- package/dist/src/benchmarks/memory/regression-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/types.d.ts +111 -0
- package/dist/src/benchmarks/memory/types.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/types.js +7 -0
- package/dist/src/benchmarks/memory/types.js.map +1 -0
- package/dist/src/benchmarks/memory/utils.d.ts +17 -0
- package/dist/src/benchmarks/memory/utils.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/utils.js +29 -0
- package/dist/src/benchmarks/memory/utils.js.map +1 -0
- package/dist/src/benchmarks/types.d.ts +175 -0
- package/dist/src/benchmarks/types.d.ts.map +1 -0
- package/dist/src/benchmarks/types.js +20 -0
- package/dist/src/benchmarks/types.js.map +1 -0
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/QuarantineRepository.d.ts +4 -251
- package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/QuarantineRepository.js +4 -441
- package/dist/src/repositories/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +168 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js +341 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -0
- package/dist/src/repositories/quarantine/index.d.ts +10 -0
- package/dist/src/repositories/quarantine/index.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/index.js +10 -0
- package/dist/src/repositories/quarantine/index.js.map +1 -0
- package/dist/src/repositories/quarantine/queries.d.ts +58 -0
- package/dist/src/repositories/quarantine/queries.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/queries.js +88 -0
- package/dist/src/repositories/quarantine/queries.js.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts +44 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.js +87 -0
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -0
- package/dist/src/repositories/quarantine/types.d.ts +155 -0
- package/dist/src/repositories/quarantine/types.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/types.js +13 -0
- package/dist/src/repositories/quarantine/types.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +7 -43
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/checkpoint.d.ts +21 -0
- package/dist/src/scripts/github-import/checkpoint.d.ts.map +1 -0
- package/dist/src/scripts/github-import/checkpoint.js +52 -0
- package/dist/src/scripts/github-import/checkpoint.js.map +1 -0
- package/dist/src/scripts/github-import/deduplication.d.ts +15 -0
- package/dist/src/scripts/github-import/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/github-import/deduplication.js +33 -0
- package/dist/src/scripts/github-import/deduplication.js.map +1 -0
- package/dist/src/scripts/github-import/github-client.d.ts +29 -0
- package/dist/src/scripts/github-import/github-client.d.ts.map +1 -0
- package/dist/src/scripts/github-import/github-client.js +184 -0
- package/dist/src/scripts/github-import/github-client.js.map +1 -0
- package/dist/src/scripts/github-import/index.d.ts +29 -0
- package/dist/src/scripts/github-import/index.d.ts.map +1 -0
- package/dist/src/scripts/github-import/index.js +198 -0
- package/dist/src/scripts/github-import/index.js.map +1 -0
- package/dist/src/scripts/github-import/output.d.ts +12 -0
- package/dist/src/scripts/github-import/output.d.ts.map +1 -0
- package/dist/src/scripts/github-import/output.js +34 -0
- package/dist/src/scripts/github-import/output.js.map +1 -0
- package/dist/src/scripts/github-import/types.d.ts +108 -0
- package/dist/src/scripts/github-import/types.d.ts.map +1 -0
- package/dist/src/scripts/github-import/types.js +44 -0
- package/dist/src/scripts/github-import/types.js.map +1 -0
- package/dist/src/scripts/github-import/utils.d.ts +13 -0
- package/dist/src/scripts/github-import/utils.d.ts.map +1 -0
- package/dist/src/scripts/github-import/utils.js +28 -0
- package/dist/src/scripts/github-import/utils.js.map +1 -0
- package/dist/src/scripts/import-github-skills.d.ts +3 -12
- package/dist/src/scripts/import-github-skills.d.ts.map +1 -1
- package/dist/src/scripts/import-github-skills.js +18 -398
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/scan-imported-skills.d.ts +7 -7
- package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
- package/dist/src/scripts/scan-imported-skills.js +8 -397
- package/dist/src/scripts/scan-imported-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/categorizer.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/categorizer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/categorizer.js +61 -0
- package/dist/src/scripts/skill-scanner/categorizer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js +90 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/index.d.ts +22 -0
- package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/index.js +43 -0
- package/dist/src/scripts/skill-scanner/index.js.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.js +104 -0
- package/dist/src/scripts/skill-scanner/logger.js.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts +56 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.js +166 -0
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts +44 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.js +140 -0
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js +62 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/types.d.ts +98 -0
- package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/types.js +7 -0
- package/dist/src/scripts/skill-scanner/types.js.map +1 -0
- package/dist/src/scripts/validate-skills.d.ts +3 -172
- package/dist/src/scripts/validate-skills.d.ts.map +1 -1
- package/dist/src/scripts/validate-skills.js +6 -519
- package/dist/src/scripts/validate-skills.js.map +1 -1
- package/dist/src/scripts/validation/deduplication.d.ts +23 -0
- package/dist/src/scripts/validation/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/validation/deduplication.js +127 -0
- package/dist/src/scripts/validation/deduplication.js.map +1 -0
- package/dist/src/scripts/validation/field-validators.d.ts +9 -0
- package/dist/src/scripts/validation/field-validators.d.ts.map +1 -0
- package/dist/src/scripts/validation/field-validators.js +135 -0
- package/dist/src/scripts/validation/field-validators.js.map +1 -0
- package/dist/src/scripts/validation/index.d.ts +29 -0
- package/dist/src/scripts/validation/index.d.ts.map +1 -0
- package/dist/src/scripts/validation/index.js +84 -0
- package/dist/src/scripts/validation/index.js.map +1 -0
- package/dist/src/scripts/validation/normalizers.d.ts +29 -0
- package/dist/src/scripts/validation/normalizers.d.ts.map +1 -0
- package/dist/src/scripts/validation/normalizers.js +79 -0
- package/dist/src/scripts/validation/normalizers.js.map +1 -0
- package/dist/src/scripts/validation/pipeline.d.ts +13 -0
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -0
- package/dist/src/scripts/validation/pipeline.js +126 -0
- package/dist/src/scripts/validation/pipeline.js.map +1 -0
- package/dist/src/scripts/validation/types.d.ts +128 -0
- package/dist/src/scripts/validation/types.d.ts.map +1 -0
- package/dist/src/scripts/validation/types.js +43 -0
- package/dist/src/scripts/validation/types.js.map +1 -0
- package/dist/src/security/index.d.ts +5 -4
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +8 -2
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/rate-limiter/RateLimiter.d.ts +86 -0
- package/dist/src/security/rate-limiter/RateLimiter.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/RateLimiter.js +260 -0
- package/dist/src/security/rate-limiter/RateLimiter.js.map +1 -0
- package/dist/src/security/rate-limiter/constants.d.ts +15 -0
- package/dist/src/security/rate-limiter/constants.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/constants.js +15 -0
- package/dist/src/security/rate-limiter/constants.js.map +1 -0
- package/dist/src/security/rate-limiter/errors.d.ts +22 -0
- package/dist/src/security/rate-limiter/errors.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/errors.js +32 -0
- package/dist/src/security/rate-limiter/errors.js.map +1 -0
- package/dist/src/security/rate-limiter/index.d.ts +12 -0
- package/dist/src/security/rate-limiter/index.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/index.js +16 -0
- package/dist/src/security/rate-limiter/index.js.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts +55 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.js +144 -0
- package/dist/src/security/rate-limiter/metrics-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/presets.d.ts +52 -0
- package/dist/src/security/rate-limiter/presets.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/presets.js +53 -0
- package/dist/src/security/rate-limiter/presets.js.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts +59 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.js +189 -0
- package/dist/src/security/rate-limiter/queue-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/storage.d.ts +34 -0
- package/dist/src/security/rate-limiter/storage.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/storage.js +80 -0
- package/dist/src/security/rate-limiter/storage.js.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts +44 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.js +99 -0
- package/dist/src/security/rate-limiter/token-bucket.js.map +1 -0
- package/dist/src/security/rate-limiter/types.d.ts +104 -0
- package/dist/src/security/rate-limiter/types.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/types.js +7 -0
- package/dist/src/security/rate-limiter/types.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts +94 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.js +403 -0
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +11 -0
- package/dist/src/security/scanner/index.d.ts.map +1 -0
- package/dist/src/security/scanner/index.js +14 -0
- package/dist/src/security/scanner/index.js.map +1 -0
- package/dist/src/security/scanner/patterns.d.ts +14 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.js +147 -0
- package/dist/src/security/scanner/patterns.js.map +1 -0
- package/dist/src/security/scanner/regex-utils.d.ts +33 -0
- package/dist/src/security/scanner/regex-utils.d.ts.map +1 -0
- package/dist/src/security/scanner/regex-utils.js +41 -0
- package/dist/src/security/scanner/regex-utils.js.map +1 -0
- package/dist/src/security/scanner/types.d.ts +63 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -0
- package/dist/src/security/scanner/types.js +7 -0
- package/dist/src/security/scanner/types.js.map +1 -0
- package/dist/src/security/scanner/weights.d.ts +15 -0
- package/dist/src/security/scanner/weights.d.ts.map +1 -0
- package/dist/src/security/scanner/weights.js +28 -0
- package/dist/src/security/scanner/weights.js.map +1 -0
- package/dist/src/session/SessionHealthMonitor.d.ts +5 -168
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +22 -91
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/session/health-checks.d.ts +37 -0
- package/dist/src/session/health-checks.d.ts.map +1 -0
- package/dist/src/session/health-checks.js +64 -0
- package/dist/src/session/health-checks.js.map +1 -0
- package/dist/src/session/health-types.d.ts +78 -0
- package/dist/src/session/health-types.d.ts.map +1 -0
- package/dist/src/session/health-types.js +16 -0
- package/dist/src/session/health-types.js.map +1 -0
- package/dist/src/session/index.d.ts +5 -1
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +9 -0
- package/dist/src/session/index.js.map +1 -1
- package/dist/src/session/metrics-collector.d.ts +23 -0
- package/dist/src/session/metrics-collector.d.ts.map +1 -0
- package/dist/src/session/metrics-collector.js +44 -0
- package/dist/src/session/metrics-collector.js.map +1 -0
- package/dist/src/session/typed-event-emitter.d.ts +70 -0
- package/dist/src/session/typed-event-emitter.d.ts.map +1 -0
- package/dist/src/session/typed-event-emitter.js +79 -0
- package/dist/src/session/typed-event-emitter.js.map +1 -0
- package/dist/src/sources/BaseSourceAdapter.d.ts +1 -1
- package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -1
- package/dist/src/sources/BaseSourceAdapter.js +2 -2
- package/dist/src/sources/BaseSourceAdapter.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +125 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -0
- package/dist/src/telemetry/posthog.js +198 -0
- package/dist/src/telemetry/posthog.js.map +1 -0
- package/dist/tests/RateLimiter.test.js +4 -4
- package/dist/tests/RateLimiter.test.js.map +1 -1
- package/dist/tests/e2e/security/security.e2e.test.js +3 -3
- package/dist/tests/e2e/security/security.e2e.test.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMI-761: Session Health Monitoring
|
|
3
|
+
* SMI-1189: Refactored to use TypedEventEmitter
|
|
3
4
|
*
|
|
4
5
|
* Provides health monitoring for swarm sessions:
|
|
5
6
|
* - Heartbeat mechanism every 30 seconds
|
|
@@ -7,16 +8,16 @@
|
|
|
7
8
|
* - Session state recovery capabilities
|
|
8
9
|
* - Metrics for session health
|
|
9
10
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
import { TypedEventEmitter } from './typed-event-emitter.js';
|
|
12
|
+
import { MAX_RECOVERY_ATTEMPTS, DEFAULT_CONFIG, } from './health-types.js';
|
|
13
|
+
import { calculateHealth, determineHealthStatus, hasStatusChanged, } from './health-checks.js';
|
|
14
|
+
import { recordSessionCount, recordRecoverySuccess, recordHealthStatusError, } from './metrics-collector.js';
|
|
14
15
|
/**
|
|
15
16
|
* Session Health Monitor
|
|
16
17
|
*
|
|
17
18
|
* Tracks session health through heartbeats and detects stuck sessions.
|
|
18
19
|
*/
|
|
19
|
-
export class SessionHealthMonitor extends
|
|
20
|
+
export class SessionHealthMonitor extends TypedEventEmitter {
|
|
20
21
|
config;
|
|
21
22
|
sessions = new Map();
|
|
22
23
|
checkInterval = null;
|
|
@@ -24,52 +25,13 @@ export class SessionHealthMonitor extends EventEmitter {
|
|
|
24
25
|
constructor(config = {}) {
|
|
25
26
|
super();
|
|
26
27
|
this.config = {
|
|
27
|
-
heartbeatIntervalMs: config.heartbeatIntervalMs ??
|
|
28
|
-
warningThreshold: config.warningThreshold ??
|
|
29
|
-
unhealthyThreshold: config.unhealthyThreshold ??
|
|
30
|
-
deadThreshold: config.deadThreshold ??
|
|
31
|
-
autoRecover: config.autoRecover ??
|
|
28
|
+
heartbeatIntervalMs: config.heartbeatIntervalMs ?? DEFAULT_CONFIG.heartbeatIntervalMs,
|
|
29
|
+
warningThreshold: config.warningThreshold ?? DEFAULT_CONFIG.warningThreshold,
|
|
30
|
+
unhealthyThreshold: config.unhealthyThreshold ?? DEFAULT_CONFIG.unhealthyThreshold,
|
|
31
|
+
deadThreshold: config.deadThreshold ?? DEFAULT_CONFIG.deadThreshold,
|
|
32
|
+
autoRecover: config.autoRecover ?? DEFAULT_CONFIG.autoRecover,
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
|
-
/** Add a listener for any event (fallback) */
|
|
35
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
-
on(event, listener) {
|
|
37
|
-
return super.on(event, listener);
|
|
38
|
-
}
|
|
39
|
-
/** Emit any event (fallback) */
|
|
40
|
-
emit(event, ...args) {
|
|
41
|
-
return super.emit(event, ...args);
|
|
42
|
-
}
|
|
43
|
-
/** Remove a listener for any event (fallback) */
|
|
44
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
-
off(event, listener) {
|
|
46
|
-
return super.off(event, listener);
|
|
47
|
-
}
|
|
48
|
-
/** Add a one-time listener for any event (fallback) */
|
|
49
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
|
-
once(event, listener) {
|
|
51
|
-
return super.once(event, listener);
|
|
52
|
-
}
|
|
53
|
-
/** Add a listener for any event (fallback) */
|
|
54
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
-
addListener(event, listener) {
|
|
56
|
-
return super.addListener(event, listener);
|
|
57
|
-
}
|
|
58
|
-
/** Remove a listener for any event (fallback) */
|
|
59
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
-
removeListener(event, listener) {
|
|
61
|
-
return super.removeListener(event, listener);
|
|
62
|
-
}
|
|
63
|
-
/** Prepend a listener for any event (fallback) */
|
|
64
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
65
|
-
prependListener(event, listener) {
|
|
66
|
-
return super.prependListener(event, listener);
|
|
67
|
-
}
|
|
68
|
-
/** Prepend a one-time listener for any event (fallback) */
|
|
69
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
-
prependOnceListener(event, listener) {
|
|
71
|
-
return super.prependOnceListener(event, listener);
|
|
72
|
-
}
|
|
73
35
|
/**
|
|
74
36
|
* Start monitoring a session
|
|
75
37
|
*/
|
|
@@ -84,9 +46,7 @@ export class SessionHealthMonitor extends EventEmitter {
|
|
|
84
46
|
sessionData: session,
|
|
85
47
|
recoveryAttempts: 0,
|
|
86
48
|
});
|
|
87
|
-
|
|
88
|
-
const metrics = getMetrics();
|
|
89
|
-
metrics.activeOperations.set(this.sessions.size, { type: 'session' });
|
|
49
|
+
recordSessionCount(this.sessions.size);
|
|
90
50
|
}
|
|
91
51
|
/**
|
|
92
52
|
* Record a heartbeat for a session
|
|
@@ -111,9 +71,7 @@ export class SessionHealthMonitor extends EventEmitter {
|
|
|
111
71
|
*/
|
|
112
72
|
unregisterSession(sessionId) {
|
|
113
73
|
this.sessions.delete(sessionId);
|
|
114
|
-
|
|
115
|
-
const metrics = getMetrics();
|
|
116
|
-
metrics.activeOperations.set(this.sessions.size, { type: 'session' });
|
|
74
|
+
recordSessionCount(this.sessions.size);
|
|
117
75
|
}
|
|
118
76
|
/**
|
|
119
77
|
* Get health status for a session
|
|
@@ -123,13 +81,13 @@ export class SessionHealthMonitor extends EventEmitter {
|
|
|
123
81
|
if (!state) {
|
|
124
82
|
return null;
|
|
125
83
|
}
|
|
126
|
-
return
|
|
84
|
+
return calculateHealth(state);
|
|
127
85
|
}
|
|
128
86
|
/**
|
|
129
87
|
* Get health status for all sessions
|
|
130
88
|
*/
|
|
131
89
|
getAllSessionHealth() {
|
|
132
|
-
return Array.from(this.sessions.values()).map((state) =>
|
|
90
|
+
return Array.from(this.sessions.values()).map((state) => calculateHealth(state));
|
|
133
91
|
}
|
|
134
92
|
/**
|
|
135
93
|
* Start the health monitor
|
|
@@ -171,23 +129,6 @@ export class SessionHealthMonitor extends EventEmitter {
|
|
|
171
129
|
getSessionCount() {
|
|
172
130
|
return this.sessions.size;
|
|
173
131
|
}
|
|
174
|
-
/**
|
|
175
|
-
* Calculate health for a session state
|
|
176
|
-
*/
|
|
177
|
-
calculateHealth(state) {
|
|
178
|
-
const now = Date.now();
|
|
179
|
-
const secondsSinceHeartbeat = Math.floor((now - state.lastHeartbeat) / 1000);
|
|
180
|
-
const uptimeSeconds = Math.floor((now - state.startedAt) / 1000);
|
|
181
|
-
return {
|
|
182
|
-
sessionId: state.sessionId,
|
|
183
|
-
status: state.status,
|
|
184
|
-
lastHeartbeat: new Date(state.lastHeartbeat).toISOString(),
|
|
185
|
-
secondsSinceHeartbeat,
|
|
186
|
-
uptimeSeconds,
|
|
187
|
-
missedHeartbeats: state.missedHeartbeats,
|
|
188
|
-
recoverable: state.status !== 'dead' && state.sessionData !== undefined,
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
132
|
/**
|
|
192
133
|
* Attempt to recover a dead session from stored sessionData
|
|
193
134
|
*
|
|
@@ -219,43 +160,33 @@ export class SessionHealthMonitor extends EventEmitter {
|
|
|
219
160
|
// Emit recovered event
|
|
220
161
|
this.emit('recovered', state.sessionId);
|
|
221
162
|
// Record successful recovery metric
|
|
222
|
-
|
|
223
|
-
metrics.mcpRequestCount.increment({ type: 'session_recovered' }); // SMI-770: Use request counter, not error counter
|
|
163
|
+
recordRecoverySuccess();
|
|
224
164
|
return true;
|
|
225
165
|
}
|
|
226
166
|
/**
|
|
227
167
|
* Check all sessions for health issues
|
|
228
168
|
*/
|
|
229
169
|
checkAllSessions() {
|
|
230
|
-
const metrics = getMetrics();
|
|
231
170
|
for (const state of this.sessions.values()) {
|
|
232
171
|
const previousStatus = state.status;
|
|
233
172
|
state.missedHeartbeats++;
|
|
234
173
|
// Determine new status based on missed heartbeats
|
|
235
|
-
|
|
236
|
-
state.status = 'dead';
|
|
237
|
-
}
|
|
238
|
-
else if (state.missedHeartbeats >= this.config.unhealthyThreshold) {
|
|
239
|
-
state.status = 'unhealthy';
|
|
240
|
-
}
|
|
241
|
-
else if (state.missedHeartbeats >= this.config.warningThreshold) {
|
|
242
|
-
state.status = 'warning';
|
|
243
|
-
}
|
|
174
|
+
state.status = determineHealthStatus(state.missedHeartbeats, this.config);
|
|
244
175
|
// Emit events on status change
|
|
245
|
-
if (state.status
|
|
246
|
-
const health =
|
|
176
|
+
if (hasStatusChanged(previousStatus, state.status)) {
|
|
177
|
+
const health = calculateHealth(state);
|
|
247
178
|
switch (state.status) {
|
|
248
179
|
case 'warning':
|
|
249
180
|
this.emit('warning', health);
|
|
250
|
-
|
|
181
|
+
recordHealthStatusError(state.status);
|
|
251
182
|
break;
|
|
252
183
|
case 'unhealthy':
|
|
253
184
|
this.emit('unhealthy', health);
|
|
254
|
-
|
|
185
|
+
recordHealthStatusError(state.status);
|
|
255
186
|
break;
|
|
256
187
|
case 'dead':
|
|
257
188
|
this.emit('dead', health);
|
|
258
|
-
|
|
189
|
+
recordHealthStatusError(state.status);
|
|
259
190
|
// Attempt automatic recovery if enabled
|
|
260
191
|
if (this.config.autoRecover) {
|
|
261
192
|
this.attemptRecovery(state);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionHealthMonitor.js","sourceRoot":"","sources":["../../../src/session/SessionHealthMonitor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"SessionHealthMonitor.js","sourceRoot":"","sources":["../../../src/session/SessionHealthMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1189: Health Checks
|
|
3
|
+
*
|
|
4
|
+
* Health check and status calculation functions.
|
|
5
|
+
*/
|
|
6
|
+
import type { SessionHealth, SessionHealthState, SessionHealthStatus, RequiredHealthMonitorConfig } from './health-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Calculate health information for a session state
|
|
9
|
+
*
|
|
10
|
+
* @param state - The session health state
|
|
11
|
+
* @returns SessionHealth object with calculated fields
|
|
12
|
+
*/
|
|
13
|
+
export declare function calculateHealth(state: SessionHealthState): SessionHealth;
|
|
14
|
+
/**
|
|
15
|
+
* Determine new health status based on missed heartbeats
|
|
16
|
+
*
|
|
17
|
+
* @param missedHeartbeats - Number of missed heartbeats
|
|
18
|
+
* @param config - Health monitor configuration
|
|
19
|
+
* @returns New health status
|
|
20
|
+
*/
|
|
21
|
+
export declare function determineHealthStatus(missedHeartbeats: number, config: RequiredHealthMonitorConfig): SessionHealthStatus;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a session has transitioned to a new status
|
|
24
|
+
*
|
|
25
|
+
* @param previousStatus - Previous health status
|
|
26
|
+
* @param currentStatus - Current health status
|
|
27
|
+
* @returns true if status has changed
|
|
28
|
+
*/
|
|
29
|
+
export declare function hasStatusChanged(previousStatus: SessionHealthStatus, currentStatus: SessionHealthStatus): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Check if status requires an event emission
|
|
32
|
+
*
|
|
33
|
+
* @param status - Current health status
|
|
34
|
+
* @returns true if status is warning, unhealthy, or dead
|
|
35
|
+
*/
|
|
36
|
+
export declare function isAlertableStatus(status: SessionHealthStatus): boolean;
|
|
37
|
+
//# sourceMappingURL=health-checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-checks.d.ts","sourceRoot":"","sources":["../../../src/session/health-checks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,mBAAmB,CAAA;AAE1B;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAcxE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,2BAA2B,GAClC,mBAAmB,CAWrB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,mBAAmB,EACnC,aAAa,EAAE,mBAAmB,GACjC,OAAO,CAET;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAEtE"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1189: Health Checks
|
|
3
|
+
*
|
|
4
|
+
* Health check and status calculation functions.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Calculate health information for a session state
|
|
8
|
+
*
|
|
9
|
+
* @param state - The session health state
|
|
10
|
+
* @returns SessionHealth object with calculated fields
|
|
11
|
+
*/
|
|
12
|
+
export function calculateHealth(state) {
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
const secondsSinceHeartbeat = Math.floor((now - state.lastHeartbeat) / 1000);
|
|
15
|
+
const uptimeSeconds = Math.floor((now - state.startedAt) / 1000);
|
|
16
|
+
return {
|
|
17
|
+
sessionId: state.sessionId,
|
|
18
|
+
status: state.status,
|
|
19
|
+
lastHeartbeat: new Date(state.lastHeartbeat).toISOString(),
|
|
20
|
+
secondsSinceHeartbeat,
|
|
21
|
+
uptimeSeconds,
|
|
22
|
+
missedHeartbeats: state.missedHeartbeats,
|
|
23
|
+
recoverable: state.status !== 'dead' && state.sessionData !== undefined,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Determine new health status based on missed heartbeats
|
|
28
|
+
*
|
|
29
|
+
* @param missedHeartbeats - Number of missed heartbeats
|
|
30
|
+
* @param config - Health monitor configuration
|
|
31
|
+
* @returns New health status
|
|
32
|
+
*/
|
|
33
|
+
export function determineHealthStatus(missedHeartbeats, config) {
|
|
34
|
+
if (missedHeartbeats >= config.deadThreshold) {
|
|
35
|
+
return 'dead';
|
|
36
|
+
}
|
|
37
|
+
if (missedHeartbeats >= config.unhealthyThreshold) {
|
|
38
|
+
return 'unhealthy';
|
|
39
|
+
}
|
|
40
|
+
if (missedHeartbeats >= config.warningThreshold) {
|
|
41
|
+
return 'warning';
|
|
42
|
+
}
|
|
43
|
+
return 'healthy';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if a session has transitioned to a new status
|
|
47
|
+
*
|
|
48
|
+
* @param previousStatus - Previous health status
|
|
49
|
+
* @param currentStatus - Current health status
|
|
50
|
+
* @returns true if status has changed
|
|
51
|
+
*/
|
|
52
|
+
export function hasStatusChanged(previousStatus, currentStatus) {
|
|
53
|
+
return previousStatus !== currentStatus;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if status requires an event emission
|
|
57
|
+
*
|
|
58
|
+
* @param status - Current health status
|
|
59
|
+
* @returns true if status is warning, unhealthy, or dead
|
|
60
|
+
*/
|
|
61
|
+
export function isAlertableStatus(status) {
|
|
62
|
+
return status === 'warning' || status === 'unhealthy' || status === 'dead';
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=health-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-checks.js","sourceRoot":"","sources":["../../../src/session/health-checks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAA;IAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;IAEhE,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,aAAa,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE;QAC1D,qBAAqB;QACrB,aAAa;QACb,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;KACxE,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,gBAAwB,EACxB,MAAmC;IAEnC,IAAI,gBAAgB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,gBAAgB,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAClD,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,IAAI,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAChD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,cAAmC,EACnC,aAAkC;IAElC,OAAO,cAAc,KAAK,aAAa,CAAA;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA2B;IAC3D,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,MAAM,CAAA;AAC5E,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1189: Health Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for session health monitoring.
|
|
5
|
+
*/
|
|
6
|
+
import type { SessionData } from './SessionContext.js';
|
|
7
|
+
/**
|
|
8
|
+
* Health status for a session
|
|
9
|
+
*/
|
|
10
|
+
export type SessionHealthStatus = 'healthy' | 'warning' | 'unhealthy' | 'dead';
|
|
11
|
+
/**
|
|
12
|
+
* Session health information
|
|
13
|
+
*/
|
|
14
|
+
export interface SessionHealth {
|
|
15
|
+
/** Session ID */
|
|
16
|
+
sessionId: string;
|
|
17
|
+
/** Current health status */
|
|
18
|
+
status: SessionHealthStatus;
|
|
19
|
+
/** Last heartbeat timestamp (ISO) */
|
|
20
|
+
lastHeartbeat: string;
|
|
21
|
+
/** Seconds since last heartbeat */
|
|
22
|
+
secondsSinceHeartbeat: number;
|
|
23
|
+
/** Session uptime in seconds */
|
|
24
|
+
uptimeSeconds: number;
|
|
25
|
+
/** Number of missed heartbeats */
|
|
26
|
+
missedHeartbeats: number;
|
|
27
|
+
/** Whether the session can be recovered */
|
|
28
|
+
recoverable: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Configuration for health monitor
|
|
32
|
+
*/
|
|
33
|
+
export interface HealthMonitorConfig {
|
|
34
|
+
/** Heartbeat interval in milliseconds (default: 30000 = 30s) */
|
|
35
|
+
heartbeatIntervalMs?: number;
|
|
36
|
+
/** Warning threshold in missed heartbeats (default: 2) */
|
|
37
|
+
warningThreshold?: number;
|
|
38
|
+
/** Unhealthy threshold in missed heartbeats (default: 4) */
|
|
39
|
+
unhealthyThreshold?: number;
|
|
40
|
+
/** Dead threshold in missed heartbeats (default: 6) */
|
|
41
|
+
deadThreshold?: number;
|
|
42
|
+
/** Enable automatic recovery attempts (default: true) */
|
|
43
|
+
autoRecover?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Required configuration (with defaults applied)
|
|
47
|
+
*/
|
|
48
|
+
export type RequiredHealthMonitorConfig = Required<HealthMonitorConfig>;
|
|
49
|
+
/**
|
|
50
|
+
* Events emitted by the health monitor
|
|
51
|
+
*/
|
|
52
|
+
export type SessionHealthEvents = {
|
|
53
|
+
heartbeat: [sessionId: string];
|
|
54
|
+
warning: [health: SessionHealth];
|
|
55
|
+
unhealthy: [health: SessionHealth];
|
|
56
|
+
dead: [health: SessionHealth];
|
|
57
|
+
recovered: [sessionId: string];
|
|
58
|
+
'recovery-attempt': [sessionId: string, attempt: number];
|
|
59
|
+
'recovery-failed': [sessionId: string, reason: string];
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Internal state for tracked sessions
|
|
63
|
+
*/
|
|
64
|
+
export interface SessionHealthState {
|
|
65
|
+
sessionId: string;
|
|
66
|
+
startedAt: number;
|
|
67
|
+
lastHeartbeat: number;
|
|
68
|
+
missedHeartbeats: number;
|
|
69
|
+
status: SessionHealthStatus;
|
|
70
|
+
sessionData?: SessionData;
|
|
71
|
+
/** Number of recovery attempts made for this session */
|
|
72
|
+
recoveryAttempts: number;
|
|
73
|
+
}
|
|
74
|
+
/** Maximum number of recovery attempts before giving up */
|
|
75
|
+
export declare const MAX_RECOVERY_ATTEMPTS = 3;
|
|
76
|
+
/** Default health monitor configuration */
|
|
77
|
+
export declare const DEFAULT_CONFIG: RequiredHealthMonitorConfig;
|
|
78
|
+
//# sourceMappingURL=health-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-types.d.ts","sourceRoot":"","sources":["../../../src/session/health-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAA;AAE9E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,4BAA4B;IAC5B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAA;IACrB,mCAAmC;IACnC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAA;IACxB,2CAA2C;IAC3C,WAAW,EAAE,OAAO,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yDAAyD;IACzD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAA;AAEvE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAC9B,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAChC,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAClC,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC7B,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAC9B,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACxD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACvD,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,mBAAmB,CAAA;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,IAAI,CAAA;AAEtC,2CAA2C;AAC3C,eAAO,MAAM,cAAc,EAAE,2BAM5B,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1189: Health Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for session health monitoring.
|
|
5
|
+
*/
|
|
6
|
+
/** Maximum number of recovery attempts before giving up */
|
|
7
|
+
export const MAX_RECOVERY_ATTEMPTS = 3;
|
|
8
|
+
/** Default health monitor configuration */
|
|
9
|
+
export const DEFAULT_CONFIG = {
|
|
10
|
+
heartbeatIntervalMs: 30000,
|
|
11
|
+
warningThreshold: 2,
|
|
12
|
+
unhealthyThreshold: 4,
|
|
13
|
+
deadThreshold: 6,
|
|
14
|
+
autoRecover: true,
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=health-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-types.js","sourceRoot":"","sources":["../../../src/session/health-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6EH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAA;AAEtC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAgC;IACzD,mBAAmB,EAAE,KAAK;IAC1B,gBAAgB,EAAE,CAAC;IACnB,kBAAkB,EAAE,CAAC;IACrB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,IAAI;CAClB,CAAA"}
|
|
@@ -36,5 +36,9 @@
|
|
|
36
36
|
export { SessionManager, DefaultCommandExecutor, type SessionOptions, type MemoryResult, type CommandExecutor, } from './SessionManager.js';
|
|
37
37
|
export { ActiveSessionContext, NullSessionContext, createSessionContext, isActiveContext, getSessionDuration, formatSessionDuration, getLatestCheckpoint, type Checkpoint, type SessionData, type SessionContext, } from './SessionContext.js';
|
|
38
38
|
export { SessionRecovery, createSessionRecovery, type RecoveryStatus, type RecoveryResult, type RecoveryOptions, } from './SessionRecovery.js';
|
|
39
|
-
export { SessionHealthMonitor, getHealthMonitor, initializeHealthMonitor, shutdownHealthMonitor, type SessionHealth, type SessionHealthStatus, type HealthMonitorConfig, } from './SessionHealthMonitor.js';
|
|
39
|
+
export { SessionHealthMonitor, getHealthMonitor, initializeHealthMonitor, shutdownHealthMonitor, type SessionHealth, type SessionHealthStatus, type HealthMonitorConfig, type SessionHealthEvents, } from './SessionHealthMonitor.js';
|
|
40
|
+
export { TypedEventEmitter } from './typed-event-emitter.js';
|
|
41
|
+
export { type SessionHealthState, type RequiredHealthMonitorConfig, MAX_RECOVERY_ATTEMPTS, DEFAULT_CONFIG as DEFAULT_HEALTH_CONFIG, } from './health-types.js';
|
|
42
|
+
export { calculateHealth, determineHealthStatus, hasStatusChanged, isAlertableStatus, } from './health-checks.js';
|
|
43
|
+
export { recordSessionCount, recordRecoverySuccess, recordHealthStatusError, } from './metrics-collector.js';
|
|
40
44
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,qBAAqB,EACrB,cAAc,IAAI,qBAAqB,GACxC,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,wBAAwB,CAAA"}
|
|
@@ -40,5 +40,14 @@ export { ActiveSessionContext, NullSessionContext, createSessionContext, isActiv
|
|
|
40
40
|
// SessionRecovery - Session restoration from memory
|
|
41
41
|
export { SessionRecovery, createSessionRecovery, } from './SessionRecovery.js';
|
|
42
42
|
// SessionHealthMonitor - SMI-761: Session health monitoring
|
|
43
|
+
// SMI-1189: Refactored to use TypedEventEmitter
|
|
43
44
|
export { SessionHealthMonitor, getHealthMonitor, initializeHealthMonitor, shutdownHealthMonitor, } from './SessionHealthMonitor.js';
|
|
45
|
+
// TypedEventEmitter - SMI-1189: Reusable typed event emitter
|
|
46
|
+
export { TypedEventEmitter } from './typed-event-emitter.js';
|
|
47
|
+
// Health types - SMI-1189: Extracted types
|
|
48
|
+
export { MAX_RECOVERY_ATTEMPTS, DEFAULT_CONFIG as DEFAULT_HEALTH_CONFIG, } from './health-types.js';
|
|
49
|
+
// Health checks - SMI-1189: Extracted functions
|
|
50
|
+
export { calculateHealth, determineHealthStatus, hasStatusChanged, isAlertableStatus, } from './health-checks.js';
|
|
51
|
+
// Metrics collector - SMI-1189: Extracted metrics functions
|
|
52
|
+
export { recordSessionCount, recordRecoverySuccess, recordHealthStatusError, } from './metrics-collector.js';
|
|
44
53
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,qDAAqD;AACrD,OAAO,EACL,cAAc,EACd,sBAAsB,GAIvB,MAAM,qBAAqB,CAAA;AAE5B,qDAAqD;AACrD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GAIpB,MAAM,qBAAqB,CAAA;AAE5B,oDAAoD;AACpD,OAAO,EACL,eAAe,EACf,qBAAqB,GAItB,MAAM,sBAAsB,CAAA;AAE7B,4DAA4D;AAC5D,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,qDAAqD;AACrD,OAAO,EACL,cAAc,EACd,sBAAsB,GAIvB,MAAM,qBAAqB,CAAA;AAE5B,qDAAqD;AACrD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GAIpB,MAAM,qBAAqB,CAAA;AAE5B,oDAAoD;AACpD,OAAO,EACL,eAAe,EACf,qBAAqB,GAItB,MAAM,sBAAsB,CAAA;AAE7B,4DAA4D;AAC5D,gDAAgD;AAChD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,GAKtB,MAAM,2BAA2B,CAAA;AAElC,6DAA6D;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,2CAA2C;AAC3C,OAAO,EAGL,qBAAqB,EACrB,cAAc,IAAI,qBAAqB,GACxC,MAAM,mBAAmB,CAAA;AAE1B,gDAAgD;AAChD,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAE3B,4DAA4D;AAC5D,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1189: Metrics Collector
|
|
3
|
+
*
|
|
4
|
+
* Metrics collection logic for session health monitoring.
|
|
5
|
+
*/
|
|
6
|
+
import type { SessionHealthStatus } from './health-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Record session count metric
|
|
9
|
+
*
|
|
10
|
+
* @param sessionCount - Current number of active sessions
|
|
11
|
+
*/
|
|
12
|
+
export declare function recordSessionCount(sessionCount: number): void;
|
|
13
|
+
/**
|
|
14
|
+
* Record successful session recovery metric
|
|
15
|
+
*/
|
|
16
|
+
export declare function recordRecoverySuccess(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Record health status change error metric
|
|
19
|
+
*
|
|
20
|
+
* @param status - The new health status that triggered an error
|
|
21
|
+
*/
|
|
22
|
+
export declare function recordHealthStatusError(status: SessionHealthStatus): void;
|
|
23
|
+
//# sourceMappingURL=metrics-collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-collector.d.ts","sourceRoot":"","sources":["../../../src/session/metrics-collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAG7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAezE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1189: Metrics Collector
|
|
3
|
+
*
|
|
4
|
+
* Metrics collection logic for session health monitoring.
|
|
5
|
+
*/
|
|
6
|
+
import { getMetrics } from '../telemetry/metrics.js';
|
|
7
|
+
/**
|
|
8
|
+
* Record session count metric
|
|
9
|
+
*
|
|
10
|
+
* @param sessionCount - Current number of active sessions
|
|
11
|
+
*/
|
|
12
|
+
export function recordSessionCount(sessionCount) {
|
|
13
|
+
const metrics = getMetrics();
|
|
14
|
+
metrics.activeOperations.set(sessionCount, { type: 'session' });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Record successful session recovery metric
|
|
18
|
+
*/
|
|
19
|
+
export function recordRecoverySuccess() {
|
|
20
|
+
const metrics = getMetrics();
|
|
21
|
+
// SMI-770: Use request counter, not error counter for successful recoveries
|
|
22
|
+
metrics.mcpRequestCount.increment({ type: 'session_recovered' });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Record health status change error metric
|
|
26
|
+
*
|
|
27
|
+
* @param status - The new health status that triggered an error
|
|
28
|
+
*/
|
|
29
|
+
export function recordHealthStatusError(status) {
|
|
30
|
+
const metrics = getMetrics();
|
|
31
|
+
switch (status) {
|
|
32
|
+
case 'warning':
|
|
33
|
+
metrics.mcpErrorCount.increment({ type: 'session_warning' });
|
|
34
|
+
break;
|
|
35
|
+
case 'unhealthy':
|
|
36
|
+
metrics.mcpErrorCount.increment({ type: 'session_unhealthy' });
|
|
37
|
+
break;
|
|
38
|
+
case 'dead':
|
|
39
|
+
metrics.mcpErrorCount.increment({ type: 'session_dead' });
|
|
40
|
+
break;
|
|
41
|
+
// 'healthy' does not record an error
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=metrics-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-collector.js","sourceRoot":"","sources":["../../../src/session/metrics-collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGpD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAAoB;IACrD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,4EAA4E;IAC5E,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAA;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA2B;IACjE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAE5B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;YAC5D,MAAK;QACP,KAAK,WAAW;YACd,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAA;YAC9D,MAAK;QACP,KAAK,MAAM;YACT,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;YACzD,MAAK;QACP,qCAAqC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1189: Typed Event Emitter
|
|
3
|
+
*
|
|
4
|
+
* Generic TypedEventEmitter that provides type-safe event handling.
|
|
5
|
+
* Replaces ~182 lines of repetitive type overloads with a single generic class.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'node:events';
|
|
8
|
+
/**
|
|
9
|
+
* Constraint type for event maps.
|
|
10
|
+
* Events must be a record of event names to argument tuples.
|
|
11
|
+
*/
|
|
12
|
+
export type EventMap = {
|
|
13
|
+
[K: string]: unknown[];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Type-safe EventEmitter wrapper.
|
|
17
|
+
*
|
|
18
|
+
* @typeParam Events - Object mapping event names to their argument tuples
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* interface MyEvents {
|
|
23
|
+
* data: [payload: string];
|
|
24
|
+
* error: [error: Error, code: number];
|
|
25
|
+
* complete: [];
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* class MyEmitter extends TypedEventEmitter<MyEvents> {
|
|
29
|
+
* doSomething() {
|
|
30
|
+
* this.emit('data', 'hello'); // Type-checked!
|
|
31
|
+
* this.emit('error', new Error('oops'), 500);
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare class TypedEventEmitter<Events extends EventMap> extends EventEmitter {
|
|
37
|
+
/**
|
|
38
|
+
* Adds a listener function to the end of the listeners array for the specified event.
|
|
39
|
+
*/
|
|
40
|
+
on<K extends keyof Events & string>(event: K, listener: (...args: Events[K]) => void): this;
|
|
41
|
+
/**
|
|
42
|
+
* Synchronously calls each of the listeners registered for the event.
|
|
43
|
+
*/
|
|
44
|
+
emit<K extends keyof Events & string>(event: K, ...args: Events[K]): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Removes the specified listener from the listener array for the specified event.
|
|
47
|
+
*/
|
|
48
|
+
off<K extends keyof Events & string>(event: K, listener: (...args: Events[K]) => void): this;
|
|
49
|
+
/**
|
|
50
|
+
* Adds a one-time listener function for the specified event.
|
|
51
|
+
*/
|
|
52
|
+
once<K extends keyof Events & string>(event: K, listener: (...args: Events[K]) => void): this;
|
|
53
|
+
/**
|
|
54
|
+
* Alias for on().
|
|
55
|
+
*/
|
|
56
|
+
addListener<K extends keyof Events & string>(event: K, listener: (...args: Events[K]) => void): this;
|
|
57
|
+
/**
|
|
58
|
+
* Alias for off().
|
|
59
|
+
*/
|
|
60
|
+
removeListener<K extends keyof Events & string>(event: K, listener: (...args: Events[K]) => void): this;
|
|
61
|
+
/**
|
|
62
|
+
* Adds a listener to the beginning of the listeners array.
|
|
63
|
+
*/
|
|
64
|
+
prependListener<K extends keyof Events & string>(event: K, listener: (...args: Events[K]) => void): this;
|
|
65
|
+
/**
|
|
66
|
+
* Adds a one-time listener to the beginning of the listeners array.
|
|
67
|
+
*/
|
|
68
|
+
prependOnceListener<K extends keyof Events & string>(event: K, listener: (...args: Events[K]) => void): this;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=typed-event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-event-emitter.d.ts","sourceRoot":"","sources":["../../../src/session/typed-event-emitter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAAA;CAAE,CAAA;AAEjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,iBAAiB,CAAC,MAAM,SAAS,QAAQ,CAAE,SAAQ,YAAY;IAC1E;;OAEG;IACM,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EACzC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI;IAIP;;OAEG;IACM,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO;IAIrF;;OAEG;IACM,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EAC1C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI;IAIP;;OAEG;IACM,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EAC3C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI;IAIP;;OAEG;IACM,WAAW,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EAClD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI;IAIP;;OAEG;IACM,cAAc,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EACrD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI;IAIP;;OAEG;IACM,eAAe,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EACtD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI;IAIP;;OAEG;IACM,mBAAmB,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EAC1D,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI;CAGR"}
|