@frontmcp/sdk 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -18
- package/package.json +20 -5
- package/src/app/app.registry.d.ts +3 -2
- package/src/app/app.registry.js +3 -1
- package/src/app/app.registry.js.map +1 -1
- package/src/app/instances/app.local.instance.js +2 -2
- package/src/app/instances/app.local.instance.js.map +1 -1
- package/src/auth/auth.registry.d.ts +34 -2
- package/src/auth/auth.registry.js +162 -24
- package/src/auth/auth.registry.js.map +1 -1
- package/src/auth/auth.utils.js +8 -9
- package/src/auth/auth.utils.js.map +1 -1
- package/src/auth/authorization/authorization.class.d.ts +125 -0
- package/src/auth/authorization/authorization.class.js +224 -0
- package/src/auth/authorization/authorization.class.js.map +1 -0
- package/src/auth/authorization/authorization.types.d.ts +300 -0
- package/src/auth/authorization/authorization.types.js +79 -0
- package/src/auth/authorization/authorization.types.js.map +1 -0
- package/src/auth/authorization/index.d.ts +5 -0
- package/src/auth/authorization/index.js +19 -0
- package/src/auth/authorization/index.js.map +1 -0
- package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
- package/src/auth/authorization/orchestrated.authorization.js +306 -0
- package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
- package/src/auth/authorization/public.authorization.d.ts +91 -0
- package/src/auth/authorization/public.authorization.js +132 -0
- package/src/auth/authorization/public.authorization.js.map +1 -0
- package/src/auth/authorization/transparent.authorization.d.ts +130 -0
- package/src/auth/authorization/transparent.authorization.js +147 -0
- package/src/auth/authorization/transparent.authorization.js.map +1 -0
- package/src/auth/consent/consent.types.d.ts +111 -0
- package/src/auth/consent/consent.types.js +119 -0
- package/src/auth/consent/consent.types.js.map +1 -0
- package/src/auth/consent/index.d.ts +1 -0
- package/src/auth/consent/index.js +13 -0
- package/src/auth/consent/index.js.map +1 -0
- package/src/auth/detection/auth-provider-detection.d.ts +84 -0
- package/src/auth/detection/auth-provider-detection.js +230 -0
- package/src/auth/detection/auth-provider-detection.js.map +1 -0
- package/src/auth/detection/index.d.ts +1 -0
- package/src/auth/detection/index.js +15 -0
- package/src/auth/detection/index.js.map +1 -0
- package/src/auth/flows/auth.verify.flow.d.ts +110 -0
- package/src/auth/flows/auth.verify.flow.js +379 -0
- package/src/auth/flows/auth.verify.flow.js.map +1 -0
- package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
- package/src/auth/flows/oauth.authorize.flow.js +701 -33
- package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
- package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
- package/src/auth/flows/oauth.callback.flow.js +357 -0
- package/src/auth/flows/oauth.callback.flow.js.map +1 -0
- package/src/auth/flows/oauth.register.flow.d.ts +32 -125
- package/src/auth/flows/oauth.token.flow.d.ts +52 -154
- package/src/auth/flows/oauth.token.flow.js +193 -55
- package/src/auth/flows/oauth.token.flow.js.map +1 -1
- package/src/auth/flows/session.verify.flow.d.ts +66 -321
- package/src/auth/flows/session.verify.flow.js +107 -18
- package/src/auth/flows/session.verify.flow.js.map +1 -1
- package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
- package/src/auth/flows/well-known.jwks.flow.js +15 -8
- package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
- package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
- package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
- package/src/auth/flows/well-known.prm.flow.js +3 -4
- package/src/auth/flows/well-known.prm.flow.js.map +1 -1
- package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
- package/src/auth/instances/instance.local-primary-auth.js +236 -6
- package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
- package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
- package/src/auth/instances/instance.remote-primary-auth.js +2 -2
- package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
- package/src/auth/session/authorization-vault.d.ts +611 -0
- package/src/auth/session/authorization-vault.js +817 -0
- package/src/auth/session/authorization-vault.js.map +1 -0
- package/src/auth/session/authorization.store.d.ts +301 -0
- package/src/auth/session/authorization.store.js +323 -0
- package/src/auth/session/authorization.store.js.map +1 -0
- package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
- package/src/auth/session/encrypted-authorization-vault.js +493 -0
- package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
- package/src/auth/session/index.d.ts +4 -4
- package/src/auth/session/index.js +11 -7
- package/src/auth/session/index.js.map +1 -1
- package/src/auth/session/session.schema.d.ts +1 -1
- package/src/auth/session/session.service.d.ts +1 -1
- package/src/auth/session/transport-session.manager.d.ts +101 -0
- package/src/auth/session/transport-session.manager.js +300 -0
- package/src/auth/session/transport-session.manager.js.map +1 -0
- package/src/auth/session/transport-session.types.d.ts +457 -0
- package/src/auth/session/transport-session.types.js +110 -0
- package/src/auth/session/transport-session.types.js.map +1 -0
- package/src/auth/session/utils/session-id.utils.d.ts +14 -2
- package/src/auth/session/utils/session-id.utils.js +68 -19
- package/src/auth/session/utils/session-id.utils.js.map +1 -1
- package/src/auth/session/vault-encryption.d.ts +189 -0
- package/src/auth/session/vault-encryption.js +263 -0
- package/src/auth/session/vault-encryption.js.map +1 -0
- package/src/auth/ui/base-layout.d.ts +188 -0
- package/src/auth/ui/base-layout.js +292 -0
- package/src/auth/ui/base-layout.js.map +1 -0
- package/src/auth/ui/htmx-templates.d.ts +135 -0
- package/src/auth/ui/htmx-templates.js +433 -0
- package/src/auth/ui/htmx-templates.js.map +1 -0
- package/src/auth/ui/index.d.ts +11 -0
- package/src/auth/ui/index.js +35 -0
- package/src/auth/ui/index.js.map +1 -0
- package/src/auth/utils/audience.validator.d.ts +129 -0
- package/src/auth/utils/audience.validator.js +196 -0
- package/src/auth/utils/audience.validator.js.map +1 -0
- package/src/auth/utils/index.d.ts +2 -0
- package/src/auth/utils/index.js +7 -0
- package/src/auth/utils/index.js.map +1 -0
- package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
- package/src/auth/utils/www-authenticate.utils.js +183 -0
- package/src/auth/utils/www-authenticate.utils.js.map +1 -0
- package/src/common/common.schema.d.ts +2 -16
- package/src/common/constants.d.ts +3 -0
- package/src/common/constants.js +6 -1
- package/src/common/constants.js.map +1 -1
- package/src/common/decorators/decorator-utils.d.ts +131 -0
- package/src/common/decorators/decorator-utils.js +195 -0
- package/src/common/decorators/decorator-utils.js.map +1 -0
- package/src/common/decorators/front-mcp.decorator.js +3 -2
- package/src/common/decorators/front-mcp.decorator.js.map +1 -1
- package/src/common/decorators/hook.decorator.d.ts +58 -2
- package/src/common/decorators/hook.decorator.js +127 -17
- package/src/common/decorators/hook.decorator.js.map +1 -1
- package/src/common/decorators/plugin.decorator.d.ts +1 -1
- package/src/common/decorators/plugin.decorator.js +11 -10
- package/src/common/decorators/plugin.decorator.js.map +1 -1
- package/src/common/decorators/resource.decorator.d.ts +32 -3
- package/src/common/decorators/resource.decorator.js +46 -4
- package/src/common/decorators/resource.decorator.js.map +1 -1
- package/src/common/decorators/tool.decorator.d.ts +54 -5
- package/src/common/decorators/tool.decorator.js.map +1 -1
- package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
- package/src/common/dynamic/dynamic.plugin.js +7 -1
- package/src/common/dynamic/dynamic.plugin.js.map +1 -1
- package/src/common/entries/prompt.entry.d.ts +46 -2
- package/src/common/entries/prompt.entry.js +10 -0
- package/src/common/entries/prompt.entry.js.map +1 -1
- package/src/common/entries/resource.entry.d.ts +69 -6
- package/src/common/entries/resource.entry.js +27 -3
- package/src/common/entries/resource.entry.js.map +1 -1
- package/src/common/entries/scope.entry.d.ts +5 -1
- package/src/common/entries/scope.entry.js +3 -3
- package/src/common/entries/scope.entry.js.map +1 -1
- package/src/common/flow/flow.utils.d.ts +56 -0
- package/src/common/flow/flow.utils.js +96 -0
- package/src/common/flow/flow.utils.js.map +1 -0
- package/src/common/index.d.ts +2 -2
- package/src/common/index.js +2 -2
- package/src/common/index.js.map +1 -1
- package/src/common/interfaces/execution-context.interface.d.ts +59 -0
- package/src/common/interfaces/execution-context.interface.js +81 -0
- package/src/common/interfaces/execution-context.interface.js.map +1 -0
- package/src/common/interfaces/flow.interface.d.ts +1 -1
- package/src/common/interfaces/flow.interface.js.map +1 -1
- package/src/common/interfaces/index.d.ts +1 -0
- package/src/common/interfaces/index.js +1 -0
- package/src/common/interfaces/index.js.map +1 -1
- package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
- package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
- package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
- package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
- package/src/common/interfaces/internal/registry.interface.js.map +1 -1
- package/src/common/interfaces/plugin.interface.js.map +1 -1
- package/src/common/interfaces/prompt.interface.d.ts +53 -4
- package/src/common/interfaces/prompt.interface.js +78 -0
- package/src/common/interfaces/prompt.interface.js.map +1 -1
- package/src/common/interfaces/resource.interface.d.ts +47 -17
- package/src/common/interfaces/resource.interface.js +53 -0
- package/src/common/interfaces/resource.interface.js.map +1 -1
- package/src/common/interfaces/tool.interface.d.ts +39 -22
- package/src/common/interfaces/tool.interface.js +61 -34
- package/src/common/interfaces/tool.interface.js.map +1 -1
- package/src/common/metadata/adapter.metadata.d.ts +1 -9
- package/src/common/metadata/app.metadata.d.ts +425 -730
- package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
- package/src/common/metadata/flow.metadata.d.ts +10 -25
- package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
- package/src/common/metadata/front-mcp.metadata.js +6 -4
- package/src/common/metadata/front-mcp.metadata.js.map +1 -1
- package/src/common/metadata/hook.metadata.d.ts +1 -1
- package/src/common/metadata/hook.metadata.js.map +1 -1
- package/src/common/metadata/index.d.ts +1 -0
- package/src/common/metadata/index.js +1 -0
- package/src/common/metadata/index.js.map +1 -1
- package/src/common/metadata/logger.metadata.d.ts +1 -9
- package/src/common/metadata/plugin.metadata.d.ts +8 -30
- package/src/common/metadata/prompt.metadata.d.ts +4 -161
- package/src/common/metadata/provider.metadata.d.ts +2 -12
- package/src/common/metadata/resource.metadata.d.ts +6 -98
- package/src/common/metadata/resource.metadata.js +15 -6
- package/src/common/metadata/resource.metadata.js.map +1 -1
- package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
- package/src/common/metadata/tool-ui.metadata.js +12 -0
- package/src/common/metadata/tool-ui.metadata.js.map +1 -0
- package/src/common/metadata/tool.metadata.d.ts +78 -199
- package/src/common/metadata/tool.metadata.js +11 -14
- package/src/common/metadata/tool.metadata.js.map +1 -1
- package/src/common/providers/base-config.provider.d.ts +84 -0
- package/src/common/providers/base-config.provider.js +128 -0
- package/src/common/providers/base-config.provider.js.map +1 -0
- package/src/common/records/plugin.record.d.ts +5 -6
- package/src/common/records/plugin.record.js.map +1 -1
- package/src/common/records/prompt.record.js.map +1 -1
- package/src/common/records/resource.record.d.ts +17 -1
- package/src/common/records/resource.record.js +12 -6
- package/src/common/records/resource.record.js.map +1 -1
- package/src/common/records/tool.record.js.map +1 -1
- package/src/common/schemas/annotated-class.schema.d.ts +9 -9
- package/src/common/schemas/annotated-class.schema.js +92 -27
- package/src/common/schemas/annotated-class.schema.js.map +1 -1
- package/src/common/schemas/http-input.schema.d.ts +6 -30
- package/src/common/schemas/http-output.schema.d.ts +326 -1630
- package/src/common/schemas/http-output.schema.js +39 -1
- package/src/common/schemas/http-output.schema.js.map +1 -1
- package/src/common/tokens/front-mcp.tokens.js +4 -1
- package/src/common/tokens/front-mcp.tokens.js.map +1 -1
- package/src/common/tokens/resource.tokens.d.ts +2 -0
- package/src/common/tokens/resource.tokens.js +4 -1
- package/src/common/tokens/resource.tokens.js.map +1 -1
- package/src/common/tokens/tool.tokens.d.ts +2 -0
- package/src/common/tokens/tool.tokens.js +2 -0
- package/src/common/tokens/tool.tokens.js.map +1 -1
- package/src/common/types/auth/jwt.types.d.ts +5 -31
- package/src/common/types/auth/session.types.d.ts +97 -192
- package/src/common/types/auth/session.types.js +24 -11
- package/src/common/types/auth/session.types.js.map +1 -1
- package/src/common/types/options/auth.options.d.ts +1013 -490
- package/src/common/types/options/auth.options.js +554 -36
- package/src/common/types/options/auth.options.js.map +1 -1
- package/src/common/types/options/http.options.d.ts +1 -9
- package/src/common/types/options/logging.options.d.ts +7 -13
- package/src/common/types/options/logging.options.js +4 -0
- package/src/common/types/options/logging.options.js.map +1 -1
- package/src/common/types/options/server-info.options.d.ts +3 -31
- package/src/common/types/options/session.options.d.ts +90 -10
- package/src/common/types/options/session.options.js +26 -3
- package/src/common/types/options/session.options.js.map +1 -1
- package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
- package/src/common/utils/decide-request-intent.utils.js +88 -23
- package/src/common/utils/decide-request-intent.utils.js.map +1 -1
- package/src/completion/flows/complete.flow.d.ts +74 -0
- package/src/completion/flows/complete.flow.js +199 -0
- package/src/completion/flows/complete.flow.js.map +1 -0
- package/src/errors/authorization-required.error.d.ts +189 -0
- package/src/errors/authorization-required.error.js +274 -0
- package/src/errors/authorization-required.error.js.map +1 -0
- package/src/errors/index.d.ts +2 -1
- package/src/errors/index.js +17 -1
- package/src/errors/index.js.map +1 -1
- package/src/errors/mcp.error.d.ts +101 -1
- package/src/errors/mcp.error.js +147 -2
- package/src/errors/mcp.error.js.map +1 -1
- package/src/flows/flow.instance.js +4 -3
- package/src/flows/flow.instance.js.map +1 -1
- package/src/flows/flow.registry.js.map +1 -1
- package/src/flows/flow.stages.js +14 -11
- package/src/flows/flow.stages.js.map +1 -1
- package/src/front-mcp/front-mcp.providers.d.ts +464 -102
- package/src/front-mcp/front-mcp.providers.js +3 -5
- package/src/front-mcp/front-mcp.providers.js.map +1 -1
- package/src/hooks/hook.instance.d.ts +1 -1
- package/src/hooks/hook.instance.js +5 -2
- package/src/hooks/hook.instance.js.map +1 -1
- package/src/hooks/hook.registry.js +7 -5
- package/src/hooks/hook.registry.js.map +1 -1
- package/src/index.d.ts +28 -9
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/logger/instances/instance.logger.js +3 -2
- package/src/logger/instances/instance.logger.js.map +1 -1
- package/src/logger/logger.registry.js +7 -2
- package/src/logger/logger.registry.js.map +1 -1
- package/src/logging/flows/set-level.flow.d.ts +62 -0
- package/src/logging/flows/set-level.flow.js +108 -0
- package/src/logging/flows/set-level.flow.js.map +1 -0
- package/src/mcp-apps/csp.d.ts +111 -0
- package/src/mcp-apps/csp.js +267 -0
- package/src/mcp-apps/csp.js.map +1 -0
- package/src/mcp-apps/index.d.ts +23 -0
- package/src/mcp-apps/index.js +91 -0
- package/src/mcp-apps/index.js.map +1 -0
- package/src/mcp-apps/schemas.d.ts +403 -0
- package/src/mcp-apps/schemas.js +345 -0
- package/src/mcp-apps/schemas.js.map +1 -0
- package/src/mcp-apps/template.d.ts +94 -0
- package/src/mcp-apps/template.js +419 -0
- package/src/mcp-apps/template.js.map +1 -0
- package/src/mcp-apps/types.d.ts +323 -0
- package/src/mcp-apps/types.js +59 -0
- package/src/mcp-apps/types.js.map +1 -0
- package/src/notification/index.d.ts +1 -0
- package/src/notification/index.js +13 -0
- package/src/notification/index.js.map +1 -0
- package/src/notification/notification.service.d.ts +378 -0
- package/src/notification/notification.service.js +727 -0
- package/src/notification/notification.service.js.map +1 -0
- package/src/plugin/plugin.registry.js +12 -9
- package/src/plugin/plugin.registry.js.map +1 -1
- package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
- package/src/prompt/flows/get-prompt.flow.js +214 -0
- package/src/prompt/flows/get-prompt.flow.js.map +1 -0
- package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
- package/src/prompt/flows/prompts-list.flow.js +176 -0
- package/src/prompt/flows/prompts-list.flow.js.map +1 -0
- package/src/prompt/index.d.ts +7 -0
- package/src/prompt/index.js +17 -0
- package/src/prompt/index.js.map +1 -0
- package/src/prompt/prompt.events.d.ts +17 -0
- package/src/prompt/prompt.events.js +25 -0
- package/src/prompt/prompt.events.js.map +1 -0
- package/src/prompt/prompt.instance.d.ts +30 -0
- package/src/prompt/prompt.instance.js +120 -0
- package/src/prompt/prompt.instance.js.map +1 -0
- package/src/prompt/prompt.registry.d.ts +79 -12
- package/src/prompt/prompt.registry.js +360 -15
- package/src/prompt/prompt.registry.js.map +1 -1
- package/src/prompt/prompt.types.d.ts +26 -0
- package/src/prompt/prompt.types.js +11 -0
- package/src/prompt/prompt.types.js.map +1 -0
- package/src/prompt/prompt.utils.d.ts +26 -0
- package/src/prompt/prompt.utils.js +136 -0
- package/src/prompt/prompt.utils.js.map +1 -0
- package/src/provider/provider.registry.d.ts +12 -5
- package/src/provider/provider.registry.js +30 -138
- package/src/provider/provider.registry.js.map +1 -1
- package/src/regsitry/registry.base.d.ts +1 -1
- package/src/regsitry/registry.base.js.map +1 -1
- package/src/resource/flows/read-resource.flow.d.ts +91 -0
- package/src/resource/flows/read-resource.flow.js +270 -0
- package/src/resource/flows/read-resource.flow.js.map +1 -0
- package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
- package/src/resource/flows/resource-templates-list.flow.js +191 -0
- package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
- package/src/resource/flows/resources-list.flow.d.ts +64 -0
- package/src/resource/flows/resources-list.flow.js +196 -0
- package/src/resource/flows/resources-list.flow.js.map +1 -0
- package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
- package/src/resource/flows/subscribe-resource.flow.js +123 -0
- package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
- package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
- package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
- package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
- package/src/resource/index.d.ts +8 -0
- package/src/resource/index.js +20 -0
- package/src/resource/index.js.map +1 -0
- package/src/resource/resource.events.d.ts +24 -0
- package/src/resource/resource.events.js +17 -0
- package/src/resource/resource.events.js.map +1 -0
- package/src/resource/resource.instance.d.ts +35 -0
- package/src/resource/resource.instance.js +163 -0
- package/src/resource/resource.instance.js.map +1 -0
- package/src/resource/resource.registry.d.ts +106 -12
- package/src/resource/resource.registry.js +449 -13
- package/src/resource/resource.registry.js.map +1 -1
- package/src/resource/resource.types.d.ts +35 -0
- package/src/resource/resource.types.js +11 -0
- package/src/resource/resource.types.js.map +1 -0
- package/src/resource/resource.utils.d.ts +30 -0
- package/src/resource/resource.utils.js +151 -0
- package/src/resource/resource.utils.js.map +1 -0
- package/src/scope/flows/http.request.flow.d.ts +48 -330
- package/src/scope/flows/http.request.flow.js +306 -78
- package/src/scope/flows/http.request.flow.js.map +1 -1
- package/src/scope/scope.instance.d.ts +12 -0
- package/src/scope/scope.instance.js +145 -15
- package/src/scope/scope.instance.js.map +1 -1
- package/src/tool/flows/call-tool.flow.d.ts +64 -1110
- package/src/tool/flows/call-tool.flow.js +303 -15
- package/src/tool/flows/call-tool.flow.js.map +1 -1
- package/src/tool/flows/tools-list.flow.d.ts +32 -473
- package/src/tool/flows/tools-list.flow.js +121 -40
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.events.d.ts +8 -1
- package/src/tool/tool.events.js.map +1 -1
- package/src/tool/tool.instance.d.ts +3 -1
- package/src/tool/tool.instance.js +17 -3
- package/src/tool/tool.instance.js.map +1 -1
- package/src/tool/tool.registry.d.ts +7 -1
- package/src/tool/tool.registry.js +26 -10
- package/src/tool/tool.registry.js.map +1 -1
- package/src/tool/tool.types.d.ts +4 -4
- package/src/tool/tool.types.js.map +1 -1
- package/src/tool/tool.utils.d.ts +3 -12
- package/src/tool/tool.utils.js +39 -193
- package/src/tool/tool.utils.js.map +1 -1
- package/src/tool/ui/index.d.ts +22 -0
- package/src/tool/ui/index.js +63 -0
- package/src/tool/ui/index.js.map +1 -0
- package/src/tool/ui/platform-adapters.d.ts +10 -0
- package/src/tool/ui/platform-adapters.js +18 -0
- package/src/tool/ui/platform-adapters.js.map +1 -0
- package/src/tool/ui/template-helpers.d.ts +46 -0
- package/src/tool/ui/template-helpers.js +112 -0
- package/src/tool/ui/template-helpers.js.map +1 -0
- package/src/tool/ui/ui-resource-template.d.ts +34 -0
- package/src/tool/ui/ui-resource-template.js +64 -0
- package/src/tool/ui/ui-resource-template.js.map +1 -0
- package/src/tool/ui/ui-resource.handler.d.ts +74 -0
- package/src/tool/ui/ui-resource.handler.js +129 -0
- package/src/tool/ui/ui-resource.handler.js.map +1 -0
- package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.local.adapter.js +28 -7
- package/src/transport/adapters/transport.local.adapter.js.map +1 -1
- package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.sse.adapter.js +4 -3
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
- package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
- package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.d.ts +29 -63
- package/src/transport/flows/handle.sse.flow.js +78 -10
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
- package/src/transport/flows/handle.stateless-http.flow.js +102 -0
- package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
- package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
- package/src/transport/flows/handle.streamable-http.flow.js +158 -26
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
- package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
- package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
- package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
- package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/index.d.ts +517 -208
- package/src/transport/mcp-handlers/index.js +39 -2
- package/src/transport/mcp-handlers/index.js.map +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
- package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
- package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
- package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
- package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
- package/src/transport/transport.local.js +7 -2
- package/src/transport/transport.local.js.map +1 -1
- package/src/transport/transport.registry.d.ts +30 -0
- package/src/transport/transport.registry.js +84 -1
- package/src/transport/transport.registry.js.map +1 -1
- package/src/transport/transport.types.d.ts +3 -3
- package/src/transport/transport.types.js.map +1 -1
- package/src/utils/content.utils.d.ts +48 -0
- package/src/utils/content.utils.js +194 -0
- package/src/utils/content.utils.js.map +1 -0
- package/src/utils/index.d.ts +8 -0
- package/src/utils/index.js +55 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/lineage.utils.d.ts +40 -0
- package/src/utils/lineage.utils.js +82 -0
- package/src/utils/lineage.utils.js.map +1 -0
- package/src/utils/naming.utils.d.ts +46 -0
- package/src/utils/naming.utils.js +136 -0
- package/src/utils/naming.utils.js.map +1 -0
- package/src/utils/types.utils.d.ts +2 -2
- package/src/utils/types.utils.js.map +1 -1
- package/src/utils/uri-template.utils.d.ts +57 -0
- package/src/utils/uri-template.utils.js +113 -0
- package/src/utils/uri-template.utils.js.map +1 -0
- package/src/utils/uri-validation.utils.d.ts +40 -0
- package/src/utils/uri-validation.utils.js +76 -0
- package/src/utils/uri-validation.utils.js.map +1 -0
- package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
- package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/index.d.ts +0 -7
- package/src/__test-utils__/fixtures/index.js +0 -11
- package/src/__test-utils__/fixtures/index.js.map +0 -1
- package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
- package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
- package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
- package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
- package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
- package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
- package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
- package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
- package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
- package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
- package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
- package/src/__test-utils__/helpers/async.helpers.js +0 -112
- package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/index.d.ts +0 -6
- package/src/__test-utils__/helpers/index.js +0 -10
- package/src/__test-utils__/helpers/index.js.map +0 -1
- package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
- package/src/__test-utils__/helpers/setup.helpers.js +0 -106
- package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
- package/src/__test-utils__/index.d.ts +0 -9
- package/src/__test-utils__/index.js +0 -14
- package/src/__test-utils__/index.js.map +0 -1
- package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
- package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
- package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
- package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
- package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
- package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/index.d.ts +0 -8
- package/src/__test-utils__/mocks/index.js +0 -12
- package/src/__test-utils__/mocks/index.js.map +0 -1
- package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
- package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
- package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
- package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
- package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
- package/src/auth/path.utils.d.ts +0 -20
- package/src/auth/path.utils.js +0 -71
- package/src/auth/path.utils.js.map +0 -1
- package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
- package/src/common/decorators-old/async-with.decorator.js +0 -24
- package/src/common/decorators-old/async-with.decorator.js.map +0 -1
- package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/auth-hook.decorator.js +0 -27
- package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
- package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/session-hook.decorator.js +0 -27
- package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
|
@@ -3,26 +3,12 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare const RedirectSchema: z.ZodObject<{
|
|
4
4
|
status: z.ZodLiteral<302>;
|
|
5
5
|
location: z.ZodString;
|
|
6
|
-
},
|
|
7
|
-
status: 302;
|
|
8
|
-
location: string;
|
|
9
|
-
}, {
|
|
10
|
-
status: 302;
|
|
11
|
-
location: string;
|
|
12
|
-
}>;
|
|
6
|
+
}, z.core.$strip>;
|
|
13
7
|
export declare const NotFoundSchema: z.ZodObject<{
|
|
14
8
|
status: z.ZodLiteral<404>;
|
|
15
9
|
body: z.ZodAny;
|
|
16
10
|
message: z.ZodString;
|
|
17
|
-
},
|
|
18
|
-
message: string;
|
|
19
|
-
status: 404;
|
|
20
|
-
body?: any;
|
|
21
|
-
}, {
|
|
22
|
-
message: string;
|
|
23
|
-
status: 404;
|
|
24
|
-
body?: any;
|
|
25
|
-
}>;
|
|
11
|
+
}, z.core.$strip>;
|
|
26
12
|
type CommonResponseResult = z.infer<typeof RedirectSchema> | z.infer<typeof NotFoundSchema> | any;
|
|
27
13
|
export declare const commonSuccessResponseHandler: (res: ServerResponse, result: CommonResponseResult) => void;
|
|
28
14
|
export declare const commonFailResponseHandler: (res: ServerResponse, result: any) => void;
|
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export declare const MCP_SESSION_HOOKS = "mcp.plugin.sessionHooks";
|
|
2
2
|
export declare const MCP_AUTH_HOOKS = "mcp.plugin.sessionHooks";
|
|
3
|
+
export declare const META_ASYNC_WITH: unique symbol;
|
|
4
|
+
export declare const META_ASYNC_WITH_TOKENS: unique symbol;
|
|
5
|
+
export declare const DESIGN_PARAMTYPES = "design:paramtypes";
|
package/src/common/constants.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MCP_AUTH_HOOKS = exports.MCP_SESSION_HOOKS = void 0;
|
|
3
|
+
exports.DESIGN_PARAMTYPES = exports.META_ASYNC_WITH_TOKENS = exports.META_ASYNC_WITH = exports.MCP_AUTH_HOOKS = exports.MCP_SESSION_HOOKS = void 0;
|
|
4
4
|
// Plugin/global Tool hooks (method-level) metadata key
|
|
5
5
|
// Stored on plugin classes by @ToolHook decorator
|
|
6
6
|
exports.MCP_SESSION_HOOKS = 'mcp.plugin.sessionHooks';
|
|
7
7
|
exports.MCP_AUTH_HOOKS = 'mcp.plugin.sessionHooks';
|
|
8
|
+
// Metadata keys for async dependency injection
|
|
9
|
+
exports.META_ASYNC_WITH = Symbol('mcp.asyncWith');
|
|
10
|
+
exports.META_ASYNC_WITH_TOKENS = Symbol('mcp.asyncWithTokens');
|
|
11
|
+
// Reflect metadata key for design:paramtypes
|
|
12
|
+
exports.DESIGN_PARAMTYPES = 'design:paramtypes';
|
|
8
13
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/common/constants.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AACvD,kDAAkD;AACrC,QAAA,iBAAiB,GAAG,yBAAyB,CAAC;AAC9C,QAAA,cAAc,GAAG,yBAAyB,CAAC","sourcesContent":["// Plugin/global Tool hooks (method-level) metadata key\n// Stored on plugin classes by @ToolHook decorator\nexport const MCP_SESSION_HOOKS = 'mcp.plugin.sessionHooks';\nexport const MCP_AUTH_HOOKS = 'mcp.plugin.sessionHooks';\n\n"]}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/common/constants.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AACvD,kDAAkD;AACrC,QAAA,iBAAiB,GAAG,yBAAyB,CAAC;AAC9C,QAAA,cAAc,GAAG,yBAAyB,CAAC;AAExD,+CAA+C;AAClC,QAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAC1C,QAAA,sBAAsB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEpE,6CAA6C;AAChC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC","sourcesContent":["// Plugin/global Tool hooks (method-level) metadata key\n// Stored on plugin classes by @ToolHook decorator\nexport const MCP_SESSION_HOOKS = 'mcp.plugin.sessionHooks';\nexport const MCP_AUTH_HOOKS = 'mcp.plugin.sessionHooks';\n\n// Metadata keys for async dependency injection\nexport const META_ASYNC_WITH = Symbol('mcp.asyncWith');\nexport const META_ASYNC_WITH_TOKENS = Symbol('mcp.asyncWithTokens');\n\n// Reflect metadata key for design:paramtypes\nexport const DESIGN_PARAMTYPES = 'design:paramtypes';\n"]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decorator Utilities for Dual-Mode Support
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for creating decorators that work with both:
|
|
5
|
+
* - Legacy TypeScript decorators (experimentalDecorators: true)
|
|
6
|
+
* - TC39 Stage 3 decorators (native JS, used by esbuild/tsx)
|
|
7
|
+
*
|
|
8
|
+
* The key difference between the two modes:
|
|
9
|
+
*
|
|
10
|
+
* LEGACY TypeScript Method Decorator:
|
|
11
|
+
* (target: prototype, propertyKey: string, descriptor: PropertyDescriptor) => void
|
|
12
|
+
* - target is the class prototype (for instance methods) or class (for static)
|
|
13
|
+
* - propertyKey is the method name
|
|
14
|
+
* - descriptor is the property descriptor
|
|
15
|
+
*
|
|
16
|
+
* TC39 Stage 3 Method Decorator:
|
|
17
|
+
* (target: method, context: ClassMethodDecoratorContext) => method
|
|
18
|
+
* - target is the actual method function being decorated
|
|
19
|
+
* - context is an object with { kind, name, static, private, addInitializer }
|
|
20
|
+
* - The class isn't available during decoration (only via addInitializer at instance creation)
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Using the factory to create a dual-mode decorator
|
|
25
|
+
* const MyDecorator = createMethodDecorator<{ stage: string }>({
|
|
26
|
+
* createMetadata: (args, options) => ({
|
|
27
|
+
* methodName: args.methodName,
|
|
28
|
+
* stage: options.stage,
|
|
29
|
+
* }),
|
|
30
|
+
* onLegacyDecoration: (ctor, metadata) => {
|
|
31
|
+
* // Immediately register on class (legacy mode)
|
|
32
|
+
* registerOnClass(ctor, metadata);
|
|
33
|
+
* },
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Usage (works in both modes):
|
|
37
|
+
* class MyFlow {
|
|
38
|
+
* @MyDecorator({ stage: 'execute' })
|
|
39
|
+
* async execute() {}
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* TC39 Stage 3 Method Decorator Context
|
|
45
|
+
* @see https://github.com/tc39/proposal-decorators
|
|
46
|
+
*/
|
|
47
|
+
export interface TC39MethodContext {
|
|
48
|
+
readonly kind: 'method';
|
|
49
|
+
readonly name: string | symbol;
|
|
50
|
+
readonly static: boolean;
|
|
51
|
+
readonly private: boolean;
|
|
52
|
+
addInitializer(initializer: () => void): void;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* TC39 Stage 3 Class Decorator Context
|
|
56
|
+
*/
|
|
57
|
+
export interface TC39ClassContext {
|
|
58
|
+
readonly kind: 'class';
|
|
59
|
+
readonly name: string | undefined;
|
|
60
|
+
addInitializer(initializer: () => void): void;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Normalized arguments passed to method decorator handlers
|
|
64
|
+
*/
|
|
65
|
+
export interface MethodDecoratorArgs {
|
|
66
|
+
/** The method function being decorated */
|
|
67
|
+
method: Function;
|
|
68
|
+
/** Method name as string */
|
|
69
|
+
methodName: string;
|
|
70
|
+
/** Whether this is a static method */
|
|
71
|
+
isStatic: boolean;
|
|
72
|
+
/** Decorator mode */
|
|
73
|
+
mode: 'legacy' | 'tc39';
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Configuration for creating a dual-mode method decorator
|
|
77
|
+
*/
|
|
78
|
+
export interface MethodDecoratorConfig<TOptions, TMetadata> {
|
|
79
|
+
/**
|
|
80
|
+
* Create metadata from decorator arguments and options
|
|
81
|
+
*/
|
|
82
|
+
createMetadata: (args: MethodDecoratorArgs, options: TOptions) => TMetadata;
|
|
83
|
+
/**
|
|
84
|
+
* Called immediately during legacy decoration with access to the class
|
|
85
|
+
* Use this to register metadata directly on the class
|
|
86
|
+
*/
|
|
87
|
+
onLegacyDecoration?: (ctor: Function, metadata: TMetadata) => void;
|
|
88
|
+
/**
|
|
89
|
+
* Store pending metadata for TC39 mode (required)
|
|
90
|
+
* The metadata will be resolved later when the class is processed
|
|
91
|
+
*/
|
|
92
|
+
storePendingMetadata: (method: Function, metadata: TMetadata) => void;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if decorator context is TC39 Stage 3 style
|
|
96
|
+
*/
|
|
97
|
+
export declare function isTC39MethodContext(arg: unknown): arg is TC39MethodContext;
|
|
98
|
+
/**
|
|
99
|
+
* Check if decorator context is TC39 Stage 3 class context
|
|
100
|
+
*/
|
|
101
|
+
export declare function isTC39ClassContext(arg: unknown): arg is TC39ClassContext;
|
|
102
|
+
/**
|
|
103
|
+
* Creates a method decorator that works with both legacy TypeScript and TC39 Stage 3 decorators.
|
|
104
|
+
*
|
|
105
|
+
* For legacy decorators: onLegacyDecoration is called immediately with class constructor
|
|
106
|
+
* For TC39 decorators: storePendingMetadata is called, metadata resolved later via resolvePendingMetadataForClass
|
|
107
|
+
*/
|
|
108
|
+
export declare function createDualModeMethodDecorator<TOptions, TMetadata>(config: MethodDecoratorConfig<TOptions, TMetadata>): (options: TOptions) => MethodDecorator;
|
|
109
|
+
/**
|
|
110
|
+
* Storage for pending TC39 decorator metadata
|
|
111
|
+
* Generic class that can be instantiated for different metadata types
|
|
112
|
+
*/
|
|
113
|
+
export declare class PendingMetadataRegistry<T> {
|
|
114
|
+
private pending;
|
|
115
|
+
/**
|
|
116
|
+
* Store pending metadata for a method (TC39 mode)
|
|
117
|
+
*/
|
|
118
|
+
store(method: Function, metadata: T): void;
|
|
119
|
+
/**
|
|
120
|
+
* Get and optionally clear pending metadata for a method
|
|
121
|
+
*/
|
|
122
|
+
consume(method: Function): T[];
|
|
123
|
+
/**
|
|
124
|
+
* Resolve all pending metadata for a class by scanning its prototype and static members
|
|
125
|
+
*/
|
|
126
|
+
resolveForClass(ctor: Function, consume?: boolean): T[];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Creates a class decorator that works with both legacy TypeScript and TC39 Stage 3 decorators.
|
|
130
|
+
*/
|
|
131
|
+
export declare function createDualModeClassDecorator<TOptions>(handler: (ctor: Function, options: TOptions, context?: TC39ClassContext) => Function | void): (options: TOptions) => ClassDecorator;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Decorator Utilities for Dual-Mode Support
|
|
4
|
+
*
|
|
5
|
+
* This module provides utilities for creating decorators that work with both:
|
|
6
|
+
* - Legacy TypeScript decorators (experimentalDecorators: true)
|
|
7
|
+
* - TC39 Stage 3 decorators (native JS, used by esbuild/tsx)
|
|
8
|
+
*
|
|
9
|
+
* The key difference between the two modes:
|
|
10
|
+
*
|
|
11
|
+
* LEGACY TypeScript Method Decorator:
|
|
12
|
+
* (target: prototype, propertyKey: string, descriptor: PropertyDescriptor) => void
|
|
13
|
+
* - target is the class prototype (for instance methods) or class (for static)
|
|
14
|
+
* - propertyKey is the method name
|
|
15
|
+
* - descriptor is the property descriptor
|
|
16
|
+
*
|
|
17
|
+
* TC39 Stage 3 Method Decorator:
|
|
18
|
+
* (target: method, context: ClassMethodDecoratorContext) => method
|
|
19
|
+
* - target is the actual method function being decorated
|
|
20
|
+
* - context is an object with { kind, name, static, private, addInitializer }
|
|
21
|
+
* - The class isn't available during decoration (only via addInitializer at instance creation)
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Using the factory to create a dual-mode decorator
|
|
26
|
+
* const MyDecorator = createMethodDecorator<{ stage: string }>({
|
|
27
|
+
* createMetadata: (args, options) => ({
|
|
28
|
+
* methodName: args.methodName,
|
|
29
|
+
* stage: options.stage,
|
|
30
|
+
* }),
|
|
31
|
+
* onLegacyDecoration: (ctor, metadata) => {
|
|
32
|
+
* // Immediately register on class (legacy mode)
|
|
33
|
+
* registerOnClass(ctor, metadata);
|
|
34
|
+
* },
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Usage (works in both modes):
|
|
38
|
+
* class MyFlow {
|
|
39
|
+
* @MyDecorator({ stage: 'execute' })
|
|
40
|
+
* async execute() {}
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.PendingMetadataRegistry = void 0;
|
|
46
|
+
exports.isTC39MethodContext = isTC39MethodContext;
|
|
47
|
+
exports.isTC39ClassContext = isTC39ClassContext;
|
|
48
|
+
exports.createDualModeMethodDecorator = createDualModeMethodDecorator;
|
|
49
|
+
exports.createDualModeClassDecorator = createDualModeClassDecorator;
|
|
50
|
+
/**
|
|
51
|
+
* Check if decorator context is TC39 Stage 3 style
|
|
52
|
+
*/
|
|
53
|
+
function isTC39MethodContext(arg) {
|
|
54
|
+
return typeof arg === 'object' && arg !== null && 'kind' in arg && arg.kind === 'method';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if decorator context is TC39 Stage 3 class context
|
|
58
|
+
*/
|
|
59
|
+
function isTC39ClassContext(arg) {
|
|
60
|
+
return typeof arg === 'object' && arg !== null && 'kind' in arg && arg.kind === 'class';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates a method decorator that works with both legacy TypeScript and TC39 Stage 3 decorators.
|
|
64
|
+
*
|
|
65
|
+
* For legacy decorators: onLegacyDecoration is called immediately with class constructor
|
|
66
|
+
* For TC39 decorators: storePendingMetadata is called, metadata resolved later via resolvePendingMetadataForClass
|
|
67
|
+
*/
|
|
68
|
+
function createDualModeMethodDecorator(config) {
|
|
69
|
+
return (options) => {
|
|
70
|
+
return (target, keyOrContext, descriptor) => {
|
|
71
|
+
if (isTC39MethodContext(keyOrContext)) {
|
|
72
|
+
// TC39 Stage 3 decorator style
|
|
73
|
+
const context = keyOrContext;
|
|
74
|
+
const methodName = String(context.name);
|
|
75
|
+
const isStatic = context.static;
|
|
76
|
+
const method = target; // In TC39, target is the method function itself
|
|
77
|
+
const args = {
|
|
78
|
+
method,
|
|
79
|
+
methodName,
|
|
80
|
+
isStatic,
|
|
81
|
+
mode: 'tc39',
|
|
82
|
+
};
|
|
83
|
+
const metadata = config.createMetadata(args, options);
|
|
84
|
+
config.storePendingMetadata(method, metadata);
|
|
85
|
+
// Return the original method unchanged
|
|
86
|
+
return target;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Legacy TypeScript decorator style
|
|
90
|
+
const key = keyOrContext;
|
|
91
|
+
const methodName = String(key);
|
|
92
|
+
const isStatic = typeof target === 'function';
|
|
93
|
+
const method = descriptor?.value ?? target[key];
|
|
94
|
+
const ctor = isStatic ? target : target.constructor;
|
|
95
|
+
const args = {
|
|
96
|
+
method,
|
|
97
|
+
methodName,
|
|
98
|
+
isStatic,
|
|
99
|
+
mode: 'legacy',
|
|
100
|
+
};
|
|
101
|
+
const metadata = config.createMetadata(args, options);
|
|
102
|
+
// In legacy mode, we have immediate access to the class
|
|
103
|
+
if (config.onLegacyDecoration) {
|
|
104
|
+
config.onLegacyDecoration(ctor, metadata);
|
|
105
|
+
}
|
|
106
|
+
// Return nothing to keep the original descriptor
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Storage for pending TC39 decorator metadata
|
|
114
|
+
* Generic class that can be instantiated for different metadata types
|
|
115
|
+
*/
|
|
116
|
+
class PendingMetadataRegistry {
|
|
117
|
+
pending = new WeakMap();
|
|
118
|
+
/**
|
|
119
|
+
* Store pending metadata for a method (TC39 mode)
|
|
120
|
+
*/
|
|
121
|
+
store(method, metadata) {
|
|
122
|
+
const existing = this.pending.get(method) ?? [];
|
|
123
|
+
existing.push(metadata);
|
|
124
|
+
this.pending.set(method, existing);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get and optionally clear pending metadata for a method
|
|
128
|
+
*/
|
|
129
|
+
consume(method) {
|
|
130
|
+
const pending = this.pending.get(method) ?? [];
|
|
131
|
+
this.pending.delete(method);
|
|
132
|
+
return pending;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Resolve all pending metadata for a class by scanning its prototype and static members
|
|
136
|
+
*/
|
|
137
|
+
resolveForClass(ctor, consume = true) {
|
|
138
|
+
const resolved = [];
|
|
139
|
+
// Scan instance methods on prototype
|
|
140
|
+
const proto = ctor.prototype;
|
|
141
|
+
if (proto) {
|
|
142
|
+
for (const name of Object.getOwnPropertyNames(proto)) {
|
|
143
|
+
if (name === 'constructor')
|
|
144
|
+
continue;
|
|
145
|
+
try {
|
|
146
|
+
const desc = Object.getOwnPropertyDescriptor(proto, name);
|
|
147
|
+
const method = desc?.value;
|
|
148
|
+
if (typeof method === 'function') {
|
|
149
|
+
const pending = consume ? this.consume(method) : this.pending.get(method) ?? [];
|
|
150
|
+
resolved.push(...pending);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Ignore getter/setter errors
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Scan static methods on constructor
|
|
159
|
+
for (const name of Object.getOwnPropertyNames(ctor)) {
|
|
160
|
+
if (['prototype', 'length', 'name'].includes(name))
|
|
161
|
+
continue;
|
|
162
|
+
try {
|
|
163
|
+
const desc = Object.getOwnPropertyDescriptor(ctor, name);
|
|
164
|
+
const method = desc?.value;
|
|
165
|
+
if (typeof method === 'function') {
|
|
166
|
+
const pending = consume ? this.consume(method) : this.pending.get(method) ?? [];
|
|
167
|
+
resolved.push(...pending);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Ignore getter/setter errors
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return resolved;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.PendingMetadataRegistry = PendingMetadataRegistry;
|
|
178
|
+
/**
|
|
179
|
+
* Creates a class decorator that works with both legacy TypeScript and TC39 Stage 3 decorators.
|
|
180
|
+
*/
|
|
181
|
+
function createDualModeClassDecorator(handler) {
|
|
182
|
+
return (options) => {
|
|
183
|
+
return (target, context) => {
|
|
184
|
+
if (isTC39ClassContext(context)) {
|
|
185
|
+
// TC39 Stage 3 class decorator
|
|
186
|
+
return handler(target, options, context) ?? target;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Legacy TypeScript class decorator
|
|
190
|
+
return handler(target, options) ?? target;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=decorator-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorator-utils.js","sourceRoot":"","sources":["../../../../src/common/decorators/decorator-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Decorator Utilities for Dual-Mode Support\n *\n * This module provides utilities for creating decorators that work with both:\n * - Legacy TypeScript decorators (experimentalDecorators: true)\n * - TC39 Stage 3 decorators (native JS, used by esbuild/tsx)\n *\n * The key difference between the two modes:\n *\n * LEGACY TypeScript Method Decorator:\n * (target: prototype, propertyKey: string, descriptor: PropertyDescriptor) => void\n * - target is the class prototype (for instance methods) or class (for static)\n * - propertyKey is the method name\n * - descriptor is the property descriptor\n *\n * TC39 Stage 3 Method Decorator:\n * (target: method, context: ClassMethodDecoratorContext) => method\n * - target is the actual method function being decorated\n * - context is an object with { kind, name, static, private, addInitializer }\n * - The class isn't available during decoration (only via addInitializer at instance creation)\n *\n * @example\n * ```typescript\n * // Using the factory to create a dual-mode decorator\n * const MyDecorator = createMethodDecorator<{ stage: string }>({\n * createMetadata: (args, options) => ({\n * methodName: args.methodName,\n * stage: options.stage,\n * }),\n * onLegacyDecoration: (ctor, metadata) => {\n * // Immediately register on class (legacy mode)\n * registerOnClass(ctor, metadata);\n * },\n * });\n *\n * // Usage (works in both modes):\n * class MyFlow {\n * @MyDecorator({ stage: 'execute' })\n * async execute() {}\n * }\n * ```\n */\n\n/**\n * TC39 Stage 3 Method Decorator Context\n * @see https://github.com/tc39/proposal-decorators\n */\nexport interface TC39MethodContext {\n readonly kind: 'method';\n readonly name: string | symbol;\n readonly static: boolean;\n readonly private: boolean;\n addInitializer(initializer: () => void): void;\n}\n\n/**\n * TC39 Stage 3 Class Decorator Context\n */\nexport interface TC39ClassContext {\n readonly kind: 'class';\n readonly name: string | undefined;\n addInitializer(initializer: () => void): void;\n}\n\n/**\n * Normalized arguments passed to method decorator handlers\n */\nexport interface MethodDecoratorArgs {\n /** The method function being decorated */\n method: Function;\n /** Method name as string */\n methodName: string;\n /** Whether this is a static method */\n isStatic: boolean;\n /** Decorator mode */\n mode: 'legacy' | 'tc39';\n}\n\n/**\n * Configuration for creating a dual-mode method decorator\n */\nexport interface MethodDecoratorConfig<TOptions, TMetadata> {\n /**\n * Create metadata from decorator arguments and options\n */\n createMetadata: (args: MethodDecoratorArgs, options: TOptions) => TMetadata;\n\n /**\n * Called immediately during legacy decoration with access to the class\n * Use this to register metadata directly on the class\n */\n onLegacyDecoration?: (ctor: Function, metadata: TMetadata) => void;\n\n /**\n * Store pending metadata for TC39 mode (required)\n * The metadata will be resolved later when the class is processed\n */\n storePendingMetadata: (method: Function, metadata: TMetadata) => void;\n}\n\n/**\n * Check if decorator context is TC39 Stage 3 style\n */\nexport function isTC39MethodContext(arg: unknown): arg is TC39MethodContext {\n return typeof arg === 'object' && arg !== null && 'kind' in arg && (arg as TC39MethodContext).kind === 'method';\n}\n\n/**\n * Check if decorator context is TC39 Stage 3 class context\n */\nexport function isTC39ClassContext(arg: unknown): arg is TC39ClassContext {\n return typeof arg === 'object' && arg !== null && 'kind' in arg && (arg as TC39ClassContext).kind === 'class';\n}\n\n/**\n * Creates a method decorator that works with both legacy TypeScript and TC39 Stage 3 decorators.\n *\n * For legacy decorators: onLegacyDecoration is called immediately with class constructor\n * For TC39 decorators: storePendingMetadata is called, metadata resolved later via resolvePendingMetadataForClass\n */\nexport function createDualModeMethodDecorator<TOptions, TMetadata>(\n config: MethodDecoratorConfig<TOptions, TMetadata>,\n): (options: TOptions) => MethodDecorator {\n return (options: TOptions): MethodDecorator => {\n return (target: any, keyOrContext: any, descriptor?: PropertyDescriptor): any => {\n if (isTC39MethodContext(keyOrContext)) {\n // TC39 Stage 3 decorator style\n const context = keyOrContext;\n const methodName = String(context.name);\n const isStatic = context.static;\n const method = target; // In TC39, target is the method function itself\n\n const args: MethodDecoratorArgs = {\n method,\n methodName,\n isStatic,\n mode: 'tc39',\n };\n\n const metadata = config.createMetadata(args, options);\n config.storePendingMetadata(method, metadata);\n\n // Return the original method unchanged\n return target;\n } else {\n // Legacy TypeScript decorator style\n const key = keyOrContext;\n const methodName = String(key);\n const isStatic = typeof target === 'function';\n const method = descriptor?.value ?? target[key];\n const ctor = isStatic ? target : target.constructor;\n\n const args: MethodDecoratorArgs = {\n method,\n methodName,\n isStatic,\n mode: 'legacy',\n };\n\n const metadata = config.createMetadata(args, options);\n\n // In legacy mode, we have immediate access to the class\n if (config.onLegacyDecoration) {\n config.onLegacyDecoration(ctor, metadata);\n }\n\n // Return nothing to keep the original descriptor\n return undefined;\n }\n };\n };\n}\n\n/**\n * Storage for pending TC39 decorator metadata\n * Generic class that can be instantiated for different metadata types\n */\nexport class PendingMetadataRegistry<T> {\n private pending = new WeakMap<Function, T[]>();\n\n /**\n * Store pending metadata for a method (TC39 mode)\n */\n store(method: Function, metadata: T): void {\n const existing = this.pending.get(method) ?? [];\n existing.push(metadata);\n this.pending.set(method, existing);\n }\n\n /**\n * Get and optionally clear pending metadata for a method\n */\n consume(method: Function): T[] {\n const pending = this.pending.get(method) ?? [];\n this.pending.delete(method);\n return pending;\n }\n\n /**\n * Resolve all pending metadata for a class by scanning its prototype and static members\n */\n resolveForClass(ctor: Function, consume: boolean = true): T[] {\n const resolved: T[] = [];\n\n // Scan instance methods on prototype\n const proto = ctor.prototype;\n if (proto) {\n for (const name of Object.getOwnPropertyNames(proto)) {\n if (name === 'constructor') continue;\n try {\n const desc = Object.getOwnPropertyDescriptor(proto, name);\n const method = desc?.value;\n if (typeof method === 'function') {\n const pending = consume ? this.consume(method) : this.pending.get(method) ?? [];\n resolved.push(...pending);\n }\n } catch {\n // Ignore getter/setter errors\n }\n }\n }\n\n // Scan static methods on constructor\n for (const name of Object.getOwnPropertyNames(ctor)) {\n if (['prototype', 'length', 'name'].includes(name)) continue;\n try {\n const desc = Object.getOwnPropertyDescriptor(ctor, name);\n const method = desc?.value;\n if (typeof method === 'function') {\n const pending = consume ? this.consume(method) : this.pending.get(method) ?? [];\n resolved.push(...pending);\n }\n } catch {\n // Ignore getter/setter errors\n }\n }\n\n return resolved;\n }\n}\n\n/**\n * Creates a class decorator that works with both legacy TypeScript and TC39 Stage 3 decorators.\n */\nexport function createDualModeClassDecorator<TOptions>(\n handler: (ctor: Function, options: TOptions, context?: TC39ClassContext) => Function | void,\n): (options: TOptions) => ClassDecorator {\n return (options: TOptions): ClassDecorator => {\n return (target: any, context?: any): any => {\n if (isTC39ClassContext(context)) {\n // TC39 Stage 3 class decorator\n return handler(target, options, context) ?? target;\n } else {\n // Legacy TypeScript class decorator\n return handler(target, options) ?? target;\n }\n };\n };\n}\n"]}
|
|
@@ -17,8 +17,9 @@ function FrontMcp(providedMetadata) {
|
|
|
17
17
|
if (error.format().providers) {
|
|
18
18
|
throw new Error(`Invalid metadata provided to @FrontMcp { providers: [?] }: \n${JSON.stringify(error.format().providers, null, 2)}`);
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
const loggingFormat = error.format()['logging'];
|
|
21
|
+
if (loggingFormat?.['transports']) {
|
|
22
|
+
throw new Error(`Invalid metadata provided to @FrontMcp { logging: { transports: [?] } }: \n${JSON.stringify(loggingFormat['transports'], null, 2)}`);
|
|
22
23
|
}
|
|
23
24
|
throw error;
|
|
24
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"front-mcp.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/front-mcp.decorator.ts"],"names":[],"mappings":";;AAQA,
|
|
1
|
+
{"version":3,"file":"front-mcp.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/front-mcp.decorator.ts"],"names":[],"mappings":";;AAQA,4BA+CC;AAvDD,4BAA0B;AAC1B,sCAA2C;AAC3C,0CAAuE;AAGvE;;GAEG;AACH,SAAgB,QAAQ,CAAC,gBAAkC;IACzD,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,iCAAsB,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACrF,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,2DAA2D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAC1G,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,gEAAgE,IAAI,CAAC,SAAS,CAC5E,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EACxB,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;YACJ,CAAC;YACD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,CAAwC,CAAC;YACvF,IAAI,aAAa,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CACb,8EAA8E,IAAI,CAAC,SAAS,CAC1F,aAAa,CAAC,YAAY,CAAC,EAC3B,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,uBAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,uBAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,eAAe,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE;gBACxC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,qFAAqF,CAAC,CAAC;gBAC/G,CAAC;gBAED,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { FrontMcpTokens } from '../tokens';\nimport { FrontMcpMetadata, frontMcpMetadataSchema } from '../metadata';\nimport { FrontMcpInstance } from '../../front-mcp';\n\n/**\n * Decorator that marks a class as a FrontMcp Server and provides metadata\n */\nexport function FrontMcp(providedMetadata: FrontMcpMetadata): ClassDecorator {\n return (target: Function) => {\n const { error, data: metadata } = frontMcpMetadataSchema.safeParse(providedMetadata);\n if (error) {\n if (error.format().apps) {\n throw new Error(\n `Invalid metadata provided to @FrontMcp { apps: [?] }: \\n${JSON.stringify(error.format().apps, null, 2)}`,\n );\n }\n if (error.format().providers) {\n throw new Error(\n `Invalid metadata provided to @FrontMcp { providers: [?] }: \\n${JSON.stringify(\n error.format().providers,\n null,\n 2,\n )}`,\n );\n }\n const loggingFormat = error.format()['logging'] as Record<string, unknown> | undefined;\n if (loggingFormat?.['transports']) {\n throw new Error(\n `Invalid metadata provided to @FrontMcp { logging: { transports: [?] } }: \\n${JSON.stringify(\n loggingFormat['transports'],\n null,\n 2,\n )}`,\n );\n }\n throw error;\n }\n\n Reflect.defineMetadata(FrontMcpTokens.type, true, target);\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpTokens[property] ?? property, metadata[property], target);\n }\n\n if (metadata.serve) {\n const sdk = '@frontmcp/sdk';\n import(sdk).then(({ FrontMcpInstance }) => {\n if (!FrontMcpInstance) {\n throw new Error(`${sdk} version mismatch, make sure you have the same version for all @frontmcp/* packages`);\n }\n\n FrontMcpInstance.bootstrap(metadata);\n });\n }\n };\n}\n"]}
|
|
@@ -1,9 +1,65 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Flow Hook Decorators
|
|
3
|
+
*
|
|
4
|
+
* This module provides decorators for defining flow stages and lifecycle hooks.
|
|
5
|
+
* Supports both legacy TypeScript decorators and TC39 Stage 3 decorators.
|
|
6
|
+
*/
|
|
7
|
+
import { HookOptions, FlowName, HookMetadata } from '../metadata';
|
|
8
|
+
/**
|
|
9
|
+
* Resolve all pending TC39 hooks for a class by scanning its prototype
|
|
10
|
+
* This is called by collectFlowHookMap during flow registration
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolvePendingTC39HooksForClass(ctor: Function): HookMetadata[];
|
|
13
|
+
/**
|
|
14
|
+
* Store a pending hook for TC39 mode
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerPendingTC39Hook(method: Function, meta: HookMetadata): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get and clear pending hooks for a method (TC39 mode)
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
export declare function consumePendingTC39Hooks(method: Function): HookMetadata[];
|
|
23
|
+
/**
|
|
24
|
+
* Creates a typed Stage hook decorator for a specific flow
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const { Stage } = FlowHooksOf('http:request');
|
|
28
|
+
*
|
|
29
|
+
* class HttpRequestFlow {
|
|
30
|
+
* @Stage('checkAuthorization')
|
|
31
|
+
* async checkAuthorization() { ... }
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
3
35
|
export declare function StageHookOf<Name extends FlowName>(flow: Name): (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a typed Will hook decorator (runs before stage)
|
|
38
|
+
*/
|
|
4
39
|
export declare function WillHookOf<Name extends FlowName>(flow: Name): (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
|
|
40
|
+
/**
|
|
41
|
+
* Creates a typed Did hook decorator (runs after stage)
|
|
42
|
+
*/
|
|
5
43
|
export declare function DidHookOf<Name extends FlowName>(flow: Name): (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
|
|
44
|
+
/**
|
|
45
|
+
* Creates a typed Around hook decorator (wraps stage execution)
|
|
46
|
+
*/
|
|
6
47
|
export declare function AroundHookOf<Name extends FlowName>(name: Name): (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
|
|
48
|
+
/**
|
|
49
|
+
* Creates all hook decorators for a specific flow
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const { Stage, Will, Did, Around } = FlowHooksOf('http:request');
|
|
53
|
+
*
|
|
54
|
+
* class HttpRequestFlow {
|
|
55
|
+
* @Stage('checkAuthorization')
|
|
56
|
+
* async checkAuthorization() { ... }
|
|
57
|
+
*
|
|
58
|
+
* @Will('execute', { priority: 10 })
|
|
59
|
+
* async beforeExecute() { ... }
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
7
63
|
export declare function FlowHooksOf<Name extends FlowName>(name: Name): {
|
|
8
64
|
Stage: (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
|
|
9
65
|
Will: (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
|