@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,323 @@
1
+ "use strict";
2
+ // auth/session/authorization.store.ts
3
+ /**
4
+ * Authorization Store for OAuth flows
5
+ *
6
+ * Stores authorization codes, PKCE challenges, and pending authorizations.
7
+ * Supports both in-memory (dev/test) and Redis (production) backends.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RedisAuthorizationStore = exports.InMemoryAuthorizationStore = exports.authorizationCodeRecordSchema = exports.pkceChallengeSchema = void 0;
11
+ exports.verifyPkce = verifyPkce;
12
+ exports.generatePkceChallenge = generatePkceChallenge;
13
+ const node_crypto_1 = require("node:crypto");
14
+ const zod_1 = require("zod");
15
+ /**
16
+ * Zod schemas for validation
17
+ */
18
+ exports.pkceChallengeSchema = zod_1.z.object({
19
+ challenge: zod_1.z.string().min(43).max(128),
20
+ method: zod_1.z.literal('S256'),
21
+ });
22
+ exports.authorizationCodeRecordSchema = zod_1.z.object({
23
+ code: zod_1.z.string().min(1),
24
+ clientId: zod_1.z.string().min(1),
25
+ redirectUri: zod_1.z.string().url(),
26
+ scopes: zod_1.z.array(zod_1.z.string()),
27
+ pkce: exports.pkceChallengeSchema,
28
+ userSub: zod_1.z.string().min(1),
29
+ userEmail: zod_1.z.string().email().optional(),
30
+ userName: zod_1.z.string().optional(),
31
+ state: zod_1.z.string().optional(),
32
+ createdAt: zod_1.z.number(),
33
+ expiresAt: zod_1.z.number(),
34
+ used: zod_1.z.boolean(),
35
+ resource: zod_1.z.string().url().optional(),
36
+ });
37
+ /**
38
+ * PKCE utilities
39
+ */
40
+ function verifyPkce(codeVerifier, challenge) {
41
+ if (challenge.method !== 'S256') {
42
+ return false;
43
+ }
44
+ // S256: BASE64URL(SHA256(code_verifier)) === code_challenge
45
+ const hash = (0, node_crypto_1.createHash)('sha256').update(codeVerifier).digest('base64url');
46
+ return hash === challenge.challenge;
47
+ }
48
+ function generatePkceChallenge(codeVerifier) {
49
+ const challenge = (0, node_crypto_1.createHash)('sha256').update(codeVerifier).digest('base64url');
50
+ return { challenge, method: 'S256' };
51
+ }
52
+ /**
53
+ * In-Memory Authorization Store
54
+ *
55
+ * Development/testing implementation. Data is lost on restart.
56
+ * For production, use RedisAuthorizationStore.
57
+ */
58
+ class InMemoryAuthorizationStore {
59
+ codes = new Map();
60
+ pending = new Map();
61
+ refreshTokens = new Map();
62
+ /** Default TTL for authorization codes (60 seconds) */
63
+ codeTtlMs = 60 * 1000;
64
+ /** Default TTL for pending authorizations (10 minutes) */
65
+ pendingTtlMs = 10 * 60 * 1000;
66
+ /** Default TTL for refresh tokens (30 days) */
67
+ refreshTtlMs = 30 * 24 * 60 * 60 * 1000;
68
+ generateCode() {
69
+ // Generate a cryptographically secure authorization code
70
+ return (0, node_crypto_1.randomUUID)().replace(/-/g, '') + (0, node_crypto_1.randomUUID)().replace(/-/g, '');
71
+ }
72
+ generateRefreshToken() {
73
+ return (0, node_crypto_1.randomUUID)() + '-' + (0, node_crypto_1.randomUUID)();
74
+ }
75
+ async storeAuthorizationCode(record) {
76
+ this.codes.set(record.code, record);
77
+ }
78
+ async getAuthorizationCode(code) {
79
+ const record = this.codes.get(code);
80
+ if (!record)
81
+ return null;
82
+ // Check expiration
83
+ if (Date.now() > record.expiresAt) {
84
+ this.codes.delete(code);
85
+ return null;
86
+ }
87
+ return record;
88
+ }
89
+ async markCodeUsed(code) {
90
+ const record = this.codes.get(code);
91
+ if (record) {
92
+ record.used = true;
93
+ }
94
+ }
95
+ async deleteAuthorizationCode(code) {
96
+ this.codes.delete(code);
97
+ }
98
+ async storePendingAuthorization(record) {
99
+ this.pending.set(record.id, record);
100
+ }
101
+ async getPendingAuthorization(id) {
102
+ const record = this.pending.get(id);
103
+ if (!record)
104
+ return null;
105
+ // Check expiration
106
+ if (Date.now() > record.expiresAt) {
107
+ this.pending.delete(id);
108
+ return null;
109
+ }
110
+ return record;
111
+ }
112
+ async deletePendingAuthorization(id) {
113
+ this.pending.delete(id);
114
+ }
115
+ async storeRefreshToken(record) {
116
+ this.refreshTokens.set(record.token, record);
117
+ }
118
+ async getRefreshToken(token) {
119
+ const record = this.refreshTokens.get(token);
120
+ if (!record)
121
+ return null;
122
+ // Check expiration and revocation
123
+ if (Date.now() > record.expiresAt || record.revoked) {
124
+ return null;
125
+ }
126
+ return record;
127
+ }
128
+ async revokeRefreshToken(token) {
129
+ const record = this.refreshTokens.get(token);
130
+ if (record) {
131
+ record.revoked = true;
132
+ }
133
+ }
134
+ async rotateRefreshToken(oldToken, newRecord) {
135
+ // Revoke old token
136
+ await this.revokeRefreshToken(oldToken);
137
+ // Store new token with reference to old
138
+ newRecord.previousToken = oldToken;
139
+ await this.storeRefreshToken(newRecord);
140
+ }
141
+ async cleanup() {
142
+ const now = Date.now();
143
+ // Clean expired codes
144
+ for (const [code, record] of this.codes) {
145
+ if (now > record.expiresAt) {
146
+ this.codes.delete(code);
147
+ }
148
+ }
149
+ // Clean expired pending authorizations
150
+ for (const [id, record] of this.pending) {
151
+ if (now > record.expiresAt) {
152
+ this.pending.delete(id);
153
+ }
154
+ }
155
+ // Clean expired/revoked refresh tokens
156
+ for (const [token, record] of this.refreshTokens) {
157
+ if (now > record.expiresAt || record.revoked) {
158
+ this.refreshTokens.delete(token);
159
+ }
160
+ }
161
+ }
162
+ /**
163
+ * Create an authorization code record with defaults
164
+ */
165
+ createCodeRecord(params) {
166
+ const now = Date.now();
167
+ return {
168
+ code: this.generateCode(),
169
+ clientId: params.clientId,
170
+ redirectUri: params.redirectUri,
171
+ scopes: params.scopes,
172
+ pkce: params.pkce,
173
+ userSub: params.userSub,
174
+ userEmail: params.userEmail,
175
+ userName: params.userName,
176
+ state: params.state,
177
+ resource: params.resource,
178
+ createdAt: now,
179
+ expiresAt: now + this.codeTtlMs,
180
+ used: false,
181
+ // Consent and Federated Login Data
182
+ selectedToolIds: params.selectedToolIds,
183
+ selectedProviderIds: params.selectedProviderIds,
184
+ skippedProviderIds: params.skippedProviderIds,
185
+ consentEnabled: params.consentEnabled,
186
+ federatedLoginUsed: params.federatedLoginUsed,
187
+ };
188
+ }
189
+ /**
190
+ * Create a pending authorization record with defaults
191
+ */
192
+ createPendingRecord(params) {
193
+ const now = Date.now();
194
+ return {
195
+ id: (0, node_crypto_1.randomUUID)(),
196
+ clientId: params.clientId,
197
+ redirectUri: params.redirectUri,
198
+ scopes: params.scopes,
199
+ pkce: params.pkce,
200
+ state: params.state,
201
+ resource: params.resource,
202
+ createdAt: now,
203
+ expiresAt: now + this.pendingTtlMs,
204
+ // Progressive/Incremental Authorization Fields
205
+ isIncremental: params.isIncremental,
206
+ targetAppId: params.targetAppId,
207
+ targetToolId: params.targetToolId,
208
+ existingSessionId: params.existingSessionId,
209
+ existingAuthorizationId: params.existingAuthorizationId,
210
+ // Federated Login State
211
+ federatedLogin: params.federatedLogin,
212
+ // Consent State
213
+ consent: params.consent,
214
+ };
215
+ }
216
+ /**
217
+ * Create a refresh token record with defaults
218
+ */
219
+ createRefreshTokenRecord(params) {
220
+ const now = Date.now();
221
+ return {
222
+ token: this.generateRefreshToken(),
223
+ clientId: params.clientId,
224
+ userSub: params.userSub,
225
+ scopes: params.scopes,
226
+ resource: params.resource,
227
+ createdAt: now,
228
+ expiresAt: now + this.refreshTtlMs,
229
+ revoked: false,
230
+ };
231
+ }
232
+ }
233
+ exports.InMemoryAuthorizationStore = InMemoryAuthorizationStore;
234
+ /**
235
+ * Redis Authorization Store (placeholder)
236
+ *
237
+ * Production implementation using Redis for distributed storage.
238
+ * TODO: Implement after in-memory store is validated.
239
+ */
240
+ class RedisAuthorizationStore {
241
+ redis;
242
+ namespace;
243
+ constructor(
244
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
245
+ redis, namespace = 'oauth:') {
246
+ this.redis = redis;
247
+ this.namespace = namespace;
248
+ }
249
+ key(type, id) {
250
+ return `${this.namespace}${type}:${id}`;
251
+ }
252
+ generateCode() {
253
+ return (0, node_crypto_1.randomUUID)().replace(/-/g, '') + (0, node_crypto_1.randomUUID)().replace(/-/g, '');
254
+ }
255
+ generateRefreshToken() {
256
+ return (0, node_crypto_1.randomUUID)() + '-' + (0, node_crypto_1.randomUUID)();
257
+ }
258
+ async storeAuthorizationCode(record) {
259
+ const ttl = Math.max(Math.ceil((record.expiresAt - Date.now()) / 1000), 1);
260
+ await this.redis.set(this.key('code', record.code), JSON.stringify(record), 'EX', Math.max(ttl, 1));
261
+ }
262
+ async getAuthorizationCode(code) {
263
+ const data = await this.redis.get(this.key('code', code));
264
+ if (!data)
265
+ return null;
266
+ return JSON.parse(data);
267
+ }
268
+ async markCodeUsed(code) {
269
+ const record = await this.getAuthorizationCode(code);
270
+ if (record) {
271
+ record.used = true;
272
+ const ttl = Math.ceil((record.expiresAt - Date.now()) / 1000);
273
+ await this.redis.set(this.key('code', code), JSON.stringify(record), 'EX', Math.max(ttl, 1));
274
+ }
275
+ }
276
+ async deleteAuthorizationCode(code) {
277
+ await this.redis.del(this.key('code', code));
278
+ }
279
+ async storePendingAuthorization(record) {
280
+ const ttl = Math.max(Math.ceil((record.expiresAt - Date.now()) / 1000), 1);
281
+ await this.redis.set(this.key('pending', record.id), JSON.stringify(record), 'EX', ttl);
282
+ }
283
+ async getPendingAuthorization(id) {
284
+ const data = await this.redis.get(this.key('pending', id));
285
+ if (!data)
286
+ return null;
287
+ return JSON.parse(data);
288
+ }
289
+ async deletePendingAuthorization(id) {
290
+ await this.redis.del(this.key('pending', id));
291
+ }
292
+ async storeRefreshToken(record) {
293
+ const ttl = Math.ceil((record.expiresAt - Date.now()) / 1000);
294
+ await this.redis.set(this.key('refresh', record.token), JSON.stringify(record), 'EX', ttl);
295
+ }
296
+ async getRefreshToken(token) {
297
+ const data = await this.redis.get(this.key('refresh', token));
298
+ if (!data)
299
+ return null;
300
+ const record = JSON.parse(data);
301
+ if (record.revoked)
302
+ return null;
303
+ return record;
304
+ }
305
+ async revokeRefreshToken(token) {
306
+ const record = await this.getRefreshToken(token);
307
+ if (record) {
308
+ record.revoked = true;
309
+ const ttl = Math.ceil((record.expiresAt - Date.now()) / 1000);
310
+ await this.redis.set(this.key('refresh', token), JSON.stringify(record), 'EX', Math.max(ttl, 1));
311
+ }
312
+ }
313
+ async rotateRefreshToken(oldToken, newRecord) {
314
+ await this.revokeRefreshToken(oldToken);
315
+ newRecord.previousToken = oldToken;
316
+ await this.storeRefreshToken(newRecord);
317
+ }
318
+ async cleanup() {
319
+ // Redis handles cleanup via TTL, nothing to do here
320
+ }
321
+ }
322
+ exports.RedisAuthorizationStore = RedisAuthorizationStore;
323
+ //# sourceMappingURL=authorization.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.store.js","sourceRoot":"","sources":["../../../../src/auth/session/authorization.store.ts"],"names":[],"mappings":"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","sourcesContent":["// auth/session/authorization.store.ts\n/**\n * Authorization Store for OAuth flows\n *\n * Stores authorization codes, PKCE challenges, and pending authorizations.\n * Supports both in-memory (dev/test) and Redis (production) backends.\n */\n\nimport { randomUUID, createHash } from 'node:crypto';\nimport { z } from 'zod';\n\n/**\n * PKCE challenge data\n */\nexport interface PkceChallenge {\n /** S256 hashed code_challenge */\n challenge: string;\n /** Always 'S256' per OAuth 2.1 */\n method: 'S256';\n}\n\n/**\n * Authorization code record stored during the OAuth flow\n */\nexport interface AuthorizationCodeRecord {\n /** The authorization code (opaque string) */\n code: string;\n /** Client ID that requested authorization */\n clientId: string;\n /** Redirect URI used in the authorization request */\n redirectUri: string;\n /** Requested scopes */\n scopes: string[];\n /** PKCE challenge for verification */\n pkce: PkceChallenge;\n /** User identifier (sub claim) */\n userSub: string;\n /** User email if available */\n userEmail?: string;\n /** User name if available */\n userName?: string;\n /** Original state parameter */\n state?: string;\n /** Creation timestamp (epoch ms) */\n createdAt: number;\n /** Expiration timestamp (epoch ms) - codes are short-lived (60s default) */\n expiresAt: number;\n /** Whether this code has been used (single-use) */\n used: boolean;\n /** Resource/audience the token will be issued for */\n resource?: string;\n\n // Consent and Federated Login Data\n /** Selected tool IDs from consent flow */\n selectedToolIds?: string[];\n /** Selected provider IDs from federated login */\n selectedProviderIds?: string[];\n /** Skipped provider IDs from federated login (for progressive auth) */\n skippedProviderIds?: string[];\n /** Whether consent was enabled for this authorization */\n consentEnabled?: boolean;\n /** Whether federated login was used */\n federatedLoginUsed?: boolean;\n}\n\n/**\n * Consent state for tool selection\n */\nexport interface ConsentStateRecord {\n /** Whether consent flow is enabled */\n enabled: boolean;\n /** Available tool IDs for consent */\n availableToolIds: string[];\n /** Selected tool IDs (after user selection) */\n selectedToolIds?: string[];\n /** Whether consent has been completed */\n consentCompleted: boolean;\n /** Timestamp when consent was completed */\n consentCompletedAt?: number;\n}\n\n/**\n * Federated login state for multi-provider auth\n */\nexport interface FederatedLoginStateRecord {\n /** Available provider IDs */\n providerIds: string[];\n /** Selected provider IDs */\n selectedProviderIds?: string[];\n /** Skipped provider IDs */\n skippedProviderIds?: string[];\n /** Provider-specific user data (after auth) */\n providerUserData?: Record<string, { email?: string; name?: string; sub?: string }>;\n}\n\n/**\n * Pending authorization request (before user authenticates)\n */\nexport interface PendingAuthorizationRecord {\n /** Unique ID for this pending authorization */\n id: string;\n /** Client ID requesting authorization */\n clientId: string;\n /** Redirect URI for callback */\n redirectUri: string;\n /** Requested scopes */\n scopes: string[];\n /** PKCE challenge */\n pkce: PkceChallenge;\n /** Original state parameter from client */\n state?: string;\n /** Resource/audience */\n resource?: string;\n /** Creation timestamp */\n createdAt: number;\n /** Expiration timestamp (pending requests expire after 10 minutes) */\n expiresAt: number;\n\n // Progressive/Incremental Authorization Fields\n /** Whether this is an incremental authorization request */\n isIncremental?: boolean;\n /** Target app ID for incremental authorization */\n targetAppId?: string;\n /** Target tool ID that triggered the incremental auth */\n targetToolId?: string;\n /** Existing session ID for incremental auth (to expand the token vault) */\n existingSessionId?: string;\n /** Existing authorization ID to expand */\n existingAuthorizationId?: string;\n\n // Federated Login State\n /** Federated login state for multi-provider auth */\n federatedLogin?: FederatedLoginStateRecord;\n\n // Consent State\n /** Consent state for tool selection */\n consent?: ConsentStateRecord;\n}\n\n/**\n * Refresh token record\n */\nexport interface RefreshTokenRecord {\n /** The refresh token (opaque string) */\n token: string;\n /** Client ID */\n clientId: string;\n /** User identifier */\n userSub: string;\n /** Granted scopes */\n scopes: string[];\n /** Resource/audience */\n resource?: string;\n /** Creation timestamp */\n createdAt: number;\n /** Expiration timestamp */\n expiresAt: number;\n /** Whether this token has been revoked */\n revoked: boolean;\n /** Previous token if rotated */\n previousToken?: string;\n}\n\n/**\n * Zod schemas for validation\n */\nexport const pkceChallengeSchema = z.object({\n challenge: z.string().min(43).max(128),\n method: z.literal('S256'),\n});\n\nexport const authorizationCodeRecordSchema = z.object({\n code: z.string().min(1),\n clientId: z.string().min(1),\n redirectUri: z.string().url(),\n scopes: z.array(z.string()),\n pkce: pkceChallengeSchema,\n userSub: z.string().min(1),\n userEmail: z.string().email().optional(),\n userName: z.string().optional(),\n state: z.string().optional(),\n createdAt: z.number(),\n expiresAt: z.number(),\n used: z.boolean(),\n resource: z.string().url().optional(),\n});\n\n/**\n * Authorization Store Interface\n */\nexport interface AuthorizationStore {\n // Authorization code operations\n storeAuthorizationCode(record: AuthorizationCodeRecord): Promise<void>;\n getAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | null>;\n markCodeUsed(code: string): Promise<void>;\n deleteAuthorizationCode(code: string): Promise<void>;\n\n // Pending authorization operations\n storePendingAuthorization(record: PendingAuthorizationRecord): Promise<void>;\n getPendingAuthorization(id: string): Promise<PendingAuthorizationRecord | null>;\n deletePendingAuthorization(id: string): Promise<void>;\n\n // Refresh token operations\n storeRefreshToken(record: RefreshTokenRecord): Promise<void>;\n getRefreshToken(token: string): Promise<RefreshTokenRecord | null>;\n revokeRefreshToken(token: string): Promise<void>;\n rotateRefreshToken(oldToken: string, newRecord: RefreshTokenRecord): Promise<void>;\n\n // Utility\n generateCode(): string;\n generateRefreshToken(): string;\n cleanup(): Promise<void>;\n}\n\n/**\n * PKCE utilities\n */\nexport function verifyPkce(codeVerifier: string, challenge: PkceChallenge): boolean {\n if (challenge.method !== 'S256') {\n return false;\n }\n\n // S256: BASE64URL(SHA256(code_verifier)) === code_challenge\n const hash = createHash('sha256').update(codeVerifier).digest('base64url');\n return hash === challenge.challenge;\n}\n\nexport function generatePkceChallenge(codeVerifier: string): PkceChallenge {\n const challenge = createHash('sha256').update(codeVerifier).digest('base64url');\n return { challenge, method: 'S256' };\n}\n\n/**\n * In-Memory Authorization Store\n *\n * Development/testing implementation. Data is lost on restart.\n * For production, use RedisAuthorizationStore.\n */\nexport class InMemoryAuthorizationStore implements AuthorizationStore {\n private codes = new Map<string, AuthorizationCodeRecord>();\n private pending = new Map<string, PendingAuthorizationRecord>();\n private refreshTokens = new Map<string, RefreshTokenRecord>();\n\n /** Default TTL for authorization codes (60 seconds) */\n private readonly codeTtlMs = 60 * 1000;\n /** Default TTL for pending authorizations (10 minutes) */\n private readonly pendingTtlMs = 10 * 60 * 1000;\n /** Default TTL for refresh tokens (30 days) */\n private readonly refreshTtlMs = 30 * 24 * 60 * 60 * 1000;\n\n generateCode(): string {\n // Generate a cryptographically secure authorization code\n return randomUUID().replace(/-/g, '') + randomUUID().replace(/-/g, '');\n }\n\n generateRefreshToken(): string {\n return randomUUID() + '-' + randomUUID();\n }\n\n async storeAuthorizationCode(record: AuthorizationCodeRecord): Promise<void> {\n this.codes.set(record.code, record);\n }\n\n async getAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | null> {\n const record = this.codes.get(code);\n if (!record) return null;\n\n // Check expiration\n if (Date.now() > record.expiresAt) {\n this.codes.delete(code);\n return null;\n }\n\n return record;\n }\n\n async markCodeUsed(code: string): Promise<void> {\n const record = this.codes.get(code);\n if (record) {\n record.used = true;\n }\n }\n\n async deleteAuthorizationCode(code: string): Promise<void> {\n this.codes.delete(code);\n }\n\n async storePendingAuthorization(record: PendingAuthorizationRecord): Promise<void> {\n this.pending.set(record.id, record);\n }\n\n async getPendingAuthorization(id: string): Promise<PendingAuthorizationRecord | null> {\n const record = this.pending.get(id);\n if (!record) return null;\n\n // Check expiration\n if (Date.now() > record.expiresAt) {\n this.pending.delete(id);\n return null;\n }\n\n return record;\n }\n\n async deletePendingAuthorization(id: string): Promise<void> {\n this.pending.delete(id);\n }\n\n async storeRefreshToken(record: RefreshTokenRecord): Promise<void> {\n this.refreshTokens.set(record.token, record);\n }\n\n async getRefreshToken(token: string): Promise<RefreshTokenRecord | null> {\n const record = this.refreshTokens.get(token);\n if (!record) return null;\n\n // Check expiration and revocation\n if (Date.now() > record.expiresAt || record.revoked) {\n return null;\n }\n\n return record;\n }\n\n async revokeRefreshToken(token: string): Promise<void> {\n const record = this.refreshTokens.get(token);\n if (record) {\n record.revoked = true;\n }\n }\n\n async rotateRefreshToken(oldToken: string, newRecord: RefreshTokenRecord): Promise<void> {\n // Revoke old token\n await this.revokeRefreshToken(oldToken);\n\n // Store new token with reference to old\n newRecord.previousToken = oldToken;\n await this.storeRefreshToken(newRecord);\n }\n\n async cleanup(): Promise<void> {\n const now = Date.now();\n\n // Clean expired codes\n for (const [code, record] of this.codes) {\n if (now > record.expiresAt) {\n this.codes.delete(code);\n }\n }\n\n // Clean expired pending authorizations\n for (const [id, record] of this.pending) {\n if (now > record.expiresAt) {\n this.pending.delete(id);\n }\n }\n\n // Clean expired/revoked refresh tokens\n for (const [token, record] of this.refreshTokens) {\n if (now > record.expiresAt || record.revoked) {\n this.refreshTokens.delete(token);\n }\n }\n }\n\n /**\n * Create an authorization code record with defaults\n */\n createCodeRecord(params: {\n clientId: string;\n redirectUri: string;\n scopes: string[];\n pkce: PkceChallenge;\n userSub: string;\n userEmail?: string;\n userName?: string;\n state?: string;\n resource?: string;\n // Consent and Federated Login Data\n selectedToolIds?: string[];\n selectedProviderIds?: string[];\n skippedProviderIds?: string[];\n consentEnabled?: boolean;\n federatedLoginUsed?: boolean;\n }): AuthorizationCodeRecord {\n const now = Date.now();\n return {\n code: this.generateCode(),\n clientId: params.clientId,\n redirectUri: params.redirectUri,\n scopes: params.scopes,\n pkce: params.pkce,\n userSub: params.userSub,\n userEmail: params.userEmail,\n userName: params.userName,\n state: params.state,\n resource: params.resource,\n createdAt: now,\n expiresAt: now + this.codeTtlMs,\n used: false,\n // Consent and Federated Login Data\n selectedToolIds: params.selectedToolIds,\n selectedProviderIds: params.selectedProviderIds,\n skippedProviderIds: params.skippedProviderIds,\n consentEnabled: params.consentEnabled,\n federatedLoginUsed: params.federatedLoginUsed,\n };\n }\n\n /**\n * Create a pending authorization record with defaults\n */\n createPendingRecord(params: {\n clientId: string;\n redirectUri: string;\n scopes: string[];\n pkce: PkceChallenge;\n state?: string;\n resource?: string;\n // Progressive/Incremental Authorization Fields\n isIncremental?: boolean;\n targetAppId?: string;\n targetToolId?: string;\n existingSessionId?: string;\n existingAuthorizationId?: string;\n // Federated Login State\n federatedLogin?: FederatedLoginStateRecord;\n // Consent State\n consent?: ConsentStateRecord;\n }): PendingAuthorizationRecord {\n const now = Date.now();\n return {\n id: randomUUID(),\n clientId: params.clientId,\n redirectUri: params.redirectUri,\n scopes: params.scopes,\n pkce: params.pkce,\n state: params.state,\n resource: params.resource,\n createdAt: now,\n expiresAt: now + this.pendingTtlMs,\n // Progressive/Incremental Authorization Fields\n isIncremental: params.isIncremental,\n targetAppId: params.targetAppId,\n targetToolId: params.targetToolId,\n existingSessionId: params.existingSessionId,\n existingAuthorizationId: params.existingAuthorizationId,\n // Federated Login State\n federatedLogin: params.federatedLogin,\n // Consent State\n consent: params.consent,\n };\n }\n\n /**\n * Create a refresh token record with defaults\n */\n createRefreshTokenRecord(params: {\n clientId: string;\n userSub: string;\n scopes: string[];\n resource?: string;\n }): RefreshTokenRecord {\n const now = Date.now();\n return {\n token: this.generateRefreshToken(),\n clientId: params.clientId,\n userSub: params.userSub,\n scopes: params.scopes,\n resource: params.resource,\n createdAt: now,\n expiresAt: now + this.refreshTtlMs,\n revoked: false,\n };\n }\n}\n\n/**\n * Redis Authorization Store (placeholder)\n *\n * Production implementation using Redis for distributed storage.\n * TODO: Implement after in-memory store is validated.\n */\nexport class RedisAuthorizationStore implements AuthorizationStore {\n constructor(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly redis: any,\n private readonly namespace = 'oauth:',\n ) {}\n\n private key(type: 'code' | 'pending' | 'refresh', id: string): string {\n return `${this.namespace}${type}:${id}`;\n }\n\n generateCode(): string {\n return randomUUID().replace(/-/g, '') + randomUUID().replace(/-/g, '');\n }\n\n generateRefreshToken(): string {\n return randomUUID() + '-' + randomUUID();\n }\n\n async storeAuthorizationCode(record: AuthorizationCodeRecord): Promise<void> {\n const ttl = Math.max(Math.ceil((record.expiresAt - Date.now()) / 1000), 1);\n await this.redis.set(this.key('code', record.code), JSON.stringify(record), 'EX', Math.max(ttl, 1));\n }\n\n async getAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | null> {\n const data = await this.redis.get(this.key('code', code));\n if (!data) return null;\n return JSON.parse(data) as AuthorizationCodeRecord;\n }\n\n async markCodeUsed(code: string): Promise<void> {\n const record = await this.getAuthorizationCode(code);\n if (record) {\n record.used = true;\n const ttl = Math.ceil((record.expiresAt - Date.now()) / 1000);\n await this.redis.set(this.key('code', code), JSON.stringify(record), 'EX', Math.max(ttl, 1));\n }\n }\n\n async deleteAuthorizationCode(code: string): Promise<void> {\n await this.redis.del(this.key('code', code));\n }\n\n async storePendingAuthorization(record: PendingAuthorizationRecord): Promise<void> {\n const ttl = Math.max(Math.ceil((record.expiresAt - Date.now()) / 1000), 1);\n await this.redis.set(this.key('pending', record.id), JSON.stringify(record), 'EX', ttl);\n }\n\n async getPendingAuthorization(id: string): Promise<PendingAuthorizationRecord | null> {\n const data = await this.redis.get(this.key('pending', id));\n if (!data) return null;\n return JSON.parse(data) as PendingAuthorizationRecord;\n }\n\n async deletePendingAuthorization(id: string): Promise<void> {\n await this.redis.del(this.key('pending', id));\n }\n\n async storeRefreshToken(record: RefreshTokenRecord): Promise<void> {\n const ttl = Math.ceil((record.expiresAt - Date.now()) / 1000);\n await this.redis.set(this.key('refresh', record.token), JSON.stringify(record), 'EX', ttl);\n }\n\n async getRefreshToken(token: string): Promise<RefreshTokenRecord | null> {\n const data = await this.redis.get(this.key('refresh', token));\n if (!data) return null;\n const record = JSON.parse(data) as RefreshTokenRecord;\n if (record.revoked) return null;\n return record;\n }\n\n async revokeRefreshToken(token: string): Promise<void> {\n const record = await this.getRefreshToken(token);\n if (record) {\n record.revoked = true;\n const ttl = Math.ceil((record.expiresAt - Date.now()) / 1000);\n await this.redis.set(this.key('refresh', token), JSON.stringify(record), 'EX', Math.max(ttl, 1));\n }\n }\n\n async rotateRefreshToken(oldToken: string, newRecord: RefreshTokenRecord): Promise<void> {\n await this.revokeRefreshToken(oldToken);\n newRecord.previousToken = oldToken;\n await this.storeRefreshToken(newRecord);\n }\n\n async cleanup(): Promise<void> {\n // Redis handles cleanup via TTL, nothing to do here\n }\n}\n"]}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Encrypted Authorization Vault
3
+ *
4
+ * A vault implementation that encrypts all sensitive data using a key
5
+ * derived from the client's JWT authorization token.
6
+ *
7
+ * Security Properties:
8
+ * - Zero-knowledge storage: Server cannot decrypt credentials
9
+ * - Client-side key: Encryption key derived from JWT (client must present token)
10
+ * - Authenticated encryption: AES-256-GCM prevents tampering
11
+ * - Per-vault keys: Each vault has a unique encryption key
12
+ *
13
+ * Usage:
14
+ * ```typescript
15
+ * const vault = new EncryptedRedisVault(redis, encryption);
16
+ *
17
+ * // On each request, derive key from JWT and set context
18
+ * const key = encryption.deriveKeyFromToken(token, claims);
19
+ * vault.setEncryptionKey(key);
20
+ *
21
+ * // Now all operations automatically encrypt/decrypt
22
+ * await vault.addAppCredential(vaultId, credential);
23
+ * ```
24
+ */
25
+ import { z } from 'zod';
26
+ import { VaultEncryption } from './vault-encryption';
27
+ import { AuthorizationVault, AuthorizationVaultEntry, AppCredential, VaultConsentRecord, VaultFederatedRecord, PendingIncrementalAuth } from './authorization-vault';
28
+ /**
29
+ * What we store in Redis - minimal metadata + encrypted blob
30
+ */
31
+ export declare const redisVaultEntrySchema: z.ZodObject<{
32
+ id: z.ZodString;
33
+ userSub: z.ZodString;
34
+ userEmail: z.ZodOptional<z.ZodString>;
35
+ userName: z.ZodOptional<z.ZodString>;
36
+ clientId: z.ZodString;
37
+ createdAt: z.ZodNumber;
38
+ lastAccessAt: z.ZodNumber;
39
+ authorizedAppIds: z.ZodArray<z.ZodString>;
40
+ skippedAppIds: z.ZodArray<z.ZodString>;
41
+ pendingAuthIds: z.ZodArray<z.ZodString>;
42
+ encrypted: z.ZodObject<{
43
+ v: z.ZodLiteral<1>;
44
+ alg: z.ZodLiteral<"aes-256-gcm">;
45
+ iv: z.ZodString;
46
+ ct: z.ZodString;
47
+ tag: z.ZodString;
48
+ }, z.core.$strip>;
49
+ }, z.core.$strip>;
50
+ export type RedisVaultEntry = z.infer<typeof redisVaultEntrySchema>;
51
+ /**
52
+ * Encryption context for the current request
53
+ * Must be set before performing vault operations
54
+ */
55
+ export interface EncryptionContext {
56
+ /** Encryption key derived from JWT */
57
+ key: Buffer;
58
+ /** Vault ID (from JWT jti claim) */
59
+ vaultId: string;
60
+ }
61
+ /**
62
+ * Redis vault with client-side encryption
63
+ *
64
+ * All sensitive data (tokens, credentials, consent, pending auths)
65
+ * is encrypted using a key derived from the client's JWT.
66
+ *
67
+ * Use `runWithContext()` to set encryption context for concurrent safety.
68
+ */
69
+ export declare class EncryptedRedisVault implements AuthorizationVault {
70
+ private readonly redis;
71
+ private readonly encryption;
72
+ private readonly namespace;
73
+ constructor(redis: any, encryption: VaultEncryption, namespace?: string);
74
+ /**
75
+ * Run a callback with encryption context set for the current async scope.
76
+ * This is the recommended way to set encryption context as it is safe for
77
+ * concurrent requests (each request gets its own isolated context).
78
+ *
79
+ * @param context - Encryption context with key and vaultId
80
+ * @param fn - Async function to run with the context
81
+ * @returns The result of the callback
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * const result = await vault.runWithContext({ key, vaultId }, async () => {
86
+ * await vault.get(id);
87
+ * await vault.update(id, data);
88
+ * return 'done';
89
+ * });
90
+ * ```
91
+ */
92
+ runWithContext<T>(context: EncryptionContext, fn: () => T | Promise<T>): T | Promise<T>;
93
+ /**
94
+ * Get current encryption key from AsyncLocalStorage.
95
+ */
96
+ private getKey;
97
+ /**
98
+ * Create Redis key from vault ID
99
+ */
100
+ private redisKey;
101
+ /**
102
+ * Create credential key from appId and providerId
103
+ */
104
+ private credentialKey;
105
+ /**
106
+ * Encrypt sensitive data
107
+ */
108
+ private encryptSensitive;
109
+ /**
110
+ * Decrypt sensitive data
111
+ */
112
+ private decryptSensitive;
113
+ /**
114
+ * Convert Redis entry to full vault entry (decrypts sensitive data)
115
+ */
116
+ private toVaultEntry;
117
+ /**
118
+ * Convert vault entry to Redis entry (encrypts sensitive data)
119
+ */
120
+ private toRedisEntry;
121
+ /**
122
+ * Save entry to Redis
123
+ */
124
+ private saveEntry;
125
+ /**
126
+ * Load entry from Redis
127
+ */
128
+ private loadEntry;
129
+ create(params: {
130
+ userSub: string;
131
+ userEmail?: string;
132
+ userName?: string;
133
+ clientId: string;
134
+ consent?: VaultConsentRecord;
135
+ federated?: VaultFederatedRecord;
136
+ authorizedAppIds?: string[];
137
+ skippedAppIds?: string[];
138
+ }): Promise<AuthorizationVaultEntry>;
139
+ get(id: string): Promise<AuthorizationVaultEntry | null>;
140
+ update(id: string, updates: Partial<AuthorizationVaultEntry>): Promise<void>;
141
+ delete(id: string): Promise<void>;
142
+ updateConsent(vaultId: string, consent: VaultConsentRecord): Promise<void>;
143
+ authorizeApp(vaultId: string, appId: string): Promise<void>;
144
+ createPendingAuth(vaultId: string, params: {
145
+ appId: string;
146
+ toolId?: string;
147
+ authUrl: string;
148
+ requiredScopes?: string[];
149
+ elicitId?: string;
150
+ ttlMs?: number;
151
+ }): Promise<PendingIncrementalAuth>;
152
+ getPendingAuth(vaultId: string, pendingAuthId: string): Promise<PendingIncrementalAuth | null>;
153
+ completePendingAuth(vaultId: string, pendingAuthId: string): Promise<void>;
154
+ cancelPendingAuth(vaultId: string, pendingAuthId: string): Promise<void>;
155
+ isAppAuthorized(vaultId: string, appId: string): Promise<boolean>;
156
+ getPendingAuths(vaultId: string): Promise<PendingIncrementalAuth[]>;
157
+ addAppCredential(vaultId: string, credential: AppCredential): Promise<void>;
158
+ removeAppCredential(vaultId: string, appId: string, providerId: string): Promise<void>;
159
+ getAppCredentials(vaultId: string, appId: string): Promise<AppCredential[]>;
160
+ getCredential(vaultId: string, appId: string, providerId: string): Promise<AppCredential | null>;
161
+ getAllCredentials(vaultId: string, filterByConsent?: boolean): Promise<AppCredential[]>;
162
+ updateCredential(vaultId: string, appId: string, providerId: string, updates: Partial<Pick<AppCredential, 'lastUsedAt' | 'isValid' | 'invalidReason' | 'expiresAt' | 'metadata'>>): Promise<void>;
163
+ shouldStoreCredential(vaultId: string, appId: string, toolIds?: string[]): Promise<boolean>;
164
+ invalidateCredential(vaultId: string, appId: string, providerId: string, reason: string): Promise<void>;
165
+ refreshOAuthCredential(vaultId: string, appId: string, providerId: string, tokens: {
166
+ accessToken: string;
167
+ refreshToken?: string;
168
+ expiresAt?: number;
169
+ }): Promise<void>;
170
+ cleanup(): Promise<void>;
171
+ }
172
+ /**
173
+ * Create an encrypted vault with the given configuration
174
+ */
175
+ export declare function createEncryptedVault(redis: any, config?: {
176
+ pepper?: string;
177
+ namespace?: string;
178
+ }): {
179
+ vault: EncryptedRedisVault;
180
+ encryption: VaultEncryption;
181
+ };