@frontmcp/sdk 0.2.3 → 0.3.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 +81 -99
- package/package.json +24 -2
- package/src/adapter/adapter.instance.d.ts +11 -0
- package/src/adapter/adapter.instance.js +65 -0
- package/src/adapter/adapter.instance.js.map +1 -0
- package/src/adapter/adapter.regsitry.d.ts +13 -0
- package/src/adapter/adapter.regsitry.js +54 -0
- package/src/adapter/adapter.regsitry.js.map +1 -0
- package/src/adapter/adapter.utils.d.ts +10 -0
- package/src/adapter/adapter.utils.js +83 -0
- package/src/adapter/adapter.utils.js.map +1 -0
- package/src/app/app.registry.d.ts +12 -0
- package/src/app/app.registry.js +64 -0
- package/src/app/app.registry.js.map +1 -0
- package/src/app/app.utils.d.ts +15 -0
- package/src/app/app.utils.js +58 -0
- package/src/app/app.utils.js.map +1 -0
- package/src/app/instances/app.local.instance.d.ts +25 -0
- package/src/app/instances/app.local.instance.js +70 -0
- package/src/app/instances/app.local.instance.js.map +1 -0
- package/src/app/instances/app.remote.instance.d.ts +13 -0
- package/src/app/instances/app.remote.instance.js +36 -0
- package/src/app/instances/app.remote.instance.js.map +1 -0
- package/src/app/instances/index.d.ts +2 -0
- package/src/app/instances/index.js +6 -0
- package/src/app/instances/index.js.map +1 -0
- package/src/auth/auth.registry.d.ts +13 -0
- package/src/auth/auth.registry.js +81 -0
- package/src/auth/auth.registry.js.map +1 -0
- package/src/auth/auth.utils.d.ts +10 -0
- package/src/auth/auth.utils.js +85 -0
- package/src/auth/auth.utils.js.map +1 -0
- package/src/auth/flows/oauth.authorize.flow.d.ts +231 -0
- package/src/auth/flows/oauth.authorize.flow.js +154 -0
- package/src/auth/flows/oauth.authorize.flow.js.map +1 -0
- package/src/auth/flows/oauth.register.flow.d.ts +202 -0
- package/src/auth/flows/oauth.register.flow.js +201 -0
- package/src/auth/flows/oauth.register.flow.js.map +1 -0
- package/src/auth/flows/oauth.token.flow.d.ts +242 -0
- package/src/auth/flows/oauth.token.flow.js +181 -0
- package/src/auth/flows/oauth.token.flow.js.map +1 -0
- package/src/auth/flows/session.verify.flow.d.ts +404 -0
- package/src/auth/flows/session.verify.flow.js +205 -0
- package/src/auth/flows/session.verify.flow.js.map +1 -0
- package/src/auth/flows/well-known.jwks.flow.d.ts +261 -0
- package/src/auth/flows/well-known.jwks.flow.js +82 -0
- package/src/auth/flows/well-known.jwks.flow.js.map +1 -0
- package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +282 -0
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js +123 -0
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -0
- package/src/auth/flows/well-known.prm.flow.d.ts +159 -0
- package/src/auth/flows/well-known.prm.flow.js +107 -0
- package/src/auth/flows/well-known.prm.flow.js.map +1 -0
- package/src/auth/instances/instance.local-primary-auth.d.ts +19 -0
- package/src/auth/instances/instance.local-primary-auth.js +76 -0
- package/src/auth/instances/instance.local-primary-auth.js.map +1 -0
- package/src/auth/instances/instance.remote-primary-auth.d.ts +14 -0
- package/src/auth/instances/instance.remote-primary-auth.js +47 -0
- package/src/auth/instances/instance.remote-primary-auth.js.map +1 -0
- package/src/auth/jwks/index.d.ts +2 -0
- package/src/auth/jwks/index.js +6 -0
- package/src/auth/jwks/index.js.map +1 -0
- package/src/auth/jwks/jwks.service.d.ts +41 -0
- package/src/auth/jwks/jwks.service.js +235 -0
- package/src/auth/jwks/jwks.service.js.map +1 -0
- package/src/auth/jwks/jwks.types.d.ts +25 -0
- package/src/auth/jwks/jwks.types.js +3 -0
- package/src/auth/jwks/jwks.types.js.map +1 -0
- package/src/auth/jwks/jwks.utils.d.ts +4 -0
- package/src/auth/jwks/jwks.utils.js +32 -0
- package/src/auth/jwks/jwks.utils.js.map +1 -0
- package/src/auth/oauth/flows/oauth.authorize.flow.d.ts +31 -0
- package/src/auth/oauth/flows/oauth.authorize.flow.js +33 -0
- package/src/auth/oauth/flows/oauth.authorize.flow.js.map +1 -0
- package/src/auth/oauth/flows/oauth.device-authorization.flow.d.ts +46 -0
- package/src/auth/oauth/flows/oauth.device-authorization.flow.js +48 -0
- package/src/auth/oauth/flows/oauth.device-authorization.flow.js.map +1 -0
- package/src/auth/oauth/flows/oauth.introspect.flow.d.ts +26 -0
- package/src/auth/oauth/flows/oauth.introspect.flow.js +28 -0
- package/src/auth/oauth/flows/oauth.introspect.flow.js.map +1 -0
- package/src/auth/oauth/flows/oauth.par.flow.d.ts +27 -0
- package/src/auth/oauth/flows/oauth.par.flow.js +29 -0
- package/src/auth/oauth/flows/oauth.par.flow.js.map +1 -0
- package/src/auth/oauth/flows/oauth.revoke.flow.d.ts +25 -0
- package/src/auth/oauth/flows/oauth.revoke.flow.js +27 -0
- package/src/auth/oauth/flows/oauth.revoke.flow.js.map +1 -0
- package/src/auth/oauth/flows/oauth.token.flow.d.ts +57 -0
- package/src/auth/oauth/flows/oauth.token.flow.js +59 -0
- package/src/auth/oauth/flows/oauth.token.flow.js.map +1 -0
- package/src/auth/oauth/flows/oauth.userinfo.flow.d.ts +22 -0
- package/src/auth/oauth/flows/oauth.userinfo.flow.js +24 -0
- package/src/auth/oauth/flows/oauth.userinfo.flow.js.map +1 -0
- package/src/auth/oauth/flows/oidc.logout.flow.d.ts +18 -0
- package/src/auth/oauth/flows/oidc.logout.flow.js +20 -0
- package/src/auth/oauth/flows/oidc.logout.flow.js.map +1 -0
- package/src/auth/path.utils.d.ts +20 -0
- package/src/auth/path.utils.js +71 -0
- package/src/auth/path.utils.js.map +1 -0
- package/src/auth/session/index.d.ts +4 -0
- package/src/auth/session/index.js +10 -0
- package/src/auth/session/index.js.map +1 -0
- package/src/auth/session/record/session.base.d.ts +103 -0
- package/src/auth/session/record/session.base.js +123 -0
- package/src/auth/session/record/session.base.js.map +1 -0
- package/src/auth/session/record/session.stateful.d.ts +20 -0
- package/src/auth/session/record/session.stateful.js +55 -0
- package/src/auth/session/record/session.stateful.js.map +1 -0
- package/src/auth/session/record/session.stateless.d.ts +17 -0
- package/src/auth/session/record/session.stateless.js +30 -0
- package/src/auth/session/record/session.stateless.js.map +1 -0
- package/src/auth/session/record/session.transparent.d.ts +17 -0
- package/src/auth/session/record/session.transparent.js +22 -0
- package/src/auth/session/record/session.transparent.js.map +1 -0
- package/src/auth/session/session.crypto.d.ts +7 -0
- package/src/auth/session/session.crypto.js +47 -0
- package/src/auth/session/session.crypto.js.map +1 -0
- package/src/auth/session/session.schema.d.ts +5 -0
- package/src/auth/session/session.schema.js +13 -0
- package/src/auth/session/session.schema.js.map +1 -0
- package/src/auth/session/session.service.d.ts +17 -0
- package/src/auth/session/session.service.js +111 -0
- package/src/auth/session/session.service.js.map +1 -0
- package/src/auth/session/session.transport.d.ts +4 -0
- package/src/auth/session/session.transport.js +20 -0
- package/src/auth/session/session.transport.js.map +1 -0
- package/src/auth/session/session.types.d.ts +65 -0
- package/src/auth/session/session.types.js +4 -0
- package/src/auth/session/session.types.js.map +1 -0
- package/src/auth/session/token.refresh.d.ts +60 -0
- package/src/auth/session/token.refresh.js +63 -0
- package/src/auth/session/token.refresh.js.map +1 -0
- package/src/auth/session/token.store.d.ts +35 -0
- package/src/auth/session/token.store.js +53 -0
- package/src/auth/session/token.store.js.map +1 -0
- package/src/auth/session/token.vault.d.ts +26 -0
- package/src/auth/session/token.vault.js +54 -0
- package/src/auth/session/token.vault.js.map +1 -0
- package/src/auth/session/utils/auth-token.utils.d.ts +11 -0
- package/src/auth/session/utils/auth-token.utils.js +57 -0
- package/src/auth/session/utils/auth-token.utils.js.map +1 -0
- package/src/auth/session/utils/session-id.utils.d.ts +17 -0
- package/src/auth/session/utils/session-id.utils.js +129 -0
- package/src/auth/session/utils/session-id.utils.js.map +1 -0
- package/src/auth/session/utils/tiny-ttl-cache.d.ts +7 -0
- package/src/auth/session/utils/tiny-ttl-cache.js +26 -0
- package/src/auth/session/utils/tiny-ttl-cache.js.map +1 -0
- package/src/common/common.schema.d.ts +29 -0
- package/src/common/common.schema.js +35 -0
- package/src/common/common.schema.js.map +1 -0
- package/src/common/constants.d.ts +2 -0
- package/src/common/constants.js +8 -0
- package/src/common/constants.js.map +1 -0
- package/src/common/decorators/adapter.decorator.js.map +1 -0
- package/src/common/decorators/app.decorator.js.map +1 -0
- package/src/common/decorators/auth-provider.decorator.js.map +1 -0
- package/src/common/decorators/flow.decorator.js.map +1 -0
- package/src/common/decorators/front-mcp.decorator.js +40 -0
- package/src/common/decorators/front-mcp.decorator.js.map +1 -0
- package/src/common/decorators/hook.decorator.js.map +1 -0
- package/src/common/decorators/index.js.map +1 -0
- package/src/common/decorators/logger.decorator.js.map +1 -0
- package/src/common/decorators/plugin.decorator.js.map +1 -0
- package/src/common/decorators/prompt.decorator.js.map +1 -0
- package/src/common/decorators/provider.decorator.js.map +1 -0
- package/src/common/decorators/resource.decorator.js.map +1 -0
- package/src/common/decorators/tool.decorator.d.ts +42 -0
- package/src/common/decorators/tool.decorator.js +46 -0
- package/src/common/decorators/tool.decorator.js.map +1 -0
- package/src/common/decorators-old/async-with.decorator.d.ts +10 -0
- package/src/common/decorators-old/async-with.decorator.js +24 -0
- package/src/common/decorators-old/async-with.decorator.js.map +1 -0
- package/src/common/decorators-old/auth-hook.decorator.js.map +1 -0
- package/src/common/decorators-old/session-hook.decorator.js.map +1 -0
- package/src/common/dynamic/dynamic.adapter.js.map +1 -0
- package/src/common/dynamic/dynamic.plugin.js.map +1 -0
- package/src/common/dynamic/dynamic.utils.d.ts +3 -0
- package/src/common/dynamic/dynamic.utils.js.map +1 -0
- package/src/common/dynamic/index.js.map +1 -0
- package/src/common/entries/adapter.entry.js.map +1 -0
- package/src/common/entries/app.entry.d.ts +13 -0
- package/src/common/entries/app.entry.js.map +1 -0
- package/src/common/entries/auth-provider.entry.js.map +1 -0
- package/src/common/entries/base.entry.js.map +1 -0
- package/src/common/entries/flow.entry.js.map +1 -0
- package/src/common/entries/hook.entry.js.map +1 -0
- package/src/common/entries/index.js.map +1 -0
- package/src/common/entries/logger.entry.js.map +1 -0
- package/src/common/entries/plugin.entry.js.map +1 -0
- package/src/common/entries/prompt.entry.js.map +1 -0
- package/src/common/entries/provider.entry.js.map +1 -0
- package/src/common/entries/resource.entry.js.map +1 -0
- package/src/common/entries/scope.entry.js.map +1 -0
- package/src/common/entries/tool.entry.js.map +1 -0
- package/src/common/index.d.ts +17 -0
- package/src/common/index.js +21 -0
- package/src/common/index.js.map +1 -0
- package/src/common/interfaces/adapter.interface.js.map +1 -0
- package/src/common/interfaces/app.interface.js.map +1 -0
- package/src/common/interfaces/auth-hook.interface.js.map +1 -0
- package/src/common/interfaces/auth-provider.interface.js.map +1 -0
- package/src/common/interfaces/base.interface.js.map +1 -0
- package/src/common/interfaces/flow.interface.d.ts +41 -0
- package/src/common/interfaces/flow.interface.js.map +1 -0
- package/src/common/interfaces/front-mcp.interface.js.map +1 -0
- package/src/common/interfaces/hook.interface.js.map +1 -0
- package/src/common/interfaces/index.js.map +1 -0
- package/src/common/interfaces/internal/flow.utils.d.ts +23 -0
- package/src/common/interfaces/internal/flow.utils.js.map +1 -0
- package/src/common/interfaces/internal/index.js.map +1 -0
- package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +24 -0
- package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -0
- package/src/common/interfaces/internal/registry.interface.d.ts +95 -0
- package/src/common/interfaces/internal/registry.interface.js.map +1 -0
- package/src/common/interfaces/logger.interface.js.map +1 -0
- package/src/common/interfaces/plugin.interface.js.map +1 -0
- package/src/common/interfaces/prompt.interface.js.map +1 -0
- package/src/common/interfaces/provider.interface.js.map +1 -0
- package/src/common/interfaces/resource.interface.js.map +1 -0
- package/src/common/interfaces/scope.interface.js.map +1 -0
- package/src/common/interfaces/server.interface.js.map +1 -0
- package/src/common/interfaces/session-hook.interface.js.map +1 -0
- package/src/common/interfaces/tool-hook.interface.js.map +1 -0
- package/src/common/interfaces/tool.interface.js.map +1 -0
- package/src/common/metadata/adapter.metadata.js.map +1 -0
- package/src/common/metadata/app.metadata.d.ts +872 -0
- package/src/common/metadata/app.metadata.js.map +1 -0
- package/src/common/metadata/auth-provider.metadata.js.map +1 -0
- package/src/common/metadata/flow.metadata.d.ts +77 -0
- package/src/common/metadata/flow.metadata.js.map +1 -0
- package/src/common/metadata/front-mcp.metadata.d.ts +1144 -0
- package/src/common/metadata/front-mcp.metadata.js.map +1 -0
- package/src/common/metadata/hook.metadata.js.map +1 -0
- package/src/common/metadata/index.js.map +1 -0
- package/src/common/metadata/logger.metadata.js.map +1 -0
- package/src/common/metadata/plugin.metadata.js.map +1 -0
- package/src/common/metadata/prompt.metadata.js.map +1 -0
- package/src/common/metadata/provider.metadata.js.map +1 -0
- package/src/common/metadata/resource.metadata.js.map +1 -0
- package/src/common/metadata/tool.metadata.d.ts +178 -0
- package/src/common/metadata/tool.metadata.js.map +1 -0
- package/src/common/providers/session.provider.js.map +1 -0
- package/src/common/records/adapter.record.js.map +1 -0
- package/src/common/records/app.record.js.map +1 -0
- package/src/common/records/auth-provider.record.js.map +1 -0
- package/src/common/records/flow.record.js.map +1 -0
- package/src/common/records/hook.record.js.map +1 -0
- package/src/common/records/index.js.map +1 -0
- package/src/common/records/logger.record.d.ts +11 -0
- package/src/common/records/logger.record.js.map +1 -0
- package/src/common/records/plugin.record.js.map +1 -0
- package/src/common/records/prompt.record.js.map +1 -0
- package/src/common/records/provider.record.js.map +1 -0
- package/src/common/records/resource.record.js.map +1 -0
- package/src/common/records/scope.record.js.map +1 -0
- package/src/common/records/tool.record.js.map +1 -0
- package/src/common/schemas/annotated-class.schema.js.map +1 -0
- package/src/common/schemas/http-input.schema.js.map +1 -0
- package/src/common/schemas/http-output.schema.d.ts +2011 -0
- package/src/common/schemas/http-output.schema.js.map +1 -0
- package/src/common/schemas/index.js.map +1 -0
- package/src/common/tokens/adapter.tokens.js.map +1 -0
- package/src/common/tokens/app.tokens.js.map +1 -0
- package/src/common/tokens/auth-provider.tokens.js.map +1 -0
- package/src/common/tokens/base.tokens.js.map +1 -0
- package/src/common/tokens/flow-hook.tokens.js.map +1 -0
- package/src/common/tokens/flow.tokens.js.map +1 -0
- package/src/common/tokens/front-mcp.tokens.js.map +1 -0
- package/src/common/tokens/index.js.map +1 -0
- package/src/common/tokens/logger.tokens.js.map +1 -0
- package/src/common/tokens/plugin.tokens.js.map +1 -0
- package/src/common/tokens/prompt.tokens.js.map +1 -0
- package/src/common/tokens/provider.tokens.js.map +1 -0
- package/src/common/tokens/resource.tokens.js.map +1 -0
- package/src/common/tokens/server.tokens.js.map +1 -0
- package/src/common/tokens/tool.tokens.js.map +1 -0
- package/src/common/types/auth/index.js.map +1 -0
- package/src/common/types/auth/jwt.types.js.map +1 -0
- package/src/common/types/auth/session.types.d.ts +263 -0
- package/src/common/types/auth/session.types.js.map +1 -0
- package/src/common/types/common.types.js.map +1 -0
- package/src/common/types/index.js.map +1 -0
- package/src/common/types/options/auth.options.d.ts +513 -0
- package/src/common/types/options/auth.options.js.map +1 -0
- package/src/common/types/options/http.options.js.map +1 -0
- package/src/common/types/options/index.js.map +1 -0
- package/src/common/types/options/logging.options.d.ts +39 -0
- package/src/common/types/options/logging.options.js.map +1 -0
- package/src/common/types/options/server-info.options.d.ts +48 -0
- package/src/common/types/options/server-info.options.js.map +1 -0
- package/src/common/types/options/session.options.d.ts +67 -0
- package/src/common/types/options/session.options.js.map +1 -0
- package/src/common/utils/decide-request-intent.utils.d.ts +79 -0
- package/src/common/utils/decide-request-intent.utils.js.map +1 -0
- package/src/common/utils/index.js.map +1 -0
- package/src/common/utils/path.utils.d.ts +20 -0
- package/src/common/utils/path.utils.js.map +1 -0
- package/src/exceptions/mcp-exceptions/session-missing.exception.d.ts +3 -0
- package/src/exceptions/mcp-exceptions/session-missing.exception.js +11 -0
- package/src/exceptions/mcp-exceptions/session-missing.exception.js.map +1 -0
- package/src/exceptions/mcp-exceptions/unsupported-client-version.exception.d.ts +5 -0
- package/src/exceptions/mcp-exceptions/unsupported-client-version.exception.js +15 -0
- package/src/exceptions/mcp-exceptions/unsupported-client-version.exception.js.map +1 -0
- package/src/flows/flow.instance.d.ts +16 -0
- package/src/flows/flow.instance.js +332 -0
- package/src/flows/flow.instance.js.map +1 -0
- package/src/flows/flow.registry.d.ts +14 -0
- package/src/flows/flow.registry.js +79 -0
- package/src/flows/flow.registry.js.map +1 -0
- package/src/flows/flow.stages.d.ts +12 -0
- package/src/flows/flow.stages.js +110 -0
- package/src/flows/flow.stages.js.map +1 -0
- package/src/flows/flow.utils.d.ts +8 -0
- package/src/flows/flow.utils.js +36 -0
- package/src/flows/flow.utils.js.map +1 -0
- package/src/front-mcp/front-mcp.d.ts +12 -0
- package/src/front-mcp/front-mcp.js +44 -0
- package/src/front-mcp/front-mcp.js.map +1 -0
- package/src/front-mcp/front-mcp.providers.d.ts +198 -0
- package/src/front-mcp/front-mcp.providers.js +30 -0
- package/src/front-mcp/front-mcp.providers.js.map +1 -0
- package/src/front-mcp/front-mcp.tokens.d.ts +2 -0
- package/src/front-mcp/front-mcp.tokens.js +5 -0
- package/src/front-mcp/front-mcp.tokens.js.map +1 -0
- package/src/front-mcp/index.d.ts +1 -0
- package/src/front-mcp/index.js +5 -0
- package/src/front-mcp/index.js.map +1 -0
- package/src/hooks/hook.instance.d.ts +7 -0
- package/src/hooks/hook.instance.js +23 -0
- package/src/hooks/hook.instance.js.map +1 -0
- package/src/hooks/hook.registry.d.ts +34 -0
- package/src/hooks/hook.registry.js +138 -0
- package/src/hooks/hook.registry.js.map +1 -0
- package/src/hooks/hooks.utils.d.ts +3 -0
- package/src/hooks/hooks.utils.js +27 -0
- package/src/hooks/hooks.utils.js.map +1 -0
- package/src/index.d.ts +21 -18
- package/src/index.js +9 -18
- package/src/index.js.map +1 -1
- package/src/logger/instances/instance.console-logger.d.ts +10 -0
- package/src/logger/instances/instance.console-logger.js +75 -0
- package/src/logger/instances/instance.console-logger.js.map +1 -0
- package/src/logger/instances/instance.logger.d.ts +24 -0
- package/src/logger/instances/instance.logger.js +77 -0
- package/src/logger/instances/instance.logger.js.map +1 -0
- package/src/logger/logger.registry.d.ts +13 -0
- package/src/logger/logger.registry.js +91 -0
- package/src/logger/logger.registry.js.map +1 -0
- package/src/logger/logger.tokens.d.ts +1 -0
- package/src/logger/logger.tokens.js +3 -0
- package/src/logger/logger.tokens.js.map +1 -0
- package/src/logger/logger.types.d.ts +10 -0
- package/src/logger/logger.types.js +8 -0
- package/src/logger/logger.types.js.map +1 -0
- package/src/logger/logger.utils.d.ts +15 -0
- package/src/logger/logger.utils.js +42 -0
- package/src/logger/logger.utils.js.map +1 -0
- package/src/plugin/plugin.registry.d.ts +24 -0
- package/src/plugin/plugin.registry.js +137 -0
- package/src/plugin/plugin.registry.js.map +1 -0
- package/src/plugin/plugin.utils.d.ts +10 -0
- package/src/plugin/plugin.utils.js +88 -0
- package/src/plugin/plugin.utils.js.map +1 -0
- package/src/prompt/prompt.registry.d.ts +16 -0
- package/src/prompt/prompt.registry.js +34 -0
- package/src/prompt/prompt.registry.js.map +1 -0
- package/src/provider/provider.registry.d.ts +75 -0
- package/src/provider/provider.registry.js +679 -0
- package/src/provider/provider.registry.js.map +1 -0
- package/src/provider/provider.types.d.ts +9 -0
- package/src/provider/provider.types.js +3 -0
- package/src/provider/provider.types.js.map +1 -0
- package/src/provider/provider.utils.d.ts +13 -0
- package/src/provider/provider.utils.js +103 -0
- package/src/provider/provider.utils.js.map +1 -0
- package/src/regsitry/index.d.ts +1 -0
- package/src/regsitry/index.js +5 -0
- package/src/regsitry/index.js.map +1 -0
- package/src/regsitry/registry.base.d.ts +25 -0
- package/src/regsitry/registry.base.js +32 -0
- package/src/regsitry/registry.base.js.map +1 -0
- package/src/resource/resource.registry.d.ts +15 -0
- package/src/resource/resource.registry.js +31 -0
- package/src/resource/resource.registry.js.map +1 -0
- package/src/scope/flows/http.request.flow.d.ts +384 -0
- package/src/scope/flows/http.request.flow.js +210 -0
- package/src/scope/flows/http.request.flow.js.map +1 -0
- package/src/scope/index.d.ts +1 -0
- package/src/scope/index.js +6 -0
- package/src/scope/index.js.map +1 -0
- package/src/scope/scope.instance.d.ts +35 -0
- package/src/scope/scope.instance.js +120 -0
- package/src/scope/scope.instance.js.map +1 -0
- package/src/scope/scope.registry.d.ts +10 -0
- package/src/scope/scope.registry.js +93 -0
- package/src/scope/scope.registry.js.map +1 -0
- package/src/scope/scope.utils.d.ts +13 -0
- package/src/scope/scope.utils.js +59 -0
- package/src/scope/scope.utils.js.map +1 -0
- package/src/server/adapters/base.host.adapter.d.ts +7 -0
- package/src/server/adapters/base.host.adapter.js +8 -0
- package/src/server/adapters/base.host.adapter.js.map +1 -0
- package/src/server/adapters/express.host.adapter.d.ts +12 -0
- package/src/server/adapters/express.host.adapter.js +50 -0
- package/src/server/adapters/express.host.adapter.js.map +1 -0
- package/src/server/server.instance.d.ts +12 -0
- package/src/server/server.instance.js +47 -0
- package/src/server/server.instance.js.map +1 -0
- package/src/server/server.types.d.ts +24 -0
- package/src/server/server.types.js +3 -0
- package/src/server/server.types.js.map +1 -0
- package/src/server/server.validation.d.ts +2 -0
- package/src/server/server.validation.js +192 -0
- package/src/server/server.validation.js.map +1 -0
- package/src/store/adapters/store.base.adapter.d.ts +21 -0
- package/src/store/adapters/store.base.adapter.js +16 -0
- package/src/store/adapters/store.base.adapter.js.map +1 -0
- package/src/store/adapters/store.memory.adapter.d.ts +26 -0
- package/src/store/adapters/store.memory.adapter.js +87 -0
- package/src/store/adapters/store.memory.adapter.js.map +1 -0
- package/src/store/adapters/store.redis.adapter.d.ts +33 -0
- package/src/store/adapters/store.redis.adapter.js +104 -0
- package/src/store/adapters/store.redis.adapter.js.map +1 -0
- package/src/store/index.d.ts +8 -0
- package/src/store/index.js +12 -0
- package/src/store/index.js.map +1 -0
- package/src/store/store.helpers.d.ts +9 -0
- package/src/store/store.helpers.js +67 -0
- package/src/store/store.helpers.js.map +1 -0
- package/src/store/store.registry.d.ts +13 -0
- package/src/store/store.registry.js +37 -0
- package/src/store/store.registry.js.map +1 -0
- package/src/store/store.tokens.d.ts +3 -0
- package/src/store/store.tokens.js +7 -0
- package/src/store/store.tokens.js.map +1 -0
- package/src/store/store.types.d.ts +64 -0
- package/src/store/store.types.js +11 -0
- package/src/store/store.types.js.map +1 -0
- package/src/store/store.utils.d.ts +8 -0
- package/src/store/store.utils.js +18 -0
- package/src/store/store.utils.js.map +1 -0
- package/src/tool/flows/call-tool.flow.d.ts +875 -0
- package/src/tool/flows/call-tool.flow.js +249 -0
- package/src/tool/flows/call-tool.flow.js.map +1 -0
- package/src/tool/flows/tools-list.flow.d.ts +771 -0
- package/src/tool/flows/tools-list.flow.js +149 -0
- package/src/tool/flows/tools-list.flow.js.map +1 -0
- package/src/tool/tool.events.d.ts +17 -0
- package/src/tool/tool.events.js +16 -0
- package/src/tool/tool.events.js.map +1 -0
- package/src/tool/tool.instance.d.ts +15 -0
- package/src/tool/tool.instance.js +68 -0
- package/src/tool/tool.instance.js.map +1 -0
- package/src/tool/tool.registry.d.ts +72 -0
- package/src/tool/tool.registry.js +339 -0
- package/src/tool/tool.registry.js.map +1 -0
- package/src/tool/tool.types.d.ts +25 -0
- package/src/tool/tool.types.js +10 -0
- package/src/tool/tool.types.js.map +1 -0
- package/src/tool/tool.utils.d.ts +20 -0
- package/src/tool/tool.utils.js +157 -0
- package/src/tool/tool.utils.js.map +1 -0
- package/src/transport/adapters/transport.local.adapter.d.ts +41 -0
- package/src/transport/adapters/transport.local.adapter.js +127 -0
- package/src/transport/adapters/transport.local.adapter.js.map +1 -0
- package/src/transport/adapters/transport.sse.adapter.d.ts +14 -0
- package/src/transport/adapters/transport.sse.adapter.js +63 -0
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -0
- package/src/transport/adapters/transport.streamable-http.adapter.d.ts +13 -0
- package/src/transport/adapters/transport.streamable-http.adapter.js +65 -0
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -0
- package/src/transport/flows/handle.sse.flow.d.ts +92 -0
- package/src/transport/flows/handle.sse.flow.js +129 -0
- package/src/transport/flows/handle.sse.flow.js.map +1 -0
- package/src/transport/flows/handle.streamable-http.flow.d.ts +93 -0
- package/src/transport/flows/handle.streamable-http.flow.js +125 -0
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -0
- package/src/transport/legacy/legacy.sse.tranporter.d.ts +75 -0
- package/src/transport/legacy/legacy.sse.tranporter.js +170 -0
- package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -0
- package/src/transport/mcp-handlers/Initialized-notification.hanlder.d.ts +3 -0
- package/src/transport/mcp-handlers/Initialized-notification.hanlder.js +14 -0
- package/src/transport/mcp-handlers/Initialized-notification.hanlder.js.map +1 -0
- package/src/transport/mcp-handlers/call-tool-request.handler.d.ts +3 -0
- package/src/transport/mcp-handlers/call-tool-request.handler.js +15 -0
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/index.d.ts +521 -0
- package/src/transport/mcp-handlers/index.js +20 -0
- package/src/transport/mcp-handlers/index.js.map +1 -0
- package/src/transport/mcp-handlers/initialize-request.handler.d.ts +3 -0
- package/src/transport/mcp-handlers/initialize-request.handler.js +33 -0
- package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +285 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.js +11 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +37 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.js +3 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -0
- package/src/transport/transport.error.d.ts +4 -0
- package/src/transport/transport.error.js +25 -0
- package/src/transport/transport.error.js.map +1 -0
- package/src/transport/transport.event-store.d.ts +10 -0
- package/src/transport/transport.event-store.js +36 -0
- package/src/transport/transport.event-store.js.map +1 -0
- package/src/transport/transport.local.d.ts +17 -0
- package/src/transport/transport.local.js +65 -0
- package/src/transport/transport.local.js.map +1 -0
- package/src/transport/transport.registry.d.ts +23 -0
- package/src/transport/transport.registry.js +138 -0
- package/src/transport/transport.registry.js.map +1 -0
- package/src/transport/transport.remote.d.ts +15 -0
- package/src/transport/transport.remote.js +31 -0
- package/src/transport/transport.remote.js.map +1 -0
- package/src/transport/transport.types.d.ts +54 -0
- package/src/transport/transport.types.js +3 -0
- package/src/transport/transport.types.js.map +1 -0
- package/src/types/drinen-hooks.types.d.ts +20 -0
- package/src/types/drinen-hooks.types.js +3 -0
- package/src/types/drinen-hooks.types.js.map +1 -0
- package/src/types/invoke.type.d.ts +15 -0
- package/src/types/invoke.type.js +34 -0
- package/src/types/invoke.type.js.map +1 -0
- package/src/types/token.types.d.ts +1 -0
- package/src/types/token.types.js +3 -0
- package/src/types/token.types.js.map +1 -0
- package/src/utils/metadata.utils.d.ts +5 -0
- package/src/utils/metadata.utils.js +26 -0
- package/src/utils/metadata.utils.js.map +1 -0
- package/src/utils/server.utils.d.ts +19 -0
- package/src/utils/server.utils.js +59 -0
- package/src/utils/server.utils.js.map +1 -0
- package/src/utils/string.utils.d.ts +1 -0
- package/src/utils/string.utils.js +10 -0
- package/src/utils/string.utils.js.map +1 -0
- package/src/utils/token.utils.d.ts +11 -0
- package/src/utils/token.utils.js +65 -0
- package/src/utils/token.utils.js.map +1 -0
- package/src/utils/types.utils.d.ts +7 -0
- package/src/utils/types.utils.js +3 -0
- package/src/utils/types.utils.js.map +1 -0
- package/src/constants.d.ts +0 -30
- package/src/constants.js +0 -36
- package/src/constants.js.map +0 -1
- package/src/decorators/adapter.decorator.js.map +0 -1
- package/src/decorators/app.decorator.js.map +0 -1
- package/src/decorators/auth-provider.decorator.js.map +0 -1
- package/src/decorators/flow.decorator.js.map +0 -1
- package/src/decorators/front-mcp.decorator.js +0 -40
- package/src/decorators/front-mcp.decorator.js.map +0 -1
- package/src/decorators/hook.decorator.js.map +0 -1
- package/src/decorators/index.js.map +0 -1
- package/src/decorators/logger.decorator.js.map +0 -1
- package/src/decorators/plugin.decorator.js.map +0 -1
- package/src/decorators/prompt.decorator.js.map +0 -1
- package/src/decorators/provider.decorator.js.map +0 -1
- package/src/decorators/resource.decorator.js.map +0 -1
- package/src/decorators/tool.decorator.d.ts +0 -42
- package/src/decorators/tool.decorator.js +0 -45
- package/src/decorators/tool.decorator.js.map +0 -1
- package/src/decorators-old/async-with.decorator.d.ts +0 -9
- package/src/decorators-old/async-with.decorator.js +0 -23
- package/src/decorators-old/async-with.decorator.js.map +0 -1
- package/src/decorators-old/auth-hook.decorator.js.map +0 -1
- package/src/decorators-old/session-hook.decorator.js.map +0 -1
- package/src/decorators-old/tool-hook.decorator.d.ts +0 -14
- package/src/decorators-old/tool-hook.decorator.js +0 -27
- package/src/decorators-old/tool-hook.decorator.js.map +0 -1
- package/src/dynamic/dynamic.adapter.js.map +0 -1
- package/src/dynamic/dynamic.plugin.js.map +0 -1
- package/src/dynamic/dynamic.utils.d.ts +0 -3
- package/src/dynamic/dynamic.utils.js.map +0 -1
- package/src/dynamic/index.js.map +0 -1
- package/src/entries/adapter.entry.js.map +0 -1
- package/src/entries/app.entry.d.ts +0 -13
- package/src/entries/app.entry.js.map +0 -1
- package/src/entries/auth-provider.entry.js.map +0 -1
- package/src/entries/base.entry.js.map +0 -1
- package/src/entries/flow.entry.js.map +0 -1
- package/src/entries/hook.entry.js.map +0 -1
- package/src/entries/index.js.map +0 -1
- package/src/entries/logger.entry.js.map +0 -1
- package/src/entries/plugin.entry.js.map +0 -1
- package/src/entries/prompt.entry.js.map +0 -1
- package/src/entries/provider.entry.js.map +0 -1
- package/src/entries/resource.entry.js.map +0 -1
- package/src/entries/scope.entry.js.map +0 -1
- package/src/entries/tool.entry.js.map +0 -1
- package/src/interfaces/adapter.interface.js.map +0 -1
- package/src/interfaces/app.interface.js.map +0 -1
- package/src/interfaces/auth-hook.interface.js.map +0 -1
- package/src/interfaces/auth-provider.interface.js.map +0 -1
- package/src/interfaces/base.interface.js.map +0 -1
- package/src/interfaces/flow.interface.d.ts +0 -41
- package/src/interfaces/flow.interface.js.map +0 -1
- package/src/interfaces/front-mcp.interface.js.map +0 -1
- package/src/interfaces/hook.interface.js.map +0 -1
- package/src/interfaces/index.js.map +0 -1
- package/src/interfaces/internal/flow.utils.d.ts +0 -24
- package/src/interfaces/internal/flow.utils.js.map +0 -1
- package/src/interfaces/internal/index.js.map +0 -1
- package/src/interfaces/internal/primary-auth-provider.interface.d.ts +0 -24
- package/src/interfaces/internal/primary-auth-provider.interface.js.map +0 -1
- package/src/interfaces/internal/registry.interface.d.ts +0 -97
- package/src/interfaces/internal/registry.interface.js.map +0 -1
- package/src/interfaces/logger.interface.js.map +0 -1
- package/src/interfaces/plugin.interface.js.map +0 -1
- package/src/interfaces/prompt.interface.js.map +0 -1
- package/src/interfaces/provider.interface.js.map +0 -1
- package/src/interfaces/resource.interface.js.map +0 -1
- package/src/interfaces/scope.interface.js.map +0 -1
- package/src/interfaces/server.interface.js.map +0 -1
- package/src/interfaces/session-hook.interface.js.map +0 -1
- package/src/interfaces/tool-hook.interface.js.map +0 -1
- package/src/interfaces/tool.interface.js.map +0 -1
- package/src/metadata/adapter.metadata.js.map +0 -1
- package/src/metadata/app.metadata.d.ts +0 -872
- package/src/metadata/app.metadata.js.map +0 -1
- package/src/metadata/auth-provider.metadata.js.map +0 -1
- package/src/metadata/flow.metadata.d.ts +0 -77
- package/src/metadata/flow.metadata.js.map +0 -1
- package/src/metadata/front-mcp.metadata.d.ts +0 -1144
- package/src/metadata/front-mcp.metadata.js.map +0 -1
- package/src/metadata/hook.metadata.js.map +0 -1
- package/src/metadata/index.js.map +0 -1
- package/src/metadata/logger.metadata.js.map +0 -1
- package/src/metadata/plugin.metadata.js.map +0 -1
- package/src/metadata/prompt.metadata.js.map +0 -1
- package/src/metadata/provider.metadata.js.map +0 -1
- package/src/metadata/resource.metadata.js.map +0 -1
- package/src/metadata/tool.metadata.d.ts +0 -178
- package/src/metadata/tool.metadata.js.map +0 -1
- package/src/providers/session.provider.js.map +0 -1
- package/src/records/adapter.record.js.map +0 -1
- package/src/records/app.record.js.map +0 -1
- package/src/records/auth-provider.record.js.map +0 -1
- package/src/records/flow.record.js.map +0 -1
- package/src/records/hook.record.js.map +0 -1
- package/src/records/index.js.map +0 -1
- package/src/records/logger.record.d.ts +0 -11
- package/src/records/logger.record.js.map +0 -1
- package/src/records/plugin.record.js.map +0 -1
- package/src/records/prompt.record.js.map +0 -1
- package/src/records/provider.record.js.map +0 -1
- package/src/records/resource.record.js.map +0 -1
- package/src/records/scope.record.js.map +0 -1
- package/src/records/tool.record.js.map +0 -1
- package/src/schemas/annotated-class.schema.js.map +0 -1
- package/src/schemas/http-input.schema.js.map +0 -1
- package/src/schemas/http-output.schema.d.ts +0 -2011
- package/src/schemas/http-output.schema.js.map +0 -1
- package/src/schemas/index.js.map +0 -1
- package/src/tokens/adapter.tokens.js.map +0 -1
- package/src/tokens/app.tokens.js.map +0 -1
- package/src/tokens/auth-provider.tokens.js.map +0 -1
- package/src/tokens/base.tokens.js.map +0 -1
- package/src/tokens/flow-hook.tokens.js.map +0 -1
- package/src/tokens/flow.tokens.js.map +0 -1
- package/src/tokens/front-mcp.tokens.js.map +0 -1
- package/src/tokens/index.js.map +0 -1
- package/src/tokens/logger.tokens.js.map +0 -1
- package/src/tokens/plugin.tokens.js.map +0 -1
- package/src/tokens/prompt.tokens.js.map +0 -1
- package/src/tokens/provider.tokens.js.map +0 -1
- package/src/tokens/resource.tokens.js.map +0 -1
- package/src/tokens/server.tokens.js.map +0 -1
- package/src/tokens/tool.tokens.js.map +0 -1
- package/src/types/auth/index.js.map +0 -1
- package/src/types/auth/jwt.types.js.map +0 -1
- package/src/types/auth/session.types.d.ts +0 -263
- package/src/types/auth/session.types.js.map +0 -1
- package/src/types/common.types.js.map +0 -1
- package/src/types/index.js.map +0 -1
- package/src/types/options/auth.options.d.ts +0 -513
- package/src/types/options/auth.options.js.map +0 -1
- package/src/types/options/http.options.js.map +0 -1
- package/src/types/options/index.js.map +0 -1
- package/src/types/options/logging.options.d.ts +0 -39
- package/src/types/options/logging.options.js.map +0 -1
- package/src/types/options/server-info.options.d.ts +0 -48
- package/src/types/options/server-info.options.js.map +0 -1
- package/src/types/options/session.options.d.ts +0 -67
- package/src/types/options/session.options.js.map +0 -1
- package/src/utils/decide-request-intent.utils.d.ts +0 -79
- package/src/utils/decide-request-intent.utils.js.map +0 -1
- package/src/utils/index.js.map +0 -1
- package/src/utils/path.utils.d.ts +0 -20
- package/src/utils/path.utils.js.map +0 -1
- /package/src/{decorators → common/decorators}/adapter.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/adapter.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/app.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/app.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/auth-provider.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/auth-provider.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/flow.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/flow.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/front-mcp.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/hook.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/hook.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/index.d.ts +0 -0
- /package/src/{decorators → common/decorators}/index.js +0 -0
- /package/src/{decorators → common/decorators}/logger.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/logger.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/plugin.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/plugin.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/prompt.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/prompt.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/provider.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/provider.decorator.js +0 -0
- /package/src/{decorators → common/decorators}/resource.decorator.d.ts +0 -0
- /package/src/{decorators → common/decorators}/resource.decorator.js +0 -0
- /package/src/{decorators-old → common/decorators-old}/auth-hook.decorator.d.ts +0 -0
- /package/src/{decorators-old → common/decorators-old}/auth-hook.decorator.js +0 -0
- /package/src/{decorators-old → common/decorators-old}/session-hook.decorator.d.ts +0 -0
- /package/src/{decorators-old → common/decorators-old}/session-hook.decorator.js +0 -0
- /package/src/{dynamic → common/dynamic}/dynamic.adapter.d.ts +0 -0
- /package/src/{dynamic → common/dynamic}/dynamic.adapter.js +0 -0
- /package/src/{dynamic → common/dynamic}/dynamic.plugin.d.ts +0 -0
- /package/src/{dynamic → common/dynamic}/dynamic.plugin.js +0 -0
- /package/src/{dynamic → common/dynamic}/dynamic.utils.js +0 -0
- /package/src/{dynamic → common/dynamic}/index.d.ts +0 -0
- /package/src/{dynamic → common/dynamic}/index.js +0 -0
- /package/src/{entries → common/entries}/adapter.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/adapter.entry.js +0 -0
- /package/src/{entries → common/entries}/app.entry.js +0 -0
- /package/src/{entries → common/entries}/auth-provider.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/auth-provider.entry.js +0 -0
- /package/src/{entries → common/entries}/base.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/base.entry.js +0 -0
- /package/src/{entries → common/entries}/flow.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/flow.entry.js +0 -0
- /package/src/{entries → common/entries}/hook.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/hook.entry.js +0 -0
- /package/src/{entries → common/entries}/index.d.ts +0 -0
- /package/src/{entries → common/entries}/index.js +0 -0
- /package/src/{entries → common/entries}/logger.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/logger.entry.js +0 -0
- /package/src/{entries → common/entries}/plugin.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/plugin.entry.js +0 -0
- /package/src/{entries → common/entries}/prompt.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/prompt.entry.js +0 -0
- /package/src/{entries → common/entries}/provider.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/provider.entry.js +0 -0
- /package/src/{entries → common/entries}/resource.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/resource.entry.js +0 -0
- /package/src/{entries → common/entries}/scope.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/scope.entry.js +0 -0
- /package/src/{entries → common/entries}/tool.entry.d.ts +0 -0
- /package/src/{entries → common/entries}/tool.entry.js +0 -0
- /package/src/{interfaces → common/interfaces}/adapter.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/adapter.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/app.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/app.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/auth-hook.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/auth-hook.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/auth-provider.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/auth-provider.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/base.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/base.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/flow.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/front-mcp.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/front-mcp.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/hook.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/hook.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/index.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/index.js +0 -0
- /package/src/{interfaces → common/interfaces}/internal/flow.utils.js +0 -0
- /package/src/{interfaces → common/interfaces}/internal/index.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/internal/index.js +0 -0
- /package/src/{interfaces → common/interfaces}/internal/primary-auth-provider.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/internal/registry.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/logger.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/logger.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/plugin.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/plugin.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/prompt.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/prompt.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/provider.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/provider.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/resource.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/resource.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/scope.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/scope.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/server.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/server.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/session-hook.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/session-hook.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/tool-hook.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/tool-hook.interface.js +0 -0
- /package/src/{interfaces → common/interfaces}/tool.interface.d.ts +0 -0
- /package/src/{interfaces → common/interfaces}/tool.interface.js +0 -0
- /package/src/{metadata → common/metadata}/adapter.metadata.d.ts +0 -0
- /package/src/{metadata → common/metadata}/adapter.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/app.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/auth-provider.metadata.d.ts +0 -0
- /package/src/{metadata → common/metadata}/auth-provider.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/flow.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/front-mcp.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/hook.metadata.d.ts +0 -0
- /package/src/{metadata → common/metadata}/hook.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/index.d.ts +0 -0
- /package/src/{metadata → common/metadata}/index.js +0 -0
- /package/src/{metadata → common/metadata}/logger.metadata.d.ts +0 -0
- /package/src/{metadata → common/metadata}/logger.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/plugin.metadata.d.ts +0 -0
- /package/src/{metadata → common/metadata}/plugin.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/prompt.metadata.d.ts +0 -0
- /package/src/{metadata → common/metadata}/prompt.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/provider.metadata.d.ts +0 -0
- /package/src/{metadata → common/metadata}/provider.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/resource.metadata.d.ts +0 -0
- /package/src/{metadata → common/metadata}/resource.metadata.js +0 -0
- /package/src/{metadata → common/metadata}/tool.metadata.js +0 -0
- /package/src/{providers → common/providers}/session.provider.d.ts +0 -0
- /package/src/{providers → common/providers}/session.provider.js +0 -0
- /package/src/{records → common/records}/adapter.record.d.ts +0 -0
- /package/src/{records → common/records}/adapter.record.js +0 -0
- /package/src/{records → common/records}/app.record.d.ts +0 -0
- /package/src/{records → common/records}/app.record.js +0 -0
- /package/src/{records → common/records}/auth-provider.record.d.ts +0 -0
- /package/src/{records → common/records}/auth-provider.record.js +0 -0
- /package/src/{records → common/records}/flow.record.d.ts +0 -0
- /package/src/{records → common/records}/flow.record.js +0 -0
- /package/src/{records → common/records}/hook.record.d.ts +0 -0
- /package/src/{records → common/records}/hook.record.js +0 -0
- /package/src/{records → common/records}/index.d.ts +0 -0
- /package/src/{records → common/records}/index.js +0 -0
- /package/src/{records → common/records}/logger.record.js +0 -0
- /package/src/{records → common/records}/plugin.record.d.ts +0 -0
- /package/src/{records → common/records}/plugin.record.js +0 -0
- /package/src/{records → common/records}/prompt.record.d.ts +0 -0
- /package/src/{records → common/records}/prompt.record.js +0 -0
- /package/src/{records → common/records}/provider.record.d.ts +0 -0
- /package/src/{records → common/records}/provider.record.js +0 -0
- /package/src/{records → common/records}/resource.record.d.ts +0 -0
- /package/src/{records → common/records}/resource.record.js +0 -0
- /package/src/{records → common/records}/scope.record.d.ts +0 -0
- /package/src/{records → common/records}/scope.record.js +0 -0
- /package/src/{records → common/records}/tool.record.d.ts +0 -0
- /package/src/{records → common/records}/tool.record.js +0 -0
- /package/src/{schemas → common/schemas}/annotated-class.schema.d.ts +0 -0
- /package/src/{schemas → common/schemas}/annotated-class.schema.js +0 -0
- /package/src/{schemas → common/schemas}/http-input.schema.d.ts +0 -0
- /package/src/{schemas → common/schemas}/http-input.schema.js +0 -0
- /package/src/{schemas → common/schemas}/http-output.schema.js +0 -0
- /package/src/{schemas → common/schemas}/index.d.ts +0 -0
- /package/src/{schemas → common/schemas}/index.js +0 -0
- /package/src/{tokens → common/tokens}/adapter.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/adapter.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/app.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/app.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/auth-provider.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/auth-provider.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/base.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/base.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/flow-hook.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/flow-hook.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/flow.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/flow.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/front-mcp.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/front-mcp.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/index.d.ts +0 -0
- /package/src/{tokens → common/tokens}/index.js +0 -0
- /package/src/{tokens → common/tokens}/logger.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/logger.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/plugin.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/plugin.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/prompt.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/prompt.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/provider.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/provider.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/resource.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/resource.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/server.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/server.tokens.js +0 -0
- /package/src/{tokens → common/tokens}/tool.tokens.d.ts +0 -0
- /package/src/{tokens → common/tokens}/tool.tokens.js +0 -0
- /package/src/{types → common/types}/auth/index.d.ts +0 -0
- /package/src/{types → common/types}/auth/index.js +0 -0
- /package/src/{types → common/types}/auth/jwt.types.d.ts +0 -0
- /package/src/{types → common/types}/auth/jwt.types.js +0 -0
- /package/src/{types → common/types}/auth/session.types.js +0 -0
- /package/src/{types → common/types}/common.types.d.ts +0 -0
- /package/src/{types → common/types}/common.types.js +0 -0
- /package/src/{types → common/types}/index.d.ts +0 -0
- /package/src/{types → common/types}/index.js +0 -0
- /package/src/{types → common/types}/options/auth.options.js +0 -0
- /package/src/{types → common/types}/options/http.options.d.ts +0 -0
- /package/src/{types → common/types}/options/http.options.js +0 -0
- /package/src/{types → common/types}/options/index.d.ts +0 -0
- /package/src/{types → common/types}/options/index.js +0 -0
- /package/src/{types → common/types}/options/logging.options.js +0 -0
- /package/src/{types → common/types}/options/server-info.options.js +0 -0
- /package/src/{types → common/types}/options/session.options.js +0 -0
- /package/src/{utils → common/utils}/decide-request-intent.utils.js +0 -0
- /package/src/{utils → common/utils}/index.d.ts +0 -0
- /package/src/{utils → common/utils}/index.js +0 -0
- /package/src/{utils → common/utils}/path.utils.js +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SessionUser } from './record/session.base';
|
|
2
|
+
/** How provider tokens are managed in a session. */
|
|
3
|
+
export type SessionMode = 'transparent' | 'stateful' | 'stateless';
|
|
4
|
+
/**
|
|
5
|
+
* How a single provider’s access token is represented inside the session payload.
|
|
6
|
+
*/
|
|
7
|
+
export type ProviderEmbedMode = 'store-only' | 'encrypted' | 'plain' | 'ref';
|
|
8
|
+
/** AES-256-GCM encrypted blob, base64url fields. */
|
|
9
|
+
export type EncBlob = {
|
|
10
|
+
alg: 'A256GCM';
|
|
11
|
+
iv: string;
|
|
12
|
+
tag: string;
|
|
13
|
+
data: string;
|
|
14
|
+
};
|
|
15
|
+
export type ProviderSnapshot = {
|
|
16
|
+
id: string;
|
|
17
|
+
exp?: number;
|
|
18
|
+
payload?: Record<string, unknown>;
|
|
19
|
+
apps?: Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
toolIds?: string[];
|
|
22
|
+
}>;
|
|
23
|
+
embedMode: ProviderEmbedMode;
|
|
24
|
+
token?: string;
|
|
25
|
+
tokenEnc?: {
|
|
26
|
+
alg: 'A256GCM';
|
|
27
|
+
iv: string;
|
|
28
|
+
tag: string;
|
|
29
|
+
data: string;
|
|
30
|
+
};
|
|
31
|
+
refreshTokenEnc?: {
|
|
32
|
+
alg: 'A256GCM';
|
|
33
|
+
iv: string;
|
|
34
|
+
tag: string;
|
|
35
|
+
data: string;
|
|
36
|
+
};
|
|
37
|
+
secretRefId?: string;
|
|
38
|
+
refreshRefId?: string;
|
|
39
|
+
};
|
|
40
|
+
/** Arguments required to create a session from verified auth data. */
|
|
41
|
+
export type CreateSessionArgs = {
|
|
42
|
+
token: string;
|
|
43
|
+
sessionId?: string;
|
|
44
|
+
claims: Record<string, any>;
|
|
45
|
+
user: SessionUser;
|
|
46
|
+
authorizedProviders?: Record<string, import('./session.types').ProviderSnapshot>;
|
|
47
|
+
authorizedProviderIds?: string[];
|
|
48
|
+
authorizedApps?: Record<string, {
|
|
49
|
+
id: string;
|
|
50
|
+
toolIds: string[];
|
|
51
|
+
}>;
|
|
52
|
+
authorizedAppIds?: string[];
|
|
53
|
+
authorizedResources?: string[];
|
|
54
|
+
scopes?: string[];
|
|
55
|
+
authorizedTools?: Record<string, {
|
|
56
|
+
executionPath: [string, string];
|
|
57
|
+
details?: Record<string, any>;
|
|
58
|
+
}>;
|
|
59
|
+
authorizedToolIds?: string[];
|
|
60
|
+
authorizedPrompts?: Record<string, {
|
|
61
|
+
executionPath: [string, string];
|
|
62
|
+
details?: Record<string, any>;
|
|
63
|
+
}>;
|
|
64
|
+
authorizedPromptIds?: string[];
|
|
65
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.types.js","sourceRoot":"","sources":["../../../../src/auth/session/session.types.ts"],"names":[],"mappings":";AAAA,gCAAgC","sourcesContent":["// auth/session/session.types.ts\n\nimport { SessionUser } from './record/session.base';\n\n/** How provider tokens are managed in a session. */\nexport type SessionMode = 'transparent' | 'stateful' | 'stateless';\n\n/**\n * How a single provider’s access token is represented inside the session payload.\n */\nexport type ProviderEmbedMode =\n | 'store-only' // stateful, encrypted in memory store\n | 'encrypted' // stateless, encrypted in JWT/session-secret\n | 'plain' // stateless, plaintext (in-memory only)\n | 'ref'; // NEW: external vault/store by reference\n\n/** AES-256-GCM encrypted blob, base64url fields. */\nexport type EncBlob = { alg: 'A256GCM'; iv: string; tag: string; data: string };\n\nexport type ProviderSnapshot = {\n id: string;\n exp?: number;\n payload?: Record<string, unknown>;\n apps?: Array<{ id: string; toolIds?: string[] }>;\n embedMode: ProviderEmbedMode;\n\n // legacy fields (keep for back-compat)\n token?: string; // in-memory only, for 'plain'\n tokenEnc?: { alg: 'A256GCM'; iv: string; tag: string; data: string }; // for 'encrypted' or 'store-only'\n refreshTokenEnc?: { alg: 'A256GCM'; iv: string; tag: string; data: string };\n\n // NEW: externalized refs\n secretRefId?: string; // access token reference\n refreshRefId?: string; // refresh token reference\n};\n\n/** Arguments required to create a session from verified auth data. */\nexport type CreateSessionArgs = {\n token: string;\n sessionId?: string;\n claims: Record<string, any>;\n user: SessionUser;\n // Optional precomputed authorization projections (preferred when provided)\n authorizedProviders?: Record<string, import('./session.types').ProviderSnapshot>;\n authorizedProviderIds?: string[];\n authorizedApps?: Record<string, { id: string; toolIds: string[] }>;\n authorizedAppIds?: string[];\n authorizedResources?: string[];\n scopes?: string[];\n // Scoped tool/prompt projections for fast lookup\n authorizedTools?: Record<string, { executionPath: [string, string]; details?: Record<string, any> }>;\n authorizedToolIds?: string[];\n authorizedPrompts?: Record<string, { executionPath: [string, string]; details?: Record<string, any> }>;\n authorizedPromptIds?: string[];\n};\n\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ProviderSnapshot } from './session.types';
|
|
2
|
+
import type { TokenStore } from './token.store';
|
|
3
|
+
import type { TokenVault } from './token.vault';
|
|
4
|
+
export type TokenRefreshCtx = {
|
|
5
|
+
/** The provider we’re refreshing for. */
|
|
6
|
+
providerId: string;
|
|
7
|
+
/** Caller-provided session facade (only what a refresher may need). */
|
|
8
|
+
session: {
|
|
9
|
+
id: string;
|
|
10
|
+
scopeId: string;
|
|
11
|
+
/** Current snapshot (mutable by the session after refresh). */
|
|
12
|
+
authorizedProviders: Record<string, ProviderSnapshot>;
|
|
13
|
+
/** Optional helper if the refresher wants to call other providers. */
|
|
14
|
+
getToken?: (pid: string, opts?: {
|
|
15
|
+
refreshSkewSec?: number;
|
|
16
|
+
forceRefresh?: boolean;
|
|
17
|
+
}) => Promise<string | undefined>;
|
|
18
|
+
};
|
|
19
|
+
/** Current access token (if known); may be undefined/expired. */
|
|
20
|
+
accessToken?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Refresh token (if accessible by the embedding mode).
|
|
23
|
+
* For `ref` mode this is usually `undefined`; the refresher should use `store`/`vault`.
|
|
24
|
+
*/
|
|
25
|
+
refreshToken?: string;
|
|
26
|
+
/** The snapshot we’re refreshing (same as authorizedProviders[providerId]). */
|
|
27
|
+
snapshot: ProviderSnapshot;
|
|
28
|
+
/**
|
|
29
|
+
* External storage interfaces, present for `ref` mode to avoid revealing plaintext tokens.
|
|
30
|
+
* - `store` holds opaque encrypted blobs
|
|
31
|
+
* - `vault` handles AEAD encryption/decryption of secrets
|
|
32
|
+
*/
|
|
33
|
+
store?: TokenStore;
|
|
34
|
+
vault?: TokenVault;
|
|
35
|
+
};
|
|
36
|
+
export type TokenRefreshResult = {
|
|
37
|
+
/** New access token (if rotated). */
|
|
38
|
+
accessToken?: string;
|
|
39
|
+
/** New refresh token (optional). */
|
|
40
|
+
refreshToken?: string;
|
|
41
|
+
/** New absolute expiry (seconds since epoch preferred; ms also accepted). */
|
|
42
|
+
exp: number;
|
|
43
|
+
/** Optional opaque payload returned by the AS (id_token claims, etc.). */
|
|
44
|
+
payload?: Record<string, unknown>;
|
|
45
|
+
};
|
|
46
|
+
export type TokenRefresher = (ctx: TokenRefreshCtx) => Promise<TokenRefreshResult>;
|
|
47
|
+
/** Convert seconds/ms epoch or Date to epoch seconds. */
|
|
48
|
+
export declare function toEpochSeconds(exp?: number | Date): number | undefined;
|
|
49
|
+
/** Returns true if `exp` will occur within `skewSec` from now (or already past). */
|
|
50
|
+
export declare function isSoonExpiring(exp?: number | Date, skewSec?: number): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Synchronous check against a provider snapshot’s `exp` field.
|
|
53
|
+
* Note: In `ref` mode the exact expiry may live in the store; this helper
|
|
54
|
+
* intentionally remains synchronous and only uses the snapshot’s `exp`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function isSoonExpiringProvider(sessionLike: {
|
|
57
|
+
authorizedProviders: Record<string, ProviderSnapshot>;
|
|
58
|
+
}, providerId: string, skewSec?: number): boolean;
|
|
59
|
+
/** Best-effort extraction of `exp` from a JWT without verification. */
|
|
60
|
+
export declare function tryJwtExp(token?: string): number | undefined;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toEpochSeconds = toEpochSeconds;
|
|
4
|
+
exports.isSoonExpiring = isSoonExpiring;
|
|
5
|
+
exports.isSoonExpiringProvider = isSoonExpiringProvider;
|
|
6
|
+
exports.tryJwtExp = tryJwtExp;
|
|
7
|
+
// -----------------------------------------------------------------------------
|
|
8
|
+
// Expiry helpers
|
|
9
|
+
// -----------------------------------------------------------------------------
|
|
10
|
+
/** Convert seconds/ms epoch or Date to epoch seconds. */
|
|
11
|
+
function toEpochSeconds(exp) {
|
|
12
|
+
if (exp == null)
|
|
13
|
+
return undefined;
|
|
14
|
+
if (exp instanceof Date)
|
|
15
|
+
return Math.floor(exp.getTime() / 1000);
|
|
16
|
+
// Heuristic: treat large numbers as ms
|
|
17
|
+
return exp > 1e12 ? Math.floor(exp / 1000) : Math.floor(exp);
|
|
18
|
+
}
|
|
19
|
+
/** Returns true if `exp` will occur within `skewSec` from now (or already past). */
|
|
20
|
+
function isSoonExpiring(exp, skewSec = 60) {
|
|
21
|
+
const expSec = toEpochSeconds(exp);
|
|
22
|
+
if (expSec == null)
|
|
23
|
+
return false;
|
|
24
|
+
const now = Math.floor(Date.now() / 1000);
|
|
25
|
+
return expSec <= now + Math.max(0, skewSec);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Synchronous check against a provider snapshot’s `exp` field.
|
|
29
|
+
* Note: In `ref` mode the exact expiry may live in the store; this helper
|
|
30
|
+
* intentionally remains synchronous and only uses the snapshot’s `exp`.
|
|
31
|
+
*/
|
|
32
|
+
function isSoonExpiringProvider(sessionLike, providerId, skewSec = 60) {
|
|
33
|
+
const snap = sessionLike.authorizedProviders[providerId];
|
|
34
|
+
if (!snap)
|
|
35
|
+
return false;
|
|
36
|
+
return isSoonExpiring(snap.exp, skewSec);
|
|
37
|
+
}
|
|
38
|
+
// -----------------------------------------------------------------------------
|
|
39
|
+
// Optional utility: derive exp from JWT (unsigned decode)
|
|
40
|
+
// -----------------------------------------------------------------------------
|
|
41
|
+
/** Best-effort extraction of `exp` from a JWT without verification. */
|
|
42
|
+
function tryJwtExp(token) {
|
|
43
|
+
if (!token)
|
|
44
|
+
return undefined;
|
|
45
|
+
const parts = token.split('.');
|
|
46
|
+
if (parts.length < 2)
|
|
47
|
+
return undefined;
|
|
48
|
+
try {
|
|
49
|
+
const json = JSON.parse(base64urlDecode(parts[1]));
|
|
50
|
+
const e = json?.exp;
|
|
51
|
+
return typeof e === 'number' ? toEpochSeconds(e) : undefined;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function base64urlDecode(input) {
|
|
58
|
+
// pad
|
|
59
|
+
const pad = input.length % 4 === 2 ? '==' : input.length % 4 === 3 ? '=' : '';
|
|
60
|
+
const s = input.replace(/-/g, '+').replace(/_/g, '/') + pad;
|
|
61
|
+
return Buffer.from(s, 'base64').toString('utf8');
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=token.refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.refresh.js","sourceRoot":"","sources":["../../../../src/auth/session/token.refresh.ts"],"names":[],"mappings":";;AA8DA,wCAKC;AAGD,wCAKC;AAOD,wDAQC;AAOD,8BAWC;AAnDD,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,yDAAyD;AACzD,SAAgB,cAAc,CAAC,GAAmB;IAChD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,GAAG,YAAY,IAAI;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACjE,uCAAuC;IACvC,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,oFAAoF;AACpF,SAAgB,cAAc,CAAC,GAAmB,EAAE,OAAO,GAAG,EAAE;IAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,OAAO,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CACpC,WAAsE,EACtE,UAAkB,EAClB,OAAO,GAAG,EAAE;IAEZ,MAAM,IAAI,GAAG,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,0DAA0D;AAC1D,gFAAgF;AAEhF,uEAAuE;AACvE,SAAgB,SAAS,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC;QACpB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM;IACN,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;IAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC","sourcesContent":["// auth/session/token.refresh.ts\nimport type { ProviderSnapshot } from './session.types';\nimport type { TokenStore } from './token.store';\nimport type { TokenVault } from './token.vault';\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport type TokenRefreshCtx = {\n /** The provider we’re refreshing for. */\n providerId: string;\n\n /** Caller-provided session facade (only what a refresher may need). */\n session: {\n id: string;\n scopeId: string;\n /** Current snapshot (mutable by the session after refresh). */\n authorizedProviders: Record<string, ProviderSnapshot>;\n /** Optional helper if the refresher wants to call other providers. */\n getToken?: (pid: string, opts?: { refreshSkewSec?: number; forceRefresh?: boolean }) => Promise<string | undefined>;\n };\n\n /** Current access token (if known); may be undefined/expired. */\n accessToken?: string;\n\n /**\n * Refresh token (if accessible by the embedding mode).\n * For `ref` mode this is usually `undefined`; the refresher should use `store`/`vault`.\n */\n refreshToken?: string;\n\n /** The snapshot we’re refreshing (same as authorizedProviders[providerId]). */\n snapshot: ProviderSnapshot;\n\n /**\n * External storage interfaces, present for `ref` mode to avoid revealing plaintext tokens.\n * - `store` holds opaque encrypted blobs\n * - `vault` handles AEAD encryption/decryption of secrets\n */\n store?: TokenStore;\n vault?: TokenVault;\n};\n\nexport type TokenRefreshResult = {\n /** New access token (if rotated). */\n accessToken?: string;\n /** New refresh token (optional). */\n refreshToken?: string;\n /** New absolute expiry (seconds since epoch preferred; ms also accepted). */\n exp: number;\n /** Optional opaque payload returned by the AS (id_token claims, etc.). */\n payload?: Record<string, unknown>;\n};\n\nexport type TokenRefresher = (ctx: TokenRefreshCtx) => Promise<TokenRefreshResult>;\n\n// -----------------------------------------------------------------------------\n// Expiry helpers\n// -----------------------------------------------------------------------------\n\n/** Convert seconds/ms epoch or Date to epoch seconds. */\nexport function toEpochSeconds(exp?: number | Date): number | undefined {\n if (exp == null) return undefined;\n if (exp instanceof Date) return Math.floor(exp.getTime() / 1000);\n // Heuristic: treat large numbers as ms\n return exp > 1e12 ? Math.floor(exp / 1000) : Math.floor(exp);\n}\n\n/** Returns true if `exp` will occur within `skewSec` from now (or already past). */\nexport function isSoonExpiring(exp?: number | Date, skewSec = 60): boolean {\n const expSec = toEpochSeconds(exp);\n if (expSec == null) return false;\n const now = Math.floor(Date.now() / 1000);\n return expSec <= now + Math.max(0, skewSec);\n}\n\n/**\n * Synchronous check against a provider snapshot’s `exp` field.\n * Note: In `ref` mode the exact expiry may live in the store; this helper\n * intentionally remains synchronous and only uses the snapshot’s `exp`.\n */\nexport function isSoonExpiringProvider(\n sessionLike: { authorizedProviders: Record<string, ProviderSnapshot> },\n providerId: string,\n skewSec = 60,\n): boolean {\n const snap = sessionLike.authorizedProviders[providerId];\n if (!snap) return false;\n return isSoonExpiring(snap.exp, skewSec);\n}\n\n// -----------------------------------------------------------------------------\n// Optional utility: derive exp from JWT (unsigned decode)\n// -----------------------------------------------------------------------------\n\n/** Best-effort extraction of `exp` from a JWT without verification. */\nexport function tryJwtExp(token?: string): number | undefined {\n if (!token) return undefined;\n const parts = token.split('.');\n if (parts.length < 2) return undefined;\n try {\n const json = JSON.parse(base64urlDecode(parts[1]));\n const e = json?.exp;\n return typeof e === 'number' ? toEpochSeconds(e) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction base64urlDecode(input: string): string {\n // pad\n const pad = input.length % 4 === 2 ? '==' : input.length % 4 === 3 ? '=' : '';\n const s = input.replace(/-/g, '+').replace(/_/g, '/') + pad;\n return Buffer.from(s, 'base64').toString('utf8');\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EncBlob } from './token.vault';
|
|
2
|
+
export type SecretRecord = {
|
|
3
|
+
id: string;
|
|
4
|
+
blob: EncBlob;
|
|
5
|
+
updatedAt: number;
|
|
6
|
+
};
|
|
7
|
+
export interface TokenStore {
|
|
8
|
+
/** Create or overwrite a blob under a stable id. */
|
|
9
|
+
put(id: string, blob: EncBlob): Promise<void>;
|
|
10
|
+
/** Fetch encrypted blob by id. */
|
|
11
|
+
get(id: string): Promise<SecretRecord | undefined>;
|
|
12
|
+
/** Delete a reference. */
|
|
13
|
+
del(id: string): Promise<void>;
|
|
14
|
+
/** Allocate a new id (opaque). */
|
|
15
|
+
allocId(): string;
|
|
16
|
+
}
|
|
17
|
+
/** In-memory reference store (dev/test). */
|
|
18
|
+
export declare class MemoryTokenStore implements TokenStore {
|
|
19
|
+
private m;
|
|
20
|
+
allocId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
21
|
+
put(id: string, blob: EncBlob): Promise<void>;
|
|
22
|
+
get(id: string): Promise<SecretRecord | undefined>;
|
|
23
|
+
del(id: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/** Redis (sketch) — replace `any` with your redis client type. */
|
|
26
|
+
export declare class RedisTokenStore implements TokenStore {
|
|
27
|
+
private readonly redis;
|
|
28
|
+
private readonly ns;
|
|
29
|
+
constructor(redis: any, ns?: string);
|
|
30
|
+
allocId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
31
|
+
key(id: string): string;
|
|
32
|
+
put(id: string, blob: EncBlob): Promise<void>;
|
|
33
|
+
get(id: string): Promise<SecretRecord | undefined>;
|
|
34
|
+
del(id: string): Promise<void>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisTokenStore = exports.MemoryTokenStore = void 0;
|
|
4
|
+
// auth/session/token.store.ts
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
/** In-memory reference store (dev/test). */
|
|
7
|
+
class MemoryTokenStore {
|
|
8
|
+
m = new Map();
|
|
9
|
+
allocId() {
|
|
10
|
+
return (0, node_crypto_1.randomUUID)();
|
|
11
|
+
}
|
|
12
|
+
async put(id, blob) {
|
|
13
|
+
this.m.set(id, { id, blob, updatedAt: Date.now() });
|
|
14
|
+
}
|
|
15
|
+
async get(id) {
|
|
16
|
+
return this.m.get(id);
|
|
17
|
+
}
|
|
18
|
+
async del(id) {
|
|
19
|
+
this.m.delete(id);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.MemoryTokenStore = MemoryTokenStore;
|
|
23
|
+
/** Redis (sketch) — replace `any` with your redis client type. */
|
|
24
|
+
class RedisTokenStore {
|
|
25
|
+
redis;
|
|
26
|
+
ns;
|
|
27
|
+
constructor(redis, ns = 'tok:') {
|
|
28
|
+
this.redis = redis;
|
|
29
|
+
this.ns = ns;
|
|
30
|
+
}
|
|
31
|
+
allocId() {
|
|
32
|
+
return (0, node_crypto_1.randomUUID)();
|
|
33
|
+
}
|
|
34
|
+
key(id) {
|
|
35
|
+
return `${this.ns}${id}`;
|
|
36
|
+
}
|
|
37
|
+
async put(id, blob) {
|
|
38
|
+
const rec = JSON.stringify({ id, blob, updatedAt: Date.now() });
|
|
39
|
+
// Optional: set EX by blob.exp if you want Redis eviction at token expiry
|
|
40
|
+
await this.redis.set(this.key(id), rec);
|
|
41
|
+
}
|
|
42
|
+
async get(id) {
|
|
43
|
+
const raw = await this.redis.get(this.key(id));
|
|
44
|
+
if (!raw)
|
|
45
|
+
return undefined;
|
|
46
|
+
return JSON.parse(raw);
|
|
47
|
+
}
|
|
48
|
+
async del(id) {
|
|
49
|
+
await this.redis.del(this.key(id));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.RedisTokenStore = RedisTokenStore;
|
|
53
|
+
//# sourceMappingURL=token.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.store.js","sourceRoot":"","sources":["../../../../src/auth/session/token.store.ts"],"names":[],"mappings":";;;AAAA,8BAA8B;AAC9B,6CAAyC;AAoBzC,4CAA4C;AAC5C,MAAa,gBAAgB;IACnB,CAAC,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,OAAO;QACL,OAAO,IAAA,wBAAU,GAAE,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,IAAa;QACjC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;CACF;AAdD,4CAcC;AAED,kEAAkE;AAClE,MAAa,eAAe;IACG;IAA6B;IAA1D,YAA6B,KAAU,EAAmB,KAAK,MAAM;QAAxC,UAAK,GAAL,KAAK,CAAK;QAAmB,OAAE,GAAF,EAAE,CAAS;IAAG,CAAC;IACzE,OAAO;QACL,OAAO,IAAA,wBAAU,GAAE,CAAC;IACtB,CAAC;IACD,GAAG,CAAC,EAAU;QACZ,OAAO,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,IAAa;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChE,0EAA0E;QAC1E,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;CACF;AAxBD,0CAwBC","sourcesContent":["// auth/session/token.store.ts\nimport { randomUUID } from 'node:crypto';\nimport type { EncBlob } from './token.vault';\n\nexport type SecretRecord = {\n id: string; // opaque reference id\n blob: EncBlob; // encrypted token\n updatedAt: number; // ms\n};\n\nexport interface TokenStore {\n /** Create or overwrite a blob under a stable id. */\n put(id: string, blob: EncBlob): Promise<void>;\n /** Fetch encrypted blob by id. */\n get(id: string): Promise<SecretRecord | undefined>;\n /** Delete a reference. */\n del(id: string): Promise<void>;\n /** Allocate a new id (opaque). */\n allocId(): string;\n}\n\n/** In-memory reference store (dev/test). */\nexport class MemoryTokenStore implements TokenStore {\n private m = new Map<string, SecretRecord>();\n allocId() {\n return randomUUID();\n }\n async put(id: string, blob: EncBlob) {\n this.m.set(id, { id, blob, updatedAt: Date.now() });\n }\n async get(id: string) {\n return this.m.get(id);\n }\n async del(id: string) {\n this.m.delete(id);\n }\n}\n\n/** Redis (sketch) — replace `any` with your redis client type. */\nexport class RedisTokenStore implements TokenStore {\n constructor(private readonly redis: any, private readonly ns = 'tok:') {}\n allocId() {\n return randomUUID();\n }\n key(id: string) {\n return `${this.ns}${id}`;\n }\n\n async put(id: string, blob: EncBlob) {\n const rec = JSON.stringify({ id, blob, updatedAt: Date.now() });\n // Optional: set EX by blob.exp if you want Redis eviction at token expiry\n await this.redis.set(this.key(id), rec);\n }\n\n async get(id: string) {\n const raw = await this.redis.get(this.key(id));\n if (!raw) return undefined;\n return JSON.parse(raw) as SecretRecord;\n }\n\n async del(id: string) {\n await this.redis.del(this.key(id));\n }\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type EncBlob = {
|
|
2
|
+
alg: 'A256GCM';
|
|
3
|
+
kid: string;
|
|
4
|
+
iv: string;
|
|
5
|
+
tag: string;
|
|
6
|
+
data: string;
|
|
7
|
+
exp?: number;
|
|
8
|
+
meta?: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
export type VaultKey = {
|
|
11
|
+
kid: string;
|
|
12
|
+
key: Buffer;
|
|
13
|
+
};
|
|
14
|
+
export declare class TokenVault {
|
|
15
|
+
/** Active key used for new encryptions */
|
|
16
|
+
private active;
|
|
17
|
+
/** All known keys by kid for decryption (includes active) */
|
|
18
|
+
private keys;
|
|
19
|
+
constructor(keys: VaultKey[]);
|
|
20
|
+
rotateTo(k: VaultKey): void;
|
|
21
|
+
encrypt(plaintext: string, opts?: {
|
|
22
|
+
exp?: number;
|
|
23
|
+
meta?: Record<string, unknown>;
|
|
24
|
+
}): EncBlob;
|
|
25
|
+
decrypt(blob: EncBlob): string;
|
|
26
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenVault = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
// auth/session/token.vault.ts
|
|
6
|
+
const node_crypto_1 = tslib_1.__importDefault(require("node:crypto"));
|
|
7
|
+
class TokenVault {
|
|
8
|
+
/** Active key used for new encryptions */
|
|
9
|
+
active;
|
|
10
|
+
/** All known keys by kid for decryption (includes active) */
|
|
11
|
+
keys = new Map();
|
|
12
|
+
constructor(keys) {
|
|
13
|
+
if (!Array.isArray(keys) || keys.length === 0) {
|
|
14
|
+
throw new Error('TokenVault requires at least one key');
|
|
15
|
+
}
|
|
16
|
+
// first is active by convention
|
|
17
|
+
this.active = keys[0];
|
|
18
|
+
for (const k of keys)
|
|
19
|
+
this.keys.set(k.kid, k.key);
|
|
20
|
+
}
|
|
21
|
+
rotateTo(k) {
|
|
22
|
+
this.active = k;
|
|
23
|
+
this.keys.set(k.kid, k.key);
|
|
24
|
+
}
|
|
25
|
+
encrypt(plaintext, opts) {
|
|
26
|
+
const iv = node_crypto_1.default.randomBytes(12);
|
|
27
|
+
const cipher = node_crypto_1.default.createCipheriv('aes-256-gcm', this.active.key, iv);
|
|
28
|
+
const data = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
|
|
29
|
+
const tag = cipher.getAuthTag();
|
|
30
|
+
return {
|
|
31
|
+
alg: 'A256GCM',
|
|
32
|
+
kid: this.active.kid,
|
|
33
|
+
iv: iv.toString('base64url'),
|
|
34
|
+
tag: tag.toString('base64url'),
|
|
35
|
+
data: data.toString('base64url'),
|
|
36
|
+
exp: opts?.exp,
|
|
37
|
+
meta: opts?.meta,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
decrypt(blob) {
|
|
41
|
+
const key = this.keys.get(blob.kid);
|
|
42
|
+
if (!key)
|
|
43
|
+
throw new Error(`vault_unknown_kid:${blob.kid}`);
|
|
44
|
+
const iv = Buffer.from(blob.iv, 'base64url');
|
|
45
|
+
const tag = Buffer.from(blob.tag, 'base64url');
|
|
46
|
+
const data = Buffer.from(blob.data, 'base64url');
|
|
47
|
+
const decipher = node_crypto_1.default.createDecipheriv('aes-256-gcm', key, iv);
|
|
48
|
+
decipher.setAuthTag(tag);
|
|
49
|
+
const out = Buffer.concat([decipher.update(data), decipher.final()]);
|
|
50
|
+
return out.toString('utf8');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.TokenVault = TokenVault;
|
|
54
|
+
//# sourceMappingURL=token.vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.vault.js","sourceRoot":"","sources":["../../../../src/auth/session/token.vault.ts"],"names":[],"mappings":";;;;AAAA,8BAA8B;AAC9B,sEAAiC;AAcjC,MAAa,UAAU;IACrB,0CAA0C;IAClC,MAAM,CAAW;IACzB,6DAA6D;IACrD,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,gCAAgC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,QAAQ,CAAC,CAAW;QAClB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,IAAuD;QAChF,MAAM,EAAE,GAAG,qBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,qBAAM,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,OAAO;YACL,GAAG,EAAE,SAAS;YACd,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;YACpB,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC5B,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC9B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;YAChC,GAAG,EAAE,IAAI,EAAE,GAAG;YACd,IAAI,EAAE,IAAI,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAa;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,qBAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;CACF;AA/CD,gCA+CC","sourcesContent":["// auth/session/token.vault.ts\nimport crypto from 'node:crypto';\n\nexport type EncBlob = {\n alg: 'A256GCM';\n kid: string; // master key id\n iv: string; // base64url\n tag: string; // base64url\n data: string; // base64url\n exp?: number; // optional epoch seconds\n meta?: Record<string, unknown>;\n};\n\nexport type VaultKey = { kid: string; key: Buffer };\n\nexport class TokenVault {\n /** Active key used for new encryptions */\n private active: VaultKey;\n /** All known keys by kid for decryption (includes active) */\n private keys = new Map<string, Buffer>();\n\n constructor(keys: VaultKey[]) {\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new Error('TokenVault requires at least one key');\n }\n // first is active by convention\n this.active = keys[0];\n for (const k of keys) this.keys.set(k.kid, k.key);\n }\n\n rotateTo(k: VaultKey) {\n this.active = k;\n this.keys.set(k.kid, k.key);\n }\n\n encrypt(plaintext: string, opts?: { exp?: number; meta?: Record<string, unknown> }): EncBlob {\n const iv = crypto.randomBytes(12);\n const cipher = crypto.createCipheriv('aes-256-gcm', this.active.key, iv);\n const data = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n return {\n alg: 'A256GCM',\n kid: this.active.kid,\n iv: iv.toString('base64url'),\n tag: tag.toString('base64url'),\n data: data.toString('base64url'),\n exp: opts?.exp,\n meta: opts?.meta,\n };\n }\n\n decrypt(blob: EncBlob): string {\n const key = this.keys.get(blob.kid);\n if (!key) throw new Error(`vault_unknown_kid:${blob.kid}`);\n const iv = Buffer.from(blob.iv, 'base64url');\n const tag = Buffer.from(blob.tag, 'base64url');\n const data = Buffer.from(blob.data, 'base64url');\n const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);\n decipher.setAuthTag(tag);\n const out = Buffer.concat([decipher.update(data), decipher.final()]);\n return out.toString('utf8');\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { UserClaim } from '../../../common';
|
|
2
|
+
export declare function isJwt(token: string | undefined): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* If the token is a JWT, returns the raw signature segment (3rd part) as base64url.
|
|
5
|
+
* Otherwise, returns a stable SHA-256(base64url) fingerprint of the whole token,
|
|
6
|
+
* so we can still bind a session id to "this Authorization" deterministically.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getTokenSignatureFingerprint(token: string): string;
|
|
9
|
+
/** Best-effort typed user derivation from claims */
|
|
10
|
+
export declare function deriveTypedUser(claims: Record<string, any>): UserClaim;
|
|
11
|
+
export declare function extractBearerToken(header?: string): string | undefined;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isJwt = isJwt;
|
|
4
|
+
exports.getTokenSignatureFingerprint = getTokenSignatureFingerprint;
|
|
5
|
+
exports.deriveTypedUser = deriveTypedUser;
|
|
6
|
+
exports.extractBearerToken = extractBearerToken;
|
|
7
|
+
function isJwt(token) {
|
|
8
|
+
if (!token)
|
|
9
|
+
return false;
|
|
10
|
+
return token.split('.').length === 3;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* If the token is a JWT, returns the raw signature segment (3rd part) as base64url.
|
|
14
|
+
* Otherwise, returns a stable SHA-256(base64url) fingerprint of the whole token,
|
|
15
|
+
* so we can still bind a session id to "this Authorization" deterministically.
|
|
16
|
+
*/
|
|
17
|
+
function getTokenSignatureFingerprint(token) {
|
|
18
|
+
if (isJwt(token)) {
|
|
19
|
+
return token.split('.')[2];
|
|
20
|
+
}
|
|
21
|
+
const crypto = require('crypto');
|
|
22
|
+
const digest = crypto.createHash('sha256').update(token).digest('base64');
|
|
23
|
+
return digest.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
|
|
24
|
+
}
|
|
25
|
+
/** Safely extracts a claim value if it matches the expected type */
|
|
26
|
+
function extractClaimValue(claims, key, validator) {
|
|
27
|
+
const value = claims[key];
|
|
28
|
+
return validator(value) ? value : undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Type guards for claim validation */
|
|
31
|
+
const isString = (value) => typeof value === 'string';
|
|
32
|
+
const isNumber = (value) => typeof value === 'number';
|
|
33
|
+
const isStringOrStringArray = (value) => typeof value === 'string' || Array.isArray(value);
|
|
34
|
+
/** Best-effort typed user derivation from claims */
|
|
35
|
+
function deriveTypedUser(claims) {
|
|
36
|
+
return {
|
|
37
|
+
...claims,
|
|
38
|
+
iss: extractClaimValue(claims, 'iss', isString),
|
|
39
|
+
sid: extractClaimValue(claims, 'sid', isString),
|
|
40
|
+
sub: extractClaimValue(claims, 'sub', isString),
|
|
41
|
+
exp: extractClaimValue(claims, 'exp', isNumber),
|
|
42
|
+
iat: extractClaimValue(claims, 'iat', isNumber),
|
|
43
|
+
aud: extractClaimValue(claims, 'aud', isStringOrStringArray),
|
|
44
|
+
email: extractClaimValue(claims, 'email', isString),
|
|
45
|
+
preferred_username: extractClaimValue(claims, 'preferred_username', isString),
|
|
46
|
+
username: extractClaimValue(claims, 'username', isString),
|
|
47
|
+
name: extractClaimValue(claims, 'name', isString),
|
|
48
|
+
picture: extractClaimValue(claims, 'picture', isString),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function extractBearerToken(header) {
|
|
52
|
+
if (!header)
|
|
53
|
+
return undefined;
|
|
54
|
+
const m = header.match(/^\s*Bearer\s+(.+)\s*$/i);
|
|
55
|
+
return m ? m[1].trim() : undefined;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=auth-token.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-token.utils.js","sourceRoot":"","sources":["../../../../../src/auth/session/utils/auth-token.utils.ts"],"names":[],"mappings":";;AAGA,sBAGC;AAOD,oEAOC;AAmBD,0CAeC;AAED,gDAIC;AAzDD,SAAgB,KAAK,CAAC,KAAyB;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,SAAgB,4BAA4B,CAAC,KAAa;IACxD,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IAC9B,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAA4B,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,oEAAoE;AACpE,SAAS,iBAAiB,CACxB,MAA2B,EAC3B,GAAW,EACX,SAAqC;IAErC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,uCAAuC;AACvC,MAAM,QAAQ,GAAG,CAAC,KAAU,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;AAC5E,MAAM,QAAQ,GAAG,CAAC,KAAU,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;AAC5E,MAAM,qBAAqB,GAAG,CAAC,KAAU,EAA8B,EAAE,CACvE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEpD,oDAAoD;AACpD,SAAgB,eAAe,CAAC,MAA2B;IACzD,OAAO;QACL,GAAG,MAAM;QACT,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAE;QAChD,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC/C,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAE;QAChD,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC/C,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC/C,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC;QAC5D,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;QACnD,kBAAkB,EAAE,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,CAAC;QAC7E,QAAQ,EAAE,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;QACzD,IAAI,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;QACjD,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAe;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACjD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACrC,CAAC","sourcesContent":["// auth/session/utils/auth-token.utils.ts\nimport { UserClaim } from '../../../common';\n\nexport function isJwt(token: string | undefined): boolean {\n if (!token) return false;\n return token.split('.').length === 3;\n}\n\n/**\n * If the token is a JWT, returns the raw signature segment (3rd part) as base64url.\n * Otherwise, returns a stable SHA-256(base64url) fingerprint of the whole token,\n * so we can still bind a session id to \"this Authorization\" deterministically.\n */\nexport function getTokenSignatureFingerprint(token: string): string {\n if (isJwt(token)) {\n return token.split('.')[2]!;\n }\n const crypto = require('crypto') as typeof import('crypto');\n const digest = crypto.createHash('sha256').update(token).digest('base64');\n return digest.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\n/** Safely extracts a claim value if it matches the expected type */\nfunction extractClaimValue<T>(\n claims: Record<string, any>,\n key: string,\n validator: (value: any) => value is T,\n): T | undefined {\n const value = claims[key];\n return validator(value) ? value : undefined;\n}\n\n/** Type guards for claim validation */\nconst isString = (value: any): value is string => typeof value === 'string';\nconst isNumber = (value: any): value is number => typeof value === 'number';\nconst isStringOrStringArray = (value: any): value is string | string[] =>\n typeof value === 'string' || Array.isArray(value);\n\n/** Best-effort typed user derivation from claims */\nexport function deriveTypedUser(claims: Record<string, any>): UserClaim {\n return {\n ...claims,\n iss: extractClaimValue(claims, 'iss', isString)!,\n sid: extractClaimValue(claims, 'sid', isString),\n sub: extractClaimValue(claims, 'sub', isString)!,\n exp: extractClaimValue(claims, 'exp', isNumber),\n iat: extractClaimValue(claims, 'iat', isNumber),\n aud: extractClaimValue(claims, 'aud', isStringOrStringArray),\n email: extractClaimValue(claims, 'email', isString),\n preferred_username: extractClaimValue(claims, 'preferred_username', isString),\n username: extractClaimValue(claims, 'username', isString),\n name: extractClaimValue(claims, 'name', isString),\n picture: extractClaimValue(claims, 'picture', isString),\n };\n}\n\nexport function extractBearerToken(header?: string): string | undefined {\n if (!header) return undefined;\n const m = header.match(/^\\s*Bearer\\s+(.+)\\s*$/i);\n return m ? m[1].trim() : undefined;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { HttpRequestIntent, SessionIdPayload } from '../../../common';
|
|
2
|
+
export declare function encryptJson(obj: unknown): string;
|
|
3
|
+
/**
|
|
4
|
+
* Validates an existing session header OR creates a fresh one.
|
|
5
|
+
* - Valid: nodeId matches local, authSig matches current Authorization
|
|
6
|
+
* - On any mismatch/decrypt error → generate new
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseSessionHeader(sessionHeader: string | undefined, token: string): {
|
|
9
|
+
id: string;
|
|
10
|
+
payload: SessionIdPayload;
|
|
11
|
+
} | undefined;
|
|
12
|
+
export declare function createSessionId(protocol: HttpRequestIntent, token: string): {
|
|
13
|
+
id: string;
|
|
14
|
+
payload: SessionIdPayload;
|
|
15
|
+
};
|
|
16
|
+
export declare function generateSessionCookie(sessionId: string, ttlInMinutes?: number): string;
|
|
17
|
+
export declare function extractSessionFromCookie(cookie?: string): string | undefined;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encryptJson = encryptJson;
|
|
4
|
+
exports.parseSessionHeader = parseSessionHeader;
|
|
5
|
+
exports.createSessionId = createSessionId;
|
|
6
|
+
exports.generateSessionCookie = generateSessionCookie;
|
|
7
|
+
exports.extractSessionFromCookie = extractSessionFromCookie;
|
|
8
|
+
// auth/session/utils/session-id.utils.ts
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
const tiny_ttl_cache_1 = require("./tiny-ttl-cache");
|
|
11
|
+
const auth_token_utils_1 = require("./auth-token.utils");
|
|
12
|
+
// 5s TTL cache for decrypted headers
|
|
13
|
+
const cache = new tiny_ttl_cache_1.TinyTtlCache(5000);
|
|
14
|
+
// Single-process machine id generated at server launch
|
|
15
|
+
const MACHINE_ID = (() => {
|
|
16
|
+
// Prefer an injected env (stable across restarts) if you have one; else random per launch:
|
|
17
|
+
return process.env['MACHINE_ID'] || (0, crypto_1.randomUUID)(); // TODO: move to gateway config module
|
|
18
|
+
})();
|
|
19
|
+
// Symmetric key derived from secret or machine id (stable for the process)
|
|
20
|
+
function getKey() {
|
|
21
|
+
const base = process.env['MCP_SESSION_SECRET'] || MACHINE_ID; // TODO: move to gateway config module
|
|
22
|
+
return (0, crypto_1.createHash)('sha256').update(base).digest(); // 32 bytes
|
|
23
|
+
}
|
|
24
|
+
function b64urlEncode(buf) {
|
|
25
|
+
return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
|
|
26
|
+
}
|
|
27
|
+
function b64urlDecode(s) {
|
|
28
|
+
const pad = 4 - (s.length % 4);
|
|
29
|
+
const base64 = s.replace(/-/g, '+').replace(/_/g, '/') + (pad < 4 ? '='.repeat(pad) : '');
|
|
30
|
+
return Buffer.from(base64, 'base64');
|
|
31
|
+
}
|
|
32
|
+
function encryptJson(obj) {
|
|
33
|
+
const key = getKey();
|
|
34
|
+
const iv = (0, crypto_1.randomBytes)(12); // AES-GCM 96-bit IV
|
|
35
|
+
const cipher = (0, crypto_1.createCipheriv)('aes-256-gcm', key, iv);
|
|
36
|
+
const pt = Buffer.from(JSON.stringify(obj), 'utf8');
|
|
37
|
+
const ct = Buffer.concat([cipher.update(pt), cipher.final()]);
|
|
38
|
+
const tag = cipher.getAuthTag();
|
|
39
|
+
// Pack iv.tag.ct as base64url(iv.tag.ct)
|
|
40
|
+
return `${b64urlEncode(iv)}.${b64urlEncode(tag)}.${b64urlEncode(ct)}`;
|
|
41
|
+
}
|
|
42
|
+
function decryptSessionId(sessionId, sig) {
|
|
43
|
+
const key = getKey();
|
|
44
|
+
const [ivB64, tagB64, ctB64] = sessionId.split('.');
|
|
45
|
+
if (!ivB64 || !tagB64 || !ctB64)
|
|
46
|
+
return null;
|
|
47
|
+
try {
|
|
48
|
+
const iv = b64urlDecode(ivB64);
|
|
49
|
+
const tag = b64urlDecode(tagB64);
|
|
50
|
+
const ct = b64urlDecode(ctB64);
|
|
51
|
+
const decipher = (0, crypto_1.createDecipheriv)('aes-256-gcm', key, iv);
|
|
52
|
+
decipher.setAuthTag(tag);
|
|
53
|
+
const pt = Buffer.concat([decipher.update(ct), decipher.final()]);
|
|
54
|
+
const dec = JSON.parse(pt.toString('utf8'));
|
|
55
|
+
if (typeof dec.nodeId === 'string' &&
|
|
56
|
+
typeof dec.authSig === 'string' &&
|
|
57
|
+
typeof dec.uuid === 'string' &&
|
|
58
|
+
typeof dec.iat === 'number' &&
|
|
59
|
+
dec.authSig === sig) {
|
|
60
|
+
return dec;
|
|
61
|
+
}
|
|
62
|
+
throw new Error('Invalid session id');
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function nowSec() {
|
|
69
|
+
return Math.floor(Date.now() / 1000);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validates an existing session header OR creates a fresh one.
|
|
73
|
+
* - Valid: nodeId matches local, authSig matches current Authorization
|
|
74
|
+
* - On any mismatch/decrypt error → generate new
|
|
75
|
+
*/
|
|
76
|
+
function parseSessionHeader(sessionHeader, token) {
|
|
77
|
+
const currentAuthSig = (0, auth_token_utils_1.getTokenSignatureFingerprint)(token);
|
|
78
|
+
if (sessionHeader) {
|
|
79
|
+
const cached = cache.get(sessionHeader);
|
|
80
|
+
if (cached) {
|
|
81
|
+
if (cached.authSig === currentAuthSig) {
|
|
82
|
+
return { id: sessionHeader, payload: cached };
|
|
83
|
+
}
|
|
84
|
+
// fallthrough to regenerate if mismatch
|
|
85
|
+
}
|
|
86
|
+
const dec = decryptSessionId(sessionHeader, currentAuthSig);
|
|
87
|
+
if (dec) {
|
|
88
|
+
cache.set(sessionHeader, dec);
|
|
89
|
+
return { id: sessionHeader, payload: dec };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
// // Create fresh
|
|
94
|
+
// const decodedSse: SessionIdPayload = {
|
|
95
|
+
// nodeId: MACHINE_ID,
|
|
96
|
+
// authSig: currentAuthSig,
|
|
97
|
+
// uuid: randomUUID(),
|
|
98
|
+
// iat: nowSec(),
|
|
99
|
+
// };
|
|
100
|
+
// const header = encryptJson(decoded);
|
|
101
|
+
// const headerSse = encryptJson(decodedSse);
|
|
102
|
+
// cache.set(header, decoded);
|
|
103
|
+
// cache.set(headerSse, decodedSse);
|
|
104
|
+
// return { header, decoded, headerSse, isNew: true };
|
|
105
|
+
}
|
|
106
|
+
function createSessionId(protocol, token) {
|
|
107
|
+
const authSig = (0, auth_token_utils_1.getTokenSignatureFingerprint)(token);
|
|
108
|
+
const payload = {
|
|
109
|
+
nodeId: MACHINE_ID,
|
|
110
|
+
authSig,
|
|
111
|
+
uuid: (0, crypto_1.randomUUID)(),
|
|
112
|
+
iat: nowSec(),
|
|
113
|
+
protocol,
|
|
114
|
+
};
|
|
115
|
+
const id = encryptJson(payload);
|
|
116
|
+
cache.set(id, payload);
|
|
117
|
+
return { id, payload };
|
|
118
|
+
}
|
|
119
|
+
function generateSessionCookie(sessionId, ttlInMinutes = 60 * 24) {
|
|
120
|
+
const expires = new Date(Date.now() + ttlInMinutes * 60 * 1000).toUTCString();
|
|
121
|
+
return `mcp_session_id=${sessionId}; Path=/; Expires=${expires}; HttpOnly; SameSite=Lax`;
|
|
122
|
+
}
|
|
123
|
+
function extractSessionFromCookie(cookie) {
|
|
124
|
+
if (!cookie)
|
|
125
|
+
return undefined;
|
|
126
|
+
const m = cookie.match(/(^|;)\s*mcp_session_id\s*=\s*([^;]*)/);
|
|
127
|
+
return m ? m[2] : undefined;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=session-id.utils.js.map
|