@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.
Files changed (325) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/analysis/CodebaseAnalyzer.d.ts +4 -134
  3. package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
  4. package/dist/src/analysis/CodebaseAnalyzer.js +7 -315
  5. package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
  6. package/dist/src/analysis/framework-detector.d.ts +47 -0
  7. package/dist/src/analysis/framework-detector.d.ts.map +1 -0
  8. package/dist/src/analysis/framework-detector.js +151 -0
  9. package/dist/src/analysis/framework-detector.js.map +1 -0
  10. package/dist/src/analysis/index.d.ts +6 -1
  11. package/dist/src/analysis/index.d.ts.map +1 -1
  12. package/dist/src/analysis/index.js +10 -1
  13. package/dist/src/analysis/index.js.map +1 -1
  14. package/dist/src/analysis/parsers.d.ts +43 -0
  15. package/dist/src/analysis/parsers.d.ts.map +1 -0
  16. package/dist/src/analysis/parsers.js +219 -0
  17. package/dist/src/analysis/parsers.js.map +1 -0
  18. package/dist/src/analysis/types.d.ts +138 -0
  19. package/dist/src/analysis/types.d.ts.map +1 -0
  20. package/dist/src/analysis/types.js +25 -0
  21. package/dist/src/analysis/types.js.map +1 -0
  22. package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
  23. package/dist/src/analytics/AnalyticsRepository.js +4 -4
  24. package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
  25. package/dist/src/api/cache.d.ts +108 -0
  26. package/dist/src/api/cache.d.ts.map +1 -0
  27. package/dist/src/api/cache.js +216 -0
  28. package/dist/src/api/cache.js.map +1 -0
  29. package/dist/src/api/client.d.ts +152 -0
  30. package/dist/src/api/client.d.ts.map +1 -0
  31. package/dist/src/api/client.js +221 -0
  32. package/dist/src/api/client.js.map +1 -0
  33. package/dist/src/api/index.d.ts +10 -0
  34. package/dist/src/api/index.d.ts.map +1 -0
  35. package/dist/src/api/index.js +10 -0
  36. package/dist/src/api/index.js.map +1 -0
  37. package/dist/src/benchmarks/BenchmarkRunner.d.ts +6 -175
  38. package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
  39. package/dist/src/benchmarks/BenchmarkRunner.js +6 -123
  40. package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
  41. package/dist/src/benchmarks/MemoryProfiler.d.ts +4 -262
  42. package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -1
  43. package/dist/src/benchmarks/MemoryProfiler.js +4 -400
  44. package/dist/src/benchmarks/MemoryProfiler.js.map +1 -1
  45. package/dist/src/benchmarks/comparator.d.ts +38 -0
  46. package/dist/src/benchmarks/comparator.d.ts.map +1 -0
  47. package/dist/src/benchmarks/comparator.js +81 -0
  48. package/dist/src/benchmarks/comparator.js.map +1 -0
  49. package/dist/src/benchmarks/formatters.d.ts +30 -0
  50. package/dist/src/benchmarks/formatters.d.ts.map +1 -0
  51. package/dist/src/benchmarks/formatters.js +88 -0
  52. package/dist/src/benchmarks/formatters.js.map +1 -0
  53. package/dist/src/benchmarks/index.d.ts +5 -1
  54. package/dist/src/benchmarks/index.d.ts.map +1 -1
  55. package/dist/src/benchmarks/index.js +9 -2
  56. package/dist/src/benchmarks/index.js.map +1 -1
  57. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts +165 -0
  58. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -0
  59. package/dist/src/benchmarks/memory/MemoryProfiler.js +312 -0
  60. package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -0
  61. package/dist/src/benchmarks/memory/baseline-manager.d.ts +64 -0
  62. package/dist/src/benchmarks/memory/baseline-manager.d.ts.map +1 -0
  63. package/dist/src/benchmarks/memory/baseline-manager.js +95 -0
  64. package/dist/src/benchmarks/memory/baseline-manager.js.map +1 -0
  65. package/dist/src/benchmarks/memory/index.d.ts +12 -0
  66. package/dist/src/benchmarks/memory/index.d.ts.map +1 -0
  67. package/dist/src/benchmarks/memory/index.js +12 -0
  68. package/dist/src/benchmarks/memory/index.js.map +1 -0
  69. package/dist/src/benchmarks/memory/leak-detector.d.ts +23 -0
  70. package/dist/src/benchmarks/memory/leak-detector.d.ts.map +1 -0
  71. package/dist/src/benchmarks/memory/leak-detector.js +46 -0
  72. package/dist/src/benchmarks/memory/leak-detector.js.map +1 -0
  73. package/dist/src/benchmarks/memory/regression-detector.d.ts +17 -0
  74. package/dist/src/benchmarks/memory/regression-detector.d.ts.map +1 -0
  75. package/dist/src/benchmarks/memory/regression-detector.js +56 -0
  76. package/dist/src/benchmarks/memory/regression-detector.js.map +1 -0
  77. package/dist/src/benchmarks/memory/types.d.ts +111 -0
  78. package/dist/src/benchmarks/memory/types.d.ts.map +1 -0
  79. package/dist/src/benchmarks/memory/types.js +7 -0
  80. package/dist/src/benchmarks/memory/types.js.map +1 -0
  81. package/dist/src/benchmarks/memory/utils.d.ts +17 -0
  82. package/dist/src/benchmarks/memory/utils.d.ts.map +1 -0
  83. package/dist/src/benchmarks/memory/utils.js +29 -0
  84. package/dist/src/benchmarks/memory/utils.js.map +1 -0
  85. package/dist/src/benchmarks/types.d.ts +175 -0
  86. package/dist/src/benchmarks/types.d.ts.map +1 -0
  87. package/dist/src/benchmarks/types.js +20 -0
  88. package/dist/src/benchmarks/types.js.map +1 -0
  89. package/dist/src/index.d.ts +4 -2
  90. package/dist/src/index.d.ts.map +1 -1
  91. package/dist/src/index.js +7 -3
  92. package/dist/src/index.js.map +1 -1
  93. package/dist/src/repositories/QuarantineRepository.d.ts +4 -251
  94. package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -1
  95. package/dist/src/repositories/QuarantineRepository.js +4 -441
  96. package/dist/src/repositories/QuarantineRepository.js.map +1 -1
  97. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +168 -0
  98. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -0
  99. package/dist/src/repositories/quarantine/QuarantineRepository.js +341 -0
  100. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -0
  101. package/dist/src/repositories/quarantine/index.d.ts +10 -0
  102. package/dist/src/repositories/quarantine/index.d.ts.map +1 -0
  103. package/dist/src/repositories/quarantine/index.js +10 -0
  104. package/dist/src/repositories/quarantine/index.js.map +1 -0
  105. package/dist/src/repositories/quarantine/queries.d.ts +58 -0
  106. package/dist/src/repositories/quarantine/queries.d.ts.map +1 -0
  107. package/dist/src/repositories/quarantine/queries.js +88 -0
  108. package/dist/src/repositories/quarantine/queries.js.map +1 -0
  109. package/dist/src/repositories/quarantine/query-builder.d.ts +44 -0
  110. package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -0
  111. package/dist/src/repositories/quarantine/query-builder.js +87 -0
  112. package/dist/src/repositories/quarantine/query-builder.js.map +1 -0
  113. package/dist/src/repositories/quarantine/types.d.ts +155 -0
  114. package/dist/src/repositories/quarantine/types.d.ts.map +1 -0
  115. package/dist/src/repositories/quarantine/types.js +13 -0
  116. package/dist/src/repositories/quarantine/types.js.map +1 -0
  117. package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +1 -0
  118. package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -1
  119. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +7 -43
  120. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  121. package/dist/src/scripts/github-import/checkpoint.d.ts +21 -0
  122. package/dist/src/scripts/github-import/checkpoint.d.ts.map +1 -0
  123. package/dist/src/scripts/github-import/checkpoint.js +52 -0
  124. package/dist/src/scripts/github-import/checkpoint.js.map +1 -0
  125. package/dist/src/scripts/github-import/deduplication.d.ts +15 -0
  126. package/dist/src/scripts/github-import/deduplication.d.ts.map +1 -0
  127. package/dist/src/scripts/github-import/deduplication.js +33 -0
  128. package/dist/src/scripts/github-import/deduplication.js.map +1 -0
  129. package/dist/src/scripts/github-import/github-client.d.ts +29 -0
  130. package/dist/src/scripts/github-import/github-client.d.ts.map +1 -0
  131. package/dist/src/scripts/github-import/github-client.js +184 -0
  132. package/dist/src/scripts/github-import/github-client.js.map +1 -0
  133. package/dist/src/scripts/github-import/index.d.ts +29 -0
  134. package/dist/src/scripts/github-import/index.d.ts.map +1 -0
  135. package/dist/src/scripts/github-import/index.js +198 -0
  136. package/dist/src/scripts/github-import/index.js.map +1 -0
  137. package/dist/src/scripts/github-import/output.d.ts +12 -0
  138. package/dist/src/scripts/github-import/output.d.ts.map +1 -0
  139. package/dist/src/scripts/github-import/output.js +34 -0
  140. package/dist/src/scripts/github-import/output.js.map +1 -0
  141. package/dist/src/scripts/github-import/types.d.ts +108 -0
  142. package/dist/src/scripts/github-import/types.d.ts.map +1 -0
  143. package/dist/src/scripts/github-import/types.js +44 -0
  144. package/dist/src/scripts/github-import/types.js.map +1 -0
  145. package/dist/src/scripts/github-import/utils.d.ts +13 -0
  146. package/dist/src/scripts/github-import/utils.d.ts.map +1 -0
  147. package/dist/src/scripts/github-import/utils.js +28 -0
  148. package/dist/src/scripts/github-import/utils.js.map +1 -0
  149. package/dist/src/scripts/import-github-skills.d.ts +3 -12
  150. package/dist/src/scripts/import-github-skills.d.ts.map +1 -1
  151. package/dist/src/scripts/import-github-skills.js +18 -398
  152. package/dist/src/scripts/import-github-skills.js.map +1 -1
  153. package/dist/src/scripts/scan-imported-skills.d.ts +7 -7
  154. package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
  155. package/dist/src/scripts/scan-imported-skills.js +8 -397
  156. package/dist/src/scripts/scan-imported-skills.js.map +1 -1
  157. package/dist/src/scripts/skill-scanner/categorizer.d.ts +43 -0
  158. package/dist/src/scripts/skill-scanner/categorizer.d.ts.map +1 -0
  159. package/dist/src/scripts/skill-scanner/categorizer.js +61 -0
  160. package/dist/src/scripts/skill-scanner/categorizer.js.map +1 -0
  161. package/dist/src/scripts/skill-scanner/file-scanner.d.ts +43 -0
  162. package/dist/src/scripts/skill-scanner/file-scanner.d.ts.map +1 -0
  163. package/dist/src/scripts/skill-scanner/file-scanner.js +90 -0
  164. package/dist/src/scripts/skill-scanner/file-scanner.js.map +1 -0
  165. package/dist/src/scripts/skill-scanner/index.d.ts +22 -0
  166. package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -0
  167. package/dist/src/scripts/skill-scanner/index.js +43 -0
  168. package/dist/src/scripts/skill-scanner/index.js.map +1 -0
  169. package/dist/src/scripts/skill-scanner/logger.d.ts +59 -0
  170. package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -0
  171. package/dist/src/scripts/skill-scanner/logger.js +104 -0
  172. package/dist/src/scripts/skill-scanner/logger.js.map +1 -0
  173. package/dist/src/scripts/skill-scanner/reporter.d.ts +56 -0
  174. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -0
  175. package/dist/src/scripts/skill-scanner/reporter.js +166 -0
  176. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -0
  177. package/dist/src/scripts/skill-scanner/scanner.d.ts +44 -0
  178. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -0
  179. package/dist/src/scripts/skill-scanner/scanner.js +140 -0
  180. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -0
  181. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +59 -0
  182. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -0
  183. package/dist/src/scripts/skill-scanner/trust-scorer.js +62 -0
  184. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -0
  185. package/dist/src/scripts/skill-scanner/types.d.ts +98 -0
  186. package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -0
  187. package/dist/src/scripts/skill-scanner/types.js +7 -0
  188. package/dist/src/scripts/skill-scanner/types.js.map +1 -0
  189. package/dist/src/scripts/validate-skills.d.ts +3 -172
  190. package/dist/src/scripts/validate-skills.d.ts.map +1 -1
  191. package/dist/src/scripts/validate-skills.js +6 -519
  192. package/dist/src/scripts/validate-skills.js.map +1 -1
  193. package/dist/src/scripts/validation/deduplication.d.ts +23 -0
  194. package/dist/src/scripts/validation/deduplication.d.ts.map +1 -0
  195. package/dist/src/scripts/validation/deduplication.js +127 -0
  196. package/dist/src/scripts/validation/deduplication.js.map +1 -0
  197. package/dist/src/scripts/validation/field-validators.d.ts +9 -0
  198. package/dist/src/scripts/validation/field-validators.d.ts.map +1 -0
  199. package/dist/src/scripts/validation/field-validators.js +135 -0
  200. package/dist/src/scripts/validation/field-validators.js.map +1 -0
  201. package/dist/src/scripts/validation/index.d.ts +29 -0
  202. package/dist/src/scripts/validation/index.d.ts.map +1 -0
  203. package/dist/src/scripts/validation/index.js +84 -0
  204. package/dist/src/scripts/validation/index.js.map +1 -0
  205. package/dist/src/scripts/validation/normalizers.d.ts +29 -0
  206. package/dist/src/scripts/validation/normalizers.d.ts.map +1 -0
  207. package/dist/src/scripts/validation/normalizers.js +79 -0
  208. package/dist/src/scripts/validation/normalizers.js.map +1 -0
  209. package/dist/src/scripts/validation/pipeline.d.ts +13 -0
  210. package/dist/src/scripts/validation/pipeline.d.ts.map +1 -0
  211. package/dist/src/scripts/validation/pipeline.js +126 -0
  212. package/dist/src/scripts/validation/pipeline.js.map +1 -0
  213. package/dist/src/scripts/validation/types.d.ts +128 -0
  214. package/dist/src/scripts/validation/types.d.ts.map +1 -0
  215. package/dist/src/scripts/validation/types.js +43 -0
  216. package/dist/src/scripts/validation/types.js.map +1 -0
  217. package/dist/src/security/index.d.ts +5 -4
  218. package/dist/src/security/index.d.ts.map +1 -1
  219. package/dist/src/security/index.js +8 -2
  220. package/dist/src/security/index.js.map +1 -1
  221. package/dist/src/security/rate-limiter/RateLimiter.d.ts +86 -0
  222. package/dist/src/security/rate-limiter/RateLimiter.d.ts.map +1 -0
  223. package/dist/src/security/rate-limiter/RateLimiter.js +260 -0
  224. package/dist/src/security/rate-limiter/RateLimiter.js.map +1 -0
  225. package/dist/src/security/rate-limiter/constants.d.ts +15 -0
  226. package/dist/src/security/rate-limiter/constants.d.ts.map +1 -0
  227. package/dist/src/security/rate-limiter/constants.js +15 -0
  228. package/dist/src/security/rate-limiter/constants.js.map +1 -0
  229. package/dist/src/security/rate-limiter/errors.d.ts +22 -0
  230. package/dist/src/security/rate-limiter/errors.d.ts.map +1 -0
  231. package/dist/src/security/rate-limiter/errors.js +32 -0
  232. package/dist/src/security/rate-limiter/errors.js.map +1 -0
  233. package/dist/src/security/rate-limiter/index.d.ts +12 -0
  234. package/dist/src/security/rate-limiter/index.d.ts.map +1 -0
  235. package/dist/src/security/rate-limiter/index.js +16 -0
  236. package/dist/src/security/rate-limiter/index.js.map +1 -0
  237. package/dist/src/security/rate-limiter/metrics-manager.d.ts +55 -0
  238. package/dist/src/security/rate-limiter/metrics-manager.d.ts.map +1 -0
  239. package/dist/src/security/rate-limiter/metrics-manager.js +144 -0
  240. package/dist/src/security/rate-limiter/metrics-manager.js.map +1 -0
  241. package/dist/src/security/rate-limiter/presets.d.ts +52 -0
  242. package/dist/src/security/rate-limiter/presets.d.ts.map +1 -0
  243. package/dist/src/security/rate-limiter/presets.js +53 -0
  244. package/dist/src/security/rate-limiter/presets.js.map +1 -0
  245. package/dist/src/security/rate-limiter/queue-manager.d.ts +59 -0
  246. package/dist/src/security/rate-limiter/queue-manager.d.ts.map +1 -0
  247. package/dist/src/security/rate-limiter/queue-manager.js +189 -0
  248. package/dist/src/security/rate-limiter/queue-manager.js.map +1 -0
  249. package/dist/src/security/rate-limiter/storage.d.ts +34 -0
  250. package/dist/src/security/rate-limiter/storage.d.ts.map +1 -0
  251. package/dist/src/security/rate-limiter/storage.js +80 -0
  252. package/dist/src/security/rate-limiter/storage.js.map +1 -0
  253. package/dist/src/security/rate-limiter/token-bucket.d.ts +44 -0
  254. package/dist/src/security/rate-limiter/token-bucket.d.ts.map +1 -0
  255. package/dist/src/security/rate-limiter/token-bucket.js +99 -0
  256. package/dist/src/security/rate-limiter/token-bucket.js.map +1 -0
  257. package/dist/src/security/rate-limiter/types.d.ts +104 -0
  258. package/dist/src/security/rate-limiter/types.d.ts.map +1 -0
  259. package/dist/src/security/rate-limiter/types.js +7 -0
  260. package/dist/src/security/rate-limiter/types.js.map +1 -0
  261. package/dist/src/security/scanner/SecurityScanner.d.ts +94 -0
  262. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -0
  263. package/dist/src/security/scanner/SecurityScanner.js +403 -0
  264. package/dist/src/security/scanner/SecurityScanner.js.map +1 -0
  265. package/dist/src/security/scanner/index.d.ts +11 -0
  266. package/dist/src/security/scanner/index.d.ts.map +1 -0
  267. package/dist/src/security/scanner/index.js +14 -0
  268. package/dist/src/security/scanner/index.js.map +1 -0
  269. package/dist/src/security/scanner/patterns.d.ts +14 -0
  270. package/dist/src/security/scanner/patterns.d.ts.map +1 -0
  271. package/dist/src/security/scanner/patterns.js +147 -0
  272. package/dist/src/security/scanner/patterns.js.map +1 -0
  273. package/dist/src/security/scanner/regex-utils.d.ts +33 -0
  274. package/dist/src/security/scanner/regex-utils.d.ts.map +1 -0
  275. package/dist/src/security/scanner/regex-utils.js +41 -0
  276. package/dist/src/security/scanner/regex-utils.js.map +1 -0
  277. package/dist/src/security/scanner/types.d.ts +63 -0
  278. package/dist/src/security/scanner/types.d.ts.map +1 -0
  279. package/dist/src/security/scanner/types.js +7 -0
  280. package/dist/src/security/scanner/types.js.map +1 -0
  281. package/dist/src/security/scanner/weights.d.ts +15 -0
  282. package/dist/src/security/scanner/weights.d.ts.map +1 -0
  283. package/dist/src/security/scanner/weights.js +28 -0
  284. package/dist/src/security/scanner/weights.js.map +1 -0
  285. package/dist/src/session/SessionHealthMonitor.d.ts +5 -168
  286. package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
  287. package/dist/src/session/SessionHealthMonitor.js +22 -91
  288. package/dist/src/session/SessionHealthMonitor.js.map +1 -1
  289. package/dist/src/session/health-checks.d.ts +37 -0
  290. package/dist/src/session/health-checks.d.ts.map +1 -0
  291. package/dist/src/session/health-checks.js +64 -0
  292. package/dist/src/session/health-checks.js.map +1 -0
  293. package/dist/src/session/health-types.d.ts +78 -0
  294. package/dist/src/session/health-types.d.ts.map +1 -0
  295. package/dist/src/session/health-types.js +16 -0
  296. package/dist/src/session/health-types.js.map +1 -0
  297. package/dist/src/session/index.d.ts +5 -1
  298. package/dist/src/session/index.d.ts.map +1 -1
  299. package/dist/src/session/index.js +9 -0
  300. package/dist/src/session/index.js.map +1 -1
  301. package/dist/src/session/metrics-collector.d.ts +23 -0
  302. package/dist/src/session/metrics-collector.d.ts.map +1 -0
  303. package/dist/src/session/metrics-collector.js +44 -0
  304. package/dist/src/session/metrics-collector.js.map +1 -0
  305. package/dist/src/session/typed-event-emitter.d.ts +70 -0
  306. package/dist/src/session/typed-event-emitter.d.ts.map +1 -0
  307. package/dist/src/session/typed-event-emitter.js +79 -0
  308. package/dist/src/session/typed-event-emitter.js.map +1 -0
  309. package/dist/src/sources/BaseSourceAdapter.d.ts +1 -1
  310. package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -1
  311. package/dist/src/sources/BaseSourceAdapter.js +2 -2
  312. package/dist/src/sources/BaseSourceAdapter.js.map +1 -1
  313. package/dist/src/telemetry/index.d.ts +1 -0
  314. package/dist/src/telemetry/index.d.ts.map +1 -1
  315. package/dist/src/telemetry/index.js +2 -0
  316. package/dist/src/telemetry/index.js.map +1 -1
  317. package/dist/src/telemetry/posthog.d.ts +125 -0
  318. package/dist/src/telemetry/posthog.d.ts.map +1 -0
  319. package/dist/src/telemetry/posthog.js +198 -0
  320. package/dist/src/telemetry/posthog.js.map +1 -0
  321. package/dist/tests/RateLimiter.test.js +4 -4
  322. package/dist/tests/RateLimiter.test.js.map +1 -1
  323. package/dist/tests/e2e/security/security.e2e.test.js +3 -3
  324. package/dist/tests/e2e/security/security.e2e.test.js.map +1 -1
  325. 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 { EventEmitter } from 'node:events';
11
- import { getMetrics } from '../telemetry/metrics.js';
12
- /** Maximum number of recovery attempts before giving up */
13
- const MAX_RECOVERY_ATTEMPTS = 3;
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 EventEmitter {
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 ?? 30000,
28
- warningThreshold: config.warningThreshold ?? 2,
29
- unhealthyThreshold: config.unhealthyThreshold ?? 4,
30
- deadThreshold: config.deadThreshold ?? 6,
31
- autoRecover: config.autoRecover ?? true,
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
- // Record metric
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
- // Update metric
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 this.calculateHealth(state);
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) => this.calculateHealth(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
- const metrics = getMetrics();
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
- if (state.missedHeartbeats >= this.config.deadThreshold) {
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 !== previousStatus) {
246
- const health = this.calculateHealth(state);
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
- metrics.mcpErrorCount.increment({ type: 'session_warning' });
181
+ recordHealthStatusError(state.status);
251
182
  break;
252
183
  case 'unhealthy':
253
184
  this.emit('unhealthy', health);
254
- metrics.mcpErrorCount.increment({ type: 'session_unhealthy' });
185
+ recordHealthStatusError(state.status);
255
186
  break;
256
187
  case 'dead':
257
188
  this.emit('dead', health);
258
- metrics.mcpErrorCount.increment({ type: 'session_dead' });
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":"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"}
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;AAG7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,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,GAItB,MAAM,2BAA2B,CAAA"}
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"}