@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 +1 @@
1
- {"version":3,"file":"transport.registry.js","sourceRoot":"","sources":["../../../src/transport/transport.registry.ts"],"names":[],"mappings":"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","sourcesContent":["// server/transport/transport.registry.ts\nimport {createHash} from 'crypto';\nimport {\n TransportBus,\n Transporter,\n TransportKey,\n TransportRegistryBucket,\n TransportTokenBucket,\n TransportType,\n TransportTypeBucket,\n} from './transport.types';\nimport {RemoteTransporter} from './transport.remote';\nimport {LocalTransporter} from './transport.local';\nimport {ServerResponse} from '../common';\nimport {Scope} from '../scope';\nimport HandleStreamableHttpFlow from './flows/handle.streamable-http.flow';\nimport HandleSseFlow from './flows/handle.sse.flow';\n\nexport class TransportService {\n readonly ready: Promise<void>;\n private readonly byType: TransportRegistryBucket = new Map();\n private readonly distributed: boolean;\n private readonly bus?: TransportBus;\n private readonly scope: Scope;\n\n constructor(scope: Scope) {\n this.scope = scope;\n this.distributed = false; // get from scope metadata\n this.bus = undefined; // get from scope metadata\n if (this.distributed && !this.bus) {\n throw new Error('TransportRegistry: distributed=true requires a TransportBus implementation.');\n }\n\n this.ready = this.initialize();\n\n }\n\n\n private async initialize() {\n await this.scope.registryFlows(\n HandleStreamableHttpFlow,\n HandleSseFlow,\n );\n }\n\n async destroy() {\n /* empty */\n }\n\n async getTransporter(type: TransportType, token: string, sessionId: string): Promise<Transporter | undefined> {\n const key = this.keyOf(type, token, sessionId);\n\n const local = this.lookupLocal(key);\n if (local) return local;\n\n if (this.distributed && this.bus) {\n const location = await this.bus.lookup(key);\n if (location) {\n return new RemoteTransporter(key, this.bus);\n }\n }\n\n return undefined;\n }\n\n async createTransporter(\n type: TransportType,\n token: string,\n sessionId: string,\n res: ServerResponse,\n ): Promise<Transporter> {\n const key = this.keyOf(type, token, sessionId);\n const existing = this.lookupLocal(key);\n if (existing) return existing;\n\n const transporter = new LocalTransporter(this.scope, key, res, () => {\n key.sessionId = sessionId;\n this.evictLocal(key);\n if (this.distributed && this.bus) {\n this.bus.revoke(key).catch(() => void 0);\n }\n });\n\n await transporter.ready();\n\n this.insertLocal(key, transporter);\n\n if (this.distributed && this.bus) {\n await this.bus.advertise(key);\n }\n\n return transporter;\n }\n\n async destroyTransporter(type: TransportType, token: string, sessionId: string, reason?: string): Promise<void> {\n const key = this.keyOf(type, token, sessionId);\n\n const local = this.lookupLocal(key);\n if (local) {\n await local.destroy(reason);\n return;\n }\n\n if (this.distributed && this.bus) {\n const location = await this.bus.lookup(key);\n if (location) {\n await this.bus.destroyRemote(key, reason);\n return;\n }\n }\n\n throw new Error('Invalid session: cannot destroy non-existent transporter.');\n }\n\n /* --------------------------------- internals -------------------------------- */\n\n private sha256(value: string): string {\n return createHash('sha256').update(value, 'utf8').digest('hex');\n }\n\n private keyOf(type: TransportType, token: string, sessionId: string, sessionIdSse?: string): TransportKey {\n return {\n type,\n token,\n tokenHash: this.sha256(token),\n sessionId,\n sessionIdSse,\n };\n }\n\n private ensureTypeBucket(type: TransportType): TransportTypeBucket {\n let bucket = this.byType.get(type);\n if (!bucket) {\n bucket = new Map<string, TransportTokenBucket>();\n this.byType.set(type, bucket);\n }\n return bucket;\n }\n\n private ensureTokenBucket(typeBucket: TransportTypeBucket, tokenHash: string): TransportTokenBucket {\n let bucket = typeBucket.get(tokenHash);\n if (!bucket) {\n bucket = new Map<string, Transporter>();\n typeBucket.set(tokenHash, bucket);\n }\n return bucket;\n }\n\n\n private lookupLocal(key: TransportKey): Transporter | undefined {\n const typeBucket = this.byType.get(key.type);\n if (!typeBucket) return undefined;\n const tokenBucket = typeBucket.get(key.tokenHash);\n if (!tokenBucket) return undefined;\n return tokenBucket.get(key.sessionId);\n }\n\n private insertLocal(key: TransportKey, t: Transporter): void {\n const typeBucket = this.ensureTypeBucket(key.type);\n const tokenBucket = this.ensureTokenBucket(typeBucket, key.tokenHash);\n tokenBucket.set(key.sessionId, t);\n }\n\n private evictLocal(key: TransportKey): void {\n const typeBucket = this.byType.get(key.type);\n if (!typeBucket) return;\n const tokenBucket = typeBucket.get(key.tokenHash);\n if (!tokenBucket) return;\n tokenBucket.delete(key.sessionId);\n if (tokenBucket.size === 0) typeBucket.delete(key.tokenHash);\n if (typeBucket.size === 0) this.byType.delete(key.type);\n }\n}\n"]}
1
+ {"version":3,"file":"transport.registry.js","sourceRoot":"","sources":["../../../src/transport/transport.registry.ts"],"names":[],"mappings":"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","sourcesContent":["// server/transport/transport.registry.ts\nimport { createHash } from 'crypto';\nimport {\n TransportBus,\n Transporter,\n TransportKey,\n TransportRegistryBucket,\n TransportTokenBucket,\n TransportType,\n TransportTypeBucket,\n} from './transport.types';\nimport { RemoteTransporter } from './transport.remote';\nimport { LocalTransporter } from './transport.local';\nimport { ServerResponse } from '../common';\nimport { Scope } from '../scope';\nimport HandleStreamableHttpFlow from './flows/handle.streamable-http.flow';\nimport HandleSseFlow from './flows/handle.sse.flow';\nimport HandleStatelessHttpFlow from './flows/handle.stateless-http.flow';\n\nexport class TransportService {\n readonly ready: Promise<void>;\n private readonly byType: TransportRegistryBucket = new Map();\n private readonly distributed: boolean;\n private readonly bus?: TransportBus;\n private readonly scope: Scope;\n\n /**\n * Session history cache for tracking if sessions were ever created.\n * Used to differentiate between \"session never initialized\" (HTTP 400) and\n * \"session expired/terminated\" (HTTP 404) per MCP Spec 2025-11-25.\n *\n * Key: \"type:tokenHash:sessionId\", Value: creation timestamp\n */\n private readonly sessionHistory: Map<string, number> = new Map();\n private readonly MAX_SESSION_HISTORY = 10000;\n\n constructor(scope: Scope) {\n this.scope = scope;\n this.distributed = false; // get from scope metadata\n this.bus = undefined; // get from scope metadata\n if (this.distributed && !this.bus) {\n throw new Error('TransportRegistry: distributed=true requires a TransportBus implementation.');\n }\n\n this.ready = this.initialize();\n }\n\n private async initialize() {\n await this.scope.registryFlows(HandleStreamableHttpFlow, HandleSseFlow, HandleStatelessHttpFlow);\n }\n\n async destroy() {\n /* empty */\n }\n\n async getTransporter(type: TransportType, token: string, sessionId: string): Promise<Transporter | undefined> {\n const key = this.keyOf(type, token, sessionId);\n\n const local = this.lookupLocal(key);\n if (local) return local;\n\n if (this.distributed && this.bus) {\n const location = await this.bus.lookup(key);\n if (location) {\n return new RemoteTransporter(key, this.bus);\n }\n }\n\n return undefined;\n }\n\n async createTransporter(\n type: TransportType,\n token: string,\n sessionId: string,\n res: ServerResponse,\n ): Promise<Transporter> {\n const key = this.keyOf(type, token, sessionId);\n const existing = this.lookupLocal(key);\n if (existing) return existing;\n\n const transporter = new LocalTransporter(this.scope, key, res, () => {\n key.sessionId = sessionId;\n this.evictLocal(key);\n if (this.distributed && this.bus) {\n this.bus.revoke(key).catch(() => void 0);\n }\n });\n\n await transporter.ready();\n\n this.insertLocal(key, transporter);\n\n if (this.distributed && this.bus) {\n await this.bus.advertise(key);\n }\n\n return transporter;\n }\n\n async destroyTransporter(type: TransportType, token: string, sessionId: string, reason?: string): Promise<void> {\n const key = this.keyOf(type, token, sessionId);\n\n const local = this.lookupLocal(key);\n if (local) {\n await local.destroy(reason);\n return;\n }\n\n if (this.distributed && this.bus) {\n const location = await this.bus.lookup(key);\n if (location) {\n await this.bus.destroyRemote(key, reason);\n return;\n }\n }\n\n throw new Error('Invalid session: cannot destroy non-existent transporter.');\n }\n\n /**\n * Get or create a shared singleton transport for anonymous stateless requests.\n * All anonymous requests share the same transport instance.\n */\n async getOrCreateAnonymousStatelessTransport(type: TransportType, res: ServerResponse): Promise<Transporter> {\n const key = this.keyOf(type, '__anonymous__', '__stateless__');\n const existing = this.lookupLocal(key);\n if (existing) return existing;\n\n // Create shared transport for all anonymous requests\n const transporter = new LocalTransporter(this.scope, key, res, () => {\n this.evictLocal(key);\n if (this.distributed && this.bus) {\n this.bus.revoke(key).catch(() => void 0);\n }\n });\n\n await transporter.ready();\n this.insertLocal(key, transporter);\n\n if (this.distributed && this.bus) {\n await this.bus.advertise(key);\n }\n\n return transporter;\n }\n\n /**\n * Get or create a singleton transport for authenticated stateless requests.\n * Each unique token gets its own singleton transport.\n */\n async getOrCreateAuthenticatedStatelessTransport(\n type: TransportType,\n token: string,\n res: ServerResponse,\n ): Promise<Transporter> {\n const key = this.keyOf(type, token, '__stateless__');\n const existing = this.lookupLocal(key);\n if (existing) return existing;\n\n // Create singleton transport for this token\n const transporter = new LocalTransporter(this.scope, key, res, () => {\n this.evictLocal(key);\n if (this.distributed && this.bus) {\n this.bus.revoke(key).catch(() => void 0);\n }\n });\n\n await transporter.ready();\n this.insertLocal(key, transporter);\n\n if (this.distributed && this.bus) {\n await this.bus.advertise(key);\n }\n\n return transporter;\n }\n\n /**\n * Check if a session was ever created (even if it's been terminated/evicted).\n * Used to differentiate between \"session never initialized\" (HTTP 400) and\n * \"session expired/terminated\" (HTTP 404) per MCP Spec 2025-11-25.\n *\n * @param type - Transport type (e.g., 'streamable-http', 'sse')\n * @param token - The authorization token\n * @param sessionId - The session ID to check\n * @returns true if session was ever created, false otherwise\n */\n wasSessionCreated(type: TransportType, token: string, sessionId: string): boolean {\n const tokenHash = this.sha256(token);\n const historyKey = `${type}:${tokenHash}:${sessionId}`;\n return this.sessionHistory.has(historyKey);\n }\n\n /* --------------------------------- internals -------------------------------- */\n\n private sha256(value: string): string {\n return createHash('sha256').update(value, 'utf8').digest('hex');\n }\n\n private keyOf(type: TransportType, token: string, sessionId: string, sessionIdSse?: string): TransportKey {\n return {\n type,\n token,\n tokenHash: this.sha256(token),\n sessionId,\n sessionIdSse,\n };\n }\n\n private ensureTypeBucket(type: TransportType): TransportTypeBucket {\n let bucket = this.byType.get(type);\n if (!bucket) {\n bucket = new Map<string, TransportTokenBucket>();\n this.byType.set(type, bucket);\n }\n return bucket;\n }\n\n private ensureTokenBucket(typeBucket: TransportTypeBucket, tokenHash: string): TransportTokenBucket {\n let bucket = typeBucket.get(tokenHash);\n if (!bucket) {\n bucket = new Map<string, Transporter>();\n typeBucket.set(tokenHash, bucket);\n }\n return bucket;\n }\n\n private lookupLocal(key: TransportKey): Transporter | undefined {\n const typeBucket = this.byType.get(key.type);\n if (!typeBucket) return undefined;\n const tokenBucket = typeBucket.get(key.tokenHash);\n if (!tokenBucket) return undefined;\n return tokenBucket.get(key.sessionId);\n }\n\n private insertLocal(key: TransportKey, t: Transporter): void {\n const typeBucket = this.ensureTypeBucket(key.type);\n const tokenBucket = this.ensureTokenBucket(typeBucket, key.tokenHash);\n tokenBucket.set(key.sessionId, t);\n\n // Record session creation in history for HTTP 404 detection\n const historyKey = `${key.type}:${key.tokenHash}:${key.sessionId}`;\n this.sessionHistory.set(historyKey, Date.now());\n\n // Evict oldest entries if cache exceeds max size (LRU-like eviction)\n if (this.sessionHistory.size > this.MAX_SESSION_HISTORY) {\n const entries = [...this.sessionHistory.entries()].sort((a, b) => a[1] - b[1]);\n // Remove oldest 10% of entries\n const toEvict = Math.ceil(this.MAX_SESSION_HISTORY * 0.1);\n for (let i = 0; i < toEvict && i < entries.length; i++) {\n this.sessionHistory.delete(entries[i][0]);\n }\n }\n }\n\n private evictLocal(key: TransportKey): void {\n const typeBucket = this.byType.get(key.type);\n if (!typeBucket) return;\n const tokenBucket = typeBucket.get(key.tokenHash);\n if (!tokenBucket) return;\n tokenBucket.delete(key.sessionId);\n if (tokenBucket.size === 0) typeBucket.delete(key.tokenHash);\n if (typeBucket.size === 0) this.byType.delete(key.type);\n }\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  import { AuthenticatedServerRequest } from '../server/server.types';
2
2
  import { ElicitResult } from '@modelcontextprotocol/sdk/types.js';
3
- import { ZodObject } from 'zod';
3
+ import { ZodType } from 'zod';
4
4
  import { Infer } from '../utils/types.utils';
5
5
  import { ServerResponse } from '../common';
6
- export type TransportType = 'sse' | 'streamable-http' | 'http';
6
+ export type TransportType = 'sse' | 'streamable-http' | 'http' | 'stateless-http';
7
7
  export interface TransportKey {
8
8
  type: TransportType;
9
9
  token: string;
@@ -48,7 +48,7 @@ export interface TransportRegistryOptions {
48
48
  export type TransportTokenBucket = Map<string, Transporter>;
49
49
  export type TransportTypeBucket = Map<string, TransportTokenBucket>;
50
50
  export type TransportRegistryBucket = Map<TransportType, TransportTypeBucket>;
51
- export type TypedElicitResult<T extends ZodObject<any>> = {
51
+ export type TypedElicitResult<T extends ZodType> = {
52
52
  action: ElicitResult['action'];
53
53
  content: Infer<T>;
54
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"transport.types.js","sourceRoot":"","sources":["../../../src/transport/transport.types.ts"],"names":[],"mappings":"","sourcesContent":["import { AuthenticatedServerRequest } from '../server/server.types';\nimport { ElicitResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodObject } from 'zod';\nimport { Infer } from '../utils/types.utils';\nimport { ServerResponse } from '../common';\n\nexport type TransportType = 'sse' | 'streamable-http' | 'http';\n\nexport interface TransportKey {\n type: TransportType;\n token: string;\n tokenHash: string;\n sessionId: string;\n sessionIdSse?: string;\n}\n\nexport interface RemoteLocation {\n nodeId: string;\n channel: string;\n}\n\nexport interface TransportBus {\n nodeId(): string;\n\n advertise(key: TransportKey): Promise<void>;\n\n revoke(key: TransportKey): Promise<void>;\n\n lookup(key: TransportKey): Promise<RemoteLocation | null>;\n\n proxyRequest(\n key: TransportKey,\n payload: {\n method?: string;\n url?: string;\n headers?: Record<string, string | string[] | undefined>;\n },\n io: {\n onResponseStart(statusCode: number, headers: Record<string, string>): void;\n onResponseChunk(chunk: Uint8Array | string): void;\n onResponseEnd(finalChunk?: Uint8Array | string): void;\n onError?(err: Error | string): void;\n },\n ): Promise<void>;\n\n destroyRemote(key: TransportKey, reason?: string): Promise<void>;\n}\n\n/* --------------------------------- API ---------------------------------- */\n\nexport interface Transporter {\n readonly type: TransportType;\n readonly tokenHash: string;\n readonly sessionId: string;\n\n initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;\n\n handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;\n\n destroy(reason?: string): Promise<void>;\n\n ping(timeoutMs?: number): Promise<boolean>;\n}\n\nexport interface TransportRegistryOptions {\n distributed?: boolean;\n bus?: TransportBus;\n}\n\nexport type TransportTokenBucket = Map<string, Transporter>; // sessionHash -> Transporter\nexport type TransportTypeBucket = Map<string, TransportTokenBucket>; // tokenHash -> TokenBucket\nexport type TransportRegistryBucket = Map<TransportType, TransportTypeBucket>; // tokenHash -> TokenBucket\n\nexport type TypedElicitResult<T extends ZodObject<any>> = { action: ElicitResult['action']; content: Infer<T> };\n"]}
1
+ {"version":3,"file":"transport.types.js","sourceRoot":"","sources":["../../../src/transport/transport.types.ts"],"names":[],"mappings":"","sourcesContent":["import { AuthenticatedServerRequest } from '../server/server.types';\nimport { ElicitResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodType } from 'zod';\nimport { Infer } from '../utils/types.utils';\nimport { ServerResponse } from '../common';\n\nexport type TransportType = 'sse' | 'streamable-http' | 'http' | 'stateless-http';\n\nexport interface TransportKey {\n type: TransportType;\n token: string;\n tokenHash: string;\n sessionId: string;\n sessionIdSse?: string;\n}\n\nexport interface RemoteLocation {\n nodeId: string;\n channel: string;\n}\n\nexport interface TransportBus {\n nodeId(): string;\n\n advertise(key: TransportKey): Promise<void>;\n\n revoke(key: TransportKey): Promise<void>;\n\n lookup(key: TransportKey): Promise<RemoteLocation | null>;\n\n proxyRequest(\n key: TransportKey,\n payload: {\n method?: string;\n url?: string;\n headers?: Record<string, string | string[] | undefined>;\n },\n io: {\n onResponseStart(statusCode: number, headers: Record<string, string>): void;\n onResponseChunk(chunk: Uint8Array | string): void;\n onResponseEnd(finalChunk?: Uint8Array | string): void;\n onError?(err: Error | string): void;\n },\n ): Promise<void>;\n\n destroyRemote(key: TransportKey, reason?: string): Promise<void>;\n}\n\n/* --------------------------------- API ---------------------------------- */\n\nexport interface Transporter {\n readonly type: TransportType;\n readonly tokenHash: string;\n readonly sessionId: string;\n\n initialize(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;\n\n handleRequest(req: AuthenticatedServerRequest, res: ServerResponse): Promise<void>;\n\n destroy(reason?: string): Promise<void>;\n\n ping(timeoutMs?: number): Promise<boolean>;\n}\n\nexport interface TransportRegistryOptions {\n distributed?: boolean;\n bus?: TransportBus;\n}\n\nexport type TransportTokenBucket = Map<string, Transporter>; // sessionHash -> Transporter\nexport type TransportTypeBucket = Map<string, TransportTokenBucket>; // tokenHash -> TokenBucket\nexport type TransportRegistryBucket = Map<TransportType, TransportTypeBucket>; // tokenHash -> TokenBucket\n\nexport type TypedElicitResult<T extends ZodType> = { action: ElicitResult['action']; content: Infer<T> };\n"]}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Sanitize arbitrary JS values into JSON-safe objects suitable for:
3
+ * - MCP `structuredContent`
4
+ * - JSON.stringify without circular reference errors
5
+ *
6
+ * Rules:
7
+ * - Drop functions and symbols.
8
+ * - BigInt → string.
9
+ * - Date → ISO string.
10
+ * - Error → { name, message, stack }.
11
+ * - Map → plain object.
12
+ * - Set → array.
13
+ * - Protect against circular references via WeakSet.
14
+ */
15
+ export declare function sanitizeToJson(value: unknown): unknown;
16
+ /**
17
+ * Convert a value to MCP structuredContent format.
18
+ * Returns Record<string, unknown> or undefined (matching MCP's structuredContent type).
19
+ * Primitives and arrays are wrapped in { value: ... }.
20
+ */
21
+ export declare function toStructuredContent(value: unknown): Record<string, unknown> | undefined;
22
+ /** MCP-compatible text resource content */
23
+ export type TextContent = {
24
+ uri: string;
25
+ mimeType?: string;
26
+ text: string;
27
+ };
28
+ /** MCP-compatible blob resource content */
29
+ export type BlobContent = {
30
+ uri: string;
31
+ mimeType?: string;
32
+ blob: string;
33
+ };
34
+ /** MCP-compatible resource content (text or blob) */
35
+ export type ResourceContent = TextContent | BlobContent;
36
+ /**
37
+ * Build a resource content item for MCP ReadResourceResult format.
38
+ * Handles both text and binary (blob) content.
39
+ *
40
+ * @param uri - The resource URI
41
+ * @param content - The content to serialize (string, Buffer, object, etc.)
42
+ * @param mimeType - Optional MIME type override
43
+ */
44
+ export declare function buildResourceContent(uri: string, content: unknown, mimeType?: string): ResourceContent;
45
+ /**
46
+ * Infer MIME type from file extension or content.
47
+ */
48
+ export declare function inferMimeType(uri: string, content?: unknown): string;
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/utils/content.utils.ts
3
+ // Content building and sanitization utilities for MCP responses
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.sanitizeToJson = sanitizeToJson;
6
+ exports.toStructuredContent = toStructuredContent;
7
+ exports.buildResourceContent = buildResourceContent;
8
+ exports.inferMimeType = inferMimeType;
9
+ /**
10
+ * Sanitize arbitrary JS values into JSON-safe objects suitable for:
11
+ * - MCP `structuredContent`
12
+ * - JSON.stringify without circular reference errors
13
+ *
14
+ * Rules:
15
+ * - Drop functions and symbols.
16
+ * - BigInt → string.
17
+ * - Date → ISO string.
18
+ * - Error → { name, message, stack }.
19
+ * - Map → plain object.
20
+ * - Set → array.
21
+ * - Protect against circular references via WeakSet.
22
+ */
23
+ function sanitizeToJson(value) {
24
+ const seen = new WeakSet();
25
+ function sanitize(val) {
26
+ if (typeof val === 'function' || typeof val === 'symbol') {
27
+ return undefined;
28
+ }
29
+ if (typeof val === 'bigint') {
30
+ return val.toString();
31
+ }
32
+ if (val instanceof Date) {
33
+ return val.toISOString();
34
+ }
35
+ if (val instanceof Error) {
36
+ return {
37
+ name: val.name,
38
+ message: val.message,
39
+ stack: val.stack,
40
+ };
41
+ }
42
+ if (val instanceof Map) {
43
+ const obj = {};
44
+ for (const [k, v] of val.entries()) {
45
+ obj[String(k)] = sanitize(v);
46
+ }
47
+ return obj;
48
+ }
49
+ if (val instanceof Set) {
50
+ return Array.from(val).map(sanitize);
51
+ }
52
+ if (Array.isArray(val)) {
53
+ if (seen.has(val)) {
54
+ return undefined;
55
+ }
56
+ seen.add(val);
57
+ return val.map(sanitize);
58
+ }
59
+ if (val && typeof val === 'object') {
60
+ if (seen.has(val)) {
61
+ // Drop circular references
62
+ return undefined;
63
+ }
64
+ seen.add(val);
65
+ const sanitized = {};
66
+ for (const [key, value] of Object.entries(val)) {
67
+ const clean = sanitize(value);
68
+ if (clean !== undefined) {
69
+ sanitized[key] = clean;
70
+ }
71
+ }
72
+ return sanitized;
73
+ }
74
+ // Primitives pass through
75
+ return val;
76
+ }
77
+ return sanitize(value);
78
+ }
79
+ /**
80
+ * Convert a value to MCP structuredContent format.
81
+ * Returns Record<string, unknown> or undefined (matching MCP's structuredContent type).
82
+ * Primitives and arrays are wrapped in { value: ... }.
83
+ */
84
+ function toStructuredContent(value) {
85
+ const result = sanitizeToJson(value);
86
+ if (result === undefined || result === null)
87
+ return undefined;
88
+ if (typeof result === 'object' && !Array.isArray(result)) {
89
+ return result;
90
+ }
91
+ // Wrap primitives and arrays in an object
92
+ return { value: result };
93
+ }
94
+ /**
95
+ * Build a resource content item for MCP ReadResourceResult format.
96
+ * Handles both text and binary (blob) content.
97
+ *
98
+ * @param uri - The resource URI
99
+ * @param content - The content to serialize (string, Buffer, object, etc.)
100
+ * @param mimeType - Optional MIME type override
101
+ */
102
+ function buildResourceContent(uri, content, mimeType) {
103
+ // If content is already in the expected format
104
+ if (content && typeof content === 'object') {
105
+ const obj = content;
106
+ if ('blob' in obj && typeof obj['blob'] === 'string') {
107
+ return {
108
+ uri,
109
+ mimeType: obj['mimeType'] || mimeType,
110
+ blob: obj['blob'],
111
+ };
112
+ }
113
+ if ('text' in obj && typeof obj['text'] === 'string') {
114
+ return {
115
+ uri,
116
+ mimeType: obj['mimeType'] || mimeType,
117
+ text: obj['text'],
118
+ };
119
+ }
120
+ }
121
+ // Binary content (Buffer, Uint8Array)
122
+ if (Buffer.isBuffer(content) || content instanceof Uint8Array) {
123
+ const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content);
124
+ return {
125
+ uri,
126
+ mimeType: mimeType || 'application/octet-stream',
127
+ blob: buffer.toString('base64'),
128
+ };
129
+ }
130
+ // String content
131
+ if (typeof content === 'string') {
132
+ return {
133
+ uri,
134
+ mimeType: mimeType || 'text/plain',
135
+ text: content,
136
+ };
137
+ }
138
+ // JSON-serializable content
139
+ try {
140
+ return {
141
+ uri,
142
+ mimeType: mimeType || 'application/json',
143
+ text: JSON.stringify(content),
144
+ };
145
+ }
146
+ catch {
147
+ return {
148
+ uri,
149
+ mimeType: mimeType || 'text/plain',
150
+ text: String(content),
151
+ };
152
+ }
153
+ }
154
+ /**
155
+ * Infer MIME type from file extension or content.
156
+ */
157
+ function inferMimeType(uri, content) {
158
+ // Try to infer from URI extension
159
+ const ext = uri.split('.').pop()?.toLowerCase();
160
+ const mimeTypes = {
161
+ json: 'application/json',
162
+ xml: 'application/xml',
163
+ html: 'text/html',
164
+ htm: 'text/html',
165
+ css: 'text/css',
166
+ js: 'application/javascript',
167
+ ts: 'application/typescript',
168
+ txt: 'text/plain',
169
+ md: 'text/markdown',
170
+ yaml: 'application/yaml',
171
+ yml: 'application/yaml',
172
+ csv: 'text/csv',
173
+ png: 'image/png',
174
+ jpg: 'image/jpeg',
175
+ jpeg: 'image/jpeg',
176
+ gif: 'image/gif',
177
+ svg: 'image/svg+xml',
178
+ pdf: 'application/pdf',
179
+ };
180
+ if (ext && mimeTypes[ext]) {
181
+ return mimeTypes[ext];
182
+ }
183
+ // Try to infer from content
184
+ if (typeof content === 'string') {
185
+ if (content.trim().startsWith('{') || content.trim().startsWith('[')) {
186
+ return 'application/json';
187
+ }
188
+ if (content.trim().startsWith('<')) {
189
+ return content.includes('<!DOCTYPE html') || content.includes('<html') ? 'text/html' : 'application/xml';
190
+ }
191
+ }
192
+ return 'text/plain';
193
+ }
194
+ //# sourceMappingURL=content.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.utils.js","sourceRoot":"","sources":["../../../src/utils/content.utils.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/utils/content.utils.ts\n// Content building and sanitization utilities for MCP responses\n\n/**\n * Sanitize arbitrary JS values into JSON-safe objects suitable for:\n * - MCP `structuredContent`\n * - JSON.stringify without circular reference errors\n *\n * Rules:\n * - Drop functions and symbols.\n * - BigInt → string.\n * - Date → ISO string.\n * - Error → { name, message, stack }.\n * - Map → plain object.\n * - Set → array.\n * - Protect against circular references via WeakSet.\n */\nexport function sanitizeToJson(value: unknown): unknown {\n const seen = new WeakSet<object>();\n\n function sanitize(val: unknown): unknown {\n if (typeof val === 'function' || typeof val === 'symbol') {\n return undefined;\n }\n\n if (typeof val === 'bigint') {\n return val.toString();\n }\n\n if (val instanceof Date) {\n return val.toISOString();\n }\n\n if (val instanceof Error) {\n return {\n name: val.name,\n message: val.message,\n stack: val.stack,\n };\n }\n\n if (val instanceof Map) {\n const obj: Record<string, unknown> = {};\n for (const [k, v] of val.entries()) {\n obj[String(k)] = sanitize(v);\n }\n return obj;\n }\n\n if (val instanceof Set) {\n return Array.from(val).map(sanitize);\n }\n\n if (Array.isArray(val)) {\n if (seen.has(val)) {\n return undefined;\n }\n seen.add(val);\n return val.map(sanitize);\n }\n\n if (val && typeof val === 'object') {\n if (seen.has(val)) {\n // Drop circular references\n return undefined;\n }\n seen.add(val);\n\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(val)) {\n const clean = sanitize(value);\n if (clean !== undefined) {\n sanitized[key] = clean;\n }\n }\n return sanitized;\n }\n\n // Primitives pass through\n return val;\n }\n\n return sanitize(value);\n}\n\n/**\n * Convert a value to MCP structuredContent format.\n * Returns Record<string, unknown> or undefined (matching MCP's structuredContent type).\n * Primitives and arrays are wrapped in { value: ... }.\n */\nexport function toStructuredContent(value: unknown): Record<string, unknown> | undefined {\n const result = sanitizeToJson(value);\n if (result === undefined || result === null) return undefined;\n if (typeof result === 'object' && !Array.isArray(result)) {\n return result as Record<string, unknown>;\n }\n // Wrap primitives and arrays in an object\n return { value: result };\n}\n\n/** MCP-compatible text resource content */\nexport type TextContent = {\n uri: string;\n mimeType?: string;\n text: string;\n};\n\n/** MCP-compatible blob resource content */\nexport type BlobContent = {\n uri: string;\n mimeType?: string;\n blob: string;\n};\n\n/** MCP-compatible resource content (text or blob) */\nexport type ResourceContent = TextContent | BlobContent;\n\n/**\n * Build a resource content item for MCP ReadResourceResult format.\n * Handles both text and binary (blob) content.\n *\n * @param uri - The resource URI\n * @param content - The content to serialize (string, Buffer, object, etc.)\n * @param mimeType - Optional MIME type override\n */\nexport function buildResourceContent(uri: string, content: unknown, mimeType?: string): ResourceContent {\n // If content is already in the expected format\n if (content && typeof content === 'object') {\n const obj = content as Record<string, unknown>;\n if ('blob' in obj && typeof obj['blob'] === 'string') {\n return {\n uri,\n mimeType: (obj['mimeType'] as string) || mimeType,\n blob: obj['blob'],\n };\n }\n if ('text' in obj && typeof obj['text'] === 'string') {\n return {\n uri,\n mimeType: (obj['mimeType'] as string) || mimeType,\n text: obj['text'],\n };\n }\n }\n\n // Binary content (Buffer, Uint8Array)\n if (Buffer.isBuffer(content) || content instanceof Uint8Array) {\n const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content);\n return {\n uri,\n mimeType: mimeType || 'application/octet-stream',\n blob: buffer.toString('base64'),\n };\n }\n\n // String content\n if (typeof content === 'string') {\n return {\n uri,\n mimeType: mimeType || 'text/plain',\n text: content,\n };\n }\n\n // JSON-serializable content\n try {\n return {\n uri,\n mimeType: mimeType || 'application/json',\n text: JSON.stringify(content),\n };\n } catch {\n return {\n uri,\n mimeType: mimeType || 'text/plain',\n text: String(content),\n };\n }\n}\n\n/**\n * Infer MIME type from file extension or content.\n */\nexport function inferMimeType(uri: string, content?: unknown): string {\n // Try to infer from URI extension\n const ext = uri.split('.').pop()?.toLowerCase();\n const mimeTypes: Record<string, string> = {\n json: 'application/json',\n xml: 'application/xml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n txt: 'text/plain',\n md: 'text/markdown',\n yaml: 'application/yaml',\n yml: 'application/yaml',\n csv: 'text/csv',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n svg: 'image/svg+xml',\n pdf: 'application/pdf',\n };\n\n if (ext && mimeTypes[ext]) {\n return mimeTypes[ext];\n }\n\n // Try to infer from content\n if (typeof content === 'string') {\n if (content.trim().startsWith('{') || content.trim().startsWith('[')) {\n return 'application/json';\n }\n if (content.trim().startsWith('<')) {\n return content.includes('<!DOCTYPE html') || content.includes('<html') ? 'text/html' : 'application/xml';\n }\n }\n\n return 'text/plain';\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export { NameCase, splitWords, toCase, sepFor, normalizeSegment, normalizeProviderId, normalizeOwnerPath, shortHash, ensureMaxLen, } from './naming.utils';
2
+ export { ownerKeyOf, qualifiedNameOf, parseQualifiedName, lineageDepth, lineagesEqual, isAncestorLineage, } from './lineage.utils';
3
+ export { isValidMcpUri, extractUriScheme, isValidMcpUriTemplate } from './uri-validation.utils';
4
+ export { parseUriTemplate, matchUriTemplate, expandUriTemplate } from './uri-template.utils';
5
+ export { tokenName, isClass, isPromise, depsOfClass, depsOfFunc } from './token.utils';
6
+ export { sanitizeToJson, toStructuredContent, TextContent, BlobContent, ResourceContent, buildResourceContent, inferMimeType, } from './content.utils';
7
+ export { idFromString } from './string.utils';
8
+ export { getMetadata, setMetadata, hasAsyncWith } from './metadata.utils';
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/utils/index.ts
3
+ // Centralized exports for SDK utilities
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.hasAsyncWith = exports.setMetadata = exports.getMetadata = exports.idFromString = exports.inferMimeType = exports.buildResourceContent = exports.toStructuredContent = exports.sanitizeToJson = exports.depsOfFunc = exports.depsOfClass = exports.isPromise = exports.isClass = exports.tokenName = exports.expandUriTemplate = exports.matchUriTemplate = exports.parseUriTemplate = exports.isValidMcpUriTemplate = exports.extractUriScheme = exports.isValidMcpUri = exports.isAncestorLineage = exports.lineagesEqual = exports.lineageDepth = exports.parseQualifiedName = exports.qualifiedNameOf = exports.ownerKeyOf = exports.ensureMaxLen = exports.shortHash = exports.normalizeOwnerPath = exports.normalizeProviderId = exports.normalizeSegment = exports.sepFor = exports.toCase = exports.splitWords = void 0;
6
+ // Naming and case conversion utilities
7
+ var naming_utils_1 = require("./naming.utils");
8
+ Object.defineProperty(exports, "splitWords", { enumerable: true, get: function () { return naming_utils_1.splitWords; } });
9
+ Object.defineProperty(exports, "toCase", { enumerable: true, get: function () { return naming_utils_1.toCase; } });
10
+ Object.defineProperty(exports, "sepFor", { enumerable: true, get: function () { return naming_utils_1.sepFor; } });
11
+ Object.defineProperty(exports, "normalizeSegment", { enumerable: true, get: function () { return naming_utils_1.normalizeSegment; } });
12
+ Object.defineProperty(exports, "normalizeProviderId", { enumerable: true, get: function () { return naming_utils_1.normalizeProviderId; } });
13
+ Object.defineProperty(exports, "normalizeOwnerPath", { enumerable: true, get: function () { return naming_utils_1.normalizeOwnerPath; } });
14
+ Object.defineProperty(exports, "shortHash", { enumerable: true, get: function () { return naming_utils_1.shortHash; } });
15
+ Object.defineProperty(exports, "ensureMaxLen", { enumerable: true, get: function () { return naming_utils_1.ensureMaxLen; } });
16
+ // Owner lineage and qualified name utilities
17
+ var lineage_utils_1 = require("./lineage.utils");
18
+ Object.defineProperty(exports, "ownerKeyOf", { enumerable: true, get: function () { return lineage_utils_1.ownerKeyOf; } });
19
+ Object.defineProperty(exports, "qualifiedNameOf", { enumerable: true, get: function () { return lineage_utils_1.qualifiedNameOf; } });
20
+ Object.defineProperty(exports, "parseQualifiedName", { enumerable: true, get: function () { return lineage_utils_1.parseQualifiedName; } });
21
+ Object.defineProperty(exports, "lineageDepth", { enumerable: true, get: function () { return lineage_utils_1.lineageDepth; } });
22
+ Object.defineProperty(exports, "lineagesEqual", { enumerable: true, get: function () { return lineage_utils_1.lineagesEqual; } });
23
+ Object.defineProperty(exports, "isAncestorLineage", { enumerable: true, get: function () { return lineage_utils_1.isAncestorLineage; } });
24
+ // URI validation utilities (RFC 3986)
25
+ var uri_validation_utils_1 = require("./uri-validation.utils");
26
+ Object.defineProperty(exports, "isValidMcpUri", { enumerable: true, get: function () { return uri_validation_utils_1.isValidMcpUri; } });
27
+ Object.defineProperty(exports, "extractUriScheme", { enumerable: true, get: function () { return uri_validation_utils_1.extractUriScheme; } });
28
+ Object.defineProperty(exports, "isValidMcpUriTemplate", { enumerable: true, get: function () { return uri_validation_utils_1.isValidMcpUriTemplate; } });
29
+ // URI template parsing and matching utilities
30
+ var uri_template_utils_1 = require("./uri-template.utils");
31
+ Object.defineProperty(exports, "parseUriTemplate", { enumerable: true, get: function () { return uri_template_utils_1.parseUriTemplate; } });
32
+ Object.defineProperty(exports, "matchUriTemplate", { enumerable: true, get: function () { return uri_template_utils_1.matchUriTemplate; } });
33
+ Object.defineProperty(exports, "expandUriTemplate", { enumerable: true, get: function () { return uri_template_utils_1.expandUriTemplate; } });
34
+ // Token utilities
35
+ var token_utils_1 = require("./token.utils");
36
+ Object.defineProperty(exports, "tokenName", { enumerable: true, get: function () { return token_utils_1.tokenName; } });
37
+ Object.defineProperty(exports, "isClass", { enumerable: true, get: function () { return token_utils_1.isClass; } });
38
+ Object.defineProperty(exports, "isPromise", { enumerable: true, get: function () { return token_utils_1.isPromise; } });
39
+ Object.defineProperty(exports, "depsOfClass", { enumerable: true, get: function () { return token_utils_1.depsOfClass; } });
40
+ Object.defineProperty(exports, "depsOfFunc", { enumerable: true, get: function () { return token_utils_1.depsOfFunc; } });
41
+ // Content utilities
42
+ var content_utils_1 = require("./content.utils");
43
+ Object.defineProperty(exports, "sanitizeToJson", { enumerable: true, get: function () { return content_utils_1.sanitizeToJson; } });
44
+ Object.defineProperty(exports, "toStructuredContent", { enumerable: true, get: function () { return content_utils_1.toStructuredContent; } });
45
+ Object.defineProperty(exports, "buildResourceContent", { enumerable: true, get: function () { return content_utils_1.buildResourceContent; } });
46
+ Object.defineProperty(exports, "inferMimeType", { enumerable: true, get: function () { return content_utils_1.inferMimeType; } });
47
+ // String utilities
48
+ var string_utils_1 = require("./string.utils");
49
+ Object.defineProperty(exports, "idFromString", { enumerable: true, get: function () { return string_utils_1.idFromString; } });
50
+ // Metadata utilities
51
+ var metadata_utils_1 = require("./metadata.utils");
52
+ Object.defineProperty(exports, "getMetadata", { enumerable: true, get: function () { return metadata_utils_1.getMetadata; } });
53
+ Object.defineProperty(exports, "setMetadata", { enumerable: true, get: function () { return metadata_utils_1.setMetadata; } });
54
+ Object.defineProperty(exports, "hasAsyncWith", { enumerable: true, get: function () { return metadata_utils_1.hasAsyncWith; } });
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,wCAAwC;;;AAExC,uCAAuC;AACvC,+CAUwB;AARtB,0GAAA,UAAU,OAAA;AACV,sGAAA,MAAM,OAAA;AACN,sGAAA,MAAM,OAAA;AACN,gHAAA,gBAAgB,OAAA;AAChB,mHAAA,mBAAmB,OAAA;AACnB,kHAAA,kBAAkB,OAAA;AAClB,yGAAA,SAAS,OAAA;AACT,4GAAA,YAAY,OAAA;AAGd,6CAA6C;AAC7C,iDAOyB;AANvB,2GAAA,UAAU,OAAA;AACV,gHAAA,eAAe,OAAA;AACf,mHAAA,kBAAkB,OAAA;AAClB,6GAAA,YAAY,OAAA;AACZ,8GAAA,aAAa,OAAA;AACb,kHAAA,iBAAiB,OAAA;AAGnB,sCAAsC;AACtC,+DAAgG;AAAvF,qHAAA,aAAa,OAAA;AAAE,wHAAA,gBAAgB,OAAA;AAAE,6HAAA,qBAAqB,OAAA;AAE/D,8CAA8C;AAC9C,2DAA6F;AAApF,sHAAA,gBAAgB,OAAA;AAAE,sHAAA,gBAAgB,OAAA;AAAE,uHAAA,iBAAiB,OAAA;AAE9D,kBAAkB;AAClB,6CAAuF;AAA9E,wGAAA,SAAS,OAAA;AAAE,sGAAA,OAAO,OAAA;AAAE,wGAAA,SAAS,OAAA;AAAE,0GAAA,WAAW,OAAA;AAAE,yGAAA,UAAU,OAAA;AAE/D,oBAAoB;AACpB,iDAQyB;AAPvB,+GAAA,cAAc,OAAA;AACd,oHAAA,mBAAmB,OAAA;AAInB,qHAAA,oBAAoB,OAAA;AACpB,8GAAA,aAAa,OAAA;AAGf,mBAAmB;AACnB,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AAErB,qBAAqB;AACrB,mDAA0E;AAAjE,6GAAA,WAAW,OAAA;AAAE,6GAAA,WAAW,OAAA;AAAE,8GAAA,YAAY,OAAA","sourcesContent":["// file: libs/sdk/src/utils/index.ts\n// Centralized exports for SDK utilities\n\n// Naming and case conversion utilities\nexport {\n NameCase,\n splitWords,\n toCase,\n sepFor,\n normalizeSegment,\n normalizeProviderId,\n normalizeOwnerPath,\n shortHash,\n ensureMaxLen,\n} from './naming.utils';\n\n// Owner lineage and qualified name utilities\nexport {\n ownerKeyOf,\n qualifiedNameOf,\n parseQualifiedName,\n lineageDepth,\n lineagesEqual,\n isAncestorLineage,\n} from './lineage.utils';\n\n// URI validation utilities (RFC 3986)\nexport { isValidMcpUri, extractUriScheme, isValidMcpUriTemplate } from './uri-validation.utils';\n\n// URI template parsing and matching utilities\nexport { parseUriTemplate, matchUriTemplate, expandUriTemplate } from './uri-template.utils';\n\n// Token utilities\nexport { tokenName, isClass, isPromise, depsOfClass, depsOfFunc } from './token.utils';\n\n// Content utilities\nexport {\n sanitizeToJson,\n toStructuredContent,\n TextContent,\n BlobContent,\n ResourceContent,\n buildResourceContent,\n inferMimeType,\n} from './content.utils';\n\n// String utilities\nexport { idFromString } from './string.utils';\n\n// Metadata utilities\nexport { getMetadata, setMetadata, hasAsyncWith } from './metadata.utils';\n"]}
@@ -0,0 +1,40 @@
1
+ import { EntryLineage } from '../common';
2
+ /**
3
+ * Convert an entry lineage to a string key.
4
+ *
5
+ * @example
6
+ * ownerKeyOf([{ kind: 'app', id: 'Portal' }, { kind: 'plugin', id: 'Auth' }])
7
+ * => "app:Portal/plugin:Auth"
8
+ */
9
+ export declare function ownerKeyOf(lineage: EntryLineage): string;
10
+ /**
11
+ * Create a fully qualified name from lineage and name.
12
+ *
13
+ * @example
14
+ * qualifiedNameOf([{ kind: 'app', id: 'Portal' }], 'myTool')
15
+ * => "app:Portal:myTool"
16
+ */
17
+ export declare function qualifiedNameOf(lineage: EntryLineage, name: string): string;
18
+ /**
19
+ * Parse a qualified name back into lineage and name.
20
+ *
21
+ * @example
22
+ * parseQualifiedName("app:Portal/plugin:Auth:myTool")
23
+ * => { lineage: [{ kind: 'app', id: 'Portal' }, { kind: 'plugin', id: 'Auth' }], name: 'myTool' }
24
+ */
25
+ export declare function parseQualifiedName(qualifiedName: string): {
26
+ lineage: EntryLineage;
27
+ name: string;
28
+ } | null;
29
+ /**
30
+ * Get the depth of a lineage (number of owners).
31
+ */
32
+ export declare function lineageDepth(lineage: EntryLineage): number;
33
+ /**
34
+ * Check if two lineages are equal.
35
+ */
36
+ export declare function lineagesEqual(a: EntryLineage, b: EntryLineage): boolean;
37
+ /**
38
+ * Check if lineage `a` is an ancestor of lineage `b`.
39
+ */
40
+ export declare function isAncestorLineage(ancestor: EntryLineage, descendant: EntryLineage): boolean;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ // file: libs/sdk/src/utils/lineage.utils.ts
3
+ // Owner lineage and qualified name utilities
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.ownerKeyOf = ownerKeyOf;
6
+ exports.qualifiedNameOf = qualifiedNameOf;
7
+ exports.parseQualifiedName = parseQualifiedName;
8
+ exports.lineageDepth = lineageDepth;
9
+ exports.lineagesEqual = lineagesEqual;
10
+ exports.isAncestorLineage = isAncestorLineage;
11
+ /**
12
+ * Convert an entry lineage to a string key.
13
+ *
14
+ * @example
15
+ * ownerKeyOf([{ kind: 'app', id: 'Portal' }, { kind: 'plugin', id: 'Auth' }])
16
+ * => "app:Portal/plugin:Auth"
17
+ */
18
+ function ownerKeyOf(lineage) {
19
+ return lineage.map((o) => `${o.kind}:${o.id}`).join('/');
20
+ }
21
+ /**
22
+ * Create a fully qualified name from lineage and name.
23
+ *
24
+ * @example
25
+ * qualifiedNameOf([{ kind: 'app', id: 'Portal' }], 'myTool')
26
+ * => "app:Portal:myTool"
27
+ */
28
+ function qualifiedNameOf(lineage, name) {
29
+ return `${ownerKeyOf(lineage)}:${name}`;
30
+ }
31
+ /**
32
+ * Parse a qualified name back into lineage and name.
33
+ *
34
+ * @example
35
+ * parseQualifiedName("app:Portal/plugin:Auth:myTool")
36
+ * => { lineage: [{ kind: 'app', id: 'Portal' }, { kind: 'plugin', id: 'Auth' }], name: 'myTool' }
37
+ */
38
+ function parseQualifiedName(qualifiedName) {
39
+ const lastColon = qualifiedName.lastIndexOf(':');
40
+ if (lastColon === -1)
41
+ return null;
42
+ const ownerKey = qualifiedName.slice(0, lastColon);
43
+ const name = qualifiedName.slice(lastColon + 1);
44
+ const lineage = [];
45
+ const parts = ownerKey.split('/');
46
+ for (const part of parts) {
47
+ const colonIdx = part.indexOf(':');
48
+ if (colonIdx === -1)
49
+ continue;
50
+ const kind = part.slice(0, colonIdx);
51
+ if (kind !== 'scope' && kind !== 'app' && kind !== 'plugin')
52
+ continue;
53
+ const id = part.slice(colonIdx + 1);
54
+ // `ref` is required by EntryOwnerRef but cannot be resolved from string parsing.
55
+ // Callers must resolve the ref from context if needed.
56
+ lineage.push({ kind, id, ref: undefined });
57
+ }
58
+ return { lineage, name };
59
+ }
60
+ /**
61
+ * Get the depth of a lineage (number of owners).
62
+ */
63
+ function lineageDepth(lineage) {
64
+ return lineage.length;
65
+ }
66
+ /**
67
+ * Check if two lineages are equal.
68
+ */
69
+ function lineagesEqual(a, b) {
70
+ if (a.length !== b.length)
71
+ return false;
72
+ return a.every((owner, i) => owner.kind === b[i].kind && owner.id === b[i].id);
73
+ }
74
+ /**
75
+ * Check if lineage `a` is an ancestor of lineage `b`.
76
+ */
77
+ function isAncestorLineage(ancestor, descendant) {
78
+ if (ancestor.length >= descendant.length)
79
+ return false;
80
+ return ancestor.every((owner, i) => owner.kind === descendant[i].kind && owner.id === descendant[i].id);
81
+ }
82
+ //# sourceMappingURL=lineage.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage.utils.js","sourceRoot":"","sources":["../../../src/utils/lineage.utils.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,6CAA6C;;AAW7C,gCAEC;AASD,0CAEC;AASD,gDAsBC;AAKD,oCAEC;AAKD,sCAGC;AAKD,8CAGC;AA1ED;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,OAAqB;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,OAAqB,EAAE,IAAY;IACjE,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,aAAqB;IACtD,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,SAAS;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS;QACtE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACpC,iFAAiF;QACjF,uDAAuD;QACvD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,SAAgB,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAqB;IAChD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,CAAe,EAAE,CAAe;IAC5D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,QAAsB,EAAE,UAAwB;IAChF,IAAI,QAAQ,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACvD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1G,CAAC","sourcesContent":["// file: libs/sdk/src/utils/lineage.utils.ts\n// Owner lineage and qualified name utilities\n\nimport { EntryLineage } from '../common';\n\n/**\n * Convert an entry lineage to a string key.\n *\n * @example\n * ownerKeyOf([{ kind: 'app', id: 'Portal' }, { kind: 'plugin', id: 'Auth' }])\n * => \"app:Portal/plugin:Auth\"\n */\nexport function ownerKeyOf(lineage: EntryLineage): string {\n return lineage.map((o) => `${o.kind}:${o.id}`).join('/');\n}\n\n/**\n * Create a fully qualified name from lineage and name.\n *\n * @example\n * qualifiedNameOf([{ kind: 'app', id: 'Portal' }], 'myTool')\n * => \"app:Portal:myTool\"\n */\nexport function qualifiedNameOf(lineage: EntryLineage, name: string): string {\n return `${ownerKeyOf(lineage)}:${name}`;\n}\n\n/**\n * Parse a qualified name back into lineage and name.\n *\n * @example\n * parseQualifiedName(\"app:Portal/plugin:Auth:myTool\")\n * => { lineage: [{ kind: 'app', id: 'Portal' }, { kind: 'plugin', id: 'Auth' }], name: 'myTool' }\n */\nexport function parseQualifiedName(qualifiedName: string): { lineage: EntryLineage; name: string } | null {\n const lastColon = qualifiedName.lastIndexOf(':');\n if (lastColon === -1) return null;\n\n const ownerKey = qualifiedName.slice(0, lastColon);\n const name = qualifiedName.slice(lastColon + 1);\n\n const lineage: EntryLineage = [];\n const parts = ownerKey.split('/');\n\n for (const part of parts) {\n const colonIdx = part.indexOf(':');\n if (colonIdx === -1) continue;\n const kind = part.slice(0, colonIdx);\n if (kind !== 'scope' && kind !== 'app' && kind !== 'plugin') continue;\n const id = part.slice(colonIdx + 1);\n // `ref` is required by EntryOwnerRef but cannot be resolved from string parsing.\n // Callers must resolve the ref from context if needed.\n lineage.push({ kind, id, ref: undefined as any });\n }\n\n return { lineage, name };\n}\n\n/**\n * Get the depth of a lineage (number of owners).\n */\nexport function lineageDepth(lineage: EntryLineage): number {\n return lineage.length;\n}\n\n/**\n * Check if two lineages are equal.\n */\nexport function lineagesEqual(a: EntryLineage, b: EntryLineage): boolean {\n if (a.length !== b.length) return false;\n return a.every((owner, i) => owner.kind === b[i].kind && owner.id === b[i].id);\n}\n\n/**\n * Check if lineage `a` is an ancestor of lineage `b`.\n */\nexport function isAncestorLineage(ancestor: EntryLineage, descendant: EntryLineage): boolean {\n if (ancestor.length >= descendant.length) return false;\n return ancestor.every((owner, i) => owner.kind === descendant[i].kind && owner.id === descendant[i].id);\n}\n"]}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Supported naming conventions for MCP identifiers
3
+ */
4
+ export type NameCase = 'snake' | 'kebab' | 'dot' | 'camel';
5
+ /**
6
+ * Split a string into words, handling camelCase, PascalCase, and delimiters.
7
+ *
8
+ * @example
9
+ * splitWords("myFunctionName") => ["my", "Function", "Name"]
10
+ * splitWords("my_function_name") => ["my", "function", "name"]
11
+ */
12
+ export declare function splitWords(input: string): string[];
13
+ /**
14
+ * Convert words to a specific naming case.
15
+ *
16
+ * @example
17
+ * toCase(["my", "function"], "snake") => "my_function"
18
+ * toCase(["my", "function"], "camel") => "myFunction"
19
+ */
20
+ export declare function toCase(words: string[], kind: NameCase): string;
21
+ /**
22
+ * Get the separator character for a naming case.
23
+ */
24
+ export declare function sepFor(kind: NameCase): string;
25
+ /**
26
+ * Normalize a single segment (name part) to MCP-safe characters.
27
+ */
28
+ export declare function normalizeSegment(raw: string, kind: NameCase): string;
29
+ /**
30
+ * Normalize a provider ID to MCP-safe characters.
31
+ */
32
+ export declare function normalizeProviderId(raw: string | undefined, kind: NameCase): string | undefined;
33
+ /**
34
+ * Normalize an owner path (app:id/plugin:id) to the specified naming case.
35
+ */
36
+ export declare function normalizeOwnerPath(ownerKey: string, kind: NameCase): string;
37
+ /**
38
+ * Generate a short hash (6 hex chars) from a string.
39
+ * Uses djb2 algorithm for fast, reasonable distribution.
40
+ */
41
+ export declare function shortHash(s: string): string;
42
+ /**
43
+ * Ensure a name fits within a maximum length, using hash truncation if needed.
44
+ * Preserves meaningful suffix while adding a hash for uniqueness.
45
+ */
46
+ export declare function ensureMaxLen(name: string, max: number): string;