@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.
- package/README.md +30 -18
- package/package.json +20 -5
- package/src/app/app.registry.d.ts +3 -2
- package/src/app/app.registry.js +3 -1
- package/src/app/app.registry.js.map +1 -1
- package/src/app/instances/app.local.instance.js +2 -2
- package/src/app/instances/app.local.instance.js.map +1 -1
- package/src/auth/auth.registry.d.ts +34 -2
- package/src/auth/auth.registry.js +162 -24
- package/src/auth/auth.registry.js.map +1 -1
- package/src/auth/auth.utils.js +8 -9
- package/src/auth/auth.utils.js.map +1 -1
- package/src/auth/authorization/authorization.class.d.ts +125 -0
- package/src/auth/authorization/authorization.class.js +224 -0
- package/src/auth/authorization/authorization.class.js.map +1 -0
- package/src/auth/authorization/authorization.types.d.ts +300 -0
- package/src/auth/authorization/authorization.types.js +79 -0
- package/src/auth/authorization/authorization.types.js.map +1 -0
- package/src/auth/authorization/index.d.ts +5 -0
- package/src/auth/authorization/index.js +19 -0
- package/src/auth/authorization/index.js.map +1 -0
- package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
- package/src/auth/authorization/orchestrated.authorization.js +306 -0
- package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
- package/src/auth/authorization/public.authorization.d.ts +91 -0
- package/src/auth/authorization/public.authorization.js +132 -0
- package/src/auth/authorization/public.authorization.js.map +1 -0
- package/src/auth/authorization/transparent.authorization.d.ts +130 -0
- package/src/auth/authorization/transparent.authorization.js +147 -0
- package/src/auth/authorization/transparent.authorization.js.map +1 -0
- package/src/auth/consent/consent.types.d.ts +111 -0
- package/src/auth/consent/consent.types.js +119 -0
- package/src/auth/consent/consent.types.js.map +1 -0
- package/src/auth/consent/index.d.ts +1 -0
- package/src/auth/consent/index.js +13 -0
- package/src/auth/consent/index.js.map +1 -0
- package/src/auth/detection/auth-provider-detection.d.ts +84 -0
- package/src/auth/detection/auth-provider-detection.js +230 -0
- package/src/auth/detection/auth-provider-detection.js.map +1 -0
- package/src/auth/detection/index.d.ts +1 -0
- package/src/auth/detection/index.js +15 -0
- package/src/auth/detection/index.js.map +1 -0
- package/src/auth/flows/auth.verify.flow.d.ts +110 -0
- package/src/auth/flows/auth.verify.flow.js +379 -0
- package/src/auth/flows/auth.verify.flow.js.map +1 -0
- package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
- package/src/auth/flows/oauth.authorize.flow.js +701 -33
- package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
- package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
- package/src/auth/flows/oauth.callback.flow.js +357 -0
- package/src/auth/flows/oauth.callback.flow.js.map +1 -0
- package/src/auth/flows/oauth.register.flow.d.ts +32 -125
- package/src/auth/flows/oauth.token.flow.d.ts +52 -154
- package/src/auth/flows/oauth.token.flow.js +193 -55
- package/src/auth/flows/oauth.token.flow.js.map +1 -1
- package/src/auth/flows/session.verify.flow.d.ts +66 -321
- package/src/auth/flows/session.verify.flow.js +107 -18
- package/src/auth/flows/session.verify.flow.js.map +1 -1
- package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
- package/src/auth/flows/well-known.jwks.flow.js +15 -8
- package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
- package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
- package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
- package/src/auth/flows/well-known.prm.flow.js +3 -4
- package/src/auth/flows/well-known.prm.flow.js.map +1 -1
- package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
- package/src/auth/instances/instance.local-primary-auth.js +236 -6
- package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
- package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
- package/src/auth/instances/instance.remote-primary-auth.js +2 -2
- package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
- package/src/auth/session/authorization-vault.d.ts +611 -0
- package/src/auth/session/authorization-vault.js +817 -0
- package/src/auth/session/authorization-vault.js.map +1 -0
- package/src/auth/session/authorization.store.d.ts +301 -0
- package/src/auth/session/authorization.store.js +323 -0
- package/src/auth/session/authorization.store.js.map +1 -0
- package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
- package/src/auth/session/encrypted-authorization-vault.js +493 -0
- package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
- package/src/auth/session/index.d.ts +4 -4
- package/src/auth/session/index.js +11 -7
- package/src/auth/session/index.js.map +1 -1
- package/src/auth/session/session.schema.d.ts +1 -1
- package/src/auth/session/session.service.d.ts +1 -1
- package/src/auth/session/transport-session.manager.d.ts +101 -0
- package/src/auth/session/transport-session.manager.js +300 -0
- package/src/auth/session/transport-session.manager.js.map +1 -0
- package/src/auth/session/transport-session.types.d.ts +457 -0
- package/src/auth/session/transport-session.types.js +110 -0
- package/src/auth/session/transport-session.types.js.map +1 -0
- package/src/auth/session/utils/session-id.utils.d.ts +14 -2
- package/src/auth/session/utils/session-id.utils.js +68 -19
- package/src/auth/session/utils/session-id.utils.js.map +1 -1
- package/src/auth/session/vault-encryption.d.ts +189 -0
- package/src/auth/session/vault-encryption.js +263 -0
- package/src/auth/session/vault-encryption.js.map +1 -0
- package/src/auth/ui/base-layout.d.ts +188 -0
- package/src/auth/ui/base-layout.js +292 -0
- package/src/auth/ui/base-layout.js.map +1 -0
- package/src/auth/ui/htmx-templates.d.ts +135 -0
- package/src/auth/ui/htmx-templates.js +433 -0
- package/src/auth/ui/htmx-templates.js.map +1 -0
- package/src/auth/ui/index.d.ts +11 -0
- package/src/auth/ui/index.js +35 -0
- package/src/auth/ui/index.js.map +1 -0
- package/src/auth/utils/audience.validator.d.ts +129 -0
- package/src/auth/utils/audience.validator.js +196 -0
- package/src/auth/utils/audience.validator.js.map +1 -0
- package/src/auth/utils/index.d.ts +2 -0
- package/src/auth/utils/index.js +7 -0
- package/src/auth/utils/index.js.map +1 -0
- package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
- package/src/auth/utils/www-authenticate.utils.js +183 -0
- package/src/auth/utils/www-authenticate.utils.js.map +1 -0
- package/src/common/common.schema.d.ts +2 -16
- package/src/common/constants.d.ts +3 -0
- package/src/common/constants.js +6 -1
- package/src/common/constants.js.map +1 -1
- package/src/common/decorators/decorator-utils.d.ts +131 -0
- package/src/common/decorators/decorator-utils.js +195 -0
- package/src/common/decorators/decorator-utils.js.map +1 -0
- package/src/common/decorators/front-mcp.decorator.js +3 -2
- package/src/common/decorators/front-mcp.decorator.js.map +1 -1
- package/src/common/decorators/hook.decorator.d.ts +58 -2
- package/src/common/decorators/hook.decorator.js +127 -17
- package/src/common/decorators/hook.decorator.js.map +1 -1
- package/src/common/decorators/plugin.decorator.d.ts +1 -1
- package/src/common/decorators/plugin.decorator.js +11 -10
- package/src/common/decorators/plugin.decorator.js.map +1 -1
- package/src/common/decorators/resource.decorator.d.ts +32 -3
- package/src/common/decorators/resource.decorator.js +46 -4
- package/src/common/decorators/resource.decorator.js.map +1 -1
- package/src/common/decorators/tool.decorator.d.ts +54 -5
- package/src/common/decorators/tool.decorator.js.map +1 -1
- package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
- package/src/common/dynamic/dynamic.plugin.js +7 -1
- package/src/common/dynamic/dynamic.plugin.js.map +1 -1
- package/src/common/entries/prompt.entry.d.ts +46 -2
- package/src/common/entries/prompt.entry.js +10 -0
- package/src/common/entries/prompt.entry.js.map +1 -1
- package/src/common/entries/resource.entry.d.ts +69 -6
- package/src/common/entries/resource.entry.js +27 -3
- package/src/common/entries/resource.entry.js.map +1 -1
- package/src/common/entries/scope.entry.d.ts +5 -1
- package/src/common/entries/scope.entry.js +3 -3
- package/src/common/entries/scope.entry.js.map +1 -1
- package/src/common/flow/flow.utils.d.ts +56 -0
- package/src/common/flow/flow.utils.js +96 -0
- package/src/common/flow/flow.utils.js.map +1 -0
- package/src/common/index.d.ts +2 -2
- package/src/common/index.js +2 -2
- package/src/common/index.js.map +1 -1
- package/src/common/interfaces/execution-context.interface.d.ts +59 -0
- package/src/common/interfaces/execution-context.interface.js +81 -0
- package/src/common/interfaces/execution-context.interface.js.map +1 -0
- package/src/common/interfaces/flow.interface.d.ts +1 -1
- package/src/common/interfaces/flow.interface.js.map +1 -1
- package/src/common/interfaces/index.d.ts +1 -0
- package/src/common/interfaces/index.js +1 -0
- package/src/common/interfaces/index.js.map +1 -1
- package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
- package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
- package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
- package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
- package/src/common/interfaces/internal/registry.interface.js.map +1 -1
- package/src/common/interfaces/plugin.interface.js.map +1 -1
- package/src/common/interfaces/prompt.interface.d.ts +53 -4
- package/src/common/interfaces/prompt.interface.js +78 -0
- package/src/common/interfaces/prompt.interface.js.map +1 -1
- package/src/common/interfaces/resource.interface.d.ts +47 -17
- package/src/common/interfaces/resource.interface.js +53 -0
- package/src/common/interfaces/resource.interface.js.map +1 -1
- package/src/common/interfaces/tool.interface.d.ts +39 -22
- package/src/common/interfaces/tool.interface.js +61 -34
- package/src/common/interfaces/tool.interface.js.map +1 -1
- package/src/common/metadata/adapter.metadata.d.ts +1 -9
- package/src/common/metadata/app.metadata.d.ts +425 -730
- package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
- package/src/common/metadata/flow.metadata.d.ts +10 -25
- package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
- package/src/common/metadata/front-mcp.metadata.js +6 -4
- package/src/common/metadata/front-mcp.metadata.js.map +1 -1
- package/src/common/metadata/hook.metadata.d.ts +1 -1
- package/src/common/metadata/hook.metadata.js.map +1 -1
- package/src/common/metadata/index.d.ts +1 -0
- package/src/common/metadata/index.js +1 -0
- package/src/common/metadata/index.js.map +1 -1
- package/src/common/metadata/logger.metadata.d.ts +1 -9
- package/src/common/metadata/plugin.metadata.d.ts +8 -30
- package/src/common/metadata/prompt.metadata.d.ts +4 -161
- package/src/common/metadata/provider.metadata.d.ts +2 -12
- package/src/common/metadata/resource.metadata.d.ts +6 -98
- package/src/common/metadata/resource.metadata.js +15 -6
- package/src/common/metadata/resource.metadata.js.map +1 -1
- package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
- package/src/common/metadata/tool-ui.metadata.js +12 -0
- package/src/common/metadata/tool-ui.metadata.js.map +1 -0
- package/src/common/metadata/tool.metadata.d.ts +78 -199
- package/src/common/metadata/tool.metadata.js +11 -14
- package/src/common/metadata/tool.metadata.js.map +1 -1
- package/src/common/providers/base-config.provider.d.ts +84 -0
- package/src/common/providers/base-config.provider.js +128 -0
- package/src/common/providers/base-config.provider.js.map +1 -0
- package/src/common/records/plugin.record.d.ts +5 -6
- package/src/common/records/plugin.record.js.map +1 -1
- package/src/common/records/prompt.record.js.map +1 -1
- package/src/common/records/resource.record.d.ts +17 -1
- package/src/common/records/resource.record.js +12 -6
- package/src/common/records/resource.record.js.map +1 -1
- package/src/common/records/tool.record.js.map +1 -1
- package/src/common/schemas/annotated-class.schema.d.ts +9 -9
- package/src/common/schemas/annotated-class.schema.js +92 -27
- package/src/common/schemas/annotated-class.schema.js.map +1 -1
- package/src/common/schemas/http-input.schema.d.ts +6 -30
- package/src/common/schemas/http-output.schema.d.ts +326 -1630
- package/src/common/schemas/http-output.schema.js +39 -1
- package/src/common/schemas/http-output.schema.js.map +1 -1
- package/src/common/tokens/front-mcp.tokens.js +4 -1
- package/src/common/tokens/front-mcp.tokens.js.map +1 -1
- package/src/common/tokens/resource.tokens.d.ts +2 -0
- package/src/common/tokens/resource.tokens.js +4 -1
- package/src/common/tokens/resource.tokens.js.map +1 -1
- package/src/common/tokens/tool.tokens.d.ts +2 -0
- package/src/common/tokens/tool.tokens.js +2 -0
- package/src/common/tokens/tool.tokens.js.map +1 -1
- package/src/common/types/auth/jwt.types.d.ts +5 -31
- package/src/common/types/auth/session.types.d.ts +97 -192
- package/src/common/types/auth/session.types.js +24 -11
- package/src/common/types/auth/session.types.js.map +1 -1
- package/src/common/types/options/auth.options.d.ts +1013 -490
- package/src/common/types/options/auth.options.js +554 -36
- package/src/common/types/options/auth.options.js.map +1 -1
- package/src/common/types/options/http.options.d.ts +1 -9
- package/src/common/types/options/logging.options.d.ts +7 -13
- package/src/common/types/options/logging.options.js +4 -0
- package/src/common/types/options/logging.options.js.map +1 -1
- package/src/common/types/options/server-info.options.d.ts +3 -31
- package/src/common/types/options/session.options.d.ts +90 -10
- package/src/common/types/options/session.options.js +26 -3
- package/src/common/types/options/session.options.js.map +1 -1
- package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
- package/src/common/utils/decide-request-intent.utils.js +88 -23
- package/src/common/utils/decide-request-intent.utils.js.map +1 -1
- package/src/completion/flows/complete.flow.d.ts +74 -0
- package/src/completion/flows/complete.flow.js +199 -0
- package/src/completion/flows/complete.flow.js.map +1 -0
- package/src/errors/authorization-required.error.d.ts +189 -0
- package/src/errors/authorization-required.error.js +274 -0
- package/src/errors/authorization-required.error.js.map +1 -0
- package/src/errors/index.d.ts +2 -1
- package/src/errors/index.js +17 -1
- package/src/errors/index.js.map +1 -1
- package/src/errors/mcp.error.d.ts +101 -1
- package/src/errors/mcp.error.js +147 -2
- package/src/errors/mcp.error.js.map +1 -1
- package/src/flows/flow.instance.js +4 -3
- package/src/flows/flow.instance.js.map +1 -1
- package/src/flows/flow.registry.js.map +1 -1
- package/src/flows/flow.stages.js +14 -11
- package/src/flows/flow.stages.js.map +1 -1
- package/src/front-mcp/front-mcp.providers.d.ts +464 -102
- package/src/front-mcp/front-mcp.providers.js +3 -5
- package/src/front-mcp/front-mcp.providers.js.map +1 -1
- package/src/hooks/hook.instance.d.ts +1 -1
- package/src/hooks/hook.instance.js +5 -2
- package/src/hooks/hook.instance.js.map +1 -1
- package/src/hooks/hook.registry.js +7 -5
- package/src/hooks/hook.registry.js.map +1 -1
- package/src/index.d.ts +28 -9
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/logger/instances/instance.logger.js +3 -2
- package/src/logger/instances/instance.logger.js.map +1 -1
- package/src/logger/logger.registry.js +7 -2
- package/src/logger/logger.registry.js.map +1 -1
- package/src/logging/flows/set-level.flow.d.ts +62 -0
- package/src/logging/flows/set-level.flow.js +108 -0
- package/src/logging/flows/set-level.flow.js.map +1 -0
- package/src/mcp-apps/csp.d.ts +111 -0
- package/src/mcp-apps/csp.js +267 -0
- package/src/mcp-apps/csp.js.map +1 -0
- package/src/mcp-apps/index.d.ts +23 -0
- package/src/mcp-apps/index.js +91 -0
- package/src/mcp-apps/index.js.map +1 -0
- package/src/mcp-apps/schemas.d.ts +403 -0
- package/src/mcp-apps/schemas.js +345 -0
- package/src/mcp-apps/schemas.js.map +1 -0
- package/src/mcp-apps/template.d.ts +94 -0
- package/src/mcp-apps/template.js +419 -0
- package/src/mcp-apps/template.js.map +1 -0
- package/src/mcp-apps/types.d.ts +323 -0
- package/src/mcp-apps/types.js +59 -0
- package/src/mcp-apps/types.js.map +1 -0
- package/src/notification/index.d.ts +1 -0
- package/src/notification/index.js +13 -0
- package/src/notification/index.js.map +1 -0
- package/src/notification/notification.service.d.ts +378 -0
- package/src/notification/notification.service.js +727 -0
- package/src/notification/notification.service.js.map +1 -0
- package/src/plugin/plugin.registry.js +12 -9
- package/src/plugin/plugin.registry.js.map +1 -1
- package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
- package/src/prompt/flows/get-prompt.flow.js +214 -0
- package/src/prompt/flows/get-prompt.flow.js.map +1 -0
- package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
- package/src/prompt/flows/prompts-list.flow.js +176 -0
- package/src/prompt/flows/prompts-list.flow.js.map +1 -0
- package/src/prompt/index.d.ts +7 -0
- package/src/prompt/index.js +17 -0
- package/src/prompt/index.js.map +1 -0
- package/src/prompt/prompt.events.d.ts +17 -0
- package/src/prompt/prompt.events.js +25 -0
- package/src/prompt/prompt.events.js.map +1 -0
- package/src/prompt/prompt.instance.d.ts +30 -0
- package/src/prompt/prompt.instance.js +120 -0
- package/src/prompt/prompt.instance.js.map +1 -0
- package/src/prompt/prompt.registry.d.ts +79 -12
- package/src/prompt/prompt.registry.js +360 -15
- package/src/prompt/prompt.registry.js.map +1 -1
- package/src/prompt/prompt.types.d.ts +26 -0
- package/src/prompt/prompt.types.js +11 -0
- package/src/prompt/prompt.types.js.map +1 -0
- package/src/prompt/prompt.utils.d.ts +26 -0
- package/src/prompt/prompt.utils.js +136 -0
- package/src/prompt/prompt.utils.js.map +1 -0
- package/src/provider/provider.registry.d.ts +12 -5
- package/src/provider/provider.registry.js +30 -138
- package/src/provider/provider.registry.js.map +1 -1
- package/src/regsitry/registry.base.d.ts +1 -1
- package/src/regsitry/registry.base.js.map +1 -1
- package/src/resource/flows/read-resource.flow.d.ts +91 -0
- package/src/resource/flows/read-resource.flow.js +270 -0
- package/src/resource/flows/read-resource.flow.js.map +1 -0
- package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
- package/src/resource/flows/resource-templates-list.flow.js +191 -0
- package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
- package/src/resource/flows/resources-list.flow.d.ts +64 -0
- package/src/resource/flows/resources-list.flow.js +196 -0
- package/src/resource/flows/resources-list.flow.js.map +1 -0
- package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
- package/src/resource/flows/subscribe-resource.flow.js +123 -0
- package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
- package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
- package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
- package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
- package/src/resource/index.d.ts +8 -0
- package/src/resource/index.js +20 -0
- package/src/resource/index.js.map +1 -0
- package/src/resource/resource.events.d.ts +24 -0
- package/src/resource/resource.events.js +17 -0
- package/src/resource/resource.events.js.map +1 -0
- package/src/resource/resource.instance.d.ts +35 -0
- package/src/resource/resource.instance.js +163 -0
- package/src/resource/resource.instance.js.map +1 -0
- package/src/resource/resource.registry.d.ts +106 -12
- package/src/resource/resource.registry.js +449 -13
- package/src/resource/resource.registry.js.map +1 -1
- package/src/resource/resource.types.d.ts +35 -0
- package/src/resource/resource.types.js +11 -0
- package/src/resource/resource.types.js.map +1 -0
- package/src/resource/resource.utils.d.ts +30 -0
- package/src/resource/resource.utils.js +151 -0
- package/src/resource/resource.utils.js.map +1 -0
- package/src/scope/flows/http.request.flow.d.ts +48 -330
- package/src/scope/flows/http.request.flow.js +306 -78
- package/src/scope/flows/http.request.flow.js.map +1 -1
- package/src/scope/scope.instance.d.ts +12 -0
- package/src/scope/scope.instance.js +145 -15
- package/src/scope/scope.instance.js.map +1 -1
- package/src/tool/flows/call-tool.flow.d.ts +64 -1110
- package/src/tool/flows/call-tool.flow.js +303 -15
- package/src/tool/flows/call-tool.flow.js.map +1 -1
- package/src/tool/flows/tools-list.flow.d.ts +32 -473
- package/src/tool/flows/tools-list.flow.js +111 -10
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.events.d.ts +8 -1
- package/src/tool/tool.events.js.map +1 -1
- package/src/tool/tool.instance.d.ts +3 -1
- package/src/tool/tool.instance.js +17 -3
- package/src/tool/tool.instance.js.map +1 -1
- package/src/tool/tool.registry.d.ts +7 -1
- package/src/tool/tool.registry.js +26 -10
- package/src/tool/tool.registry.js.map +1 -1
- package/src/tool/tool.types.d.ts +4 -4
- package/src/tool/tool.types.js.map +1 -1
- package/src/tool/tool.utils.d.ts +3 -12
- package/src/tool/tool.utils.js +39 -193
- package/src/tool/tool.utils.js.map +1 -1
- package/src/tool/ui/index.d.ts +22 -0
- package/src/tool/ui/index.js +63 -0
- package/src/tool/ui/index.js.map +1 -0
- package/src/tool/ui/platform-adapters.d.ts +10 -0
- package/src/tool/ui/platform-adapters.js +18 -0
- package/src/tool/ui/platform-adapters.js.map +1 -0
- package/src/tool/ui/template-helpers.d.ts +46 -0
- package/src/tool/ui/template-helpers.js +112 -0
- package/src/tool/ui/template-helpers.js.map +1 -0
- package/src/tool/ui/ui-resource-template.d.ts +34 -0
- package/src/tool/ui/ui-resource-template.js +64 -0
- package/src/tool/ui/ui-resource-template.js.map +1 -0
- package/src/tool/ui/ui-resource.handler.d.ts +74 -0
- package/src/tool/ui/ui-resource.handler.js +129 -0
- package/src/tool/ui/ui-resource.handler.js.map +1 -0
- package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.local.adapter.js +28 -7
- package/src/transport/adapters/transport.local.adapter.js.map +1 -1
- package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.sse.adapter.js +4 -3
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
- package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
- package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.d.ts +29 -63
- package/src/transport/flows/handle.sse.flow.js +78 -10
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
- package/src/transport/flows/handle.stateless-http.flow.js +102 -0
- package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
- package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
- package/src/transport/flows/handle.streamable-http.flow.js +158 -26
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
- package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
- package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
- package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
- package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/index.d.ts +517 -208
- package/src/transport/mcp-handlers/index.js +39 -2
- package/src/transport/mcp-handlers/index.js.map +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
- package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
- package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
- package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
- package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
- package/src/transport/transport.local.js +7 -2
- package/src/transport/transport.local.js.map +1 -1
- package/src/transport/transport.registry.d.ts +30 -0
- package/src/transport/transport.registry.js +84 -1
- package/src/transport/transport.registry.js.map +1 -1
- package/src/transport/transport.types.d.ts +3 -3
- package/src/transport/transport.types.js.map +1 -1
- package/src/utils/content.utils.d.ts +48 -0
- package/src/utils/content.utils.js +194 -0
- package/src/utils/content.utils.js.map +1 -0
- package/src/utils/index.d.ts +8 -0
- package/src/utils/index.js +55 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/lineage.utils.d.ts +40 -0
- package/src/utils/lineage.utils.js +82 -0
- package/src/utils/lineage.utils.js.map +1 -0
- package/src/utils/naming.utils.d.ts +46 -0
- package/src/utils/naming.utils.js +136 -0
- package/src/utils/naming.utils.js.map +1 -0
- package/src/utils/types.utils.d.ts +2 -2
- package/src/utils/types.utils.js.map +1 -1
- package/src/utils/uri-template.utils.d.ts +57 -0
- package/src/utils/uri-template.utils.js +113 -0
- package/src/utils/uri-template.utils.js.map +1 -0
- package/src/utils/uri-validation.utils.d.ts +40 -0
- package/src/utils/uri-validation.utils.js +76 -0
- package/src/utils/uri-validation.utils.js.map +1 -0
- package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
- package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/index.d.ts +0 -7
- package/src/__test-utils__/fixtures/index.js +0 -11
- package/src/__test-utils__/fixtures/index.js.map +0 -1
- package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
- package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
- package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
- package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
- package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
- package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
- package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
- package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
- package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
- package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
- package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
- package/src/__test-utils__/helpers/async.helpers.js +0 -112
- package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/index.d.ts +0 -6
- package/src/__test-utils__/helpers/index.js +0 -10
- package/src/__test-utils__/helpers/index.js.map +0 -1
- package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
- package/src/__test-utils__/helpers/setup.helpers.js +0 -106
- package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
- package/src/__test-utils__/index.d.ts +0 -9
- package/src/__test-utils__/index.js +0 -14
- package/src/__test-utils__/index.js.map +0 -1
- package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
- package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
- package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
- package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
- package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
- package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/index.d.ts +0 -8
- package/src/__test-utils__/mocks/index.js +0 -12
- package/src/__test-utils__/mocks/index.js.map +0 -1
- package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
- package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
- package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
- package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
- package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
- package/src/auth/path.utils.d.ts +0 -20
- package/src/auth/path.utils.js +0 -71
- package/src/auth/path.utils.js.map +0 -1
- package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
- package/src/common/decorators-old/async-with.decorator.js +0 -24
- package/src/common/decorators-old/async-with.decorator.js.map +0 -1
- package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/auth-hook.decorator.js +0 -27
- package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
- package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/session-hook.decorator.js +0 -27
- 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
|
+
};
|