@iworkforces/tracelattice 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +260 -0
  3. package/dist/CliLifecycle.d.ts +31 -0
  4. package/dist/CliLifecycle.d.ts.map +1 -0
  5. package/dist/CliLifecycle.js +90 -0
  6. package/dist/CliLifecycle.js.map +1 -0
  7. package/dist/ServerConfig.d.ts +290 -0
  8. package/dist/ServerConfig.d.ts.map +1 -0
  9. package/dist/ServerConfig.js +175 -0
  10. package/dist/ServerConfig.js.map +1 -0
  11. package/dist/cache/DiscoveryCache.d.ts +269 -0
  12. package/dist/cache/DiscoveryCache.d.ts.map +1 -0
  13. package/dist/cache/DiscoveryCache.js +104 -0
  14. package/dist/cache/DiscoveryCache.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +5177 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config/ConfigLoader.d.ts +270 -0
  20. package/dist/config/ConfigLoader.d.ts.map +1 -0
  21. package/dist/config/ConfigLoader.js +186 -0
  22. package/dist/config/ConfigLoader.js.map +1 -0
  23. package/dist/context/RequestContext.d.ts +43 -0
  24. package/dist/context/RequestContext.d.ts.map +1 -0
  25. package/dist/context/RequestContext.js +14 -0
  26. package/dist/context/RequestContext.js.map +1 -0
  27. package/dist/contracts/PersistenceBackend.d.ts +134 -0
  28. package/dist/contracts/PersistenceBackend.d.ts.map +1 -0
  29. package/dist/contracts/PersistenceBackend.js +6 -0
  30. package/dist/contracts/PersistenceBackend.js.map +1 -0
  31. package/dist/contracts/calibrator.d.ts +97 -0
  32. package/dist/contracts/calibrator.d.ts.map +1 -0
  33. package/dist/contracts/calibrator.js +1 -0
  34. package/dist/contracts/features.d.ts +35 -0
  35. package/dist/contracts/features.d.ts.map +1 -0
  36. package/dist/contracts/features.js +12 -0
  37. package/dist/contracts/features.js.map +1 -0
  38. package/dist/contracts/ids.d.ts +68 -0
  39. package/dist/contracts/ids.d.ts.map +1 -0
  40. package/dist/contracts/ids.js +40 -0
  41. package/dist/contracts/ids.js.map +1 -0
  42. package/dist/contracts/interfaces.d.ts +254 -0
  43. package/dist/contracts/interfaces.d.ts.map +1 -0
  44. package/dist/contracts/interfaces.js +1 -0
  45. package/dist/contracts/persistence-work.d.ts +96 -0
  46. package/dist/contracts/persistence-work.d.ts.map +1 -0
  47. package/dist/contracts/persistence-work.js +1 -0
  48. package/dist/contracts/reasoning-types.d.ts +21 -0
  49. package/dist/contracts/reasoning-types.d.ts.map +1 -0
  50. package/dist/contracts/reasoning-types.js +1 -0
  51. package/dist/contracts/strategy.d.ts +107 -0
  52. package/dist/contracts/strategy.d.ts.map +1 -0
  53. package/dist/contracts/strategy.js +1 -0
  54. package/dist/contracts/summary.d.ts +110 -0
  55. package/dist/contracts/summary.d.ts.map +1 -0
  56. package/dist/contracts/summary.js +1 -0
  57. package/dist/contracts/suspension.d.ts +215 -0
  58. package/dist/contracts/suspension.d.ts.map +1 -0
  59. package/dist/contracts/suspension.js +1 -0
  60. package/dist/contracts/transport.d.ts +26 -0
  61. package/dist/contracts/transport.d.ts.map +1 -0
  62. package/dist/contracts/transport.js +1 -0
  63. package/dist/core/CrossReferenceValidator.d.ts +18 -0
  64. package/dist/core/CrossReferenceValidator.d.ts.map +1 -0
  65. package/dist/core/CrossReferenceValidator.js +125 -0
  66. package/dist/core/CrossReferenceValidator.js.map +1 -0
  67. package/dist/core/HistoryManager.d.ts +215 -0
  68. package/dist/core/HistoryManager.d.ts.map +1 -0
  69. package/dist/core/HistoryManager.js +594 -0
  70. package/dist/core/HistoryManager.js.map +1 -0
  71. package/dist/core/IHistoryManager.d.ts +163 -0
  72. package/dist/core/IHistoryManager.d.ts.map +1 -0
  73. package/dist/core/IHistoryManager.js +1 -0
  74. package/dist/core/IThoughtFormatter.d.ts +51 -0
  75. package/dist/core/IThoughtFormatter.d.ts.map +1 -0
  76. package/dist/core/IThoughtFormatter.js +1 -0
  77. package/dist/core/InputNormalizer.d.ts +140 -0
  78. package/dist/core/InputNormalizer.d.ts.map +1 -0
  79. package/dist/core/InputNormalizer.js +95 -0
  80. package/dist/core/InputNormalizer.js.map +1 -0
  81. package/dist/core/PersistenceBuffer.d.ts +204 -0
  82. package/dist/core/PersistenceBuffer.d.ts.map +1 -0
  83. package/dist/core/PersistenceBuffer.js +382 -0
  84. package/dist/core/PersistenceBuffer.js.map +1 -0
  85. package/dist/core/PersistenceBufferErrors.d.ts +22 -0
  86. package/dist/core/PersistenceBufferErrors.d.ts.map +1 -0
  87. package/dist/core/PersistenceBufferErrors.js +30 -0
  88. package/dist/core/PersistenceBufferErrors.js.map +1 -0
  89. package/dist/core/PersistenceRestore.d.ts +21 -0
  90. package/dist/core/PersistenceRestore.d.ts.map +1 -0
  91. package/dist/core/PersistenceRestore.js +87 -0
  92. package/dist/core/PersistenceRestore.js.map +1 -0
  93. package/dist/core/PersistenceWorkQueue.d.ts +155 -0
  94. package/dist/core/PersistenceWorkQueue.d.ts.map +1 -0
  95. package/dist/core/PersistenceWorkQueue.js +298 -0
  96. package/dist/core/PersistenceWorkQueue.js.map +1 -0
  97. package/dist/core/PersistenceWriter.d.ts +55 -0
  98. package/dist/core/PersistenceWriter.d.ts.map +1 -0
  99. package/dist/core/PersistenceWriter.js +112 -0
  100. package/dist/core/PersistenceWriter.js.map +1 -0
  101. package/dist/core/SessionErrors.d.ts +37 -0
  102. package/dist/core/SessionErrors.d.ts.map +1 -0
  103. package/dist/core/SessionErrors.js +50 -0
  104. package/dist/core/SessionErrors.js.map +1 -0
  105. package/dist/core/SessionLifecycleCoordinator.d.ts +74 -0
  106. package/dist/core/SessionLifecycleCoordinator.d.ts.map +1 -0
  107. package/dist/core/SessionLifecycleCoordinator.js +222 -0
  108. package/dist/core/SessionLifecycleCoordinator.js.map +1 -0
  109. package/dist/core/SessionLock.d.ts +59 -0
  110. package/dist/core/SessionLock.d.ts.map +1 -0
  111. package/dist/core/SessionLock.js +39 -0
  112. package/dist/core/SessionLock.js.map +1 -0
  113. package/dist/core/SessionManager.d.ts +62 -0
  114. package/dist/core/SessionManager.d.ts.map +1 -0
  115. package/dist/core/SessionManager.js +75 -0
  116. package/dist/core/SessionManager.js.map +1 -0
  117. package/dist/core/SessionResetCoordinator.d.ts +37 -0
  118. package/dist/core/SessionResetCoordinator.d.ts.map +1 -0
  119. package/dist/core/SessionResetCoordinator.js +80 -0
  120. package/dist/core/SessionResetCoordinator.js.map +1 -0
  121. package/dist/core/ThoughtEvaluator.d.ts +48 -0
  122. package/dist/core/ThoughtEvaluator.d.ts.map +1 -0
  123. package/dist/core/ThoughtEvaluator.js +85 -0
  124. package/dist/core/ThoughtEvaluator.js.map +1 -0
  125. package/dist/core/ThoughtFormatter.d.ts +134 -0
  126. package/dist/core/ThoughtFormatter.d.ts.map +1 -0
  127. package/dist/core/ThoughtFormatter.js +118 -0
  128. package/dist/core/ThoughtFormatter.js.map +1 -0
  129. package/dist/core/ThoughtProcessor.d.ts +259 -0
  130. package/dist/core/ThoughtProcessor.d.ts.map +1 -0
  131. package/dist/core/ThoughtProcessor.js +451 -0
  132. package/dist/core/ThoughtProcessor.js.map +1 -0
  133. package/dist/core/ThoughtReferenceIndex.d.ts +23 -0
  134. package/dist/core/ThoughtReferenceIndex.d.ts.map +1 -0
  135. package/dist/core/ThoughtReferenceIndex.js +66 -0
  136. package/dist/core/ThoughtReferenceIndex.js.map +1 -0
  137. package/dist/core/VerificationOutcomeAdmission.d.ts +15 -0
  138. package/dist/core/VerificationOutcomeAdmission.d.ts.map +1 -0
  139. package/dist/core/VerificationOutcomeAdmission.js +28 -0
  140. package/dist/core/VerificationOutcomeAdmission.js.map +1 -0
  141. package/dist/core/compression/CompressionService.d.ts +76 -0
  142. package/dist/core/compression/CompressionService.d.ts.map +1 -0
  143. package/dist/core/compression/CompressionService.js +160 -0
  144. package/dist/core/compression/CompressionService.js.map +1 -0
  145. package/dist/core/compression/DehydrationPolicy.d.ts +75 -0
  146. package/dist/core/compression/DehydrationPolicy.d.ts.map +1 -0
  147. package/dist/core/compression/DehydrationPolicy.js +45 -0
  148. package/dist/core/compression/DehydrationPolicy.js.map +1 -0
  149. package/dist/core/compression/InMemorySummaryStore.d.ts +132 -0
  150. package/dist/core/compression/InMemorySummaryStore.d.ts.map +1 -0
  151. package/dist/core/compression/InMemorySummaryStore.js +69 -0
  152. package/dist/core/compression/InMemorySummaryStore.js.map +1 -0
  153. package/dist/core/compression/Summary.d.ts +74 -0
  154. package/dist/core/compression/Summary.d.ts.map +1 -0
  155. package/dist/core/compression/Summary.js +16 -0
  156. package/dist/core/compression/Summary.js.map +1 -0
  157. package/dist/core/evaluator/Aggregator.d.ts +40 -0
  158. package/dist/core/evaluator/Aggregator.d.ts.map +1 -0
  159. package/dist/core/evaluator/Aggregator.js +36 -0
  160. package/dist/core/evaluator/Aggregator.js.map +1 -0
  161. package/dist/core/evaluator/Calibrator.d.ts +52 -0
  162. package/dist/core/evaluator/Calibrator.d.ts.map +1 -0
  163. package/dist/core/evaluator/Calibrator.js +135 -0
  164. package/dist/core/evaluator/Calibrator.js.map +1 -0
  165. package/dist/core/evaluator/PatternDetector.d.ts +69 -0
  166. package/dist/core/evaluator/PatternDetector.d.ts.map +1 -0
  167. package/dist/core/evaluator/PatternDetector.js +192 -0
  168. package/dist/core/evaluator/PatternDetector.js.map +1 -0
  169. package/dist/core/evaluator/SignalComputer.d.ts +116 -0
  170. package/dist/core/evaluator/SignalComputer.d.ts.map +1 -0
  171. package/dist/core/evaluator/SignalComputer.js +110 -0
  172. package/dist/core/evaluator/SignalComputer.js.map +1 -0
  173. package/dist/core/evaluator/calibration-math.d.ts +39 -0
  174. package/dist/core/evaluator/calibration-math.d.ts.map +1 -0
  175. package/dist/core/evaluator/calibration-math.js +42 -0
  176. package/dist/core/evaluator/calibration-math.js.map +1 -0
  177. package/dist/core/evaluator/internals.d.ts +36 -0
  178. package/dist/core/evaluator/internals.d.ts.map +1 -0
  179. package/dist/core/evaluator/internals.js +43 -0
  180. package/dist/core/evaluator/internals.js.map +1 -0
  181. package/dist/core/graph/Edge.d.ts +58 -0
  182. package/dist/core/graph/Edge.d.ts.map +1 -0
  183. package/dist/core/graph/Edge.js +1 -0
  184. package/dist/core/graph/EdgeEmitter.d.ts +68 -0
  185. package/dist/core/graph/EdgeEmitter.d.ts.map +1 -0
  186. package/dist/core/graph/EdgeEmitter.js +118 -0
  187. package/dist/core/graph/EdgeEmitter.js.map +1 -0
  188. package/dist/core/graph/EdgeStore.d.ts +116 -0
  189. package/dist/core/graph/EdgeStore.d.ts.map +1 -0
  190. package/dist/core/graph/EdgeStore.js +107 -0
  191. package/dist/core/graph/EdgeStore.js.map +1 -0
  192. package/dist/core/graph/GraphView.d.ts +157 -0
  193. package/dist/core/graph/GraphView.d.ts.map +1 -0
  194. package/dist/core/graph/GraphView.js +149 -0
  195. package/dist/core/graph/GraphView.js.map +1 -0
  196. package/dist/core/ids.d.ts +33 -0
  197. package/dist/core/ids.d.ts.map +1 -0
  198. package/dist/core/ids.js +11 -0
  199. package/dist/core/ids.js.map +1 -0
  200. package/dist/core/reasoning/OutcomeRecorder.d.ts +88 -0
  201. package/dist/core/reasoning/OutcomeRecorder.d.ts.map +1 -0
  202. package/dist/core/reasoning/OutcomeRecorder.js +51 -0
  203. package/dist/core/reasoning/OutcomeRecorder.js.map +1 -0
  204. package/dist/core/reasoning/strategies/SequentialStrategy.d.ts +54 -0
  205. package/dist/core/reasoning/strategies/SequentialStrategy.d.ts.map +1 -0
  206. package/dist/core/reasoning/strategies/SequentialStrategy.js +22 -0
  207. package/dist/core/reasoning/strategies/SequentialStrategy.js.map +1 -0
  208. package/dist/core/reasoning/strategies/StrategyFactory.d.ts +25 -0
  209. package/dist/core/reasoning/strategies/StrategyFactory.d.ts.map +1 -0
  210. package/dist/core/reasoning/strategies/StrategyFactory.js +16 -0
  211. package/dist/core/reasoning/strategies/StrategyFactory.js.map +1 -0
  212. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts +58 -0
  213. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts.map +1 -0
  214. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js +103 -0
  215. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js.map +1 -0
  216. package/dist/core/reasoning/strategies/plateau.d.ts +18 -0
  217. package/dist/core/reasoning/strategies/plateau.d.ts.map +1 -0
  218. package/dist/core/reasoning/strategies/plateau.js +12 -0
  219. package/dist/core/reasoning/strategies/plateau.js.map +1 -0
  220. package/dist/core/reasoning/strategies/totScoring.d.ts +91 -0
  221. package/dist/core/reasoning/strategies/totScoring.d.ts.map +1 -0
  222. package/dist/core/reasoning/strategies/totScoring.js +88 -0
  223. package/dist/core/reasoning/strategies/totScoring.js.map +1 -0
  224. package/dist/core/reasoning.d.ts +179 -0
  225. package/dist/core/reasoning.d.ts.map +1 -0
  226. package/dist/core/reasoning.js +1 -0
  227. package/dist/core/step.d.ts +50 -0
  228. package/dist/core/step.d.ts.map +1 -0
  229. package/dist/core/step.js +1 -0
  230. package/dist/core/thought.d.ts +113 -0
  231. package/dist/core/thought.d.ts.map +1 -0
  232. package/dist/core/thought.js +1 -0
  233. package/dist/core/tools/InMemorySuspensionStore.d.ts +66 -0
  234. package/dist/core/tools/InMemorySuspensionStore.d.ts.map +1 -0
  235. package/dist/core/tools/InMemorySuspensionStore.js +121 -0
  236. package/dist/core/tools/InMemorySuspensionStore.js.map +1 -0
  237. package/dist/di/Container.d.ts +253 -0
  238. package/dist/di/Container.d.ts.map +1 -0
  239. package/dist/di/Container.js +111 -0
  240. package/dist/di/Container.js.map +1 -0
  241. package/dist/di/ServiceRegistry.d.ts +50 -0
  242. package/dist/di/ServiceRegistry.d.ts.map +1 -0
  243. package/dist/di/ServiceRegistry.js +1 -0
  244. package/dist/errors.d.ts +663 -0
  245. package/dist/errors.d.ts.map +1 -0
  246. package/dist/errors.js +282 -0
  247. package/dist/errors.js.map +1 -0
  248. package/dist/health/HealthChecker.d.ts +73 -0
  249. package/dist/health/HealthChecker.d.ts.map +1 -0
  250. package/dist/health/HealthChecker.js +70 -0
  251. package/dist/health/HealthChecker.js.map +1 -0
  252. package/dist/lib.d.ts +273 -0
  253. package/dist/lib.d.ts.map +1 -0
  254. package/dist/lib.js +409 -0
  255. package/dist/lib.js.map +1 -0
  256. package/dist/logger/NullLogger.d.ts +154 -0
  257. package/dist/logger/NullLogger.d.ts.map +1 -0
  258. package/dist/logger/NullLogger.js +24 -0
  259. package/dist/logger/NullLogger.js.map +1 -0
  260. package/dist/logger/StructuredLogger.d.ts +327 -0
  261. package/dist/logger/StructuredLogger.d.ts.map +1 -0
  262. package/dist/logger/StructuredLogger.js +72 -0
  263. package/dist/logger/StructuredLogger.js.map +1 -0
  264. package/dist/metrics/metrics.impl.d.ts +252 -0
  265. package/dist/metrics/metrics.impl.d.ts.map +1 -0
  266. package/dist/metrics/metrics.impl.js +197 -0
  267. package/dist/metrics/metrics.impl.js.map +1 -0
  268. package/dist/persistence/FileLegacyImport.d.ts +2 -0
  269. package/dist/persistence/FileLegacyImport.d.ts.map +1 -0
  270. package/dist/persistence/FileLegacyImport.js +183 -0
  271. package/dist/persistence/FileLegacyImport.js.map +1 -0
  272. package/dist/persistence/FilePersistence.d.ts +53 -0
  273. package/dist/persistence/FilePersistence.d.ts.map +1 -0
  274. package/dist/persistence/FilePersistence.js +312 -0
  275. package/dist/persistence/FilePersistence.js.map +1 -0
  276. package/dist/persistence/FileSnapshotTypes.d.ts +29 -0
  277. package/dist/persistence/FileSnapshotTypes.d.ts.map +1 -0
  278. package/dist/persistence/FileSnapshotTypes.js +1 -0
  279. package/dist/persistence/FileSnapshotV2.d.ts +377 -0
  280. package/dist/persistence/FileSnapshotV2.d.ts.map +1 -0
  281. package/dist/persistence/FileSnapshotV2.js +124 -0
  282. package/dist/persistence/FileSnapshotV2.js.map +1 -0
  283. package/dist/persistence/FileSnapshotValidation.d.ts +15 -0
  284. package/dist/persistence/FileSnapshotValidation.d.ts.map +1 -0
  285. package/dist/persistence/FileSnapshotValidation.js +64 -0
  286. package/dist/persistence/FileSnapshotValidation.js.map +1 -0
  287. package/dist/persistence/FileWriter.d.ts +30 -0
  288. package/dist/persistence/FileWriter.d.ts.map +1 -0
  289. package/dist/persistence/FileWriter.js +155 -0
  290. package/dist/persistence/FileWriter.js.map +1 -0
  291. package/dist/persistence/MemoryPersistence.d.ts +45 -0
  292. package/dist/persistence/MemoryPersistence.d.ts.map +1 -0
  293. package/dist/persistence/MemoryPersistence.js +180 -0
  294. package/dist/persistence/MemoryPersistence.js.map +1 -0
  295. package/dist/persistence/PersistenceCodec.d.ts +7 -0
  296. package/dist/persistence/PersistenceCodec.d.ts.map +1 -0
  297. package/dist/persistence/PersistenceCodec.js +97 -0
  298. package/dist/persistence/PersistenceCodec.js.map +1 -0
  299. package/dist/persistence/PersistenceErrors.d.ts +23 -0
  300. package/dist/persistence/PersistenceErrors.d.ts.map +1 -0
  301. package/dist/persistence/PersistenceErrors.js +26 -0
  302. package/dist/persistence/PersistenceErrors.js.map +1 -0
  303. package/dist/persistence/PersistenceFactory.d.ts +21 -0
  304. package/dist/persistence/PersistenceFactory.d.ts.map +1 -0
  305. package/dist/persistence/PersistenceFactory.js +28 -0
  306. package/dist/persistence/PersistenceFactory.js.map +1 -0
  307. package/dist/persistence/PersistenceScope.d.ts +42 -0
  308. package/dist/persistence/PersistenceScope.d.ts.map +1 -0
  309. package/dist/persistence/PersistenceScope.js +93 -0
  310. package/dist/persistence/PersistenceScope.js.map +1 -0
  311. package/dist/persistence/SessionScopedPersistence.d.ts +4 -0
  312. package/dist/persistence/SessionScopedPersistence.d.ts.map +1 -0
  313. package/dist/persistence/SessionScopedPersistence.js +9 -0
  314. package/dist/persistence/SessionScopedPersistence.js.map +1 -0
  315. package/dist/persistence/SqliteDriver.d.ts +22 -0
  316. package/dist/persistence/SqliteDriver.d.ts.map +1 -0
  317. package/dist/persistence/SqliteDriver.js +29 -0
  318. package/dist/persistence/SqliteDriver.js.map +1 -0
  319. package/dist/persistence/SqliteLegacyImport.d.ts +14 -0
  320. package/dist/persistence/SqliteLegacyImport.d.ts.map +1 -0
  321. package/dist/persistence/SqliteLegacyImport.js +136 -0
  322. package/dist/persistence/SqliteLegacyImport.js.map +1 -0
  323. package/dist/persistence/SqliteLegacySchema.d.ts +15 -0
  324. package/dist/persistence/SqliteLegacySchema.d.ts.map +1 -0
  325. package/dist/persistence/SqliteLegacySchema.js +72 -0
  326. package/dist/persistence/SqliteLegacySchema.js.map +1 -0
  327. package/dist/persistence/SqlitePayload.d.ts +11 -0
  328. package/dist/persistence/SqlitePayload.d.ts.map +1 -0
  329. package/dist/persistence/SqlitePayload.js +86 -0
  330. package/dist/persistence/SqlitePayload.js.map +1 -0
  331. package/dist/persistence/SqlitePersistence.d.ts +49 -0
  332. package/dist/persistence/SqlitePersistence.d.ts.map +1 -0
  333. package/dist/persistence/SqlitePersistence.js +248 -0
  334. package/dist/persistence/SqlitePersistence.js.map +1 -0
  335. package/dist/persistence/SqliteSchemaV2.d.ts +14 -0
  336. package/dist/persistence/SqliteSchemaV2.d.ts.map +1 -0
  337. package/dist/persistence/SqliteSchemaV2.js +129 -0
  338. package/dist/persistence/SqliteSchemaV2.js.map +1 -0
  339. package/dist/persistence/SqliteSnapshotWriter.d.ts +17 -0
  340. package/dist/persistence/SqliteSnapshotWriter.d.ts.map +1 -0
  341. package/dist/persistence/SqliteSnapshotWriter.js +30 -0
  342. package/dist/persistence/SqliteSnapshotWriter.js.map +1 -0
  343. package/dist/pool/ConnectionPool.d.ts +203 -0
  344. package/dist/pool/ConnectionPool.d.ts.map +1 -0
  345. package/dist/pool/ConnectionPool.js +303 -0
  346. package/dist/pool/ConnectionPool.js.map +1 -0
  347. package/dist/pool/IConnectionPool.d.ts +143 -0
  348. package/dist/pool/IConnectionPool.d.ts.map +1 -0
  349. package/dist/pool/IConnectionPool.js +1 -0
  350. package/dist/pool/PoolErrors.d.ts +11 -0
  351. package/dist/pool/PoolErrors.d.ts.map +1 -0
  352. package/dist/pool/PoolErrors.js +16 -0
  353. package/dist/pool/PoolErrors.js.map +1 -0
  354. package/dist/registry/BaseRegistry.d.ts +219 -0
  355. package/dist/registry/BaseRegistry.d.ts.map +1 -0
  356. package/dist/registry/BaseRegistry.js +215 -0
  357. package/dist/registry/BaseRegistry.js.map +1 -0
  358. package/dist/registry/SkillRegistry.d.ts +67 -0
  359. package/dist/registry/SkillRegistry.d.ts.map +1 -0
  360. package/dist/registry/SkillRegistry.js +87 -0
  361. package/dist/registry/SkillRegistry.js.map +1 -0
  362. package/dist/registry/ToolRegistry.d.ts +70 -0
  363. package/dist/registry/ToolRegistry.d.ts.map +1 -0
  364. package/dist/registry/ToolRegistry.js +96 -0
  365. package/dist/registry/ToolRegistry.js.map +1 -0
  366. package/dist/sanitize.d.ts +164 -0
  367. package/dist/sanitize.d.ts.map +1 -0
  368. package/dist/sanitize.js +100 -0
  369. package/dist/sanitize.js.map +1 -0
  370. package/dist/schema.d.ts +562 -0
  371. package/dist/schema.d.ts.map +1 -0
  372. package/dist/schema.js +251 -0
  373. package/dist/schema.js.map +1 -0
  374. package/dist/transport/BaseTransport.d.ts +166 -0
  375. package/dist/transport/BaseTransport.d.ts.map +1 -0
  376. package/dist/transport/BaseTransport.js +199 -0
  377. package/dist/transport/BaseTransport.js.map +1 -0
  378. package/dist/transport/HttpHelpers.d.ts +53 -0
  379. package/dist/transport/HttpHelpers.d.ts.map +1 -0
  380. package/dist/transport/HttpHelpers.js +44 -0
  381. package/dist/transport/HttpHelpers.js.map +1 -0
  382. package/dist/transport/HttpRequestLifecycle.d.ts +37 -0
  383. package/dist/transport/HttpRequestLifecycle.d.ts.map +1 -0
  384. package/dist/transport/HttpRequestLifecycle.js +87 -0
  385. package/dist/transport/HttpRequestLifecycle.js.map +1 -0
  386. package/dist/transport/HttpTransport.d.ts +140 -0
  387. package/dist/transport/HttpTransport.d.ts.map +1 -0
  388. package/dist/transport/HttpTransport.js +245 -0
  389. package/dist/transport/HttpTransport.js.map +1 -0
  390. package/dist/transport/SseTransport.d.ts +149 -0
  391. package/dist/transport/SseTransport.d.ts.map +1 -0
  392. package/dist/transport/SseTransport.js +470 -0
  393. package/dist/transport/SseTransport.js.map +1 -0
  394. package/dist/transport/StreamableHttpTransport.d.ts +225 -0
  395. package/dist/transport/StreamableHttpTransport.d.ts.map +1 -0
  396. package/dist/transport/StreamableHttpTransport.js +449 -0
  397. package/dist/transport/StreamableHttpTransport.js.map +1 -0
  398. package/dist/types/disposable.d.ts +22 -0
  399. package/dist/types/disposable.d.ts.map +1 -0
  400. package/dist/types/disposable.js +1 -0
  401. package/dist/types/server-config.d.ts +32 -0
  402. package/dist/types/server-config.d.ts.map +1 -0
  403. package/dist/types/server-config.js +1 -0
  404. package/dist/types/skill.d.ts +74 -0
  405. package/dist/types/skill.d.ts.map +1 -0
  406. package/dist/types/skill.js +1 -0
  407. package/dist/types/tool.d.ts +78 -0
  408. package/dist/types/tool.d.ts.map +1 -0
  409. package/dist/types/tool.js +1 -0
  410. package/dist/utils.d.ts +27 -0
  411. package/dist/utils.d.ts.map +1 -0
  412. package/dist/utils.js +6 -0
  413. package/dist/utils.js.map +1 -0
  414. package/dist/watchers/SkillWatcher.d.ts +25 -0
  415. package/dist/watchers/SkillWatcher.d.ts.map +1 -0
  416. package/dist/watchers/SkillWatcher.js +96 -0
  417. package/dist/watchers/SkillWatcher.js.map +1 -0
  418. package/dist/watchers/ToolWatcher.d.ts +24 -0
  419. package/dist/watchers/ToolWatcher.d.ts.map +1 -0
  420. package/dist/watchers/ToolWatcher.js +92 -0
  421. package/dist/watchers/ToolWatcher.js.map +1 -0
  422. package/package.json +106 -0
@@ -0,0 +1,470 @@
1
+ import { createServer } from "node:http";
2
+ import { randomUUID } from "node:crypto";
3
+ import { URL } from "node:url";
4
+ import { safeParse } from "valibot";
5
+ import { ConfigurationError } from "../errors.js";
6
+ import { SessionNotActiveError, SessionNotFoundError } from "../pool/PoolErrors.js";
7
+ import { JsonRpcRequestSchema } from "../schema.js";
8
+ import { BaseTransport } from "./BaseTransport.js";
9
+ import { asSessionId } from "../contracts/ids.js";
10
+ import { runWithContext } from "../context/RequestContext.js";
11
+ import { assertNever } from "../utils.js";
12
+ function assertPooledSsePersistence(poolingEnabled, persistence) {
13
+ if (poolingEnabled && persistence?.enabled === true && ('file' === persistence.backend || 'sqlite' === persistence.backend)) throw new ConfigurationError(`pooled SSE does not support ${persistence.backend} persistence`);
14
+ }
15
+ class SseTransport extends BaseTransport {
16
+ get kind() {
17
+ return 'sse';
18
+ }
19
+ _server;
20
+ _path;
21
+ _clients = new Set();
22
+ _clientSessionMap = new Map();
23
+ _sessionAttachmentCounts = new Map();
24
+ _releasePromises = new WeakMap();
25
+ _pendingReleases = new Set();
26
+ _releaseFailures = new Set();
27
+ _messageQueue = new Map();
28
+ _metrics;
29
+ _connectionPool;
30
+ _stopPromise = null;
31
+ constructor(options = {}){
32
+ assertPooledSsePersistence(void 0 !== options.connectionPool, options.persistence);
33
+ super(options);
34
+ this._path = options.path ?? '/sse';
35
+ this._metrics = options.metrics;
36
+ this._connectionPool = options.connectionPool;
37
+ this._updateActiveConnectionsMetric();
38
+ this._server = createServer((req, res)=>this._handleRequest(req, res));
39
+ }
40
+ async connect(mcpServer) {
41
+ this._mcpServer = mcpServer;
42
+ return new Promise((resolve, reject)=>{
43
+ const cleanup = ()=>{
44
+ this._server.off('error', onError);
45
+ this._server.off('listening', onListening);
46
+ };
47
+ const onError = (error)=>{
48
+ cleanup();
49
+ reject(error);
50
+ };
51
+ const onListening = ()=>{
52
+ cleanup();
53
+ this.log('info', `SSE transport listening on http://${this._host}:${this._port}`);
54
+ resolve();
55
+ };
56
+ this._server.once('error', onError);
57
+ this._server.once('listening', onListening);
58
+ try {
59
+ this._server.listen(this._port, this._host);
60
+ } catch (error) {
61
+ cleanup();
62
+ reject(error);
63
+ }
64
+ });
65
+ }
66
+ _mcpServer = null;
67
+ async _handleRequest(req, res) {
68
+ const routing = this._prepareRequest(req, res);
69
+ if (!routing) return;
70
+ if (this._enableCors && 'OPTIONS' === req.method) {
71
+ res.writeHead(204);
72
+ res.end();
73
+ return;
74
+ }
75
+ if (routing.url.pathname === this._path && 'GET' === req.method) return void await this._handleSseConnection(req, res, routing.params);
76
+ if (routing.url.pathname === `${this._path}/message` && 'POST' === req.method) return void await this._handleMessage(req, res, routing.params);
77
+ if ('/health' === routing.url.pathname) return void this._handleHealthCheck(res);
78
+ if ('/ready' === routing.url.pathname) return void await this._handleReadinessCheck(res);
79
+ res.writeHead(404, {
80
+ 'Content-Type': 'text/plain'
81
+ });
82
+ res.end('Not Found');
83
+ }
84
+ _prepareRequest(req, res) {
85
+ const startTime = Date.now();
86
+ const requestPath = req.url || '/';
87
+ const requestMethod = req.method || 'GET';
88
+ this._metrics?.counter('http_requests_total', 1, {
89
+ transport: 'sse',
90
+ method: requestMethod,
91
+ path: requestPath
92
+ }, 'Total HTTP requests');
93
+ res.once('finish', ()=>{
94
+ const durationSeconds = (Date.now() - startTime) / 1000;
95
+ this._metrics?.histogram('http_request_duration_seconds', durationSeconds, {
96
+ transport: 'sse',
97
+ path: requestPath
98
+ });
99
+ });
100
+ if (!this.validateHostHeader(req)) {
101
+ this._metrics?.counter('http_request_errors_total', 1, {
102
+ transport: 'sse',
103
+ error_type: 'forbidden'
104
+ }, 'Total HTTP request errors');
105
+ res.writeHead(403, {
106
+ 'Content-Type': 'application/json'
107
+ });
108
+ res.end(JSON.stringify({
109
+ error: 'Forbidden - invalid host header'
110
+ }));
111
+ return;
112
+ }
113
+ const url = new URL(req.url || '', `http://${req.headers.host}`);
114
+ const clientIp = this.getClientIp(req);
115
+ if (this.checkRateLimit(clientIp)) {
116
+ this._metrics?.counter('http_request_errors_total', 1, {
117
+ transport: 'sse',
118
+ error_type: 'rate_limit'
119
+ }, 'Total HTTP request errors');
120
+ res.writeHead(429, {
121
+ 'Content-Type': 'application/json',
122
+ 'Retry-After': '60'
123
+ });
124
+ res.end(JSON.stringify({
125
+ error: 'Too many requests'
126
+ }));
127
+ return;
128
+ }
129
+ if (!this.validateCorsOrigin(req)) {
130
+ this._metrics?.counter('http_request_errors_total', 1, {
131
+ transport: 'sse',
132
+ error_type: 'forbidden'
133
+ }, 'Total HTTP request errors');
134
+ res.writeHead(403, {
135
+ 'Content-Type': 'application/json'
136
+ });
137
+ res.end(JSON.stringify({
138
+ error: 'Forbidden - invalid origin'
139
+ }));
140
+ return;
141
+ }
142
+ this.setCorsHeaders(res);
143
+ const sanitizedParams = this.sanitizeQueryParams(url);
144
+ const requestSessionId = sanitizedParams.session ?? sanitizedParams.sessionId;
145
+ if (void 0 !== requestSessionId && !this.validateSessionId(requestSessionId)) {
146
+ this._metrics?.counter('http_request_errors_total', 1, {
147
+ transport: 'sse',
148
+ error_type: 'validation'
149
+ }, 'Total HTTP request errors');
150
+ res.writeHead(400, {
151
+ 'Content-Type': 'application/json'
152
+ });
153
+ res.end(JSON.stringify({
154
+ error: 'Invalid session ID format'
155
+ }));
156
+ return;
157
+ }
158
+ return {
159
+ url,
160
+ params: sanitizedParams
161
+ };
162
+ }
163
+ _handleHealthCheck(res) {
164
+ const healthData = {
165
+ status: 'healthy',
166
+ clients: this._clients.size
167
+ };
168
+ if (this._connectionPool) {
169
+ const poolStats = this._connectionPool.getStats();
170
+ healthData.pool = poolStats;
171
+ }
172
+ if (this._healthChecker) {
173
+ const liveness = this._healthChecker.checkLiveness();
174
+ healthData.liveness = liveness;
175
+ }
176
+ res.writeHead(200, {
177
+ 'Content-Type': 'application/json'
178
+ });
179
+ res.end(JSON.stringify(healthData));
180
+ }
181
+ async _handleReadinessCheck(res) {
182
+ if (this._healthChecker) {
183
+ const readiness = await this._healthChecker.checkReadiness();
184
+ const statusCode = 'ok' === readiness.status ? 200 : 503;
185
+ res.writeHead(statusCode, {
186
+ 'Content-Type': 'application/json'
187
+ });
188
+ res.end(JSON.stringify(readiness));
189
+ } else {
190
+ res.writeHead(200, {
191
+ 'Content-Type': 'application/json'
192
+ });
193
+ res.end(JSON.stringify({
194
+ status: 'ok',
195
+ timestamp: new Date().toISOString(),
196
+ components: {}
197
+ }));
198
+ }
199
+ }
200
+ async _handleSseConnection(req, res, params) {
201
+ res.writeHead(200, {
202
+ 'Content-Type': 'text/event-stream',
203
+ 'Cache-Control': 'no-cache',
204
+ Connection: 'keep-alive'
205
+ });
206
+ let sessionId;
207
+ if (this._connectionPool) {
208
+ const requestedSession = params.session ?? params.sessionId;
209
+ const requestedSessionId = requestedSession ? asSessionId(requestedSession) : void 0;
210
+ if (requestedSessionId && this._connectionPool.getSessionInfo(requestedSessionId)) sessionId = requestedSessionId;
211
+ else try {
212
+ sessionId = await this._connectionPool.createSession();
213
+ } catch (error) {
214
+ res.write(`event: error\n`);
215
+ res.write(`data: ${JSON.stringify({
216
+ error: error instanceof Error ? error.message : 'Failed to create session'
217
+ })}\n\n`);
218
+ res.end();
219
+ return;
220
+ }
221
+ this._clientSessionMap.set(res, sessionId);
222
+ this._sessionAttachmentCounts.set(sessionId, (this._sessionAttachmentCounts.get(sessionId) ?? 0) + 1);
223
+ this._updatePoolMetrics();
224
+ }
225
+ this._clients.add(res);
226
+ this._updateActiveConnectionsMetric();
227
+ const release = ()=>this._releaseAfterDisconnect(res);
228
+ req.once('close', release);
229
+ res.once('close', release);
230
+ res.once('error', release);
231
+ const connectedPayload = {
232
+ timestamp: Date.now()
233
+ };
234
+ if (sessionId) connectedPayload.sessionId = sessionId;
235
+ this._sendSseEvent(res, 'connected', connectedPayload);
236
+ const clientId = this._generateClientId();
237
+ const queued = this._messageQueue.get(clientId);
238
+ if (queued) {
239
+ for (const message of queued)this._sendSseEvent(res, 'message', message);
240
+ this._messageQueue.delete(clientId);
241
+ }
242
+ }
243
+ async _handleMessage(req, res, params) {
244
+ let pooledOwner;
245
+ if (this._connectionPool) {
246
+ const correlation = params.session ?? params.sessionId;
247
+ if (void 0 === correlation) {
248
+ res.writeHead(400, {
249
+ 'Content-Type': 'application/json'
250
+ });
251
+ res.end(JSON.stringify({
252
+ error: 'Missing session ID'
253
+ }));
254
+ return;
255
+ }
256
+ pooledOwner = asSessionId(correlation);
257
+ }
258
+ const jsonRpcRequest = await this._parseMessage(req, res);
259
+ if (!jsonRpcRequest) return;
260
+ const mcpServer = this._mcpServer;
261
+ if (!mcpServer) {
262
+ this._metrics?.counter('http_request_errors_total', 1, {
263
+ transport: 'sse',
264
+ error_type: 'server_not_ready'
265
+ }, 'Total HTTP request errors');
266
+ res.writeHead(503, {
267
+ 'Content-Type': 'application/json'
268
+ });
269
+ res.end(JSON.stringify({
270
+ error: 'Server not ready'
271
+ }));
272
+ return;
273
+ }
274
+ const owner = pooledOwner ?? `sse-${randomUUID()}`;
275
+ const receive = ()=>runWithContext({
276
+ requestId: randomUUID(),
277
+ owner
278
+ }, ()=>mcpServer.receive(jsonRpcRequest, {
279
+ sessionInfo: {}
280
+ }));
281
+ try {
282
+ let response;
283
+ if (this._connectionPool && pooledOwner) {
284
+ if ('function' != typeof this._connectionPool.runWithSession) return void this._writeSessionUnavailable(res);
285
+ const result = await this._connectionPool.runWithSession(pooledOwner, receive);
286
+ switch(result.status){
287
+ case 'completed':
288
+ response = result.value;
289
+ break;
290
+ case 'inactive':
291
+ case 'missing':
292
+ this._writeSessionUnavailable(res);
293
+ return;
294
+ default:
295
+ return assertNever(result);
296
+ }
297
+ } else response = await receive();
298
+ res.writeHead(200, {
299
+ 'Content-Type': 'application/json'
300
+ });
301
+ res.end(JSON.stringify(response ?? {
302
+ jsonrpc: '2.0',
303
+ id: 'id' in jsonRpcRequest ? jsonRpcRequest.id : null,
304
+ result: null
305
+ }));
306
+ } catch (error) {
307
+ if (error instanceof SessionNotFoundError || error instanceof SessionNotActiveError) return void this._writeSessionUnavailable(res);
308
+ throw error;
309
+ }
310
+ }
311
+ async _parseMessage(req, res) {
312
+ let body = '';
313
+ for await (const chunk of req)body += chunk.toString();
314
+ let rawBody;
315
+ try {
316
+ rawBody = JSON.parse(body);
317
+ } catch (error) {
318
+ if (!(error instanceof SyntaxError)) throw error;
319
+ this._metrics?.counter('http_request_errors_total', 1, {
320
+ transport: 'sse',
321
+ error_type: 'parse_error'
322
+ }, 'Total HTTP request errors');
323
+ res.writeHead(400, {
324
+ 'Content-Type': 'application/json'
325
+ });
326
+ res.end(JSON.stringify({
327
+ error: 'Invalid JSON'
328
+ }));
329
+ return;
330
+ }
331
+ const parseResult = safeParse(JsonRpcRequestSchema, rawBody);
332
+ const rawId = rawBody && 'object' == typeof rawBody && 'id' in rawBody ? rawBody.id ?? null : null;
333
+ if (!parseResult.success) {
334
+ this._metrics?.counter('http_request_errors_total', 1, {
335
+ transport: 'sse',
336
+ error_type: 'validation'
337
+ }, 'Total HTTP request errors');
338
+ res.writeHead(200, {
339
+ 'Content-Type': 'application/json'
340
+ });
341
+ res.end(JSON.stringify({
342
+ jsonrpc: '2.0',
343
+ id: rawId,
344
+ error: {
345
+ code: -32600,
346
+ message: 'Invalid Request',
347
+ data: parseResult.issues
348
+ }
349
+ }));
350
+ return;
351
+ }
352
+ return parseResult.output;
353
+ }
354
+ _writeSessionUnavailable(res) {
355
+ res.writeHead(404, {
356
+ 'Content-Type': 'application/json'
357
+ });
358
+ res.end(JSON.stringify({
359
+ error: 'Session not found'
360
+ }));
361
+ }
362
+ _releaseClient(res) {
363
+ const existing = this._releasePromises.get(res);
364
+ if (existing) return existing;
365
+ this._clients.delete(res);
366
+ const sessionId = this._clientSessionMap.get(res);
367
+ this._clientSessionMap.delete(res);
368
+ this._updateActiveConnectionsMetric();
369
+ let releasePromise = Promise.resolve();
370
+ if (sessionId && this._connectionPool) {
371
+ const attachmentCount = this._sessionAttachmentCounts.get(sessionId);
372
+ if (void 0 !== attachmentCount && attachmentCount > 1) this._sessionAttachmentCounts.set(sessionId, attachmentCount - 1);
373
+ else {
374
+ this._sessionAttachmentCounts.delete(sessionId);
375
+ releasePromise = this._connectionPool.closeSession(sessionId).catch((error)=>{
376
+ if (error instanceof SessionNotFoundError) return;
377
+ throw error;
378
+ });
379
+ }
380
+ this._updatePoolMetrics();
381
+ }
382
+ this._releasePromises.set(res, releasePromise);
383
+ this._pendingReleases.add(releasePromise);
384
+ releasePromise.then(()=>this._pendingReleases.delete(releasePromise), (error)=>{
385
+ this._pendingReleases.delete(releasePromise);
386
+ this._releaseFailures.add(error);
387
+ });
388
+ return releasePromise;
389
+ }
390
+ _releaseAfterDisconnect(res) {
391
+ this._releaseClient(res).catch((error)=>{
392
+ this.log('error', 'SSE pooled session release failed', {
393
+ error
394
+ });
395
+ });
396
+ }
397
+ _sendSseEvent(res, event, data) {
398
+ try {
399
+ res.write(`event: ${event}\n`);
400
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
401
+ } catch {
402
+ this._releaseAfterDisconnect(res);
403
+ }
404
+ }
405
+ _updateActiveConnectionsMetric() {
406
+ this._metrics?.gauge('sse_active_connections', this._clients.size, {}, 'Current active SSE connections');
407
+ }
408
+ _updatePoolMetrics() {
409
+ if (!this._connectionPool || !this._metrics) return;
410
+ const stats = this._connectionPool.getStats();
411
+ this._metrics.gauge('sse_pool_active_sessions', stats.activeSessions, {}, 'Active sessions in connection pool');
412
+ this._metrics.gauge('sse_pool_total_sessions', stats.totalSessions, {}, 'Total sessions in connection pool');
413
+ this._metrics.gauge('sse_pool_max_sessions', stats.maxSessions, {}, 'Maximum sessions in connection pool');
414
+ }
415
+ broadcast(event, data) {
416
+ for (const client of this._clients)this._sendSseEvent(client, event, data);
417
+ }
418
+ _generateClientId() {
419
+ return `client_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
420
+ }
421
+ get clientCount() {
422
+ return this._clients.size;
423
+ }
424
+ get connectionPool() {
425
+ return this._connectionPool;
426
+ }
427
+ stop(_timeout) {
428
+ if (this._stopPromise) return this._stopPromise;
429
+ const completion = Promise.withResolvers();
430
+ this._stopPromise = completion.promise;
431
+ this._isShuttingDown = true;
432
+ this._stopRateLimitCleanup();
433
+ const operations = new Set();
434
+ for (const client of Array.from(this._clients)){
435
+ operations.add(this._releaseClient(client));
436
+ try {
437
+ client.end();
438
+ } catch (error) {
439
+ operations.add(Promise.reject(error instanceof Error ? error : new AggregateError([
440
+ error
441
+ ], 'SSE client close failed')));
442
+ }
443
+ }
444
+ for (const release of this._pendingReleases)operations.add(release);
445
+ if (this._connectionPool) operations.add(this._connectionPool.terminate());
446
+ operations.add(this._server.listening ? new Promise((resolve, reject)=>{
447
+ this._server.close((error)=>error ? reject(error) : resolve());
448
+ }) : Promise.resolve());
449
+ Promise.allSettled(operations).then((outcomes)=>{
450
+ const failures = new Set(this._releaseFailures);
451
+ for (const outcome of outcomes)if ('rejected' === outcome.status) if (outcome.reason instanceof AggregateError) for (const error of outcome.reason.errors)failures.add(error);
452
+ else failures.add(outcome.reason);
453
+ this._clients.clear();
454
+ this._clientSessionMap.clear();
455
+ this._sessionAttachmentCounts.clear();
456
+ this._updateActiveConnectionsMetric();
457
+ this._updatePoolMetrics();
458
+ if (failures.size > 0) return void completion.reject(new AggregateError(failures, 'SSE transport shutdown failed'));
459
+ this.log('info', 'SSE transport stopped');
460
+ completion.resolve();
461
+ });
462
+ return completion.promise;
463
+ }
464
+ }
465
+ function createSseTransport(options = {}) {
466
+ return new SseTransport(options);
467
+ }
468
+ export { SseTransport, assertPooledSsePersistence, createSseTransport };
469
+
470
+ //# sourceMappingURL=SseTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport/SseTransport.js","sources":["../../src/transport/SseTransport.ts"],"sourcesContent":["/**\n * SSE (Server-Sent Events) Transport implementation.\n *\n * This transport allows multiple concurrent connections over HTTP using Server-Sent Events,\n * enabling multi-user scenarios and horizontal scaling.\n *\n * When a ConnectionPool is provided, each SSE client gets an isolated session with its own\n * thought history. Without a pool, all clients share a single server instance (backward compatible).\n *\n * @example\n * ```typescript\n * const transport = new SseTransport({\n * port: 3000,\n * host: 'localhost'\n * });\n * await transport.connect(server);\n * ```\n */\n\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { createServer } from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport { URL } from 'node:url';\nimport type { McpServer } from 'tmcp';\nimport { safeParse } from 'valibot';\nimport type { IMetrics } from '../contracts/interfaces.js';\nimport type { PersistenceConfig } from '../contracts/PersistenceBackend.js';\nimport type { IConnectionPool } from '../pool/IConnectionPool.js';\nimport { ConfigurationError } from '../errors.js';\nimport { SessionNotActiveError, SessionNotFoundError } from '../pool/PoolErrors.js';\nimport { JsonRpcRequestSchema } from '../schema.js';\nimport { BaseTransport, type TransportOptions } from './BaseTransport.js';\nimport type { ITransport, TransportKind } from '../contracts/transport.js';\nimport { asSessionId, type SessionId } from '../contracts/ids.js';\nimport { runWithContext } from '../context/RequestContext.js';\nimport { assertNever } from '../utils.js';\n\ntype SseRequestRouting = {\n\treadonly url: URL;\n\treadonly params: Record<string, string>;\n};\n\ntype McpRequest = Parameters<McpServer['receive']>[0];\n/**\n * SSE-specific transport options extending base TransportOptions.\n */\nexport interface SseTransportOptions extends TransportOptions {\n\tpath?: string;\n\tmetrics?: IMetrics;\n\t/**\n\t * Optional connection pool for per-session state isolation.\n\t * When provided, each SSE client gets an isolated thought history.\n\t * When omitted, all clients share a single server instance (backward compatible).\n\t */\n\tconnectionPool?: IConnectionPool;\n\treadonly persistence?: PersistenceConfig;\n}\n\n/** Rejects persistence backends that cannot isolate pooled SSE child servers. */\nexport function assertPooledSsePersistence(\n\tpoolingEnabled: boolean,\n\tpersistence: PersistenceConfig | undefined\n): void {\n\tif (\n\t\tpoolingEnabled &&\n\t\tpersistence?.enabled === true &&\n\t\t(persistence.backend === 'file' || persistence.backend === 'sqlite')\n\t) {\n\t\tthrow new ConfigurationError(`pooled SSE does not support ${persistence.backend} persistence`);\n\t}\n}\n\n/**\n * SSE Transport for MCP server over HTTP.\n *\n * This transport uses Server-Sent Events (SSE) to communicate with clients,\n * allowing multiple concurrent connections and web-based clients.\n *\n * @remarks\n * **Security Features:**\n * - Session ID validation (alphanumeric, max 64 chars)\n * - Query parameter sanitization (whitelist allowed keys)\n * - Rate limiting per IP (configurable, default 100 req/min)\n * - CORS origin validation\n *\n * **Rate Limiting:**\n * - Tracks requests per IP address within a time window\n * - Returns 429 Too Many Requests when limit exceeded\n * - Can be disabled via `enableRateLimit: false`\n */\nexport class SseTransport extends BaseTransport implements ITransport {\n\tget kind(): TransportKind {\n\t\treturn 'sse';\n\t}\n\tprivate _server: ReturnType<typeof createServer>;\n\tprivate _path: string;\n\tprivate _clients: Set<ServerResponse> = new Set();\n\tprivate _clientSessionMap: Map<ServerResponse, SessionId> = new Map();\n\tprivate readonly _sessionAttachmentCounts = new Map<SessionId, number>();\n\tprivate readonly _releasePromises = new WeakMap<ServerResponse, Promise<void>>();\n\tprivate readonly _pendingReleases = new Set<Promise<void>>();\n\tprivate readonly _releaseFailures = new Set<unknown>();\n\tprivate _messageQueue: Map<string, unknown[]> = new Map();\n\tprivate _metrics?: IMetrics;\n\tprivate _connectionPool?: IConnectionPool;\n\tprivate _stopPromise: Promise<void> | null = null;\n\n\tconstructor(options: SseTransportOptions = {}) {\n\t\tassertPooledSsePersistence(options.connectionPool !== undefined, options.persistence);\n\t\tsuper(options);\n\t\tthis._path = options.path ?? '/sse';\n\t\tthis._metrics = options.metrics;\n\t\tthis._connectionPool = options.connectionPool;\n\t\tthis._updateActiveConnectionsMetric();\n\n\t\tthis._server = createServer((req, res) => this._handleRequest(req, res));\n\t}\n\n\t/**\n\t * Connect MCP server to this transport.\n\t *\n\t * @param mcpServer - The MCP server instance\n\t */\n\tasync connect(mcpServer: McpServer): Promise<void> {\n\t\tthis._mcpServer = mcpServer;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst cleanup = (): void => {\n\t\t\t\tthis._server.off('error', onError);\n\t\t\t\tthis._server.off('listening', onListening);\n\t\t\t};\n\t\t\tconst onError = (error: Error): void => {\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t};\n\t\t\tconst onListening = (): void => {\n\t\t\t\tcleanup();\n\t\t\t\tthis.log('info', `SSE transport listening on http://${this._host}:${this._port}`);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tthis._server.once('error', onError);\n\t\t\tthis._server.once('listening', onListening);\n\t\t\ttry {\n\t\t\t\tthis._server.listen(this._port, this._host);\n\t\t\t} catch (error) {\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _mcpServer: McpServer | null = null;\n\n\t/**\n\t * Handle incoming HTTP requests\n\t */\n\tprivate async _handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n\t\tconst routing = this._prepareRequest(req, res);\n\t\tif (!routing) return;\n\n\t\tif (this._enableCors && req.method === 'OPTIONS') {\n\t\t\tres.writeHead(204);\n\t\t\tres.end();\n\t\t\treturn;\n\t\t}\n\n\t\tif (routing.url.pathname === this._path && req.method === 'GET') {\n\t\t\tawait this._handleSseConnection(req, res, routing.params);\n\t\t\treturn;\n\t\t}\n\n\t\tif (routing.url.pathname === `${this._path}/message` && req.method === 'POST') {\n\t\t\tawait this._handleMessage(req, res, routing.params);\n\t\t\treturn;\n\t\t}\n\n\t\tif (routing.url.pathname === '/health') {\n\t\t\tthis._handleHealthCheck(res);\n\t\t\treturn;\n\t\t}\n\n\t\tif (routing.url.pathname === '/ready') {\n\t\t\tawait this._handleReadinessCheck(res);\n\t\t\treturn;\n\t\t}\n\n\t\tres.writeHead(404, { 'Content-Type': 'text/plain' });\n\t\tres.end('Not Found');\n\t}\n\n\tprivate _prepareRequest(\n\t\treq: IncomingMessage,\n\t\tres: ServerResponse\n\t): SseRequestRouting | undefined {\n\t\tconst startTime = Date.now();\n\t\tconst requestPath = req.url || '/';\n\t\tconst requestMethod = req.method || 'GET';\n\t\tthis._metrics?.counter(\n\t\t\t'http_requests_total',\n\t\t\t1,\n\t\t\t{ transport: 'sse', method: requestMethod, path: requestPath },\n\t\t\t'Total HTTP requests'\n\t\t);\n\t\tres.once('finish', () => {\n\t\t\tconst durationSeconds = (Date.now() - startTime) / 1000;\n\t\t\tthis._metrics?.histogram('http_request_duration_seconds', durationSeconds, {\n\t\t\t\ttransport: 'sse',\n\t\t\t\tpath: requestPath,\n\t\t\t});\n\t\t});\n\t\tif (!this.validateHostHeader(req)) {\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'http_request_errors_total',\n\t\t\t\t1,\n\t\t\t\t{ transport: 'sse', error_type: 'forbidden' },\n\t\t\t\t'Total HTTP request errors'\n\t\t\t);\n\t\t\tres.writeHead(403, { 'Content-Type': 'application/json' });\n\t\t\tres.end(JSON.stringify({ error: 'Forbidden - invalid host header' }));\n\t\t\treturn;\n\t\t}\n\n\t\tconst url = new URL(req.url || '', `http://${req.headers.host}`);\n\n\t\t// Check rate limit first\n\t\tconst clientIp = this.getClientIp(req);\n\t\tif (this.checkRateLimit(clientIp)) {\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'http_request_errors_total',\n\t\t\t\t1,\n\t\t\t\t{ transport: 'sse', error_type: 'rate_limit' },\n\t\t\t\t'Total HTTP request errors'\n\t\t\t);\n\t\t\tres.writeHead(429, {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t'Retry-After': '60',\n\t\t\t});\n\t\t\tres.end(JSON.stringify({ error: 'Too many requests' }));\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate CORS origin\n\t\tif (!this.validateCorsOrigin(req)) {\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'http_request_errors_total',\n\t\t\t\t1,\n\t\t\t\t{ transport: 'sse', error_type: 'forbidden' },\n\t\t\t\t'Total HTTP request errors'\n\t\t\t);\n\t\t\tres.writeHead(403, { 'Content-Type': 'application/json' });\n\t\t\tres.end(JSON.stringify({ error: 'Forbidden - invalid origin' }));\n\t\t\treturn;\n\t\t}\n\n\t\t// Set CORS headers\n\t\tthis.setCorsHeaders(res);\n\n\t\t// Sanitize query parameters\n\t\tconst sanitizedParams = this.sanitizeQueryParams(url);\n\n\t\t// Validate session ID if present\n\t\tconst requestSessionId = sanitizedParams.session ?? sanitizedParams.sessionId;\n\t\tif (requestSessionId !== undefined && !this.validateSessionId(requestSessionId)) {\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'http_request_errors_total',\n\t\t\t\t1,\n\t\t\t\t{ transport: 'sse', error_type: 'validation' },\n\t\t\t\t'Total HTTP request errors'\n\t\t\t);\n\t\t\tres.writeHead(400, { 'Content-Type': 'application/json' });\n\t\t\tres.end(JSON.stringify({ error: 'Invalid session ID format' }));\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn { url, params: sanitizedParams };\n\t}\n\n\t/**\n\t * Handle health check (liveness) endpoint\n\t */\n\tprivate _handleHealthCheck(res: ServerResponse): void {\n\t\tconst healthData: Record<string, unknown> = { status: 'healthy', clients: this._clients.size };\n\t\tif (this._connectionPool) {\n\t\t\tconst poolStats = this._connectionPool.getStats();\n\t\t\thealthData.pool = poolStats;\n\t\t}\n\t\tif (this._healthChecker) {\n\t\t\tconst liveness = this._healthChecker.checkLiveness();\n\t\t\thealthData.liveness = liveness;\n\t\t}\n\t\tres.writeHead(200, { 'Content-Type': 'application/json' });\n\t\tres.end(JSON.stringify(healthData));\n\t}\n\n\t/**\n\t * Handle readiness check endpoint\n\t */\n\tprivate async _handleReadinessCheck(res: ServerResponse): Promise<void> {\n\t\tif (this._healthChecker) {\n\t\t\tconst readiness = await this._healthChecker.checkReadiness();\n\t\t\tconst statusCode = readiness.status === 'ok' ? 200 : 503;\n\t\t\tres.writeHead(statusCode, { 'Content-Type': 'application/json' });\n\t\t\tres.end(JSON.stringify(readiness));\n\t\t} else {\n\t\t\tres.writeHead(200, { 'Content-Type': 'application/json' });\n\t\t\tres.end(\n\t\t\t\tJSON.stringify({ status: 'ok', timestamp: new Date().toISOString(), components: {} })\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle new SSE connection\n\t */\n\tprivate async _handleSseConnection(\n\t\treq: IncomingMessage,\n\t\tres: ServerResponse,\n\t\tparams: Record<string, string>\n\t): Promise<void> {\n\t\t// Set SSE headers\n\t\tres.writeHead(200, {\n\t\t\t'Content-Type': 'text/event-stream',\n\t\t\t'Cache-Control': 'no-cache',\n\t\t\tConnection: 'keep-alive',\n\t\t});\n\n\t\t// Resolve session ID when pool is active\n\t\tlet sessionId: SessionId | undefined;\n\t\tif (this._connectionPool) {\n\t\t\tconst requestedSession = params.session ?? params.sessionId;\n\t\t\tconst requestedSessionId = requestedSession ? asSessionId(requestedSession) : undefined;\n\t\t\tif (requestedSessionId && this._connectionPool.getSessionInfo(requestedSessionId)) {\n\t\t\t\tsessionId = requestedSessionId;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tsessionId = await this._connectionPool.createSession();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tres.write(`event: error\\n`);\n\t\t\t\t\tres.write(\n\t\t\t\t\t\t`data: ${JSON.stringify({ error: error instanceof Error ? error.message : 'Failed to create session' })}\\n\\n`\n\t\t\t\t\t);\n\t\t\t\t\tres.end();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._clientSessionMap.set(res, sessionId);\n\t\t\tthis._sessionAttachmentCounts.set(\n\t\t\t\tsessionId,\n\t\t\t\t(this._sessionAttachmentCounts.get(sessionId) ?? 0) + 1\n\t\t\t);\n\t\t\tthis._updatePoolMetrics();\n\t\t}\n\n\t\tthis._clients.add(res);\n\t\tthis._updateActiveConnectionsMetric();\n\t\tconst release = (): void => this._releaseAfterDisconnect(res);\n\t\treq.once('close', release);\n\t\tres.once('close', release);\n\t\tres.once('error', release);\n\n\t\t// Send initial connection event\n\t\tconst connectedPayload: Record<string, unknown> = { timestamp: Date.now() };\n\t\tif (sessionId) {\n\t\t\tconnectedPayload.sessionId = sessionId;\n\t\t}\n\t\tthis._sendSseEvent(res, 'connected', connectedPayload);\n\n\t\t// Send any queued messages\n\t\tconst clientId = this._generateClientId();\n\t\tconst queued = this._messageQueue.get(clientId);\n\t\tif (queued) {\n\t\t\tfor (const message of queued) {\n\t\t\t\tthis._sendSseEvent(res, 'message', message);\n\t\t\t}\n\t\t\tthis._messageQueue.delete(clientId);\n\t\t}\n\t}\n\n\t/**\n\t * Handle incoming message from client\n\t */\n\tprivate async _handleMessage(\n\t\treq: IncomingMessage,\n\t\tres: ServerResponse,\n\t\tparams: Record<string, string>\n\t): Promise<void> {\n\t\tlet pooledOwner: SessionId | undefined;\n\t\tif (this._connectionPool) {\n\t\t\tconst correlation = params.session ?? params.sessionId;\n\t\t\tif (correlation === undefined) {\n\t\t\t\tres.writeHead(400, { 'Content-Type': 'application/json' });\n\t\t\t\tres.end(JSON.stringify({ error: 'Missing session ID' }));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpooledOwner = asSessionId(correlation);\n\t\t}\n\n\t\tconst jsonRpcRequest = await this._parseMessage(req, res);\n\t\tif (!jsonRpcRequest) return;\n\n\t\tconst mcpServer = this._mcpServer;\n\t\tif (!mcpServer) {\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'http_request_errors_total',\n\t\t\t\t1,\n\t\t\t\t{ transport: 'sse', error_type: 'server_not_ready' },\n\t\t\t\t'Total HTTP request errors'\n\t\t\t);\n\t\t\tres.writeHead(503, { 'Content-Type': 'application/json' });\n\t\t\tres.end(JSON.stringify({ error: 'Server not ready' }));\n\t\t\treturn;\n\t\t}\n\n\t\tconst owner = pooledOwner ?? `sse-${randomUUID()}`;\n\t\tconst receive = () =>\n\t\t\trunWithContext({ requestId: randomUUID(), owner }, () =>\n\t\t\t\tmcpServer.receive(jsonRpcRequest, { sessionInfo: {} })\n\t\t\t);\n\t\ttry {\n\t\t\tlet response: Awaited<ReturnType<McpServer['receive']>>;\n\t\t\tif (this._connectionPool && pooledOwner) {\n\t\t\t\tif (typeof this._connectionPool.runWithSession !== 'function') {\n\t\t\t\t\tthis._writeSessionUnavailable(res);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst result = await this._connectionPool.runWithSession(pooledOwner, receive);\n\t\t\t\tswitch (result.status) {\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tresponse = result.value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'inactive':\n\t\t\t\t\tcase 'missing':\n\t\t\t\t\t\tthis._writeSessionUnavailable(res);\n\t\t\t\t\t\treturn;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn assertNever(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresponse = await receive();\n\t\t\t}\n\t\t\tres.writeHead(200, { 'Content-Type': 'application/json' });\n\t\t\tres.end(\n\t\t\t\tJSON.stringify(\n\t\t\t\t\tresponse ?? {\n\t\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\t\tid: 'id' in jsonRpcRequest ? jsonRpcRequest.id : null,\n\t\t\t\t\t\tresult: null,\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (error instanceof SessionNotFoundError || error instanceof SessionNotActiveError) {\n\t\t\t\tthis._writeSessionUnavailable(res);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate async _parseMessage(\n\t\treq: IncomingMessage,\n\t\tres: ServerResponse\n\t): Promise<McpRequest | undefined> {\n\t\tlet body = '';\n\n\t\tfor await (const chunk of req) {\n\t\t\tbody += chunk.toString();\n\t\t}\n\n\t\tlet rawBody: unknown;\n\t\ttry {\n\t\t\trawBody = JSON.parse(body) as unknown;\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof SyntaxError)) throw error;\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'http_request_errors_total',\n\t\t\t\t1,\n\t\t\t\t{ transport: 'sse', error_type: 'parse_error' },\n\t\t\t\t'Total HTTP request errors'\n\t\t\t);\n\t\t\tres.writeHead(400, { 'Content-Type': 'application/json' });\n\t\t\tres.end(JSON.stringify({ error: 'Invalid JSON' }));\n\t\t\treturn;\n\t\t}\n\n\t\tconst parseResult = safeParse(JsonRpcRequestSchema, rawBody);\n\t\tconst rawId =\n\t\t\trawBody && typeof rawBody === 'object' && 'id' in rawBody\n\t\t\t\t? ((rawBody as { id?: unknown }).id ?? null)\n\t\t\t\t: null;\n\t\tif (!parseResult.success) {\n\t\t\tthis._metrics?.counter(\n\t\t\t\t'http_request_errors_total',\n\t\t\t\t1,\n\t\t\t\t{ transport: 'sse', error_type: 'validation' },\n\t\t\t\t'Total HTTP request errors'\n\t\t\t);\n\t\t\tres.writeHead(200, { 'Content-Type': 'application/json' });\n\t\t\tres.end(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tjsonrpc: '2.0',\n\t\t\t\t\tid: rawId,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: -32600,\n\t\t\t\t\t\tmessage: 'Invalid Request',\n\t\t\t\t\t\tdata: parseResult.issues,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\treturn parseResult.output as McpRequest;\n\t}\n\n\tprivate _writeSessionUnavailable(res: ServerResponse): void {\n\t\tres.writeHead(404, { 'Content-Type': 'application/json' });\n\t\tres.end(JSON.stringify({ error: 'Session not found' }));\n\t}\n\n\tprivate _releaseClient(res: ServerResponse): Promise<void> {\n\t\tconst existing = this._releasePromises.get(res);\n\t\tif (existing) {\n\t\t\treturn existing;\n\t\t}\n\n\t\tthis._clients.delete(res);\n\t\tconst sessionId = this._clientSessionMap.get(res);\n\t\tthis._clientSessionMap.delete(res);\n\t\tthis._updateActiveConnectionsMetric();\n\n\t\tlet releasePromise = Promise.resolve();\n\t\tif (sessionId && this._connectionPool) {\n\t\t\tconst attachmentCount = this._sessionAttachmentCounts.get(sessionId);\n\t\t\tif (attachmentCount !== undefined && attachmentCount > 1) {\n\t\t\t\tthis._sessionAttachmentCounts.set(sessionId, attachmentCount - 1);\n\t\t\t} else {\n\t\t\t\tthis._sessionAttachmentCounts.delete(sessionId);\n\t\t\t\treleasePromise = this._connectionPool.closeSession(sessionId).catch((error: unknown) => {\n\t\t\t\t\tif (error instanceof SessionNotFoundError) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis._updatePoolMetrics();\n\t\t}\n\n\t\tthis._releasePromises.set(res, releasePromise);\n\t\tthis._pendingReleases.add(releasePromise);\n\t\tvoid releasePromise.then(\n\t\t\t() => this._pendingReleases.delete(releasePromise),\n\t\t\t(error: unknown) => {\n\t\t\t\tthis._pendingReleases.delete(releasePromise);\n\t\t\t\tthis._releaseFailures.add(error);\n\t\t\t}\n\t\t);\n\t\treturn releasePromise;\n\t}\n\n\tprivate _releaseAfterDisconnect(res: ServerResponse): void {\n\t\tvoid this._releaseClient(res).catch((error: unknown) => {\n\t\t\tthis.log('error', 'SSE pooled session release failed', { error });\n\t\t});\n\t}\n\n\t/**\n\t * Send an SSE event to a specific client\n\t */\n\tprivate _sendSseEvent(res: ServerResponse, event: string, data: unknown): void {\n\t\ttry {\n\t\t\tres.write(`event: ${event}\\n`);\n\t\t\tres.write(`data: ${JSON.stringify(data)}\\n\\n`);\n\t\t} catch {\n\t\t\tthis._releaseAfterDisconnect(res);\n\t\t}\n\t}\n\n\tprivate _updateActiveConnectionsMetric(): void {\n\t\tthis._metrics?.gauge(\n\t\t\t'sse_active_connections',\n\t\t\tthis._clients.size,\n\t\t\t{},\n\t\t\t'Current active SSE connections'\n\t\t);\n\t}\n\n\tprivate _updatePoolMetrics(): void {\n\t\tif (!this._connectionPool || !this._metrics) {\n\t\t\treturn;\n\t\t}\n\t\tconst stats = this._connectionPool.getStats();\n\t\tthis._metrics.gauge(\n\t\t\t'sse_pool_active_sessions',\n\t\t\tstats.activeSessions,\n\t\t\t{},\n\t\t\t'Active sessions in connection pool'\n\t\t);\n\t\tthis._metrics.gauge(\n\t\t\t'sse_pool_total_sessions',\n\t\t\tstats.totalSessions,\n\t\t\t{},\n\t\t\t'Total sessions in connection pool'\n\t\t);\n\t\tthis._metrics.gauge(\n\t\t\t'sse_pool_max_sessions',\n\t\t\tstats.maxSessions,\n\t\t\t{},\n\t\t\t'Maximum sessions in connection pool'\n\t\t);\n\t}\n\n\t/**\n\t * Broadcast a message to all connected clients\n\t */\n\tbroadcast(event: string, data: unknown): void {\n\t\tfor (const client of this._clients) {\n\t\t\tthis._sendSseEvent(client, event, data);\n\t\t}\n\t}\n\n\t/**\n\t * Generate a unique client ID\n\t */\n\tprivate _generateClientId(): string {\n\t\treturn `client_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n\t}\n\n\t/**\n\t * Get number of connected clients\n\t */\n\tget clientCount(): number {\n\t\treturn this._clients.size;\n\t}\n\n\t/**\n\t * Get the connection pool, if one was configured.\n\t */\n\tget connectionPool(): IConnectionPool | undefined {\n\t\treturn this._connectionPool;\n\t}\n\n\t/**\n\t * Stop the transport server with graceful shutdown.\n\t *\n\t * @param timeout - Maximum time to wait for requests to drain (not used for SSE)\n\t * @returns Promise that resolves when shutdown is complete\n\t */\n\tstop(_timeout?: number): Promise<void> {\n\t\tif (this._stopPromise) {\n\t\t\treturn this._stopPromise;\n\t\t}\n\n\t\tconst completion = Promise.withResolvers<void>();\n\t\tthis._stopPromise = completion.promise;\n\t\tthis._isShuttingDown = true;\n\t\tthis._stopRateLimitCleanup();\n\n\t\tconst operations = new Set<Promise<void>>();\n\t\tfor (const client of Array.from(this._clients)) {\n\t\t\toperations.add(this._releaseClient(client));\n\t\t\ttry {\n\t\t\t\tclient.end();\n\t\t\t} catch (error) {\n\t\t\t\toperations.add(\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\terror instanceof Error ? error : new AggregateError([error], 'SSE client close failed')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tfor (const release of this._pendingReleases) {\n\t\t\toperations.add(release);\n\t\t}\n\t\tif (this._connectionPool) {\n\t\t\toperations.add(this._connectionPool.terminate());\n\t\t}\n\t\toperations.add(\n\t\t\tthis._server.listening\n\t\t\t\t? new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\tthis._server.close((error) => (error ? reject(error) : resolve()));\n\t\t\t\t\t})\n\t\t\t\t: Promise.resolve()\n\t\t);\n\n\t\tvoid Promise.allSettled(operations).then((outcomes) => {\n\t\t\tconst failures = new Set<unknown>(this._releaseFailures);\n\t\t\tfor (const outcome of outcomes) {\n\t\t\t\tif (outcome.status !== 'rejected') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (outcome.reason instanceof AggregateError) {\n\t\t\t\t\tfor (const error of outcome.reason.errors) failures.add(error);\n\t\t\t\t} else {\n\t\t\t\t\tfailures.add(outcome.reason);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._clients.clear();\n\t\t\tthis._clientSessionMap.clear();\n\t\t\tthis._sessionAttachmentCounts.clear();\n\t\t\tthis._updateActiveConnectionsMetric();\n\t\t\tthis._updatePoolMetrics();\n\t\t\tif (failures.size > 0) {\n\t\t\t\tcompletion.reject(new AggregateError(failures, 'SSE transport shutdown failed'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.log('info', 'SSE transport stopped');\n\t\t\tcompletion.resolve();\n\t\t});\n\n\t\treturn completion.promise;\n\t}\n}\n\n/**\n * Create an SSE transport with given options.\n *\n * @param options - Transport configuration\n * @returns A configured SSE transport\n *\n * @example\n * ```typescript\n * const transport = createSseTransport({ port: 3000 });\n * await transport.connect(mcpServer);\n * ```\n */\nexport function createSseTransport(options: SseTransportOptions = {}): SseTransport {\n\treturn new SseTransport(options);\n}\n"],"names":["assertPooledSsePersistence","poolingEnabled","persistence","ConfigurationError","SseTransport","BaseTransport","Set","Map","WeakMap","options","undefined","createServer","req","res","mcpServer","Promise","resolve","reject","cleanup","onError","onListening","error","routing","startTime","Date","requestPath","requestMethod","durationSeconds","JSON","url","URL","clientIp","sanitizedParams","requestSessionId","healthData","poolStats","liveness","readiness","statusCode","params","sessionId","requestedSession","requestedSessionId","asSessionId","Error","release","connectedPayload","clientId","queued","message","pooledOwner","correlation","jsonRpcRequest","owner","randomUUID","receive","runWithContext","response","result","assertNever","SessionNotFoundError","SessionNotActiveError","body","chunk","rawBody","SyntaxError","parseResult","safeParse","JsonRpcRequestSchema","rawId","existing","releasePromise","attachmentCount","event","data","stats","client","Math","_timeout","completion","operations","Array","AggregateError","outcomes","failures","outcome","createSseTransport"],"mappings":"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"}