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