@frontmcp/sdk 0.4.1 → 0.5.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 (558) hide show
  1. package/README.md +30 -18
  2. package/package.json +20 -5
  3. package/src/app/app.registry.d.ts +3 -2
  4. package/src/app/app.registry.js +3 -1
  5. package/src/app/app.registry.js.map +1 -1
  6. package/src/app/instances/app.local.instance.js +2 -2
  7. package/src/app/instances/app.local.instance.js.map +1 -1
  8. package/src/auth/auth.registry.d.ts +34 -2
  9. package/src/auth/auth.registry.js +162 -24
  10. package/src/auth/auth.registry.js.map +1 -1
  11. package/src/auth/auth.utils.js +8 -9
  12. package/src/auth/auth.utils.js.map +1 -1
  13. package/src/auth/authorization/authorization.class.d.ts +125 -0
  14. package/src/auth/authorization/authorization.class.js +224 -0
  15. package/src/auth/authorization/authorization.class.js.map +1 -0
  16. package/src/auth/authorization/authorization.types.d.ts +300 -0
  17. package/src/auth/authorization/authorization.types.js +79 -0
  18. package/src/auth/authorization/authorization.types.js.map +1 -0
  19. package/src/auth/authorization/index.d.ts +5 -0
  20. package/src/auth/authorization/index.js +19 -0
  21. package/src/auth/authorization/index.js.map +1 -0
  22. package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
  23. package/src/auth/authorization/orchestrated.authorization.js +306 -0
  24. package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
  25. package/src/auth/authorization/public.authorization.d.ts +91 -0
  26. package/src/auth/authorization/public.authorization.js +132 -0
  27. package/src/auth/authorization/public.authorization.js.map +1 -0
  28. package/src/auth/authorization/transparent.authorization.d.ts +130 -0
  29. package/src/auth/authorization/transparent.authorization.js +147 -0
  30. package/src/auth/authorization/transparent.authorization.js.map +1 -0
  31. package/src/auth/consent/consent.types.d.ts +111 -0
  32. package/src/auth/consent/consent.types.js +119 -0
  33. package/src/auth/consent/consent.types.js.map +1 -0
  34. package/src/auth/consent/index.d.ts +1 -0
  35. package/src/auth/consent/index.js +13 -0
  36. package/src/auth/consent/index.js.map +1 -0
  37. package/src/auth/detection/auth-provider-detection.d.ts +84 -0
  38. package/src/auth/detection/auth-provider-detection.js +230 -0
  39. package/src/auth/detection/auth-provider-detection.js.map +1 -0
  40. package/src/auth/detection/index.d.ts +1 -0
  41. package/src/auth/detection/index.js +15 -0
  42. package/src/auth/detection/index.js.map +1 -0
  43. package/src/auth/flows/auth.verify.flow.d.ts +110 -0
  44. package/src/auth/flows/auth.verify.flow.js +379 -0
  45. package/src/auth/flows/auth.verify.flow.js.map +1 -0
  46. package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
  47. package/src/auth/flows/oauth.authorize.flow.js +701 -33
  48. package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
  49. package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
  50. package/src/auth/flows/oauth.callback.flow.js +357 -0
  51. package/src/auth/flows/oauth.callback.flow.js.map +1 -0
  52. package/src/auth/flows/oauth.register.flow.d.ts +32 -125
  53. package/src/auth/flows/oauth.token.flow.d.ts +52 -154
  54. package/src/auth/flows/oauth.token.flow.js +193 -55
  55. package/src/auth/flows/oauth.token.flow.js.map +1 -1
  56. package/src/auth/flows/session.verify.flow.d.ts +66 -321
  57. package/src/auth/flows/session.verify.flow.js +107 -18
  58. package/src/auth/flows/session.verify.flow.js.map +1 -1
  59. package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
  60. package/src/auth/flows/well-known.jwks.flow.js +15 -8
  61. package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
  62. package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
  63. package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
  64. package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
  65. package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
  66. package/src/auth/flows/well-known.prm.flow.js +3 -4
  67. package/src/auth/flows/well-known.prm.flow.js.map +1 -1
  68. package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
  69. package/src/auth/instances/instance.local-primary-auth.js +236 -6
  70. package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
  71. package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
  72. package/src/auth/instances/instance.remote-primary-auth.js +2 -2
  73. package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
  74. package/src/auth/session/authorization-vault.d.ts +611 -0
  75. package/src/auth/session/authorization-vault.js +817 -0
  76. package/src/auth/session/authorization-vault.js.map +1 -0
  77. package/src/auth/session/authorization.store.d.ts +301 -0
  78. package/src/auth/session/authorization.store.js +323 -0
  79. package/src/auth/session/authorization.store.js.map +1 -0
  80. package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
  81. package/src/auth/session/encrypted-authorization-vault.js +493 -0
  82. package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
  83. package/src/auth/session/index.d.ts +4 -4
  84. package/src/auth/session/index.js +11 -7
  85. package/src/auth/session/index.js.map +1 -1
  86. package/src/auth/session/session.schema.d.ts +1 -1
  87. package/src/auth/session/session.service.d.ts +1 -1
  88. package/src/auth/session/transport-session.manager.d.ts +101 -0
  89. package/src/auth/session/transport-session.manager.js +300 -0
  90. package/src/auth/session/transport-session.manager.js.map +1 -0
  91. package/src/auth/session/transport-session.types.d.ts +457 -0
  92. package/src/auth/session/transport-session.types.js +110 -0
  93. package/src/auth/session/transport-session.types.js.map +1 -0
  94. package/src/auth/session/utils/session-id.utils.d.ts +14 -2
  95. package/src/auth/session/utils/session-id.utils.js +68 -19
  96. package/src/auth/session/utils/session-id.utils.js.map +1 -1
  97. package/src/auth/session/vault-encryption.d.ts +189 -0
  98. package/src/auth/session/vault-encryption.js +263 -0
  99. package/src/auth/session/vault-encryption.js.map +1 -0
  100. package/src/auth/ui/base-layout.d.ts +188 -0
  101. package/src/auth/ui/base-layout.js +292 -0
  102. package/src/auth/ui/base-layout.js.map +1 -0
  103. package/src/auth/ui/htmx-templates.d.ts +135 -0
  104. package/src/auth/ui/htmx-templates.js +433 -0
  105. package/src/auth/ui/htmx-templates.js.map +1 -0
  106. package/src/auth/ui/index.d.ts +11 -0
  107. package/src/auth/ui/index.js +35 -0
  108. package/src/auth/ui/index.js.map +1 -0
  109. package/src/auth/utils/audience.validator.d.ts +129 -0
  110. package/src/auth/utils/audience.validator.js +196 -0
  111. package/src/auth/utils/audience.validator.js.map +1 -0
  112. package/src/auth/utils/index.d.ts +2 -0
  113. package/src/auth/utils/index.js +7 -0
  114. package/src/auth/utils/index.js.map +1 -0
  115. package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
  116. package/src/auth/utils/www-authenticate.utils.js +183 -0
  117. package/src/auth/utils/www-authenticate.utils.js.map +1 -0
  118. package/src/common/common.schema.d.ts +2 -16
  119. package/src/common/constants.d.ts +3 -0
  120. package/src/common/constants.js +6 -1
  121. package/src/common/constants.js.map +1 -1
  122. package/src/common/decorators/decorator-utils.d.ts +131 -0
  123. package/src/common/decorators/decorator-utils.js +195 -0
  124. package/src/common/decorators/decorator-utils.js.map +1 -0
  125. package/src/common/decorators/front-mcp.decorator.js +3 -2
  126. package/src/common/decorators/front-mcp.decorator.js.map +1 -1
  127. package/src/common/decorators/hook.decorator.d.ts +58 -2
  128. package/src/common/decorators/hook.decorator.js +127 -17
  129. package/src/common/decorators/hook.decorator.js.map +1 -1
  130. package/src/common/decorators/plugin.decorator.d.ts +1 -1
  131. package/src/common/decorators/plugin.decorator.js +11 -10
  132. package/src/common/decorators/plugin.decorator.js.map +1 -1
  133. package/src/common/decorators/resource.decorator.d.ts +32 -3
  134. package/src/common/decorators/resource.decorator.js +46 -4
  135. package/src/common/decorators/resource.decorator.js.map +1 -1
  136. package/src/common/decorators/tool.decorator.d.ts +54 -5
  137. package/src/common/decorators/tool.decorator.js.map +1 -1
  138. package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
  139. package/src/common/dynamic/dynamic.plugin.js +7 -1
  140. package/src/common/dynamic/dynamic.plugin.js.map +1 -1
  141. package/src/common/entries/prompt.entry.d.ts +46 -2
  142. package/src/common/entries/prompt.entry.js +10 -0
  143. package/src/common/entries/prompt.entry.js.map +1 -1
  144. package/src/common/entries/resource.entry.d.ts +69 -6
  145. package/src/common/entries/resource.entry.js +27 -3
  146. package/src/common/entries/resource.entry.js.map +1 -1
  147. package/src/common/entries/scope.entry.d.ts +5 -1
  148. package/src/common/entries/scope.entry.js +3 -3
  149. package/src/common/entries/scope.entry.js.map +1 -1
  150. package/src/common/flow/flow.utils.d.ts +56 -0
  151. package/src/common/flow/flow.utils.js +96 -0
  152. package/src/common/flow/flow.utils.js.map +1 -0
  153. package/src/common/index.d.ts +2 -2
  154. package/src/common/index.js +2 -2
  155. package/src/common/index.js.map +1 -1
  156. package/src/common/interfaces/execution-context.interface.d.ts +59 -0
  157. package/src/common/interfaces/execution-context.interface.js +81 -0
  158. package/src/common/interfaces/execution-context.interface.js.map +1 -0
  159. package/src/common/interfaces/flow.interface.d.ts +1 -1
  160. package/src/common/interfaces/flow.interface.js.map +1 -1
  161. package/src/common/interfaces/index.d.ts +1 -0
  162. package/src/common/interfaces/index.js +1 -0
  163. package/src/common/interfaces/index.js.map +1 -1
  164. package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
  165. package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
  166. package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
  167. package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
  168. package/src/common/interfaces/internal/registry.interface.js.map +1 -1
  169. package/src/common/interfaces/plugin.interface.js.map +1 -1
  170. package/src/common/interfaces/prompt.interface.d.ts +53 -4
  171. package/src/common/interfaces/prompt.interface.js +78 -0
  172. package/src/common/interfaces/prompt.interface.js.map +1 -1
  173. package/src/common/interfaces/resource.interface.d.ts +47 -17
  174. package/src/common/interfaces/resource.interface.js +53 -0
  175. package/src/common/interfaces/resource.interface.js.map +1 -1
  176. package/src/common/interfaces/tool.interface.d.ts +39 -22
  177. package/src/common/interfaces/tool.interface.js +61 -34
  178. package/src/common/interfaces/tool.interface.js.map +1 -1
  179. package/src/common/metadata/adapter.metadata.d.ts +1 -9
  180. package/src/common/metadata/app.metadata.d.ts +425 -730
  181. package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
  182. package/src/common/metadata/flow.metadata.d.ts +10 -25
  183. package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
  184. package/src/common/metadata/front-mcp.metadata.js +6 -4
  185. package/src/common/metadata/front-mcp.metadata.js.map +1 -1
  186. package/src/common/metadata/hook.metadata.d.ts +1 -1
  187. package/src/common/metadata/hook.metadata.js.map +1 -1
  188. package/src/common/metadata/index.d.ts +1 -0
  189. package/src/common/metadata/index.js +1 -0
  190. package/src/common/metadata/index.js.map +1 -1
  191. package/src/common/metadata/logger.metadata.d.ts +1 -9
  192. package/src/common/metadata/plugin.metadata.d.ts +8 -30
  193. package/src/common/metadata/prompt.metadata.d.ts +4 -161
  194. package/src/common/metadata/provider.metadata.d.ts +2 -12
  195. package/src/common/metadata/resource.metadata.d.ts +6 -98
  196. package/src/common/metadata/resource.metadata.js +15 -6
  197. package/src/common/metadata/resource.metadata.js.map +1 -1
  198. package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
  199. package/src/common/metadata/tool-ui.metadata.js +12 -0
  200. package/src/common/metadata/tool-ui.metadata.js.map +1 -0
  201. package/src/common/metadata/tool.metadata.d.ts +78 -199
  202. package/src/common/metadata/tool.metadata.js +11 -14
  203. package/src/common/metadata/tool.metadata.js.map +1 -1
  204. package/src/common/providers/base-config.provider.d.ts +84 -0
  205. package/src/common/providers/base-config.provider.js +128 -0
  206. package/src/common/providers/base-config.provider.js.map +1 -0
  207. package/src/common/records/plugin.record.d.ts +5 -6
  208. package/src/common/records/plugin.record.js.map +1 -1
  209. package/src/common/records/prompt.record.js.map +1 -1
  210. package/src/common/records/resource.record.d.ts +17 -1
  211. package/src/common/records/resource.record.js +12 -6
  212. package/src/common/records/resource.record.js.map +1 -1
  213. package/src/common/records/tool.record.js.map +1 -1
  214. package/src/common/schemas/annotated-class.schema.d.ts +9 -9
  215. package/src/common/schemas/annotated-class.schema.js +92 -27
  216. package/src/common/schemas/annotated-class.schema.js.map +1 -1
  217. package/src/common/schemas/http-input.schema.d.ts +6 -30
  218. package/src/common/schemas/http-output.schema.d.ts +326 -1630
  219. package/src/common/schemas/http-output.schema.js +39 -1
  220. package/src/common/schemas/http-output.schema.js.map +1 -1
  221. package/src/common/tokens/front-mcp.tokens.js +4 -1
  222. package/src/common/tokens/front-mcp.tokens.js.map +1 -1
  223. package/src/common/tokens/resource.tokens.d.ts +2 -0
  224. package/src/common/tokens/resource.tokens.js +4 -1
  225. package/src/common/tokens/resource.tokens.js.map +1 -1
  226. package/src/common/tokens/tool.tokens.d.ts +2 -0
  227. package/src/common/tokens/tool.tokens.js +2 -0
  228. package/src/common/tokens/tool.tokens.js.map +1 -1
  229. package/src/common/types/auth/jwt.types.d.ts +5 -31
  230. package/src/common/types/auth/session.types.d.ts +97 -192
  231. package/src/common/types/auth/session.types.js +24 -11
  232. package/src/common/types/auth/session.types.js.map +1 -1
  233. package/src/common/types/options/auth.options.d.ts +1013 -490
  234. package/src/common/types/options/auth.options.js +554 -36
  235. package/src/common/types/options/auth.options.js.map +1 -1
  236. package/src/common/types/options/http.options.d.ts +1 -9
  237. package/src/common/types/options/logging.options.d.ts +7 -13
  238. package/src/common/types/options/logging.options.js +4 -0
  239. package/src/common/types/options/logging.options.js.map +1 -1
  240. package/src/common/types/options/server-info.options.d.ts +3 -31
  241. package/src/common/types/options/session.options.d.ts +90 -10
  242. package/src/common/types/options/session.options.js +26 -3
  243. package/src/common/types/options/session.options.js.map +1 -1
  244. package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
  245. package/src/common/utils/decide-request-intent.utils.js +88 -23
  246. package/src/common/utils/decide-request-intent.utils.js.map +1 -1
  247. package/src/completion/flows/complete.flow.d.ts +74 -0
  248. package/src/completion/flows/complete.flow.js +199 -0
  249. package/src/completion/flows/complete.flow.js.map +1 -0
  250. package/src/errors/authorization-required.error.d.ts +189 -0
  251. package/src/errors/authorization-required.error.js +274 -0
  252. package/src/errors/authorization-required.error.js.map +1 -0
  253. package/src/errors/index.d.ts +2 -1
  254. package/src/errors/index.js +17 -1
  255. package/src/errors/index.js.map +1 -1
  256. package/src/errors/mcp.error.d.ts +101 -1
  257. package/src/errors/mcp.error.js +147 -2
  258. package/src/errors/mcp.error.js.map +1 -1
  259. package/src/flows/flow.instance.js +4 -3
  260. package/src/flows/flow.instance.js.map +1 -1
  261. package/src/flows/flow.registry.js.map +1 -1
  262. package/src/flows/flow.stages.js +14 -11
  263. package/src/flows/flow.stages.js.map +1 -1
  264. package/src/front-mcp/front-mcp.providers.d.ts +464 -102
  265. package/src/front-mcp/front-mcp.providers.js +3 -5
  266. package/src/front-mcp/front-mcp.providers.js.map +1 -1
  267. package/src/hooks/hook.instance.d.ts +1 -1
  268. package/src/hooks/hook.instance.js +5 -2
  269. package/src/hooks/hook.instance.js.map +1 -1
  270. package/src/hooks/hook.registry.js +7 -5
  271. package/src/hooks/hook.registry.js.map +1 -1
  272. package/src/index.d.ts +28 -9
  273. package/src/index.js +5 -1
  274. package/src/index.js.map +1 -1
  275. package/src/logger/instances/instance.logger.js +3 -2
  276. package/src/logger/instances/instance.logger.js.map +1 -1
  277. package/src/logger/logger.registry.js +7 -2
  278. package/src/logger/logger.registry.js.map +1 -1
  279. package/src/logging/flows/set-level.flow.d.ts +62 -0
  280. package/src/logging/flows/set-level.flow.js +108 -0
  281. package/src/logging/flows/set-level.flow.js.map +1 -0
  282. package/src/mcp-apps/csp.d.ts +111 -0
  283. package/src/mcp-apps/csp.js +267 -0
  284. package/src/mcp-apps/csp.js.map +1 -0
  285. package/src/mcp-apps/index.d.ts +23 -0
  286. package/src/mcp-apps/index.js +91 -0
  287. package/src/mcp-apps/index.js.map +1 -0
  288. package/src/mcp-apps/schemas.d.ts +403 -0
  289. package/src/mcp-apps/schemas.js +345 -0
  290. package/src/mcp-apps/schemas.js.map +1 -0
  291. package/src/mcp-apps/template.d.ts +94 -0
  292. package/src/mcp-apps/template.js +419 -0
  293. package/src/mcp-apps/template.js.map +1 -0
  294. package/src/mcp-apps/types.d.ts +323 -0
  295. package/src/mcp-apps/types.js +59 -0
  296. package/src/mcp-apps/types.js.map +1 -0
  297. package/src/notification/index.d.ts +1 -0
  298. package/src/notification/index.js +13 -0
  299. package/src/notification/index.js.map +1 -0
  300. package/src/notification/notification.service.d.ts +378 -0
  301. package/src/notification/notification.service.js +727 -0
  302. package/src/notification/notification.service.js.map +1 -0
  303. package/src/plugin/plugin.registry.js +12 -9
  304. package/src/plugin/plugin.registry.js.map +1 -1
  305. package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
  306. package/src/prompt/flows/get-prompt.flow.js +214 -0
  307. package/src/prompt/flows/get-prompt.flow.js.map +1 -0
  308. package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
  309. package/src/prompt/flows/prompts-list.flow.js +176 -0
  310. package/src/prompt/flows/prompts-list.flow.js.map +1 -0
  311. package/src/prompt/index.d.ts +7 -0
  312. package/src/prompt/index.js +17 -0
  313. package/src/prompt/index.js.map +1 -0
  314. package/src/prompt/prompt.events.d.ts +17 -0
  315. package/src/prompt/prompt.events.js +25 -0
  316. package/src/prompt/prompt.events.js.map +1 -0
  317. package/src/prompt/prompt.instance.d.ts +30 -0
  318. package/src/prompt/prompt.instance.js +120 -0
  319. package/src/prompt/prompt.instance.js.map +1 -0
  320. package/src/prompt/prompt.registry.d.ts +79 -12
  321. package/src/prompt/prompt.registry.js +360 -15
  322. package/src/prompt/prompt.registry.js.map +1 -1
  323. package/src/prompt/prompt.types.d.ts +26 -0
  324. package/src/prompt/prompt.types.js +11 -0
  325. package/src/prompt/prompt.types.js.map +1 -0
  326. package/src/prompt/prompt.utils.d.ts +26 -0
  327. package/src/prompt/prompt.utils.js +136 -0
  328. package/src/prompt/prompt.utils.js.map +1 -0
  329. package/src/provider/provider.registry.d.ts +12 -5
  330. package/src/provider/provider.registry.js +30 -138
  331. package/src/provider/provider.registry.js.map +1 -1
  332. package/src/regsitry/registry.base.d.ts +1 -1
  333. package/src/regsitry/registry.base.js.map +1 -1
  334. package/src/resource/flows/read-resource.flow.d.ts +91 -0
  335. package/src/resource/flows/read-resource.flow.js +270 -0
  336. package/src/resource/flows/read-resource.flow.js.map +1 -0
  337. package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
  338. package/src/resource/flows/resource-templates-list.flow.js +191 -0
  339. package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
  340. package/src/resource/flows/resources-list.flow.d.ts +64 -0
  341. package/src/resource/flows/resources-list.flow.js +196 -0
  342. package/src/resource/flows/resources-list.flow.js.map +1 -0
  343. package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
  344. package/src/resource/flows/subscribe-resource.flow.js +123 -0
  345. package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
  346. package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
  347. package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
  348. package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
  349. package/src/resource/index.d.ts +8 -0
  350. package/src/resource/index.js +20 -0
  351. package/src/resource/index.js.map +1 -0
  352. package/src/resource/resource.events.d.ts +24 -0
  353. package/src/resource/resource.events.js +17 -0
  354. package/src/resource/resource.events.js.map +1 -0
  355. package/src/resource/resource.instance.d.ts +35 -0
  356. package/src/resource/resource.instance.js +163 -0
  357. package/src/resource/resource.instance.js.map +1 -0
  358. package/src/resource/resource.registry.d.ts +106 -12
  359. package/src/resource/resource.registry.js +449 -13
  360. package/src/resource/resource.registry.js.map +1 -1
  361. package/src/resource/resource.types.d.ts +35 -0
  362. package/src/resource/resource.types.js +11 -0
  363. package/src/resource/resource.types.js.map +1 -0
  364. package/src/resource/resource.utils.d.ts +30 -0
  365. package/src/resource/resource.utils.js +151 -0
  366. package/src/resource/resource.utils.js.map +1 -0
  367. package/src/scope/flows/http.request.flow.d.ts +48 -330
  368. package/src/scope/flows/http.request.flow.js +306 -78
  369. package/src/scope/flows/http.request.flow.js.map +1 -1
  370. package/src/scope/scope.instance.d.ts +12 -0
  371. package/src/scope/scope.instance.js +145 -15
  372. package/src/scope/scope.instance.js.map +1 -1
  373. package/src/tool/flows/call-tool.flow.d.ts +64 -1110
  374. package/src/tool/flows/call-tool.flow.js +303 -15
  375. package/src/tool/flows/call-tool.flow.js.map +1 -1
  376. package/src/tool/flows/tools-list.flow.d.ts +32 -473
  377. package/src/tool/flows/tools-list.flow.js +121 -40
  378. package/src/tool/flows/tools-list.flow.js.map +1 -1
  379. package/src/tool/tool.events.d.ts +8 -1
  380. package/src/tool/tool.events.js.map +1 -1
  381. package/src/tool/tool.instance.d.ts +3 -1
  382. package/src/tool/tool.instance.js +17 -3
  383. package/src/tool/tool.instance.js.map +1 -1
  384. package/src/tool/tool.registry.d.ts +7 -1
  385. package/src/tool/tool.registry.js +26 -10
  386. package/src/tool/tool.registry.js.map +1 -1
  387. package/src/tool/tool.types.d.ts +4 -4
  388. package/src/tool/tool.types.js.map +1 -1
  389. package/src/tool/tool.utils.d.ts +3 -12
  390. package/src/tool/tool.utils.js +39 -193
  391. package/src/tool/tool.utils.js.map +1 -1
  392. package/src/tool/ui/index.d.ts +22 -0
  393. package/src/tool/ui/index.js +63 -0
  394. package/src/tool/ui/index.js.map +1 -0
  395. package/src/tool/ui/platform-adapters.d.ts +10 -0
  396. package/src/tool/ui/platform-adapters.js +18 -0
  397. package/src/tool/ui/platform-adapters.js.map +1 -0
  398. package/src/tool/ui/template-helpers.d.ts +46 -0
  399. package/src/tool/ui/template-helpers.js +112 -0
  400. package/src/tool/ui/template-helpers.js.map +1 -0
  401. package/src/tool/ui/ui-resource-template.d.ts +34 -0
  402. package/src/tool/ui/ui-resource-template.js +64 -0
  403. package/src/tool/ui/ui-resource-template.js.map +1 -0
  404. package/src/tool/ui/ui-resource.handler.d.ts +74 -0
  405. package/src/tool/ui/ui-resource.handler.js +129 -0
  406. package/src/tool/ui/ui-resource.handler.js.map +1 -0
  407. package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
  408. package/src/transport/adapters/transport.local.adapter.js +28 -7
  409. package/src/transport/adapters/transport.local.adapter.js.map +1 -1
  410. package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
  411. package/src/transport/adapters/transport.sse.adapter.js +4 -3
  412. package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
  413. package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
  414. package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
  415. package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
  416. package/src/transport/flows/handle.sse.flow.d.ts +29 -63
  417. package/src/transport/flows/handle.sse.flow.js +78 -10
  418. package/src/transport/flows/handle.sse.flow.js.map +1 -1
  419. package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
  420. package/src/transport/flows/handle.stateless-http.flow.js +102 -0
  421. package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
  422. package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
  423. package/src/transport/flows/handle.streamable-http.flow.js +158 -26
  424. package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
  425. package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
  426. package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
  427. package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
  428. package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
  429. package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
  430. package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
  431. package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
  432. package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
  433. package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
  434. package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
  435. package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
  436. package/src/transport/mcp-handlers/index.d.ts +517 -208
  437. package/src/transport/mcp-handlers/index.js +39 -2
  438. package/src/transport/mcp-handlers/index.js.map +1 -1
  439. package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
  440. package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
  441. package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
  442. package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
  443. package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
  444. package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
  445. package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
  446. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
  447. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
  448. package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
  449. package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
  450. package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
  451. package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
  452. package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
  453. package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
  454. package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
  455. package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
  456. package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
  457. package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
  458. package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
  459. package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
  460. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
  461. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
  462. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
  463. package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
  464. package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
  465. package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
  466. package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
  467. package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
  468. package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
  469. package/src/transport/transport.local.js +7 -2
  470. package/src/transport/transport.local.js.map +1 -1
  471. package/src/transport/transport.registry.d.ts +30 -0
  472. package/src/transport/transport.registry.js +84 -1
  473. package/src/transport/transport.registry.js.map +1 -1
  474. package/src/transport/transport.types.d.ts +3 -3
  475. package/src/transport/transport.types.js.map +1 -1
  476. package/src/utils/content.utils.d.ts +48 -0
  477. package/src/utils/content.utils.js +194 -0
  478. package/src/utils/content.utils.js.map +1 -0
  479. package/src/utils/index.d.ts +8 -0
  480. package/src/utils/index.js +55 -0
  481. package/src/utils/index.js.map +1 -0
  482. package/src/utils/lineage.utils.d.ts +40 -0
  483. package/src/utils/lineage.utils.js +82 -0
  484. package/src/utils/lineage.utils.js.map +1 -0
  485. package/src/utils/naming.utils.d.ts +46 -0
  486. package/src/utils/naming.utils.js +136 -0
  487. package/src/utils/naming.utils.js.map +1 -0
  488. package/src/utils/types.utils.d.ts +2 -2
  489. package/src/utils/types.utils.js.map +1 -1
  490. package/src/utils/uri-template.utils.d.ts +57 -0
  491. package/src/utils/uri-template.utils.js +113 -0
  492. package/src/utils/uri-template.utils.js.map +1 -0
  493. package/src/utils/uri-validation.utils.d.ts +40 -0
  494. package/src/utils/uri-validation.utils.js +76 -0
  495. package/src/utils/uri-validation.utils.js.map +1 -0
  496. package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
  497. package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
  498. package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
  499. package/src/__test-utils__/fixtures/index.d.ts +0 -7
  500. package/src/__test-utils__/fixtures/index.js +0 -11
  501. package/src/__test-utils__/fixtures/index.js.map +0 -1
  502. package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
  503. package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
  504. package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
  505. package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
  506. package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
  507. package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
  508. package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
  509. package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
  510. package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
  511. package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
  512. package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
  513. package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
  514. package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
  515. package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
  516. package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
  517. package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
  518. package/src/__test-utils__/helpers/async.helpers.js +0 -112
  519. package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
  520. package/src/__test-utils__/helpers/index.d.ts +0 -6
  521. package/src/__test-utils__/helpers/index.js +0 -10
  522. package/src/__test-utils__/helpers/index.js.map +0 -1
  523. package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
  524. package/src/__test-utils__/helpers/setup.helpers.js +0 -106
  525. package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
  526. package/src/__test-utils__/index.d.ts +0 -9
  527. package/src/__test-utils__/index.js +0 -14
  528. package/src/__test-utils__/index.js.map +0 -1
  529. package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
  530. package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
  531. package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
  532. package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
  533. package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
  534. package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
  535. package/src/__test-utils__/mocks/index.d.ts +0 -8
  536. package/src/__test-utils__/mocks/index.js +0 -12
  537. package/src/__test-utils__/mocks/index.js.map +0 -1
  538. package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
  539. package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
  540. package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
  541. package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
  542. package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
  543. package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
  544. package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
  545. package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
  546. package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
  547. package/src/auth/path.utils.d.ts +0 -20
  548. package/src/auth/path.utils.js +0 -71
  549. package/src/auth/path.utils.js.map +0 -1
  550. package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
  551. package/src/common/decorators-old/async-with.decorator.js +0 -24
  552. package/src/common/decorators-old/async-with.decorator.js.map +0 -1
  553. package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
  554. package/src/common/decorators-old/auth-hook.decorator.js +0 -27
  555. package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
  556. package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
  557. package/src/common/decorators-old/session-hook.decorator.js +0 -27
  558. package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
@@ -0,0 +1,727 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/notification/notification.service.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NotificationService = exports.MCP_LOGGING_LEVEL_PRIORITY = exports.MCP_APPS_EXTENSION_KEY = void 0;
5
+ exports.hasMcpAppsExtension = hasMcpAppsExtension;
6
+ exports.detectPlatformFromCapabilities = detectPlatformFromCapabilities;
7
+ exports.detectPlatformFromUserAgent = detectPlatformFromUserAgent;
8
+ exports.detectAIPlatform = detectAIPlatform;
9
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
10
+ /**
11
+ * MCP Apps extension key in capabilities.experimental
12
+ */
13
+ exports.MCP_APPS_EXTENSION_KEY = 'io.modelcontextprotocol/ui';
14
+ /**
15
+ * Check if client capabilities include MCP Apps extension.
16
+ * @param capabilities - Client capabilities from initialize request
17
+ * @returns true if the client supports MCP Apps
18
+ */
19
+ function hasMcpAppsExtension(capabilities) {
20
+ if (!capabilities?.experimental) {
21
+ return false;
22
+ }
23
+ const uiExtension = capabilities.experimental[exports.MCP_APPS_EXTENSION_KEY];
24
+ return uiExtension !== undefined && uiExtension !== null;
25
+ }
26
+ /**
27
+ * Detect platform from client capabilities.
28
+ * Checks for known extension capabilities before falling back to client info.
29
+ * @param capabilities - Client capabilities from initialize request
30
+ * @returns Platform type if detected from capabilities, undefined otherwise
31
+ */
32
+ function detectPlatformFromCapabilities(capabilities) {
33
+ if (hasMcpAppsExtension(capabilities)) {
34
+ return 'ext-apps';
35
+ }
36
+ return undefined;
37
+ }
38
+ /**
39
+ * Match client name against custom mapping patterns.
40
+ * @param clientName - The client name to match
41
+ * @param mappings - Array of custom mapping entries
42
+ * @returns The matched platform type, or undefined if no match
43
+ */
44
+ function matchCustomMappings(clientName, mappings) {
45
+ if (!mappings || mappings.length === 0) {
46
+ return undefined;
47
+ }
48
+ const lowerClientName = clientName.toLowerCase();
49
+ for (const mapping of mappings) {
50
+ if (typeof mapping.pattern === 'string') {
51
+ // Exact match (case-insensitive) - use RegExp for substring matching
52
+ if (lowerClientName === mapping.pattern.toLowerCase()) {
53
+ return mapping.platform;
54
+ }
55
+ }
56
+ else {
57
+ // RegExp match
58
+ if (mapping.pattern.test(clientName)) {
59
+ return mapping.platform;
60
+ }
61
+ }
62
+ }
63
+ return undefined;
64
+ }
65
+ /**
66
+ * Default keyword-based platform detection.
67
+ * Works with client names, user-agent strings, or any identifier.
68
+ * @param identifier - The identifier to detect (clientInfo.name, user-agent, etc.)
69
+ * @returns The detected platform type
70
+ */
71
+ function defaultPlatformDetection(identifier) {
72
+ const lowerIdentifier = identifier.toLowerCase();
73
+ // OpenAI/ChatGPT clients (includes user-agent like 'openai-mcp/1.0.0')
74
+ if (lowerIdentifier.includes('chatgpt') || lowerIdentifier.includes('openai') || lowerIdentifier.includes('gpt')) {
75
+ return 'openai';
76
+ }
77
+ // Claude clients
78
+ if (lowerIdentifier.includes('claude') || lowerIdentifier.includes('anthropic')) {
79
+ return 'claude';
80
+ }
81
+ // Google Gemini clients (use specific patterns to prevent false positives like "google-drive-connector")
82
+ if (lowerIdentifier.includes('gemini') ||
83
+ lowerIdentifier.includes('bard') ||
84
+ lowerIdentifier.includes('google-ai') ||
85
+ lowerIdentifier.includes('google ai')) {
86
+ return 'gemini';
87
+ }
88
+ // Cursor IDE
89
+ if (lowerIdentifier.includes('cursor')) {
90
+ return 'cursor';
91
+ }
92
+ // Continue.dev
93
+ if (lowerIdentifier.includes('continue')) {
94
+ return 'continue';
95
+ }
96
+ // Sourcegraph Cody
97
+ if (lowerIdentifier.includes('cody') || lowerIdentifier.includes('sourcegraph')) {
98
+ return 'cody';
99
+ }
100
+ // Generic MCP client (fallback for known MCP implementations)
101
+ if (lowerIdentifier.includes('mcp')) {
102
+ return 'generic-mcp';
103
+ }
104
+ return 'unknown';
105
+ }
106
+ /**
107
+ * Detect platform from user-agent header.
108
+ * Called during session creation before MCP initialize.
109
+ *
110
+ * @param userAgent - The User-Agent header value
111
+ * @param config - Optional platform detection configuration
112
+ * @returns The detected platform type
113
+ */
114
+ function detectPlatformFromUserAgent(userAgent, config) {
115
+ if (!userAgent) {
116
+ return 'unknown';
117
+ }
118
+ // Check custom mappings first
119
+ const customMatch = matchCustomMappings(userAgent, config?.mappings);
120
+ if (customMatch) {
121
+ return customMatch;
122
+ }
123
+ // If customOnly, don't use default detection
124
+ if (config?.customOnly) {
125
+ return 'unknown';
126
+ }
127
+ // Use default detection on user-agent
128
+ return defaultPlatformDetection(userAgent);
129
+ }
130
+ /**
131
+ * Detect the AI platform type from client info.
132
+ * Supports custom mappings that are checked before default detection.
133
+ *
134
+ * @param clientInfo - Client info from MCP initialize request
135
+ * @param config - Optional platform detection configuration with custom mappings
136
+ * @returns The detected platform type
137
+ */
138
+ function detectAIPlatform(clientInfo, config) {
139
+ if (!clientInfo?.name) {
140
+ return 'unknown';
141
+ }
142
+ // First, check custom mappings if provided
143
+ const customMatch = matchCustomMappings(clientInfo.name, config?.mappings);
144
+ if (customMatch) {
145
+ return customMatch;
146
+ }
147
+ // If customOnly is true, don't fall back to default detection
148
+ if (config?.customOnly) {
149
+ return 'unknown';
150
+ }
151
+ // Fall back to default keyword-based detection
152
+ return defaultPlatformDetection(clientInfo.name);
153
+ }
154
+ /**
155
+ * MCP logging level priority (lower number = more verbose).
156
+ * Uses LoggingLevel from MCP SDK for type safety.
157
+ */
158
+ exports.MCP_LOGGING_LEVEL_PRIORITY = {
159
+ debug: 0,
160
+ info: 1,
161
+ notice: 2,
162
+ warning: 3,
163
+ error: 4,
164
+ critical: 5,
165
+ alert: 6,
166
+ emergency: 7,
167
+ };
168
+ /**
169
+ * NotificationService manages server→client notifications per MCP 2025-11-25 spec.
170
+ *
171
+ * It tracks all active MCP server instances and broadcasts notifications when
172
+ * registries (resources, tools, prompts) change.
173
+ *
174
+ * It also manages resource subscriptions per session, allowing clients to
175
+ * subscribe to specific resource URIs and receive notifications when they change.
176
+ *
177
+ * @example
178
+ * ```typescript
179
+ * // In LocalTransportAdapter after server.connect()
180
+ * scope.notifications.registerServer(sessionId, this.server);
181
+ *
182
+ * // On session close
183
+ * scope.notifications.unregisterServer(sessionId);
184
+ *
185
+ * // Resource subscriptions
186
+ * scope.notifications.subscribeResource(sessionId, 'file://path/to/file');
187
+ * scope.notifications.unsubscribeResource(sessionId, 'file://path/to/file');
188
+ * ```
189
+ */
190
+ class NotificationService {
191
+ scope;
192
+ logger;
193
+ servers = new Map();
194
+ unsubscribers = [];
195
+ /** Maps session ID to set of subscribed resource URIs */
196
+ subscriptions = new Map();
197
+ /** Maps session ID to minimum log level for that session */
198
+ logLevels = new Map();
199
+ /**
200
+ * Set of terminated session IDs (for session invalidation on DELETE).
201
+ * Uses LRU-style eviction to prevent unbounded memory growth.
202
+ */
203
+ terminatedSessions = new Set();
204
+ /** Maximum number of terminated sessions to track before eviction */
205
+ static MAX_TERMINATED_SESSIONS = 10000;
206
+ constructor(scope) {
207
+ this.scope = scope;
208
+ this.logger = scope.logger.child('NotificationService');
209
+ }
210
+ /**
211
+ * Initialize the notification service and subscribe to registry changes.
212
+ * Called after all registries are ready.
213
+ */
214
+ async initialize() {
215
+ this.logger.verbose('Initializing notification service');
216
+ // Subscribe to resource changes
217
+ const unsubResources = this.scope.resources.subscribe({ immediate: false }, (event) => {
218
+ if (event.changeScope === 'global') {
219
+ this.broadcastNotification('notifications/resources/list_changed');
220
+ }
221
+ });
222
+ this.unsubscribers.push(unsubResources);
223
+ // Subscribe to tool changes
224
+ const unsubTools = this.scope.tools.subscribe({ immediate: false }, (event) => {
225
+ if (event.changeScope === 'global') {
226
+ this.broadcastNotification('notifications/tools/list_changed');
227
+ }
228
+ });
229
+ this.unsubscribers.push(unsubTools);
230
+ // Subscribe to prompt changes
231
+ const unsubPrompts = this.scope.prompts.subscribe({ immediate: false }, (event) => {
232
+ if (event.changeScope === 'global') {
233
+ this.broadcastNotification('notifications/prompts/list_changed');
234
+ }
235
+ });
236
+ this.unsubscribers.push(unsubPrompts);
237
+ this.logger.info('Notification service initialized with registry subscriptions');
238
+ }
239
+ /**
240
+ * Register an MCP server instance for receiving notifications.
241
+ * Call this when a transport connection is established.
242
+ *
243
+ * @param sessionId - Unique session identifier
244
+ * @param server - The MCP server instance
245
+ */
246
+ registerServer(sessionId, server) {
247
+ if (this.servers.has(sessionId)) {
248
+ this.logger.warn(`Server already registered for session: ${sessionId.slice(0, 20)}...`);
249
+ return;
250
+ }
251
+ this.servers.set(sessionId, {
252
+ sessionId,
253
+ server,
254
+ registeredAt: Date.now(),
255
+ });
256
+ this.logger.verbose(`Registered server for session: ${sessionId.slice(0, 20)}... (total: ${this.servers.size})`);
257
+ }
258
+ /**
259
+ * Unregister an MCP server instance.
260
+ * Call this when a transport connection is closed.
261
+ * Also cleans up any resource subscriptions for this session.
262
+ *
263
+ * @param sessionId - The session identifier to unregister
264
+ * @returns true if the server was registered and is now unregistered, false if not found
265
+ */
266
+ unregisterServer(sessionId) {
267
+ const deleted = this.servers.delete(sessionId);
268
+ // Clean up resource subscriptions for this session
269
+ const subCount = this.subscriptions.get(sessionId)?.size ?? 0;
270
+ this.subscriptions.delete(sessionId);
271
+ // Clean up log level setting for this session
272
+ const hadLogLevel = this.logLevels.delete(sessionId);
273
+ if (deleted) {
274
+ this.logger.verbose(`Unregistered server for session: ${sessionId.slice(0, 20)}... (remaining: ${this.servers.size}, cleaned ${subCount} subscription(s)${hadLogLevel ? ', removed log level' : ''})`);
275
+ }
276
+ return deleted;
277
+ }
278
+ /**
279
+ * Terminate a session. This adds the session ID to the terminated set,
280
+ * preventing further use of this session ID. This is called during DELETE
281
+ * session handling per MCP 2025-11-25 spec.
282
+ *
283
+ * Note: For stateless sessions (encrypted JWTs), the session ID cannot be
284
+ * truly "invalidated" cryptographically, but we track it in memory to reject
285
+ * future requests with this session ID on this server instance.
286
+ *
287
+ * @param sessionId - The session ID to terminate
288
+ * @returns true if the session was registered and is now terminated
289
+ */
290
+ terminateSession(sessionId) {
291
+ // First unregister the server (cleans up subscriptions, log levels, etc.)
292
+ const wasRegistered = this.unregisterServer(sessionId);
293
+ // Add to terminated sessions set (even if not registered, to handle edge cases)
294
+ // Implement LRU-style eviction to prevent unbounded memory growth
295
+ if (this.terminatedSessions.size >= NotificationService.MAX_TERMINATED_SESSIONS) {
296
+ // Remove the oldest entry (first item in Set maintains insertion order)
297
+ const oldest = this.terminatedSessions.values().next().value;
298
+ if (oldest) {
299
+ this.terminatedSessions.delete(oldest);
300
+ this.logger.verbose(`Evicted oldest terminated session to make room: ${oldest.slice(0, 20)}...`);
301
+ }
302
+ }
303
+ this.terminatedSessions.add(sessionId);
304
+ this.logger.verbose(`Terminated session: ${sessionId.slice(0, 20)}... (total terminated: ${this.terminatedSessions.size})`);
305
+ return wasRegistered;
306
+ }
307
+ /**
308
+ * Check if a session has been terminated.
309
+ * Used during session verification to reject requests with terminated session IDs.
310
+ *
311
+ * @param sessionId - The session ID to check
312
+ * @returns true if the session has been terminated
313
+ */
314
+ isSessionTerminated(sessionId) {
315
+ return this.terminatedSessions.has(sessionId);
316
+ }
317
+ /**
318
+ * Broadcast a notification to all registered servers.
319
+ *
320
+ * @param method - The MCP notification method
321
+ * @param params - Optional notification parameters
322
+ */
323
+ broadcastNotification(method, params) {
324
+ if (this.servers.size === 0) {
325
+ this.logger.verbose(`No servers registered for notification: ${method}`);
326
+ return;
327
+ }
328
+ this.logger.verbose(`Broadcasting ${method} to ${this.servers.size} server(s)`);
329
+ for (const [sessionId, { server }] of this.servers) {
330
+ this.sendNotificationToServer(server, sessionId, method, params);
331
+ }
332
+ }
333
+ /**
334
+ * Send a notification to a specific session.
335
+ *
336
+ * @param sessionId - The target session
337
+ * @param method - The MCP notification method
338
+ * @param params - Optional notification parameters
339
+ */
340
+ sendNotificationToSession(sessionId, method, params) {
341
+ const registered = this.servers.get(sessionId);
342
+ if (!registered) {
343
+ this.logger.warn(`Cannot send notification to unregistered session: ${sessionId.slice(0, 20)}...`);
344
+ return;
345
+ }
346
+ this.sendNotificationToServer(registered.server, sessionId, method, params);
347
+ }
348
+ /**
349
+ * Subscribe a session to receive notifications when a specific resource changes.
350
+ *
351
+ * @param sessionId - The session to subscribe
352
+ * @param uri - The resource URI to subscribe to
353
+ * @returns true if this is a new subscription, false if already subscribed
354
+ */
355
+ subscribeResource(sessionId, uri) {
356
+ if (!this.servers.has(sessionId)) {
357
+ this.logger.warn(`Cannot subscribe unregistered session ${sessionId.slice(0, 20)}... to resource ${uri}`);
358
+ return false;
359
+ }
360
+ let sessionSubs = this.subscriptions.get(sessionId);
361
+ if (!sessionSubs) {
362
+ sessionSubs = new Set();
363
+ this.subscriptions.set(sessionId, sessionSubs);
364
+ }
365
+ const isNew = !sessionSubs.has(uri);
366
+ sessionSubs.add(uri);
367
+ if (isNew) {
368
+ this.logger.verbose(`Session ${sessionId.slice(0, 20)}... subscribed to resource ${uri}`);
369
+ }
370
+ return isNew;
371
+ }
372
+ /**
373
+ * Unsubscribe a session from a specific resource.
374
+ *
375
+ * @param sessionId - The session to unsubscribe
376
+ * @param uri - The resource URI to unsubscribe from
377
+ * @returns true if the subscription was removed, false if not subscribed
378
+ */
379
+ unsubscribeResource(sessionId, uri) {
380
+ const sessionSubs = this.subscriptions.get(sessionId);
381
+ if (!sessionSubs) {
382
+ return false;
383
+ }
384
+ const wasSubscribed = sessionSubs.delete(uri);
385
+ // Clean up empty subscription sets
386
+ if (sessionSubs.size === 0) {
387
+ this.subscriptions.delete(sessionId);
388
+ }
389
+ if (wasSubscribed) {
390
+ this.logger.verbose(`Session ${sessionId.slice(0, 20)}... unsubscribed from resource ${uri}`);
391
+ }
392
+ return wasSubscribed;
393
+ }
394
+ /**
395
+ * Check if a session is subscribed to a specific resource.
396
+ *
397
+ * @param sessionId - The session to check
398
+ * @param uri - The resource URI
399
+ * @returns true if subscribed
400
+ */
401
+ isSubscribed(sessionId, uri) {
402
+ return this.subscriptions.get(sessionId)?.has(uri) ?? false;
403
+ }
404
+ /**
405
+ * Get all sessions subscribed to a specific resource.
406
+ *
407
+ * @param uri - The resource URI
408
+ * @returns Array of session IDs subscribed to this resource
409
+ */
410
+ getSubscribersForResource(uri) {
411
+ const subscribers = [];
412
+ for (const [sessionId, uris] of this.subscriptions) {
413
+ if (uris.has(uri)) {
414
+ subscribers.push(sessionId);
415
+ }
416
+ }
417
+ return subscribers;
418
+ }
419
+ /**
420
+ * Send a resource update notification to subscribed sessions only.
421
+ * Per MCP 2025-11-25 spec, only sessions that have subscribed to this
422
+ * resource via `resources/subscribe` will receive the notification.
423
+ *
424
+ * @param uri - The resource URI that was updated
425
+ */
426
+ notifyResourceUpdated(uri) {
427
+ const subscribers = this.getSubscribersForResource(uri);
428
+ if (subscribers.length === 0) {
429
+ this.logger.verbose(`No subscribers for resource ${uri}, skipping notification`);
430
+ return;
431
+ }
432
+ this.logger.verbose(`Notifying ${subscribers.length} subscriber(s) of resource update: ${uri}`);
433
+ for (const sessionId of subscribers) {
434
+ this.sendNotificationToSession(sessionId, 'notifications/resources/updated', { uri });
435
+ }
436
+ }
437
+ /**
438
+ * Get the number of registered servers.
439
+ */
440
+ get serverCount() {
441
+ return this.servers.size;
442
+ }
443
+ /**
444
+ * Set the minimum log level for a session.
445
+ * Only log messages at or above this level will be sent to the session.
446
+ * Per MCP spec, the default level when not set is determined by the server.
447
+ *
448
+ * @param sessionId - The session to configure
449
+ * @param level - The minimum log level
450
+ * @returns true if the session was found and level was set
451
+ */
452
+ setLogLevel(sessionId, level) {
453
+ if (!this.servers.has(sessionId)) {
454
+ this.logger.warn(`Cannot set log level for unregistered session: ${sessionId.slice(0, 20)}...`);
455
+ return false;
456
+ }
457
+ this.logLevels.set(sessionId, level);
458
+ this.logger.verbose(`Set log level to '${level}' for session ${sessionId.slice(0, 20)}...`);
459
+ return true;
460
+ }
461
+ /**
462
+ * Get the current log level for a session.
463
+ *
464
+ * @param sessionId - The session to query
465
+ * @returns The log level, or undefined if not set
466
+ */
467
+ getLogLevel(sessionId) {
468
+ return this.logLevels.get(sessionId);
469
+ }
470
+ /**
471
+ * Send a log message to all sessions that have enabled the given level.
472
+ * Per MCP 2025-11-25 spec, this sends a 'notifications/message' notification
473
+ * to sessions whose configured minimum level allows this message through.
474
+ *
475
+ * @param level - The log level of this message
476
+ * @param loggerName - Optional logger name/component identifier
477
+ * @param data - The log message data (string or structured data)
478
+ */
479
+ sendLogMessage(level, loggerName, data) {
480
+ const messagePriority = exports.MCP_LOGGING_LEVEL_PRIORITY[level];
481
+ for (const [sessionId, { server }] of this.servers) {
482
+ const sessionLevel = this.logLevels.get(sessionId);
483
+ // If session hasn't set a level, skip (server decides default behavior)
484
+ // Here we default to NOT sending unless explicitly subscribed
485
+ if (!sessionLevel) {
486
+ continue;
487
+ }
488
+ const sessionPriority = exports.MCP_LOGGING_LEVEL_PRIORITY[sessionLevel];
489
+ // Only send if message level >= session's minimum level
490
+ if (messagePriority >= sessionPriority) {
491
+ const params = {
492
+ level,
493
+ data,
494
+ };
495
+ if (loggerName) {
496
+ params['logger'] = loggerName;
497
+ }
498
+ this.sendNotificationToServer(server, sessionId, 'notifications/message', params);
499
+ }
500
+ }
501
+ }
502
+ /**
503
+ * Send a log message to a specific session, respecting its log level.
504
+ *
505
+ * @param sessionId - The target session
506
+ * @param level - The log level of this message
507
+ * @param loggerName - Optional logger name/component identifier
508
+ * @param data - The log message data
509
+ * @returns true if the message was sent (session exists and level allows)
510
+ */
511
+ sendLogMessageToSession(sessionId, level, loggerName, data) {
512
+ const registered = this.servers.get(sessionId);
513
+ if (!registered) {
514
+ return false;
515
+ }
516
+ const sessionLevel = this.logLevels.get(sessionId);
517
+ if (!sessionLevel) {
518
+ // Session hasn't enabled logging
519
+ return false;
520
+ }
521
+ const messagePriority = exports.MCP_LOGGING_LEVEL_PRIORITY[level];
522
+ const sessionPriority = exports.MCP_LOGGING_LEVEL_PRIORITY[sessionLevel];
523
+ if (messagePriority < sessionPriority) {
524
+ // Message level is too verbose for this session
525
+ return false;
526
+ }
527
+ const params = {
528
+ level,
529
+ data,
530
+ };
531
+ if (loggerName) {
532
+ params['logger'] = loggerName;
533
+ }
534
+ this.sendNotificationToServer(registered.server, sessionId, 'notifications/message', params);
535
+ return true;
536
+ }
537
+ // =====================================================
538
+ // Client Capabilities & Roots API (MCP 2025-11-25)
539
+ // =====================================================
540
+ /**
541
+ * Set client capabilities for a session.
542
+ * Called during initialization to store what the client supports.
543
+ *
544
+ * @param sessionId - The session to configure
545
+ * @param capabilities - The client's capabilities from the initialize request
546
+ * @returns true if the session was found and capabilities were set
547
+ */
548
+ setClientCapabilities(sessionId, capabilities) {
549
+ const registered = this.servers.get(sessionId);
550
+ if (!registered) {
551
+ this.logger.warn(`Cannot set client capabilities for unregistered session: ${sessionId.slice(0, 20)}...`);
552
+ return false;
553
+ }
554
+ registered.clientCapabilities = capabilities;
555
+ this.logger.verbose(`Set client capabilities for session ${sessionId.slice(0, 20)}...: roots.listChanged=${capabilities.roots?.listChanged ?? false}`);
556
+ return true;
557
+ }
558
+ /**
559
+ * Get client capabilities for a session.
560
+ *
561
+ * @param sessionId - The session to query
562
+ * @returns The client's capabilities, or undefined if not set
563
+ */
564
+ getClientCapabilities(sessionId) {
565
+ return this.servers.get(sessionId)?.clientCapabilities;
566
+ }
567
+ /**
568
+ * Set client info for a session and auto-detect the AI platform type.
569
+ * Called during initialization to store who the client is.
570
+ * Uses the scope's platform detection configuration for custom mappings.
571
+ *
572
+ * @param sessionId - The session to configure
573
+ * @param clientInfo - The client's info (name/version) from the initialize request
574
+ * @returns The detected platform type, or undefined if the session was not found
575
+ */
576
+ setClientInfo(sessionId, clientInfo) {
577
+ const registered = this.servers.get(sessionId);
578
+ if (!registered) {
579
+ this.logger.warn(`Cannot set client info for unregistered session: ${sessionId.slice(0, 20)}...`);
580
+ return undefined;
581
+ }
582
+ registered.clientInfo = clientInfo;
583
+ // Use platform detection config from scope if available
584
+ const platformDetectionConfig = this.scope.metadata?.session?.platformDetection;
585
+ registered.platformType = detectAIPlatform(clientInfo, platformDetectionConfig);
586
+ this.logger.verbose(`Set client info for session ${sessionId.slice(0, 20)}...: name=${clientInfo.name}, version=${clientInfo.version}, platform=${registered.platformType}`);
587
+ return registered.platformType;
588
+ }
589
+ /**
590
+ * Get client info for a session.
591
+ *
592
+ * @param sessionId - The session to query
593
+ * @returns The client's info, or undefined if not set
594
+ */
595
+ getClientInfo(sessionId) {
596
+ return this.servers.get(sessionId)?.clientInfo;
597
+ }
598
+ /**
599
+ * Get the detected AI platform type for a session.
600
+ * This is auto-detected from client info during initialization.
601
+ *
602
+ * @param sessionId - The session to query
603
+ * @returns The detected platform type, or 'unknown' if not detected
604
+ */
605
+ getPlatformType(sessionId) {
606
+ const session = this.servers.get(sessionId);
607
+ return session?.platformType ?? 'unknown';
608
+ }
609
+ /**
610
+ * Check if a session's client supports roots listing.
611
+ *
612
+ * @param sessionId - The session to check
613
+ * @returns true if the client supports roots
614
+ */
615
+ supportsRoots(sessionId) {
616
+ const capabilities = this.getClientCapabilities(sessionId);
617
+ return capabilities?.roots !== undefined;
618
+ }
619
+ /**
620
+ * List roots from the client for a session.
621
+ * This sends a `roots/list` request to the client and returns the roots.
622
+ *
623
+ * If the client doesn't support roots, returns an empty array.
624
+ * Results are cached and invalidated when `notifications/roots/list_changed` is received.
625
+ *
626
+ * @param sessionId - The session to request roots from
627
+ * @param options - Options for the request
628
+ * @param options.forceRefresh - If true, bypass the cache and fetch fresh roots
629
+ * @param options.timeout - Timeout in milliseconds (default: 30000)
630
+ * @returns Array of roots from the client
631
+ */
632
+ async listRoots(sessionId, options) {
633
+ const registered = this.servers.get(sessionId);
634
+ if (!registered) {
635
+ this.logger.warn(`Cannot list roots for unregistered session: ${sessionId.slice(0, 20)}...`);
636
+ return [];
637
+ }
638
+ // Check if client supports roots
639
+ if (!this.supportsRoots(sessionId)) {
640
+ this.logger.verbose(`Client for session ${sessionId.slice(0, 20)}... does not support roots`);
641
+ return [];
642
+ }
643
+ // Return cached roots if available and not forcing refresh
644
+ if (!options?.forceRefresh && registered.cachedRoots !== undefined) {
645
+ this.logger.verbose(`Returning cached roots for session ${sessionId.slice(0, 20)}... (${registered.cachedRoots.length} roots)`);
646
+ return registered.cachedRoots;
647
+ }
648
+ try {
649
+ this.logger.verbose(`Requesting roots from client for session ${sessionId.slice(0, 20)}...`);
650
+ // Send roots/list request to client
651
+ const result = await registered.server.request({ method: 'roots/list' }, types_js_1.ListRootsResultSchema, {
652
+ timeout: options?.timeout ?? 30000,
653
+ });
654
+ // Cache the result
655
+ registered.cachedRoots = result.roots;
656
+ registered.rootsFetchedAt = Date.now();
657
+ this.logger.verbose(`Received ${registered.cachedRoots.length} root(s) from client for session ${sessionId.slice(0, 20)}...`);
658
+ return registered.cachedRoots;
659
+ }
660
+ catch (error) {
661
+ this.logger.warn(`Failed to list roots for session ${sessionId.slice(0, 20)}...: ${error instanceof Error ? error.message : 'Unknown error'}`);
662
+ // Return cached roots if available, otherwise empty array
663
+ return registered.cachedRoots ?? [];
664
+ }
665
+ }
666
+ /**
667
+ * Invalidate cached roots for a session.
668
+ * Call this when receiving `notifications/roots/list_changed` from the client.
669
+ *
670
+ * @param sessionId - The session whose roots cache should be invalidated
671
+ * @returns true if the session was found and cache was invalidated
672
+ */
673
+ invalidateRootsCache(sessionId) {
674
+ const registered = this.servers.get(sessionId);
675
+ if (!registered) {
676
+ return false;
677
+ }
678
+ const hadCache = registered.cachedRoots !== undefined;
679
+ registered.cachedRoots = undefined;
680
+ registered.rootsFetchedAt = undefined;
681
+ if (hadCache) {
682
+ this.logger.verbose(`Invalidated roots cache for session ${sessionId.slice(0, 20)}...`);
683
+ }
684
+ return hadCache;
685
+ }
686
+ /**
687
+ * Get the cached roots for a session without fetching from the client.
688
+ *
689
+ * @param sessionId - The session to query
690
+ * @returns Cached roots, or undefined if not cached
691
+ */
692
+ getCachedRoots(sessionId) {
693
+ return this.servers.get(sessionId)?.cachedRoots;
694
+ }
695
+ /**
696
+ * Clean up subscriptions and resources.
697
+ */
698
+ async destroy() {
699
+ this.logger.verbose('Destroying notification service');
700
+ // Unsubscribe from all registry listeners
701
+ for (const unsub of this.unsubscribers) {
702
+ unsub();
703
+ }
704
+ this.unsubscribers.length = 0;
705
+ // Clear server registrations, resource subscriptions, log levels, and terminated sessions
706
+ this.servers.clear();
707
+ this.subscriptions.clear();
708
+ this.logLevels.clear();
709
+ this.terminatedSessions.clear();
710
+ this.logger.info('Notification service destroyed');
711
+ }
712
+ sendNotificationToServer(server, sessionId, method, params) {
713
+ try {
714
+ // MCP SDK's server.notification() sends a JSON-RPC notification
715
+ server.notification({ method, params: params ?? {} });
716
+ this.logger.verbose(`Sent ${method} to session ${sessionId.slice(0, 20)}...`);
717
+ }
718
+ catch (error) {
719
+ // Connection may have closed; log and continue
720
+ this.logger.warn(`Failed to send notification ${method} to session ${sessionId.slice(0, 20)}...: ${error instanceof Error ? error.message : 'Unknown error'}`);
721
+ // Optionally unregister dead sessions
722
+ this.unregisterServer(sessionId);
723
+ }
724
+ }
725
+ }
726
+ exports.NotificationService = NotificationService;
727
+ //# sourceMappingURL=notification.service.js.map