@frontmcp/sdk 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -18
- package/package.json +20 -5
- package/src/app/app.registry.d.ts +3 -2
- package/src/app/app.registry.js +3 -1
- package/src/app/app.registry.js.map +1 -1
- package/src/app/instances/app.local.instance.js +2 -2
- package/src/app/instances/app.local.instance.js.map +1 -1
- package/src/auth/auth.registry.d.ts +34 -2
- package/src/auth/auth.registry.js +162 -24
- package/src/auth/auth.registry.js.map +1 -1
- package/src/auth/auth.utils.js +8 -9
- package/src/auth/auth.utils.js.map +1 -1
- package/src/auth/authorization/authorization.class.d.ts +125 -0
- package/src/auth/authorization/authorization.class.js +224 -0
- package/src/auth/authorization/authorization.class.js.map +1 -0
- package/src/auth/authorization/authorization.types.d.ts +300 -0
- package/src/auth/authorization/authorization.types.js +79 -0
- package/src/auth/authorization/authorization.types.js.map +1 -0
- package/src/auth/authorization/index.d.ts +5 -0
- package/src/auth/authorization/index.js +19 -0
- package/src/auth/authorization/index.js.map +1 -0
- package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
- package/src/auth/authorization/orchestrated.authorization.js +306 -0
- package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
- package/src/auth/authorization/public.authorization.d.ts +91 -0
- package/src/auth/authorization/public.authorization.js +132 -0
- package/src/auth/authorization/public.authorization.js.map +1 -0
- package/src/auth/authorization/transparent.authorization.d.ts +130 -0
- package/src/auth/authorization/transparent.authorization.js +147 -0
- package/src/auth/authorization/transparent.authorization.js.map +1 -0
- package/src/auth/consent/consent.types.d.ts +111 -0
- package/src/auth/consent/consent.types.js +119 -0
- package/src/auth/consent/consent.types.js.map +1 -0
- package/src/auth/consent/index.d.ts +1 -0
- package/src/auth/consent/index.js +13 -0
- package/src/auth/consent/index.js.map +1 -0
- package/src/auth/detection/auth-provider-detection.d.ts +84 -0
- package/src/auth/detection/auth-provider-detection.js +230 -0
- package/src/auth/detection/auth-provider-detection.js.map +1 -0
- package/src/auth/detection/index.d.ts +1 -0
- package/src/auth/detection/index.js +15 -0
- package/src/auth/detection/index.js.map +1 -0
- package/src/auth/flows/auth.verify.flow.d.ts +110 -0
- package/src/auth/flows/auth.verify.flow.js +379 -0
- package/src/auth/flows/auth.verify.flow.js.map +1 -0
- package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
- package/src/auth/flows/oauth.authorize.flow.js +701 -33
- package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
- package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
- package/src/auth/flows/oauth.callback.flow.js +357 -0
- package/src/auth/flows/oauth.callback.flow.js.map +1 -0
- package/src/auth/flows/oauth.register.flow.d.ts +32 -125
- package/src/auth/flows/oauth.token.flow.d.ts +52 -154
- package/src/auth/flows/oauth.token.flow.js +193 -55
- package/src/auth/flows/oauth.token.flow.js.map +1 -1
- package/src/auth/flows/session.verify.flow.d.ts +66 -321
- package/src/auth/flows/session.verify.flow.js +107 -18
- package/src/auth/flows/session.verify.flow.js.map +1 -1
- package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
- package/src/auth/flows/well-known.jwks.flow.js +15 -8
- package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
- package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
- package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
- package/src/auth/flows/well-known.prm.flow.js +3 -4
- package/src/auth/flows/well-known.prm.flow.js.map +1 -1
- package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
- package/src/auth/instances/instance.local-primary-auth.js +236 -6
- package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
- package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
- package/src/auth/instances/instance.remote-primary-auth.js +2 -2
- package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
- package/src/auth/session/authorization-vault.d.ts +611 -0
- package/src/auth/session/authorization-vault.js +817 -0
- package/src/auth/session/authorization-vault.js.map +1 -0
- package/src/auth/session/authorization.store.d.ts +301 -0
- package/src/auth/session/authorization.store.js +323 -0
- package/src/auth/session/authorization.store.js.map +1 -0
- package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
- package/src/auth/session/encrypted-authorization-vault.js +493 -0
- package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
- package/src/auth/session/index.d.ts +4 -4
- package/src/auth/session/index.js +11 -7
- package/src/auth/session/index.js.map +1 -1
- package/src/auth/session/session.schema.d.ts +1 -1
- package/src/auth/session/session.service.d.ts +1 -1
- package/src/auth/session/transport-session.manager.d.ts +101 -0
- package/src/auth/session/transport-session.manager.js +300 -0
- package/src/auth/session/transport-session.manager.js.map +1 -0
- package/src/auth/session/transport-session.types.d.ts +457 -0
- package/src/auth/session/transport-session.types.js +110 -0
- package/src/auth/session/transport-session.types.js.map +1 -0
- package/src/auth/session/utils/session-id.utils.d.ts +14 -2
- package/src/auth/session/utils/session-id.utils.js +68 -19
- package/src/auth/session/utils/session-id.utils.js.map +1 -1
- package/src/auth/session/vault-encryption.d.ts +189 -0
- package/src/auth/session/vault-encryption.js +263 -0
- package/src/auth/session/vault-encryption.js.map +1 -0
- package/src/auth/ui/base-layout.d.ts +188 -0
- package/src/auth/ui/base-layout.js +292 -0
- package/src/auth/ui/base-layout.js.map +1 -0
- package/src/auth/ui/htmx-templates.d.ts +135 -0
- package/src/auth/ui/htmx-templates.js +433 -0
- package/src/auth/ui/htmx-templates.js.map +1 -0
- package/src/auth/ui/index.d.ts +11 -0
- package/src/auth/ui/index.js +35 -0
- package/src/auth/ui/index.js.map +1 -0
- package/src/auth/utils/audience.validator.d.ts +129 -0
- package/src/auth/utils/audience.validator.js +196 -0
- package/src/auth/utils/audience.validator.js.map +1 -0
- package/src/auth/utils/index.d.ts +2 -0
- package/src/auth/utils/index.js +7 -0
- package/src/auth/utils/index.js.map +1 -0
- package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
- package/src/auth/utils/www-authenticate.utils.js +183 -0
- package/src/auth/utils/www-authenticate.utils.js.map +1 -0
- package/src/common/common.schema.d.ts +2 -16
- package/src/common/constants.d.ts +3 -0
- package/src/common/constants.js +6 -1
- package/src/common/constants.js.map +1 -1
- package/src/common/decorators/decorator-utils.d.ts +131 -0
- package/src/common/decorators/decorator-utils.js +195 -0
- package/src/common/decorators/decorator-utils.js.map +1 -0
- package/src/common/decorators/front-mcp.decorator.js +3 -2
- package/src/common/decorators/front-mcp.decorator.js.map +1 -1
- package/src/common/decorators/hook.decorator.d.ts +58 -2
- package/src/common/decorators/hook.decorator.js +127 -17
- package/src/common/decorators/hook.decorator.js.map +1 -1
- package/src/common/decorators/plugin.decorator.d.ts +1 -1
- package/src/common/decorators/plugin.decorator.js +11 -10
- package/src/common/decorators/plugin.decorator.js.map +1 -1
- package/src/common/decorators/resource.decorator.d.ts +32 -3
- package/src/common/decorators/resource.decorator.js +46 -4
- package/src/common/decorators/resource.decorator.js.map +1 -1
- package/src/common/decorators/tool.decorator.d.ts +54 -5
- package/src/common/decorators/tool.decorator.js.map +1 -1
- package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
- package/src/common/dynamic/dynamic.plugin.js +7 -1
- package/src/common/dynamic/dynamic.plugin.js.map +1 -1
- package/src/common/entries/prompt.entry.d.ts +46 -2
- package/src/common/entries/prompt.entry.js +10 -0
- package/src/common/entries/prompt.entry.js.map +1 -1
- package/src/common/entries/resource.entry.d.ts +69 -6
- package/src/common/entries/resource.entry.js +27 -3
- package/src/common/entries/resource.entry.js.map +1 -1
- package/src/common/entries/scope.entry.d.ts +5 -1
- package/src/common/entries/scope.entry.js +3 -3
- package/src/common/entries/scope.entry.js.map +1 -1
- package/src/common/flow/flow.utils.d.ts +56 -0
- package/src/common/flow/flow.utils.js +96 -0
- package/src/common/flow/flow.utils.js.map +1 -0
- package/src/common/index.d.ts +2 -2
- package/src/common/index.js +2 -2
- package/src/common/index.js.map +1 -1
- package/src/common/interfaces/execution-context.interface.d.ts +59 -0
- package/src/common/interfaces/execution-context.interface.js +81 -0
- package/src/common/interfaces/execution-context.interface.js.map +1 -0
- package/src/common/interfaces/flow.interface.d.ts +1 -1
- package/src/common/interfaces/flow.interface.js.map +1 -1
- package/src/common/interfaces/index.d.ts +1 -0
- package/src/common/interfaces/index.js +1 -0
- package/src/common/interfaces/index.js.map +1 -1
- package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
- package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
- package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
- package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
- package/src/common/interfaces/internal/registry.interface.js.map +1 -1
- package/src/common/interfaces/plugin.interface.js.map +1 -1
- package/src/common/interfaces/prompt.interface.d.ts +53 -4
- package/src/common/interfaces/prompt.interface.js +78 -0
- package/src/common/interfaces/prompt.interface.js.map +1 -1
- package/src/common/interfaces/resource.interface.d.ts +47 -17
- package/src/common/interfaces/resource.interface.js +53 -0
- package/src/common/interfaces/resource.interface.js.map +1 -1
- package/src/common/interfaces/tool.interface.d.ts +39 -22
- package/src/common/interfaces/tool.interface.js +61 -34
- package/src/common/interfaces/tool.interface.js.map +1 -1
- package/src/common/metadata/adapter.metadata.d.ts +1 -9
- package/src/common/metadata/app.metadata.d.ts +425 -730
- package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
- package/src/common/metadata/flow.metadata.d.ts +10 -25
- package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
- package/src/common/metadata/front-mcp.metadata.js +6 -4
- package/src/common/metadata/front-mcp.metadata.js.map +1 -1
- package/src/common/metadata/hook.metadata.d.ts +1 -1
- package/src/common/metadata/hook.metadata.js.map +1 -1
- package/src/common/metadata/index.d.ts +1 -0
- package/src/common/metadata/index.js +1 -0
- package/src/common/metadata/index.js.map +1 -1
- package/src/common/metadata/logger.metadata.d.ts +1 -9
- package/src/common/metadata/plugin.metadata.d.ts +8 -30
- package/src/common/metadata/prompt.metadata.d.ts +4 -161
- package/src/common/metadata/provider.metadata.d.ts +2 -12
- package/src/common/metadata/resource.metadata.d.ts +6 -98
- package/src/common/metadata/resource.metadata.js +15 -6
- package/src/common/metadata/resource.metadata.js.map +1 -1
- package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
- package/src/common/metadata/tool-ui.metadata.js +12 -0
- package/src/common/metadata/tool-ui.metadata.js.map +1 -0
- package/src/common/metadata/tool.metadata.d.ts +78 -199
- package/src/common/metadata/tool.metadata.js +11 -14
- package/src/common/metadata/tool.metadata.js.map +1 -1
- package/src/common/providers/base-config.provider.d.ts +84 -0
- package/src/common/providers/base-config.provider.js +128 -0
- package/src/common/providers/base-config.provider.js.map +1 -0
- package/src/common/records/plugin.record.d.ts +5 -6
- package/src/common/records/plugin.record.js.map +1 -1
- package/src/common/records/prompt.record.js.map +1 -1
- package/src/common/records/resource.record.d.ts +17 -1
- package/src/common/records/resource.record.js +12 -6
- package/src/common/records/resource.record.js.map +1 -1
- package/src/common/records/tool.record.js.map +1 -1
- package/src/common/schemas/annotated-class.schema.d.ts +9 -9
- package/src/common/schemas/annotated-class.schema.js +92 -27
- package/src/common/schemas/annotated-class.schema.js.map +1 -1
- package/src/common/schemas/http-input.schema.d.ts +6 -30
- package/src/common/schemas/http-output.schema.d.ts +326 -1630
- package/src/common/schemas/http-output.schema.js +39 -1
- package/src/common/schemas/http-output.schema.js.map +1 -1
- package/src/common/tokens/front-mcp.tokens.js +4 -1
- package/src/common/tokens/front-mcp.tokens.js.map +1 -1
- package/src/common/tokens/resource.tokens.d.ts +2 -0
- package/src/common/tokens/resource.tokens.js +4 -1
- package/src/common/tokens/resource.tokens.js.map +1 -1
- package/src/common/tokens/tool.tokens.d.ts +2 -0
- package/src/common/tokens/tool.tokens.js +2 -0
- package/src/common/tokens/tool.tokens.js.map +1 -1
- package/src/common/types/auth/jwt.types.d.ts +5 -31
- package/src/common/types/auth/session.types.d.ts +97 -192
- package/src/common/types/auth/session.types.js +24 -11
- package/src/common/types/auth/session.types.js.map +1 -1
- package/src/common/types/options/auth.options.d.ts +1013 -490
- package/src/common/types/options/auth.options.js +554 -36
- package/src/common/types/options/auth.options.js.map +1 -1
- package/src/common/types/options/http.options.d.ts +1 -9
- package/src/common/types/options/logging.options.d.ts +7 -13
- package/src/common/types/options/logging.options.js +4 -0
- package/src/common/types/options/logging.options.js.map +1 -1
- package/src/common/types/options/server-info.options.d.ts +3 -31
- package/src/common/types/options/session.options.d.ts +90 -10
- package/src/common/types/options/session.options.js +26 -3
- package/src/common/types/options/session.options.js.map +1 -1
- package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
- package/src/common/utils/decide-request-intent.utils.js +88 -23
- package/src/common/utils/decide-request-intent.utils.js.map +1 -1
- package/src/completion/flows/complete.flow.d.ts +74 -0
- package/src/completion/flows/complete.flow.js +199 -0
- package/src/completion/flows/complete.flow.js.map +1 -0
- package/src/errors/authorization-required.error.d.ts +189 -0
- package/src/errors/authorization-required.error.js +274 -0
- package/src/errors/authorization-required.error.js.map +1 -0
- package/src/errors/index.d.ts +2 -1
- package/src/errors/index.js +17 -1
- package/src/errors/index.js.map +1 -1
- package/src/errors/mcp.error.d.ts +101 -1
- package/src/errors/mcp.error.js +147 -2
- package/src/errors/mcp.error.js.map +1 -1
- package/src/flows/flow.instance.js +4 -3
- package/src/flows/flow.instance.js.map +1 -1
- package/src/flows/flow.registry.js.map +1 -1
- package/src/flows/flow.stages.js +14 -11
- package/src/flows/flow.stages.js.map +1 -1
- package/src/front-mcp/front-mcp.providers.d.ts +464 -102
- package/src/front-mcp/front-mcp.providers.js +3 -5
- package/src/front-mcp/front-mcp.providers.js.map +1 -1
- package/src/hooks/hook.instance.d.ts +1 -1
- package/src/hooks/hook.instance.js +5 -2
- package/src/hooks/hook.instance.js.map +1 -1
- package/src/hooks/hook.registry.js +7 -5
- package/src/hooks/hook.registry.js.map +1 -1
- package/src/index.d.ts +28 -9
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/logger/instances/instance.logger.js +3 -2
- package/src/logger/instances/instance.logger.js.map +1 -1
- package/src/logger/logger.registry.js +7 -2
- package/src/logger/logger.registry.js.map +1 -1
- package/src/logging/flows/set-level.flow.d.ts +62 -0
- package/src/logging/flows/set-level.flow.js +108 -0
- package/src/logging/flows/set-level.flow.js.map +1 -0
- package/src/mcp-apps/csp.d.ts +111 -0
- package/src/mcp-apps/csp.js +267 -0
- package/src/mcp-apps/csp.js.map +1 -0
- package/src/mcp-apps/index.d.ts +23 -0
- package/src/mcp-apps/index.js +91 -0
- package/src/mcp-apps/index.js.map +1 -0
- package/src/mcp-apps/schemas.d.ts +403 -0
- package/src/mcp-apps/schemas.js +345 -0
- package/src/mcp-apps/schemas.js.map +1 -0
- package/src/mcp-apps/template.d.ts +94 -0
- package/src/mcp-apps/template.js +419 -0
- package/src/mcp-apps/template.js.map +1 -0
- package/src/mcp-apps/types.d.ts +323 -0
- package/src/mcp-apps/types.js +59 -0
- package/src/mcp-apps/types.js.map +1 -0
- package/src/notification/index.d.ts +1 -0
- package/src/notification/index.js +13 -0
- package/src/notification/index.js.map +1 -0
- package/src/notification/notification.service.d.ts +378 -0
- package/src/notification/notification.service.js +727 -0
- package/src/notification/notification.service.js.map +1 -0
- package/src/plugin/plugin.registry.js +12 -9
- package/src/plugin/plugin.registry.js.map +1 -1
- package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
- package/src/prompt/flows/get-prompt.flow.js +214 -0
- package/src/prompt/flows/get-prompt.flow.js.map +1 -0
- package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
- package/src/prompt/flows/prompts-list.flow.js +176 -0
- package/src/prompt/flows/prompts-list.flow.js.map +1 -0
- package/src/prompt/index.d.ts +7 -0
- package/src/prompt/index.js +17 -0
- package/src/prompt/index.js.map +1 -0
- package/src/prompt/prompt.events.d.ts +17 -0
- package/src/prompt/prompt.events.js +25 -0
- package/src/prompt/prompt.events.js.map +1 -0
- package/src/prompt/prompt.instance.d.ts +30 -0
- package/src/prompt/prompt.instance.js +120 -0
- package/src/prompt/prompt.instance.js.map +1 -0
- package/src/prompt/prompt.registry.d.ts +79 -12
- package/src/prompt/prompt.registry.js +360 -15
- package/src/prompt/prompt.registry.js.map +1 -1
- package/src/prompt/prompt.types.d.ts +26 -0
- package/src/prompt/prompt.types.js +11 -0
- package/src/prompt/prompt.types.js.map +1 -0
- package/src/prompt/prompt.utils.d.ts +26 -0
- package/src/prompt/prompt.utils.js +136 -0
- package/src/prompt/prompt.utils.js.map +1 -0
- package/src/provider/provider.registry.d.ts +12 -5
- package/src/provider/provider.registry.js +30 -138
- package/src/provider/provider.registry.js.map +1 -1
- package/src/regsitry/registry.base.d.ts +1 -1
- package/src/regsitry/registry.base.js.map +1 -1
- package/src/resource/flows/read-resource.flow.d.ts +91 -0
- package/src/resource/flows/read-resource.flow.js +270 -0
- package/src/resource/flows/read-resource.flow.js.map +1 -0
- package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
- package/src/resource/flows/resource-templates-list.flow.js +191 -0
- package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
- package/src/resource/flows/resources-list.flow.d.ts +64 -0
- package/src/resource/flows/resources-list.flow.js +196 -0
- package/src/resource/flows/resources-list.flow.js.map +1 -0
- package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
- package/src/resource/flows/subscribe-resource.flow.js +123 -0
- package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
- package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
- package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
- package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
- package/src/resource/index.d.ts +8 -0
- package/src/resource/index.js +20 -0
- package/src/resource/index.js.map +1 -0
- package/src/resource/resource.events.d.ts +24 -0
- package/src/resource/resource.events.js +17 -0
- package/src/resource/resource.events.js.map +1 -0
- package/src/resource/resource.instance.d.ts +35 -0
- package/src/resource/resource.instance.js +163 -0
- package/src/resource/resource.instance.js.map +1 -0
- package/src/resource/resource.registry.d.ts +106 -12
- package/src/resource/resource.registry.js +449 -13
- package/src/resource/resource.registry.js.map +1 -1
- package/src/resource/resource.types.d.ts +35 -0
- package/src/resource/resource.types.js +11 -0
- package/src/resource/resource.types.js.map +1 -0
- package/src/resource/resource.utils.d.ts +30 -0
- package/src/resource/resource.utils.js +151 -0
- package/src/resource/resource.utils.js.map +1 -0
- package/src/scope/flows/http.request.flow.d.ts +48 -330
- package/src/scope/flows/http.request.flow.js +306 -78
- package/src/scope/flows/http.request.flow.js.map +1 -1
- package/src/scope/scope.instance.d.ts +12 -0
- package/src/scope/scope.instance.js +145 -15
- package/src/scope/scope.instance.js.map +1 -1
- package/src/tool/flows/call-tool.flow.d.ts +64 -1110
- package/src/tool/flows/call-tool.flow.js +303 -15
- package/src/tool/flows/call-tool.flow.js.map +1 -1
- package/src/tool/flows/tools-list.flow.d.ts +32 -473
- package/src/tool/flows/tools-list.flow.js +111 -10
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.events.d.ts +8 -1
- package/src/tool/tool.events.js.map +1 -1
- package/src/tool/tool.instance.d.ts +3 -1
- package/src/tool/tool.instance.js +17 -3
- package/src/tool/tool.instance.js.map +1 -1
- package/src/tool/tool.registry.d.ts +7 -1
- package/src/tool/tool.registry.js +26 -10
- package/src/tool/tool.registry.js.map +1 -1
- package/src/tool/tool.types.d.ts +4 -4
- package/src/tool/tool.types.js.map +1 -1
- package/src/tool/tool.utils.d.ts +3 -12
- package/src/tool/tool.utils.js +39 -193
- package/src/tool/tool.utils.js.map +1 -1
- package/src/tool/ui/index.d.ts +22 -0
- package/src/tool/ui/index.js +63 -0
- package/src/tool/ui/index.js.map +1 -0
- package/src/tool/ui/platform-adapters.d.ts +10 -0
- package/src/tool/ui/platform-adapters.js +18 -0
- package/src/tool/ui/platform-adapters.js.map +1 -0
- package/src/tool/ui/template-helpers.d.ts +46 -0
- package/src/tool/ui/template-helpers.js +112 -0
- package/src/tool/ui/template-helpers.js.map +1 -0
- package/src/tool/ui/ui-resource-template.d.ts +34 -0
- package/src/tool/ui/ui-resource-template.js +64 -0
- package/src/tool/ui/ui-resource-template.js.map +1 -0
- package/src/tool/ui/ui-resource.handler.d.ts +74 -0
- package/src/tool/ui/ui-resource.handler.js +129 -0
- package/src/tool/ui/ui-resource.handler.js.map +1 -0
- package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.local.adapter.js +28 -7
- package/src/transport/adapters/transport.local.adapter.js.map +1 -1
- package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.sse.adapter.js +4 -3
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
- package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
- package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.d.ts +29 -63
- package/src/transport/flows/handle.sse.flow.js +78 -10
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
- package/src/transport/flows/handle.stateless-http.flow.js +102 -0
- package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
- package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
- package/src/transport/flows/handle.streamable-http.flow.js +158 -26
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
- package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
- package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
- package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
- package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/index.d.ts +517 -208
- package/src/transport/mcp-handlers/index.js +39 -2
- package/src/transport/mcp-handlers/index.js.map +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
- package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
- package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
- package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
- package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
- package/src/transport/transport.local.js +7 -2
- package/src/transport/transport.local.js.map +1 -1
- package/src/transport/transport.registry.d.ts +30 -0
- package/src/transport/transport.registry.js +84 -1
- package/src/transport/transport.registry.js.map +1 -1
- package/src/transport/transport.types.d.ts +3 -3
- package/src/transport/transport.types.js.map +1 -1
- package/src/utils/content.utils.d.ts +48 -0
- package/src/utils/content.utils.js +194 -0
- package/src/utils/content.utils.js.map +1 -0
- package/src/utils/index.d.ts +8 -0
- package/src/utils/index.js +55 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/lineage.utils.d.ts +40 -0
- package/src/utils/lineage.utils.js +82 -0
- package/src/utils/lineage.utils.js.map +1 -0
- package/src/utils/naming.utils.d.ts +46 -0
- package/src/utils/naming.utils.js +136 -0
- package/src/utils/naming.utils.js.map +1 -0
- package/src/utils/types.utils.d.ts +2 -2
- package/src/utils/types.utils.js.map +1 -1
- package/src/utils/uri-template.utils.d.ts +57 -0
- package/src/utils/uri-template.utils.js +113 -0
- package/src/utils/uri-template.utils.js.map +1 -0
- package/src/utils/uri-validation.utils.d.ts +40 -0
- package/src/utils/uri-validation.utils.js +76 -0
- package/src/utils/uri-validation.utils.js.map +1 -0
- package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
- package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/index.d.ts +0 -7
- package/src/__test-utils__/fixtures/index.js +0 -11
- package/src/__test-utils__/fixtures/index.js.map +0 -1
- package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
- package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
- package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
- package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
- package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
- package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
- package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
- package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
- package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
- package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
- package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
- package/src/__test-utils__/helpers/async.helpers.js +0 -112
- package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/index.d.ts +0 -6
- package/src/__test-utils__/helpers/index.js +0 -10
- package/src/__test-utils__/helpers/index.js.map +0 -1
- package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
- package/src/__test-utils__/helpers/setup.helpers.js +0 -106
- package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
- package/src/__test-utils__/index.d.ts +0 -9
- package/src/__test-utils__/index.js +0 -14
- package/src/__test-utils__/index.js.map +0 -1
- package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
- package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
- package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
- package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
- package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
- package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/index.d.ts +0 -8
- package/src/__test-utils__/mocks/index.js +0 -12
- package/src/__test-utils__/mocks/index.js.map +0 -1
- package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
- package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
- package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
- package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
- package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
- package/src/auth/path.utils.d.ts +0 -20
- package/src/auth/path.utils.js +0 -71
- package/src/auth/path.utils.js.map +0 -1
- package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
- package/src/common/decorators-old/async-with.decorator.js +0 -24
- package/src/common/decorators-old/async-with.decorator.js.map +0 -1
- package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/auth-hook.decorator.js +0 -27
- package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
- package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/session-hook.decorator.js +0 -27
- package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
|
@@ -1,62 +1,172 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Flow Hook Decorators
|
|
4
|
+
*
|
|
5
|
+
* This module provides decorators for defining flow stages and lifecycle hooks.
|
|
6
|
+
* Supports both legacy TypeScript decorators and TC39 Stage 3 decorators.
|
|
7
|
+
*/
|
|
2
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.resolvePendingTC39HooksForClass = resolvePendingTC39HooksForClass;
|
|
10
|
+
exports.registerPendingTC39Hook = registerPendingTC39Hook;
|
|
11
|
+
exports.consumePendingTC39Hooks = consumePendingTC39Hooks;
|
|
3
12
|
exports.StageHookOf = StageHookOf;
|
|
4
13
|
exports.WillHookOf = WillHookOf;
|
|
5
14
|
exports.DidHookOf = DidHookOf;
|
|
6
15
|
exports.AroundHookOf = AroundHookOf;
|
|
7
16
|
exports.FlowHooksOf = FlowHooksOf;
|
|
8
17
|
const tokens_1 = require("../tokens");
|
|
9
|
-
|
|
10
|
-
|
|
18
|
+
const decorator_utils_1 = require("./decorator-utils");
|
|
19
|
+
/**
|
|
20
|
+
* Pending metadata registry for TC39 decorators
|
|
21
|
+
* Stores hook metadata keyed by method function until class is processed
|
|
22
|
+
*/
|
|
23
|
+
const pendingHookRegistry = new decorator_utils_1.PendingMetadataRegistry();
|
|
24
|
+
/**
|
|
25
|
+
* Register hook metadata on a class constructor
|
|
26
|
+
*/
|
|
27
|
+
function registerHookOnClass(ctor, meta) {
|
|
11
28
|
const arr = Reflect.getMetadata(tokens_1.FrontMcpFlowHookTokens.hooks, ctor) ?? [];
|
|
12
29
|
arr.push(meta);
|
|
13
30
|
Reflect.defineMetadata(tokens_1.FrontMcpFlowHookTokens.hooks, arr, ctor);
|
|
14
31
|
}
|
|
15
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Resolve all pending TC39 hooks for a class by scanning its prototype
|
|
34
|
+
* This is called by collectFlowHookMap during flow registration
|
|
35
|
+
*/
|
|
36
|
+
function resolvePendingTC39HooksForClass(ctor) {
|
|
37
|
+
return pendingHookRegistry.resolveForClass(ctor);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Store a pending hook for TC39 mode
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
function registerPendingTC39Hook(method, meta) {
|
|
44
|
+
pendingHookRegistry.store(method, meta);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get and clear pending hooks for a method (TC39 mode)
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
function consumePendingTC39Hooks(method) {
|
|
51
|
+
return pendingHookRegistry.consume(method);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Base factory for creating hook decorators
|
|
55
|
+
* Works with both legacy TypeScript and TC39 Stage 3 decorators
|
|
56
|
+
*/
|
|
16
57
|
function make(flow, type) {
|
|
17
58
|
return function (stage, opts = {}) {
|
|
18
|
-
return (target,
|
|
59
|
+
return (target, keyOrContext, _desc) => {
|
|
19
60
|
const { priority = 0, filter, ...rest } = opts;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
method
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
61
|
+
// Detect TC39 Stage 3 decorators vs legacy TypeScript decorators
|
|
62
|
+
if ((0, decorator_utils_1.isTC39MethodContext)(keyOrContext)) {
|
|
63
|
+
// TC39 Stage 3 decorator style
|
|
64
|
+
const context = keyOrContext;
|
|
65
|
+
const methodName = String(context.name);
|
|
66
|
+
const isStatic = context.static;
|
|
67
|
+
const method = target; // In TC39, target is the method function itself
|
|
68
|
+
const meta = {
|
|
69
|
+
...rest,
|
|
70
|
+
[tokens_1.FrontMcpFlowHookTokens.type]: true,
|
|
71
|
+
flow: flow,
|
|
72
|
+
type: type,
|
|
73
|
+
stage: stage,
|
|
74
|
+
method: methodName,
|
|
75
|
+
priority: priority,
|
|
76
|
+
filter: filter,
|
|
77
|
+
target: null, // Will be resolved at execution time
|
|
78
|
+
static: isStatic,
|
|
79
|
+
};
|
|
80
|
+
// Store as pending - resolved when collectFlowHookMap processes the class
|
|
81
|
+
pendingHookRegistry.store(method, meta);
|
|
82
|
+
// Return the original method unchanged
|
|
83
|
+
return target;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Legacy TypeScript decorator style
|
|
87
|
+
const key = keyOrContext;
|
|
88
|
+
const methodName = String(key);
|
|
89
|
+
const isStatic = typeof target === 'function';
|
|
90
|
+
const ctor = isStatic ? target : target.constructor;
|
|
91
|
+
const meta = {
|
|
92
|
+
...rest,
|
|
93
|
+
[tokens_1.FrontMcpFlowHookTokens.type]: true,
|
|
94
|
+
flow: flow,
|
|
95
|
+
type: type,
|
|
96
|
+
stage: stage,
|
|
97
|
+
method: methodName,
|
|
98
|
+
priority: priority,
|
|
99
|
+
filter: filter,
|
|
100
|
+
target: target,
|
|
101
|
+
static: isStatic,
|
|
102
|
+
};
|
|
103
|
+
// Register immediately on the class
|
|
104
|
+
registerHookOnClass(ctor, meta);
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
32
107
|
};
|
|
33
108
|
};
|
|
34
109
|
}
|
|
35
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* Creates a typed Stage hook decorator for a specific flow
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* const { Stage } = FlowHooksOf('http:request');
|
|
115
|
+
*
|
|
116
|
+
* class HttpRequestFlow {
|
|
117
|
+
* @Stage('checkAuthorization')
|
|
118
|
+
* async checkAuthorization() { ... }
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
36
122
|
function StageHookOf(flow) {
|
|
37
123
|
const base = make(flow, 'stage');
|
|
38
124
|
return function (stage, opts = {}) {
|
|
39
125
|
return base(stage, opts);
|
|
40
126
|
};
|
|
41
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Creates a typed Will hook decorator (runs before stage)
|
|
130
|
+
*/
|
|
42
131
|
function WillHookOf(flow) {
|
|
43
132
|
const base = make(flow, 'will');
|
|
44
133
|
return function (stage, opts = {}) {
|
|
45
134
|
return base(stage, opts);
|
|
46
135
|
};
|
|
47
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Creates a typed Did hook decorator (runs after stage)
|
|
139
|
+
*/
|
|
48
140
|
function DidHookOf(flow) {
|
|
49
141
|
const base = make(flow, 'did');
|
|
50
142
|
return function (stage, opts = {}) {
|
|
51
143
|
return base(stage, opts);
|
|
52
144
|
};
|
|
53
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Creates a typed Around hook decorator (wraps stage execution)
|
|
148
|
+
*/
|
|
54
149
|
function AroundHookOf(name) {
|
|
55
150
|
const base = make(name, 'around');
|
|
56
151
|
return function (stage, opts = {}) {
|
|
57
152
|
return base(stage, opts);
|
|
58
153
|
};
|
|
59
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Creates all hook decorators for a specific flow
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const { Stage, Will, Did, Around } = FlowHooksOf('http:request');
|
|
160
|
+
*
|
|
161
|
+
* class HttpRequestFlow {
|
|
162
|
+
* @Stage('checkAuthorization')
|
|
163
|
+
* async checkAuthorization() { ... }
|
|
164
|
+
*
|
|
165
|
+
* @Will('execute', { priority: 10 })
|
|
166
|
+
* async beforeExecute() { ... }
|
|
167
|
+
* }
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
60
170
|
function FlowHooksOf(name) {
|
|
61
171
|
return {
|
|
62
172
|
Stage: StageHookOf(name),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/hook.decorator.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"hook.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/hook.decorator.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAyBH,0EAEC;AAMD,0DAEC;AAMD,0DAEC;AA8ED,kCAOC;AAKD,gCAOC;AAKD,8BAOC;AAKD,oCAOC;AAiBD,kCAOC;AAzLD,sCAAmD;AACnD,uDAAyG;AAEzG;;;GAGG;AACH,MAAM,mBAAmB,GAAG,IAAI,yCAAuB,EAAgB,CAAC;AAExE;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAc,EAAE,IAAkB;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,+BAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,SAAgB,+BAA+B,CAAC,IAAc;IAC5D,OAAO,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAgB,EAAE,IAAkB;IAC1E,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAgB;IACtD,OAAO,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAS,IAAI,CAAC,IAAc,EAAE,IAAmB;IAC/C,OAAO,UAAoD,KAAQ,EAAE,OAAyB,EAAE;QAC9F,OAAO,CAAC,MAAW,EAAE,YAAiB,EAAE,KAA0B,EAAO,EAAE;YACzE,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YAE/C,iEAAiE;YACjE,IAAI,IAAA,qCAAmB,EAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,+BAA+B;gBAC/B,MAAM,OAAO,GAAG,YAAiC,CAAC;gBAClD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;gBAChC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,gDAAgD;gBAEvE,MAAM,IAAI,GAAiB;oBACzB,GAAG,IAAI;oBACP,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,IAAI;oBACnC,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,IAAI,EAAE,qCAAqC;oBACnD,MAAM,EAAE,QAAQ;iBACjB,CAAC;gBAEF,0EAA0E;gBAC1E,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAExC,uCAAuC;gBACvC,OAAO,MAAM,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,MAAM,GAAG,GAAG,YAAY,CAAC;gBACzB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC;gBAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gBAEpD,MAAM,IAAI,GAAiB;oBACzB,GAAG,IAAI;oBACP,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,IAAI;oBACnC,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,QAAQ;iBACjB,CAAC;gBAEF,oCAAoC;gBACpC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEhC,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,WAAW,CAAwB,IAAU;IAG3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAwB,IAAU;IAG1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAwB,IAAU;IAGzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAwB,IAAU;IAG5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,WAAW,CAAwB,IAAU;IAC3D,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QACtB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC;QACpB,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Flow Hook Decorators\n *\n * This module provides decorators for defining flow stages and lifecycle hooks.\n * Supports both legacy TypeScript decorators and TC39 Stage 3 decorators.\n */\n\nimport { HookStageType, HookOptions, FlowName, HookMetadata } from '../metadata';\nimport { FrontMcpFlowHookTokens } from '../tokens';\nimport { isTC39MethodContext, PendingMetadataRegistry, type TC39MethodContext } from './decorator-utils';\n\n/**\n * Pending metadata registry for TC39 decorators\n * Stores hook metadata keyed by method function until class is processed\n */\nconst pendingHookRegistry = new PendingMetadataRegistry<HookMetadata>();\n\n/**\n * Register hook metadata on a class constructor\n */\nfunction registerHookOnClass(ctor: Function, meta: HookMetadata): void {\n const arr = Reflect.getMetadata(FrontMcpFlowHookTokens.hooks, ctor) ?? [];\n arr.push(meta);\n Reflect.defineMetadata(FrontMcpFlowHookTokens.hooks, arr, ctor);\n}\n\n/**\n * Resolve all pending TC39 hooks for a class by scanning its prototype\n * This is called by collectFlowHookMap during flow registration\n */\nexport function resolvePendingTC39HooksForClass(ctor: Function): HookMetadata[] {\n return pendingHookRegistry.resolveForClass(ctor);\n}\n\n/**\n * Store a pending hook for TC39 mode\n * @internal\n */\nexport function registerPendingTC39Hook(method: Function, meta: HookMetadata): void {\n pendingHookRegistry.store(method, meta);\n}\n\n/**\n * Get and clear pending hooks for a method (TC39 mode)\n * @internal\n */\nexport function consumePendingTC39Hooks(method: Function): HookMetadata[] {\n return pendingHookRegistry.consume(method);\n}\n\n/**\n * Base factory for creating hook decorators\n * Works with both legacy TypeScript and TC39 Stage 3 decorators\n */\nfunction make(flow: FlowName, type: HookStageType) {\n return function <Ctx = unknown, T extends string = string>(stage: T, opts: HookOptions<Ctx> = {}): MethodDecorator {\n return (target: any, keyOrContext: any, _desc?: PropertyDescriptor): any => {\n const { priority = 0, filter, ...rest } = opts;\n\n // Detect TC39 Stage 3 decorators vs legacy TypeScript decorators\n if (isTC39MethodContext(keyOrContext)) {\n // TC39 Stage 3 decorator style\n const context = keyOrContext as TC39MethodContext;\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 meta: HookMetadata = {\n ...rest,\n [FrontMcpFlowHookTokens.type]: true,\n flow: flow,\n type: type,\n stage: stage,\n method: methodName,\n priority: priority,\n filter: filter,\n target: null, // Will be resolved at execution time\n static: isStatic,\n };\n\n // Store as pending - resolved when collectFlowHookMap processes the class\n pendingHookRegistry.store(method, meta);\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 ctor = isStatic ? target : target.constructor;\n\n const meta: HookMetadata = {\n ...rest,\n [FrontMcpFlowHookTokens.type]: true,\n flow: flow,\n type: type,\n stage: stage,\n method: methodName,\n priority: priority,\n filter: filter,\n target: target,\n static: isStatic,\n };\n\n // Register immediately on the class\n registerHookOnClass(ctor, meta);\n\n return undefined;\n }\n };\n };\n}\n\n/**\n * Creates a typed Stage hook decorator for a specific flow\n * @example\n * ```typescript\n * const { Stage } = FlowHooksOf('http:request');\n *\n * class HttpRequestFlow {\n * @Stage('checkAuthorization')\n * async checkAuthorization() { ... }\n * }\n * ```\n */\nexport function StageHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage'];\n type Ctx = ExtendFlows[Name]['ctx'];\n const base = make(flow, 'stage');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\n/**\n * Creates a typed Will hook decorator (runs before stage)\n */\nexport function WillHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage'];\n type Ctx = ExtendFlows[Name]['ctx'];\n const base = make(flow, 'will');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\n/**\n * Creates a typed Did hook decorator (runs after stage)\n */\nexport function DidHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage'];\n type Ctx = ExtendFlows[Name]['ctx'];\n const base = make(flow, 'did');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\n/**\n * Creates a typed Around hook decorator (wraps stage execution)\n */\nexport function AroundHookOf<Name extends FlowName>(name: Name) {\n type T = ExtendFlows[Name]['stage'];\n type Ctx = ExtendFlows[Name]['ctx'];\n const base = make(name, 'around');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\n/**\n * Creates all hook decorators for a specific flow\n * @example\n * ```typescript\n * const { Stage, Will, Did, Around } = FlowHooksOf('http:request');\n *\n * class HttpRequestFlow {\n * @Stage('checkAuthorization')\n * async checkAuthorization() { ... }\n *\n * @Will('execute', { priority: 10 })\n * async beforeExecute() { ... }\n * }\n * ```\n */\nexport function FlowHooksOf<Name extends FlowName>(name: Name) {\n return {\n Stage: StageHookOf(name),\n Will: WillHookOf(name),\n Did: DidHookOf(name),\n Around: AroundHookOf(name),\n };\n}\n"]}
|
|
@@ -4,4 +4,4 @@ import { PluginMetadata } from '../metadata';
|
|
|
4
4
|
* Decorator that marks a class as a McpPlugin and provides metadata
|
|
5
5
|
*/
|
|
6
6
|
declare function FrontMcpPlugin(providedMetadata: PluginMetadata): ClassDecorator;
|
|
7
|
-
export { FrontMcpPlugin, FrontMcpPlugin as Plugin
|
|
7
|
+
export { FrontMcpPlugin, FrontMcpPlugin as Plugin };
|
|
@@ -12,20 +12,21 @@ function FrontMcpPlugin(providedMetadata) {
|
|
|
12
12
|
return (target) => {
|
|
13
13
|
const { error, data: metadata } = metadata_1.frontMcpPluginMetadataSchema.safeParse(providedMetadata);
|
|
14
14
|
if (error) {
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
const formatted = error.format();
|
|
16
|
+
if (formatted.providers) {
|
|
17
|
+
throw new Error(`Invalid metadata provided to @FrontMcpProvider or @Provider: \n${JSON.stringify(formatted.providers, null, 2)}`);
|
|
17
18
|
}
|
|
18
|
-
if (
|
|
19
|
-
throw new Error(`Invalid metadata provided to @FrontMcpAdapter or @Adapter: \n${JSON.stringify(
|
|
19
|
+
if (formatted.adapters) {
|
|
20
|
+
throw new Error(`Invalid metadata provided to @FrontMcpAdapter or @Adapter: \n${JSON.stringify(formatted.adapters, null, 2)}`);
|
|
20
21
|
}
|
|
21
|
-
if (
|
|
22
|
-
throw new Error(`Invalid metadata provided to @FrontMcpTool or @Tool: \n${JSON.stringify(
|
|
22
|
+
if (formatted.tools) {
|
|
23
|
+
throw new Error(`Invalid metadata provided to @FrontMcpTool or @Tool: \n${JSON.stringify(formatted.tools, null, 2)}`);
|
|
23
24
|
}
|
|
24
|
-
if (
|
|
25
|
-
throw new Error(`Invalid metadata provided to @FrontMcpResource or @Resource: \n${JSON.stringify(
|
|
25
|
+
if (formatted.resources) {
|
|
26
|
+
throw new Error(`Invalid metadata provided to @FrontMcpResource or @Resource: \n${JSON.stringify(formatted.resources, null, 2)}`);
|
|
26
27
|
}
|
|
27
|
-
if (
|
|
28
|
-
throw new Error(`Invalid metadata provided to @FrontMcpPrompt or @Prompt: \n${JSON.stringify(
|
|
28
|
+
if (formatted.prompts) {
|
|
29
|
+
throw new Error(`Invalid metadata provided to @FrontMcpPrompt or @Prompt: \n${JSON.stringify(formatted.prompts, null, 2)}`);
|
|
29
30
|
}
|
|
30
31
|
throw error;
|
|
31
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/plugin.decorator.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"plugin.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/plugin.decorator.ts"],"names":[],"mappings":";;AAuDS,wCAAc;AAAoB,gCAAM;AAvDjD,4BAA0B;AAC1B,sCAAiD;AACjD,0CAA2E;AAE3E;;GAEG;AACH,SAAS,cAAc,CAAC,gBAAgC;IACtD,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,uCAA4B,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3F,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,kEAAkE,IAAI,CAAC,SAAS,CAC9E,SAAS,CAAC,SAAS,EACnB,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,gEAAgE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAC9G,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACb,0DAA0D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CACrG,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,kEAAkE,IAAI,CAAC,SAAS,CAC9E,SAAS,CAAC,SAAS,EACnB,IAAI,EACJ,CAAC,CACF,EAAE,CACJ,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,8DAA8D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAC3G,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,6BAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,6BAAoB,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { FrontMcpPluginTokens } from '../tokens';\nimport { PluginMetadata, frontMcpPluginMetadataSchema } from '../metadata';\n\n/**\n * Decorator that marks a class as a McpPlugin and provides metadata\n */\nfunction FrontMcpPlugin(providedMetadata: PluginMetadata): ClassDecorator {\n return (target: Function) => {\n const { error, data: metadata } = frontMcpPluginMetadataSchema.safeParse(providedMetadata);\n if (error) {\n const formatted = error.format();\n if (formatted.providers) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpProvider or @Provider: \\n${JSON.stringify(\n formatted.providers,\n null,\n 2,\n )}`,\n );\n }\n if (formatted.adapters) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpAdapter or @Adapter: \\n${JSON.stringify(formatted.adapters, null, 2)}`,\n );\n }\n if (formatted.tools) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpTool or @Tool: \\n${JSON.stringify(formatted.tools, null, 2)}`,\n );\n }\n if (formatted.resources) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpResource or @Resource: \\n${JSON.stringify(\n formatted.resources,\n null,\n 2,\n )}`,\n );\n }\n if (formatted.prompts) {\n throw new Error(\n `Invalid metadata provided to @FrontMcpPrompt or @Prompt: \\n${JSON.stringify(formatted.prompts, null, 2)}`,\n );\n }\n throw error;\n }\n\n Reflect.defineMetadata(FrontMcpPluginTokens.type, true, target);\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpPluginTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\nexport { FrontMcpPlugin, FrontMcpPlugin as Plugin };\n"]}
|
|
@@ -10,8 +10,37 @@ declare function FrontMcpResource(providedMetadata: ResourceMetadata): ClassDeco
|
|
|
10
10
|
*/
|
|
11
11
|
declare function FrontMcpResourceTemplate(providedMetadata: ResourceTemplateMetadata): ClassDecorator;
|
|
12
12
|
export type FrontMcpResourceExecuteHandler = (uri: ReadResourceRequest['params']['uri'], ...tokens: any[]) => ReadResourceResult | Promise<ReadResourceResult>;
|
|
13
|
+
export type FrontMcpResourceTemplateExecuteHandler = (uri: ReadResourceRequest['params']['uri'], params: Record<string, string>, ...tokens: any[]) => ReadResourceResult | Promise<ReadResourceResult>;
|
|
13
14
|
/**
|
|
14
|
-
*
|
|
15
|
+
* Function builder that creates a function-style static resource.
|
|
16
|
+
* Use for simple resources that don't need class-based context.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const AppConfig = resource({
|
|
21
|
+
* name: 'app-config',
|
|
22
|
+
* uri: 'config://app',
|
|
23
|
+
* mimeType: 'application/json',
|
|
24
|
+
* })((uri) => ({
|
|
25
|
+
* contents: [{ uri, text: JSON.stringify({ version: '1.0.0' }) }]
|
|
26
|
+
* }));
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare function frontMcpResource<T extends ResourceMetadata>(providedMetadata: T): (handler: FrontMcpResourceExecuteHandler) => () => FrontMcpResourceExecuteHandler;
|
|
30
|
+
/**
|
|
31
|
+
* Function builder that creates a function-style resource template.
|
|
32
|
+
* Use for simple templated resources that don't need class-based context.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const UserProfile = resourceTemplate({
|
|
37
|
+
* name: 'user-profile',
|
|
38
|
+
* uriTemplate: 'users://{userId}/profile',
|
|
39
|
+
* mimeType: 'application/json',
|
|
40
|
+
* })((uri, params) => ({
|
|
41
|
+
* contents: [{ uri, text: JSON.stringify({ id: params.userId }) }]
|
|
42
|
+
* }));
|
|
43
|
+
* ```
|
|
15
44
|
*/
|
|
16
|
-
declare function
|
|
17
|
-
export { FrontMcpResource, FrontMcpResource as Resource, FrontMcpResourceTemplate, FrontMcpResourceTemplate as ResourceTemplate, frontMcpResource, frontMcpResource as resource, };
|
|
45
|
+
declare function frontMcpResourceTemplate<T extends ResourceTemplateMetadata>(providedMetadata: T): (handler: FrontMcpResourceTemplateExecuteHandler) => () => FrontMcpResourceTemplateExecuteHandler;
|
|
46
|
+
export { FrontMcpResource, FrontMcpResource as Resource, FrontMcpResourceTemplate, FrontMcpResourceTemplate as ResourceTemplate, frontMcpResource, frontMcpResource as resource, frontMcpResourceTemplate, frontMcpResourceTemplate as resourceTemplate, };
|
|
@@ -6,6 +6,8 @@ exports.FrontMcpResourceTemplate = FrontMcpResourceTemplate;
|
|
|
6
6
|
exports.ResourceTemplate = FrontMcpResourceTemplate;
|
|
7
7
|
exports.frontMcpResource = frontMcpResource;
|
|
8
8
|
exports.resource = frontMcpResource;
|
|
9
|
+
exports.frontMcpResourceTemplate = frontMcpResourceTemplate;
|
|
10
|
+
exports.resourceTemplate = frontMcpResourceTemplate;
|
|
9
11
|
require("reflect-metadata");
|
|
10
12
|
const tokens_1 = require("../tokens");
|
|
11
13
|
const metadata_1 = require("../metadata");
|
|
@@ -34,19 +36,59 @@ function FrontMcpResourceTemplate(providedMetadata) {
|
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
38
|
/**
|
|
37
|
-
*
|
|
39
|
+
* Function builder that creates a function-style static resource.
|
|
40
|
+
* Use for simple resources that don't need class-based context.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const AppConfig = resource({
|
|
45
|
+
* name: 'app-config',
|
|
46
|
+
* uri: 'config://app',
|
|
47
|
+
* mimeType: 'application/json',
|
|
48
|
+
* })((uri) => ({
|
|
49
|
+
* contents: [{ uri, text: JSON.stringify({ version: '1.0.0' }) }]
|
|
50
|
+
* }));
|
|
51
|
+
* ```
|
|
38
52
|
*/
|
|
39
53
|
function frontMcpResource(providedMetadata) {
|
|
40
54
|
return (execute) => {
|
|
41
55
|
const metadata = metadata_1.frontMcpResourceMetadataSchema.parse(providedMetadata);
|
|
42
|
-
const
|
|
56
|
+
const resourceFunction = function () {
|
|
43
57
|
return execute;
|
|
44
58
|
};
|
|
45
|
-
Object.assign(
|
|
59
|
+
Object.assign(resourceFunction, {
|
|
46
60
|
[tokens_1.FrontMcpResourceTokens.type]: 'function-resource',
|
|
47
61
|
[tokens_1.FrontMcpResourceTokens.metadata]: metadata,
|
|
48
62
|
});
|
|
49
|
-
return
|
|
63
|
+
return resourceFunction;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Function builder that creates a function-style resource template.
|
|
68
|
+
* Use for simple templated resources that don't need class-based context.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* const UserProfile = resourceTemplate({
|
|
73
|
+
* name: 'user-profile',
|
|
74
|
+
* uriTemplate: 'users://{userId}/profile',
|
|
75
|
+
* mimeType: 'application/json',
|
|
76
|
+
* })((uri, params) => ({
|
|
77
|
+
* contents: [{ uri, text: JSON.stringify({ id: params.userId }) }]
|
|
78
|
+
* }));
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
function frontMcpResourceTemplate(providedMetadata) {
|
|
82
|
+
return (execute) => {
|
|
83
|
+
const metadata = metadata_1.frontMcpResourceTemplateMetadataSchema.parse(providedMetadata);
|
|
84
|
+
const resourceFunction = function () {
|
|
85
|
+
return execute;
|
|
86
|
+
};
|
|
87
|
+
Object.assign(resourceFunction, {
|
|
88
|
+
[tokens_1.FrontMcpResourceTemplateTokens.type]: 'function-resource-template',
|
|
89
|
+
[tokens_1.FrontMcpResourceTemplateTokens.metadata]: metadata,
|
|
90
|
+
});
|
|
91
|
+
return resourceFunction;
|
|
50
92
|
};
|
|
51
93
|
}
|
|
52
94
|
//# sourceMappingURL=resource.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/resource.decorator.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"resource.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/resource.decorator.ts"],"names":[],"mappings":";;AAmHE,4CAAgB;AACI,oCAAQ;AAC5B,4DAAwB;AACI,oDAAgB;AAC5C,4CAAgB;AACI,oCAAQ;AAC5B,4DAAwB;AACI,oDAAgB;AA1H9C,4BAA0B;AAC1B,sCAAmF;AACnF,0CAKqB;AAIrB;;GAEG;AACH,SAAS,gBAAgB,CAAC,gBAAkC;IAC1D,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,yCAA8B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAExE,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAElE,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACnG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,gBAA0C;IAC1E,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,iDAAsC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAEhF,OAAO,CAAC,cAAc,CAAC,uCAA8B,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAE1E,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,uCAA8B,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAaD;;;;;;;;;;;;;;GAcG;AACH,SAAS,gBAAgB,CACvB,gBAAmB;IAEnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,yCAA8B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxE,MAAM,gBAAgB,GAAG;YACvB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC9B,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,mBAAmB;YAClD,CAAC,+BAAsB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SAC5C,CAAC,CAAC;QACH,OAAO,gBAAgB,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,wBAAwB,CAC/B,gBAAmB;IAEnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,iDAAsC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChF,MAAM,gBAAgB,GAAG;YACvB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC9B,CAAC,uCAA8B,CAAC,IAAI,CAAC,EAAE,4BAA4B;YACnE,CAAC,uCAA8B,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACpD,CAAC,CAAC;QACH,OAAO,gBAAgB,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { FrontMcpResourceTokens, FrontMcpResourceTemplateTokens } from '../tokens';\nimport {\n frontMcpResourceMetadataSchema,\n frontMcpResourceTemplateMetadataSchema,\n ResourceMetadata,\n ResourceTemplateMetadata,\n} from '../metadata';\n\nimport { ReadResourceRequest, ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Decorator that marks a class as a McpResource module and provides metadata\n */\nfunction FrontMcpResource(providedMetadata: ResourceMetadata): ClassDecorator {\n return (target: Function) => {\n const metadata = frontMcpResourceMetadataSchema.parse(providedMetadata);\n\n Reflect.defineMetadata(FrontMcpResourceTokens.type, true, target);\n\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpResourceTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\n/**\n * Decorator that marks a class as a McpResourceTemplate module and provides metadata\n */\nfunction FrontMcpResourceTemplate(providedMetadata: ResourceTemplateMetadata): ClassDecorator {\n return (target: Function) => {\n const metadata = frontMcpResourceTemplateMetadataSchema.parse(providedMetadata);\n\n Reflect.defineMetadata(FrontMcpResourceTemplateTokens.type, true, target);\n\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpResourceTemplateTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\nexport type FrontMcpResourceExecuteHandler = (\n uri: ReadResourceRequest['params']['uri'],\n ...tokens: any[]\n) => ReadResourceResult | Promise<ReadResourceResult>;\n\nexport type FrontMcpResourceTemplateExecuteHandler = (\n uri: ReadResourceRequest['params']['uri'],\n params: Record<string, string>,\n ...tokens: any[]\n) => ReadResourceResult | Promise<ReadResourceResult>;\n\n/**\n * Function builder that creates a function-style static resource.\n * Use for simple resources that don't need class-based context.\n *\n * @example\n * ```ts\n * const AppConfig = resource({\n * name: 'app-config',\n * uri: 'config://app',\n * mimeType: 'application/json',\n * })((uri) => ({\n * contents: [{ uri, text: JSON.stringify({ version: '1.0.0' }) }]\n * }));\n * ```\n */\nfunction frontMcpResource<T extends ResourceMetadata>(\n providedMetadata: T,\n): (handler: FrontMcpResourceExecuteHandler) => () => FrontMcpResourceExecuteHandler {\n return (execute) => {\n const metadata = frontMcpResourceMetadataSchema.parse(providedMetadata);\n const resourceFunction = function () {\n return execute;\n };\n Object.assign(resourceFunction, {\n [FrontMcpResourceTokens.type]: 'function-resource',\n [FrontMcpResourceTokens.metadata]: metadata,\n });\n return resourceFunction;\n };\n}\n\n/**\n * Function builder that creates a function-style resource template.\n * Use for simple templated resources that don't need class-based context.\n *\n * @example\n * ```ts\n * const UserProfile = resourceTemplate({\n * name: 'user-profile',\n * uriTemplate: 'users://{userId}/profile',\n * mimeType: 'application/json',\n * })((uri, params) => ({\n * contents: [{ uri, text: JSON.stringify({ id: params.userId }) }]\n * }));\n * ```\n */\nfunction frontMcpResourceTemplate<T extends ResourceTemplateMetadata>(\n providedMetadata: T,\n): (handler: FrontMcpResourceTemplateExecuteHandler) => () => FrontMcpResourceTemplateExecuteHandler {\n return (execute) => {\n const metadata = frontMcpResourceTemplateMetadataSchema.parse(providedMetadata);\n const resourceFunction = function () {\n return execute;\n };\n Object.assign(resourceFunction, {\n [FrontMcpResourceTemplateTokens.type]: 'function-resource-template',\n [FrontMcpResourceTemplateTokens.metadata]: metadata,\n });\n return resourceFunction;\n };\n}\n\nexport {\n FrontMcpResource,\n FrontMcpResource as Resource,\n FrontMcpResourceTemplate,\n FrontMcpResourceTemplate as ResourceTemplate,\n frontMcpResource,\n frontMcpResource as resource,\n frontMcpResourceTemplate,\n frontMcpResourceTemplate as resourceTemplate,\n};\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import { ToolMetadata, ImageOutputSchema, AudioOutputSchema, ResourceOutputSchema, ResourceLinkOutputSchema, ToolInputType, ToolOutputType } from '../metadata';
|
|
3
|
+
import type { ToolUIConfig } from '../metadata/tool-ui.metadata';
|
|
3
4
|
import z from 'zod';
|
|
4
5
|
import { ToolContext } from '../interfaces';
|
|
5
6
|
export type FrontMcpToolExecuteHandler<InSchema extends ToolInputType, OutSchema extends ToolOutputType, In = ToolInputOf<{
|
|
@@ -21,7 +22,7 @@ export { FrontMcpTool, FrontMcpTool as Tool, frontMcpTool, frontMcpTool as tool
|
|
|
21
22
|
* Don't move below code outside the decorator file, it will break the module augmentation.
|
|
22
23
|
*/
|
|
23
24
|
type __Shape = z.ZodRawShape;
|
|
24
|
-
type __AsZodObj<T> = T extends z.ZodObject<
|
|
25
|
+
type __AsZodObj<T> = T extends z.ZodObject<any> ? T : T extends z.ZodRawShape ? z.ZodObject<T> : never;
|
|
25
26
|
export type ToolInputOf<Opt> = Opt extends {
|
|
26
27
|
inputSchema: infer I;
|
|
27
28
|
} ? z.infer<__AsZodObj<I>> : never;
|
|
@@ -29,12 +30,12 @@ export type ToolInputOf<Opt> = Opt extends {
|
|
|
29
30
|
* Helper to infer the return type from any Zod schema,
|
|
30
31
|
* including ZodRawShape.
|
|
31
32
|
*/
|
|
32
|
-
type __InferZod<S> = S extends z.
|
|
33
|
+
type __InferZod<S> = S extends z.ZodType ? z.infer<S> : S extends z.ZodRawShape ? z.infer<z.ZodObject<S>> : never;
|
|
33
34
|
/**
|
|
34
35
|
* Infers the *output type* from a *single schema definition*
|
|
35
36
|
* based on the new ToolSingleOutputType.
|
|
36
37
|
*/
|
|
37
|
-
type __InferFromSingleSchema<S> = S extends 'image' ? z.infer<typeof ImageOutputSchema> : S extends 'audio' ? z.infer<typeof AudioOutputSchema> : S extends 'resource' ? z.infer<typeof ResourceOutputSchema> : S extends 'resource_link' ? z.infer<typeof ResourceLinkOutputSchema> : S extends 'string' ? string : S extends 'number' ? number : S extends 'boolean' ? boolean : S extends 'date' ? Date : S extends z.
|
|
38
|
+
type __InferFromSingleSchema<S> = S extends 'image' ? z.infer<typeof ImageOutputSchema> : S extends 'audio' ? z.infer<typeof AudioOutputSchema> : S extends 'resource' ? z.infer<typeof ResourceOutputSchema> : S extends 'resource_link' ? z.infer<typeof ResourceLinkOutputSchema> : S extends 'string' ? string : S extends 'number' ? number : S extends 'boolean' ? boolean : S extends 'date' ? Date : S extends z.ZodType | z.ZodRawShape ? __InferZod<S> : any;
|
|
38
39
|
/**
|
|
39
40
|
* Infers a tuple/array of output types from an array of schemas
|
|
40
41
|
*/
|
|
@@ -53,11 +54,59 @@ type __ImageOutputType = 'image';
|
|
|
53
54
|
type __AudioOutputType = 'audio';
|
|
54
55
|
type __ResourceOutputType = 'resource';
|
|
55
56
|
type __ResourceLinkOutputType = 'resource_link';
|
|
56
|
-
type __StructuredOutputType = z.ZodRawShape | z.ZodObject<any> | z.ZodArray<
|
|
57
|
+
type __StructuredOutputType = z.ZodRawShape | z.ZodObject<any> | z.ZodArray<z.ZodType> | z.ZodUnion<[z.ZodObject<any>, ...z.ZodObject<any>[]]> | z.ZodDiscriminatedUnion<z.ZodObject<any>[]>;
|
|
57
58
|
type __ToolSingleOutputType = __PrimitiveOutputType | __ImageOutputType | __AudioOutputType | __ResourceOutputType | __ResourceLinkOutputType | __StructuredOutputType;
|
|
58
59
|
type __OutputSchema = __ToolSingleOutputType | __ToolSingleOutputType[];
|
|
59
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Base tool metadata options without UI field.
|
|
62
|
+
*/
|
|
63
|
+
type __ToolMetadataBase<I extends __Shape, O extends __OutputSchema> = ToolMetadata<I | z.ZodObject<I>, // inputSchema can be a raw shape or ZodObject
|
|
60
64
|
O>;
|
|
65
|
+
/**
|
|
66
|
+
* Tool metadata options with optional UI configuration.
|
|
67
|
+
*
|
|
68
|
+
* The `ui` property accepts a `ToolUIConfig` from `@frontmcp/ui/types`
|
|
69
|
+
* for configuring interactive widget rendering.
|
|
70
|
+
*/
|
|
71
|
+
export type ToolMetadataOptions<I extends __Shape, O extends __OutputSchema> = __ToolMetadataBase<I, O> & {
|
|
72
|
+
/**
|
|
73
|
+
* UI template configuration for rendering interactive widgets.
|
|
74
|
+
*
|
|
75
|
+
* The template builder function receives typed `ctx.input` and `ctx.output`
|
|
76
|
+
* based on the tool's `inputSchema` and `outputSchema`.
|
|
77
|
+
*
|
|
78
|
+
* @see {@link ToolUIConfig} for all available options including:
|
|
79
|
+
* - `template`: React component, HTML string, or builder function
|
|
80
|
+
* - `servingMode`: 'inline' | 'static' | 'hybrid' | 'direct-url' | 'custom-url'
|
|
81
|
+
* - `csp`: Content Security Policy configuration
|
|
82
|
+
* - `widgetAccessible`: Enable MCP bridge for tool calls from widget
|
|
83
|
+
* - `displayMode`: 'inline' | 'fullscreen' | 'pip'
|
|
84
|
+
* - And more...
|
|
85
|
+
*
|
|
86
|
+
* @example HTML template builder with typed context
|
|
87
|
+
* ```typescript
|
|
88
|
+
* ui: {
|
|
89
|
+
* template: (ctx) => `<div>${ctx.helpers.escapeHtml(ctx.output.name)}</div>`,
|
|
90
|
+
* // ctx.output is typed based on outputSchema
|
|
91
|
+
* servingMode: 'inline',
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @example React component
|
|
96
|
+
* ```typescript
|
|
97
|
+
* import WeatherCard from './weather-ui';
|
|
98
|
+
* ui: {
|
|
99
|
+
* template: WeatherCard,
|
|
100
|
+
* servingMode: 'static',
|
|
101
|
+
* }
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
ui?: ToolUIConfig<ToolInputOf<{
|
|
105
|
+
inputSchema: I | z.ZodObject<I>;
|
|
106
|
+
}>, ToolOutputOf<{
|
|
107
|
+
outputSchema: O;
|
|
108
|
+
}>>;
|
|
109
|
+
};
|
|
61
110
|
type __Ctor = (new (...a: any[]) => any) | (abstract new (...a: any[]) => any);
|
|
62
111
|
type __A<C extends __Ctor> = C extends new (...a: infer A) => any ? A : C extends abstract new (...a: infer A) => any ? A : never;
|
|
63
112
|
type __R<C extends __Ctor> = C extends new (...a: any[]) => infer R ? R : C extends abstract new (...a: any[]) => infer R ? R : never;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/tool.decorator.ts"],"names":[],"mappings":";;AA8DS,oCAAY;AAAkB,4BAAI;AAAE,oCAAY;AAAkB,4BAAI;AA9D/E,4BAA0B;AAC1B,sCAAqE;AACrE,0CASqB;AAIrB;;GAEG;AACH,SAAS,YAAY,CAAC,gBAA8B;IAClD,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,2BAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,cAAc,CAAC,6BAAoB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC;AACJ,CAAC;AASD;;GAEG;AACH,SAAS,YAAY,CAInB,gBAAmB;IACnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG;YACnB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B,CAAC,2BAAkB,CAAC,IAAI,CAAC,EAAE,eAAe;YAC1C,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACxC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { extendedToolMetadata, FrontMcpToolTokens } from '../tokens';\nimport {\n ToolMetadata,\n frontMcpToolMetadataSchema,\n ImageOutputSchema,\n AudioOutputSchema,\n ResourceOutputSchema,\n ResourceLinkOutputSchema,\n ToolInputType,\n ToolOutputType,\n} from '../metadata';\nimport z from 'zod';\nimport { ToolContext } from '../interfaces';\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction FrontMcpTool(providedMetadata: ToolMetadata): ClassDecorator {\n return (target: any) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n Reflect.defineMetadata(FrontMcpToolTokens.type, true, target);\n const extended = {};\n for (const property in metadata) {\n if (FrontMcpToolTokens[property]) {\n Reflect.defineMetadata(FrontMcpToolTokens[property], metadata[property], target);\n } else {\n extended[property] = metadata[property];\n }\n }\n Reflect.defineMetadata(extendedToolMetadata, extended, target);\n };\n}\n\nexport type FrontMcpToolExecuteHandler<\n InSchema extends ToolInputType,\n OutSchema extends ToolOutputType,\n In = ToolInputOf<{ inputSchema: InSchema }>,\n Out = ToolOutputOf<{ outputSchema: OutSchema }>,\n> = (input: In, ctx: ToolContext<InSchema, OutSchema>) => Out | Promise<Out>;\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction frontMcpTool<\n T extends ToolMetadata,\n InSchema extends ToolInputType = T['inputSchema'],\n OutSchema extends ToolOutputType = T['outputSchema'],\n>(providedMetadata: T): (handler: FrontMcpToolExecuteHandler<InSchema, OutSchema>) => () => void {\n return (execute) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n const toolFunction = function () {\n return execute;\n };\n Object.assign(toolFunction, {\n [FrontMcpToolTokens.type]: 'function-tool',\n [FrontMcpToolTokens.metadata]: metadata,\n });\n return toolFunction;\n };\n}\n\nexport { FrontMcpTool, FrontMcpTool as Tool, frontMcpTool, frontMcpTool as tool };\n\n/**\n * This is a modified version of the original decorator, with the following changes:\n * - Added support for ZodRawShape as inputSchema\n * - Added support for outputSchema: any of the allowed forms\n * - Added rich error messages for input/output type mismatches\n *\n * Don't move below code outside the decorator file, it will break the module augmentation.\n */\n// ---------- zod helpers ----------\ntype __Shape = z.ZodRawShape;\ntype __AsZodObj<T> = T extends z.ZodObject<infer S> ? z.ZodObject<S> : T extends z.ZodRawShape ? z.ZodObject<T> : never;\n\nexport type ToolInputOf<Opt> = Opt extends { inputSchema: infer I } ? z.infer<__AsZodObj<I>> : never;\n\n// ---------- output inference helpers for NEW schemas ----------\n\n/**\n * Helper to infer the return type from any Zod schema,\n * including ZodRawShape.\n */\ntype __InferZod<S> = S extends z.ZodTypeAny ? z.infer<S> : S extends z.ZodRawShape ? z.infer<z.ZodObject<S>> : never;\n\n/**\n * Infers the *output type* from a *single schema definition*\n * based on the new ToolSingleOutputType.\n */\ntype __InferFromSingleSchema<S> =\n // Handle specific MCP type literals\n S extends 'image'\n ? z.infer<typeof ImageOutputSchema>\n : S extends 'audio'\n ? z.infer<typeof AudioOutputSchema>\n : S extends 'resource'\n ? z.infer<typeof ResourceOutputSchema>\n : S extends 'resource_link'\n ? z.infer<typeof ResourceLinkOutputSchema>\n : // Handle primitive type literals\n S extends 'string'\n ? string\n : S extends 'number'\n ? number\n : S extends 'boolean'\n ? boolean\n : S extends 'date'\n ? Date\n : // Handle all Zod schemas (primitives, objects, arrays, etc.)\n // This will correctly infer z.ZodString to string, etc.\n S extends z.ZodTypeAny | z.ZodRawShape\n ? __InferZod<S>\n : // Fallback for unknown/unrecognized schema\n any;\n\n/**\n * Infers a tuple/array of output types from an array of schemas\n */\ntype __InferFromArraySchema<A> = A extends readonly any[] ? { [K in keyof A]: __InferFromSingleSchema<A[K]> } : never;\n\n/**\n * Main output type inference.\n * Handles single schemas, arrays of schemas, or no schema.\n */\nexport type ToolOutputOf<Opt> = Opt extends { outputSchema: infer O }\n ? O extends readonly any[] // Check for array/tuple first\n ? __InferFromArraySchema<O>\n : __InferFromSingleSchema<O> // Handle a single schema\n : any; // no outputSchema property at all -> allow anything\n\n// --- Define the schema types locally to constrain the generic ---\n// This mirrors your `ToolOutputType` definitions for use in constraints.\n\ntype __PrimitiveOutputType =\n | 'string'\n | 'number'\n | 'date'\n | 'boolean'\n | z.ZodString\n | z.ZodNumber\n | z.ZodBoolean\n | z.ZodBigInt\n | z.ZodDate;\ntype __ImageOutputType = 'image';\ntype __AudioOutputType = 'audio';\ntype __ResourceOutputType = 'resource';\ntype __ResourceLinkOutputType = 'resource_link';\ntype __StructuredOutputType =\n | z.ZodRawShape\n | z.ZodObject<any>\n | z.ZodArray<any>\n | z.ZodUnion<[z.ZodObject<any>, ...z.ZodObject<any>[]]>\n | z.ZodDiscriminatedUnion<any, any>;\n\ntype __ToolSingleOutputType =\n | __PrimitiveOutputType\n | __ImageOutputType\n | __AudioOutputType\n | __ResourceOutputType\n | __ResourceLinkOutputType\n | __StructuredOutputType;\n\n// This is the final constraint for the `outputSchema` option\ntype __OutputSchema = __ToolSingleOutputType | __ToolSingleOutputType[];\n\nexport type ToolMetadataOptions<I extends __Shape, O extends __OutputSchema> = ToolMetadata<\n I | z.ZodObject<I>, // inputSchema can be a raw shape or ZodObject\n O // outputSchema: any of the allowed forms\n>;\n\n// ---------- ctor & reflection ----------\ntype __Ctor = (new (...a: any[]) => any) | (abstract new (...a: any[]) => any);\ntype __A<C extends __Ctor> = C extends new (...a: infer A) => any\n ? A\n : C extends abstract new (...a: infer A) => any\n ? A\n : never;\ntype __R<C extends __Ctor> = C extends new (...a: any[]) => infer R\n ? R\n : C extends abstract new (...a: any[]) => infer R\n ? R\n : never;\ntype __Param<C extends __Ctor> = __R<C> extends { execute: (arg: infer P, ...r: any) => any } ? P : never;\ntype __Return<C extends __Ctor> = __R<C> extends { execute: (...a: any) => infer R } ? R : never;\ntype __Unwrap<T> = T extends Promise<infer U> ? U : T;\ntype __IsAny<T> = 0 extends 1 & T ? true : false;\n\n// ---------- friendly branded errors (UPDATED) ----------\n\n// Must extend ToolContext (assuming ToolContext is exported by the SDK)\ntype __MustExtendCtx<C extends __Ctor> = __R<C> extends ToolContext\n ? unknown\n : { 'Tool class error': 'Class must extend ToolContext' };\n\n// execute param must exactly match In (and not be any)\ntype __MustParam<C extends __Ctor, In> =\n // 1. If 'In' (from schema) is 'any', we can't check, so allow.\n __IsAny<In> extends true\n ? unknown\n : // 2. Check if the actual param type is 'any'. This is an error.\n __IsAny<__Param<C>> extends true\n ? { 'execute() parameter error': \"Parameter type must not be 'any'.\"; expected_input_type: In }\n : // 3. Check for the exact match: Param extends In AND In extends Param\n __Param<C> extends In\n ? In extends __Param<C>\n ? unknown // OK, exact match\n : {\n 'execute() parameter error': 'Parameter type is too wide. It must exactly match the input schema.';\n expected_input_type: In;\n actual_parameter_type: __Param<C>;\n }\n : {\n 'execute() parameter error': 'Parameter type does not match the input schema.';\n expected_input_type: In;\n actual_parameter_type: __Param<C>;\n };\n\n// execute return must be Out or Promise<Out>\ntype __MustReturn<C extends __Ctor, Out> =\n // 1. If 'Out' (from schema) is 'any', no check is needed.\n __IsAny<Out> extends true\n ? unknown\n : // 2. Check if the unwrapped return type is assignable to Out.\n __Unwrap<__Return<C>> extends Out\n ? unknown // OK\n : {\n 'execute() return type error': \"The method's return type is not assignable to the expected output schema type.\";\n expected_output_type: Out;\n 'actual_return_type (unwrapped)': __Unwrap<__Return<C>>;\n };\n\n// Rewrapped constructor with updated ToolContext generic params\ntype __Rewrap<C extends __Ctor, In, Out> = C extends abstract new (...a: __A<C>) => __R<C>\n ? C & (abstract new (...a: __A<C>) => ToolContext<any, any, In, Out> & __R<C>)\n : C extends new (...a: __A<C>) => __R<C>\n ? C & (new (...a: __A<C>) => ToolContext<any, any, In, Out> & __R<C>)\n : never;\n\ndeclare module '@frontmcp/sdk' {\n // ---------- the decorator (overloads) ----------\n\n // 1) Overload: outputSchema PROVIDED → strict return typing\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n O extends __OutputSchema, // Use our new output schema constraint\n T extends ToolMetadataOptions<I, O> & { outputSchema: any }, // ensure present\n >(\n opts: T,\n ): <C extends __Ctor>(\n cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, ToolInputOf<T>> & // <-- Will now show a rich error\n __MustReturn<C, ToolOutputOf<T>>, // <-- Will now show a rich error\n ) => __Rewrap<C, ToolInputOf<T>, ToolOutputOf<T>>;\n\n // 2) Overload: outputSchema NOT PROVIDED → execute() can return any\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n // Note: 'O' is omitted, 'any' is used for the generic\n T extends ToolMetadataOptions<I, any> & { outputSchema?: never }, // ensure absent\n >(\n opts: T,\n ): <C extends __Ctor>(\n cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, ToolInputOf<T>> & // <-- Will now show a rich error\n __MustReturn<C, ToolOutputOf<T>>, // <-- Will now show 'any'\n ) => __Rewrap<C, ToolInputOf<T>, ToolOutputOf<T>>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tool.decorator.js","sourceRoot":"","sources":["../../../../src/common/decorators/tool.decorator.ts"],"names":[],"mappings":";;AA+DS,oCAAY;AAAkB,4BAAI;AAAE,oCAAY;AAAkB,4BAAI;AA/D/E,4BAA0B;AAC1B,sCAAqE;AACrE,0CASqB;AAKrB;;GAEG;AACH,SAAS,YAAY,CAAC,gBAA8B;IAClD,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,2BAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,cAAc,CAAC,6BAAoB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC;AACJ,CAAC;AASD;;GAEG;AACH,SAAS,YAAY,CAInB,gBAAmB;IACnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG;YACnB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B,CAAC,2BAAkB,CAAC,IAAI,CAAC,EAAE,eAAe;YAC1C,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACxC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { extendedToolMetadata, FrontMcpToolTokens } from '../tokens';\nimport {\n ToolMetadata,\n frontMcpToolMetadataSchema,\n ImageOutputSchema,\n AudioOutputSchema,\n ResourceOutputSchema,\n ResourceLinkOutputSchema,\n ToolInputType,\n ToolOutputType,\n} from '../metadata';\nimport type { ToolUIConfig } from '../metadata/tool-ui.metadata';\nimport z from 'zod';\nimport { ToolContext } from '../interfaces';\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction FrontMcpTool(providedMetadata: ToolMetadata): ClassDecorator {\n return (target: any) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n Reflect.defineMetadata(FrontMcpToolTokens.type, true, target);\n const extended = {};\n for (const property in metadata) {\n if (FrontMcpToolTokens[property]) {\n Reflect.defineMetadata(FrontMcpToolTokens[property], metadata[property], target);\n } else {\n extended[property] = metadata[property];\n }\n }\n Reflect.defineMetadata(extendedToolMetadata, extended, target);\n };\n}\n\nexport type FrontMcpToolExecuteHandler<\n InSchema extends ToolInputType,\n OutSchema extends ToolOutputType,\n In = ToolInputOf<{ inputSchema: InSchema }>,\n Out = ToolOutputOf<{ outputSchema: OutSchema }>,\n> = (input: In, ctx: ToolContext<InSchema, OutSchema>) => Out | Promise<Out>;\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction frontMcpTool<\n T extends ToolMetadata,\n InSchema extends ToolInputType = T['inputSchema'],\n OutSchema extends ToolOutputType = T['outputSchema'],\n>(providedMetadata: T): (handler: FrontMcpToolExecuteHandler<InSchema, OutSchema>) => () => void {\n return (execute) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n const toolFunction = function () {\n return execute;\n };\n Object.assign(toolFunction, {\n [FrontMcpToolTokens.type]: 'function-tool',\n [FrontMcpToolTokens.metadata]: metadata,\n });\n return toolFunction;\n };\n}\n\nexport { FrontMcpTool, FrontMcpTool as Tool, frontMcpTool, frontMcpTool as tool };\n\n/**\n * This is a modified version of the original decorator, with the following changes:\n * - Added support for ZodRawShape as inputSchema\n * - Added support for outputSchema: any of the allowed forms\n * - Added rich error messages for input/output type mismatches\n *\n * Don't move below code outside the decorator file, it will break the module augmentation.\n */\n// ---------- zod helpers ----------\ntype __Shape = z.ZodRawShape;\ntype __AsZodObj<T> = T extends z.ZodObject<any> ? T : T extends z.ZodRawShape ? z.ZodObject<T> : never;\n\nexport type ToolInputOf<Opt> = Opt extends { inputSchema: infer I } ? z.infer<__AsZodObj<I>> : never;\n\n// ---------- output inference helpers for NEW schemas ----------\n\n/**\n * Helper to infer the return type from any Zod schema,\n * including ZodRawShape.\n */\ntype __InferZod<S> = S extends z.ZodType ? z.infer<S> : S extends z.ZodRawShape ? z.infer<z.ZodObject<S>> : never;\n\n/**\n * Infers the *output type* from a *single schema definition*\n * based on the new ToolSingleOutputType.\n */\ntype __InferFromSingleSchema<S> =\n // Handle specific MCP type literals\n S extends 'image'\n ? z.infer<typeof ImageOutputSchema>\n : S extends 'audio'\n ? z.infer<typeof AudioOutputSchema>\n : S extends 'resource'\n ? z.infer<typeof ResourceOutputSchema>\n : S extends 'resource_link'\n ? z.infer<typeof ResourceLinkOutputSchema>\n : // Handle primitive type literals\n S extends 'string'\n ? string\n : S extends 'number'\n ? number\n : S extends 'boolean'\n ? boolean\n : S extends 'date'\n ? Date\n : // Handle all Zod schemas (primitives, objects, arrays, etc.)\n // This will correctly infer z.ZodString to string, etc.\n S extends z.ZodType | z.ZodRawShape\n ? __InferZod<S>\n : // Fallback for unknown/unrecognized schema\n any;\n\n/**\n * Infers a tuple/array of output types from an array of schemas\n */\ntype __InferFromArraySchema<A> = A extends readonly any[] ? { [K in keyof A]: __InferFromSingleSchema<A[K]> } : never;\n\n/**\n * Main output type inference.\n * Handles single schemas, arrays of schemas, or no schema.\n */\nexport type ToolOutputOf<Opt> = Opt extends { outputSchema: infer O }\n ? O extends readonly any[] // Check for array/tuple first\n ? __InferFromArraySchema<O>\n : __InferFromSingleSchema<O> // Handle a single schema\n : any; // no outputSchema property at all -> allow anything\n\n// --- Define the schema types locally to constrain the generic ---\n// This mirrors your `ToolOutputType` definitions for use in constraints.\n\ntype __PrimitiveOutputType =\n | 'string'\n | 'number'\n | 'date'\n | 'boolean'\n | z.ZodString\n | z.ZodNumber\n | z.ZodBoolean\n | z.ZodBigInt\n | z.ZodDate;\ntype __ImageOutputType = 'image';\ntype __AudioOutputType = 'audio';\ntype __ResourceOutputType = 'resource';\ntype __ResourceLinkOutputType = 'resource_link';\ntype __StructuredOutputType =\n | z.ZodRawShape\n | z.ZodObject<any>\n | z.ZodArray<z.ZodType>\n | z.ZodUnion<[z.ZodObject<any>, ...z.ZodObject<any>[]]>\n | z.ZodDiscriminatedUnion<z.ZodObject<any>[]>;\n\ntype __ToolSingleOutputType =\n | __PrimitiveOutputType\n | __ImageOutputType\n | __AudioOutputType\n | __ResourceOutputType\n | __ResourceLinkOutputType\n | __StructuredOutputType;\n\n// This is the final constraint for the `outputSchema` option\ntype __OutputSchema = __ToolSingleOutputType | __ToolSingleOutputType[];\n\n/**\n * Base tool metadata options without UI field.\n */\ntype __ToolMetadataBase<I extends __Shape, O extends __OutputSchema> = ToolMetadata<\n I | z.ZodObject<I>, // inputSchema can be a raw shape or ZodObject\n O // outputSchema: any of the allowed forms\n>;\n\n/**\n * Tool metadata options with optional UI configuration.\n *\n * The `ui` property accepts a `ToolUIConfig` from `@frontmcp/ui/types`\n * for configuring interactive widget rendering.\n */\nexport type ToolMetadataOptions<I extends __Shape, O extends __OutputSchema> = __ToolMetadataBase<I, O> & {\n /**\n * UI template configuration for rendering interactive widgets.\n *\n * The template builder function receives typed `ctx.input` and `ctx.output`\n * based on the tool's `inputSchema` and `outputSchema`.\n *\n * @see {@link ToolUIConfig} for all available options including:\n * - `template`: React component, HTML string, or builder function\n * - `servingMode`: 'inline' | 'static' | 'hybrid' | 'direct-url' | 'custom-url'\n * - `csp`: Content Security Policy configuration\n * - `widgetAccessible`: Enable MCP bridge for tool calls from widget\n * - `displayMode`: 'inline' | 'fullscreen' | 'pip'\n * - And more...\n *\n * @example HTML template builder with typed context\n * ```typescript\n * ui: {\n * template: (ctx) => `<div>${ctx.helpers.escapeHtml(ctx.output.name)}</div>`,\n * // ctx.output is typed based on outputSchema\n * servingMode: 'inline',\n * }\n * ```\n *\n * @example React component\n * ```typescript\n * import WeatherCard from './weather-ui';\n * ui: {\n * template: WeatherCard,\n * servingMode: 'static',\n * }\n * ```\n */\n ui?: ToolUIConfig<ToolInputOf<{ inputSchema: I | z.ZodObject<I> }>, ToolOutputOf<{ outputSchema: O }>>;\n};\n\n// ---------- ctor & reflection ----------\ntype __Ctor = (new (...a: any[]) => any) | (abstract new (...a: any[]) => any);\ntype __A<C extends __Ctor> = C extends new (...a: infer A) => any\n ? A\n : C extends abstract new (...a: infer A) => any\n ? A\n : never;\ntype __R<C extends __Ctor> = C extends new (...a: any[]) => infer R\n ? R\n : C extends abstract new (...a: any[]) => infer R\n ? R\n : never;\ntype __Param<C extends __Ctor> = __R<C> extends { execute: (arg: infer P, ...r: any) => any } ? P : never;\ntype __Return<C extends __Ctor> = __R<C> extends { execute: (...a: any) => infer R } ? R : never;\ntype __Unwrap<T> = T extends Promise<infer U> ? U : T;\ntype __IsAny<T> = 0 extends 1 & T ? true : false;\n\n// ---------- friendly branded errors (UPDATED) ----------\n\n// Must extend ToolContext (assuming ToolContext is exported by the SDK)\ntype __MustExtendCtx<C extends __Ctor> = __R<C> extends ToolContext\n ? unknown\n : { 'Tool class error': 'Class must extend ToolContext' };\n\n// execute param must exactly match In (and not be any)\ntype __MustParam<C extends __Ctor, In> =\n // 1. If 'In' (from schema) is 'any', we can't check, so allow.\n __IsAny<In> extends true\n ? unknown\n : // 2. Check if the actual param type is 'any'. This is an error.\n __IsAny<__Param<C>> extends true\n ? { 'execute() parameter error': \"Parameter type must not be 'any'.\"; expected_input_type: In }\n : // 3. Check for the exact match: Param extends In AND In extends Param\n __Param<C> extends In\n ? In extends __Param<C>\n ? unknown // OK, exact match\n : {\n 'execute() parameter error': 'Parameter type is too wide. It must exactly match the input schema.';\n expected_input_type: In;\n actual_parameter_type: __Param<C>;\n }\n : {\n 'execute() parameter error': 'Parameter type does not match the input schema.';\n expected_input_type: In;\n actual_parameter_type: __Param<C>;\n };\n\n// execute return must be Out or Promise<Out>\ntype __MustReturn<C extends __Ctor, Out> =\n // 1. If 'Out' (from schema) is 'any', no check is needed.\n __IsAny<Out> extends true\n ? unknown\n : // 2. Check if the unwrapped return type is assignable to Out.\n __Unwrap<__Return<C>> extends Out\n ? unknown // OK\n : {\n 'execute() return type error': \"The method's return type is not assignable to the expected output schema type.\";\n expected_output_type: Out;\n 'actual_return_type (unwrapped)': __Unwrap<__Return<C>>;\n };\n\n// Rewrapped constructor with updated ToolContext generic params\ntype __Rewrap<C extends __Ctor, In, Out> = C extends abstract new (...a: __A<C>) => __R<C>\n ? C & (abstract new (...a: __A<C>) => ToolContext<any, any, In, Out> & __R<C>)\n : C extends new (...a: __A<C>) => __R<C>\n ? C & (new (...a: __A<C>) => ToolContext<any, any, In, Out> & __R<C>)\n : never;\n\ndeclare module '@frontmcp/sdk' {\n // ---------- the decorator (overloads) ----------\n\n // 1) Overload: outputSchema PROVIDED → strict return typing\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n O extends __OutputSchema, // Use our new output schema constraint\n T extends ToolMetadataOptions<I, O> & { outputSchema: any }, // ensure present\n >(\n opts: T,\n ): <C extends __Ctor>(\n cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, ToolInputOf<T>> & // <-- Will now show a rich error\n __MustReturn<C, ToolOutputOf<T>>, // <-- Will now show a rich error\n ) => __Rewrap<C, ToolInputOf<T>, ToolOutputOf<T>>;\n\n // 2) Overload: outputSchema NOT PROVIDED → execute() can return any\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n // Note: 'O' is omitted, 'any' is used for the generic\n T extends ToolMetadataOptions<I, any> & { outputSchema?: never }, // ensure absent\n >(\n opts: T,\n ): <C extends __Ctor>(\n cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, ToolInputOf<T>> & // <-- Will now show a rich error\n __MustReturn<C, ToolOutputOf<T>>, // <-- Will now show 'any'\n ) => __Rewrap<C, ToolInputOf<T>, ToolOutputOf<T>>;\n}\n"]}
|