@frontmcp/sdk 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/README.md +30 -18
  2. package/package.json +20 -5
  3. package/src/app/app.registry.d.ts +3 -2
  4. package/src/app/app.registry.js +3 -1
  5. package/src/app/app.registry.js.map +1 -1
  6. package/src/app/instances/app.local.instance.js +2 -2
  7. package/src/app/instances/app.local.instance.js.map +1 -1
  8. package/src/auth/auth.registry.d.ts +34 -2
  9. package/src/auth/auth.registry.js +162 -24
  10. package/src/auth/auth.registry.js.map +1 -1
  11. package/src/auth/auth.utils.js +8 -9
  12. package/src/auth/auth.utils.js.map +1 -1
  13. package/src/auth/authorization/authorization.class.d.ts +125 -0
  14. package/src/auth/authorization/authorization.class.js +224 -0
  15. package/src/auth/authorization/authorization.class.js.map +1 -0
  16. package/src/auth/authorization/authorization.types.d.ts +300 -0
  17. package/src/auth/authorization/authorization.types.js +79 -0
  18. package/src/auth/authorization/authorization.types.js.map +1 -0
  19. package/src/auth/authorization/index.d.ts +5 -0
  20. package/src/auth/authorization/index.js +19 -0
  21. package/src/auth/authorization/index.js.map +1 -0
  22. package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
  23. package/src/auth/authorization/orchestrated.authorization.js +306 -0
  24. package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
  25. package/src/auth/authorization/public.authorization.d.ts +91 -0
  26. package/src/auth/authorization/public.authorization.js +132 -0
  27. package/src/auth/authorization/public.authorization.js.map +1 -0
  28. package/src/auth/authorization/transparent.authorization.d.ts +130 -0
  29. package/src/auth/authorization/transparent.authorization.js +147 -0
  30. package/src/auth/authorization/transparent.authorization.js.map +1 -0
  31. package/src/auth/consent/consent.types.d.ts +111 -0
  32. package/src/auth/consent/consent.types.js +119 -0
  33. package/src/auth/consent/consent.types.js.map +1 -0
  34. package/src/auth/consent/index.d.ts +1 -0
  35. package/src/auth/consent/index.js +13 -0
  36. package/src/auth/consent/index.js.map +1 -0
  37. package/src/auth/detection/auth-provider-detection.d.ts +84 -0
  38. package/src/auth/detection/auth-provider-detection.js +230 -0
  39. package/src/auth/detection/auth-provider-detection.js.map +1 -0
  40. package/src/auth/detection/index.d.ts +1 -0
  41. package/src/auth/detection/index.js +15 -0
  42. package/src/auth/detection/index.js.map +1 -0
  43. package/src/auth/flows/auth.verify.flow.d.ts +110 -0
  44. package/src/auth/flows/auth.verify.flow.js +379 -0
  45. package/src/auth/flows/auth.verify.flow.js.map +1 -0
  46. package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
  47. package/src/auth/flows/oauth.authorize.flow.js +701 -33
  48. package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
  49. package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
  50. package/src/auth/flows/oauth.callback.flow.js +357 -0
  51. package/src/auth/flows/oauth.callback.flow.js.map +1 -0
  52. package/src/auth/flows/oauth.register.flow.d.ts +32 -125
  53. package/src/auth/flows/oauth.token.flow.d.ts +52 -154
  54. package/src/auth/flows/oauth.token.flow.js +193 -55
  55. package/src/auth/flows/oauth.token.flow.js.map +1 -1
  56. package/src/auth/flows/session.verify.flow.d.ts +66 -321
  57. package/src/auth/flows/session.verify.flow.js +107 -18
  58. package/src/auth/flows/session.verify.flow.js.map +1 -1
  59. package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
  60. package/src/auth/flows/well-known.jwks.flow.js +15 -8
  61. package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
  62. package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
  63. package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
  64. package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
  65. package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
  66. package/src/auth/flows/well-known.prm.flow.js +3 -4
  67. package/src/auth/flows/well-known.prm.flow.js.map +1 -1
  68. package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
  69. package/src/auth/instances/instance.local-primary-auth.js +236 -6
  70. package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
  71. package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
  72. package/src/auth/instances/instance.remote-primary-auth.js +2 -2
  73. package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
  74. package/src/auth/session/authorization-vault.d.ts +611 -0
  75. package/src/auth/session/authorization-vault.js +817 -0
  76. package/src/auth/session/authorization-vault.js.map +1 -0
  77. package/src/auth/session/authorization.store.d.ts +301 -0
  78. package/src/auth/session/authorization.store.js +323 -0
  79. package/src/auth/session/authorization.store.js.map +1 -0
  80. package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
  81. package/src/auth/session/encrypted-authorization-vault.js +493 -0
  82. package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
  83. package/src/auth/session/index.d.ts +4 -4
  84. package/src/auth/session/index.js +11 -7
  85. package/src/auth/session/index.js.map +1 -1
  86. package/src/auth/session/session.schema.d.ts +1 -1
  87. package/src/auth/session/session.service.d.ts +1 -1
  88. package/src/auth/session/transport-session.manager.d.ts +101 -0
  89. package/src/auth/session/transport-session.manager.js +300 -0
  90. package/src/auth/session/transport-session.manager.js.map +1 -0
  91. package/src/auth/session/transport-session.types.d.ts +457 -0
  92. package/src/auth/session/transport-session.types.js +110 -0
  93. package/src/auth/session/transport-session.types.js.map +1 -0
  94. package/src/auth/session/utils/session-id.utils.d.ts +14 -2
  95. package/src/auth/session/utils/session-id.utils.js +68 -19
  96. package/src/auth/session/utils/session-id.utils.js.map +1 -1
  97. package/src/auth/session/vault-encryption.d.ts +189 -0
  98. package/src/auth/session/vault-encryption.js +263 -0
  99. package/src/auth/session/vault-encryption.js.map +1 -0
  100. package/src/auth/ui/base-layout.d.ts +188 -0
  101. package/src/auth/ui/base-layout.js +292 -0
  102. package/src/auth/ui/base-layout.js.map +1 -0
  103. package/src/auth/ui/htmx-templates.d.ts +135 -0
  104. package/src/auth/ui/htmx-templates.js +433 -0
  105. package/src/auth/ui/htmx-templates.js.map +1 -0
  106. package/src/auth/ui/index.d.ts +11 -0
  107. package/src/auth/ui/index.js +35 -0
  108. package/src/auth/ui/index.js.map +1 -0
  109. package/src/auth/utils/audience.validator.d.ts +129 -0
  110. package/src/auth/utils/audience.validator.js +196 -0
  111. package/src/auth/utils/audience.validator.js.map +1 -0
  112. package/src/auth/utils/index.d.ts +2 -0
  113. package/src/auth/utils/index.js +7 -0
  114. package/src/auth/utils/index.js.map +1 -0
  115. package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
  116. package/src/auth/utils/www-authenticate.utils.js +183 -0
  117. package/src/auth/utils/www-authenticate.utils.js.map +1 -0
  118. package/src/common/common.schema.d.ts +2 -16
  119. package/src/common/constants.d.ts +3 -0
  120. package/src/common/constants.js +6 -1
  121. package/src/common/constants.js.map +1 -1
  122. package/src/common/decorators/decorator-utils.d.ts +131 -0
  123. package/src/common/decorators/decorator-utils.js +195 -0
  124. package/src/common/decorators/decorator-utils.js.map +1 -0
  125. package/src/common/decorators/front-mcp.decorator.js +3 -2
  126. package/src/common/decorators/front-mcp.decorator.js.map +1 -1
  127. package/src/common/decorators/hook.decorator.d.ts +58 -2
  128. package/src/common/decorators/hook.decorator.js +127 -17
  129. package/src/common/decorators/hook.decorator.js.map +1 -1
  130. package/src/common/decorators/plugin.decorator.d.ts +1 -1
  131. package/src/common/decorators/plugin.decorator.js +11 -10
  132. package/src/common/decorators/plugin.decorator.js.map +1 -1
  133. package/src/common/decorators/resource.decorator.d.ts +32 -3
  134. package/src/common/decorators/resource.decorator.js +46 -4
  135. package/src/common/decorators/resource.decorator.js.map +1 -1
  136. package/src/common/decorators/tool.decorator.d.ts +54 -5
  137. package/src/common/decorators/tool.decorator.js.map +1 -1
  138. package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
  139. package/src/common/dynamic/dynamic.plugin.js +7 -1
  140. package/src/common/dynamic/dynamic.plugin.js.map +1 -1
  141. package/src/common/entries/prompt.entry.d.ts +46 -2
  142. package/src/common/entries/prompt.entry.js +10 -0
  143. package/src/common/entries/prompt.entry.js.map +1 -1
  144. package/src/common/entries/resource.entry.d.ts +69 -6
  145. package/src/common/entries/resource.entry.js +27 -3
  146. package/src/common/entries/resource.entry.js.map +1 -1
  147. package/src/common/entries/scope.entry.d.ts +5 -1
  148. package/src/common/entries/scope.entry.js +3 -3
  149. package/src/common/entries/scope.entry.js.map +1 -1
  150. package/src/common/flow/flow.utils.d.ts +56 -0
  151. package/src/common/flow/flow.utils.js +96 -0
  152. package/src/common/flow/flow.utils.js.map +1 -0
  153. package/src/common/index.d.ts +2 -2
  154. package/src/common/index.js +2 -2
  155. package/src/common/index.js.map +1 -1
  156. package/src/common/interfaces/execution-context.interface.d.ts +59 -0
  157. package/src/common/interfaces/execution-context.interface.js +81 -0
  158. package/src/common/interfaces/execution-context.interface.js.map +1 -0
  159. package/src/common/interfaces/flow.interface.d.ts +1 -1
  160. package/src/common/interfaces/flow.interface.js.map +1 -1
  161. package/src/common/interfaces/index.d.ts +1 -0
  162. package/src/common/interfaces/index.js +1 -0
  163. package/src/common/interfaces/index.js.map +1 -1
  164. package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
  165. package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
  166. package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
  167. package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
  168. package/src/common/interfaces/internal/registry.interface.js.map +1 -1
  169. package/src/common/interfaces/plugin.interface.js.map +1 -1
  170. package/src/common/interfaces/prompt.interface.d.ts +53 -4
  171. package/src/common/interfaces/prompt.interface.js +78 -0
  172. package/src/common/interfaces/prompt.interface.js.map +1 -1
  173. package/src/common/interfaces/resource.interface.d.ts +47 -17
  174. package/src/common/interfaces/resource.interface.js +53 -0
  175. package/src/common/interfaces/resource.interface.js.map +1 -1
  176. package/src/common/interfaces/tool.interface.d.ts +39 -22
  177. package/src/common/interfaces/tool.interface.js +61 -34
  178. package/src/common/interfaces/tool.interface.js.map +1 -1
  179. package/src/common/metadata/adapter.metadata.d.ts +1 -9
  180. package/src/common/metadata/app.metadata.d.ts +425 -730
  181. package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
  182. package/src/common/metadata/flow.metadata.d.ts +10 -25
  183. package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
  184. package/src/common/metadata/front-mcp.metadata.js +6 -4
  185. package/src/common/metadata/front-mcp.metadata.js.map +1 -1
  186. package/src/common/metadata/hook.metadata.d.ts +1 -1
  187. package/src/common/metadata/hook.metadata.js.map +1 -1
  188. package/src/common/metadata/index.d.ts +1 -0
  189. package/src/common/metadata/index.js +1 -0
  190. package/src/common/metadata/index.js.map +1 -1
  191. package/src/common/metadata/logger.metadata.d.ts +1 -9
  192. package/src/common/metadata/plugin.metadata.d.ts +8 -30
  193. package/src/common/metadata/prompt.metadata.d.ts +4 -161
  194. package/src/common/metadata/provider.metadata.d.ts +2 -12
  195. package/src/common/metadata/resource.metadata.d.ts +6 -98
  196. package/src/common/metadata/resource.metadata.js +15 -6
  197. package/src/common/metadata/resource.metadata.js.map +1 -1
  198. package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
  199. package/src/common/metadata/tool-ui.metadata.js +12 -0
  200. package/src/common/metadata/tool-ui.metadata.js.map +1 -0
  201. package/src/common/metadata/tool.metadata.d.ts +78 -199
  202. package/src/common/metadata/tool.metadata.js +11 -14
  203. package/src/common/metadata/tool.metadata.js.map +1 -1
  204. package/src/common/providers/base-config.provider.d.ts +84 -0
  205. package/src/common/providers/base-config.provider.js +128 -0
  206. package/src/common/providers/base-config.provider.js.map +1 -0
  207. package/src/common/records/plugin.record.d.ts +5 -6
  208. package/src/common/records/plugin.record.js.map +1 -1
  209. package/src/common/records/prompt.record.js.map +1 -1
  210. package/src/common/records/resource.record.d.ts +17 -1
  211. package/src/common/records/resource.record.js +12 -6
  212. package/src/common/records/resource.record.js.map +1 -1
  213. package/src/common/records/tool.record.js.map +1 -1
  214. package/src/common/schemas/annotated-class.schema.d.ts +9 -9
  215. package/src/common/schemas/annotated-class.schema.js +92 -27
  216. package/src/common/schemas/annotated-class.schema.js.map +1 -1
  217. package/src/common/schemas/http-input.schema.d.ts +6 -30
  218. package/src/common/schemas/http-output.schema.d.ts +326 -1630
  219. package/src/common/schemas/http-output.schema.js +39 -1
  220. package/src/common/schemas/http-output.schema.js.map +1 -1
  221. package/src/common/tokens/front-mcp.tokens.js +4 -1
  222. package/src/common/tokens/front-mcp.tokens.js.map +1 -1
  223. package/src/common/tokens/resource.tokens.d.ts +2 -0
  224. package/src/common/tokens/resource.tokens.js +4 -1
  225. package/src/common/tokens/resource.tokens.js.map +1 -1
  226. package/src/common/tokens/tool.tokens.d.ts +2 -0
  227. package/src/common/tokens/tool.tokens.js +2 -0
  228. package/src/common/tokens/tool.tokens.js.map +1 -1
  229. package/src/common/types/auth/jwt.types.d.ts +5 -31
  230. package/src/common/types/auth/session.types.d.ts +97 -192
  231. package/src/common/types/auth/session.types.js +24 -11
  232. package/src/common/types/auth/session.types.js.map +1 -1
  233. package/src/common/types/options/auth.options.d.ts +1013 -490
  234. package/src/common/types/options/auth.options.js +554 -36
  235. package/src/common/types/options/auth.options.js.map +1 -1
  236. package/src/common/types/options/http.options.d.ts +1 -9
  237. package/src/common/types/options/logging.options.d.ts +7 -13
  238. package/src/common/types/options/logging.options.js +4 -0
  239. package/src/common/types/options/logging.options.js.map +1 -1
  240. package/src/common/types/options/server-info.options.d.ts +3 -31
  241. package/src/common/types/options/session.options.d.ts +90 -10
  242. package/src/common/types/options/session.options.js +26 -3
  243. package/src/common/types/options/session.options.js.map +1 -1
  244. package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
  245. package/src/common/utils/decide-request-intent.utils.js +88 -23
  246. package/src/common/utils/decide-request-intent.utils.js.map +1 -1
  247. package/src/completion/flows/complete.flow.d.ts +74 -0
  248. package/src/completion/flows/complete.flow.js +199 -0
  249. package/src/completion/flows/complete.flow.js.map +1 -0
  250. package/src/errors/authorization-required.error.d.ts +189 -0
  251. package/src/errors/authorization-required.error.js +274 -0
  252. package/src/errors/authorization-required.error.js.map +1 -0
  253. package/src/errors/index.d.ts +2 -1
  254. package/src/errors/index.js +17 -1
  255. package/src/errors/index.js.map +1 -1
  256. package/src/errors/mcp.error.d.ts +101 -1
  257. package/src/errors/mcp.error.js +147 -2
  258. package/src/errors/mcp.error.js.map +1 -1
  259. package/src/flows/flow.instance.js +4 -3
  260. package/src/flows/flow.instance.js.map +1 -1
  261. package/src/flows/flow.registry.js.map +1 -1
  262. package/src/flows/flow.stages.js +14 -11
  263. package/src/flows/flow.stages.js.map +1 -1
  264. package/src/front-mcp/front-mcp.providers.d.ts +464 -102
  265. package/src/front-mcp/front-mcp.providers.js +3 -5
  266. package/src/front-mcp/front-mcp.providers.js.map +1 -1
  267. package/src/hooks/hook.instance.d.ts +1 -1
  268. package/src/hooks/hook.instance.js +5 -2
  269. package/src/hooks/hook.instance.js.map +1 -1
  270. package/src/hooks/hook.registry.js +7 -5
  271. package/src/hooks/hook.registry.js.map +1 -1
  272. package/src/index.d.ts +28 -9
  273. package/src/index.js +5 -1
  274. package/src/index.js.map +1 -1
  275. package/src/logger/instances/instance.logger.js +3 -2
  276. package/src/logger/instances/instance.logger.js.map +1 -1
  277. package/src/logger/logger.registry.js +7 -2
  278. package/src/logger/logger.registry.js.map +1 -1
  279. package/src/logging/flows/set-level.flow.d.ts +62 -0
  280. package/src/logging/flows/set-level.flow.js +108 -0
  281. package/src/logging/flows/set-level.flow.js.map +1 -0
  282. package/src/mcp-apps/csp.d.ts +111 -0
  283. package/src/mcp-apps/csp.js +267 -0
  284. package/src/mcp-apps/csp.js.map +1 -0
  285. package/src/mcp-apps/index.d.ts +23 -0
  286. package/src/mcp-apps/index.js +91 -0
  287. package/src/mcp-apps/index.js.map +1 -0
  288. package/src/mcp-apps/schemas.d.ts +403 -0
  289. package/src/mcp-apps/schemas.js +345 -0
  290. package/src/mcp-apps/schemas.js.map +1 -0
  291. package/src/mcp-apps/template.d.ts +94 -0
  292. package/src/mcp-apps/template.js +419 -0
  293. package/src/mcp-apps/template.js.map +1 -0
  294. package/src/mcp-apps/types.d.ts +323 -0
  295. package/src/mcp-apps/types.js +59 -0
  296. package/src/mcp-apps/types.js.map +1 -0
  297. package/src/notification/index.d.ts +1 -0
  298. package/src/notification/index.js +13 -0
  299. package/src/notification/index.js.map +1 -0
  300. package/src/notification/notification.service.d.ts +378 -0
  301. package/src/notification/notification.service.js +727 -0
  302. package/src/notification/notification.service.js.map +1 -0
  303. package/src/plugin/plugin.registry.js +12 -9
  304. package/src/plugin/plugin.registry.js.map +1 -1
  305. package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
  306. package/src/prompt/flows/get-prompt.flow.js +214 -0
  307. package/src/prompt/flows/get-prompt.flow.js.map +1 -0
  308. package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
  309. package/src/prompt/flows/prompts-list.flow.js +176 -0
  310. package/src/prompt/flows/prompts-list.flow.js.map +1 -0
  311. package/src/prompt/index.d.ts +7 -0
  312. package/src/prompt/index.js +17 -0
  313. package/src/prompt/index.js.map +1 -0
  314. package/src/prompt/prompt.events.d.ts +17 -0
  315. package/src/prompt/prompt.events.js +25 -0
  316. package/src/prompt/prompt.events.js.map +1 -0
  317. package/src/prompt/prompt.instance.d.ts +30 -0
  318. package/src/prompt/prompt.instance.js +120 -0
  319. package/src/prompt/prompt.instance.js.map +1 -0
  320. package/src/prompt/prompt.registry.d.ts +79 -12
  321. package/src/prompt/prompt.registry.js +360 -15
  322. package/src/prompt/prompt.registry.js.map +1 -1
  323. package/src/prompt/prompt.types.d.ts +26 -0
  324. package/src/prompt/prompt.types.js +11 -0
  325. package/src/prompt/prompt.types.js.map +1 -0
  326. package/src/prompt/prompt.utils.d.ts +26 -0
  327. package/src/prompt/prompt.utils.js +136 -0
  328. package/src/prompt/prompt.utils.js.map +1 -0
  329. package/src/provider/provider.registry.d.ts +12 -5
  330. package/src/provider/provider.registry.js +30 -138
  331. package/src/provider/provider.registry.js.map +1 -1
  332. package/src/regsitry/registry.base.d.ts +1 -1
  333. package/src/regsitry/registry.base.js.map +1 -1
  334. package/src/resource/flows/read-resource.flow.d.ts +91 -0
  335. package/src/resource/flows/read-resource.flow.js +270 -0
  336. package/src/resource/flows/read-resource.flow.js.map +1 -0
  337. package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
  338. package/src/resource/flows/resource-templates-list.flow.js +191 -0
  339. package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
  340. package/src/resource/flows/resources-list.flow.d.ts +64 -0
  341. package/src/resource/flows/resources-list.flow.js +196 -0
  342. package/src/resource/flows/resources-list.flow.js.map +1 -0
  343. package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
  344. package/src/resource/flows/subscribe-resource.flow.js +123 -0
  345. package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
  346. package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
  347. package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
  348. package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
  349. package/src/resource/index.d.ts +8 -0
  350. package/src/resource/index.js +20 -0
  351. package/src/resource/index.js.map +1 -0
  352. package/src/resource/resource.events.d.ts +24 -0
  353. package/src/resource/resource.events.js +17 -0
  354. package/src/resource/resource.events.js.map +1 -0
  355. package/src/resource/resource.instance.d.ts +35 -0
  356. package/src/resource/resource.instance.js +163 -0
  357. package/src/resource/resource.instance.js.map +1 -0
  358. package/src/resource/resource.registry.d.ts +106 -12
  359. package/src/resource/resource.registry.js +449 -13
  360. package/src/resource/resource.registry.js.map +1 -1
  361. package/src/resource/resource.types.d.ts +35 -0
  362. package/src/resource/resource.types.js +11 -0
  363. package/src/resource/resource.types.js.map +1 -0
  364. package/src/resource/resource.utils.d.ts +30 -0
  365. package/src/resource/resource.utils.js +151 -0
  366. package/src/resource/resource.utils.js.map +1 -0
  367. package/src/scope/flows/http.request.flow.d.ts +48 -330
  368. package/src/scope/flows/http.request.flow.js +306 -78
  369. package/src/scope/flows/http.request.flow.js.map +1 -1
  370. package/src/scope/scope.instance.d.ts +12 -0
  371. package/src/scope/scope.instance.js +145 -15
  372. package/src/scope/scope.instance.js.map +1 -1
  373. package/src/tool/flows/call-tool.flow.d.ts +64 -1110
  374. package/src/tool/flows/call-tool.flow.js +303 -15
  375. package/src/tool/flows/call-tool.flow.js.map +1 -1
  376. package/src/tool/flows/tools-list.flow.d.ts +32 -473
  377. package/src/tool/flows/tools-list.flow.js +111 -10
  378. package/src/tool/flows/tools-list.flow.js.map +1 -1
  379. package/src/tool/tool.events.d.ts +8 -1
  380. package/src/tool/tool.events.js.map +1 -1
  381. package/src/tool/tool.instance.d.ts +3 -1
  382. package/src/tool/tool.instance.js +17 -3
  383. package/src/tool/tool.instance.js.map +1 -1
  384. package/src/tool/tool.registry.d.ts +7 -1
  385. package/src/tool/tool.registry.js +26 -10
  386. package/src/tool/tool.registry.js.map +1 -1
  387. package/src/tool/tool.types.d.ts +4 -4
  388. package/src/tool/tool.types.js.map +1 -1
  389. package/src/tool/tool.utils.d.ts +3 -12
  390. package/src/tool/tool.utils.js +39 -193
  391. package/src/tool/tool.utils.js.map +1 -1
  392. package/src/tool/ui/index.d.ts +22 -0
  393. package/src/tool/ui/index.js +63 -0
  394. package/src/tool/ui/index.js.map +1 -0
  395. package/src/tool/ui/platform-adapters.d.ts +10 -0
  396. package/src/tool/ui/platform-adapters.js +18 -0
  397. package/src/tool/ui/platform-adapters.js.map +1 -0
  398. package/src/tool/ui/template-helpers.d.ts +46 -0
  399. package/src/tool/ui/template-helpers.js +112 -0
  400. package/src/tool/ui/template-helpers.js.map +1 -0
  401. package/src/tool/ui/ui-resource-template.d.ts +34 -0
  402. package/src/tool/ui/ui-resource-template.js +64 -0
  403. package/src/tool/ui/ui-resource-template.js.map +1 -0
  404. package/src/tool/ui/ui-resource.handler.d.ts +74 -0
  405. package/src/tool/ui/ui-resource.handler.js +129 -0
  406. package/src/tool/ui/ui-resource.handler.js.map +1 -0
  407. package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
  408. package/src/transport/adapters/transport.local.adapter.js +28 -7
  409. package/src/transport/adapters/transport.local.adapter.js.map +1 -1
  410. package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
  411. package/src/transport/adapters/transport.sse.adapter.js +4 -3
  412. package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
  413. package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
  414. package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
  415. package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
  416. package/src/transport/flows/handle.sse.flow.d.ts +29 -63
  417. package/src/transport/flows/handle.sse.flow.js +78 -10
  418. package/src/transport/flows/handle.sse.flow.js.map +1 -1
  419. package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
  420. package/src/transport/flows/handle.stateless-http.flow.js +102 -0
  421. package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
  422. package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
  423. package/src/transport/flows/handle.streamable-http.flow.js +158 -26
  424. package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
  425. package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
  426. package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
  427. package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
  428. package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
  429. package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
  430. package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
  431. package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
  432. package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
  433. package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
  434. package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
  435. package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
  436. package/src/transport/mcp-handlers/index.d.ts +517 -208
  437. package/src/transport/mcp-handlers/index.js +39 -2
  438. package/src/transport/mcp-handlers/index.js.map +1 -1
  439. package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
  440. package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
  441. package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
  442. package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
  443. package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
  444. package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
  445. package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
  446. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
  447. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
  448. package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
  449. package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
  450. package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
  451. package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
  452. package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
  453. package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
  454. package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
  455. package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
  456. package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
  457. package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
  458. package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
  459. package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
  460. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
  461. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
  462. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
  463. package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
  464. package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
  465. package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
  466. package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
  467. package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
  468. package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
  469. package/src/transport/transport.local.js +7 -2
  470. package/src/transport/transport.local.js.map +1 -1
  471. package/src/transport/transport.registry.d.ts +30 -0
  472. package/src/transport/transport.registry.js +84 -1
  473. package/src/transport/transport.registry.js.map +1 -1
  474. package/src/transport/transport.types.d.ts +3 -3
  475. package/src/transport/transport.types.js.map +1 -1
  476. package/src/utils/content.utils.d.ts +48 -0
  477. package/src/utils/content.utils.js +194 -0
  478. package/src/utils/content.utils.js.map +1 -0
  479. package/src/utils/index.d.ts +8 -0
  480. package/src/utils/index.js +55 -0
  481. package/src/utils/index.js.map +1 -0
  482. package/src/utils/lineage.utils.d.ts +40 -0
  483. package/src/utils/lineage.utils.js +82 -0
  484. package/src/utils/lineage.utils.js.map +1 -0
  485. package/src/utils/naming.utils.d.ts +46 -0
  486. package/src/utils/naming.utils.js +136 -0
  487. package/src/utils/naming.utils.js.map +1 -0
  488. package/src/utils/types.utils.d.ts +2 -2
  489. package/src/utils/types.utils.js.map +1 -1
  490. package/src/utils/uri-template.utils.d.ts +57 -0
  491. package/src/utils/uri-template.utils.js +113 -0
  492. package/src/utils/uri-template.utils.js.map +1 -0
  493. package/src/utils/uri-validation.utils.d.ts +40 -0
  494. package/src/utils/uri-validation.utils.js +76 -0
  495. package/src/utils/uri-validation.utils.js.map +1 -0
  496. package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
  497. package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
  498. package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
  499. package/src/__test-utils__/fixtures/index.d.ts +0 -7
  500. package/src/__test-utils__/fixtures/index.js +0 -11
  501. package/src/__test-utils__/fixtures/index.js.map +0 -1
  502. package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
  503. package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
  504. package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
  505. package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
  506. package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
  507. package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
  508. package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
  509. package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
  510. package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
  511. package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
  512. package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
  513. package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
  514. package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
  515. package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
  516. package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
  517. package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
  518. package/src/__test-utils__/helpers/async.helpers.js +0 -112
  519. package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
  520. package/src/__test-utils__/helpers/index.d.ts +0 -6
  521. package/src/__test-utils__/helpers/index.js +0 -10
  522. package/src/__test-utils__/helpers/index.js.map +0 -1
  523. package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
  524. package/src/__test-utils__/helpers/setup.helpers.js +0 -106
  525. package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
  526. package/src/__test-utils__/index.d.ts +0 -9
  527. package/src/__test-utils__/index.js +0 -14
  528. package/src/__test-utils__/index.js.map +0 -1
  529. package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
  530. package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
  531. package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
  532. package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
  533. package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
  534. package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
  535. package/src/__test-utils__/mocks/index.d.ts +0 -8
  536. package/src/__test-utils__/mocks/index.js +0 -12
  537. package/src/__test-utils__/mocks/index.js.map +0 -1
  538. package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
  539. package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
  540. package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
  541. package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
  542. package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
  543. package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
  544. package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
  545. package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
  546. package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
  547. package/src/auth/path.utils.d.ts +0 -20
  548. package/src/auth/path.utils.js +0 -71
  549. package/src/auth/path.utils.js.map +0 -1
  550. package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
  551. package/src/common/decorators-old/async-with.decorator.js +0 -24
  552. package/src/common/decorators-old/async-with.decorator.js.map +0 -1
  553. package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
  554. package/src/common/decorators-old/auth-hook.decorator.js +0 -27
  555. package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
  556. package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
  557. package/src/common/decorators-old/session-hook.decorator.js +0 -27
  558. package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/utils/naming.utils.ts
3
+ // Shared naming and case conversion utilities for MCP-compliant identifiers
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.splitWords = splitWords;
6
+ exports.toCase = toCase;
7
+ exports.sepFor = sepFor;
8
+ exports.normalizeSegment = normalizeSegment;
9
+ exports.normalizeProviderId = normalizeProviderId;
10
+ exports.normalizeOwnerPath = normalizeOwnerPath;
11
+ exports.shortHash = shortHash;
12
+ exports.ensureMaxLen = ensureMaxLen;
13
+ // Allowed chars per MCP spec: a-zA-Z0-9 _ - . /
14
+ const MCP_ALLOWED = /[A-Za-z0-9_\-./]/;
15
+ /**
16
+ * Split a string into words, handling camelCase, PascalCase, and delimiters.
17
+ *
18
+ * @example
19
+ * splitWords("myFunctionName") => ["my", "Function", "Name"]
20
+ * splitWords("my_function_name") => ["my", "function", "name"]
21
+ */
22
+ function splitWords(input) {
23
+ const parts = [];
24
+ let buff = '';
25
+ for (let i = 0; i < input.length; i++) {
26
+ const ch = input[i];
27
+ const isAlphaNum = /[A-Za-z0-9]/.test(ch);
28
+ if (!isAlphaNum) {
29
+ if (buff) {
30
+ parts.push(buff);
31
+ buff = '';
32
+ }
33
+ continue;
34
+ }
35
+ if (buff && /[a-z]/.test(buff[buff.length - 1]) && /[A-Z]/.test(ch)) {
36
+ parts.push(buff);
37
+ buff = ch;
38
+ }
39
+ else {
40
+ buff += ch;
41
+ }
42
+ }
43
+ if (buff)
44
+ parts.push(buff);
45
+ return parts;
46
+ }
47
+ /**
48
+ * Convert words to a specific naming case.
49
+ *
50
+ * @example
51
+ * toCase(["my", "function"], "snake") => "my_function"
52
+ * toCase(["my", "function"], "camel") => "myFunction"
53
+ */
54
+ function toCase(words, kind) {
55
+ const safe = words.filter(Boolean);
56
+ switch (kind) {
57
+ case 'snake':
58
+ return safe.map((w) => w.toLowerCase()).join('_');
59
+ case 'kebab':
60
+ return safe.map((w) => w.toLowerCase()).join('-');
61
+ case 'dot':
62
+ return safe.map((w) => w.toLowerCase()).join('.');
63
+ case 'camel':
64
+ if (safe.length === 0)
65
+ return '';
66
+ return (safe[0].toLowerCase() +
67
+ safe
68
+ .slice(1)
69
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
70
+ .join(''));
71
+ }
72
+ }
73
+ /**
74
+ * Get the separator character for a naming case.
75
+ */
76
+ function sepFor(kind) {
77
+ return kind === 'snake' ? '_' : kind === 'kebab' ? '-' : kind === 'dot' ? '.' : '';
78
+ }
79
+ /**
80
+ * Normalize a single segment (name part) to MCP-safe characters.
81
+ */
82
+ function normalizeSegment(raw, kind) {
83
+ const words = splitWords(raw);
84
+ let cased = toCase(words, kind);
85
+ cased = [...cased].filter((ch) => MCP_ALLOWED.test(ch)).join('');
86
+ return cased || 'x';
87
+ }
88
+ /**
89
+ * Normalize a provider ID to MCP-safe characters.
90
+ */
91
+ function normalizeProviderId(raw, kind) {
92
+ if (!raw)
93
+ return undefined;
94
+ const tokens = raw.split(/\W+/);
95
+ const cased = toCase(tokens, kind);
96
+ const safe = [...cased].filter((ch) => MCP_ALLOWED.test(ch)).join('');
97
+ return safe || undefined;
98
+ }
99
+ /**
100
+ * Normalize an owner path (app:id/plugin:id) to the specified naming case.
101
+ */
102
+ function normalizeOwnerPath(ownerKey, kind) {
103
+ const levels = ownerKey.split('/');
104
+ const normLevels = levels.map((level) => {
105
+ const parts = level.split(':'); // ["app","Portal"]
106
+ return parts.map((p) => normalizeSegment(p, kind)).join(sepFor(kind));
107
+ });
108
+ if (kind === 'camel')
109
+ return normLevels.map((seg) => seg.charAt(0).toLowerCase() + seg.slice(1)).join('');
110
+ return normLevels.join(sepFor(kind));
111
+ }
112
+ /**
113
+ * Generate a short hash (6 hex chars) from a string.
114
+ * Uses djb2 algorithm for fast, reasonable distribution.
115
+ */
116
+ function shortHash(s) {
117
+ let h = 5381;
118
+ for (let i = 0; i < s.length; i++)
119
+ h = (h << 5) + h + s.charCodeAt(i);
120
+ return (h >>> 0).toString(16).slice(-6).padStart(6, '0');
121
+ }
122
+ /**
123
+ * Ensure a name fits within a maximum length, using hash truncation if needed.
124
+ * Preserves meaningful suffix while adding a hash for uniqueness.
125
+ */
126
+ function ensureMaxLen(name, max) {
127
+ if (name.length <= max)
128
+ return name;
129
+ const hash = shortHash(name);
130
+ const lastSep = Math.max(name.lastIndexOf('_'), name.lastIndexOf('-'), name.lastIndexOf('.'), name.lastIndexOf('/'));
131
+ const tail = lastSep > 0 ? name.slice(lastSep + 1) : name.slice(-Math.max(3, Math.min(16, Math.floor(max / 4))));
132
+ const budget = Math.max(1, max - (1 + hash.length + 1 + tail.length));
133
+ const prefix = name.slice(0, budget);
134
+ return `${prefix}-${hash}-${tail}`.slice(0, max);
135
+ }
136
+ //# sourceMappingURL=naming.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.utils.js","sourceRoot":"","sources":["../../../src/utils/naming.utils.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/utils/naming.utils.ts\n// Shared naming and case conversion utilities for MCP-compliant identifiers\n\n/**\n * Supported naming conventions for MCP identifiers\n */\nexport type NameCase = 'snake' | 'kebab' | 'dot' | 'camel';\n\n// Allowed chars per MCP spec: a-zA-Z0-9 _ - . /\nconst MCP_ALLOWED = /[A-Za-z0-9_\\-./]/;\n\n/**\n * Split a string into words, handling camelCase, PascalCase, and delimiters.\n *\n * @example\n * splitWords(\"myFunctionName\") => [\"my\", \"Function\", \"Name\"]\n * splitWords(\"my_function_name\") => [\"my\", \"function\", \"name\"]\n */\nexport function splitWords(input: string): string[] {\n const parts: string[] = [];\n let buff = '';\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n const isAlphaNum = /[A-Za-z0-9]/.test(ch);\n if (!isAlphaNum) {\n if (buff) {\n parts.push(buff);\n buff = '';\n }\n continue;\n }\n if (buff && /[a-z]/.test(buff[buff.length - 1]) && /[A-Z]/.test(ch)) {\n parts.push(buff);\n buff = ch;\n } else {\n buff += ch;\n }\n }\n if (buff) parts.push(buff);\n return parts;\n}\n\n/**\n * Convert words to a specific naming case.\n *\n * @example\n * toCase([\"my\", \"function\"], \"snake\") => \"my_function\"\n * toCase([\"my\", \"function\"], \"camel\") => \"myFunction\"\n */\nexport function toCase(words: string[], kind: NameCase): string {\n const safe = words.filter(Boolean);\n switch (kind) {\n case 'snake':\n return safe.map((w) => w.toLowerCase()).join('_');\n case 'kebab':\n return safe.map((w) => w.toLowerCase()).join('-');\n case 'dot':\n return safe.map((w) => w.toLowerCase()).join('.');\n case 'camel':\n if (safe.length === 0) return '';\n return (\n safe[0].toLowerCase() +\n safe\n .slice(1)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('')\n );\n }\n}\n\n/**\n * Get the separator character for a naming case.\n */\nexport function sepFor(kind: NameCase): string {\n return kind === 'snake' ? '_' : kind === 'kebab' ? '-' : kind === 'dot' ? '.' : '';\n}\n\n/**\n * Normalize a single segment (name part) to MCP-safe characters.\n */\nexport function normalizeSegment(raw: string, kind: NameCase): string {\n const words = splitWords(raw);\n let cased = toCase(words, kind);\n cased = [...cased].filter((ch) => MCP_ALLOWED.test(ch)).join('');\n return cased || 'x';\n}\n\n/**\n * Normalize a provider ID to MCP-safe characters.\n */\nexport function normalizeProviderId(raw: string | undefined, kind: NameCase): string | undefined {\n if (!raw) return undefined;\n const tokens = raw.split(/\\W+/);\n const cased = toCase(tokens, kind);\n const safe = [...cased].filter((ch) => MCP_ALLOWED.test(ch)).join('');\n return safe || undefined;\n}\n\n/**\n * Normalize an owner path (app:id/plugin:id) to the specified naming case.\n */\nexport function normalizeOwnerPath(ownerKey: string, kind: NameCase): string {\n const levels = ownerKey.split('/');\n const normLevels = levels.map((level) => {\n const parts = level.split(':'); // [\"app\",\"Portal\"]\n return parts.map((p) => normalizeSegment(p, kind)).join(sepFor(kind));\n });\n if (kind === 'camel') return normLevels.map((seg) => seg.charAt(0).toLowerCase() + seg.slice(1)).join('');\n return normLevels.join(sepFor(kind));\n}\n\n/**\n * Generate a short hash (6 hex chars) from a string.\n * Uses djb2 algorithm for fast, reasonable distribution.\n */\nexport function shortHash(s: string): string {\n let h = 5381;\n for (let i = 0; i < s.length; i++) h = (h << 5) + h + s.charCodeAt(i);\n return (h >>> 0).toString(16).slice(-6).padStart(6, '0');\n}\n\n/**\n * Ensure a name fits within a maximum length, using hash truncation if needed.\n * Preserves meaningful suffix while adding a hash for uniqueness.\n */\nexport function ensureMaxLen(name: string, max: number): string {\n if (name.length <= max) return name;\n const hash = shortHash(name);\n const lastSep = Math.max(name.lastIndexOf('_'), name.lastIndexOf('-'), name.lastIndexOf('.'), name.lastIndexOf('/'));\n const tail = lastSep > 0 ? name.slice(lastSep + 1) : name.slice(-Math.max(3, Math.min(16, Math.floor(max / 4))));\n const budget = Math.max(1, max - (1 + hash.length + 1 + tail.length));\n const prefix = name.slice(0, budget);\n return `${prefix}-${hash}-${tail}`.slice(0, max);\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { z, ZodTypeAny } from 'zod';
1
+ import { z, ZodType } from 'zod';
2
2
  type Primitive = string | number | boolean | bigint | null | undefined;
3
3
  type Flatten<T> = T extends Primitive ? T : T extends Array<infer U> ? Array<Flatten<U>> : T extends Set<infer U> ? Set<Flatten<U>> : T extends Map<infer K, infer V> ? Map<Flatten<K>, Flatten<V>> : T extends object ? {
4
4
  [K in keyof T]: Flatten<T[K]>;
5
5
  } : T;
6
- export type Infer<Schema extends ZodTypeAny> = Flatten<z.infer<Schema>>;
6
+ export type Infer<Schema extends ZodType> = Flatten<z.infer<Schema>>;
7
7
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"types.utils.js","sourceRoot":"","sources":["../../../src/utils/types.utils.ts"],"names":[],"mappings":"","sourcesContent":["import { z, ZodTypeAny } from 'zod';\n\ntype Primitive = string | number | boolean | bigint | null | undefined;\ntype Flatten<T> = T extends Primitive\n ? T\n : T extends Array<infer U>\n ? Array<Flatten<U>>\n : T extends Set<infer U>\n ? Set<Flatten<U>>\n : T extends Map<infer K, infer V>\n ? Map<Flatten<K>, Flatten<V>>\n : T extends object\n ? {\n [K in keyof T]: Flatten<T[K]>;\n }\n : T;\nexport type Infer<Schema extends ZodTypeAny> = Flatten<z.infer<Schema>>;\n"]}
1
+ {"version":3,"file":"types.utils.js","sourceRoot":"","sources":["../../../src/utils/types.utils.ts"],"names":[],"mappings":"","sourcesContent":["import { z, ZodType } from 'zod';\n\ntype Primitive = string | number | boolean | bigint | null | undefined;\ntype Flatten<T> = T extends Primitive\n ? T\n : T extends Array<infer U>\n ? Array<Flatten<U>>\n : T extends Set<infer U>\n ? Set<Flatten<U>>\n : T extends Map<infer K, infer V>\n ? Map<Flatten<K>, Flatten<V>>\n : T extends object\n ? {\n [K in keyof T]: Flatten<T[K]>;\n }\n : T;\nexport type Infer<Schema extends ZodType> = Flatten<z.infer<Schema>>;\n"]}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Parsed URI template information
3
+ */
4
+ export interface ParsedUriTemplate {
5
+ pattern: RegExp;
6
+ paramNames: string[];
7
+ }
8
+ /**
9
+ * Parse a URI template (RFC 6570 Level 1) into a regex pattern and parameter names.
10
+ * Supports simple string substitution: {param}
11
+ *
12
+ * Note: This implements RFC 6570 Level 1 only (simple string substitution).
13
+ * Advanced operators like {+path}, {#fragment}, or {?query} are not supported.
14
+ *
15
+ * @example
16
+ * parseUriTemplate("file:///{path}") => { pattern: /^file:\/\/\/([^/]+)$/, paramNames: ["path"] }
17
+ * parseUriTemplate("users/{userId}/posts/{postId}") => { pattern: /^users\/([^/]+)\/posts\/([^/]+)$/, paramNames: ["userId", "postId"] }
18
+ *
19
+ * @throws Error if template is too long (>1000 chars) or has too many parameters (>50)
20
+ */
21
+ export declare function parseUriTemplate(template: string): ParsedUriTemplate;
22
+ /**
23
+ * Match a URI against a URI template and extract parameters.
24
+ * Returns null if no match, or an object with extracted parameters.
25
+ *
26
+ * @example
27
+ * matchUriTemplate("file:///{path}", "file:///documents/readme.txt")
28
+ * => { path: "documents" } // Note: only captures first segment
29
+ *
30
+ * matchUriTemplate("users/{userId}/posts/{postId}", "users/123/posts/456")
31
+ * => { userId: "123", postId: "456" }
32
+ */
33
+ export declare function matchUriTemplate(template: string, uri: string): Record<string, string> | null;
34
+ /**
35
+ * Expand a URI template with the given parameters.
36
+ *
37
+ * @example
38
+ * expandUriTemplate("file:///{path}", { path: "documents/readme.txt" })
39
+ * => "file:///documents%2Freadme.txt"
40
+ *
41
+ * expandUriTemplate("users/{userId}/posts/{postId}", { userId: "123", postId: "456" })
42
+ * => "users/123/posts/456"
43
+ *
44
+ * @throws Error if a required parameter is missing
45
+ */
46
+ export declare function expandUriTemplate(template: string, params: Record<string, string>): string;
47
+ /**
48
+ * Extract parameter names from a URI template.
49
+ *
50
+ * @example
51
+ * extractTemplateParams("users/{userId}/posts/{postId}") => ["userId", "postId"]
52
+ */
53
+ export declare function extractTemplateParams(template: string): string[];
54
+ /**
55
+ * Check if a string is a URI template (contains {param} placeholders).
56
+ */
57
+ export declare function isUriTemplate(uri: string): boolean;
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/utils/uri-template.utils.ts
3
+ // RFC 6570 Level 1 URI Template utilities
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.parseUriTemplate = parseUriTemplate;
6
+ exports.matchUriTemplate = matchUriTemplate;
7
+ exports.expandUriTemplate = expandUriTemplate;
8
+ exports.extractTemplateParams = extractTemplateParams;
9
+ exports.isUriTemplate = isUriTemplate;
10
+ /**
11
+ * Parse a URI template (RFC 6570 Level 1) into a regex pattern and parameter names.
12
+ * Supports simple string substitution: {param}
13
+ *
14
+ * Note: This implements RFC 6570 Level 1 only (simple string substitution).
15
+ * Advanced operators like {+path}, {#fragment}, or {?query} are not supported.
16
+ *
17
+ * @example
18
+ * parseUriTemplate("file:///{path}") => { pattern: /^file:\/\/\/([^/]+)$/, paramNames: ["path"] }
19
+ * parseUriTemplate("users/{userId}/posts/{postId}") => { pattern: /^users\/([^/]+)\/posts\/([^/]+)$/, paramNames: ["userId", "postId"] }
20
+ *
21
+ * @throws Error if template is too long (>1000 chars) or has too many parameters (>50)
22
+ */
23
+ function parseUriTemplate(template) {
24
+ if (template.length > 1000) {
25
+ throw new Error('URI template too long (max 1000 characters)');
26
+ }
27
+ const paramCount = (template.match(/\{[^}]+\}/g) || []).length;
28
+ if (paramCount > 50) {
29
+ throw new Error('URI template has too many parameters (max 50)');
30
+ }
31
+ const paramNames = [];
32
+ // Escape special regex characters, but handle {param} placeholders
33
+ let regexStr = template.replace(/[.*+?^${}()|[\]\\]/g, (match) => {
34
+ // Don't escape { and } yet - we'll handle them for parameters
35
+ if (match === '{' || match === '}')
36
+ return match;
37
+ return '\\' + match;
38
+ });
39
+ // Replace {param} with capture groups
40
+ regexStr = regexStr.replace(/\{([^}]+)\}/g, (_, paramName) => {
41
+ paramNames.push(paramName);
42
+ // Match any non-empty string segment (stops at /)
43
+ return '([^/]+)';
44
+ });
45
+ return {
46
+ pattern: new RegExp(`^${regexStr}$`),
47
+ paramNames,
48
+ };
49
+ }
50
+ /**
51
+ * Match a URI against a URI template and extract parameters.
52
+ * Returns null if no match, or an object with extracted parameters.
53
+ *
54
+ * @example
55
+ * matchUriTemplate("file:///{path}", "file:///documents/readme.txt")
56
+ * => { path: "documents" } // Note: only captures first segment
57
+ *
58
+ * matchUriTemplate("users/{userId}/posts/{postId}", "users/123/posts/456")
59
+ * => { userId: "123", postId: "456" }
60
+ */
61
+ function matchUriTemplate(template, uri) {
62
+ const { pattern, paramNames } = parseUriTemplate(template);
63
+ const match = uri.match(pattern);
64
+ if (!match)
65
+ return null;
66
+ const params = {};
67
+ paramNames.forEach((name, index) => {
68
+ params[name] = decodeURIComponent(match[index + 1]);
69
+ });
70
+ return params;
71
+ }
72
+ /**
73
+ * Expand a URI template with the given parameters.
74
+ *
75
+ * @example
76
+ * expandUriTemplate("file:///{path}", { path: "documents/readme.txt" })
77
+ * => "file:///documents%2Freadme.txt"
78
+ *
79
+ * expandUriTemplate("users/{userId}/posts/{postId}", { userId: "123", postId: "456" })
80
+ * => "users/123/posts/456"
81
+ *
82
+ * @throws Error if a required parameter is missing
83
+ */
84
+ function expandUriTemplate(template, params) {
85
+ return template.replace(/\{([^}]+)\}/g, (_, paramName) => {
86
+ const value = params[paramName];
87
+ if (value === undefined) {
88
+ throw new Error(`Missing parameter '${paramName}' for URI template '${template}'`);
89
+ }
90
+ return encodeURIComponent(value);
91
+ });
92
+ }
93
+ /**
94
+ * Extract parameter names from a URI template.
95
+ *
96
+ * @example
97
+ * extractTemplateParams("users/{userId}/posts/{postId}") => ["userId", "postId"]
98
+ */
99
+ function extractTemplateParams(template) {
100
+ const params = [];
101
+ template.replace(/\{([^}]+)\}/g, (_, paramName) => {
102
+ params.push(paramName);
103
+ return '';
104
+ });
105
+ return params;
106
+ }
107
+ /**
108
+ * Check if a string is a URI template (contains {param} placeholders).
109
+ */
110
+ function isUriTemplate(uri) {
111
+ return /\{[^}]+\}/.test(uri);
112
+ }
113
+ //# sourceMappingURL=uri-template.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri-template.utils.js","sourceRoot":"","sources":["../../../src/utils/uri-template.utils.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/utils/uri-template.utils.ts\n// RFC 6570 Level 1 URI Template utilities\n\n/**\n * Parsed URI template information\n */\nexport interface ParsedUriTemplate {\n pattern: RegExp;\n paramNames: string[];\n}\n\n/**\n * Parse a URI template (RFC 6570 Level 1) into a regex pattern and parameter names.\n * Supports simple string substitution: {param}\n *\n * Note: This implements RFC 6570 Level 1 only (simple string substitution).\n * Advanced operators like {+path}, {#fragment}, or {?query} are not supported.\n *\n * @example\n * parseUriTemplate(\"file:///{path}\") => { pattern: /^file:\\/\\/\\/([^/]+)$/, paramNames: [\"path\"] }\n * parseUriTemplate(\"users/{userId}/posts/{postId}\") => { pattern: /^users\\/([^/]+)\\/posts\\/([^/]+)$/, paramNames: [\"userId\", \"postId\"] }\n *\n * @throws Error if template is too long (>1000 chars) or has too many parameters (>50)\n */\nexport function parseUriTemplate(template: string): ParsedUriTemplate {\n if (template.length > 1000) {\n throw new Error('URI template too long (max 1000 characters)');\n }\n const paramCount = (template.match(/\\{[^}]+\\}/g) || []).length;\n if (paramCount > 50) {\n throw new Error('URI template has too many parameters (max 50)');\n }\n\n const paramNames: string[] = [];\n\n // Escape special regex characters, but handle {param} placeholders\n let regexStr = template.replace(/[.*+?^${}()|[\\]\\\\]/g, (match) => {\n // Don't escape { and } yet - we'll handle them for parameters\n if (match === '{' || match === '}') return match;\n return '\\\\' + match;\n });\n\n // Replace {param} with capture groups\n regexStr = regexStr.replace(/\\{([^}]+)\\}/g, (_, paramName) => {\n paramNames.push(paramName);\n // Match any non-empty string segment (stops at /)\n return '([^/]+)';\n });\n\n return {\n pattern: new RegExp(`^${regexStr}$`),\n paramNames,\n };\n}\n\n/**\n * Match a URI against a URI template and extract parameters.\n * Returns null if no match, or an object with extracted parameters.\n *\n * @example\n * matchUriTemplate(\"file:///{path}\", \"file:///documents/readme.txt\")\n * => { path: \"documents\" } // Note: only captures first segment\n *\n * matchUriTemplate(\"users/{userId}/posts/{postId}\", \"users/123/posts/456\")\n * => { userId: \"123\", postId: \"456\" }\n */\nexport function matchUriTemplate(template: string, uri: string): Record<string, string> | null {\n const { pattern, paramNames } = parseUriTemplate(template);\n const match = uri.match(pattern);\n\n if (!match) return null;\n\n const params: Record<string, string> = {};\n paramNames.forEach((name, index) => {\n params[name] = decodeURIComponent(match[index + 1]);\n });\n\n return params;\n}\n\n/**\n * Expand a URI template with the given parameters.\n *\n * @example\n * expandUriTemplate(\"file:///{path}\", { path: \"documents/readme.txt\" })\n * => \"file:///documents%2Freadme.txt\"\n *\n * expandUriTemplate(\"users/{userId}/posts/{postId}\", { userId: \"123\", postId: \"456\" })\n * => \"users/123/posts/456\"\n *\n * @throws Error if a required parameter is missing\n */\nexport function expandUriTemplate(template: string, params: Record<string, string>): string {\n return template.replace(/\\{([^}]+)\\}/g, (_, paramName) => {\n const value = params[paramName];\n if (value === undefined) {\n throw new Error(`Missing parameter '${paramName}' for URI template '${template}'`);\n }\n return encodeURIComponent(value);\n });\n}\n\n/**\n * Extract parameter names from a URI template.\n *\n * @example\n * extractTemplateParams(\"users/{userId}/posts/{postId}\") => [\"userId\", \"postId\"]\n */\nexport function extractTemplateParams(template: string): string[] {\n const params: string[] = [];\n template.replace(/\\{([^}]+)\\}/g, (_, paramName) => {\n params.push(paramName);\n return '';\n });\n return params;\n}\n\n/**\n * Check if a string is a URI template (contains {param} placeholders).\n */\nexport function isUriTemplate(uri: string): boolean {\n return /\\{[^}]+\\}/.test(uri);\n}\n"]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Validate that a URI has a valid scheme per RFC 3986.
3
+ *
4
+ * @param uri - The URI to validate
5
+ * @returns true if the URI has a valid scheme, false otherwise
6
+ *
7
+ * @example
8
+ * isValidMcpUri('file:///path/to/file') // true
9
+ * isValidMcpUri('https://example.com/resource') // true
10
+ * isValidMcpUri('custom://my-resource') // true
11
+ * isValidMcpUri('/path/to/file') // false (no scheme)
12
+ * isValidMcpUri('123://invalid') // false (scheme must start with letter)
13
+ */
14
+ export declare function isValidMcpUri(uri: string): boolean;
15
+ /**
16
+ * Extract the scheme from a URI.
17
+ *
18
+ * @param uri - The URI to extract the scheme from
19
+ * @returns The scheme in lowercase, or null if no valid scheme found
20
+ *
21
+ * @example
22
+ * extractUriScheme('file:///path') // 'file'
23
+ * extractUriScheme('HTTPS://example.com') // 'https'
24
+ * extractUriScheme('/no/scheme') // null
25
+ */
26
+ export declare function extractUriScheme(uri: string): string | null;
27
+ /**
28
+ * Validate that a URI template has a valid scheme per RFC 3986.
29
+ * URI templates follow RFC 6570 and can contain template expressions like {var}.
30
+ * The scheme portion should still be a valid static scheme.
31
+ *
32
+ * @param uriTemplate - The URI template to validate
33
+ * @returns true if the URI template has a valid scheme, false otherwise
34
+ *
35
+ * @example
36
+ * isValidMcpUriTemplate('users://{userId}/profile') // true
37
+ * isValidMcpUriTemplate('file:///{path}') // true
38
+ * isValidMcpUriTemplate('{scheme}://dynamic') // false (scheme must be static)
39
+ */
40
+ export declare function isValidMcpUriTemplate(uriTemplate: string): boolean;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/utils/uri-validation.utils.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.isValidMcpUri = isValidMcpUri;
5
+ exports.extractUriScheme = extractUriScheme;
6
+ exports.isValidMcpUriTemplate = isValidMcpUriTemplate;
7
+ /**
8
+ * URI validation utilities for MCP resource URIs.
9
+ *
10
+ * Per MCP specification, resource URIs should follow RFC 3986 and include
11
+ * a valid scheme (e.g., file://, https://, custom://).
12
+ */
13
+ /**
14
+ * RFC 3986 compliant URI scheme pattern.
15
+ * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
16
+ *
17
+ * The pattern validates that the URI:
18
+ * 1. Starts with a letter (case insensitive)
19
+ * 2. Followed by any combination of letters, digits, +, -, or .
20
+ * 3. Followed by ://
21
+ */
22
+ const RFC_3986_SCHEME_PATTERN = /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//;
23
+ /**
24
+ * Pattern to extract the scheme from a URI.
25
+ */
26
+ const SCHEME_EXTRACT_PATTERN = /^([a-zA-Z][a-zA-Z0-9+.-]*):/;
27
+ /**
28
+ * Validate that a URI has a valid scheme per RFC 3986.
29
+ *
30
+ * @param uri - The URI to validate
31
+ * @returns true if the URI has a valid scheme, false otherwise
32
+ *
33
+ * @example
34
+ * isValidMcpUri('file:///path/to/file') // true
35
+ * isValidMcpUri('https://example.com/resource') // true
36
+ * isValidMcpUri('custom://my-resource') // true
37
+ * isValidMcpUri('/path/to/file') // false (no scheme)
38
+ * isValidMcpUri('123://invalid') // false (scheme must start with letter)
39
+ */
40
+ function isValidMcpUri(uri) {
41
+ return RFC_3986_SCHEME_PATTERN.test(uri);
42
+ }
43
+ /**
44
+ * Extract the scheme from a URI.
45
+ *
46
+ * @param uri - The URI to extract the scheme from
47
+ * @returns The scheme in lowercase, or null if no valid scheme found
48
+ *
49
+ * @example
50
+ * extractUriScheme('file:///path') // 'file'
51
+ * extractUriScheme('HTTPS://example.com') // 'https'
52
+ * extractUriScheme('/no/scheme') // null
53
+ */
54
+ function extractUriScheme(uri) {
55
+ const match = uri.match(SCHEME_EXTRACT_PATTERN);
56
+ return match ? match[1].toLowerCase() : null;
57
+ }
58
+ /**
59
+ * Validate that a URI template has a valid scheme per RFC 3986.
60
+ * URI templates follow RFC 6570 and can contain template expressions like {var}.
61
+ * The scheme portion should still be a valid static scheme.
62
+ *
63
+ * @param uriTemplate - The URI template to validate
64
+ * @returns true if the URI template has a valid scheme, false otherwise
65
+ *
66
+ * @example
67
+ * isValidMcpUriTemplate('users://{userId}/profile') // true
68
+ * isValidMcpUriTemplate('file:///{path}') // true
69
+ * isValidMcpUriTemplate('{scheme}://dynamic') // false (scheme must be static)
70
+ */
71
+ function isValidMcpUriTemplate(uriTemplate) {
72
+ // For templates, we just need to check if it starts with a valid scheme
73
+ // The template expressions come after the scheme
74
+ return RFC_3986_SCHEME_PATTERN.test(uriTemplate);
75
+ }
76
+ //# sourceMappingURL=uri-validation.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri-validation.utils.js","sourceRoot":"","sources":["../../../src/utils/uri-validation.utils.ts"],"names":[],"mappings":";AAAA,mDAAmD;;AAsCnD,sCAEC;AAaD,4CAGC;AAeD,sDAIC;AAzED;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,MAAM,uBAAuB,GAAG,+BAA+B,CAAC;AAEhE;;GAEG;AACH,MAAM,sBAAsB,GAAG,6BAA6B,CAAC;AAE7D;;;;;;;;;;;;GAYG;AACH,SAAgB,aAAa,CAAC,GAAW;IACvC,OAAO,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,qBAAqB,CAAC,WAAmB;IACvD,wEAAwE;IACxE,iDAAiD;IACjD,OAAO,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACnD,CAAC","sourcesContent":["// file: libs/sdk/src/utils/uri-validation.utils.ts\n\n/**\n * URI validation utilities for MCP resource URIs.\n *\n * Per MCP specification, resource URIs should follow RFC 3986 and include\n * a valid scheme (e.g., file://, https://, custom://).\n */\n\n/**\n * RFC 3986 compliant URI scheme pattern.\n * scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n *\n * The pattern validates that the URI:\n * 1. Starts with a letter (case insensitive)\n * 2. Followed by any combination of letters, digits, +, -, or .\n * 3. Followed by ://\n */\nconst RFC_3986_SCHEME_PATTERN = /^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//;\n\n/**\n * Pattern to extract the scheme from a URI.\n */\nconst SCHEME_EXTRACT_PATTERN = /^([a-zA-Z][a-zA-Z0-9+.-]*):/;\n\n/**\n * Validate that a URI has a valid scheme per RFC 3986.\n *\n * @param uri - The URI to validate\n * @returns true if the URI has a valid scheme, false otherwise\n *\n * @example\n * isValidMcpUri('file:///path/to/file') // true\n * isValidMcpUri('https://example.com/resource') // true\n * isValidMcpUri('custom://my-resource') // true\n * isValidMcpUri('/path/to/file') // false (no scheme)\n * isValidMcpUri('123://invalid') // false (scheme must start with letter)\n */\nexport function isValidMcpUri(uri: string): boolean {\n return RFC_3986_SCHEME_PATTERN.test(uri);\n}\n\n/**\n * Extract the scheme from a URI.\n *\n * @param uri - The URI to extract the scheme from\n * @returns The scheme in lowercase, or null if no valid scheme found\n *\n * @example\n * extractUriScheme('file:///path') // 'file'\n * extractUriScheme('HTTPS://example.com') // 'https'\n * extractUriScheme('/no/scheme') // null\n */\nexport function extractUriScheme(uri: string): string | null {\n const match = uri.match(SCHEME_EXTRACT_PATTERN);\n return match ? match[1].toLowerCase() : null;\n}\n\n/**\n * Validate that a URI template has a valid scheme per RFC 3986.\n * URI templates follow RFC 6570 and can contain template expressions like {var}.\n * The scheme portion should still be a valid static scheme.\n *\n * @param uriTemplate - The URI template to validate\n * @returns true if the URI template has a valid scheme, false otherwise\n *\n * @example\n * isValidMcpUriTemplate('users://{userId}/profile') // true\n * isValidMcpUriTemplate('file:///{path}') // true\n * isValidMcpUriTemplate('{scheme}://dynamic') // false (scheme must be static)\n */\nexport function isValidMcpUriTemplate(uriTemplate: string): boolean {\n // For templates, we just need to check if it starts with a valid scheme\n // The template expressions come after the scheme\n return RFC_3986_SCHEME_PATTERN.test(uriTemplate);\n}\n"]}
@@ -1,46 +0,0 @@
1
- /**
2
- * Test fixtures for hooks
3
- */
4
- import { HookMetadata } from '../../common/metadata';
5
- import { Token } from '../../common/interfaces';
6
- /**
7
- * Test token for hook target
8
- */
9
- export declare const TEST_HOOK_TARGET: Token;
10
- /**
11
- * Creates a simple hook metadata object
12
- */
13
- export declare function createHookMetadata(overrides?: Partial<HookMetadata>): HookMetadata;
14
- /**
15
- * Creates a "will" stage hook metadata
16
- */
17
- export declare function createWillHookMetadata(flow?: string, stage?: string): HookMetadata;
18
- /**
19
- * Creates a "did" stage hook metadata
20
- */
21
- export declare function createDidHookMetadata(flow?: string, stage?: string): HookMetadata;
22
- /**
23
- * Creates an "around" stage hook metadata
24
- */
25
- export declare function createAroundHookMetadata(flow?: string, stage?: string): HookMetadata;
26
- /**
27
- * Mock hook class for testing
28
- */
29
- export declare class MockHookClass {
30
- onExecute: jest.Mock<Promise<void>, [ctx: any], any>;
31
- willExecute: jest.Mock<Promise<void>, [ctx: any], any>;
32
- didExecute: jest.Mock<Promise<void>, [ctx: any], any>;
33
- aroundExecute: jest.Mock<Promise<any>, [ctx: any, next: () => Promise<any>], any>;
34
- }
35
- /**
36
- * Creates a mock hook instance for testing
37
- */
38
- export declare function createMockHookInstance(metadata?: Partial<HookMetadata>): {
39
- metadata: HookMetadata<keyof ExtendFlows, string, any>;
40
- instance: MockHookClass;
41
- execute: jest.Mock<Promise<void>, [ctx: any], any>;
42
- };
43
- /**
44
- * Creates multiple hooks with different priorities
45
- */
46
- export declare function createPriorityHooks(priorities: number[]): HookMetadata[];
@@ -1,114 +0,0 @@
1
- "use strict";
2
- /// <reference types="jest" />
3
- /**
4
- * Test fixtures for hooks
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.MockHookClass = exports.TEST_HOOK_TARGET = void 0;
8
- exports.createHookMetadata = createHookMetadata;
9
- exports.createWillHookMetadata = createWillHookMetadata;
10
- exports.createDidHookMetadata = createDidHookMetadata;
11
- exports.createAroundHookMetadata = createAroundHookMetadata;
12
- exports.createMockHookInstance = createMockHookInstance;
13
- exports.createPriorityHooks = createPriorityHooks;
14
- /**
15
- * Test token for hook target
16
- */
17
- exports.TEST_HOOK_TARGET = Symbol('TEST_HOOK_TARGET');
18
- /**
19
- * Creates a simple hook metadata object
20
- */
21
- function createHookMetadata(overrides = {}) {
22
- return {
23
- type: 'stage',
24
- flow: 'CallToolFlow',
25
- stage: 'execute',
26
- target: exports.TEST_HOOK_TARGET,
27
- method: 'onExecute',
28
- priority: 0,
29
- ...overrides,
30
- };
31
- }
32
- /**
33
- * Creates a "will" stage hook metadata
34
- */
35
- function createWillHookMetadata(flow = 'CallToolFlow', stage = 'execute') {
36
- return {
37
- type: 'will',
38
- flow: flow,
39
- stage,
40
- target: exports.TEST_HOOK_TARGET,
41
- method: 'willExecute',
42
- priority: 0,
43
- };
44
- }
45
- /**
46
- * Creates a "did" stage hook metadata
47
- */
48
- function createDidHookMetadata(flow = 'CallToolFlow', stage = 'execute') {
49
- return {
50
- type: 'did',
51
- flow: flow,
52
- stage,
53
- target: exports.TEST_HOOK_TARGET,
54
- method: 'didExecute',
55
- priority: 0,
56
- };
57
- }
58
- /**
59
- * Creates an "around" stage hook metadata
60
- */
61
- function createAroundHookMetadata(flow = 'CallToolFlow', stage = 'execute') {
62
- return {
63
- type: 'around',
64
- flow: flow,
65
- stage,
66
- target: exports.TEST_HOOK_TARGET,
67
- method: 'aroundExecute',
68
- priority: 0,
69
- };
70
- }
71
- /**
72
- * Mock hook class for testing
73
- */
74
- class MockHookClass {
75
- onExecute = jest.fn(async (ctx) => {
76
- // Mock hook implementation
77
- });
78
- willExecute = jest.fn(async (ctx) => {
79
- // Mock will hook implementation
80
- });
81
- didExecute = jest.fn(async (ctx) => {
82
- // Mock did hook implementation
83
- });
84
- aroundExecute = jest.fn(async (ctx, next) => {
85
- // Mock around hook implementation
86
- return await next();
87
- });
88
- }
89
- exports.MockHookClass = MockHookClass;
90
- /**
91
- * Creates a mock hook instance for testing
92
- */
93
- function createMockHookInstance(metadata) {
94
- const mockClass = new MockHookClass();
95
- return {
96
- metadata: createHookMetadata(metadata),
97
- instance: mockClass,
98
- execute: mockClass.onExecute,
99
- };
100
- }
101
- /**
102
- * Creates multiple hooks with different priorities
103
- */
104
- function createPriorityHooks(priorities) {
105
- return priorities.map((priority, index) => ({
106
- type: 'stage',
107
- flow: 'CallToolFlow',
108
- stage: 'execute',
109
- target: Symbol(`HOOK_${index}`),
110
- method: 'onExecute',
111
- priority,
112
- }));
113
- }
114
- //# sourceMappingURL=hook.fixtures.js.map