@frontmcp/sdk 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -18
- package/package.json +20 -5
- package/src/app/app.registry.d.ts +3 -2
- package/src/app/app.registry.js +3 -1
- package/src/app/app.registry.js.map +1 -1
- package/src/app/instances/app.local.instance.js +2 -2
- package/src/app/instances/app.local.instance.js.map +1 -1
- package/src/auth/auth.registry.d.ts +34 -2
- package/src/auth/auth.registry.js +162 -24
- package/src/auth/auth.registry.js.map +1 -1
- package/src/auth/auth.utils.js +8 -9
- package/src/auth/auth.utils.js.map +1 -1
- package/src/auth/authorization/authorization.class.d.ts +125 -0
- package/src/auth/authorization/authorization.class.js +224 -0
- package/src/auth/authorization/authorization.class.js.map +1 -0
- package/src/auth/authorization/authorization.types.d.ts +300 -0
- package/src/auth/authorization/authorization.types.js +79 -0
- package/src/auth/authorization/authorization.types.js.map +1 -0
- package/src/auth/authorization/index.d.ts +5 -0
- package/src/auth/authorization/index.js +19 -0
- package/src/auth/authorization/index.js.map +1 -0
- package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
- package/src/auth/authorization/orchestrated.authorization.js +306 -0
- package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
- package/src/auth/authorization/public.authorization.d.ts +91 -0
- package/src/auth/authorization/public.authorization.js +132 -0
- package/src/auth/authorization/public.authorization.js.map +1 -0
- package/src/auth/authorization/transparent.authorization.d.ts +130 -0
- package/src/auth/authorization/transparent.authorization.js +147 -0
- package/src/auth/authorization/transparent.authorization.js.map +1 -0
- package/src/auth/consent/consent.types.d.ts +111 -0
- package/src/auth/consent/consent.types.js +119 -0
- package/src/auth/consent/consent.types.js.map +1 -0
- package/src/auth/consent/index.d.ts +1 -0
- package/src/auth/consent/index.js +13 -0
- package/src/auth/consent/index.js.map +1 -0
- package/src/auth/detection/auth-provider-detection.d.ts +84 -0
- package/src/auth/detection/auth-provider-detection.js +230 -0
- package/src/auth/detection/auth-provider-detection.js.map +1 -0
- package/src/auth/detection/index.d.ts +1 -0
- package/src/auth/detection/index.js +15 -0
- package/src/auth/detection/index.js.map +1 -0
- package/src/auth/flows/auth.verify.flow.d.ts +110 -0
- package/src/auth/flows/auth.verify.flow.js +379 -0
- package/src/auth/flows/auth.verify.flow.js.map +1 -0
- package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
- package/src/auth/flows/oauth.authorize.flow.js +701 -33
- package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
- package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
- package/src/auth/flows/oauth.callback.flow.js +357 -0
- package/src/auth/flows/oauth.callback.flow.js.map +1 -0
- package/src/auth/flows/oauth.register.flow.d.ts +32 -125
- package/src/auth/flows/oauth.token.flow.d.ts +52 -154
- package/src/auth/flows/oauth.token.flow.js +193 -55
- package/src/auth/flows/oauth.token.flow.js.map +1 -1
- package/src/auth/flows/session.verify.flow.d.ts +66 -321
- package/src/auth/flows/session.verify.flow.js +107 -18
- package/src/auth/flows/session.verify.flow.js.map +1 -1
- package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
- package/src/auth/flows/well-known.jwks.flow.js +15 -8
- package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
- package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
- package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
- package/src/auth/flows/well-known.prm.flow.js +3 -4
- package/src/auth/flows/well-known.prm.flow.js.map +1 -1
- package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
- package/src/auth/instances/instance.local-primary-auth.js +236 -6
- package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
- package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
- package/src/auth/instances/instance.remote-primary-auth.js +2 -2
- package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
- package/src/auth/session/authorization-vault.d.ts +611 -0
- package/src/auth/session/authorization-vault.js +817 -0
- package/src/auth/session/authorization-vault.js.map +1 -0
- package/src/auth/session/authorization.store.d.ts +301 -0
- package/src/auth/session/authorization.store.js +323 -0
- package/src/auth/session/authorization.store.js.map +1 -0
- package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
- package/src/auth/session/encrypted-authorization-vault.js +493 -0
- package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
- package/src/auth/session/index.d.ts +4 -4
- package/src/auth/session/index.js +11 -7
- package/src/auth/session/index.js.map +1 -1
- package/src/auth/session/session.schema.d.ts +1 -1
- package/src/auth/session/session.service.d.ts +1 -1
- package/src/auth/session/transport-session.manager.d.ts +101 -0
- package/src/auth/session/transport-session.manager.js +300 -0
- package/src/auth/session/transport-session.manager.js.map +1 -0
- package/src/auth/session/transport-session.types.d.ts +457 -0
- package/src/auth/session/transport-session.types.js +110 -0
- package/src/auth/session/transport-session.types.js.map +1 -0
- package/src/auth/session/utils/session-id.utils.d.ts +14 -2
- package/src/auth/session/utils/session-id.utils.js +68 -19
- package/src/auth/session/utils/session-id.utils.js.map +1 -1
- package/src/auth/session/vault-encryption.d.ts +189 -0
- package/src/auth/session/vault-encryption.js +263 -0
- package/src/auth/session/vault-encryption.js.map +1 -0
- package/src/auth/ui/base-layout.d.ts +188 -0
- package/src/auth/ui/base-layout.js +292 -0
- package/src/auth/ui/base-layout.js.map +1 -0
- package/src/auth/ui/htmx-templates.d.ts +135 -0
- package/src/auth/ui/htmx-templates.js +433 -0
- package/src/auth/ui/htmx-templates.js.map +1 -0
- package/src/auth/ui/index.d.ts +11 -0
- package/src/auth/ui/index.js +35 -0
- package/src/auth/ui/index.js.map +1 -0
- package/src/auth/utils/audience.validator.d.ts +129 -0
- package/src/auth/utils/audience.validator.js +196 -0
- package/src/auth/utils/audience.validator.js.map +1 -0
- package/src/auth/utils/index.d.ts +2 -0
- package/src/auth/utils/index.js +7 -0
- package/src/auth/utils/index.js.map +1 -0
- package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
- package/src/auth/utils/www-authenticate.utils.js +183 -0
- package/src/auth/utils/www-authenticate.utils.js.map +1 -0
- package/src/common/common.schema.d.ts +2 -16
- package/src/common/constants.d.ts +3 -0
- package/src/common/constants.js +6 -1
- package/src/common/constants.js.map +1 -1
- package/src/common/decorators/decorator-utils.d.ts +131 -0
- package/src/common/decorators/decorator-utils.js +195 -0
- package/src/common/decorators/decorator-utils.js.map +1 -0
- package/src/common/decorators/front-mcp.decorator.js +3 -2
- package/src/common/decorators/front-mcp.decorator.js.map +1 -1
- package/src/common/decorators/hook.decorator.d.ts +58 -2
- package/src/common/decorators/hook.decorator.js +127 -17
- package/src/common/decorators/hook.decorator.js.map +1 -1
- package/src/common/decorators/plugin.decorator.d.ts +1 -1
- package/src/common/decorators/plugin.decorator.js +11 -10
- package/src/common/decorators/plugin.decorator.js.map +1 -1
- package/src/common/decorators/resource.decorator.d.ts +32 -3
- package/src/common/decorators/resource.decorator.js +46 -4
- package/src/common/decorators/resource.decorator.js.map +1 -1
- package/src/common/decorators/tool.decorator.d.ts +54 -5
- package/src/common/decorators/tool.decorator.js.map +1 -1
- package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
- package/src/common/dynamic/dynamic.plugin.js +7 -1
- package/src/common/dynamic/dynamic.plugin.js.map +1 -1
- package/src/common/entries/prompt.entry.d.ts +46 -2
- package/src/common/entries/prompt.entry.js +10 -0
- package/src/common/entries/prompt.entry.js.map +1 -1
- package/src/common/entries/resource.entry.d.ts +69 -6
- package/src/common/entries/resource.entry.js +27 -3
- package/src/common/entries/resource.entry.js.map +1 -1
- package/src/common/entries/scope.entry.d.ts +5 -1
- package/src/common/entries/scope.entry.js +3 -3
- package/src/common/entries/scope.entry.js.map +1 -1
- package/src/common/flow/flow.utils.d.ts +56 -0
- package/src/common/flow/flow.utils.js +96 -0
- package/src/common/flow/flow.utils.js.map +1 -0
- package/src/common/index.d.ts +2 -2
- package/src/common/index.js +2 -2
- package/src/common/index.js.map +1 -1
- package/src/common/interfaces/execution-context.interface.d.ts +59 -0
- package/src/common/interfaces/execution-context.interface.js +81 -0
- package/src/common/interfaces/execution-context.interface.js.map +1 -0
- package/src/common/interfaces/flow.interface.d.ts +1 -1
- package/src/common/interfaces/flow.interface.js.map +1 -1
- package/src/common/interfaces/index.d.ts +1 -0
- package/src/common/interfaces/index.js +1 -0
- package/src/common/interfaces/index.js.map +1 -1
- package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
- package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
- package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
- package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
- package/src/common/interfaces/internal/registry.interface.js.map +1 -1
- package/src/common/interfaces/plugin.interface.js.map +1 -1
- package/src/common/interfaces/prompt.interface.d.ts +53 -4
- package/src/common/interfaces/prompt.interface.js +78 -0
- package/src/common/interfaces/prompt.interface.js.map +1 -1
- package/src/common/interfaces/resource.interface.d.ts +47 -17
- package/src/common/interfaces/resource.interface.js +53 -0
- package/src/common/interfaces/resource.interface.js.map +1 -1
- package/src/common/interfaces/tool.interface.d.ts +39 -22
- package/src/common/interfaces/tool.interface.js +61 -34
- package/src/common/interfaces/tool.interface.js.map +1 -1
- package/src/common/metadata/adapter.metadata.d.ts +1 -9
- package/src/common/metadata/app.metadata.d.ts +425 -730
- package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
- package/src/common/metadata/flow.metadata.d.ts +10 -25
- package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
- package/src/common/metadata/front-mcp.metadata.js +6 -4
- package/src/common/metadata/front-mcp.metadata.js.map +1 -1
- package/src/common/metadata/hook.metadata.d.ts +1 -1
- package/src/common/metadata/hook.metadata.js.map +1 -1
- package/src/common/metadata/index.d.ts +1 -0
- package/src/common/metadata/index.js +1 -0
- package/src/common/metadata/index.js.map +1 -1
- package/src/common/metadata/logger.metadata.d.ts +1 -9
- package/src/common/metadata/plugin.metadata.d.ts +8 -30
- package/src/common/metadata/prompt.metadata.d.ts +4 -161
- package/src/common/metadata/provider.metadata.d.ts +2 -12
- package/src/common/metadata/resource.metadata.d.ts +6 -98
- package/src/common/metadata/resource.metadata.js +15 -6
- package/src/common/metadata/resource.metadata.js.map +1 -1
- package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
- package/src/common/metadata/tool-ui.metadata.js +12 -0
- package/src/common/metadata/tool-ui.metadata.js.map +1 -0
- package/src/common/metadata/tool.metadata.d.ts +78 -199
- package/src/common/metadata/tool.metadata.js +11 -14
- package/src/common/metadata/tool.metadata.js.map +1 -1
- package/src/common/providers/base-config.provider.d.ts +84 -0
- package/src/common/providers/base-config.provider.js +128 -0
- package/src/common/providers/base-config.provider.js.map +1 -0
- package/src/common/records/plugin.record.d.ts +5 -6
- package/src/common/records/plugin.record.js.map +1 -1
- package/src/common/records/prompt.record.js.map +1 -1
- package/src/common/records/resource.record.d.ts +17 -1
- package/src/common/records/resource.record.js +12 -6
- package/src/common/records/resource.record.js.map +1 -1
- package/src/common/records/tool.record.js.map +1 -1
- package/src/common/schemas/annotated-class.schema.d.ts +9 -9
- package/src/common/schemas/annotated-class.schema.js +92 -27
- package/src/common/schemas/annotated-class.schema.js.map +1 -1
- package/src/common/schemas/http-input.schema.d.ts +6 -30
- package/src/common/schemas/http-output.schema.d.ts +326 -1630
- package/src/common/schemas/http-output.schema.js +39 -1
- package/src/common/schemas/http-output.schema.js.map +1 -1
- package/src/common/tokens/front-mcp.tokens.js +4 -1
- package/src/common/tokens/front-mcp.tokens.js.map +1 -1
- package/src/common/tokens/resource.tokens.d.ts +2 -0
- package/src/common/tokens/resource.tokens.js +4 -1
- package/src/common/tokens/resource.tokens.js.map +1 -1
- package/src/common/tokens/tool.tokens.d.ts +2 -0
- package/src/common/tokens/tool.tokens.js +2 -0
- package/src/common/tokens/tool.tokens.js.map +1 -1
- package/src/common/types/auth/jwt.types.d.ts +5 -31
- package/src/common/types/auth/session.types.d.ts +97 -192
- package/src/common/types/auth/session.types.js +24 -11
- package/src/common/types/auth/session.types.js.map +1 -1
- package/src/common/types/options/auth.options.d.ts +1013 -490
- package/src/common/types/options/auth.options.js +554 -36
- package/src/common/types/options/auth.options.js.map +1 -1
- package/src/common/types/options/http.options.d.ts +1 -9
- package/src/common/types/options/logging.options.d.ts +7 -13
- package/src/common/types/options/logging.options.js +4 -0
- package/src/common/types/options/logging.options.js.map +1 -1
- package/src/common/types/options/server-info.options.d.ts +3 -31
- package/src/common/types/options/session.options.d.ts +90 -10
- package/src/common/types/options/session.options.js +26 -3
- package/src/common/types/options/session.options.js.map +1 -1
- package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
- package/src/common/utils/decide-request-intent.utils.js +88 -23
- package/src/common/utils/decide-request-intent.utils.js.map +1 -1
- package/src/completion/flows/complete.flow.d.ts +74 -0
- package/src/completion/flows/complete.flow.js +199 -0
- package/src/completion/flows/complete.flow.js.map +1 -0
- package/src/errors/authorization-required.error.d.ts +189 -0
- package/src/errors/authorization-required.error.js +274 -0
- package/src/errors/authorization-required.error.js.map +1 -0
- package/src/errors/index.d.ts +2 -1
- package/src/errors/index.js +17 -1
- package/src/errors/index.js.map +1 -1
- package/src/errors/mcp.error.d.ts +101 -1
- package/src/errors/mcp.error.js +147 -2
- package/src/errors/mcp.error.js.map +1 -1
- package/src/flows/flow.instance.js +4 -3
- package/src/flows/flow.instance.js.map +1 -1
- package/src/flows/flow.registry.js.map +1 -1
- package/src/flows/flow.stages.js +14 -11
- package/src/flows/flow.stages.js.map +1 -1
- package/src/front-mcp/front-mcp.providers.d.ts +464 -102
- package/src/front-mcp/front-mcp.providers.js +3 -5
- package/src/front-mcp/front-mcp.providers.js.map +1 -1
- package/src/hooks/hook.instance.d.ts +1 -1
- package/src/hooks/hook.instance.js +5 -2
- package/src/hooks/hook.instance.js.map +1 -1
- package/src/hooks/hook.registry.js +7 -5
- package/src/hooks/hook.registry.js.map +1 -1
- package/src/index.d.ts +28 -9
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/logger/instances/instance.logger.js +3 -2
- package/src/logger/instances/instance.logger.js.map +1 -1
- package/src/logger/logger.registry.js +7 -2
- package/src/logger/logger.registry.js.map +1 -1
- package/src/logging/flows/set-level.flow.d.ts +62 -0
- package/src/logging/flows/set-level.flow.js +108 -0
- package/src/logging/flows/set-level.flow.js.map +1 -0
- package/src/mcp-apps/csp.d.ts +111 -0
- package/src/mcp-apps/csp.js +267 -0
- package/src/mcp-apps/csp.js.map +1 -0
- package/src/mcp-apps/index.d.ts +23 -0
- package/src/mcp-apps/index.js +91 -0
- package/src/mcp-apps/index.js.map +1 -0
- package/src/mcp-apps/schemas.d.ts +403 -0
- package/src/mcp-apps/schemas.js +345 -0
- package/src/mcp-apps/schemas.js.map +1 -0
- package/src/mcp-apps/template.d.ts +94 -0
- package/src/mcp-apps/template.js +419 -0
- package/src/mcp-apps/template.js.map +1 -0
- package/src/mcp-apps/types.d.ts +323 -0
- package/src/mcp-apps/types.js +59 -0
- package/src/mcp-apps/types.js.map +1 -0
- package/src/notification/index.d.ts +1 -0
- package/src/notification/index.js +13 -0
- package/src/notification/index.js.map +1 -0
- package/src/notification/notification.service.d.ts +378 -0
- package/src/notification/notification.service.js +727 -0
- package/src/notification/notification.service.js.map +1 -0
- package/src/plugin/plugin.registry.js +12 -9
- package/src/plugin/plugin.registry.js.map +1 -1
- package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
- package/src/prompt/flows/get-prompt.flow.js +214 -0
- package/src/prompt/flows/get-prompt.flow.js.map +1 -0
- package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
- package/src/prompt/flows/prompts-list.flow.js +176 -0
- package/src/prompt/flows/prompts-list.flow.js.map +1 -0
- package/src/prompt/index.d.ts +7 -0
- package/src/prompt/index.js +17 -0
- package/src/prompt/index.js.map +1 -0
- package/src/prompt/prompt.events.d.ts +17 -0
- package/src/prompt/prompt.events.js +25 -0
- package/src/prompt/prompt.events.js.map +1 -0
- package/src/prompt/prompt.instance.d.ts +30 -0
- package/src/prompt/prompt.instance.js +120 -0
- package/src/prompt/prompt.instance.js.map +1 -0
- package/src/prompt/prompt.registry.d.ts +79 -12
- package/src/prompt/prompt.registry.js +360 -15
- package/src/prompt/prompt.registry.js.map +1 -1
- package/src/prompt/prompt.types.d.ts +26 -0
- package/src/prompt/prompt.types.js +11 -0
- package/src/prompt/prompt.types.js.map +1 -0
- package/src/prompt/prompt.utils.d.ts +26 -0
- package/src/prompt/prompt.utils.js +136 -0
- package/src/prompt/prompt.utils.js.map +1 -0
- package/src/provider/provider.registry.d.ts +12 -5
- package/src/provider/provider.registry.js +30 -138
- package/src/provider/provider.registry.js.map +1 -1
- package/src/regsitry/registry.base.d.ts +1 -1
- package/src/regsitry/registry.base.js.map +1 -1
- package/src/resource/flows/read-resource.flow.d.ts +91 -0
- package/src/resource/flows/read-resource.flow.js +270 -0
- package/src/resource/flows/read-resource.flow.js.map +1 -0
- package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
- package/src/resource/flows/resource-templates-list.flow.js +191 -0
- package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
- package/src/resource/flows/resources-list.flow.d.ts +64 -0
- package/src/resource/flows/resources-list.flow.js +196 -0
- package/src/resource/flows/resources-list.flow.js.map +1 -0
- package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
- package/src/resource/flows/subscribe-resource.flow.js +123 -0
- package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
- package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
- package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
- package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
- package/src/resource/index.d.ts +8 -0
- package/src/resource/index.js +20 -0
- package/src/resource/index.js.map +1 -0
- package/src/resource/resource.events.d.ts +24 -0
- package/src/resource/resource.events.js +17 -0
- package/src/resource/resource.events.js.map +1 -0
- package/src/resource/resource.instance.d.ts +35 -0
- package/src/resource/resource.instance.js +163 -0
- package/src/resource/resource.instance.js.map +1 -0
- package/src/resource/resource.registry.d.ts +106 -12
- package/src/resource/resource.registry.js +449 -13
- package/src/resource/resource.registry.js.map +1 -1
- package/src/resource/resource.types.d.ts +35 -0
- package/src/resource/resource.types.js +11 -0
- package/src/resource/resource.types.js.map +1 -0
- package/src/resource/resource.utils.d.ts +30 -0
- package/src/resource/resource.utils.js +151 -0
- package/src/resource/resource.utils.js.map +1 -0
- package/src/scope/flows/http.request.flow.d.ts +48 -330
- package/src/scope/flows/http.request.flow.js +306 -78
- package/src/scope/flows/http.request.flow.js.map +1 -1
- package/src/scope/scope.instance.d.ts +12 -0
- package/src/scope/scope.instance.js +145 -15
- package/src/scope/scope.instance.js.map +1 -1
- package/src/tool/flows/call-tool.flow.d.ts +64 -1110
- package/src/tool/flows/call-tool.flow.js +303 -15
- package/src/tool/flows/call-tool.flow.js.map +1 -1
- package/src/tool/flows/tools-list.flow.d.ts +32 -473
- package/src/tool/flows/tools-list.flow.js +111 -10
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.events.d.ts +8 -1
- package/src/tool/tool.events.js.map +1 -1
- package/src/tool/tool.instance.d.ts +3 -1
- package/src/tool/tool.instance.js +17 -3
- package/src/tool/tool.instance.js.map +1 -1
- package/src/tool/tool.registry.d.ts +7 -1
- package/src/tool/tool.registry.js +26 -10
- package/src/tool/tool.registry.js.map +1 -1
- package/src/tool/tool.types.d.ts +4 -4
- package/src/tool/tool.types.js.map +1 -1
- package/src/tool/tool.utils.d.ts +3 -12
- package/src/tool/tool.utils.js +39 -193
- package/src/tool/tool.utils.js.map +1 -1
- package/src/tool/ui/index.d.ts +22 -0
- package/src/tool/ui/index.js +63 -0
- package/src/tool/ui/index.js.map +1 -0
- package/src/tool/ui/platform-adapters.d.ts +10 -0
- package/src/tool/ui/platform-adapters.js +18 -0
- package/src/tool/ui/platform-adapters.js.map +1 -0
- package/src/tool/ui/template-helpers.d.ts +46 -0
- package/src/tool/ui/template-helpers.js +112 -0
- package/src/tool/ui/template-helpers.js.map +1 -0
- package/src/tool/ui/ui-resource-template.d.ts +34 -0
- package/src/tool/ui/ui-resource-template.js +64 -0
- package/src/tool/ui/ui-resource-template.js.map +1 -0
- package/src/tool/ui/ui-resource.handler.d.ts +74 -0
- package/src/tool/ui/ui-resource.handler.js +129 -0
- package/src/tool/ui/ui-resource.handler.js.map +1 -0
- package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.local.adapter.js +28 -7
- package/src/transport/adapters/transport.local.adapter.js.map +1 -1
- package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.sse.adapter.js +4 -3
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
- package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
- package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.d.ts +29 -63
- package/src/transport/flows/handle.sse.flow.js +78 -10
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
- package/src/transport/flows/handle.stateless-http.flow.js +102 -0
- package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
- package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
- package/src/transport/flows/handle.streamable-http.flow.js +158 -26
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
- package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
- package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
- package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
- package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/index.d.ts +517 -208
- package/src/transport/mcp-handlers/index.js +39 -2
- package/src/transport/mcp-handlers/index.js.map +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
- package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
- package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
- package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
- package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
- package/src/transport/transport.local.js +7 -2
- package/src/transport/transport.local.js.map +1 -1
- package/src/transport/transport.registry.d.ts +30 -0
- package/src/transport/transport.registry.js +84 -1
- package/src/transport/transport.registry.js.map +1 -1
- package/src/transport/transport.types.d.ts +3 -3
- package/src/transport/transport.types.js.map +1 -1
- package/src/utils/content.utils.d.ts +48 -0
- package/src/utils/content.utils.js +194 -0
- package/src/utils/content.utils.js.map +1 -0
- package/src/utils/index.d.ts +8 -0
- package/src/utils/index.js +55 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/lineage.utils.d.ts +40 -0
- package/src/utils/lineage.utils.js +82 -0
- package/src/utils/lineage.utils.js.map +1 -0
- package/src/utils/naming.utils.d.ts +46 -0
- package/src/utils/naming.utils.js +136 -0
- package/src/utils/naming.utils.js.map +1 -0
- package/src/utils/types.utils.d.ts +2 -2
- package/src/utils/types.utils.js.map +1 -1
- package/src/utils/uri-template.utils.d.ts +57 -0
- package/src/utils/uri-template.utils.js +113 -0
- package/src/utils/uri-template.utils.js.map +1 -0
- package/src/utils/uri-validation.utils.d.ts +40 -0
- package/src/utils/uri-validation.utils.js +76 -0
- package/src/utils/uri-validation.utils.js.map +1 -0
- package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
- package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/index.d.ts +0 -7
- package/src/__test-utils__/fixtures/index.js +0 -11
- package/src/__test-utils__/fixtures/index.js.map +0 -1
- package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
- package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
- package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
- package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
- package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
- package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
- package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
- package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
- package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
- package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
- package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
- package/src/__test-utils__/helpers/async.helpers.js +0 -112
- package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/index.d.ts +0 -6
- package/src/__test-utils__/helpers/index.js +0 -10
- package/src/__test-utils__/helpers/index.js.map +0 -1
- package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
- package/src/__test-utils__/helpers/setup.helpers.js +0 -106
- package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
- package/src/__test-utils__/index.d.ts +0 -9
- package/src/__test-utils__/index.js +0 -14
- package/src/__test-utils__/index.js.map +0 -1
- package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
- package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
- package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
- package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
- package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
- package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/index.d.ts +0 -8
- package/src/__test-utils__/mocks/index.js +0 -12
- package/src/__test-utils__/mocks/index.js.map +0 -1
- package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
- package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
- package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
- package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
- package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
- package/src/auth/path.utils.d.ts +0 -20
- package/src/auth/path.utils.js +0 -71
- package/src/auth/path.utils.js.map +0 -1
- package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
- package/src/common/decorators-old/async-with.decorator.js +0 -24
- package/src/common/decorators-old/async-with.decorator.js.map +0 -1
- package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/auth-hook.decorator.js +0 -27
- package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
- package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/session-hook.decorator.js +0 -27
- package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { FlowBase, FlowRunOptions } from '../../common';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
request: z.ZodObject<{
|
|
5
|
+
method: z.ZodLiteral<"resources/subscribe">;
|
|
6
|
+
params: z.ZodObject<{
|
|
7
|
+
_meta: z.ZodOptional<z.ZodObject<{
|
|
8
|
+
progressToken: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
9
|
+
}, z.core.$loose>>;
|
|
10
|
+
uri: z.ZodString;
|
|
11
|
+
}, z.core.$loose>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
ctx: z.ZodUnknown;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
declare const outputSchema: z.ZodObject<{
|
|
16
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
declare const stateSchema: z.ZodObject<{
|
|
19
|
+
input: z.ZodObject<{
|
|
20
|
+
uri: z.ZodString;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
sessionId: z.ZodString;
|
|
23
|
+
output: z.ZodObject<{
|
|
24
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
25
|
+
}, z.core.$strict>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
declare const plan: {
|
|
28
|
+
readonly pre: ["parseInput", "validateResource"];
|
|
29
|
+
readonly execute: ["subscribe"];
|
|
30
|
+
readonly finalize: ["finalize"];
|
|
31
|
+
};
|
|
32
|
+
declare global {
|
|
33
|
+
interface ExtendFlows {
|
|
34
|
+
'resources:subscribe': FlowRunOptions<SubscribeResourceFlow, typeof plan, typeof inputSchema, typeof outputSchema, typeof stateSchema>;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
declare const name: "resources:subscribe";
|
|
38
|
+
export default class SubscribeResourceFlow extends FlowBase<typeof name> {
|
|
39
|
+
logger: import("../../common").FrontMcpLogger;
|
|
40
|
+
parseInput(): Promise<void>;
|
|
41
|
+
validateResource(): Promise<void>;
|
|
42
|
+
subscribe(): Promise<void>;
|
|
43
|
+
finalize(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// file: libs/sdk/src/resource/flows/subscribe-resource.flow.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("../../common");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
8
|
+
const errors_1 = require("../../errors");
|
|
9
|
+
const inputSchema = zod_1.z.object({
|
|
10
|
+
request: types_js_1.SubscribeRequestSchema,
|
|
11
|
+
ctx: zod_1.z.unknown(),
|
|
12
|
+
});
|
|
13
|
+
const outputSchema = types_js_1.EmptyResultSchema;
|
|
14
|
+
const stateSchema = zod_1.z.object({
|
|
15
|
+
input: zod_1.z.object({
|
|
16
|
+
uri: zod_1.z.string().min(1),
|
|
17
|
+
}),
|
|
18
|
+
sessionId: zod_1.z.string(),
|
|
19
|
+
output: outputSchema,
|
|
20
|
+
});
|
|
21
|
+
const plan = {
|
|
22
|
+
pre: ['parseInput', 'validateResource'],
|
|
23
|
+
execute: ['subscribe'],
|
|
24
|
+
finalize: ['finalize'],
|
|
25
|
+
};
|
|
26
|
+
const name = 'resources:subscribe';
|
|
27
|
+
const { Stage } = (0, common_1.FlowHooksOf)(name);
|
|
28
|
+
let SubscribeResourceFlow = class SubscribeResourceFlow extends common_1.FlowBase {
|
|
29
|
+
logger = this.scopeLogger.child('SubscribeResourceFlow');
|
|
30
|
+
async parseInput() {
|
|
31
|
+
this.logger.verbose('parseInput:start');
|
|
32
|
+
let method;
|
|
33
|
+
let params;
|
|
34
|
+
let ctx;
|
|
35
|
+
try {
|
|
36
|
+
const inputData = inputSchema.parse(this.rawInput);
|
|
37
|
+
method = inputData.request.method;
|
|
38
|
+
params = inputData.request.params;
|
|
39
|
+
ctx = inputData.ctx;
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
throw new errors_1.InvalidInputError('Invalid Input', e instanceof zod_1.z.ZodError ? e.issues : undefined);
|
|
43
|
+
}
|
|
44
|
+
if (method !== 'resources/subscribe') {
|
|
45
|
+
this.logger.warn(`parseInput: invalid method "${method}"`);
|
|
46
|
+
throw new errors_1.InvalidMethodError(method, 'resources/subscribe');
|
|
47
|
+
}
|
|
48
|
+
// Get session ID from context - required for subscription tracking
|
|
49
|
+
const sessionId = ctx?.['sessionId'];
|
|
50
|
+
if (!sessionId || typeof sessionId !== 'string') {
|
|
51
|
+
this.logger.warn('parseInput: sessionId not found in context');
|
|
52
|
+
throw new errors_1.InvalidInputError('Session ID is required for resource subscriptions');
|
|
53
|
+
}
|
|
54
|
+
this.state.set({ input: params, sessionId });
|
|
55
|
+
this.logger.verbose('parseInput:done');
|
|
56
|
+
}
|
|
57
|
+
async validateResource() {
|
|
58
|
+
this.logger.verbose('validateResource:start');
|
|
59
|
+
const { uri } = this.state.required.input;
|
|
60
|
+
this.logger.info(`validateResource: checking resource with URI "${uri}"`);
|
|
61
|
+
// Verify the resource exists before allowing subscription
|
|
62
|
+
const match = this.scope.resources.findResourceForUri(uri);
|
|
63
|
+
if (!match) {
|
|
64
|
+
this.logger.warn(`validateResource: resource for URI "${uri}" not found`);
|
|
65
|
+
throw new errors_1.ResourceNotFoundError(uri);
|
|
66
|
+
}
|
|
67
|
+
this.logger.verbose('validateResource:done');
|
|
68
|
+
}
|
|
69
|
+
async subscribe() {
|
|
70
|
+
this.logger.verbose('subscribe:start');
|
|
71
|
+
const { uri } = this.state.required.input;
|
|
72
|
+
const { sessionId } = this.state.required;
|
|
73
|
+
const isNew = this.scope.notifications.subscribeResource(sessionId, uri);
|
|
74
|
+
if (isNew) {
|
|
75
|
+
this.logger.info(`subscribe: session subscribed to resource ${uri}`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.logger.verbose(`subscribe: session already subscribed to resource ${uri}`);
|
|
79
|
+
}
|
|
80
|
+
this.logger.verbose('subscribe:done');
|
|
81
|
+
}
|
|
82
|
+
async finalize() {
|
|
83
|
+
this.logger.verbose('finalize:start');
|
|
84
|
+
// Per MCP spec, resources/subscribe returns an empty result
|
|
85
|
+
this.respond({});
|
|
86
|
+
this.logger.verbose('finalize:done');
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
tslib_1.__decorate([
|
|
90
|
+
Stage('parseInput'),
|
|
91
|
+
tslib_1.__metadata("design:type", Function),
|
|
92
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
93
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
94
|
+
], SubscribeResourceFlow.prototype, "parseInput", null);
|
|
95
|
+
tslib_1.__decorate([
|
|
96
|
+
Stage('validateResource'),
|
|
97
|
+
tslib_1.__metadata("design:type", Function),
|
|
98
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
99
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
100
|
+
], SubscribeResourceFlow.prototype, "validateResource", null);
|
|
101
|
+
tslib_1.__decorate([
|
|
102
|
+
Stage('subscribe'),
|
|
103
|
+
tslib_1.__metadata("design:type", Function),
|
|
104
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
105
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
106
|
+
], SubscribeResourceFlow.prototype, "subscribe", null);
|
|
107
|
+
tslib_1.__decorate([
|
|
108
|
+
Stage('finalize'),
|
|
109
|
+
tslib_1.__metadata("design:type", Function),
|
|
110
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
111
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
112
|
+
], SubscribeResourceFlow.prototype, "finalize", null);
|
|
113
|
+
SubscribeResourceFlow = tslib_1.__decorate([
|
|
114
|
+
(0, common_1.Flow)({
|
|
115
|
+
name,
|
|
116
|
+
plan,
|
|
117
|
+
inputSchema,
|
|
118
|
+
outputSchema,
|
|
119
|
+
access: 'authorized',
|
|
120
|
+
})
|
|
121
|
+
], SubscribeResourceFlow);
|
|
122
|
+
exports.default = SubscribeResourceFlow;
|
|
123
|
+
//# sourceMappingURL=subscribe-resource.flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribe-resource.flow.js","sourceRoot":"","sources":["../../../../src/resource/flows/subscribe-resource.flow.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/resource/flows/subscribe-resource.flow.ts\n\nimport { Flow, FlowBase, FlowHooksOf, FlowPlan, FlowRunOptions } from '../../common';\nimport { z } from 'zod';\nimport { SubscribeRequestSchema, EmptyResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { InvalidMethodError, InvalidInputError, ResourceNotFoundError } from '../../errors';\n\nconst inputSchema = z.object({\n request: SubscribeRequestSchema,\n ctx: z.unknown(),\n});\n\nconst outputSchema = EmptyResultSchema;\n\nconst stateSchema = z.object({\n input: z.object({\n uri: z.string().min(1),\n }),\n sessionId: z.string(),\n output: outputSchema,\n});\n\nconst plan = {\n pre: ['parseInput', 'validateResource'],\n execute: ['subscribe'],\n finalize: ['finalize'],\n} as const satisfies FlowPlan<string>;\n\ndeclare global {\n interface ExtendFlows {\n 'resources:subscribe': FlowRunOptions<\n SubscribeResourceFlow,\n typeof plan,\n typeof inputSchema,\n typeof outputSchema,\n typeof stateSchema\n >;\n }\n}\n\nconst name = 'resources:subscribe' as const;\nconst { Stage } = FlowHooksOf<'resources:subscribe'>(name);\n\n@Flow({\n name,\n plan,\n inputSchema,\n outputSchema,\n access: 'authorized',\n})\nexport default class SubscribeResourceFlow extends FlowBase<typeof name> {\n logger = this.scopeLogger.child('SubscribeResourceFlow');\n\n @Stage('parseInput')\n async parseInput() {\n this.logger.verbose('parseInput:start');\n\n let method!: string;\n let params: z.infer<typeof SubscribeRequestSchema>['params'];\n let ctx: unknown;\n try {\n const inputData = inputSchema.parse(this.rawInput);\n method = inputData.request.method;\n params = inputData.request.params;\n ctx = inputData.ctx;\n } catch (e) {\n throw new InvalidInputError('Invalid Input', e instanceof z.ZodError ? e.issues : undefined);\n }\n\n if (method !== 'resources/subscribe') {\n this.logger.warn(`parseInput: invalid method \"${method}\"`);\n throw new InvalidMethodError(method, 'resources/subscribe');\n }\n\n // Get session ID from context - required for subscription tracking\n const sessionId = (ctx as Record<string, unknown> | undefined)?.['sessionId'];\n if (!sessionId || typeof sessionId !== 'string') {\n this.logger.warn('parseInput: sessionId not found in context');\n throw new InvalidInputError('Session ID is required for resource subscriptions');\n }\n\n this.state.set({ input: params, sessionId });\n this.logger.verbose('parseInput:done');\n }\n\n @Stage('validateResource')\n async validateResource() {\n this.logger.verbose('validateResource:start');\n\n const { uri } = this.state.required.input;\n this.logger.info(`validateResource: checking resource with URI \"${uri}\"`);\n\n // Verify the resource exists before allowing subscription\n const match = this.scope.resources.findResourceForUri(uri);\n\n if (!match) {\n this.logger.warn(`validateResource: resource for URI \"${uri}\" not found`);\n throw new ResourceNotFoundError(uri);\n }\n\n this.logger.verbose('validateResource:done');\n }\n\n @Stage('subscribe')\n async subscribe() {\n this.logger.verbose('subscribe:start');\n const { uri } = this.state.required.input;\n const { sessionId } = this.state.required;\n\n const isNew = this.scope.notifications.subscribeResource(sessionId, uri);\n\n if (isNew) {\n this.logger.info(`subscribe: session subscribed to resource ${uri}`);\n } else {\n this.logger.verbose(`subscribe: session already subscribed to resource ${uri}`);\n }\n\n this.logger.verbose('subscribe:done');\n }\n\n @Stage('finalize')\n async finalize() {\n this.logger.verbose('finalize:start');\n // Per MCP spec, resources/subscribe returns an empty result\n this.respond({});\n this.logger.verbose('finalize:done');\n }\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FlowBase, FlowRunOptions } from '../../common';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
request: z.ZodObject<{
|
|
5
|
+
method: z.ZodLiteral<"resources/unsubscribe">;
|
|
6
|
+
params: z.ZodObject<{
|
|
7
|
+
_meta: z.ZodOptional<z.ZodObject<{
|
|
8
|
+
progressToken: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
9
|
+
}, z.core.$loose>>;
|
|
10
|
+
uri: z.ZodString;
|
|
11
|
+
}, z.core.$loose>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
ctx: z.ZodUnknown;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
declare const outputSchema: z.ZodObject<{
|
|
16
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
declare const stateSchema: z.ZodObject<{
|
|
19
|
+
input: z.ZodObject<{
|
|
20
|
+
uri: z.ZodString;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
sessionId: z.ZodString;
|
|
23
|
+
output: z.ZodObject<{
|
|
24
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
25
|
+
}, z.core.$strict>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
declare const plan: {
|
|
28
|
+
readonly pre: ["parseInput"];
|
|
29
|
+
readonly execute: ["unsubscribe"];
|
|
30
|
+
readonly finalize: ["finalize"];
|
|
31
|
+
};
|
|
32
|
+
declare global {
|
|
33
|
+
interface ExtendFlows {
|
|
34
|
+
'resources:unsubscribe': FlowRunOptions<UnsubscribeResourceFlow, typeof plan, typeof inputSchema, typeof outputSchema, typeof stateSchema>;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
declare const name: "resources:unsubscribe";
|
|
38
|
+
export default class UnsubscribeResourceFlow extends FlowBase<typeof name> {
|
|
39
|
+
logger: import("../../common").FrontMcpLogger;
|
|
40
|
+
parseInput(): Promise<void>;
|
|
41
|
+
unsubscribe(): Promise<void>;
|
|
42
|
+
finalize(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// file: libs/sdk/src/resource/flows/unsubscribe-resource.flow.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("../../common");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
8
|
+
const errors_1 = require("../../errors");
|
|
9
|
+
const inputSchema = zod_1.z.object({
|
|
10
|
+
request: types_js_1.UnsubscribeRequestSchema,
|
|
11
|
+
ctx: zod_1.z.unknown(),
|
|
12
|
+
});
|
|
13
|
+
const outputSchema = types_js_1.EmptyResultSchema;
|
|
14
|
+
const stateSchema = zod_1.z.object({
|
|
15
|
+
input: zod_1.z.object({
|
|
16
|
+
uri: zod_1.z.string().min(1),
|
|
17
|
+
}),
|
|
18
|
+
sessionId: zod_1.z.string(),
|
|
19
|
+
output: outputSchema,
|
|
20
|
+
});
|
|
21
|
+
const plan = {
|
|
22
|
+
pre: ['parseInput'],
|
|
23
|
+
execute: ['unsubscribe'],
|
|
24
|
+
finalize: ['finalize'],
|
|
25
|
+
};
|
|
26
|
+
const name = 'resources:unsubscribe';
|
|
27
|
+
const { Stage } = (0, common_1.FlowHooksOf)(name);
|
|
28
|
+
let UnsubscribeResourceFlow = class UnsubscribeResourceFlow extends common_1.FlowBase {
|
|
29
|
+
logger = this.scopeLogger.child('UnsubscribeResourceFlow');
|
|
30
|
+
async parseInput() {
|
|
31
|
+
this.logger.verbose('parseInput:start');
|
|
32
|
+
let method;
|
|
33
|
+
let params;
|
|
34
|
+
let ctx;
|
|
35
|
+
try {
|
|
36
|
+
const inputData = inputSchema.parse(this.rawInput);
|
|
37
|
+
method = inputData.request.method;
|
|
38
|
+
params = inputData.request.params;
|
|
39
|
+
ctx = inputData.ctx;
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
throw new errors_1.InvalidInputError('Invalid Input', e instanceof zod_1.z.ZodError ? e.issues : undefined);
|
|
43
|
+
}
|
|
44
|
+
if (method !== 'resources/unsubscribe') {
|
|
45
|
+
this.logger.warn(`parseInput: invalid method "${method}"`);
|
|
46
|
+
throw new errors_1.InvalidMethodError(method, 'resources/unsubscribe');
|
|
47
|
+
}
|
|
48
|
+
// Get session ID from context - required for subscription tracking
|
|
49
|
+
const sessionId = ctx?.['sessionId'];
|
|
50
|
+
if (!sessionId || typeof sessionId !== 'string') {
|
|
51
|
+
this.logger.warn('parseInput: sessionId not found in context');
|
|
52
|
+
throw new errors_1.InvalidInputError('Session ID is required for resource unsubscriptions');
|
|
53
|
+
}
|
|
54
|
+
this.state.set({ input: params, sessionId });
|
|
55
|
+
this.logger.verbose('parseInput:done');
|
|
56
|
+
}
|
|
57
|
+
async unsubscribe() {
|
|
58
|
+
this.logger.verbose('unsubscribe:start');
|
|
59
|
+
const { uri } = this.state.required.input;
|
|
60
|
+
const { sessionId } = this.state.required;
|
|
61
|
+
// Per MCP spec, unsubscribe should succeed even if the resource doesn't exist
|
|
62
|
+
// or the session wasn't subscribed. We just silently succeed.
|
|
63
|
+
const wasSubscribed = this.scope.notifications.unsubscribeResource(sessionId, uri);
|
|
64
|
+
if (wasSubscribed) {
|
|
65
|
+
this.logger.info(`unsubscribe: session unsubscribed from resource ${uri}`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.logger.verbose(`unsubscribe: session was not subscribed to resource ${uri}`);
|
|
69
|
+
}
|
|
70
|
+
this.logger.verbose('unsubscribe:done');
|
|
71
|
+
}
|
|
72
|
+
async finalize() {
|
|
73
|
+
this.logger.verbose('finalize:start');
|
|
74
|
+
// Per MCP spec, resources/unsubscribe returns an empty result
|
|
75
|
+
this.respond({});
|
|
76
|
+
this.logger.verbose('finalize:done');
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
tslib_1.__decorate([
|
|
80
|
+
Stage('parseInput'),
|
|
81
|
+
tslib_1.__metadata("design:type", Function),
|
|
82
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
83
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
84
|
+
], UnsubscribeResourceFlow.prototype, "parseInput", null);
|
|
85
|
+
tslib_1.__decorate([
|
|
86
|
+
Stage('unsubscribe'),
|
|
87
|
+
tslib_1.__metadata("design:type", Function),
|
|
88
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
89
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
90
|
+
], UnsubscribeResourceFlow.prototype, "unsubscribe", null);
|
|
91
|
+
tslib_1.__decorate([
|
|
92
|
+
Stage('finalize'),
|
|
93
|
+
tslib_1.__metadata("design:type", Function),
|
|
94
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
95
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
96
|
+
], UnsubscribeResourceFlow.prototype, "finalize", null);
|
|
97
|
+
UnsubscribeResourceFlow = tslib_1.__decorate([
|
|
98
|
+
(0, common_1.Flow)({
|
|
99
|
+
name,
|
|
100
|
+
plan,
|
|
101
|
+
inputSchema,
|
|
102
|
+
outputSchema,
|
|
103
|
+
access: 'authorized',
|
|
104
|
+
})
|
|
105
|
+
], UnsubscribeResourceFlow);
|
|
106
|
+
exports.default = UnsubscribeResourceFlow;
|
|
107
|
+
//# sourceMappingURL=unsubscribe-resource.flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unsubscribe-resource.flow.js","sourceRoot":"","sources":["../../../../src/resource/flows/unsubscribe-resource.flow.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/resource/flows/unsubscribe-resource.flow.ts\n\nimport { Flow, FlowBase, FlowHooksOf, FlowPlan, FlowRunOptions } from '../../common';\nimport { z } from 'zod';\nimport { UnsubscribeRequestSchema, EmptyResultSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { InvalidMethodError, InvalidInputError } from '../../errors';\n\nconst inputSchema = z.object({\n request: UnsubscribeRequestSchema,\n ctx: z.unknown(),\n});\n\nconst outputSchema = EmptyResultSchema;\n\nconst stateSchema = z.object({\n input: z.object({\n uri: z.string().min(1),\n }),\n sessionId: z.string(),\n output: outputSchema,\n});\n\nconst plan = {\n pre: ['parseInput'],\n execute: ['unsubscribe'],\n finalize: ['finalize'],\n} as const satisfies FlowPlan<string>;\n\ndeclare global {\n interface ExtendFlows {\n 'resources:unsubscribe': FlowRunOptions<\n UnsubscribeResourceFlow,\n typeof plan,\n typeof inputSchema,\n typeof outputSchema,\n typeof stateSchema\n >;\n }\n}\n\nconst name = 'resources:unsubscribe' as const;\nconst { Stage } = FlowHooksOf<'resources:unsubscribe'>(name);\n\n@Flow({\n name,\n plan,\n inputSchema,\n outputSchema,\n access: 'authorized',\n})\nexport default class UnsubscribeResourceFlow extends FlowBase<typeof name> {\n logger = this.scopeLogger.child('UnsubscribeResourceFlow');\n\n @Stage('parseInput')\n async parseInput() {\n this.logger.verbose('parseInput:start');\n\n let method!: string;\n let params: z.infer<typeof UnsubscribeRequestSchema>['params'];\n let ctx: unknown;\n try {\n const inputData = inputSchema.parse(this.rawInput);\n method = inputData.request.method;\n params = inputData.request.params;\n ctx = inputData.ctx;\n } catch (e) {\n throw new InvalidInputError('Invalid Input', e instanceof z.ZodError ? e.issues : undefined);\n }\n\n if (method !== 'resources/unsubscribe') {\n this.logger.warn(`parseInput: invalid method \"${method}\"`);\n throw new InvalidMethodError(method, 'resources/unsubscribe');\n }\n\n // Get session ID from context - required for subscription tracking\n const sessionId = (ctx as Record<string, unknown> | undefined)?.['sessionId'];\n if (!sessionId || typeof sessionId !== 'string') {\n this.logger.warn('parseInput: sessionId not found in context');\n throw new InvalidInputError('Session ID is required for resource unsubscriptions');\n }\n\n this.state.set({ input: params, sessionId });\n this.logger.verbose('parseInput:done');\n }\n\n @Stage('unsubscribe')\n async unsubscribe() {\n this.logger.verbose('unsubscribe:start');\n const { uri } = this.state.required.input;\n const { sessionId } = this.state.required;\n\n // Per MCP spec, unsubscribe should succeed even if the resource doesn't exist\n // or the session wasn't subscribed. We just silently succeed.\n const wasSubscribed = this.scope.notifications.unsubscribeResource(sessionId, uri);\n\n if (wasSubscribed) {\n this.logger.info(`unsubscribe: session unsubscribed from resource ${uri}`);\n } else {\n this.logger.verbose(`unsubscribe: session was not subscribed to resource ${uri}`);\n }\n\n this.logger.verbose('unsubscribe:done');\n }\n\n @Stage('finalize')\n async finalize() {\n this.logger.verbose('finalize:start');\n // Per MCP spec, resources/unsubscribe returns an empty result\n this.respond({});\n this.logger.verbose('finalize:done');\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as ResourceRegistry } from './resource.registry';
|
|
2
|
+
export { ResourceInstance } from './resource.instance';
|
|
3
|
+
export * from './resource.events';
|
|
4
|
+
export * from './resource.types';
|
|
5
|
+
export * from './resource.utils';
|
|
6
|
+
export { default as ResourcesListFlow } from './flows/resources-list.flow';
|
|
7
|
+
export { default as ResourceTemplatesListFlow } from './flows/resource-templates-list.flow';
|
|
8
|
+
export { default as ReadResourceFlow } from './flows/read-resource.flow';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// file: libs/sdk/src/resource/index.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ReadResourceFlow = exports.ResourceTemplatesListFlow = exports.ResourcesListFlow = exports.ResourceInstance = exports.ResourceRegistry = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
var resource_registry_1 = require("./resource.registry");
|
|
7
|
+
Object.defineProperty(exports, "ResourceRegistry", { enumerable: true, get: function () { return tslib_1.__importDefault(resource_registry_1).default; } });
|
|
8
|
+
var resource_instance_1 = require("./resource.instance");
|
|
9
|
+
Object.defineProperty(exports, "ResourceInstance", { enumerable: true, get: function () { return resource_instance_1.ResourceInstance; } });
|
|
10
|
+
tslib_1.__exportStar(require("./resource.events"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./resource.types"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./resource.utils"), exports);
|
|
13
|
+
// Flows
|
|
14
|
+
var resources_list_flow_1 = require("./flows/resources-list.flow");
|
|
15
|
+
Object.defineProperty(exports, "ResourcesListFlow", { enumerable: true, get: function () { return tslib_1.__importDefault(resources_list_flow_1).default; } });
|
|
16
|
+
var resource_templates_list_flow_1 = require("./flows/resource-templates-list.flow");
|
|
17
|
+
Object.defineProperty(exports, "ResourceTemplatesListFlow", { enumerable: true, get: function () { return tslib_1.__importDefault(resource_templates_list_flow_1).default; } });
|
|
18
|
+
var read_resource_flow_1 = require("./flows/read-resource.flow");
|
|
19
|
+
Object.defineProperty(exports, "ReadResourceFlow", { enumerable: true, get: function () { return tslib_1.__importDefault(read_resource_flow_1).default; } });
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resource/index.ts"],"names":[],"mappings":";AAAA,uCAAuC;;;;AAEvC,yDAAkE;AAAzD,8IAAA,OAAO,OAAoB;AACpC,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,4DAAkC;AAClC,2DAAiC;AACjC,2DAAiC;AAEjC,QAAQ;AACR,mEAA2E;AAAlE,iJAAA,OAAO,OAAqB;AACrC,qFAA4F;AAAnF,kKAAA,OAAO,OAA6B;AAC7C,iEAAyE;AAAhE,+IAAA,OAAO,OAAoB","sourcesContent":["// file: libs/sdk/src/resource/index.ts\n\nexport { default as ResourceRegistry } from './resource.registry';\nexport { ResourceInstance } from './resource.instance';\nexport * from './resource.events';\nexport * from './resource.types';\nexport * from './resource.utils';\n\n// Flows\nexport { default as ResourcesListFlow } from './flows/resources-list.flow';\nexport { default as ResourceTemplatesListFlow } from './flows/resource-templates-list.flow';\nexport { default as ReadResourceFlow } from './flows/read-resource.flow';\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ResourceInstance } from './resource.instance';
|
|
2
|
+
export type ResourceChangeKind = 'added' | 'updated' | 'removed' | 'reset';
|
|
3
|
+
/**
|
|
4
|
+
* The scope of a change event.
|
|
5
|
+
* - `global`: Change affects all sessions
|
|
6
|
+
* - `session`: Change affects only a specific session
|
|
7
|
+
*/
|
|
8
|
+
export type ResourceChangeScope = 'global' | 'session';
|
|
9
|
+
export type ResourceChangeEvent = {
|
|
10
|
+
kind: ResourceChangeKind;
|
|
11
|
+
/** Whether the change affects all sessions or a specific session */
|
|
12
|
+
changeScope: ResourceChangeScope;
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
relatedRequestId?: string;
|
|
15
|
+
version: number;
|
|
16
|
+
snapshot: readonly ResourceInstance[];
|
|
17
|
+
};
|
|
18
|
+
type Listener = (e: ResourceChangeEvent) => void;
|
|
19
|
+
export declare class ResourceEmitter {
|
|
20
|
+
private listeners;
|
|
21
|
+
on(l: Listener): () => void;
|
|
22
|
+
emit(e: ResourceChangeEvent): void;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// file: libs/sdk/src/resource/resource.events.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ResourceEmitter = void 0;
|
|
5
|
+
class ResourceEmitter {
|
|
6
|
+
listeners = new Set();
|
|
7
|
+
on(l) {
|
|
8
|
+
this.listeners.add(l);
|
|
9
|
+
return () => this.listeners.delete(l);
|
|
10
|
+
}
|
|
11
|
+
emit(e) {
|
|
12
|
+
for (const l of [...this.listeners])
|
|
13
|
+
l(e);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.ResourceEmitter = ResourceEmitter;
|
|
17
|
+
//# sourceMappingURL=resource.events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.events.js","sourceRoot":"","sources":["../../../src/resource/resource.events.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAyBjD,MAAa,eAAe;IAClB,SAAS,GAAG,IAAI,GAAG,EAAY,CAAC;IAExC,EAAE,CAAC,CAAW;QACZ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,CAAsB;QACzB,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF;AAXD,0CAWC","sourcesContent":["// file: libs/sdk/src/resource/resource.events.ts\n\nimport { ResourceInstance } from './resource.instance';\n\nexport type ResourceChangeKind = 'added' | 'updated' | 'removed' | 'reset';\n\n/**\n * The scope of a change event.\n * - `global`: Change affects all sessions\n * - `session`: Change affects only a specific session\n */\nexport type ResourceChangeScope = 'global' | 'session';\n\nexport type ResourceChangeEvent = {\n kind: ResourceChangeKind;\n /** Whether the change affects all sessions or a specific session */\n changeScope: ResourceChangeScope;\n sessionId?: string;\n relatedRequestId?: string;\n version: number;\n snapshot: readonly ResourceInstance[];\n};\n\ntype Listener = (e: ResourceChangeEvent) => void;\n\nexport class ResourceEmitter {\n private listeners = new Set<Listener>();\n\n on(l: Listener): () => void {\n this.listeners.add(l);\n return () => this.listeners.delete(l);\n }\n\n emit(e: ResourceChangeEvent) {\n for (const l of [...this.listeners]) l(e);\n }\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EntryOwnerRef, ResourceEntry, ResourceReadExtra, ParsedResourceResult, ResourceSafeTransformResult, ResourceRecord, ResourceContext, ResourceMetadata, ResourceTemplateMetadata, ResourceTemplateRecord } from '../common';
|
|
2
|
+
import ProviderRegistry from '../provider/provider.registry';
|
|
3
|
+
import HookRegistry from '../hooks/hook.registry';
|
|
4
|
+
import { Scope } from '../scope';
|
|
5
|
+
export declare class ResourceInstance<Params extends Record<string, string> = Record<string, string>, Out = unknown> extends ResourceEntry<Params, Out> {
|
|
6
|
+
private readonly providers;
|
|
7
|
+
readonly scope: Scope;
|
|
8
|
+
readonly hooks: HookRegistry;
|
|
9
|
+
/** Parsed URI template info for template resources */
|
|
10
|
+
private templateInfo?;
|
|
11
|
+
constructor(record: ResourceRecord | ResourceTemplateRecord, providers: ProviderRegistry, owner: EntryOwnerRef);
|
|
12
|
+
protected initialize(): Promise<void>;
|
|
13
|
+
getMetadata(): ResourceMetadata | ResourceTemplateMetadata;
|
|
14
|
+
/**
|
|
15
|
+
* Match a URI against this resource.
|
|
16
|
+
* For static resources: exact match against uri
|
|
17
|
+
* For templates: pattern match and extract parameters
|
|
18
|
+
*/
|
|
19
|
+
matchUri(uri: string): {
|
|
20
|
+
matches: boolean;
|
|
21
|
+
params: Params;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Create a resource context (class or function wrapper).
|
|
25
|
+
*/
|
|
26
|
+
create(uri: string, params: Params, ctx: ResourceReadExtra): ResourceContext<Params, Out>;
|
|
27
|
+
/**
|
|
28
|
+
* Convert the raw resource return value into an MCP ReadResourceResult.
|
|
29
|
+
*/
|
|
30
|
+
parseOutput(raw: Out): ParsedResourceResult;
|
|
31
|
+
/**
|
|
32
|
+
* Safe version of parseOutput that returns success/error instead of throwing.
|
|
33
|
+
*/
|
|
34
|
+
safeParseOutput(raw: Out): ResourceSafeTransformResult<ParsedResourceResult>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// file: libs/sdk/src/resource/resource.instance.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ResourceInstance = void 0;
|
|
5
|
+
const common_1 = require("../common");
|
|
6
|
+
const hooks_utils_1 = require("../hooks/hooks.utils");
|
|
7
|
+
const resource_utils_1 = require("./resource.utils");
|
|
8
|
+
const mcp_error_1 = require("../errors/mcp.error");
|
|
9
|
+
class ResourceInstance extends common_1.ResourceEntry {
|
|
10
|
+
providers;
|
|
11
|
+
scope;
|
|
12
|
+
hooks;
|
|
13
|
+
/** Parsed URI template info for template resources */
|
|
14
|
+
templateInfo;
|
|
15
|
+
constructor(record, providers, owner) {
|
|
16
|
+
super(record);
|
|
17
|
+
this.owner = owner;
|
|
18
|
+
this.providers = providers;
|
|
19
|
+
this.name = record.metadata.name;
|
|
20
|
+
this.fullName = this.owner.id + ':' + this.name;
|
|
21
|
+
this.scope = this.providers.getActiveScope();
|
|
22
|
+
this.hooks = this.scope.providers.getHooksRegistry();
|
|
23
|
+
// Determine if this is a template resource
|
|
24
|
+
this.isTemplate = 'uriTemplate' in record.metadata;
|
|
25
|
+
if (this.isTemplate) {
|
|
26
|
+
const templateMetadata = record.metadata;
|
|
27
|
+
this.uriTemplate = templateMetadata.uriTemplate;
|
|
28
|
+
// Pre-parse the URI template for efficient matching
|
|
29
|
+
this.templateInfo = (0, resource_utils_1.parseUriTemplate)(this.uriTemplate);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const resourceMetadata = record.metadata;
|
|
33
|
+
this.uri = resourceMetadata.uri;
|
|
34
|
+
}
|
|
35
|
+
this.ready = this.initialize();
|
|
36
|
+
}
|
|
37
|
+
async initialize() {
|
|
38
|
+
// Valid flows for resource hooks
|
|
39
|
+
const validFlows = ['resources:read-resource', 'resources:list-resources', 'resources:list-resource-templates'];
|
|
40
|
+
const allHooks = (0, hooks_utils_1.normalizeHooksFromCls)(this.record.provide);
|
|
41
|
+
// Separate valid and invalid hooks
|
|
42
|
+
const validHooks = allHooks.filter((hook) => validFlows.includes(hook.metadata.flow));
|
|
43
|
+
const invalidHooks = allHooks.filter((hook) => !validFlows.includes(hook.metadata.flow));
|
|
44
|
+
// Throw error for invalid hooks (fail fast)
|
|
45
|
+
if (invalidHooks.length > 0) {
|
|
46
|
+
const className = this.record.provide?.name ?? 'Unknown';
|
|
47
|
+
const invalidFlowNames = invalidHooks.map((h) => h.metadata.flow).join(', ');
|
|
48
|
+
throw new mcp_error_1.InvalidHookFlowError(`Resource "${className}" has hooks for unsupported flows: ${invalidFlowNames}. ` +
|
|
49
|
+
`Only resource flows (${validFlows.join(', ')}) are supported on resource classes.`);
|
|
50
|
+
}
|
|
51
|
+
// Register valid hooks
|
|
52
|
+
if (validHooks.length > 0) {
|
|
53
|
+
await this.hooks.registerHooks(true, ...validHooks);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
getMetadata() {
|
|
57
|
+
return this.record.metadata;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Match a URI against this resource.
|
|
61
|
+
* For static resources: exact match against uri
|
|
62
|
+
* For templates: pattern match and extract parameters
|
|
63
|
+
*/
|
|
64
|
+
matchUri(uri) {
|
|
65
|
+
if (this.isTemplate && this.templateInfo && this.uriTemplate) {
|
|
66
|
+
const params = (0, resource_utils_1.matchUriTemplate)(this.uriTemplate, uri);
|
|
67
|
+
if (params) {
|
|
68
|
+
return { matches: true, params: params };
|
|
69
|
+
}
|
|
70
|
+
return { matches: false, params: {} };
|
|
71
|
+
}
|
|
72
|
+
// Static resource: exact match
|
|
73
|
+
if (this.uri === uri) {
|
|
74
|
+
return { matches: true, params: {} };
|
|
75
|
+
}
|
|
76
|
+
return { matches: false, params: {} };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a resource context (class or function wrapper).
|
|
80
|
+
*/
|
|
81
|
+
create(uri, params, ctx) {
|
|
82
|
+
const metadata = this.metadata;
|
|
83
|
+
const providers = this.providers;
|
|
84
|
+
const scope = this.providers.getActiveScope();
|
|
85
|
+
const logger = scope.logger;
|
|
86
|
+
const authInfo = ctx.authInfo;
|
|
87
|
+
const resourceCtorArgs = {
|
|
88
|
+
metadata,
|
|
89
|
+
uri,
|
|
90
|
+
params,
|
|
91
|
+
providers,
|
|
92
|
+
logger,
|
|
93
|
+
authInfo,
|
|
94
|
+
};
|
|
95
|
+
const record = this.record;
|
|
96
|
+
switch (record.kind) {
|
|
97
|
+
case common_1.ResourceKind.CLASS_TOKEN:
|
|
98
|
+
case common_1.ResourceTemplateKind.CLASS_TOKEN:
|
|
99
|
+
return new record.provide(resourceCtorArgs);
|
|
100
|
+
case common_1.ResourceKind.FUNCTION:
|
|
101
|
+
case common_1.ResourceTemplateKind.FUNCTION:
|
|
102
|
+
return new FunctionResourceContext(record, resourceCtorArgs);
|
|
103
|
+
default:
|
|
104
|
+
// This should be unreachable if all ResourceKind and ResourceTemplateKind values are handled
|
|
105
|
+
throw new Error(`Unhandled resource kind: ${record.kind}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Convert the raw resource return value into an MCP ReadResourceResult.
|
|
110
|
+
*/
|
|
111
|
+
parseOutput(raw) {
|
|
112
|
+
const uri = this.isTemplate ? this.uriTemplate : this.uri;
|
|
113
|
+
const mimeType = this.metadata.mimeType;
|
|
114
|
+
// If raw is already in ReadResourceResult format
|
|
115
|
+
if (raw && typeof raw === 'object' && 'contents' in raw) {
|
|
116
|
+
return raw;
|
|
117
|
+
}
|
|
118
|
+
// If raw is an array, assume it's an array of content items
|
|
119
|
+
if (Array.isArray(raw)) {
|
|
120
|
+
const contents = raw.map((item, index) => {
|
|
121
|
+
if (item && typeof item === 'object' && ('text' in item || 'blob' in item)) {
|
|
122
|
+
const itemUri = item['uri'] || `${uri}#${index}`;
|
|
123
|
+
const itemMimeType = item['mimeType'] || mimeType;
|
|
124
|
+
if ('text' in item) {
|
|
125
|
+
return { uri: itemUri, mimeType: itemMimeType, text: item['text'] };
|
|
126
|
+
}
|
|
127
|
+
return { uri: itemUri, mimeType: itemMimeType, blob: item['blob'] };
|
|
128
|
+
}
|
|
129
|
+
return (0, resource_utils_1.buildParsedResourceResult)(`${uri}#${index}`, item, mimeType);
|
|
130
|
+
});
|
|
131
|
+
return { contents };
|
|
132
|
+
}
|
|
133
|
+
// Single content item
|
|
134
|
+
const content = (0, resource_utils_1.buildParsedResourceResult)(uri, raw, mimeType);
|
|
135
|
+
return { contents: [content] };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Safe version of parseOutput that returns success/error instead of throwing.
|
|
139
|
+
*/
|
|
140
|
+
safeParseOutput(raw) {
|
|
141
|
+
try {
|
|
142
|
+
return { success: true, data: this.parseOutput(raw) };
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return { success: false, error: error instanceof Error ? error : new Error(String(error)) };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.ResourceInstance = ResourceInstance;
|
|
150
|
+
/**
|
|
151
|
+
* Resource context for function-decorated resources.
|
|
152
|
+
*/
|
|
153
|
+
class FunctionResourceContext extends common_1.ResourceContext {
|
|
154
|
+
record;
|
|
155
|
+
constructor(record, args) {
|
|
156
|
+
super(args);
|
|
157
|
+
this.record = record;
|
|
158
|
+
}
|
|
159
|
+
execute(uri, params) {
|
|
160
|
+
return this.record.provide(uri, params, this);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=resource.instance.js.map
|