@frontmcp/sdk 0.4.0 → 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 +111 -10
  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,45 @@
1
+ import { FlowBase, FlowRunOptions } from '../../common';
2
+ import { z } from 'zod';
3
+ declare const inputSchema: z.ZodObject<{
4
+ request: z.ZodObject<{
5
+ method: z.ZodLiteral<"resources/subscribe">;
6
+ params: z.ZodObject<{
7
+ _meta: z.ZodOptional<z.ZodObject<{
8
+ progressToken: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
9
+ }, z.core.$loose>>;
10
+ uri: z.ZodString;
11
+ }, z.core.$loose>;
12
+ }, z.core.$strip>;
13
+ ctx: z.ZodUnknown;
14
+ }, z.core.$strip>;
15
+ declare const outputSchema: z.ZodObject<{
16
+ _meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
17
+ }, z.core.$strict>;
18
+ declare const stateSchema: z.ZodObject<{
19
+ input: z.ZodObject<{
20
+ uri: z.ZodString;
21
+ }, z.core.$strip>;
22
+ sessionId: z.ZodString;
23
+ output: z.ZodObject<{
24
+ _meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
25
+ }, z.core.$strict>;
26
+ }, z.core.$strip>;
27
+ declare const plan: {
28
+ readonly pre: ["parseInput", "validateResource"];
29
+ readonly execute: ["subscribe"];
30
+ readonly finalize: ["finalize"];
31
+ };
32
+ declare global {
33
+ interface ExtendFlows {
34
+ 'resources:subscribe': FlowRunOptions<SubscribeResourceFlow, typeof plan, typeof inputSchema, typeof outputSchema, typeof stateSchema>;
35
+ }
36
+ }
37
+ declare const name: "resources:subscribe";
38
+ export default class SubscribeResourceFlow extends FlowBase<typeof name> {
39
+ logger: import("../../common").FrontMcpLogger;
40
+ parseInput(): Promise<void>;
41
+ validateResource(): Promise<void>;
42
+ subscribe(): Promise<void>;
43
+ finalize(): Promise<void>;
44
+ }
45
+ export {};
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/resource/flows/subscribe-resource.flow.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("../../common");
6
+ const zod_1 = require("zod");
7
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
8
+ const errors_1 = require("../../errors");
9
+ const inputSchema = zod_1.z.object({
10
+ request: types_js_1.SubscribeRequestSchema,
11
+ ctx: zod_1.z.unknown(),
12
+ });
13
+ const outputSchema = types_js_1.EmptyResultSchema;
14
+ const stateSchema = zod_1.z.object({
15
+ input: zod_1.z.object({
16
+ uri: zod_1.z.string().min(1),
17
+ }),
18
+ sessionId: zod_1.z.string(),
19
+ output: outputSchema,
20
+ });
21
+ const plan = {
22
+ pre: ['parseInput', 'validateResource'],
23
+ execute: ['subscribe'],
24
+ finalize: ['finalize'],
25
+ };
26
+ const name = 'resources:subscribe';
27
+ const { Stage } = (0, common_1.FlowHooksOf)(name);
28
+ let SubscribeResourceFlow = class SubscribeResourceFlow extends common_1.FlowBase {
29
+ logger = this.scopeLogger.child('SubscribeResourceFlow');
30
+ async parseInput() {
31
+ this.logger.verbose('parseInput:start');
32
+ let method;
33
+ let params;
34
+ let ctx;
35
+ try {
36
+ const inputData = inputSchema.parse(this.rawInput);
37
+ method = inputData.request.method;
38
+ params = inputData.request.params;
39
+ ctx = inputData.ctx;
40
+ }
41
+ catch (e) {
42
+ throw new errors_1.InvalidInputError('Invalid Input', e instanceof zod_1.z.ZodError ? e.issues : undefined);
43
+ }
44
+ if (method !== 'resources/subscribe') {
45
+ this.logger.warn(`parseInput: invalid method "${method}"`);
46
+ throw new errors_1.InvalidMethodError(method, 'resources/subscribe');
47
+ }
48
+ // Get session ID from context - required for subscription tracking
49
+ const sessionId = ctx?.['sessionId'];
50
+ if (!sessionId || typeof sessionId !== 'string') {
51
+ this.logger.warn('parseInput: sessionId not found in context');
52
+ throw new errors_1.InvalidInputError('Session ID is required for resource subscriptions');
53
+ }
54
+ this.state.set({ input: params, sessionId });
55
+ this.logger.verbose('parseInput:done');
56
+ }
57
+ async validateResource() {
58
+ this.logger.verbose('validateResource:start');
59
+ const { uri } = this.state.required.input;
60
+ this.logger.info(`validateResource: checking resource with URI "${uri}"`);
61
+ // Verify the resource exists before allowing subscription
62
+ const match = this.scope.resources.findResourceForUri(uri);
63
+ if (!match) {
64
+ this.logger.warn(`validateResource: resource for URI "${uri}" not found`);
65
+ throw new errors_1.ResourceNotFoundError(uri);
66
+ }
67
+ this.logger.verbose('validateResource:done');
68
+ }
69
+ async subscribe() {
70
+ this.logger.verbose('subscribe:start');
71
+ const { uri } = this.state.required.input;
72
+ const { sessionId } = this.state.required;
73
+ const isNew = this.scope.notifications.subscribeResource(sessionId, uri);
74
+ if (isNew) {
75
+ this.logger.info(`subscribe: session subscribed to resource ${uri}`);
76
+ }
77
+ else {
78
+ this.logger.verbose(`subscribe: session already subscribed to resource ${uri}`);
79
+ }
80
+ this.logger.verbose('subscribe:done');
81
+ }
82
+ async finalize() {
83
+ this.logger.verbose('finalize:start');
84
+ // Per MCP spec, resources/subscribe returns an empty result
85
+ this.respond({});
86
+ this.logger.verbose('finalize:done');
87
+ }
88
+ };
89
+ tslib_1.__decorate([
90
+ Stage('parseInput'),
91
+ tslib_1.__metadata("design:type", Function),
92
+ tslib_1.__metadata("design:paramtypes", []),
93
+ tslib_1.__metadata("design:returntype", Promise)
94
+ ], SubscribeResourceFlow.prototype, "parseInput", null);
95
+ tslib_1.__decorate([
96
+ Stage('validateResource'),
97
+ tslib_1.__metadata("design:type", Function),
98
+ tslib_1.__metadata("design:paramtypes", []),
99
+ tslib_1.__metadata("design:returntype", Promise)
100
+ ], SubscribeResourceFlow.prototype, "validateResource", null);
101
+ tslib_1.__decorate([
102
+ Stage('subscribe'),
103
+ tslib_1.__metadata("design:type", Function),
104
+ tslib_1.__metadata("design:paramtypes", []),
105
+ tslib_1.__metadata("design:returntype", Promise)
106
+ ], SubscribeResourceFlow.prototype, "subscribe", null);
107
+ tslib_1.__decorate([
108
+ Stage('finalize'),
109
+ tslib_1.__metadata("design:type", Function),
110
+ tslib_1.__metadata("design:paramtypes", []),
111
+ tslib_1.__metadata("design:returntype", Promise)
112
+ ], SubscribeResourceFlow.prototype, "finalize", null);
113
+ SubscribeResourceFlow = tslib_1.__decorate([
114
+ (0, common_1.Flow)({
115
+ name,
116
+ plan,
117
+ inputSchema,
118
+ outputSchema,
119
+ access: 'authorized',
120
+ })
121
+ ], SubscribeResourceFlow);
122
+ exports.default = SubscribeResourceFlow;
123
+ //# sourceMappingURL=subscribe-resource.flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe-resource.flow.js","sourceRoot":"","sources":["../../../../src/resource/flows/subscribe-resource.flow.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/resource/flows/subscribe-resource.flow.ts\n\nimport { Flow, FlowBase, FlowHooksOf, FlowPlan, FlowRunOptions } from '../../common';\nimport { z } from 'zod';\nimport { SubscribeRequestSchema, EmptyResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { InvalidMethodError, InvalidInputError, ResourceNotFoundError } from '../../errors';\n\nconst inputSchema = z.object({\n request: SubscribeRequestSchema,\n ctx: z.unknown(),\n});\n\nconst outputSchema = EmptyResultSchema;\n\nconst stateSchema = z.object({\n input: z.object({\n uri: z.string().min(1),\n }),\n sessionId: z.string(),\n output: outputSchema,\n});\n\nconst plan = {\n pre: ['parseInput', 'validateResource'],\n execute: ['subscribe'],\n finalize: ['finalize'],\n} as const satisfies FlowPlan<string>;\n\ndeclare global {\n interface ExtendFlows {\n 'resources:subscribe': FlowRunOptions<\n SubscribeResourceFlow,\n typeof plan,\n typeof inputSchema,\n typeof outputSchema,\n typeof stateSchema\n >;\n }\n}\n\nconst name = 'resources:subscribe' as const;\nconst { Stage } = FlowHooksOf<'resources:subscribe'>(name);\n\n@Flow({\n name,\n plan,\n inputSchema,\n outputSchema,\n access: 'authorized',\n})\nexport default class SubscribeResourceFlow extends FlowBase<typeof name> {\n logger = this.scopeLogger.child('SubscribeResourceFlow');\n\n @Stage('parseInput')\n async parseInput() {\n this.logger.verbose('parseInput:start');\n\n let method!: string;\n let params: z.infer<typeof SubscribeRequestSchema>['params'];\n let ctx: unknown;\n try {\n const inputData = inputSchema.parse(this.rawInput);\n method = inputData.request.method;\n params = inputData.request.params;\n ctx = inputData.ctx;\n } catch (e) {\n throw new InvalidInputError('Invalid Input', e instanceof z.ZodError ? e.issues : undefined);\n }\n\n if (method !== 'resources/subscribe') {\n this.logger.warn(`parseInput: invalid method \"${method}\"`);\n throw new InvalidMethodError(method, 'resources/subscribe');\n }\n\n // Get session ID from context - required for subscription tracking\n const sessionId = (ctx as Record<string, unknown> | undefined)?.['sessionId'];\n if (!sessionId || typeof sessionId !== 'string') {\n this.logger.warn('parseInput: sessionId not found in context');\n throw new InvalidInputError('Session ID is required for resource subscriptions');\n }\n\n this.state.set({ input: params, sessionId });\n this.logger.verbose('parseInput:done');\n }\n\n @Stage('validateResource')\n async validateResource() {\n this.logger.verbose('validateResource:start');\n\n const { uri } = this.state.required.input;\n this.logger.info(`validateResource: checking resource with URI \"${uri}\"`);\n\n // Verify the resource exists before allowing subscription\n const match = this.scope.resources.findResourceForUri(uri);\n\n if (!match) {\n this.logger.warn(`validateResource: resource for URI \"${uri}\" not found`);\n throw new ResourceNotFoundError(uri);\n }\n\n this.logger.verbose('validateResource:done');\n }\n\n @Stage('subscribe')\n async subscribe() {\n this.logger.verbose('subscribe:start');\n const { uri } = this.state.required.input;\n const { sessionId } = this.state.required;\n\n const isNew = this.scope.notifications.subscribeResource(sessionId, uri);\n\n if (isNew) {\n this.logger.info(`subscribe: session subscribed to resource ${uri}`);\n } else {\n this.logger.verbose(`subscribe: session already subscribed to resource ${uri}`);\n }\n\n this.logger.verbose('subscribe:done');\n }\n\n @Stage('finalize')\n async finalize() {\n this.logger.verbose('finalize:start');\n // Per MCP spec, resources/subscribe returns an empty result\n this.respond({});\n this.logger.verbose('finalize:done');\n }\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import { FlowBase, FlowRunOptions } from '../../common';
2
+ import { z } from 'zod';
3
+ declare const inputSchema: z.ZodObject<{
4
+ request: z.ZodObject<{
5
+ method: z.ZodLiteral<"resources/unsubscribe">;
6
+ params: z.ZodObject<{
7
+ _meta: z.ZodOptional<z.ZodObject<{
8
+ progressToken: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
9
+ }, z.core.$loose>>;
10
+ uri: z.ZodString;
11
+ }, z.core.$loose>;
12
+ }, z.core.$strip>;
13
+ ctx: z.ZodUnknown;
14
+ }, z.core.$strip>;
15
+ declare const outputSchema: z.ZodObject<{
16
+ _meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
17
+ }, z.core.$strict>;
18
+ declare const stateSchema: z.ZodObject<{
19
+ input: z.ZodObject<{
20
+ uri: z.ZodString;
21
+ }, z.core.$strip>;
22
+ sessionId: z.ZodString;
23
+ output: z.ZodObject<{
24
+ _meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
25
+ }, z.core.$strict>;
26
+ }, z.core.$strip>;
27
+ declare const plan: {
28
+ readonly pre: ["parseInput"];
29
+ readonly execute: ["unsubscribe"];
30
+ readonly finalize: ["finalize"];
31
+ };
32
+ declare global {
33
+ interface ExtendFlows {
34
+ 'resources:unsubscribe': FlowRunOptions<UnsubscribeResourceFlow, typeof plan, typeof inputSchema, typeof outputSchema, typeof stateSchema>;
35
+ }
36
+ }
37
+ declare const name: "resources:unsubscribe";
38
+ export default class UnsubscribeResourceFlow extends FlowBase<typeof name> {
39
+ logger: import("../../common").FrontMcpLogger;
40
+ parseInput(): Promise<void>;
41
+ unsubscribe(): Promise<void>;
42
+ finalize(): Promise<void>;
43
+ }
44
+ export {};
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/resource/flows/unsubscribe-resource.flow.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("../../common");
6
+ const zod_1 = require("zod");
7
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
8
+ const errors_1 = require("../../errors");
9
+ const inputSchema = zod_1.z.object({
10
+ request: types_js_1.UnsubscribeRequestSchema,
11
+ ctx: zod_1.z.unknown(),
12
+ });
13
+ const outputSchema = types_js_1.EmptyResultSchema;
14
+ const stateSchema = zod_1.z.object({
15
+ input: zod_1.z.object({
16
+ uri: zod_1.z.string().min(1),
17
+ }),
18
+ sessionId: zod_1.z.string(),
19
+ output: outputSchema,
20
+ });
21
+ const plan = {
22
+ pre: ['parseInput'],
23
+ execute: ['unsubscribe'],
24
+ finalize: ['finalize'],
25
+ };
26
+ const name = 'resources:unsubscribe';
27
+ const { Stage } = (0, common_1.FlowHooksOf)(name);
28
+ let UnsubscribeResourceFlow = class UnsubscribeResourceFlow extends common_1.FlowBase {
29
+ logger = this.scopeLogger.child('UnsubscribeResourceFlow');
30
+ async parseInput() {
31
+ this.logger.verbose('parseInput:start');
32
+ let method;
33
+ let params;
34
+ let ctx;
35
+ try {
36
+ const inputData = inputSchema.parse(this.rawInput);
37
+ method = inputData.request.method;
38
+ params = inputData.request.params;
39
+ ctx = inputData.ctx;
40
+ }
41
+ catch (e) {
42
+ throw new errors_1.InvalidInputError('Invalid Input', e instanceof zod_1.z.ZodError ? e.issues : undefined);
43
+ }
44
+ if (method !== 'resources/unsubscribe') {
45
+ this.logger.warn(`parseInput: invalid method "${method}"`);
46
+ throw new errors_1.InvalidMethodError(method, 'resources/unsubscribe');
47
+ }
48
+ // Get session ID from context - required for subscription tracking
49
+ const sessionId = ctx?.['sessionId'];
50
+ if (!sessionId || typeof sessionId !== 'string') {
51
+ this.logger.warn('parseInput: sessionId not found in context');
52
+ throw new errors_1.InvalidInputError('Session ID is required for resource unsubscriptions');
53
+ }
54
+ this.state.set({ input: params, sessionId });
55
+ this.logger.verbose('parseInput:done');
56
+ }
57
+ async unsubscribe() {
58
+ this.logger.verbose('unsubscribe:start');
59
+ const { uri } = this.state.required.input;
60
+ const { sessionId } = this.state.required;
61
+ // Per MCP spec, unsubscribe should succeed even if the resource doesn't exist
62
+ // or the session wasn't subscribed. We just silently succeed.
63
+ const wasSubscribed = this.scope.notifications.unsubscribeResource(sessionId, uri);
64
+ if (wasSubscribed) {
65
+ this.logger.info(`unsubscribe: session unsubscribed from resource ${uri}`);
66
+ }
67
+ else {
68
+ this.logger.verbose(`unsubscribe: session was not subscribed to resource ${uri}`);
69
+ }
70
+ this.logger.verbose('unsubscribe:done');
71
+ }
72
+ async finalize() {
73
+ this.logger.verbose('finalize:start');
74
+ // Per MCP spec, resources/unsubscribe returns an empty result
75
+ this.respond({});
76
+ this.logger.verbose('finalize:done');
77
+ }
78
+ };
79
+ tslib_1.__decorate([
80
+ Stage('parseInput'),
81
+ tslib_1.__metadata("design:type", Function),
82
+ tslib_1.__metadata("design:paramtypes", []),
83
+ tslib_1.__metadata("design:returntype", Promise)
84
+ ], UnsubscribeResourceFlow.prototype, "parseInput", null);
85
+ tslib_1.__decorate([
86
+ Stage('unsubscribe'),
87
+ tslib_1.__metadata("design:type", Function),
88
+ tslib_1.__metadata("design:paramtypes", []),
89
+ tslib_1.__metadata("design:returntype", Promise)
90
+ ], UnsubscribeResourceFlow.prototype, "unsubscribe", null);
91
+ tslib_1.__decorate([
92
+ Stage('finalize'),
93
+ tslib_1.__metadata("design:type", Function),
94
+ tslib_1.__metadata("design:paramtypes", []),
95
+ tslib_1.__metadata("design:returntype", Promise)
96
+ ], UnsubscribeResourceFlow.prototype, "finalize", null);
97
+ UnsubscribeResourceFlow = tslib_1.__decorate([
98
+ (0, common_1.Flow)({
99
+ name,
100
+ plan,
101
+ inputSchema,
102
+ outputSchema,
103
+ access: 'authorized',
104
+ })
105
+ ], UnsubscribeResourceFlow);
106
+ exports.default = UnsubscribeResourceFlow;
107
+ //# sourceMappingURL=unsubscribe-resource.flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsubscribe-resource.flow.js","sourceRoot":"","sources":["../../../../src/resource/flows/unsubscribe-resource.flow.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/resource/flows/unsubscribe-resource.flow.ts\n\nimport { Flow, FlowBase, FlowHooksOf, FlowPlan, FlowRunOptions } from '../../common';\nimport { z } from 'zod';\nimport { UnsubscribeRequestSchema, EmptyResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { InvalidMethodError, InvalidInputError } from '../../errors';\n\nconst inputSchema = z.object({\n request: UnsubscribeRequestSchema,\n ctx: z.unknown(),\n});\n\nconst outputSchema = EmptyResultSchema;\n\nconst stateSchema = z.object({\n input: z.object({\n uri: z.string().min(1),\n }),\n sessionId: z.string(),\n output: outputSchema,\n});\n\nconst plan = {\n pre: ['parseInput'],\n execute: ['unsubscribe'],\n finalize: ['finalize'],\n} as const satisfies FlowPlan<string>;\n\ndeclare global {\n interface ExtendFlows {\n 'resources:unsubscribe': FlowRunOptions<\n UnsubscribeResourceFlow,\n typeof plan,\n typeof inputSchema,\n typeof outputSchema,\n typeof stateSchema\n >;\n }\n}\n\nconst name = 'resources:unsubscribe' as const;\nconst { Stage } = FlowHooksOf<'resources:unsubscribe'>(name);\n\n@Flow({\n name,\n plan,\n inputSchema,\n outputSchema,\n access: 'authorized',\n})\nexport default class UnsubscribeResourceFlow extends FlowBase<typeof name> {\n logger = this.scopeLogger.child('UnsubscribeResourceFlow');\n\n @Stage('parseInput')\n async parseInput() {\n this.logger.verbose('parseInput:start');\n\n let method!: string;\n let params: z.infer<typeof UnsubscribeRequestSchema>['params'];\n let ctx: unknown;\n try {\n const inputData = inputSchema.parse(this.rawInput);\n method = inputData.request.method;\n params = inputData.request.params;\n ctx = inputData.ctx;\n } catch (e) {\n throw new InvalidInputError('Invalid Input', e instanceof z.ZodError ? e.issues : undefined);\n }\n\n if (method !== 'resources/unsubscribe') {\n this.logger.warn(`parseInput: invalid method \"${method}\"`);\n throw new InvalidMethodError(method, 'resources/unsubscribe');\n }\n\n // Get session ID from context - required for subscription tracking\n const sessionId = (ctx as Record<string, unknown> | undefined)?.['sessionId'];\n if (!sessionId || typeof sessionId !== 'string') {\n this.logger.warn('parseInput: sessionId not found in context');\n throw new InvalidInputError('Session ID is required for resource unsubscriptions');\n }\n\n this.state.set({ input: params, sessionId });\n this.logger.verbose('parseInput:done');\n }\n\n @Stage('unsubscribe')\n async unsubscribe() {\n this.logger.verbose('unsubscribe:start');\n const { uri } = this.state.required.input;\n const { sessionId } = this.state.required;\n\n // Per MCP spec, unsubscribe should succeed even if the resource doesn't exist\n // or the session wasn't subscribed. We just silently succeed.\n const wasSubscribed = this.scope.notifications.unsubscribeResource(sessionId, uri);\n\n if (wasSubscribed) {\n this.logger.info(`unsubscribe: session unsubscribed from resource ${uri}`);\n } else {\n this.logger.verbose(`unsubscribe: session was not subscribed to resource ${uri}`);\n }\n\n this.logger.verbose('unsubscribe:done');\n }\n\n @Stage('finalize')\n async finalize() {\n this.logger.verbose('finalize:start');\n // Per MCP spec, resources/unsubscribe returns an empty result\n this.respond({});\n this.logger.verbose('finalize:done');\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export { default as ResourceRegistry } from './resource.registry';
2
+ export { ResourceInstance } from './resource.instance';
3
+ export * from './resource.events';
4
+ export * from './resource.types';
5
+ export * from './resource.utils';
6
+ export { default as ResourcesListFlow } from './flows/resources-list.flow';
7
+ export { default as ResourceTemplatesListFlow } from './flows/resource-templates-list.flow';
8
+ export { default as ReadResourceFlow } from './flows/read-resource.flow';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/resource/index.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ReadResourceFlow = exports.ResourceTemplatesListFlow = exports.ResourcesListFlow = exports.ResourceInstance = exports.ResourceRegistry = void 0;
5
+ const tslib_1 = require("tslib");
6
+ var resource_registry_1 = require("./resource.registry");
7
+ Object.defineProperty(exports, "ResourceRegistry", { enumerable: true, get: function () { return tslib_1.__importDefault(resource_registry_1).default; } });
8
+ var resource_instance_1 = require("./resource.instance");
9
+ Object.defineProperty(exports, "ResourceInstance", { enumerable: true, get: function () { return resource_instance_1.ResourceInstance; } });
10
+ tslib_1.__exportStar(require("./resource.events"), exports);
11
+ tslib_1.__exportStar(require("./resource.types"), exports);
12
+ tslib_1.__exportStar(require("./resource.utils"), exports);
13
+ // Flows
14
+ var resources_list_flow_1 = require("./flows/resources-list.flow");
15
+ Object.defineProperty(exports, "ResourcesListFlow", { enumerable: true, get: function () { return tslib_1.__importDefault(resources_list_flow_1).default; } });
16
+ var resource_templates_list_flow_1 = require("./flows/resource-templates-list.flow");
17
+ Object.defineProperty(exports, "ResourceTemplatesListFlow", { enumerable: true, get: function () { return tslib_1.__importDefault(resource_templates_list_flow_1).default; } });
18
+ var read_resource_flow_1 = require("./flows/read-resource.flow");
19
+ Object.defineProperty(exports, "ReadResourceFlow", { enumerable: true, get: function () { return tslib_1.__importDefault(read_resource_flow_1).default; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resource/index.ts"],"names":[],"mappings":";AAAA,uCAAuC;;;;AAEvC,yDAAkE;AAAzD,8IAAA,OAAO,OAAoB;AACpC,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,4DAAkC;AAClC,2DAAiC;AACjC,2DAAiC;AAEjC,QAAQ;AACR,mEAA2E;AAAlE,iJAAA,OAAO,OAAqB;AACrC,qFAA4F;AAAnF,kKAAA,OAAO,OAA6B;AAC7C,iEAAyE;AAAhE,+IAAA,OAAO,OAAoB","sourcesContent":["// file: libs/sdk/src/resource/index.ts\n\nexport { default as ResourceRegistry } from './resource.registry';\nexport { ResourceInstance } from './resource.instance';\nexport * from './resource.events';\nexport * from './resource.types';\nexport * from './resource.utils';\n\n// Flows\nexport { default as ResourcesListFlow } from './flows/resources-list.flow';\nexport { default as ResourceTemplatesListFlow } from './flows/resource-templates-list.flow';\nexport { default as ReadResourceFlow } from './flows/read-resource.flow';\n"]}
@@ -0,0 +1,24 @@
1
+ import { ResourceInstance } from './resource.instance';
2
+ export type ResourceChangeKind = 'added' | 'updated' | 'removed' | 'reset';
3
+ /**
4
+ * The scope of a change event.
5
+ * - `global`: Change affects all sessions
6
+ * - `session`: Change affects only a specific session
7
+ */
8
+ export type ResourceChangeScope = 'global' | 'session';
9
+ export type ResourceChangeEvent = {
10
+ kind: ResourceChangeKind;
11
+ /** Whether the change affects all sessions or a specific session */
12
+ changeScope: ResourceChangeScope;
13
+ sessionId?: string;
14
+ relatedRequestId?: string;
15
+ version: number;
16
+ snapshot: readonly ResourceInstance[];
17
+ };
18
+ type Listener = (e: ResourceChangeEvent) => void;
19
+ export declare class ResourceEmitter {
20
+ private listeners;
21
+ on(l: Listener): () => void;
22
+ emit(e: ResourceChangeEvent): void;
23
+ }
24
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/resource/resource.events.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ResourceEmitter = void 0;
5
+ class ResourceEmitter {
6
+ listeners = new Set();
7
+ on(l) {
8
+ this.listeners.add(l);
9
+ return () => this.listeners.delete(l);
10
+ }
11
+ emit(e) {
12
+ for (const l of [...this.listeners])
13
+ l(e);
14
+ }
15
+ }
16
+ exports.ResourceEmitter = ResourceEmitter;
17
+ //# sourceMappingURL=resource.events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.events.js","sourceRoot":"","sources":["../../../src/resource/resource.events.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAyBjD,MAAa,eAAe;IAClB,SAAS,GAAG,IAAI,GAAG,EAAY,CAAC;IAExC,EAAE,CAAC,CAAW;QACZ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,CAAsB;QACzB,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF;AAXD,0CAWC","sourcesContent":["// file: libs/sdk/src/resource/resource.events.ts\n\nimport { ResourceInstance } from './resource.instance';\n\nexport type ResourceChangeKind = 'added' | 'updated' | 'removed' | 'reset';\n\n/**\n * The scope of a change event.\n * - `global`: Change affects all sessions\n * - `session`: Change affects only a specific session\n */\nexport type ResourceChangeScope = 'global' | 'session';\n\nexport type ResourceChangeEvent = {\n kind: ResourceChangeKind;\n /** Whether the change affects all sessions or a specific session */\n changeScope: ResourceChangeScope;\n sessionId?: string;\n relatedRequestId?: string;\n version: number;\n snapshot: readonly ResourceInstance[];\n};\n\ntype Listener = (e: ResourceChangeEvent) => void;\n\nexport class ResourceEmitter {\n private listeners = new Set<Listener>();\n\n on(l: Listener): () => void {\n this.listeners.add(l);\n return () => this.listeners.delete(l);\n }\n\n emit(e: ResourceChangeEvent) {\n for (const l of [...this.listeners]) l(e);\n }\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import { EntryOwnerRef, ResourceEntry, ResourceReadExtra, ParsedResourceResult, ResourceSafeTransformResult, ResourceRecord, ResourceContext, ResourceMetadata, ResourceTemplateMetadata, ResourceTemplateRecord } from '../common';
2
+ import ProviderRegistry from '../provider/provider.registry';
3
+ import HookRegistry from '../hooks/hook.registry';
4
+ import { Scope } from '../scope';
5
+ export declare class ResourceInstance<Params extends Record<string, string> = Record<string, string>, Out = unknown> extends ResourceEntry<Params, Out> {
6
+ private readonly providers;
7
+ readonly scope: Scope;
8
+ readonly hooks: HookRegistry;
9
+ /** Parsed URI template info for template resources */
10
+ private templateInfo?;
11
+ constructor(record: ResourceRecord | ResourceTemplateRecord, providers: ProviderRegistry, owner: EntryOwnerRef);
12
+ protected initialize(): Promise<void>;
13
+ getMetadata(): ResourceMetadata | ResourceTemplateMetadata;
14
+ /**
15
+ * Match a URI against this resource.
16
+ * For static resources: exact match against uri
17
+ * For templates: pattern match and extract parameters
18
+ */
19
+ matchUri(uri: string): {
20
+ matches: boolean;
21
+ params: Params;
22
+ };
23
+ /**
24
+ * Create a resource context (class or function wrapper).
25
+ */
26
+ create(uri: string, params: Params, ctx: ResourceReadExtra): ResourceContext<Params, Out>;
27
+ /**
28
+ * Convert the raw resource return value into an MCP ReadResourceResult.
29
+ */
30
+ parseOutput(raw: Out): ParsedResourceResult;
31
+ /**
32
+ * Safe version of parseOutput that returns success/error instead of throwing.
33
+ */
34
+ safeParseOutput(raw: Out): ResourceSafeTransformResult<ParsedResourceResult>;
35
+ }
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/resource/resource.instance.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ResourceInstance = void 0;
5
+ const common_1 = require("../common");
6
+ const hooks_utils_1 = require("../hooks/hooks.utils");
7
+ const resource_utils_1 = require("./resource.utils");
8
+ const mcp_error_1 = require("../errors/mcp.error");
9
+ class ResourceInstance extends common_1.ResourceEntry {
10
+ providers;
11
+ scope;
12
+ hooks;
13
+ /** Parsed URI template info for template resources */
14
+ templateInfo;
15
+ constructor(record, providers, owner) {
16
+ super(record);
17
+ this.owner = owner;
18
+ this.providers = providers;
19
+ this.name = record.metadata.name;
20
+ this.fullName = this.owner.id + ':' + this.name;
21
+ this.scope = this.providers.getActiveScope();
22
+ this.hooks = this.scope.providers.getHooksRegistry();
23
+ // Determine if this is a template resource
24
+ this.isTemplate = 'uriTemplate' in record.metadata;
25
+ if (this.isTemplate) {
26
+ const templateMetadata = record.metadata;
27
+ this.uriTemplate = templateMetadata.uriTemplate;
28
+ // Pre-parse the URI template for efficient matching
29
+ this.templateInfo = (0, resource_utils_1.parseUriTemplate)(this.uriTemplate);
30
+ }
31
+ else {
32
+ const resourceMetadata = record.metadata;
33
+ this.uri = resourceMetadata.uri;
34
+ }
35
+ this.ready = this.initialize();
36
+ }
37
+ async initialize() {
38
+ // Valid flows for resource hooks
39
+ const validFlows = ['resources:read-resource', 'resources:list-resources', 'resources:list-resource-templates'];
40
+ const allHooks = (0, hooks_utils_1.normalizeHooksFromCls)(this.record.provide);
41
+ // Separate valid and invalid hooks
42
+ const validHooks = allHooks.filter((hook) => validFlows.includes(hook.metadata.flow));
43
+ const invalidHooks = allHooks.filter((hook) => !validFlows.includes(hook.metadata.flow));
44
+ // Throw error for invalid hooks (fail fast)
45
+ if (invalidHooks.length > 0) {
46
+ const className = this.record.provide?.name ?? 'Unknown';
47
+ const invalidFlowNames = invalidHooks.map((h) => h.metadata.flow).join(', ');
48
+ throw new mcp_error_1.InvalidHookFlowError(`Resource "${className}" has hooks for unsupported flows: ${invalidFlowNames}. ` +
49
+ `Only resource flows (${validFlows.join(', ')}) are supported on resource classes.`);
50
+ }
51
+ // Register valid hooks
52
+ if (validHooks.length > 0) {
53
+ await this.hooks.registerHooks(true, ...validHooks);
54
+ }
55
+ }
56
+ getMetadata() {
57
+ return this.record.metadata;
58
+ }
59
+ /**
60
+ * Match a URI against this resource.
61
+ * For static resources: exact match against uri
62
+ * For templates: pattern match and extract parameters
63
+ */
64
+ matchUri(uri) {
65
+ if (this.isTemplate && this.templateInfo && this.uriTemplate) {
66
+ const params = (0, resource_utils_1.matchUriTemplate)(this.uriTemplate, uri);
67
+ if (params) {
68
+ return { matches: true, params: params };
69
+ }
70
+ return { matches: false, params: {} };
71
+ }
72
+ // Static resource: exact match
73
+ if (this.uri === uri) {
74
+ return { matches: true, params: {} };
75
+ }
76
+ return { matches: false, params: {} };
77
+ }
78
+ /**
79
+ * Create a resource context (class or function wrapper).
80
+ */
81
+ create(uri, params, ctx) {
82
+ const metadata = this.metadata;
83
+ const providers = this.providers;
84
+ const scope = this.providers.getActiveScope();
85
+ const logger = scope.logger;
86
+ const authInfo = ctx.authInfo;
87
+ const resourceCtorArgs = {
88
+ metadata,
89
+ uri,
90
+ params,
91
+ providers,
92
+ logger,
93
+ authInfo,
94
+ };
95
+ const record = this.record;
96
+ switch (record.kind) {
97
+ case common_1.ResourceKind.CLASS_TOKEN:
98
+ case common_1.ResourceTemplateKind.CLASS_TOKEN:
99
+ return new record.provide(resourceCtorArgs);
100
+ case common_1.ResourceKind.FUNCTION:
101
+ case common_1.ResourceTemplateKind.FUNCTION:
102
+ return new FunctionResourceContext(record, resourceCtorArgs);
103
+ default:
104
+ // This should be unreachable if all ResourceKind and ResourceTemplateKind values are handled
105
+ throw new Error(`Unhandled resource kind: ${record.kind}`);
106
+ }
107
+ }
108
+ /**
109
+ * Convert the raw resource return value into an MCP ReadResourceResult.
110
+ */
111
+ parseOutput(raw) {
112
+ const uri = this.isTemplate ? this.uriTemplate : this.uri;
113
+ const mimeType = this.metadata.mimeType;
114
+ // If raw is already in ReadResourceResult format
115
+ if (raw && typeof raw === 'object' && 'contents' in raw) {
116
+ return raw;
117
+ }
118
+ // If raw is an array, assume it's an array of content items
119
+ if (Array.isArray(raw)) {
120
+ const contents = raw.map((item, index) => {
121
+ if (item && typeof item === 'object' && ('text' in item || 'blob' in item)) {
122
+ const itemUri = item['uri'] || `${uri}#${index}`;
123
+ const itemMimeType = item['mimeType'] || mimeType;
124
+ if ('text' in item) {
125
+ return { uri: itemUri, mimeType: itemMimeType, text: item['text'] };
126
+ }
127
+ return { uri: itemUri, mimeType: itemMimeType, blob: item['blob'] };
128
+ }
129
+ return (0, resource_utils_1.buildParsedResourceResult)(`${uri}#${index}`, item, mimeType);
130
+ });
131
+ return { contents };
132
+ }
133
+ // Single content item
134
+ const content = (0, resource_utils_1.buildParsedResourceResult)(uri, raw, mimeType);
135
+ return { contents: [content] };
136
+ }
137
+ /**
138
+ * Safe version of parseOutput that returns success/error instead of throwing.
139
+ */
140
+ safeParseOutput(raw) {
141
+ try {
142
+ return { success: true, data: this.parseOutput(raw) };
143
+ }
144
+ catch (error) {
145
+ return { success: false, error: error instanceof Error ? error : new Error(String(error)) };
146
+ }
147
+ }
148
+ }
149
+ exports.ResourceInstance = ResourceInstance;
150
+ /**
151
+ * Resource context for function-decorated resources.
152
+ */
153
+ class FunctionResourceContext extends common_1.ResourceContext {
154
+ record;
155
+ constructor(record, args) {
156
+ super(args);
157
+ this.record = record;
158
+ }
159
+ execute(uri, params) {
160
+ return this.record.provide(uri, params, this);
161
+ }
162
+ }
163
+ //# sourceMappingURL=resource.instance.js.map