@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
@@ -1,62 +1,172 @@
1
1
  "use strict";
2
+ /**
3
+ * Flow Hook Decorators
4
+ *
5
+ * This module provides decorators for defining flow stages and lifecycle hooks.
6
+ * Supports both legacy TypeScript decorators and TC39 Stage 3 decorators.
7
+ */
2
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.resolvePendingTC39HooksForClass = resolvePendingTC39HooksForClass;
10
+ exports.registerPendingTC39Hook = registerPendingTC39Hook;
11
+ exports.consumePendingTC39Hooks = consumePendingTC39Hooks;
3
12
  exports.StageHookOf = StageHookOf;
4
13
  exports.WillHookOf = WillHookOf;
5
14
  exports.DidHookOf = DidHookOf;
6
15
  exports.AroundHookOf = AroundHookOf;
7
16
  exports.FlowHooksOf = FlowHooksOf;
8
17
  const tokens_1 = require("../tokens");
9
- function registerFlowHook(target, meta) {
10
- const ctor = target.constructor;
18
+ const decorator_utils_1 = require("./decorator-utils");
19
+ /**
20
+ * Pending metadata registry for TC39 decorators
21
+ * Stores hook metadata keyed by method function until class is processed
22
+ */
23
+ const pendingHookRegistry = new decorator_utils_1.PendingMetadataRegistry();
24
+ /**
25
+ * Register hook metadata on a class constructor
26
+ */
27
+ function registerHookOnClass(ctor, meta) {
11
28
  const arr = Reflect.getMetadata(tokens_1.FrontMcpFlowHookTokens.hooks, ctor) ?? [];
12
29
  arr.push(meta);
13
30
  Reflect.defineMetadata(tokens_1.FrontMcpFlowHookTokens.hooks, arr, ctor);
14
31
  }
15
- /** Base factory (kept internal) */
32
+ /**
33
+ * Resolve all pending TC39 hooks for a class by scanning its prototype
34
+ * This is called by collectFlowHookMap during flow registration
35
+ */
36
+ function resolvePendingTC39HooksForClass(ctor) {
37
+ return pendingHookRegistry.resolveForClass(ctor);
38
+ }
39
+ /**
40
+ * Store a pending hook for TC39 mode
41
+ * @internal
42
+ */
43
+ function registerPendingTC39Hook(method, meta) {
44
+ pendingHookRegistry.store(method, meta);
45
+ }
46
+ /**
47
+ * Get and clear pending hooks for a method (TC39 mode)
48
+ * @internal
49
+ */
50
+ function consumePendingTC39Hooks(method) {
51
+ return pendingHookRegistry.consume(method);
52
+ }
53
+ /**
54
+ * Base factory for creating hook decorators
55
+ * Works with both legacy TypeScript and TC39 Stage 3 decorators
56
+ */
16
57
  function make(flow, type) {
17
58
  return function (stage, opts = {}) {
18
- return (target, key, _desc) => {
59
+ return (target, keyOrContext, _desc) => {
19
60
  const { priority = 0, filter, ...rest } = opts;
20
- registerFlowHook(target, {
21
- ...rest,
22
- [tokens_1.FrontMcpFlowHookTokens.type]: true,
23
- flow: flow,
24
- type: type,
25
- stage: stage,
26
- method: String(key),
27
- priority: priority,
28
- filter: filter,
29
- target: target,
30
- static: Boolean(target.constructor[key]),
31
- });
61
+ // Detect TC39 Stage 3 decorators vs legacy TypeScript decorators
62
+ if ((0, decorator_utils_1.isTC39MethodContext)(keyOrContext)) {
63
+ // TC39 Stage 3 decorator style
64
+ const context = keyOrContext;
65
+ const methodName = String(context.name);
66
+ const isStatic = context.static;
67
+ const method = target; // In TC39, target is the method function itself
68
+ const meta = {
69
+ ...rest,
70
+ [tokens_1.FrontMcpFlowHookTokens.type]: true,
71
+ flow: flow,
72
+ type: type,
73
+ stage: stage,
74
+ method: methodName,
75
+ priority: priority,
76
+ filter: filter,
77
+ target: null, // Will be resolved at execution time
78
+ static: isStatic,
79
+ };
80
+ // Store as pending - resolved when collectFlowHookMap processes the class
81
+ pendingHookRegistry.store(method, meta);
82
+ // Return the original method unchanged
83
+ return target;
84
+ }
85
+ else {
86
+ // Legacy TypeScript decorator style
87
+ const key = keyOrContext;
88
+ const methodName = String(key);
89
+ const isStatic = typeof target === 'function';
90
+ const ctor = isStatic ? target : target.constructor;
91
+ const meta = {
92
+ ...rest,
93
+ [tokens_1.FrontMcpFlowHookTokens.type]: true,
94
+ flow: flow,
95
+ type: type,
96
+ stage: stage,
97
+ method: methodName,
98
+ priority: priority,
99
+ filter: filter,
100
+ target: target,
101
+ static: isStatic,
102
+ };
103
+ // Register immediately on the class
104
+ registerHookOnClass(ctor, meta);
105
+ return undefined;
106
+ }
32
107
  };
33
108
  };
34
109
  }
35
- /** NEW: typed variants */
110
+ /**
111
+ * Creates a typed Stage hook decorator for a specific flow
112
+ * @example
113
+ * ```typescript
114
+ * const { Stage } = FlowHooksOf('http:request');
115
+ *
116
+ * class HttpRequestFlow {
117
+ * @Stage('checkAuthorization')
118
+ * async checkAuthorization() { ... }
119
+ * }
120
+ * ```
121
+ */
36
122
  function StageHookOf(flow) {
37
123
  const base = make(flow, 'stage');
38
124
  return function (stage, opts = {}) {
39
125
  return base(stage, opts);
40
126
  };
41
127
  }
128
+ /**
129
+ * Creates a typed Will hook decorator (runs before stage)
130
+ */
42
131
  function WillHookOf(flow) {
43
132
  const base = make(flow, 'will');
44
133
  return function (stage, opts = {}) {
45
134
  return base(stage, opts);
46
135
  };
47
136
  }
137
+ /**
138
+ * Creates a typed Did hook decorator (runs after stage)
139
+ */
48
140
  function DidHookOf(flow) {
49
141
  const base = make(flow, 'did');
50
142
  return function (stage, opts = {}) {
51
143
  return base(stage, opts);
52
144
  };
53
145
  }
146
+ /**
147
+ * Creates a typed Around hook decorator (wraps stage execution)
148
+ */
54
149
  function AroundHookOf(name) {
55
150
  const base = make(name, 'around');
56
151
  return function (stage, opts = {}) {
57
152
  return base(stage, opts);
58
153
  };
59
154
  }
155
+ /**
156
+ * Creates all hook decorators for a specific flow
157
+ * @example
158
+ * ```typescript
159
+ * const { Stage, Will, Did, Around } = FlowHooksOf('http:request');
160
+ *
161
+ * class HttpRequestFlow {
162
+ * @Stage('checkAuthorization')
163
+ * async checkAuthorization() { ... }
164
+ *
165
+ * @Will('execute', { priority: 10 })
166
+ * async beforeExecute() { ... }
167
+ * }
168
+ * ```
169
+ */
60
170
  function FlowHooksOf(name) {
61
171
  return {
62
172
  Stage: StageHookOf(name),
@@ -1 +1 @@
1
- {"version":3,"file":"hook.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/hook.decorator.ts"],"names":[],"mappings":";;AAiCA,kCAOC;AAED,gCAOC;AAED,8BAOC;AAED,oCAOC;AAED,kCAOC;AA3ED,sCAAiD;AAGjD,SAAS,gBAAgB,CAAC,MAAW,EAAE,IAAkB;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,+BAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,mCAAmC;AACnC,SAAS,IAAI,CAAC,IAAc,EAAE,IAAmB;IAC/C,OAAO,UAAoD,KAAQ,EAAE,OAAyB,EAAE;QAC9F,OAAO,CAAC,MAAW,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YACjC,MAAM,EAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAC,GAAG,IAAI,CAAC;YAC7C,gBAAgB,CAAC,MAAM,EAAE;gBACvB,GAAG,IAAI;gBACP,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,IAAI;gBACnC,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aACzC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,0BAA0B;AAC1B,SAAgB,WAAW,CAAwB,IAAU;IAG3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,UAAU,CAAwB,IAAU;IAG1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CAAwB,IAAU;IAGzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAAwB,IAAU;IAG5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAwB,IAAU;IAC3D,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QACtB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC;QACpB,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["import {HookStageType, HookOptions, FlowName, HookMetadata} from '../metadata';\nimport {FrontMcpFlowHookTokens} from '../tokens';\n\n\nfunction registerFlowHook(target: any, meta: HookMetadata) {\n const ctor = target.constructor;\n const arr = Reflect.getMetadata(FrontMcpFlowHookTokens.hooks, ctor) ?? [];\n arr.push(meta);\n Reflect.defineMetadata(FrontMcpFlowHookTokens.hooks, arr, ctor);\n}\n\n/** Base factory (kept internal) */\nfunction make(flow: FlowName, type: HookStageType) {\n return function <Ctx = unknown, T extends string = string>(stage: T, opts: HookOptions<Ctx> = {}): MethodDecorator {\n return (target: any, key, _desc) => {\n const {priority = 0, filter, ...rest} = opts;\n registerFlowHook(target, {\n ...rest,\n [FrontMcpFlowHookTokens.type]: true,\n flow: flow,\n type: type,\n stage: stage,\n method: String(key),\n priority: priority,\n filter: filter,\n target: target,\n static: Boolean(target.constructor[key]),\n });\n };\n };\n}\n\n/** NEW: typed variants */\nexport function StageHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage']\n type Ctx = ExtendFlows[Name]['ctx']\n const base = make(flow, 'stage');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\nexport function WillHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage']\n type Ctx = ExtendFlows[Name]['ctx']\n const base = make(flow, 'will');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\nexport function DidHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage']\n type Ctx = ExtendFlows[Name]['ctx']\n const base = make(flow, 'did');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\nexport function AroundHookOf<Name extends FlowName>(name: Name) {\n type T = ExtendFlows[Name]['stage']\n type Ctx = ExtendFlows[Name]['ctx']\n const base = make(name, 'around');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\nexport function FlowHooksOf<Name extends FlowName>(name: Name) {\n return {\n Stage: StageHookOf(name),\n Will: WillHookOf(name),\n Did: DidHookOf(name),\n Around: AroundHookOf(name),\n };\n}\n\n"]}
1
+ {"version":3,"file":"hook.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/hook.decorator.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAyBH,0EAEC;AAMD,0DAEC;AAMD,0DAEC;AA8ED,kCAOC;AAKD,gCAOC;AAKD,8BAOC;AAKD,oCAOC;AAiBD,kCAOC;AAzLD,sCAAmD;AACnD,uDAAyG;AAEzG;;;GAGG;AACH,MAAM,mBAAmB,GAAG,IAAI,yCAAuB,EAAgB,CAAC;AAExE;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAc,EAAE,IAAkB;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,+BAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,SAAgB,+BAA+B,CAAC,IAAc;IAC5D,OAAO,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAgB,EAAE,IAAkB;IAC1E,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAgB;IACtD,OAAO,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAS,IAAI,CAAC,IAAc,EAAE,IAAmB;IAC/C,OAAO,UAAoD,KAAQ,EAAE,OAAyB,EAAE;QAC9F,OAAO,CAAC,MAAW,EAAE,YAAiB,EAAE,KAA0B,EAAO,EAAE;YACzE,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YAE/C,iEAAiE;YACjE,IAAI,IAAA,qCAAmB,EAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,+BAA+B;gBAC/B,MAAM,OAAO,GAAG,YAAiC,CAAC;gBAClD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;gBAChC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,gDAAgD;gBAEvE,MAAM,IAAI,GAAiB;oBACzB,GAAG,IAAI;oBACP,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,IAAI;oBACnC,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,IAAI,EAAE,qCAAqC;oBACnD,MAAM,EAAE,QAAQ;iBACjB,CAAC;gBAEF,0EAA0E;gBAC1E,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAExC,uCAAuC;gBACvC,OAAO,MAAM,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,MAAM,GAAG,GAAG,YAAY,CAAC;gBACzB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC;gBAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gBAEpD,MAAM,IAAI,GAAiB;oBACzB,GAAG,IAAI;oBACP,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,IAAI;oBACnC,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,QAAQ;iBACjB,CAAC;gBAEF,oCAAoC;gBACpC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEhC,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,WAAW,CAAwB,IAAU;IAG3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAwB,IAAU;IAG1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAwB,IAAU;IAGzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAwB,IAAU;IAG5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,WAAW,CAAwB,IAAU;IAC3D,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QACtB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC;QACpB,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Flow Hook Decorators\n *\n * This module provides decorators for defining flow stages and lifecycle hooks.\n * Supports both legacy TypeScript decorators and TC39 Stage 3 decorators.\n */\n\nimport { HookStageType, HookOptions, FlowName, HookMetadata } from '../metadata';\nimport { FrontMcpFlowHookTokens } from '../tokens';\nimport { isTC39MethodContext, PendingMetadataRegistry, type TC39MethodContext } from './decorator-utils';\n\n/**\n * Pending metadata registry for TC39 decorators\n * Stores hook metadata keyed by method function until class is processed\n */\nconst pendingHookRegistry = new PendingMetadataRegistry<HookMetadata>();\n\n/**\n * Register hook metadata on a class constructor\n */\nfunction registerHookOnClass(ctor: Function, meta: HookMetadata): void {\n const arr = Reflect.getMetadata(FrontMcpFlowHookTokens.hooks, ctor) ?? [];\n arr.push(meta);\n Reflect.defineMetadata(FrontMcpFlowHookTokens.hooks, arr, ctor);\n}\n\n/**\n * Resolve all pending TC39 hooks for a class by scanning its prototype\n * This is called by collectFlowHookMap during flow registration\n */\nexport function resolvePendingTC39HooksForClass(ctor: Function): HookMetadata[] {\n return pendingHookRegistry.resolveForClass(ctor);\n}\n\n/**\n * Store a pending hook for TC39 mode\n * @internal\n */\nexport function registerPendingTC39Hook(method: Function, meta: HookMetadata): void {\n pendingHookRegistry.store(method, meta);\n}\n\n/**\n * Get and clear pending hooks for a method (TC39 mode)\n * @internal\n */\nexport function consumePendingTC39Hooks(method: Function): HookMetadata[] {\n return pendingHookRegistry.consume(method);\n}\n\n/**\n * Base factory for creating hook decorators\n * Works with both legacy TypeScript and TC39 Stage 3 decorators\n */\nfunction make(flow: FlowName, type: HookStageType) {\n return function <Ctx = unknown, T extends string = string>(stage: T, opts: HookOptions<Ctx> = {}): MethodDecorator {\n return (target: any, keyOrContext: any, _desc?: PropertyDescriptor): any => {\n const { priority = 0, filter, ...rest } = opts;\n\n // Detect TC39 Stage 3 decorators vs legacy TypeScript decorators\n if (isTC39MethodContext(keyOrContext)) {\n // TC39 Stage 3 decorator style\n const context = keyOrContext as TC39MethodContext;\n const methodName = String(context.name);\n const isStatic = context.static;\n const method = target; // In TC39, target is the method function itself\n\n const meta: HookMetadata = {\n ...rest,\n [FrontMcpFlowHookTokens.type]: true,\n flow: flow,\n type: type,\n stage: stage,\n method: methodName,\n priority: priority,\n filter: filter,\n target: null, // Will be resolved at execution time\n static: isStatic,\n };\n\n // Store as pending - resolved when collectFlowHookMap processes the class\n pendingHookRegistry.store(method, meta);\n\n // Return the original method unchanged\n return target;\n } else {\n // Legacy TypeScript decorator style\n const key = keyOrContext;\n const methodName = String(key);\n const isStatic = typeof target === 'function';\n const ctor = isStatic ? target : target.constructor;\n\n const meta: HookMetadata = {\n ...rest,\n [FrontMcpFlowHookTokens.type]: true,\n flow: flow,\n type: type,\n stage: stage,\n method: methodName,\n priority: priority,\n filter: filter,\n target: target,\n static: isStatic,\n };\n\n // Register immediately on the class\n registerHookOnClass(ctor, meta);\n\n return undefined;\n }\n };\n };\n}\n\n/**\n * Creates a typed Stage hook decorator for a specific flow\n * @example\n * ```typescript\n * const { Stage } = FlowHooksOf('http:request');\n *\n * class HttpRequestFlow {\n * @Stage('checkAuthorization')\n * async checkAuthorization() { ... }\n * }\n * ```\n */\nexport function StageHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage'];\n type Ctx = ExtendFlows[Name]['ctx'];\n const base = make(flow, 'stage');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\n/**\n * Creates a typed Will hook decorator (runs before stage)\n */\nexport function WillHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage'];\n type Ctx = ExtendFlows[Name]['ctx'];\n const base = make(flow, 'will');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\n/**\n * Creates a typed Did hook decorator (runs after stage)\n */\nexport function DidHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage'];\n type Ctx = ExtendFlows[Name]['ctx'];\n const base = make(flow, 'did');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\n/**\n * Creates a typed Around hook decorator (wraps stage execution)\n */\nexport function AroundHookOf<Name extends FlowName>(name: Name) {\n type T = ExtendFlows[Name]['stage'];\n type Ctx = ExtendFlows[Name]['ctx'];\n const base = make(name, 'around');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\n/**\n * Creates all hook decorators for a specific flow\n * @example\n * ```typescript\n * const { Stage, Will, Did, Around } = FlowHooksOf('http:request');\n *\n * class HttpRequestFlow {\n * @Stage('checkAuthorization')\n * async checkAuthorization() { ... }\n *\n * @Will('execute', { priority: 10 })\n * async beforeExecute() { ... }\n * }\n * ```\n */\nexport function FlowHooksOf<Name extends FlowName>(name: Name) {\n return {\n Stage: StageHookOf(name),\n Will: WillHookOf(name),\n Did: DidHookOf(name),\n Around: AroundHookOf(name),\n };\n}\n"]}
@@ -4,4 +4,4 @@ import { PluginMetadata } from '../metadata';
4
4
  * Decorator that marks a class as a McpPlugin and provides metadata
5
5
  */
6
6
  declare function FrontMcpPlugin(providedMetadata: PluginMetadata): ClassDecorator;
7
- export { FrontMcpPlugin, FrontMcpPlugin as Plugin, };
7
+ export { FrontMcpPlugin, FrontMcpPlugin as Plugin };
@@ -12,20 +12,21 @@ function FrontMcpPlugin(providedMetadata) {
12
12
  return (target) => {
13
13
  const { error, data: metadata } = metadata_1.frontMcpPluginMetadataSchema.safeParse(providedMetadata);
14
14
  if (error) {
15
- if (error.format().providers) {
16
- throw new Error(`Invalid metadata provided to @FrontMcpProvider or @Provider: \n${JSON.stringify(error.formErrors.fieldErrors['providers'], null, 2)}`);
15
+ const formatted = error.format();
16
+ if (formatted.providers) {
17
+ throw new Error(`Invalid metadata provided to @FrontMcpProvider or @Provider: \n${JSON.stringify(formatted.providers, null, 2)}`);
17
18
  }
18
- if (error.format().adapters) {
19
- throw new Error(`Invalid metadata provided to @FrontMcpAdapter or @Adapter: \n${JSON.stringify(error.format().adapters, null, 2)}`);
19
+ if (formatted.adapters) {
20
+ throw new Error(`Invalid metadata provided to @FrontMcpAdapter or @Adapter: \n${JSON.stringify(formatted.adapters, null, 2)}`);
20
21
  }
21
- if (error.format().tools) {
22
- throw new Error(`Invalid metadata provided to @FrontMcpTool or @Tool: \n${JSON.stringify(error.format().tools, null, 2)}`);
22
+ if (formatted.tools) {
23
+ throw new Error(`Invalid metadata provided to @FrontMcpTool or @Tool: \n${JSON.stringify(formatted.tools, null, 2)}`);
23
24
  }
24
- if (error.format().resources) {
25
- throw new Error(`Invalid metadata provided to @FrontMcpResource or @Resource: \n${JSON.stringify(error.format().resources, null, 2)}`);
25
+ if (formatted.resources) {
26
+ throw new Error(`Invalid metadata provided to @FrontMcpResource or @Resource: \n${JSON.stringify(formatted.resources, null, 2)}`);
26
27
  }
27
- if (error.format().prompts) {
28
- throw new Error(`Invalid metadata provided to @FrontMcpPrompt or @Prompt: \n${JSON.stringify(error.format().prompts, null, 2)}`);
28
+ if (formatted.prompts) {
29
+ throw new Error(`Invalid metadata provided to @FrontMcpPrompt or @Prompt: \n${JSON.stringify(formatted.prompts, null, 2)}`);
29
30
  }
30
31
  throw error;
31
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/plugin.decorator.ts"],"names":[],"mappings":";;AAsCE,wCAAc;AACI,gCAAM;AAvC1B,4BAA0B;AAC1B,sCAAiD;AACjD,0CAA2E;AAE3E;;GAEG;AACH,SAAS,cAAc,CAAC,gBAAgC;IACtD,OAAO,CAAC,MAAgB,EAAE,EAAE;QAE1B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,uCAA4B,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3F,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,kEAAkE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1J,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,gEAAgE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACtI,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,0DAA0D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7H,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,kEAAkE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACzI,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,8DAA8D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACnI,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,6BAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,6BAAoB,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { FrontMcpPluginTokens } from '../tokens';\nimport { PluginMetadata, frontMcpPluginMetadataSchema } from '../metadata';\n\n/**\n * Decorator that marks a class as a McpPlugin and provides metadata\n */\nfunction FrontMcpPlugin(providedMetadata: PluginMetadata): ClassDecorator {\n return (target: Function) => {\n\n const { error, data: metadata } = frontMcpPluginMetadataSchema.safeParse(providedMetadata);\n if (error) {\n if (error.format().providers) {\n throw new Error(`Invalid metadata provided to @FrontMcpProvider or @Provider: \\n${JSON.stringify(error.formErrors.fieldErrors['providers'], null, 2)}`);\n }\n if (error.format().adapters) {\n throw new Error(`Invalid metadata provided to @FrontMcpAdapter or @Adapter: \\n${JSON.stringify(error.format().adapters, null, 2)}`);\n }\n if (error.format().tools) {\n throw new Error(`Invalid metadata provided to @FrontMcpTool or @Tool: \\n${JSON.stringify(error.format().tools, null, 2)}`);\n }\n if (error.format().resources) {\n throw new Error(`Invalid metadata provided to @FrontMcpResource or @Resource: \\n${JSON.stringify(error.format().resources, null, 2)}`);\n }\n if (error.format().prompts) {\n throw new Error(`Invalid metadata provided to @FrontMcpPrompt or @Prompt: \\n${JSON.stringify(error.format().prompts, null, 2)}`);\n }\n throw error;\n }\n\n Reflect.defineMetadata(FrontMcpPluginTokens.type, true, target);\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpPluginTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\nexport {\n FrontMcpPlugin,\n FrontMcpPlugin as Plugin,\n};"]}
1
+ {"version":3,"file":"plugin.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/plugin.decorator.ts"],"names":[],"mappings":";;AAuDS,wCAAc;AAAoB,gCAAM;AAvDjD,4BAA0B;AAC1B,sCAAiD;AACjD,0CAA2E;AAE3E;;GAEG;AACH,SAAS,cAAc,CAAC,gBAAgC;IACtD,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,uCAA4B,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3F,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,kEAAkE,IAAI,CAAC,SAAS,CAC9E,SAAS,CAAC,SAAS,EACnB,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,gEAAgE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAC9G,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACb,0DAA0D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CACrG,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,kEAAkE,IAAI,CAAC,SAAS,CAC9E,SAAS,CAAC,SAAS,EACnB,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,8DAA8D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAC3G,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,6BAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,6BAAoB,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { FrontMcpPluginTokens } from '../tokens';\nimport { PluginMetadata, frontMcpPluginMetadataSchema } from '../metadata';\n\n/**\n * Decorator that marks a class as a McpPlugin and provides metadata\n */\nfunction FrontMcpPlugin(providedMetadata: PluginMetadata): ClassDecorator {\n return (target: Function) => {\n const { error, data: metadata } = frontMcpPluginMetadataSchema.safeParse(providedMetadata);\n if (error) {\n const formatted = error.format();\n if (formatted.providers) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpProvider or @Provider: \\n${JSON.stringify(\n formatted.providers,\n null,\n 2,\n )}`,\n );\n }\n if (formatted.adapters) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpAdapter or @Adapter: \\n${JSON.stringify(formatted.adapters, null, 2)}`,\n );\n }\n if (formatted.tools) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpTool or @Tool: \\n${JSON.stringify(formatted.tools, null, 2)}`,\n );\n }\n if (formatted.resources) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpResource or @Resource: \\n${JSON.stringify(\n formatted.resources,\n null,\n 2,\n )}`,\n );\n }\n if (formatted.prompts) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpPrompt or @Prompt: \\n${JSON.stringify(formatted.prompts, null, 2)}`,\n );\n }\n throw error;\n }\n\n Reflect.defineMetadata(FrontMcpPluginTokens.type, true, target);\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpPluginTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\nexport { FrontMcpPlugin, FrontMcpPlugin as Plugin };\n"]}
@@ -10,8 +10,37 @@ declare function FrontMcpResource(providedMetadata: ResourceMetadata): ClassDeco
10
10
  */
11
11
  declare function FrontMcpResourceTemplate(providedMetadata: ResourceTemplateMetadata): ClassDecorator;
12
12
  export type FrontMcpResourceExecuteHandler = (uri: ReadResourceRequest['params']['uri'], ...tokens: any[]) => ReadResourceResult | Promise<ReadResourceResult>;
13
+ export type FrontMcpResourceTemplateExecuteHandler = (uri: ReadResourceRequest['params']['uri'], params: Record<string, string>, ...tokens: any[]) => ReadResourceResult | Promise<ReadResourceResult>;
13
14
  /**
14
- * Decorator that marks a class as a McpResource module and provides metadata
15
+ * Function builder that creates a function-style static resource.
16
+ * Use for simple resources that don't need class-based context.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const AppConfig = resource({
21
+ * name: 'app-config',
22
+ * uri: 'config://app',
23
+ * mimeType: 'application/json',
24
+ * })((uri) => ({
25
+ * contents: [{ uri, text: JSON.stringify({ version: '1.0.0' }) }]
26
+ * }));
27
+ * ```
28
+ */
29
+ declare function frontMcpResource<T extends ResourceMetadata>(providedMetadata: T): (handler: FrontMcpResourceExecuteHandler) => () => FrontMcpResourceExecuteHandler;
30
+ /**
31
+ * Function builder that creates a function-style resource template.
32
+ * Use for simple templated resources that don't need class-based context.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const UserProfile = resourceTemplate({
37
+ * name: 'user-profile',
38
+ * uriTemplate: 'users://{userId}/profile',
39
+ * mimeType: 'application/json',
40
+ * })((uri, params) => ({
41
+ * contents: [{ uri, text: JSON.stringify({ id: params.userId }) }]
42
+ * }));
43
+ * ```
15
44
  */
16
- declare function frontMcpResource<T extends ResourceMetadata>(providedMetadata: T): (handler: FrontMcpResourceExecuteHandler) => (() => void);
17
- export { FrontMcpResource, FrontMcpResource as Resource, FrontMcpResourceTemplate, FrontMcpResourceTemplate as ResourceTemplate, frontMcpResource, frontMcpResource as resource, };
45
+ declare function frontMcpResourceTemplate<T extends ResourceTemplateMetadata>(providedMetadata: T): (handler: FrontMcpResourceTemplateExecuteHandler) => () => FrontMcpResourceTemplateExecuteHandler;
46
+ export { FrontMcpResource, FrontMcpResource as Resource, FrontMcpResourceTemplate, FrontMcpResourceTemplate as ResourceTemplate, frontMcpResource, frontMcpResource as resource, frontMcpResourceTemplate, frontMcpResourceTemplate as resourceTemplate, };
@@ -6,6 +6,8 @@ exports.FrontMcpResourceTemplate = FrontMcpResourceTemplate;
6
6
  exports.ResourceTemplate = FrontMcpResourceTemplate;
7
7
  exports.frontMcpResource = frontMcpResource;
8
8
  exports.resource = frontMcpResource;
9
+ exports.frontMcpResourceTemplate = frontMcpResourceTemplate;
10
+ exports.resourceTemplate = frontMcpResourceTemplate;
9
11
  require("reflect-metadata");
10
12
  const tokens_1 = require("../tokens");
11
13
  const metadata_1 = require("../metadata");
@@ -34,19 +36,59 @@ function FrontMcpResourceTemplate(providedMetadata) {
34
36
  };
35
37
  }
36
38
  /**
37
- * Decorator that marks a class as a McpResource module and provides metadata
39
+ * Function builder that creates a function-style static resource.
40
+ * Use for simple resources that don't need class-based context.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const AppConfig = resource({
45
+ * name: 'app-config',
46
+ * uri: 'config://app',
47
+ * mimeType: 'application/json',
48
+ * })((uri) => ({
49
+ * contents: [{ uri, text: JSON.stringify({ version: '1.0.0' }) }]
50
+ * }));
51
+ * ```
38
52
  */
39
53
  function frontMcpResource(providedMetadata) {
40
54
  return (execute) => {
41
55
  const metadata = metadata_1.frontMcpResourceMetadataSchema.parse(providedMetadata);
42
- const toolFunction = function () {
56
+ const resourceFunction = function () {
43
57
  return execute;
44
58
  };
45
- Object.assign(toolFunction, {
59
+ Object.assign(resourceFunction, {
46
60
  [tokens_1.FrontMcpResourceTokens.type]: 'function-resource',
47
61
  [tokens_1.FrontMcpResourceTokens.metadata]: metadata,
48
62
  });
49
- return toolFunction;
63
+ return resourceFunction;
64
+ };
65
+ }
66
+ /**
67
+ * Function builder that creates a function-style resource template.
68
+ * Use for simple templated resources that don't need class-based context.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * const UserProfile = resourceTemplate({
73
+ * name: 'user-profile',
74
+ * uriTemplate: 'users://{userId}/profile',
75
+ * mimeType: 'application/json',
76
+ * })((uri, params) => ({
77
+ * contents: [{ uri, text: JSON.stringify({ id: params.userId }) }]
78
+ * }));
79
+ * ```
80
+ */
81
+ function frontMcpResourceTemplate(providedMetadata) {
82
+ return (execute) => {
83
+ const metadata = metadata_1.frontMcpResourceTemplateMetadataSchema.parse(providedMetadata);
84
+ const resourceFunction = function () {
85
+ return execute;
86
+ };
87
+ Object.assign(resourceFunction, {
88
+ [tokens_1.FrontMcpResourceTemplateTokens.type]: 'function-resource-template',
89
+ [tokens_1.FrontMcpResourceTemplateTokens.metadata]: metadata,
90
+ });
91
+ return resourceFunction;
50
92
  };
51
93
  }
52
94
  //# sourceMappingURL=resource.decorator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/resource.decorator.ts"],"names":[],"mappings":";;AA2FE,4CAAgB;AACI,oCAAQ;AAC5B,4DAAwB;AACI,oDAAgB;AAC5C,4CAAgB;AACI,oCAAQ;AAhG9B,4BAA0B;AAC1B,sCAGmB;AACnB,0CAKqB;AAOrB;;GAEG;AACH,SAAS,gBAAgB,CAAC,gBAAkC;IAC1D,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,yCAA8B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAExE,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAElE,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACnG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAGD;;GAEG;AACH,SAAS,wBAAwB,CAAC,gBAA0C;IAC1E,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,iDAAsC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAEhF,OAAO,CAAC,cAAc,CAAC,uCAA8B,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAE1E,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,uCAA8B,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAQD;;GAEG;AACH,SAAS,gBAAgB,CAA6B,gBAAmB;IACvE,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,yCAA8B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG;YACnB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,mBAAmB;YAClD,CAAC,+BAAsB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SAC5C,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport {\n FrontMcpResourceTokens,\n FrontMcpResourceTemplateTokens,\n} from '../tokens';\nimport {\n frontMcpResourceMetadataSchema,\n frontMcpResourceTemplateMetadataSchema,\n ResourceMetadata,\n ResourceTemplateMetadata,\n} from '../metadata';\n\nimport {\n ReadResourceRequest,\n ReadResourceResult,\n} from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Decorator that marks a class as a McpResource module and provides metadata\n */\nfunction FrontMcpResource(providedMetadata: ResourceMetadata): ClassDecorator {\n return (target: Function) => {\n const metadata = frontMcpResourceMetadataSchema.parse(providedMetadata);\n\n Reflect.defineMetadata(FrontMcpResourceTokens.type, true, target);\n\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpResourceTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\n\n/**\n * Decorator that marks a class as a McpResourceTemplate module and provides metadata\n */\nfunction FrontMcpResourceTemplate(providedMetadata: ResourceTemplateMetadata): ClassDecorator {\n return (target: Function) => {\n const metadata = frontMcpResourceTemplateMetadataSchema.parse(providedMetadata);\n\n Reflect.defineMetadata(FrontMcpResourceTemplateTokens.type, true, target);\n\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpResourceTemplateTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\n\nexport type FrontMcpResourceExecuteHandler = (\n uri: ReadResourceRequest['params']['uri'],\n ...tokens: any[]\n) => ReadResourceResult | Promise<ReadResourceResult>;\n\n/**\n * Decorator that marks a class as a McpResource module and provides metadata\n */\nfunction frontMcpResource<T extends ResourceMetadata>(providedMetadata: T): (handler: FrontMcpResourceExecuteHandler) => (() => void) {\n return (execute) => {\n const metadata = frontMcpResourceMetadataSchema.parse(providedMetadata);\n const toolFunction = function () {\n return execute;\n };\n Object.assign(toolFunction, {\n [FrontMcpResourceTokens.type]: 'function-resource',\n [FrontMcpResourceTokens.metadata]: metadata,\n });\n return toolFunction;\n };\n}\n\n//\n// /**\n// * Decorator that marks a class as a McpResource module and provides metadata\n// */\n// function frontMcpResourceTemplate<T extends ResourceMetadata>(providedMetadata: T): (handler: FrontMcpResourceExecuteHandler) => (() => void) {\n// return (execute) => {\n// const metadata = frontMcpResourceMetadataSchema.parse(providedMetadata);\n// const toolFunction = function() {\n// return execute;\n// };\n// Object.assign(toolFunction, {\n// [FrontMcpResourceTokens.type]: 'function-resource',\n// [FrontMcpResourceTokens.metadata]: metadata,\n// });\n// return toolFunction;\n// };\n// }\n\n\nexport {\n FrontMcpResource,\n FrontMcpResource as Resource,\n FrontMcpResourceTemplate,\n FrontMcpResourceTemplate as ResourceTemplate,\n frontMcpResource,\n frontMcpResource as resource,\n};"]}
1
+ {"version":3,"file":"resource.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/resource.decorator.ts"],"names":[],"mappings":";;AAmHE,4CAAgB;AACI,oCAAQ;AAC5B,4DAAwB;AACI,oDAAgB;AAC5C,4CAAgB;AACI,oCAAQ;AAC5B,4DAAwB;AACI,oDAAgB;AA1H9C,4BAA0B;AAC1B,sCAAmF;AACnF,0CAKqB;AAIrB;;GAEG;AACH,SAAS,gBAAgB,CAAC,gBAAkC;IAC1D,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,yCAA8B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAExE,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAElE,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACnG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,gBAA0C;IAC1E,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,iDAAsC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAEhF,OAAO,CAAC,cAAc,CAAC,uCAA8B,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAE1E,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,uCAA8B,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAaD;;;;;;;;;;;;;;GAcG;AACH,SAAS,gBAAgB,CACvB,gBAAmB;IAEnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,yCAA8B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxE,MAAM,gBAAgB,GAAG;YACvB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC9B,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,mBAAmB;YAClD,CAAC,+BAAsB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SAC5C,CAAC,CAAC;QACH,OAAO,gBAAgB,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,wBAAwB,CAC/B,gBAAmB;IAEnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,iDAAsC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChF,MAAM,gBAAgB,GAAG;YACvB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC9B,CAAC,uCAA8B,CAAC,IAAI,CAAC,EAAE,4BAA4B;YACnE,CAAC,uCAA8B,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACpD,CAAC,CAAC;QACH,OAAO,gBAAgB,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { FrontMcpResourceTokens, FrontMcpResourceTemplateTokens } from '../tokens';\nimport {\n frontMcpResourceMetadataSchema,\n frontMcpResourceTemplateMetadataSchema,\n ResourceMetadata,\n ResourceTemplateMetadata,\n} from '../metadata';\n\nimport { ReadResourceRequest, ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Decorator that marks a class as a McpResource module and provides metadata\n */\nfunction FrontMcpResource(providedMetadata: ResourceMetadata): ClassDecorator {\n return (target: Function) => {\n const metadata = frontMcpResourceMetadataSchema.parse(providedMetadata);\n\n Reflect.defineMetadata(FrontMcpResourceTokens.type, true, target);\n\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpResourceTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\n/**\n * Decorator that marks a class as a McpResourceTemplate module and provides metadata\n */\nfunction FrontMcpResourceTemplate(providedMetadata: ResourceTemplateMetadata): ClassDecorator {\n return (target: Function) => {\n const metadata = frontMcpResourceTemplateMetadataSchema.parse(providedMetadata);\n\n Reflect.defineMetadata(FrontMcpResourceTemplateTokens.type, true, target);\n\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpResourceTemplateTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\nexport type FrontMcpResourceExecuteHandler = (\n uri: ReadResourceRequest['params']['uri'],\n ...tokens: any[]\n) => ReadResourceResult | Promise<ReadResourceResult>;\n\nexport type FrontMcpResourceTemplateExecuteHandler = (\n uri: ReadResourceRequest['params']['uri'],\n params: Record<string, string>,\n ...tokens: any[]\n) => ReadResourceResult | Promise<ReadResourceResult>;\n\n/**\n * Function builder that creates a function-style static resource.\n * Use for simple resources that don't need class-based context.\n *\n * @example\n * ```ts\n * const AppConfig = resource({\n * name: 'app-config',\n * uri: 'config://app',\n * mimeType: 'application/json',\n * })((uri) => ({\n * contents: [{ uri, text: JSON.stringify({ version: '1.0.0' }) }]\n * }));\n * ```\n */\nfunction frontMcpResource<T extends ResourceMetadata>(\n providedMetadata: T,\n): (handler: FrontMcpResourceExecuteHandler) => () => FrontMcpResourceExecuteHandler {\n return (execute) => {\n const metadata = frontMcpResourceMetadataSchema.parse(providedMetadata);\n const resourceFunction = function () {\n return execute;\n };\n Object.assign(resourceFunction, {\n [FrontMcpResourceTokens.type]: 'function-resource',\n [FrontMcpResourceTokens.metadata]: metadata,\n });\n return resourceFunction;\n };\n}\n\n/**\n * Function builder that creates a function-style resource template.\n * Use for simple templated resources that don't need class-based context.\n *\n * @example\n * ```ts\n * const UserProfile = resourceTemplate({\n * name: 'user-profile',\n * uriTemplate: 'users://{userId}/profile',\n * mimeType: 'application/json',\n * })((uri, params) => ({\n * contents: [{ uri, text: JSON.stringify({ id: params.userId }) }]\n * }));\n * ```\n */\nfunction frontMcpResourceTemplate<T extends ResourceTemplateMetadata>(\n providedMetadata: T,\n): (handler: FrontMcpResourceTemplateExecuteHandler) => () => FrontMcpResourceTemplateExecuteHandler {\n return (execute) => {\n const metadata = frontMcpResourceTemplateMetadataSchema.parse(providedMetadata);\n const resourceFunction = function () {\n return execute;\n };\n Object.assign(resourceFunction, {\n [FrontMcpResourceTemplateTokens.type]: 'function-resource-template',\n [FrontMcpResourceTemplateTokens.metadata]: metadata,\n });\n return resourceFunction;\n };\n}\n\nexport {\n FrontMcpResource,\n FrontMcpResource as Resource,\n FrontMcpResourceTemplate,\n FrontMcpResourceTemplate as ResourceTemplate,\n frontMcpResource,\n frontMcpResource as resource,\n frontMcpResourceTemplate,\n frontMcpResourceTemplate as resourceTemplate,\n};\n"]}
@@ -1,5 +1,6 @@
1
1
  import 'reflect-metadata';
2
2
  import { ToolMetadata, ImageOutputSchema, AudioOutputSchema, ResourceOutputSchema, ResourceLinkOutputSchema, ToolInputType, ToolOutputType } from '../metadata';
3
+ import type { ToolUIConfig } from '../metadata/tool-ui.metadata';
3
4
  import z from 'zod';
4
5
  import { ToolContext } from '../interfaces';
5
6
  export type FrontMcpToolExecuteHandler<InSchema extends ToolInputType, OutSchema extends ToolOutputType, In = ToolInputOf<{
@@ -21,7 +22,7 @@ export { FrontMcpTool, FrontMcpTool as Tool, frontMcpTool, frontMcpTool as tool
21
22
  * Don't move below code outside the decorator file, it will break the module augmentation.
22
23
  */
23
24
  type __Shape = z.ZodRawShape;
24
- type __AsZodObj<T> = T extends z.ZodObject<infer S> ? z.ZodObject<S> : T extends z.ZodRawShape ? z.ZodObject<T> : never;
25
+ type __AsZodObj<T> = T extends z.ZodObject<any> ? T : T extends z.ZodRawShape ? z.ZodObject<T> : never;
25
26
  export type ToolInputOf<Opt> = Opt extends {
26
27
  inputSchema: infer I;
27
28
  } ? z.infer<__AsZodObj<I>> : never;
@@ -29,12 +30,12 @@ export type ToolInputOf<Opt> = Opt extends {
29
30
  * Helper to infer the return type from any Zod schema,
30
31
  * including ZodRawShape.
31
32
  */
32
- type __InferZod<S> = S extends z.ZodTypeAny ? z.infer<S> : S extends z.ZodRawShape ? z.infer<z.ZodObject<S>> : never;
33
+ type __InferZod<S> = S extends z.ZodType ? z.infer<S> : S extends z.ZodRawShape ? z.infer<z.ZodObject<S>> : never;
33
34
  /**
34
35
  * Infers the *output type* from a *single schema definition*
35
36
  * based on the new ToolSingleOutputType.
36
37
  */
37
- type __InferFromSingleSchema<S> = S extends 'image' ? z.infer<typeof ImageOutputSchema> : S extends 'audio' ? z.infer<typeof AudioOutputSchema> : S extends 'resource' ? z.infer<typeof ResourceOutputSchema> : S extends 'resource_link' ? z.infer<typeof ResourceLinkOutputSchema> : S extends 'string' ? string : S extends 'number' ? number : S extends 'boolean' ? boolean : S extends 'date' ? Date : S extends z.ZodTypeAny | z.ZodRawShape ? __InferZod<S> : any;
38
+ type __InferFromSingleSchema<S> = S extends 'image' ? z.infer<typeof ImageOutputSchema> : S extends 'audio' ? z.infer<typeof AudioOutputSchema> : S extends 'resource' ? z.infer<typeof ResourceOutputSchema> : S extends 'resource_link' ? z.infer<typeof ResourceLinkOutputSchema> : S extends 'string' ? string : S extends 'number' ? number : S extends 'boolean' ? boolean : S extends 'date' ? Date : S extends z.ZodType | z.ZodRawShape ? __InferZod<S> : any;
38
39
  /**
39
40
  * Infers a tuple/array of output types from an array of schemas
40
41
  */
@@ -53,11 +54,59 @@ type __ImageOutputType = 'image';
53
54
  type __AudioOutputType = 'audio';
54
55
  type __ResourceOutputType = 'resource';
55
56
  type __ResourceLinkOutputType = 'resource_link';
56
- type __StructuredOutputType = z.ZodRawShape | z.ZodObject<any> | z.ZodArray<any> | z.ZodUnion<[z.ZodObject<any>, ...z.ZodObject<any>[]]> | z.ZodDiscriminatedUnion<any, any>;
57
+ type __StructuredOutputType = z.ZodRawShape | z.ZodObject<any> | z.ZodArray<z.ZodType> | z.ZodUnion<[z.ZodObject<any>, ...z.ZodObject<any>[]]> | z.ZodDiscriminatedUnion<z.ZodObject<any>[]>;
57
58
  type __ToolSingleOutputType = __PrimitiveOutputType | __ImageOutputType | __AudioOutputType | __ResourceOutputType | __ResourceLinkOutputType | __StructuredOutputType;
58
59
  type __OutputSchema = __ToolSingleOutputType | __ToolSingleOutputType[];
59
- export type ToolMetadataOptions<I extends __Shape, O extends __OutputSchema> = ToolMetadata<I | z.ZodObject<I>, // inputSchema can be a raw shape or ZodObject
60
+ /**
61
+ * Base tool metadata options without UI field.
62
+ */
63
+ type __ToolMetadataBase<I extends __Shape, O extends __OutputSchema> = ToolMetadata<I | z.ZodObject<I>, // inputSchema can be a raw shape or ZodObject
60
64
  O>;
65
+ /**
66
+ * Tool metadata options with optional UI configuration.
67
+ *
68
+ * The `ui` property accepts a `ToolUIConfig` from `@frontmcp/ui/types`
69
+ * for configuring interactive widget rendering.
70
+ */
71
+ export type ToolMetadataOptions<I extends __Shape, O extends __OutputSchema> = __ToolMetadataBase<I, O> & {
72
+ /**
73
+ * UI template configuration for rendering interactive widgets.
74
+ *
75
+ * The template builder function receives typed `ctx.input` and `ctx.output`
76
+ * based on the tool's `inputSchema` and `outputSchema`.
77
+ *
78
+ * @see {@link ToolUIConfig} for all available options including:
79
+ * - `template`: React component, HTML string, or builder function
80
+ * - `servingMode`: 'inline' | 'static' | 'hybrid' | 'direct-url' | 'custom-url'
81
+ * - `csp`: Content Security Policy configuration
82
+ * - `widgetAccessible`: Enable MCP bridge for tool calls from widget
83
+ * - `displayMode`: 'inline' | 'fullscreen' | 'pip'
84
+ * - And more...
85
+ *
86
+ * @example HTML template builder with typed context
87
+ * ```typescript
88
+ * ui: {
89
+ * template: (ctx) => `<div>${ctx.helpers.escapeHtml(ctx.output.name)}</div>`,
90
+ * // ctx.output is typed based on outputSchema
91
+ * servingMode: 'inline',
92
+ * }
93
+ * ```
94
+ *
95
+ * @example React component
96
+ * ```typescript
97
+ * import WeatherCard from './weather-ui';
98
+ * ui: {
99
+ * template: WeatherCard,
100
+ * servingMode: 'static',
101
+ * }
102
+ * ```
103
+ */
104
+ ui?: ToolUIConfig<ToolInputOf<{
105
+ inputSchema: I | z.ZodObject<I>;
106
+ }>, ToolOutputOf<{
107
+ outputSchema: O;
108
+ }>>;
109
+ };
61
110
  type __Ctor = (new (...a: any[]) => any) | (abstract new (...a: any[]) => any);
62
111
  type __A<C extends __Ctor> = C extends new (...a: infer A) => any ? A : C extends abstract new (...a: infer A) => any ? A : never;
63
112
  type __R<C extends __Ctor> = C extends new (...a: any[]) => infer R ? R : C extends abstract new (...a: any[]) => infer R ? R : never;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/tool.decorator.ts"],"names":[],"mappings":";;AA8DS,oCAAY;AAAkB,4BAAI;AAAE,oCAAY;AAAkB,4BAAI;AA9D/E,4BAA0B;AAC1B,sCAAqE;AACrE,0CASqB;AAIrB;;GAEG;AACH,SAAS,YAAY,CAAC,gBAA8B;IAClD,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,2BAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,cAAc,CAAC,6BAAoB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC;AACJ,CAAC;AASD;;GAEG;AACH,SAAS,YAAY,CAInB,gBAAmB;IACnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG;YACnB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B,CAAC,2BAAkB,CAAC,IAAI,CAAC,EAAE,eAAe;YAC1C,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACxC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { extendedToolMetadata, FrontMcpToolTokens } from '../tokens';\nimport {\n ToolMetadata,\n frontMcpToolMetadataSchema,\n ImageOutputSchema,\n AudioOutputSchema,\n ResourceOutputSchema,\n ResourceLinkOutputSchema,\n ToolInputType,\n ToolOutputType,\n} from '../metadata';\nimport z from 'zod';\nimport { ToolContext } from '../interfaces';\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction FrontMcpTool(providedMetadata: ToolMetadata): ClassDecorator {\n return (target: any) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n Reflect.defineMetadata(FrontMcpToolTokens.type, true, target);\n const extended = {};\n for (const property in metadata) {\n if (FrontMcpToolTokens[property]) {\n Reflect.defineMetadata(FrontMcpToolTokens[property], metadata[property], target);\n } else {\n extended[property] = metadata[property];\n }\n }\n Reflect.defineMetadata(extendedToolMetadata, extended, target);\n };\n}\n\nexport type FrontMcpToolExecuteHandler<\n InSchema extends ToolInputType,\n OutSchema extends ToolOutputType,\n In = ToolInputOf<{ inputSchema: InSchema }>,\n Out = ToolOutputOf<{ outputSchema: OutSchema }>,\n> = (input: In, ctx: ToolContext<InSchema, OutSchema>) => Out | Promise<Out>;\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction frontMcpTool<\n T extends ToolMetadata,\n InSchema extends ToolInputType = T['inputSchema'],\n OutSchema extends ToolOutputType = T['outputSchema'],\n>(providedMetadata: T): (handler: FrontMcpToolExecuteHandler<InSchema, OutSchema>) => () => void {\n return (execute) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n const toolFunction = function () {\n return execute;\n };\n Object.assign(toolFunction, {\n [FrontMcpToolTokens.type]: 'function-tool',\n [FrontMcpToolTokens.metadata]: metadata,\n });\n return toolFunction;\n };\n}\n\nexport { FrontMcpTool, FrontMcpTool as Tool, frontMcpTool, frontMcpTool as tool };\n\n/**\n * This is a modified version of the original decorator, with the following changes:\n * - Added support for ZodRawShape as inputSchema\n * - Added support for outputSchema: any of the allowed forms\n * - Added rich error messages for input/output type mismatches\n *\n * Don't move below code outside the decorator file, it will break the module augmentation.\n */\n// ---------- zod helpers ----------\ntype __Shape = z.ZodRawShape;\ntype __AsZodObj<T> = T extends z.ZodObject<infer S> ? z.ZodObject<S> : T extends z.ZodRawShape ? z.ZodObject<T> : never;\n\nexport type ToolInputOf<Opt> = Opt extends { inputSchema: infer I } ? z.infer<__AsZodObj<I>> : never;\n\n// ---------- output inference helpers for NEW schemas ----------\n\n/**\n * Helper to infer the return type from any Zod schema,\n * including ZodRawShape.\n */\ntype __InferZod<S> = S extends z.ZodTypeAny ? z.infer<S> : S extends z.ZodRawShape ? z.infer<z.ZodObject<S>> : never;\n\n/**\n * Infers the *output type* from a *single schema definition*\n * based on the new ToolSingleOutputType.\n */\ntype __InferFromSingleSchema<S> =\n // Handle specific MCP type literals\n S extends 'image'\n ? z.infer<typeof ImageOutputSchema>\n : S extends 'audio'\n ? z.infer<typeof AudioOutputSchema>\n : S extends 'resource'\n ? z.infer<typeof ResourceOutputSchema>\n : S extends 'resource_link'\n ? z.infer<typeof ResourceLinkOutputSchema>\n : // Handle primitive type literals\n S extends 'string'\n ? string\n : S extends 'number'\n ? number\n : S extends 'boolean'\n ? boolean\n : S extends 'date'\n ? Date\n : // Handle all Zod schemas (primitives, objects, arrays, etc.)\n // This will correctly infer z.ZodString to string, etc.\n S extends z.ZodTypeAny | z.ZodRawShape\n ? __InferZod<S>\n : // Fallback for unknown/unrecognized schema\n any;\n\n/**\n * Infers a tuple/array of output types from an array of schemas\n */\ntype __InferFromArraySchema<A> = A extends readonly any[] ? { [K in keyof A]: __InferFromSingleSchema<A[K]> } : never;\n\n/**\n * Main output type inference.\n * Handles single schemas, arrays of schemas, or no schema.\n */\nexport type ToolOutputOf<Opt> = Opt extends { outputSchema: infer O }\n ? O extends readonly any[] // Check for array/tuple first\n ? __InferFromArraySchema<O>\n : __InferFromSingleSchema<O> // Handle a single schema\n : any; // no outputSchema property at all -> allow anything\n\n// --- Define the schema types locally to constrain the generic ---\n// This mirrors your `ToolOutputType` definitions for use in constraints.\n\ntype __PrimitiveOutputType =\n | 'string'\n | 'number'\n | 'date'\n | 'boolean'\n | z.ZodString\n | z.ZodNumber\n | z.ZodBoolean\n | z.ZodBigInt\n | z.ZodDate;\ntype __ImageOutputType = 'image';\ntype __AudioOutputType = 'audio';\ntype __ResourceOutputType = 'resource';\ntype __ResourceLinkOutputType = 'resource_link';\ntype __StructuredOutputType =\n | z.ZodRawShape\n | z.ZodObject<any>\n | z.ZodArray<any>\n | z.ZodUnion<[z.ZodObject<any>, ...z.ZodObject<any>[]]>\n | z.ZodDiscriminatedUnion<any, any>;\n\ntype __ToolSingleOutputType =\n | __PrimitiveOutputType\n | __ImageOutputType\n | __AudioOutputType\n | __ResourceOutputType\n | __ResourceLinkOutputType\n | __StructuredOutputType;\n\n// This is the final constraint for the `outputSchema` option\ntype __OutputSchema = __ToolSingleOutputType | __ToolSingleOutputType[];\n\nexport type ToolMetadataOptions<I extends __Shape, O extends __OutputSchema> = ToolMetadata<\n I | z.ZodObject<I>, // inputSchema can be a raw shape or ZodObject\n O // outputSchema: any of the allowed forms\n>;\n\n// ---------- ctor & reflection ----------\ntype __Ctor = (new (...a: any[]) => any) | (abstract new (...a: any[]) => any);\ntype __A<C extends __Ctor> = C extends new (...a: infer A) => any\n ? A\n : C extends abstract new (...a: infer A) => any\n ? A\n : never;\ntype __R<C extends __Ctor> = C extends new (...a: any[]) => infer R\n ? R\n : C extends abstract new (...a: any[]) => infer R\n ? R\n : never;\ntype __Param<C extends __Ctor> = __R<C> extends { execute: (arg: infer P, ...r: any) => any } ? P : never;\ntype __Return<C extends __Ctor> = __R<C> extends { execute: (...a: any) => infer R } ? R : never;\ntype __Unwrap<T> = T extends Promise<infer U> ? U : T;\ntype __IsAny<T> = 0 extends 1 & T ? true : false;\n\n// ---------- friendly branded errors (UPDATED) ----------\n\n// Must extend ToolContext (assuming ToolContext is exported by the SDK)\ntype __MustExtendCtx<C extends __Ctor> = __R<C> extends ToolContext\n ? unknown\n : { 'Tool class error': 'Class must extend ToolContext' };\n\n// execute param must exactly match In (and not be any)\ntype __MustParam<C extends __Ctor, In> =\n // 1. If 'In' (from schema) is 'any', we can't check, so allow.\n __IsAny<In> extends true\n ? unknown\n : // 2. Check if the actual param type is 'any'. This is an error.\n __IsAny<__Param<C>> extends true\n ? { 'execute() parameter error': \"Parameter type must not be 'any'.\"; expected_input_type: In }\n : // 3. Check for the exact match: Param extends In AND In extends Param\n __Param<C> extends In\n ? In extends __Param<C>\n ? unknown // OK, exact match\n : {\n 'execute() parameter error': 'Parameter type is too wide. It must exactly match the input schema.';\n expected_input_type: In;\n actual_parameter_type: __Param<C>;\n }\n : {\n 'execute() parameter error': 'Parameter type does not match the input schema.';\n expected_input_type: In;\n actual_parameter_type: __Param<C>;\n };\n\n// execute return must be Out or Promise<Out>\ntype __MustReturn<C extends __Ctor, Out> =\n // 1. If 'Out' (from schema) is 'any', no check is needed.\n __IsAny<Out> extends true\n ? unknown\n : // 2. Check if the unwrapped return type is assignable to Out.\n __Unwrap<__Return<C>> extends Out\n ? unknown // OK\n : {\n 'execute() return type error': \"The method's return type is not assignable to the expected output schema type.\";\n expected_output_type: Out;\n 'actual_return_type (unwrapped)': __Unwrap<__Return<C>>;\n };\n\n// Rewrapped constructor with updated ToolContext generic params\ntype __Rewrap<C extends __Ctor, In, Out> = C extends abstract new (...a: __A<C>) => __R<C>\n ? C & (abstract new (...a: __A<C>) => ToolContext<any, any, In, Out> & __R<C>)\n : C extends new (...a: __A<C>) => __R<C>\n ? C & (new (...a: __A<C>) => ToolContext<any, any, In, Out> & __R<C>)\n : never;\n\ndeclare module '@frontmcp/sdk' {\n // ---------- the decorator (overloads) ----------\n\n // 1) Overload: outputSchema PROVIDED → strict return typing\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n O extends __OutputSchema, // Use our new output schema constraint\n T extends ToolMetadataOptions<I, O> & { outputSchema: any }, // ensure present\n >(\n opts: T,\n ): <C extends __Ctor>(\n cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, ToolInputOf<T>> & // <-- Will now show a rich error\n __MustReturn<C, ToolOutputOf<T>>, // <-- Will now show a rich error\n ) => __Rewrap<C, ToolInputOf<T>, ToolOutputOf<T>>;\n\n // 2) Overload: outputSchema NOT PROVIDED → execute() can return any\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n // Note: 'O' is omitted, 'any' is used for the generic\n T extends ToolMetadataOptions<I, any> & { outputSchema?: never }, // ensure absent\n >(\n opts: T,\n ): <C extends __Ctor>(\n cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, ToolInputOf<T>> & // <-- Will now show a rich error\n __MustReturn<C, ToolOutputOf<T>>, // <-- Will now show 'any'\n ) => __Rewrap<C, ToolInputOf<T>, ToolOutputOf<T>>;\n}\n"]}
1
+ {"version":3,"file":"tool.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/tool.decorator.ts"],"names":[],"mappings":";;AA+DS,oCAAY;AAAkB,4BAAI;AAAE,oCAAY;AAAkB,4BAAI;AA/D/E,4BAA0B;AAC1B,sCAAqE;AACrE,0CASqB;AAKrB;;GAEG;AACH,SAAS,YAAY,CAAC,gBAA8B;IAClD,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,2BAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,cAAc,CAAC,6BAAoB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC;AACJ,CAAC;AASD;;GAEG;AACH,SAAS,YAAY,CAInB,gBAAmB;IACnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG;YACnB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B,CAAC,2BAAkB,CAAC,IAAI,CAAC,EAAE,eAAe;YAC1C,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACxC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { extendedToolMetadata, FrontMcpToolTokens } from '../tokens';\nimport {\n ToolMetadata,\n frontMcpToolMetadataSchema,\n ImageOutputSchema,\n AudioOutputSchema,\n ResourceOutputSchema,\n ResourceLinkOutputSchema,\n ToolInputType,\n ToolOutputType,\n} from '../metadata';\nimport type { ToolUIConfig } from '../metadata/tool-ui.metadata';\nimport z from 'zod';\nimport { ToolContext } from '../interfaces';\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction FrontMcpTool(providedMetadata: ToolMetadata): ClassDecorator {\n return (target: any) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n Reflect.defineMetadata(FrontMcpToolTokens.type, true, target);\n const extended = {};\n for (const property in metadata) {\n if (FrontMcpToolTokens[property]) {\n Reflect.defineMetadata(FrontMcpToolTokens[property], metadata[property], target);\n } else {\n extended[property] = metadata[property];\n }\n }\n Reflect.defineMetadata(extendedToolMetadata, extended, target);\n };\n}\n\nexport type FrontMcpToolExecuteHandler<\n InSchema extends ToolInputType,\n OutSchema extends ToolOutputType,\n In = ToolInputOf<{ inputSchema: InSchema }>,\n Out = ToolOutputOf<{ outputSchema: OutSchema }>,\n> = (input: In, ctx: ToolContext<InSchema, OutSchema>) => Out | Promise<Out>;\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction frontMcpTool<\n T extends ToolMetadata,\n InSchema extends ToolInputType = T['inputSchema'],\n OutSchema extends ToolOutputType = T['outputSchema'],\n>(providedMetadata: T): (handler: FrontMcpToolExecuteHandler<InSchema, OutSchema>) => () => void {\n return (execute) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n const toolFunction = function () {\n return execute;\n };\n Object.assign(toolFunction, {\n [FrontMcpToolTokens.type]: 'function-tool',\n [FrontMcpToolTokens.metadata]: metadata,\n });\n return toolFunction;\n };\n}\n\nexport { FrontMcpTool, FrontMcpTool as Tool, frontMcpTool, frontMcpTool as tool };\n\n/**\n * This is a modified version of the original decorator, with the following changes:\n * - Added support for ZodRawShape as inputSchema\n * - Added support for outputSchema: any of the allowed forms\n * - Added rich error messages for input/output type mismatches\n *\n * Don't move below code outside the decorator file, it will break the module augmentation.\n */\n// ---------- zod helpers ----------\ntype __Shape = z.ZodRawShape;\ntype __AsZodObj<T> = T extends z.ZodObject<any> ? T : T extends z.ZodRawShape ? z.ZodObject<T> : never;\n\nexport type ToolInputOf<Opt> = Opt extends { inputSchema: infer I } ? z.infer<__AsZodObj<I>> : never;\n\n// ---------- output inference helpers for NEW schemas ----------\n\n/**\n * Helper to infer the return type from any Zod schema,\n * including ZodRawShape.\n */\ntype __InferZod<S> = S extends z.ZodType ? z.infer<S> : S extends z.ZodRawShape ? z.infer<z.ZodObject<S>> : never;\n\n/**\n * Infers the *output type* from a *single schema definition*\n * based on the new ToolSingleOutputType.\n */\ntype __InferFromSingleSchema<S> =\n // Handle specific MCP type literals\n S extends 'image'\n ? z.infer<typeof ImageOutputSchema>\n : S extends 'audio'\n ? z.infer<typeof AudioOutputSchema>\n : S extends 'resource'\n ? z.infer<typeof ResourceOutputSchema>\n : S extends 'resource_link'\n ? z.infer<typeof ResourceLinkOutputSchema>\n : // Handle primitive type literals\n S extends 'string'\n ? string\n : S extends 'number'\n ? number\n : S extends 'boolean'\n ? boolean\n : S extends 'date'\n ? Date\n : // Handle all Zod schemas (primitives, objects, arrays, etc.)\n // This will correctly infer z.ZodString to string, etc.\n S extends z.ZodType | z.ZodRawShape\n ? __InferZod<S>\n : // Fallback for unknown/unrecognized schema\n any;\n\n/**\n * Infers a tuple/array of output types from an array of schemas\n */\ntype __InferFromArraySchema<A> = A extends readonly any[] ? { [K in keyof A]: __InferFromSingleSchema<A[K]> } : never;\n\n/**\n * Main output type inference.\n * Handles single schemas, arrays of schemas, or no schema.\n */\nexport type ToolOutputOf<Opt> = Opt extends { outputSchema: infer O }\n ? O extends readonly any[] // Check for array/tuple first\n ? __InferFromArraySchema<O>\n : __InferFromSingleSchema<O> // Handle a single schema\n : any; // no outputSchema property at all -> allow anything\n\n// --- Define the schema types locally to constrain the generic ---\n// This mirrors your `ToolOutputType` definitions for use in constraints.\n\ntype __PrimitiveOutputType =\n | 'string'\n | 'number'\n | 'date'\n | 'boolean'\n | z.ZodString\n | z.ZodNumber\n | z.ZodBoolean\n | z.ZodBigInt\n | z.ZodDate;\ntype __ImageOutputType = 'image';\ntype __AudioOutputType = 'audio';\ntype __ResourceOutputType = 'resource';\ntype __ResourceLinkOutputType = 'resource_link';\ntype __StructuredOutputType =\n | z.ZodRawShape\n | z.ZodObject<any>\n | z.ZodArray<z.ZodType>\n | z.ZodUnion<[z.ZodObject<any>, ...z.ZodObject<any>[]]>\n | z.ZodDiscriminatedUnion<z.ZodObject<any>[]>;\n\ntype __ToolSingleOutputType =\n | __PrimitiveOutputType\n | __ImageOutputType\n | __AudioOutputType\n | __ResourceOutputType\n | __ResourceLinkOutputType\n | __StructuredOutputType;\n\n// This is the final constraint for the `outputSchema` option\ntype __OutputSchema = __ToolSingleOutputType | __ToolSingleOutputType[];\n\n/**\n * Base tool metadata options without UI field.\n */\ntype __ToolMetadataBase<I extends __Shape, O extends __OutputSchema> = ToolMetadata<\n I | z.ZodObject<I>, // inputSchema can be a raw shape or ZodObject\n O // outputSchema: any of the allowed forms\n>;\n\n/**\n * Tool metadata options with optional UI configuration.\n *\n * The `ui` property accepts a `ToolUIConfig` from `@frontmcp/ui/types`\n * for configuring interactive widget rendering.\n */\nexport type ToolMetadataOptions<I extends __Shape, O extends __OutputSchema> = __ToolMetadataBase<I, O> & {\n /**\n * UI template configuration for rendering interactive widgets.\n *\n * The template builder function receives typed `ctx.input` and `ctx.output`\n * based on the tool's `inputSchema` and `outputSchema`.\n *\n * @see {@link ToolUIConfig} for all available options including:\n * - `template`: React component, HTML string, or builder function\n * - `servingMode`: 'inline' | 'static' | 'hybrid' | 'direct-url' | 'custom-url'\n * - `csp`: Content Security Policy configuration\n * - `widgetAccessible`: Enable MCP bridge for tool calls from widget\n * - `displayMode`: 'inline' | 'fullscreen' | 'pip'\n * - And more...\n *\n * @example HTML template builder with typed context\n * ```typescript\n * ui: {\n * template: (ctx) => `<div>${ctx.helpers.escapeHtml(ctx.output.name)}</div>`,\n * // ctx.output is typed based on outputSchema\n * servingMode: 'inline',\n * }\n * ```\n *\n * @example React component\n * ```typescript\n * import WeatherCard from './weather-ui';\n * ui: {\n * template: WeatherCard,\n * servingMode: 'static',\n * }\n * ```\n */\n ui?: ToolUIConfig<ToolInputOf<{ inputSchema: I | z.ZodObject<I> }>, ToolOutputOf<{ outputSchema: O }>>;\n};\n\n// ---------- ctor & reflection ----------\ntype __Ctor = (new (...a: any[]) => any) | (abstract new (...a: any[]) => any);\ntype __A<C extends __Ctor> = C extends new (...a: infer A) => any\n ? A\n : C extends abstract new (...a: infer A) => any\n ? A\n : never;\ntype __R<C extends __Ctor> = C extends new (...a: any[]) => infer R\n ? R\n : C extends abstract new (...a: any[]) => infer R\n ? R\n : never;\ntype __Param<C extends __Ctor> = __R<C> extends { execute: (arg: infer P, ...r: any) => any } ? P : never;\ntype __Return<C extends __Ctor> = __R<C> extends { execute: (...a: any) => infer R } ? R : never;\ntype __Unwrap<T> = T extends Promise<infer U> ? U : T;\ntype __IsAny<T> = 0 extends 1 & T ? true : false;\n\n// ---------- friendly branded errors (UPDATED) ----------\n\n// Must extend ToolContext (assuming ToolContext is exported by the SDK)\ntype __MustExtendCtx<C extends __Ctor> = __R<C> extends ToolContext\n ? unknown\n : { 'Tool class error': 'Class must extend ToolContext' };\n\n// execute param must exactly match In (and not be any)\ntype __MustParam<C extends __Ctor, In> =\n // 1. If 'In' (from schema) is 'any', we can't check, so allow.\n __IsAny<In> extends true\n ? unknown\n : // 2. Check if the actual param type is 'any'. This is an error.\n __IsAny<__Param<C>> extends true\n ? { 'execute() parameter error': \"Parameter type must not be 'any'.\"; expected_input_type: In }\n : // 3. Check for the exact match: Param extends In AND In extends Param\n __Param<C> extends In\n ? In extends __Param<C>\n ? unknown // OK, exact match\n : {\n 'execute() parameter error': 'Parameter type is too wide. It must exactly match the input schema.';\n expected_input_type: In;\n actual_parameter_type: __Param<C>;\n }\n : {\n 'execute() parameter error': 'Parameter type does not match the input schema.';\n expected_input_type: In;\n actual_parameter_type: __Param<C>;\n };\n\n// execute return must be Out or Promise<Out>\ntype __MustReturn<C extends __Ctor, Out> =\n // 1. If 'Out' (from schema) is 'any', no check is needed.\n __IsAny<Out> extends true\n ? unknown\n : // 2. Check if the unwrapped return type is assignable to Out.\n __Unwrap<__Return<C>> extends Out\n ? unknown // OK\n : {\n 'execute() return type error': \"The method's return type is not assignable to the expected output schema type.\";\n expected_output_type: Out;\n 'actual_return_type (unwrapped)': __Unwrap<__Return<C>>;\n };\n\n// Rewrapped constructor with updated ToolContext generic params\ntype __Rewrap<C extends __Ctor, In, Out> = C extends abstract new (...a: __A<C>) => __R<C>\n ? C & (abstract new (...a: __A<C>) => ToolContext<any, any, In, Out> & __R<C>)\n : C extends new (...a: __A<C>) => __R<C>\n ? C & (new (...a: __A<C>) => ToolContext<any, any, In, Out> & __R<C>)\n : never;\n\ndeclare module '@frontmcp/sdk' {\n // ---------- the decorator (overloads) ----------\n\n // 1) Overload: outputSchema PROVIDED → strict return typing\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n O extends __OutputSchema, // Use our new output schema constraint\n T extends ToolMetadataOptions<I, O> & { outputSchema: any }, // ensure present\n >(\n opts: T,\n ): <C extends __Ctor>(\n cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, ToolInputOf<T>> & // <-- Will now show a rich error\n __MustReturn<C, ToolOutputOf<T>>, // <-- Will now show a rich error\n ) => __Rewrap<C, ToolInputOf<T>, ToolOutputOf<T>>;\n\n // 2) Overload: outputSchema NOT PROVIDED → execute() can return any\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n // Note: 'O' is omitted, 'any' is used for the generic\n T extends ToolMetadataOptions<I, any> & { outputSchema?: never }, // ensure absent\n >(\n opts: T,\n ): <C extends __Ctor>(\n cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, ToolInputOf<T>> & // <-- Will now show a rich error\n __MustReturn<C, ToolOutputOf<T>>, // <-- Will now show 'any'\n ) => __Rewrap<C, ToolInputOf<T>, ToolOutputOf<T>>;\n}\n"]}