@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,817 @@
1
+ "use strict";
2
+ /**
3
+ * Authorization Vault
4
+ *
5
+ * Secure storage for stateful authorization sessions.
6
+ * Stores provider tokens, consent selections, and session metadata.
7
+ *
8
+ * Supports multiple credential types:
9
+ * - OAuth tokens (access_token, refresh_token, scopes)
10
+ * - API Keys (key value, header name)
11
+ * - Basic Auth (username, password)
12
+ * - Private Keys (PEM/JWK format for signing)
13
+ * - Custom credentials (extensible)
14
+ *
15
+ * In stateful mode:
16
+ * - Access token is a non-rotatable key to this vault
17
+ * - All sensitive data stored server-side
18
+ * - Supports incremental authorization via links
19
+ *
20
+ * In stateless mode:
21
+ * - No vault used, all data in JWT claims
22
+ * - No incremental authorization support
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.RedisAuthorizationVault = exports.InMemoryAuthorizationVault = exports.authorizationVaultEntrySchema = exports.pendingIncrementalAuthSchema = exports.vaultFederatedRecordSchema = exports.vaultConsentRecordSchema = exports.appCredentialSchema = exports.credentialSchema = exports.customCredentialSchema = exports.mtlsCredentialSchema = exports.privateKeyCredentialSchema = exports.bearerCredentialSchema = exports.basicAuthCredentialSchema = exports.apiKeyCredentialSchema = exports.oauthCredentialSchema = exports.credentialTypeSchema = void 0;
26
+ const zod_1 = require("zod");
27
+ const node_crypto_1 = require("node:crypto");
28
+ // ============================================
29
+ // Credential Type Enum
30
+ // ============================================
31
+ /**
32
+ * Supported credential types for app authentication
33
+ */
34
+ exports.credentialTypeSchema = zod_1.z.enum([
35
+ 'oauth', // OAuth 2.0 tokens
36
+ 'api_key', // API key (header or query param)
37
+ 'basic', // Basic auth (username:password)
38
+ 'bearer', // Bearer token (static)
39
+ 'private_key', // Private key for signing (JWT, etc.)
40
+ 'mtls', // Mutual TLS certificate
41
+ 'custom', // Custom credential type
42
+ ]);
43
+ // ============================================
44
+ // Credential Schemas by Type
45
+ // ============================================
46
+ /**
47
+ * OAuth credential - standard OAuth 2.0 tokens
48
+ */
49
+ exports.oauthCredentialSchema = zod_1.z.object({
50
+ type: zod_1.z.literal('oauth'),
51
+ /** Access token */
52
+ accessToken: zod_1.z.string(),
53
+ /** Refresh token (optional) */
54
+ refreshToken: zod_1.z.string().optional(),
55
+ /** Token type (usually 'Bearer') */
56
+ tokenType: zod_1.z.string().default('Bearer'),
57
+ /** Token expiration timestamp (epoch ms) */
58
+ expiresAt: zod_1.z.number().optional(),
59
+ /** Granted scopes */
60
+ scopes: zod_1.z.array(zod_1.z.string()).default([]),
61
+ /** ID token for OIDC (optional) */
62
+ idToken: zod_1.z.string().optional(),
63
+ });
64
+ /**
65
+ * API Key credential - sent in header or query param
66
+ */
67
+ exports.apiKeyCredentialSchema = zod_1.z.object({
68
+ type: zod_1.z.literal('api_key'),
69
+ /** The API key value */
70
+ key: zod_1.z.string().min(1),
71
+ /** Header name to use (e.g., 'X-API-Key', 'Authorization') */
72
+ headerName: zod_1.z.string().default('X-API-Key'),
73
+ /** Prefix for the header value (e.g., 'Bearer ', 'Api-Key ') */
74
+ headerPrefix: zod_1.z.string().optional(),
75
+ /** Alternative: send as query parameter */
76
+ queryParam: zod_1.z.string().optional(),
77
+ });
78
+ /**
79
+ * Basic Auth credential - username and password
80
+ */
81
+ exports.basicAuthCredentialSchema = zod_1.z.object({
82
+ type: zod_1.z.literal('basic'),
83
+ /** Username */
84
+ username: zod_1.z.string().min(1),
85
+ /** Password */
86
+ password: zod_1.z.string(),
87
+ /** Pre-computed base64 encoded value (optional, for caching) */
88
+ encodedValue: zod_1.z.string().optional(),
89
+ });
90
+ /**
91
+ * Bearer token credential - static bearer token
92
+ */
93
+ exports.bearerCredentialSchema = zod_1.z.object({
94
+ type: zod_1.z.literal('bearer'),
95
+ /** The bearer token value */
96
+ token: zod_1.z.string().min(1),
97
+ /** Token expiration (optional, for static tokens that expire) */
98
+ expiresAt: zod_1.z.number().optional(),
99
+ });
100
+ /**
101
+ * Private key credential - for JWT signing or request signing
102
+ */
103
+ exports.privateKeyCredentialSchema = zod_1.z.object({
104
+ type: zod_1.z.literal('private_key'),
105
+ /** Key format */
106
+ format: zod_1.z.enum(['pem', 'jwk', 'pkcs8', 'pkcs12']),
107
+ /** The key data (PEM string or JWK JSON) */
108
+ keyData: zod_1.z.string(),
109
+ /** Key ID (for JWK) */
110
+ keyId: zod_1.z.string().optional(),
111
+ /** Algorithm to use for signing */
112
+ algorithm: zod_1.z.string().optional(),
113
+ /** Passphrase if key is encrypted */
114
+ passphrase: zod_1.z.string().optional(),
115
+ /** Associated certificate (for mTLS) */
116
+ certificate: zod_1.z.string().optional(),
117
+ });
118
+ /**
119
+ * mTLS credential - client certificate for mutual TLS
120
+ */
121
+ exports.mtlsCredentialSchema = zod_1.z.object({
122
+ type: zod_1.z.literal('mtls'),
123
+ /** Client certificate (PEM format) */
124
+ certificate: zod_1.z.string(),
125
+ /** Private key (PEM format) */
126
+ privateKey: zod_1.z.string(),
127
+ /** Passphrase if private key is encrypted */
128
+ passphrase: zod_1.z.string().optional(),
129
+ /** CA certificate chain (optional) */
130
+ caCertificate: zod_1.z.string().optional(),
131
+ });
132
+ /**
133
+ * Custom credential - extensible for app-specific auth
134
+ */
135
+ exports.customCredentialSchema = zod_1.z.object({
136
+ type: zod_1.z.literal('custom'),
137
+ /** Custom type identifier */
138
+ customType: zod_1.z.string().min(1),
139
+ /** Arbitrary credential data */
140
+ data: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()),
141
+ /** Headers to include in requests */
142
+ headers: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional(),
143
+ });
144
+ /**
145
+ * Union of all credential types
146
+ */
147
+ exports.credentialSchema = zod_1.z.discriminatedUnion('type', [
148
+ exports.oauthCredentialSchema,
149
+ exports.apiKeyCredentialSchema,
150
+ exports.basicAuthCredentialSchema,
151
+ exports.bearerCredentialSchema,
152
+ exports.privateKeyCredentialSchema,
153
+ exports.mtlsCredentialSchema,
154
+ exports.customCredentialSchema,
155
+ ]);
156
+ // ============================================
157
+ // App Credential Schema
158
+ // ============================================
159
+ /**
160
+ * Credential stored for an app in the vault
161
+ */
162
+ exports.appCredentialSchema = zod_1.z.object({
163
+ /** App ID this credential belongs to */
164
+ appId: zod_1.z.string().min(1),
165
+ /** Provider ID within the app (for apps with multiple auth providers) */
166
+ providerId: zod_1.z.string().min(1),
167
+ /** The credential data */
168
+ credential: exports.credentialSchema,
169
+ /** Timestamp when credential was acquired */
170
+ acquiredAt: zod_1.z.number(),
171
+ /** Timestamp when credential was last used */
172
+ lastUsedAt: zod_1.z.number().optional(),
173
+ /** Credential expiration (if applicable) */
174
+ expiresAt: zod_1.z.number().optional(),
175
+ /** Whether this credential is currently valid */
176
+ isValid: zod_1.z.boolean().default(true),
177
+ /** Error message if credential is invalid */
178
+ invalidReason: zod_1.z.string().optional(),
179
+ /** User info associated with this credential */
180
+ userInfo: zod_1.z
181
+ .object({
182
+ sub: zod_1.z.string().optional(),
183
+ email: zod_1.z.string().optional(),
184
+ name: zod_1.z.string().optional(),
185
+ })
186
+ .optional(),
187
+ /** Metadata for tracking/debugging */
188
+ metadata: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
189
+ });
190
+ /**
191
+ * Consent record stored in vault
192
+ */
193
+ exports.vaultConsentRecordSchema = zod_1.z.object({
194
+ /** Whether consent was enabled */
195
+ enabled: zod_1.z.boolean(),
196
+ /** Selected tool IDs (user approved these) */
197
+ selectedToolIds: zod_1.z.array(zod_1.z.string()),
198
+ /** Available tool IDs at time of consent */
199
+ availableToolIds: zod_1.z.array(zod_1.z.string()),
200
+ /** Timestamp when consent was given */
201
+ consentedAt: zod_1.z.number(),
202
+ /** Consent version for tracking changes */
203
+ version: zod_1.z.string().default('1.0'),
204
+ });
205
+ /**
206
+ * Federated login record stored in vault
207
+ */
208
+ exports.vaultFederatedRecordSchema = zod_1.z.object({
209
+ /** Provider IDs that were selected */
210
+ selectedProviderIds: zod_1.z.array(zod_1.z.string()),
211
+ /** Provider IDs that were skipped (can be authorized later) */
212
+ skippedProviderIds: zod_1.z.array(zod_1.z.string()),
213
+ /** Primary provider ID */
214
+ primaryProviderId: zod_1.z.string().optional(),
215
+ /** Timestamp when federated login was completed */
216
+ completedAt: zod_1.z.number(),
217
+ });
218
+ /**
219
+ * Pending incremental authorization request
220
+ */
221
+ exports.pendingIncrementalAuthSchema = zod_1.z.object({
222
+ /** Unique ID for this request */
223
+ id: zod_1.z.string(),
224
+ /** App ID being authorized */
225
+ appId: zod_1.z.string(),
226
+ /** Tool ID that triggered the auth request */
227
+ toolId: zod_1.z.string().optional(),
228
+ /** Authorization URL */
229
+ authUrl: zod_1.z.string(),
230
+ /** Required scopes */
231
+ requiredScopes: zod_1.z.array(zod_1.z.string()).optional(),
232
+ /** Whether elicit is being used */
233
+ elicitId: zod_1.z.string().optional(),
234
+ /** Timestamp when request was created */
235
+ createdAt: zod_1.z.number(),
236
+ /** Expiration timestamp */
237
+ expiresAt: zod_1.z.number(),
238
+ /** Status of the request */
239
+ status: zod_1.z.enum(['pending', 'completed', 'cancelled', 'expired']),
240
+ });
241
+ /**
242
+ * Authorization vault entry (the full session state)
243
+ */
244
+ exports.authorizationVaultEntrySchema = zod_1.z.object({
245
+ /** Vault ID (maps to access token jti claim) */
246
+ id: zod_1.z.string(),
247
+ /** User subject identifier */
248
+ userSub: zod_1.z.string(),
249
+ /** User email */
250
+ userEmail: zod_1.z.string().optional(),
251
+ /** User name */
252
+ userName: zod_1.z.string().optional(),
253
+ /** Client ID that created this session */
254
+ clientId: zod_1.z.string(),
255
+ /** Creation timestamp */
256
+ createdAt: zod_1.z.number(),
257
+ /** Last access timestamp */
258
+ lastAccessAt: zod_1.z.number(),
259
+ /** App credentials (keyed by `${appId}:${providerId}`) */
260
+ appCredentials: zod_1.z.record(zod_1.z.string(), exports.appCredentialSchema).default({}),
261
+ /** Consent record */
262
+ consent: exports.vaultConsentRecordSchema.optional(),
263
+ /** Federated login record */
264
+ federated: exports.vaultFederatedRecordSchema.optional(),
265
+ /** Pending incremental authorization requests */
266
+ pendingAuths: zod_1.z.array(exports.pendingIncrementalAuthSchema),
267
+ /** Apps that are fully authorized */
268
+ authorizedAppIds: zod_1.z.array(zod_1.z.string()),
269
+ /** Apps that were skipped (not yet authorized) */
270
+ skippedAppIds: zod_1.z.array(zod_1.z.string()),
271
+ });
272
+ // ============================================
273
+ // In-Memory Implementation
274
+ // ============================================
275
+ /**
276
+ * In-Memory Authorization Vault
277
+ *
278
+ * Development/testing implementation. Data is lost on restart.
279
+ * For production, use RedisAuthorizationVault.
280
+ */
281
+ class InMemoryAuthorizationVault {
282
+ vaults = new Map();
283
+ /** Default TTL for pending auth requests (10 minutes) */
284
+ pendingAuthTtlMs = 10 * 60 * 1000;
285
+ async create(params) {
286
+ const now = Date.now();
287
+ const entry = {
288
+ id: (0, node_crypto_1.randomUUID)(),
289
+ userSub: params.userSub,
290
+ userEmail: params.userEmail,
291
+ userName: params.userName,
292
+ clientId: params.clientId,
293
+ createdAt: now,
294
+ lastAccessAt: now,
295
+ appCredentials: {},
296
+ consent: params.consent,
297
+ federated: params.federated,
298
+ pendingAuths: [],
299
+ authorizedAppIds: params.authorizedAppIds ?? [],
300
+ skippedAppIds: params.skippedAppIds ?? [],
301
+ };
302
+ this.vaults.set(entry.id, entry);
303
+ return entry;
304
+ }
305
+ async get(id) {
306
+ const entry = this.vaults.get(id);
307
+ if (!entry)
308
+ return null;
309
+ // Note: lastAccessAt is updated on explicit operations, not on read
310
+ // This prevents unnecessary writes on read operations
311
+ return entry;
312
+ }
313
+ async update(id, updates) {
314
+ const entry = this.vaults.get(id);
315
+ if (!entry)
316
+ return;
317
+ Object.assign(entry, updates, { lastAccessAt: Date.now() });
318
+ }
319
+ async delete(id) {
320
+ this.vaults.delete(id);
321
+ }
322
+ async updateConsent(vaultId, consent) {
323
+ const entry = this.vaults.get(vaultId);
324
+ if (!entry)
325
+ return;
326
+ entry.consent = consent;
327
+ entry.lastAccessAt = Date.now();
328
+ }
329
+ async authorizeApp(vaultId, appId) {
330
+ const entry = this.vaults.get(vaultId);
331
+ if (!entry)
332
+ return;
333
+ // Remove from skipped, add to authorized
334
+ entry.skippedAppIds = entry.skippedAppIds.filter((id) => id !== appId);
335
+ if (!entry.authorizedAppIds.includes(appId)) {
336
+ entry.authorizedAppIds.push(appId);
337
+ }
338
+ entry.lastAccessAt = Date.now();
339
+ }
340
+ async createPendingAuth(vaultId, params) {
341
+ const entry = this.vaults.get(vaultId);
342
+ if (!entry) {
343
+ throw new Error(`Vault not found: ${vaultId}`);
344
+ }
345
+ const now = Date.now();
346
+ const pendingAuth = {
347
+ id: (0, node_crypto_1.randomUUID)(),
348
+ appId: params.appId,
349
+ toolId: params.toolId,
350
+ authUrl: params.authUrl,
351
+ requiredScopes: params.requiredScopes,
352
+ elicitId: params.elicitId,
353
+ createdAt: now,
354
+ expiresAt: now + (params.ttlMs ?? this.pendingAuthTtlMs),
355
+ status: 'pending',
356
+ };
357
+ entry.pendingAuths.push(pendingAuth);
358
+ entry.lastAccessAt = now;
359
+ return pendingAuth;
360
+ }
361
+ async getPendingAuth(vaultId, pendingAuthId) {
362
+ const entry = this.vaults.get(vaultId);
363
+ if (!entry)
364
+ return null;
365
+ const pendingAuth = entry.pendingAuths.find((p) => p.id === pendingAuthId);
366
+ if (!pendingAuth)
367
+ return null;
368
+ // Check if expired
369
+ if (Date.now() > pendingAuth.expiresAt) {
370
+ pendingAuth.status = 'expired';
371
+ }
372
+ return pendingAuth;
373
+ }
374
+ async completePendingAuth(vaultId, pendingAuthId) {
375
+ const entry = this.vaults.get(vaultId);
376
+ if (!entry)
377
+ return;
378
+ const pendingAuth = entry.pendingAuths.find((p) => p.id === pendingAuthId);
379
+ if (pendingAuth) {
380
+ pendingAuth.status = 'completed';
381
+ // Auto-authorize the app
382
+ await this.authorizeApp(vaultId, pendingAuth.appId);
383
+ }
384
+ }
385
+ async cancelPendingAuth(vaultId, pendingAuthId) {
386
+ const entry = this.vaults.get(vaultId);
387
+ if (!entry)
388
+ return;
389
+ const pendingAuth = entry.pendingAuths.find((p) => p.id === pendingAuthId);
390
+ if (pendingAuth) {
391
+ pendingAuth.status = 'cancelled';
392
+ }
393
+ }
394
+ async isAppAuthorized(vaultId, appId) {
395
+ const entry = this.vaults.get(vaultId);
396
+ if (!entry)
397
+ return false;
398
+ return entry.authorizedAppIds.includes(appId);
399
+ }
400
+ async getPendingAuths(vaultId) {
401
+ const entry = this.vaults.get(vaultId);
402
+ if (!entry)
403
+ return [];
404
+ const now = Date.now();
405
+ // Update expired status and filter
406
+ return entry.pendingAuths.filter((p) => {
407
+ if (now > p.expiresAt && p.status === 'pending') {
408
+ p.status = 'expired';
409
+ }
410
+ return p.status === 'pending';
411
+ });
412
+ }
413
+ async cleanup() {
414
+ const now = Date.now();
415
+ for (const [id, entry] of this.vaults) {
416
+ // Clean up expired pending auths
417
+ entry.pendingAuths = entry.pendingAuths.filter((p) => {
418
+ if (now > p.expiresAt && p.status === 'pending') {
419
+ p.status = 'expired';
420
+ }
421
+ // Keep for audit trail, or remove completely if desired
422
+ return p.status === 'pending';
423
+ });
424
+ }
425
+ }
426
+ // ============================================
427
+ // App Credential Methods
428
+ // ============================================
429
+ /** Create a credential key from appId and providerId */
430
+ credentialKey(appId, providerId) {
431
+ return `${appId}:${providerId}`;
432
+ }
433
+ async addAppCredential(vaultId, credential) {
434
+ const entry = this.vaults.get(vaultId);
435
+ if (!entry)
436
+ return;
437
+ // Check if we should store based on consent
438
+ const shouldStore = await this.shouldStoreCredential(vaultId, credential.appId);
439
+ if (!shouldStore) {
440
+ return;
441
+ }
442
+ const key = this.credentialKey(credential.appId, credential.providerId);
443
+ entry.appCredentials[key] = credential;
444
+ entry.lastAccessAt = Date.now();
445
+ }
446
+ async removeAppCredential(vaultId, appId, providerId) {
447
+ const entry = this.vaults.get(vaultId);
448
+ if (!entry)
449
+ return;
450
+ const key = this.credentialKey(appId, providerId);
451
+ delete entry.appCredentials[key];
452
+ entry.lastAccessAt = Date.now();
453
+ }
454
+ async getAppCredentials(vaultId, appId) {
455
+ const entry = this.vaults.get(vaultId);
456
+ if (!entry)
457
+ return [];
458
+ const prefix = `${appId}:`;
459
+ return Object.entries(entry.appCredentials)
460
+ .filter(([key]) => key.startsWith(prefix))
461
+ .map(([, cred]) => cred);
462
+ }
463
+ async getCredential(vaultId, appId, providerId) {
464
+ const entry = this.vaults.get(vaultId);
465
+ if (!entry)
466
+ return null;
467
+ const key = this.credentialKey(appId, providerId);
468
+ return entry.appCredentials[key] ?? null;
469
+ }
470
+ async getAllCredentials(vaultId, filterByConsent = false) {
471
+ const entry = this.vaults.get(vaultId);
472
+ if (!entry)
473
+ return [];
474
+ const allCredentials = Object.values(entry.appCredentials);
475
+ if (!filterByConsent || !entry.consent?.enabled) {
476
+ return allCredentials;
477
+ }
478
+ // Filter by consent - only return credentials for apps that have tools in consent selection
479
+ const consentedToolIds = new Set(entry.consent.selectedToolIds);
480
+ return allCredentials.filter((cred) => {
481
+ // Check if any tool for this app is in consent
482
+ // Tool IDs are typically formatted as `appId:toolName` or similar
483
+ return Array.from(consentedToolIds).some((toolId) => toolId.startsWith(`${cred.appId}:`));
484
+ });
485
+ }
486
+ async updateCredential(vaultId, appId, providerId, updates) {
487
+ const entry = this.vaults.get(vaultId);
488
+ if (!entry)
489
+ return;
490
+ const key = this.credentialKey(appId, providerId);
491
+ const credential = entry.appCredentials[key];
492
+ if (!credential)
493
+ return;
494
+ Object.assign(credential, updates);
495
+ entry.lastAccessAt = Date.now();
496
+ }
497
+ async shouldStoreCredential(vaultId, appId, toolIds) {
498
+ const entry = this.vaults.get(vaultId);
499
+ if (!entry)
500
+ return false;
501
+ // If consent is not enabled, always allow
502
+ if (!entry.consent?.enabled) {
503
+ return true;
504
+ }
505
+ // If toolIds provided, check if any match consent selection
506
+ if (toolIds && toolIds.length > 0) {
507
+ return toolIds.some((toolId) => entry.consent.selectedToolIds.includes(toolId));
508
+ }
509
+ // Check if any tool for this app is in consent selection
510
+ const consentedToolIds = entry.consent.selectedToolIds;
511
+ return consentedToolIds.some((toolId) => toolId.startsWith(`${appId}:`));
512
+ }
513
+ async invalidateCredential(vaultId, appId, providerId, reason) {
514
+ await this.updateCredential(vaultId, appId, providerId, {
515
+ isValid: false,
516
+ invalidReason: reason,
517
+ });
518
+ }
519
+ async refreshOAuthCredential(vaultId, appId, providerId, tokens) {
520
+ const entry = this.vaults.get(vaultId);
521
+ if (!entry)
522
+ return;
523
+ const key = this.credentialKey(appId, providerId);
524
+ const credential = entry.appCredentials[key];
525
+ if (!credential || credential.credential.type !== 'oauth')
526
+ return;
527
+ // Update OAuth tokens
528
+ credential.credential.accessToken = tokens.accessToken;
529
+ if (tokens.refreshToken !== undefined) {
530
+ credential.credential.refreshToken = tokens.refreshToken;
531
+ }
532
+ if (tokens.expiresAt !== undefined) {
533
+ credential.credential.expiresAt = tokens.expiresAt;
534
+ credential.expiresAt = tokens.expiresAt;
535
+ }
536
+ // Mark as valid again
537
+ credential.isValid = true;
538
+ credential.invalidReason = undefined;
539
+ entry.lastAccessAt = Date.now();
540
+ }
541
+ }
542
+ exports.InMemoryAuthorizationVault = InMemoryAuthorizationVault;
543
+ // ============================================
544
+ // Redis Implementation (placeholder)
545
+ // ============================================
546
+ /**
547
+ * Redis Authorization Vault (placeholder)
548
+ *
549
+ * Production implementation using Redis for distributed storage.
550
+ * TODO: Implement after in-memory vault is validated.
551
+ */
552
+ class RedisAuthorizationVault {
553
+ redis;
554
+ namespace;
555
+ constructor(
556
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
557
+ redis, namespace = 'vault:') {
558
+ this.redis = redis;
559
+ this.namespace = namespace;
560
+ }
561
+ key(id) {
562
+ return `${this.namespace}${id}`;
563
+ }
564
+ /** Create a credential key from appId and providerId */
565
+ credentialKey(appId, providerId) {
566
+ return `${appId}:${providerId}`;
567
+ }
568
+ async create(params) {
569
+ const now = Date.now();
570
+ const entry = {
571
+ id: (0, node_crypto_1.randomUUID)(),
572
+ userSub: params.userSub,
573
+ userEmail: params.userEmail,
574
+ userName: params.userName,
575
+ clientId: params.clientId,
576
+ createdAt: now,
577
+ lastAccessAt: now,
578
+ appCredentials: {},
579
+ consent: params.consent,
580
+ federated: params.federated,
581
+ pendingAuths: [],
582
+ authorizedAppIds: params.authorizedAppIds ?? [],
583
+ skippedAppIds: params.skippedAppIds ?? [],
584
+ };
585
+ await this.redis.set(this.key(entry.id), JSON.stringify(entry));
586
+ return entry;
587
+ }
588
+ async get(id) {
589
+ const data = await this.redis.get(this.key(id));
590
+ if (!data)
591
+ return null;
592
+ const entry = JSON.parse(data);
593
+ // Note: lastAccessAt is updated on explicit operations, not on read
594
+ // This prevents unnecessary writes on read operations
595
+ return entry;
596
+ }
597
+ async update(id, updates) {
598
+ const entry = await this.get(id);
599
+ if (!entry)
600
+ return;
601
+ Object.assign(entry, updates, { lastAccessAt: Date.now() });
602
+ await this.redis.set(this.key(id), JSON.stringify(entry));
603
+ }
604
+ async delete(id) {
605
+ await this.redis.del(this.key(id));
606
+ }
607
+ async updateConsent(vaultId, consent) {
608
+ const entry = await this.get(vaultId);
609
+ if (!entry)
610
+ return;
611
+ entry.consent = consent;
612
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
613
+ }
614
+ async authorizeApp(vaultId, appId) {
615
+ const entry = await this.get(vaultId);
616
+ if (!entry)
617
+ return;
618
+ entry.skippedAppIds = entry.skippedAppIds.filter((id) => id !== appId);
619
+ if (!entry.authorizedAppIds.includes(appId)) {
620
+ entry.authorizedAppIds.push(appId);
621
+ }
622
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
623
+ }
624
+ async createPendingAuth(vaultId, params) {
625
+ const entry = await this.get(vaultId);
626
+ if (!entry) {
627
+ throw new Error(`Vault not found: ${vaultId}`);
628
+ }
629
+ const now = Date.now();
630
+ const pendingAuth = {
631
+ id: (0, node_crypto_1.randomUUID)(),
632
+ appId: params.appId,
633
+ toolId: params.toolId,
634
+ authUrl: params.authUrl,
635
+ requiredScopes: params.requiredScopes,
636
+ elicitId: params.elicitId,
637
+ createdAt: now,
638
+ expiresAt: now + (params.ttlMs ?? 10 * 60 * 1000),
639
+ status: 'pending',
640
+ };
641
+ entry.pendingAuths.push(pendingAuth);
642
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
643
+ return pendingAuth;
644
+ }
645
+ async getPendingAuth(vaultId, pendingAuthId) {
646
+ const entry = await this.get(vaultId);
647
+ if (!entry)
648
+ return null;
649
+ const pendingAuth = entry.pendingAuths.find((p) => p.id === pendingAuthId);
650
+ if (!pendingAuth)
651
+ return null;
652
+ if (Date.now() > pendingAuth.expiresAt && pendingAuth.status === 'pending') {
653
+ pendingAuth.status = 'expired';
654
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
655
+ }
656
+ return pendingAuth;
657
+ }
658
+ async completePendingAuth(vaultId, pendingAuthId) {
659
+ const entry = await this.get(vaultId);
660
+ if (!entry)
661
+ return;
662
+ const pendingAuth = entry.pendingAuths.find((p) => p.id === pendingAuthId);
663
+ if (pendingAuth) {
664
+ pendingAuth.status = 'completed';
665
+ await this.authorizeApp(vaultId, pendingAuth.appId);
666
+ }
667
+ }
668
+ async cancelPendingAuth(vaultId, pendingAuthId) {
669
+ const entry = await this.get(vaultId);
670
+ if (!entry)
671
+ return;
672
+ const pendingAuth = entry.pendingAuths.find((p) => p.id === pendingAuthId);
673
+ if (pendingAuth) {
674
+ pendingAuth.status = 'cancelled';
675
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
676
+ }
677
+ }
678
+ async isAppAuthorized(vaultId, appId) {
679
+ const entry = await this.get(vaultId);
680
+ if (!entry)
681
+ return false;
682
+ return entry.authorizedAppIds.includes(appId);
683
+ }
684
+ async getPendingAuths(vaultId) {
685
+ const entry = await this.get(vaultId);
686
+ if (!entry)
687
+ return [];
688
+ const now = Date.now();
689
+ let updated = false;
690
+ const pending = entry.pendingAuths.filter((p) => {
691
+ if (now > p.expiresAt && p.status === 'pending') {
692
+ p.status = 'expired';
693
+ updated = true;
694
+ }
695
+ return p.status === 'pending';
696
+ });
697
+ if (updated) {
698
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
699
+ }
700
+ return pending;
701
+ }
702
+ async cleanup() {
703
+ // Redis cleanup would use SCAN to find and clean entries
704
+ // This is a placeholder
705
+ }
706
+ // ============================================
707
+ // App Credential Methods
708
+ // ============================================
709
+ async addAppCredential(vaultId, credential) {
710
+ const entry = await this.get(vaultId);
711
+ if (!entry)
712
+ return;
713
+ // Check if we should store based on consent
714
+ const shouldStore = await this.shouldStoreCredential(vaultId, credential.appId);
715
+ if (!shouldStore) {
716
+ return;
717
+ }
718
+ const key = this.credentialKey(credential.appId, credential.providerId);
719
+ entry.appCredentials[key] = credential;
720
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
721
+ }
722
+ async removeAppCredential(vaultId, appId, providerId) {
723
+ const entry = await this.get(vaultId);
724
+ if (!entry)
725
+ return;
726
+ const key = this.credentialKey(appId, providerId);
727
+ delete entry.appCredentials[key];
728
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
729
+ }
730
+ async getAppCredentials(vaultId, appId) {
731
+ const entry = await this.get(vaultId);
732
+ if (!entry)
733
+ return [];
734
+ const prefix = `${appId}:`;
735
+ return Object.entries(entry.appCredentials)
736
+ .filter(([key]) => key.startsWith(prefix))
737
+ .map(([, cred]) => cred);
738
+ }
739
+ async getCredential(vaultId, appId, providerId) {
740
+ const entry = await this.get(vaultId);
741
+ if (!entry)
742
+ return null;
743
+ const key = this.credentialKey(appId, providerId);
744
+ return entry.appCredentials[key] ?? null;
745
+ }
746
+ async getAllCredentials(vaultId, filterByConsent = false) {
747
+ const entry = await this.get(vaultId);
748
+ if (!entry)
749
+ return [];
750
+ const allCredentials = Object.values(entry.appCredentials);
751
+ if (!filterByConsent || !entry.consent?.enabled) {
752
+ return allCredentials;
753
+ }
754
+ // Filter by consent - only return credentials for apps that have tools in consent selection
755
+ const consentedToolIds = new Set(entry.consent.selectedToolIds);
756
+ return allCredentials.filter((cred) => {
757
+ return Array.from(consentedToolIds).some((toolId) => toolId.startsWith(`${cred.appId}:`));
758
+ });
759
+ }
760
+ async updateCredential(vaultId, appId, providerId, updates) {
761
+ const entry = await this.get(vaultId);
762
+ if (!entry)
763
+ return;
764
+ const key = this.credentialKey(appId, providerId);
765
+ const credential = entry.appCredentials[key];
766
+ if (!credential)
767
+ return;
768
+ Object.assign(credential, updates);
769
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
770
+ }
771
+ async shouldStoreCredential(vaultId, appId, toolIds) {
772
+ const entry = await this.get(vaultId);
773
+ if (!entry)
774
+ return false;
775
+ // If consent is not enabled, always allow
776
+ if (!entry.consent?.enabled) {
777
+ return true;
778
+ }
779
+ // If toolIds provided, check if any match consent selection
780
+ if (toolIds && toolIds.length > 0) {
781
+ return toolIds.some((toolId) => entry.consent.selectedToolIds.includes(toolId));
782
+ }
783
+ // Check if any tool for this app is in consent selection
784
+ const consentedToolIds = entry.consent.selectedToolIds;
785
+ return consentedToolIds.some((toolId) => toolId.startsWith(`${appId}:`));
786
+ }
787
+ async invalidateCredential(vaultId, appId, providerId, reason) {
788
+ await this.updateCredential(vaultId, appId, providerId, {
789
+ isValid: false,
790
+ invalidReason: reason,
791
+ });
792
+ }
793
+ async refreshOAuthCredential(vaultId, appId, providerId, tokens) {
794
+ const entry = await this.get(vaultId);
795
+ if (!entry)
796
+ return;
797
+ const key = this.credentialKey(appId, providerId);
798
+ const credential = entry.appCredentials[key];
799
+ if (!credential || credential.credential.type !== 'oauth')
800
+ return;
801
+ // Update OAuth tokens
802
+ credential.credential.accessToken = tokens.accessToken;
803
+ if (tokens.refreshToken !== undefined) {
804
+ credential.credential.refreshToken = tokens.refreshToken;
805
+ }
806
+ if (tokens.expiresAt !== undefined) {
807
+ credential.credential.expiresAt = tokens.expiresAt;
808
+ credential.expiresAt = tokens.expiresAt;
809
+ }
810
+ // Mark as valid again
811
+ credential.isValid = true;
812
+ credential.invalidReason = undefined;
813
+ await this.redis.set(this.key(vaultId), JSON.stringify(entry));
814
+ }
815
+ }
816
+ exports.RedisAuthorizationVault = RedisAuthorizationVault;
817
+ //# sourceMappingURL=authorization-vault.js.map