@frontmcp/sdk 0.4.1 → 0.5.1
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 +110 -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 +336 -1632
- 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 +89 -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 +77 -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 +248 -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 +78 -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 +110 -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 +83 -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 +83 -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 +60 -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 +59 -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 +161 -1112
- 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 +51 -474
- package/src/tool/flows/tools-list.flow.js +121 -40
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.events.d.ts +8 -1
- package/src/tool/tool.events.js.map +1 -1
- package/src/tool/tool.instance.d.ts +3 -1
- package/src/tool/tool.instance.js +17 -3
- package/src/tool/tool.instance.js.map +1 -1
- package/src/tool/tool.registry.d.ts +7 -1
- package/src/tool/tool.registry.js +26 -10
- package/src/tool/tool.registry.js.map +1 -1
- package/src/tool/tool.types.d.ts +4 -4
- package/src/tool/tool.types.js.map +1 -1
- package/src/tool/tool.utils.d.ts +3 -12
- package/src/tool/tool.utils.js +39 -193
- package/src/tool/tool.utils.js.map +1 -1
- package/src/tool/ui/index.d.ts +22 -0
- package/src/tool/ui/index.js +63 -0
- package/src/tool/ui/index.js.map +1 -0
- package/src/tool/ui/platform-adapters.d.ts +10 -0
- package/src/tool/ui/platform-adapters.js +18 -0
- package/src/tool/ui/platform-adapters.js.map +1 -0
- package/src/tool/ui/template-helpers.d.ts +46 -0
- package/src/tool/ui/template-helpers.js +112 -0
- package/src/tool/ui/template-helpers.js.map +1 -0
- package/src/tool/ui/ui-resource-template.d.ts +34 -0
- package/src/tool/ui/ui-resource-template.js +64 -0
- package/src/tool/ui/ui-resource-template.js.map +1 -0
- package/src/tool/ui/ui-resource.handler.d.ts +74 -0
- package/src/tool/ui/ui-resource.handler.js +129 -0
- package/src/tool/ui/ui-resource.handler.js.map +1 -0
- package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.local.adapter.js +28 -7
- package/src/transport/adapters/transport.local.adapter.js.map +1 -1
- package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.sse.adapter.js +4 -3
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
- package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
- package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.d.ts +29 -63
- package/src/transport/flows/handle.sse.flow.js +78 -10
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
- package/src/transport/flows/handle.stateless-http.flow.js +102 -0
- package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
- package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
- package/src/transport/flows/handle.streamable-http.flow.js +158 -26
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
- package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
- package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/complete-request.handler.d.ts +95 -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 +138 -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 +922 -207
- 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 +80 -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 +82 -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 +82 -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 +47 -145
- package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +66 -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 +72 -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 +57 -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 +57 -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,32 +1,468 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// file: libs/sdk/src/resource/resource.registry.ts
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
const resource_events_1 = require("./resource.events");
|
|
7
|
+
const resource_utils_1 = require("./resource.utils");
|
|
3
8
|
const regsitry_1 = require("../regsitry");
|
|
9
|
+
const resource_instance_1 = require("./resource.instance");
|
|
10
|
+
const resource_types_1 = require("./resource.types");
|
|
11
|
+
const read_resource_flow_1 = tslib_1.__importDefault(require("./flows/read-resource.flow"));
|
|
12
|
+
const resources_list_flow_1 = tslib_1.__importDefault(require("./flows/resources-list.flow"));
|
|
13
|
+
const resource_templates_list_flow_1 = tslib_1.__importDefault(require("./flows/resource-templates-list.flow"));
|
|
14
|
+
const subscribe_resource_flow_1 = tslib_1.__importDefault(require("./flows/subscribe-resource.flow"));
|
|
15
|
+
const unsubscribe_resource_flow_1 = tslib_1.__importDefault(require("./flows/unsubscribe-resource.flow"));
|
|
4
16
|
class ResourceRegistry extends regsitry_1.RegistryAbstract {
|
|
5
|
-
|
|
6
|
-
|
|
17
|
+
/** Who owns this registry (used for provenance). */
|
|
18
|
+
owner;
|
|
19
|
+
/** Resources truly owned/constructed by THIS registry (with lineage applied) */
|
|
20
|
+
localRows = [];
|
|
21
|
+
/** Adopted resource rows from each child registry (references to the same instances) */
|
|
22
|
+
adopted = new Map();
|
|
23
|
+
/** Children registries that we track */
|
|
24
|
+
children = new Set();
|
|
25
|
+
// ---- O(1) indexes over EFFECTIVE set (local + adopted) ----
|
|
26
|
+
byQualifiedId = new Map(); // qualifiedId -> row
|
|
27
|
+
byName = new Map(); // baseName -> rows
|
|
28
|
+
byUri = new Map(); // uri -> row (static resources)
|
|
29
|
+
byUriTemplate = new Map(); // uriTemplate -> row (templates)
|
|
30
|
+
byOwnerAndName = new Map(); // "ownerKey:name" -> row
|
|
31
|
+
byOwner = new Map(); // ownerKey -> rows
|
|
32
|
+
// version + emitter
|
|
33
|
+
version = 0;
|
|
34
|
+
emitter = new resource_events_1.ResourceEmitter();
|
|
35
|
+
constructor(providers, list, owner) {
|
|
36
|
+
// disable auto so subclass fields initialize first
|
|
37
|
+
super('ResourceRegistry', providers, list, false);
|
|
38
|
+
this.owner = owner;
|
|
39
|
+
// now it's safe to run the lifecycle
|
|
40
|
+
this.buildGraph();
|
|
41
|
+
this.ready = this.initialize();
|
|
7
42
|
}
|
|
43
|
+
/* -------------------- Build-time: defs + dep checks -------------------- */
|
|
8
44
|
buildMap(list) {
|
|
9
45
|
const tokens = new Set();
|
|
10
46
|
const defs = new Map();
|
|
11
47
|
const graph = new Map();
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
48
|
+
for (const raw of list) {
|
|
49
|
+
// Determine if it's a template or static resource
|
|
50
|
+
const isTemplate = (0, resource_utils_1.isResourceTemplate)(raw);
|
|
51
|
+
const rec = isTemplate ? (0, resource_utils_1.normalizeResourceTemplate)(raw) : (0, resource_utils_1.normalizeResource)(raw);
|
|
52
|
+
const provide = rec.provide;
|
|
53
|
+
tokens.add(provide);
|
|
54
|
+
defs.set(provide, rec);
|
|
55
|
+
graph.set(provide, new Set());
|
|
56
|
+
}
|
|
57
|
+
return { tokens, defs, graph };
|
|
17
58
|
}
|
|
18
59
|
buildGraph() {
|
|
19
|
-
|
|
60
|
+
for (const token of this.tokens) {
|
|
61
|
+
const rec = this.defs.get(token);
|
|
62
|
+
const deps = (0, resource_utils_1.resourceDiscoveryDeps)(rec);
|
|
63
|
+
for (const d of deps) {
|
|
64
|
+
// Validate against hierarchical providers; throws early if missing
|
|
65
|
+
this.providers.get(d);
|
|
66
|
+
this.graph.get(token).add(d);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/* -------------------- Initialize: create ONE ResourceInstance per local resource -------------------- */
|
|
71
|
+
async initialize() {
|
|
72
|
+
// Instantiate each local resource once and store in this.instances
|
|
73
|
+
for (const token of this.tokens) {
|
|
74
|
+
const rec = this.defs.get(token);
|
|
75
|
+
// Single, authoritative instance per local resource
|
|
76
|
+
const ri = new resource_instance_1.ResourceInstance(rec, this.providers, this.owner);
|
|
77
|
+
this.instances.set(token, ri);
|
|
78
|
+
const lineage = this.owner ? [this.owner] : [];
|
|
79
|
+
const row = this.makeRow(token, ri, lineage, this);
|
|
80
|
+
this.localRows.push(row);
|
|
81
|
+
}
|
|
82
|
+
// Adopt resources from child app registries
|
|
83
|
+
const childAppRegistries = this.providers.getRegistries('AppRegistry');
|
|
84
|
+
childAppRegistries.forEach((appRegistry) => {
|
|
85
|
+
const apps = appRegistry.getApps();
|
|
86
|
+
for (const app of apps) {
|
|
87
|
+
const appResourceRegistries = app.providers.getRegistries('ResourceRegistry');
|
|
88
|
+
appResourceRegistries
|
|
89
|
+
.filter((r) => r.owner.kind === 'app')
|
|
90
|
+
.forEach((appResourceRegistry) => {
|
|
91
|
+
this.adoptFromChild(appResourceRegistry, appResourceRegistry.owner);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// Adopt resources from other child resource registries
|
|
96
|
+
const childResourceRegistries = this.providers.getRegistries('ResourceRegistry');
|
|
97
|
+
childResourceRegistries
|
|
98
|
+
.filter((r) => r !== this)
|
|
99
|
+
.forEach((resourceRegistry) => {
|
|
100
|
+
this.adoptFromChild(resourceRegistry, resourceRegistry.owner);
|
|
101
|
+
});
|
|
102
|
+
// Build effective indexes from (locals + already adopted children)
|
|
103
|
+
this.reindex();
|
|
104
|
+
this.bump('reset');
|
|
105
|
+
// Register resource flows with the scope
|
|
106
|
+
const scope = this.providers.getActiveScope();
|
|
107
|
+
await scope.registryFlows(read_resource_flow_1.default, resources_list_flow_1.default, resource_templates_list_flow_1.default, subscribe_resource_flow_1.default, unsubscribe_resource_flow_1.default);
|
|
108
|
+
}
|
|
109
|
+
/* -------------------- Adoption: reference child instances (no cloning) -------------------- */
|
|
110
|
+
/**
|
|
111
|
+
* Adopt resources from a child registry. Parent runs after children are ready.
|
|
112
|
+
* We *reference* the child's resource instances; no duplicates are created.
|
|
113
|
+
*/
|
|
114
|
+
adoptFromChild(child, _childOwner) {
|
|
115
|
+
if (this.children.has(child))
|
|
116
|
+
return;
|
|
117
|
+
const childRows = child.listAllIndexed();
|
|
118
|
+
const prepend = this.owner ? [this.owner] : [];
|
|
119
|
+
const adoptedRows = childRows.map((r) => this.relineage(r, prepend));
|
|
120
|
+
this.adopted.set(child, adoptedRows);
|
|
121
|
+
this.children.add(child);
|
|
122
|
+
// keep live if child changes
|
|
123
|
+
child.subscribe({ immediate: false }, () => {
|
|
124
|
+
const latest = child.listAllIndexed().map((r) => this.relineage(r, prepend));
|
|
125
|
+
this.adopted.set(child, latest);
|
|
126
|
+
this.reindex();
|
|
127
|
+
this.bump('reset');
|
|
128
|
+
});
|
|
129
|
+
this.reindex();
|
|
130
|
+
this.bump('reset');
|
|
20
131
|
}
|
|
21
|
-
|
|
22
|
-
|
|
132
|
+
/* -------------------- Public API -------------------- */
|
|
133
|
+
/**
|
|
134
|
+
* Get all static resources (not templates)
|
|
135
|
+
*/
|
|
136
|
+
getResources(includeHidden = false) {
|
|
137
|
+
const all = this.listAllIndexed();
|
|
138
|
+
return all
|
|
139
|
+
.filter((r) => !r.isTemplate)
|
|
140
|
+
.filter((r) => {
|
|
141
|
+
const meta = r.instance.metadata;
|
|
142
|
+
const hidden = 'hideFromDiscovery' in meta && meta.hideFromDiscovery === true;
|
|
143
|
+
return !hidden || includeHidden;
|
|
144
|
+
})
|
|
145
|
+
.map((r) => r.instance);
|
|
23
146
|
}
|
|
24
|
-
|
|
25
|
-
|
|
147
|
+
/**
|
|
148
|
+
* Get all resource templates
|
|
149
|
+
*/
|
|
150
|
+
getResourceTemplates() {
|
|
151
|
+
const all = this.listAllIndexed();
|
|
152
|
+
return all.filter((r) => r.isTemplate).map((r) => r.instance);
|
|
26
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Get inline resources (local only)
|
|
156
|
+
*/
|
|
27
157
|
getInlineResources() {
|
|
28
|
-
|
|
158
|
+
return [...this.instances.values()];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Find a resource by exact URI match
|
|
162
|
+
*/
|
|
163
|
+
findByUri(uri) {
|
|
164
|
+
const row = this.byUri.get(uri);
|
|
165
|
+
return row?.instance;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Match a URI against template resources and extract parameters
|
|
169
|
+
*/
|
|
170
|
+
matchTemplateByUri(uri) {
|
|
171
|
+
// Try each template resource
|
|
172
|
+
for (const row of this.listAllIndexed()) {
|
|
173
|
+
if (!row.isTemplate)
|
|
174
|
+
continue;
|
|
175
|
+
const match = row.instance.matchUri(uri);
|
|
176
|
+
if (match.matches) {
|
|
177
|
+
return { instance: row.instance, params: match.params };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Find a resource by URI - tries exact match first, then template matching
|
|
184
|
+
*/
|
|
185
|
+
findResourceForUri(uri) {
|
|
186
|
+
// Try exact URI match first
|
|
187
|
+
const exact = this.findByUri(uri);
|
|
188
|
+
if (exact) {
|
|
189
|
+
return { instance: exact, params: {} };
|
|
190
|
+
}
|
|
191
|
+
// Try template matching
|
|
192
|
+
return this.matchTemplateByUri(uri);
|
|
193
|
+
}
|
|
194
|
+
/** Internal snapshot of effective indexed rows (locals + adopted). */
|
|
195
|
+
listAllIndexed() {
|
|
196
|
+
return [...this.localRows, ...[...this.adopted.values()].flat()];
|
|
197
|
+
}
|
|
198
|
+
/** List all instances (locals + adopted). */
|
|
199
|
+
listAllInstances() {
|
|
200
|
+
return this.listAllIndexed().map((r) => r.instance);
|
|
201
|
+
}
|
|
202
|
+
/** List instances by owner path (e.g. "app:Portal/plugin:Okta") */
|
|
203
|
+
listByOwner(ownerPath) {
|
|
204
|
+
return (this.byOwner.get(ownerPath) ?? []).map((r) => r.instance);
|
|
205
|
+
}
|
|
206
|
+
/* -------------------- Indexing & lookups -------------------- */
|
|
207
|
+
reindex() {
|
|
208
|
+
const effective = this.listAllIndexed();
|
|
209
|
+
this.byQualifiedId.clear();
|
|
210
|
+
this.byName.clear();
|
|
211
|
+
this.byUri.clear();
|
|
212
|
+
this.byUriTemplate.clear();
|
|
213
|
+
this.byOwnerAndName.clear();
|
|
214
|
+
this.byOwner.clear();
|
|
215
|
+
for (const r of effective) {
|
|
216
|
+
this.byQualifiedId.set(r.qualifiedId, r);
|
|
217
|
+
const listByName = this.byName.get(r.baseName) ?? [];
|
|
218
|
+
listByName.push(r);
|
|
219
|
+
this.byName.set(r.baseName, listByName);
|
|
220
|
+
const byOwnerKey = this.byOwner.get(r.ownerKey) ?? [];
|
|
221
|
+
byOwnerKey.push(r);
|
|
222
|
+
this.byOwner.set(r.ownerKey, byOwnerKey);
|
|
223
|
+
const on = `${r.ownerKey}:${r.baseName}`;
|
|
224
|
+
if (!this.byOwnerAndName.has(on))
|
|
225
|
+
this.byOwnerAndName.set(on, r);
|
|
226
|
+
// Index by URI or URI template
|
|
227
|
+
if (r.isTemplate && r.uriTemplate) {
|
|
228
|
+
this.byUriTemplate.set(r.uriTemplate, r);
|
|
229
|
+
}
|
|
230
|
+
else if (r.uri) {
|
|
231
|
+
this.byUri.set(r.uri, r);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/* -------------------- Conflict-aware exported names -------------------- */
|
|
236
|
+
/**
|
|
237
|
+
* Produce unique, MCP-valid exported names.
|
|
238
|
+
*/
|
|
239
|
+
exportResolvedNames(opts) {
|
|
240
|
+
const cfg = { ...resource_types_1.DEFAULT_RESOURCE_EXPORT_OPTS, ...(opts ?? {}) };
|
|
241
|
+
const rows = this.listAllIndexed().map((r) => {
|
|
242
|
+
const base = (0, resource_utils_1.normalizeSegment)(r.baseName, cfg.case);
|
|
243
|
+
const isLocal = r.source === this;
|
|
244
|
+
const provider = (0, resource_utils_1.normalizeProviderId)(this.providerIdOf(r.instance), cfg.case);
|
|
245
|
+
const ownerPath = (0, resource_utils_1.normalizeOwnerPath)(r.ownerKey, cfg.case);
|
|
246
|
+
return { base, row: r, isLocal, provider, ownerPath };
|
|
247
|
+
});
|
|
248
|
+
// group by standardized base
|
|
249
|
+
const byBase = new Map();
|
|
250
|
+
for (const r of rows) {
|
|
251
|
+
const list = byBase.get(r.base) ?? [];
|
|
252
|
+
list.push(r);
|
|
253
|
+
byBase.set(r.base, list);
|
|
254
|
+
}
|
|
255
|
+
const out = new Map();
|
|
256
|
+
for (const [base, group] of byBase.entries()) {
|
|
257
|
+
if (group.length === 1) {
|
|
258
|
+
const g = group[0];
|
|
259
|
+
out.set((0, resource_utils_1.ensureMaxLen)(base, cfg.maxLen), g.row.instance);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const locals = group.filter((g) => g.isLocal);
|
|
263
|
+
const children = group.filter((g) => !g.isLocal);
|
|
264
|
+
if (cfg.prefixChildrenOnConflict && locals.length > 0) {
|
|
265
|
+
// Locals
|
|
266
|
+
if (locals.length === 1) {
|
|
267
|
+
const localName = (0, resource_utils_1.ensureMaxLen)(base, cfg.maxLen);
|
|
268
|
+
out.set(disambiguate(localName, out, cfg), locals[0].row.instance);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
for (const l of locals) {
|
|
272
|
+
const pref = (0, resource_utils_1.normalizeOwnerPath)(l.ownerPath, cfg.case);
|
|
273
|
+
const name = (0, resource_utils_1.ensureMaxLen)(`${pref}${(0, resource_utils_1.sepFor)(cfg.case)}${base}`, cfg.maxLen);
|
|
274
|
+
out.set(disambiguate(name, out, cfg), l.row.instance);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Children
|
|
278
|
+
for (const c of children) {
|
|
279
|
+
const pre = cfg.prefixSource === 'provider' ? c.provider ?? c.ownerPath : c.ownerPath;
|
|
280
|
+
const name = (0, resource_utils_1.ensureMaxLen)(`${pre}${(0, resource_utils_1.sepFor)(cfg.case)}${base}`, cfg.maxLen);
|
|
281
|
+
out.set(disambiguate(name, out, cfg), c.row.instance);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
// Prefix everyone by source
|
|
286
|
+
for (const r of group) {
|
|
287
|
+
const pre = cfg.prefixSource === 'provider' ? r.provider ?? r.ownerPath : r.ownerPath;
|
|
288
|
+
const name = (0, resource_utils_1.ensureMaxLen)(`${pre}${(0, resource_utils_1.sepFor)(cfg.case)}${base}`, cfg.maxLen);
|
|
289
|
+
out.set(disambiguate(name, out, cfg), r.row.instance);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return [...out.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([name, instance]) => ({ name, instance }));
|
|
294
|
+
function disambiguate(candidate, pool, cfg) {
|
|
295
|
+
if (!pool.has(candidate))
|
|
296
|
+
return candidate;
|
|
297
|
+
const maxAttempts = 10000;
|
|
298
|
+
let n = 2;
|
|
299
|
+
while (n <= maxAttempts) {
|
|
300
|
+
const withN = (0, resource_utils_1.ensureMaxLen)(`${candidate}${(0, resource_utils_1.sepFor)(cfg.case)}${n}`, cfg.maxLen);
|
|
301
|
+
if (!pool.has(withN))
|
|
302
|
+
return withN;
|
|
303
|
+
n++;
|
|
304
|
+
}
|
|
305
|
+
throw new Error(`Failed to disambiguate name "${candidate}" after ${maxAttempts} attempts`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/** Lookup by the exported (resolved) name. */
|
|
309
|
+
getExported(name, opts) {
|
|
310
|
+
const pairs = this.exportResolvedNames(opts);
|
|
311
|
+
return pairs.find((p) => p.name === name)?.instance;
|
|
312
|
+
}
|
|
313
|
+
/* -------------------- Subscriptions -------------------- */
|
|
314
|
+
subscribe(opts, cb) {
|
|
315
|
+
const filter = opts.filter ?? (() => true);
|
|
316
|
+
if (opts.immediate) {
|
|
317
|
+
cb({
|
|
318
|
+
kind: 'reset',
|
|
319
|
+
changeScope: 'global',
|
|
320
|
+
version: this.version,
|
|
321
|
+
snapshot: this.listAllInstances().filter(filter),
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
return this.emitter.on((e) => cb({ ...e, snapshot: this.listAllInstances().filter(filter) }));
|
|
325
|
+
}
|
|
326
|
+
bump(kind) {
|
|
327
|
+
const version = ++this.version;
|
|
328
|
+
this.emitter.emit({ kind, changeScope: 'global', version, snapshot: this.listAllInstances() });
|
|
329
|
+
}
|
|
330
|
+
/* -------------------- Helpers -------------------- */
|
|
331
|
+
/** Build an IndexedResource row */
|
|
332
|
+
makeRow(token, instance, lineage, source) {
|
|
333
|
+
const ownerKey = (0, resource_utils_1.ownerKeyOf)(lineage);
|
|
334
|
+
const baseName = instance.name;
|
|
335
|
+
const qualifiedName = (0, resource_utils_1.qualifiedNameOf)(lineage, baseName);
|
|
336
|
+
const qualifiedId = `${ownerKey}:${(0, utils_1.tokenName)(token)}`;
|
|
337
|
+
return {
|
|
338
|
+
token,
|
|
339
|
+
instance,
|
|
340
|
+
baseName,
|
|
341
|
+
uri: instance.uri,
|
|
342
|
+
uriTemplate: instance.uriTemplate,
|
|
343
|
+
isTemplate: instance.isTemplate,
|
|
344
|
+
lineage,
|
|
345
|
+
ownerKey,
|
|
346
|
+
qualifiedName,
|
|
347
|
+
qualifiedId,
|
|
348
|
+
source,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/** Clone a child row and prepend lineage (with adjacent de-dup to avoid double prefixes). */
|
|
352
|
+
relineage(row, prepend) {
|
|
353
|
+
const merged = [...prepend, ...row.lineage];
|
|
354
|
+
const lineage = dedupLineage(merged);
|
|
355
|
+
const ownerKey = (0, resource_utils_1.ownerKeyOf)(lineage);
|
|
356
|
+
const qualifiedName = (0, resource_utils_1.qualifiedNameOf)(lineage, row.baseName);
|
|
357
|
+
const qualifiedId = `${ownerKey}:${(0, utils_1.tokenName)(row.token)}`;
|
|
358
|
+
return {
|
|
359
|
+
token: row.token,
|
|
360
|
+
instance: row.instance, // REFERENCE the same instance
|
|
361
|
+
baseName: row.baseName,
|
|
362
|
+
uri: row.uri,
|
|
363
|
+
uriTemplate: row.uriTemplate,
|
|
364
|
+
isTemplate: row.isTemplate,
|
|
365
|
+
lineage,
|
|
366
|
+
ownerKey,
|
|
367
|
+
qualifiedName,
|
|
368
|
+
qualifiedId,
|
|
369
|
+
source: row.source, // keep original source (who constructed instance)
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
/** Best-effort provider id used for prefixing. */
|
|
373
|
+
providerIdOf(inst) {
|
|
374
|
+
try {
|
|
375
|
+
const meta = inst.getMetadata?.();
|
|
376
|
+
if (!meta || typeof meta !== 'object')
|
|
377
|
+
return undefined;
|
|
378
|
+
const metaObj = meta;
|
|
379
|
+
const maybe = metaObj['providerId'] ?? metaObj['provider'] ?? metaObj['ownerId'];
|
|
380
|
+
if (typeof maybe === 'string' && maybe.length > 0)
|
|
381
|
+
return maybe;
|
|
382
|
+
const cls = metaObj['cls'];
|
|
383
|
+
if (cls && typeof cls === 'function') {
|
|
384
|
+
const id = (0, utils_1.getMetadata)('id', cls);
|
|
385
|
+
if (typeof id === 'string' && id.length > 0)
|
|
386
|
+
return id;
|
|
387
|
+
if ('name' in cls && typeof cls.name === 'string')
|
|
388
|
+
return cls.name;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
/* ignore */
|
|
393
|
+
}
|
|
394
|
+
return undefined;
|
|
395
|
+
}
|
|
396
|
+
/** True if this registry (or adopted children) has any resources. */
|
|
397
|
+
hasAny() {
|
|
398
|
+
return this.listAllIndexed().length > 0 || this.tokens.size > 0;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Get the MCP capabilities for resources.
|
|
402
|
+
* These are reported to clients during initialization.
|
|
403
|
+
*/
|
|
404
|
+
getCapabilities() {
|
|
405
|
+
return this.hasAny()
|
|
406
|
+
? {
|
|
407
|
+
resources: {
|
|
408
|
+
// Subscription support per MCP 2025-11-25 spec
|
|
409
|
+
subscribe: true,
|
|
410
|
+
// List change notifications are only supported when resources are registered
|
|
411
|
+
listChanged: true,
|
|
412
|
+
},
|
|
413
|
+
}
|
|
414
|
+
: {};
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Dynamically register a resource or resource template at runtime.
|
|
418
|
+
*
|
|
419
|
+
* Used for system resources like the ui:// template that should be
|
|
420
|
+
* registered when tools with UI configs exist.
|
|
421
|
+
*
|
|
422
|
+
* @param resourceDef - Resource class, function, or template to register
|
|
423
|
+
*/
|
|
424
|
+
registerDynamicResource(resourceDef) {
|
|
425
|
+
const isTemplate = (0, resource_utils_1.isResourceTemplate)(resourceDef);
|
|
426
|
+
const rec = isTemplate ? (0, resource_utils_1.normalizeResourceTemplate)(resourceDef) : (0, resource_utils_1.normalizeResource)(resourceDef);
|
|
427
|
+
const token = rec.provide;
|
|
428
|
+
// Skip if already registered
|
|
429
|
+
if (this.tokens.has(token)) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
// Add to registry structures
|
|
433
|
+
this.tokens.add(token);
|
|
434
|
+
this.defs.set(token, rec);
|
|
435
|
+
// Build dependency graph (same pattern as buildGraph)
|
|
436
|
+
const deps = (0, resource_utils_1.resourceDiscoveryDeps)(rec);
|
|
437
|
+
const depSet = new Set();
|
|
438
|
+
for (const d of deps) {
|
|
439
|
+
// Validate against hierarchical providers; throws early if missing
|
|
440
|
+
this.providers.get(d);
|
|
441
|
+
depSet.add(d);
|
|
442
|
+
}
|
|
443
|
+
this.graph.set(token, depSet);
|
|
444
|
+
// Create instance
|
|
445
|
+
const ri = new resource_instance_1.ResourceInstance(rec, this.providers, this.owner);
|
|
446
|
+
this.instances.set(token, ri);
|
|
447
|
+
// Add to local rows with lineage
|
|
448
|
+
const lineage = this.owner ? [this.owner] : [];
|
|
449
|
+
const row = this.makeRow(token, ri, lineage, this);
|
|
450
|
+
this.localRows.push(row);
|
|
451
|
+
// Rebuild indexes and emit change event
|
|
452
|
+
this.reindex();
|
|
453
|
+
this.bump('reset');
|
|
29
454
|
}
|
|
30
455
|
}
|
|
31
456
|
exports.default = ResourceRegistry;
|
|
457
|
+
/* -------------------- lineage utility -------------------- */
|
|
458
|
+
/** Remove only adjacent duplicates like [adapter:x, adapter:x] → [adapter:x] */
|
|
459
|
+
function dedupLineage(l) {
|
|
460
|
+
const out = [];
|
|
461
|
+
for (const o of l) {
|
|
462
|
+
const last = out[out.length - 1];
|
|
463
|
+
if (!last || last.kind !== o.kind || last.id !== o.id)
|
|
464
|
+
out.push(o);
|
|
465
|
+
}
|
|
466
|
+
return out;
|
|
467
|
+
}
|
|
32
468
|
//# sourceMappingURL=resource.registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.registry.js","sourceRoot":"","sources":["../../../src/resource/resource.registry.ts"],"names":[],"mappings":";;AAQA,0CAA+C;AAG/C,MAAqB,gBAAiB,SAAQ,2BAA+D;IAG3G,YAAY,SAA2B,EAAE,IAAgB;QACvD,KAAK,CAAC,kBAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAGS,QAAQ,CAAC,IAAoB;QACrC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAS,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;QAE3C,OAAO;YACL,MAAM;YACN,IAAI;YACJ,KAAK;SACN,CAAC;IACJ,CAAC;IAED,UAAU;QACR,iCAAiC;IACnC,CAAC;IAES,UAAU;QAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAGD,YAAY;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kBAAkB;QAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;CACF;AApCD,mCAoCC","sourcesContent":["import ProviderRegistry from '../provider/provider.registry';\nimport {\n ResourceEntry, ResourceRecord,\n ResourceRegistryInterface,\n ResourceType,\n Token,\n ToolType,\n} from '../common';\nimport { RegistryAbstract } from '../regsitry';\n\n\nexport default class ResourceRegistry extends RegistryAbstract<ResourceEntry, ResourceRecord, ResourceType[]>\n implements ResourceRegistryInterface {\n\n constructor(providers: ProviderRegistry, list: ToolType[]) {\n super('ResourceRegistry', providers, list);\n }\n\n\n protected buildMap(list: ResourceType[]) {\n const tokens = new Set<Token>();\n const defs = new Map<Token, ResourceRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n return {\n tokens,\n defs,\n graph,\n };\n }\n\n buildGraph() {\n // TODO: implement graph building\n }\n\n protected initialize() {\n return Promise.resolve();\n }\n\n\n getResources() {\n return [];\n }\n\n getInlineResources(): ResourceEntry<any, any>[] {\n throw new Error('Method not implemented.');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resource.registry.js","sourceRoot":"","sources":["../../../src/resource/resource.registry.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/resource/resource.registry.ts\n\nimport {\n EntryLineage,\n EntryOwnerRef,\n Token,\n ResourceEntry,\n ResourceRecord,\n ResourceTemplateRecord,\n ResourceRegistryInterface,\n ResourceType,\n} from '../common';\nimport { getMetadata, tokenName } from '../utils';\nimport { ResourceChangeEvent, ResourceEmitter } from './resource.events';\nimport ProviderRegistry from '../provider/provider.registry';\nimport {\n ensureMaxLen,\n normalizeOwnerPath,\n normalizeProviderId,\n normalizeSegment,\n normalizeResource,\n normalizeResourceTemplate,\n isResourceTemplate,\n ownerKeyOf,\n qualifiedNameOf,\n sepFor,\n resourceDiscoveryDeps,\n} from './resource.utils';\nimport { RegistryAbstract, RegistryBuildMapResult } from '../regsitry';\nimport { ResourceInstance } from './resource.instance';\nimport { DEFAULT_RESOURCE_EXPORT_OPTS, ResourceExportOptions, IndexedResource } from './resource.types';\nimport ReadResourceFlow from './flows/read-resource.flow';\nimport ResourcesListFlow from './flows/resources-list.flow';\nimport ResourceTemplatesListFlow from './flows/resource-templates-list.flow';\nimport SubscribeResourceFlow from './flows/subscribe-resource.flow';\nimport UnsubscribeResourceFlow from './flows/unsubscribe-resource.flow';\nimport type { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';\n\nexport default class ResourceRegistry\n extends RegistryAbstract<\n ResourceInstance, // instances map holds ResourceInstance\n ResourceRecord | ResourceTemplateRecord,\n ResourceType[]\n >\n implements ResourceRegistryInterface\n{\n /** Who owns this registry (used for provenance). */\n owner: EntryOwnerRef;\n\n /** Resources truly owned/constructed by THIS registry (with lineage applied) */\n private localRows: IndexedResource[] = [];\n\n /** Adopted resource rows from each child registry (references to the same instances) */\n private adopted = new Map<ResourceRegistry, IndexedResource[]>();\n\n /** Children registries that we track */\n private children = new Set<ResourceRegistry>();\n\n // ---- O(1) indexes over EFFECTIVE set (local + adopted) ----\n private byQualifiedId = new Map<string, IndexedResource>(); // qualifiedId -> row\n private byName = new Map<string, IndexedResource[]>(); // baseName -> rows\n private byUri = new Map<string, IndexedResource>(); // uri -> row (static resources)\n private byUriTemplate = new Map<string, IndexedResource>(); // uriTemplate -> row (templates)\n private byOwnerAndName = new Map<string, IndexedResource>(); // \"ownerKey:name\" -> row\n private byOwner = new Map<string, IndexedResource[]>(); // ownerKey -> rows\n\n // version + emitter\n private version = 0;\n private emitter = new ResourceEmitter();\n\n constructor(providers: ProviderRegistry, list: ResourceType[], owner: EntryOwnerRef) {\n // disable auto so subclass fields initialize first\n super('ResourceRegistry', providers, list, false);\n this.owner = owner;\n\n // now it's safe to run the lifecycle\n this.buildGraph();\n this.ready = this.initialize();\n }\n\n /* -------------------- Build-time: defs + dep checks -------------------- */\n\n protected override buildMap(list: ResourceType[]): RegistryBuildMapResult<ResourceRecord | ResourceTemplateRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, ResourceRecord | ResourceTemplateRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n for (const raw of list) {\n // Determine if it's a template or static resource\n const isTemplate = isResourceTemplate(raw);\n const rec = isTemplate ? normalizeResourceTemplate(raw) : normalizeResource(raw);\n\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\n return { tokens, defs, graph };\n }\n\n protected buildGraph() {\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n const deps = resourceDiscoveryDeps(rec);\n\n for (const d of deps) {\n // Validate against hierarchical providers; throws early if missing\n this.providers.get(d);\n this.graph.get(token)!.add(d);\n }\n }\n }\n\n /* -------------------- Initialize: create ONE ResourceInstance per local resource -------------------- */\n\n protected override async initialize(): Promise<void> {\n // Instantiate each local resource once and store in this.instances\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n\n // Single, authoritative instance per local resource\n const ri = new ResourceInstance(rec, this.providers, this.owner);\n this.instances.set(token as Token<ResourceInstance>, ri);\n\n const lineage: EntryLineage = this.owner ? [this.owner] : [];\n const row = this.makeRow(token, ri, lineage, this);\n this.localRows.push(row);\n }\n\n // Adopt resources from child app registries\n const childAppRegistries = this.providers.getRegistries('AppRegistry');\n childAppRegistries.forEach((appRegistry) => {\n const apps = appRegistry.getApps();\n for (const app of apps) {\n const appResourceRegistries = app.providers.getRegistries('ResourceRegistry');\n appResourceRegistries\n .filter((r) => r.owner.kind === 'app')\n .forEach((appResourceRegistry) => {\n this.adoptFromChild(appResourceRegistry as ResourceRegistry, appResourceRegistry.owner);\n });\n }\n });\n\n // Adopt resources from other child resource registries\n const childResourceRegistries = this.providers.getRegistries('ResourceRegistry');\n childResourceRegistries\n .filter((r) => r !== this)\n .forEach((resourceRegistry) => {\n this.adoptFromChild(resourceRegistry as ResourceRegistry, resourceRegistry.owner);\n });\n\n // Build effective indexes from (locals + already adopted children)\n this.reindex();\n this.bump('reset');\n\n // Register resource flows with the scope\n const scope = this.providers.getActiveScope();\n await scope.registryFlows(\n ReadResourceFlow,\n ResourcesListFlow,\n ResourceTemplatesListFlow,\n SubscribeResourceFlow,\n UnsubscribeResourceFlow,\n );\n }\n\n /* -------------------- Adoption: reference child instances (no cloning) -------------------- */\n\n /**\n * Adopt resources from a child registry. Parent runs after children are ready.\n * We *reference* the child's resource instances; no duplicates are created.\n */\n adoptFromChild(child: ResourceRegistry, _childOwner: EntryOwnerRef): void {\n if (this.children.has(child)) return;\n\n const childRows = child.listAllIndexed();\n const prepend: EntryLineage = this.owner ? [this.owner] : [];\n\n const adoptedRows = childRows.map((r) => this.relineage(r, prepend));\n\n this.adopted.set(child, adoptedRows);\n this.children.add(child);\n\n // keep live if child changes\n child.subscribe({ immediate: false }, () => {\n const latest = child.listAllIndexed().map((r) => this.relineage(r, prepend));\n this.adopted.set(child, latest);\n this.reindex();\n this.bump('reset');\n });\n\n this.reindex();\n this.bump('reset');\n }\n\n /* -------------------- Public API -------------------- */\n\n /**\n * Get all static resources (not templates)\n */\n getResources(includeHidden = false): ResourceEntry[] {\n const all = this.listAllIndexed();\n return all\n .filter((r) => !r.isTemplate)\n .filter((r) => {\n const meta = r.instance.metadata;\n const hidden = 'hideFromDiscovery' in meta && meta.hideFromDiscovery === true;\n return !hidden || includeHidden;\n })\n .map((r) => r.instance);\n }\n\n /**\n * Get all resource templates\n */\n getResourceTemplates(): ResourceEntry[] {\n const all = this.listAllIndexed();\n return all.filter((r) => r.isTemplate).map((r) => r.instance);\n }\n\n /**\n * Get inline resources (local only)\n */\n getInlineResources(): ResourceEntry[] {\n return [...this.instances.values()];\n }\n\n /**\n * Find a resource by exact URI match\n */\n findByUri(uri: string): ResourceInstance | undefined {\n const row = this.byUri.get(uri);\n return row?.instance;\n }\n\n /**\n * Match a URI against template resources and extract parameters\n */\n matchTemplateByUri(uri: string): { instance: ResourceInstance; params: Record<string, string> } | undefined {\n // Try each template resource\n for (const row of this.listAllIndexed()) {\n if (!row.isTemplate) continue;\n\n const match = row.instance.matchUri(uri);\n if (match.matches) {\n return { instance: row.instance, params: match.params };\n }\n }\n return undefined;\n }\n\n /**\n * Find a resource by URI - tries exact match first, then template matching\n */\n findResourceForUri(uri: string): { instance: ResourceInstance; params: Record<string, string> } | undefined {\n // Try exact URI match first\n const exact = this.findByUri(uri);\n if (exact) {\n return { instance: exact, params: {} };\n }\n\n // Try template matching\n return this.matchTemplateByUri(uri);\n }\n\n /** Internal snapshot of effective indexed rows (locals + adopted). */\n listAllIndexed(): IndexedResource[] {\n return [...this.localRows, ...[...this.adopted.values()].flat()];\n }\n\n /** List all instances (locals + adopted). */\n listAllInstances(): readonly ResourceInstance[] {\n return this.listAllIndexed().map((r) => r.instance);\n }\n\n /** List instances by owner path (e.g. \"app:Portal/plugin:Okta\") */\n listByOwner(ownerPath: string): readonly ResourceInstance[] {\n return (this.byOwner.get(ownerPath) ?? []).map((r) => r.instance);\n }\n\n /* -------------------- Indexing & lookups -------------------- */\n\n private reindex() {\n const effective = this.listAllIndexed();\n\n this.byQualifiedId.clear();\n this.byName.clear();\n this.byUri.clear();\n this.byUriTemplate.clear();\n this.byOwnerAndName.clear();\n this.byOwner.clear();\n\n for (const r of effective) {\n this.byQualifiedId.set(r.qualifiedId, r);\n\n const listByName = this.byName.get(r.baseName) ?? [];\n listByName.push(r);\n this.byName.set(r.baseName, listByName);\n\n const byOwnerKey = this.byOwner.get(r.ownerKey) ?? [];\n byOwnerKey.push(r);\n this.byOwner.set(r.ownerKey, byOwnerKey);\n\n const on = `${r.ownerKey}:${r.baseName}`;\n if (!this.byOwnerAndName.has(on)) this.byOwnerAndName.set(on, r);\n\n // Index by URI or URI template\n if (r.isTemplate && r.uriTemplate) {\n this.byUriTemplate.set(r.uriTemplate, r);\n } else if (r.uri) {\n this.byUri.set(r.uri, r);\n }\n }\n }\n\n /* -------------------- Conflict-aware exported names -------------------- */\n\n /**\n * Produce unique, MCP-valid exported names.\n */\n exportResolvedNames(opts?: ResourceExportOptions): Array<{ name: string; instance: ResourceInstance }> {\n const cfg = { ...DEFAULT_RESOURCE_EXPORT_OPTS, ...(opts ?? {}) };\n\n const rows = this.listAllIndexed().map((r) => {\n const base = normalizeSegment(r.baseName, cfg.case);\n const isLocal = r.source === this;\n const provider = normalizeProviderId(this.providerIdOf(r.instance), cfg.case);\n const ownerPath = normalizeOwnerPath(r.ownerKey, cfg.case);\n return { base, row: r, isLocal, provider, ownerPath };\n });\n\n // group by standardized base\n const byBase = new Map<string, typeof rows>();\n for (const r of rows) {\n const list = byBase.get(r.base) ?? [];\n list.push(r);\n byBase.set(r.base, list);\n }\n\n const out = new Map<string, ResourceInstance>();\n\n for (const [base, group] of byBase.entries()) {\n if (group.length === 1) {\n const g = group[0];\n out.set(ensureMaxLen(base, cfg.maxLen), g.row.instance);\n continue;\n }\n\n const locals = group.filter((g) => g.isLocal);\n const children = group.filter((g) => !g.isLocal);\n\n if (cfg.prefixChildrenOnConflict && locals.length > 0) {\n // Locals\n if (locals.length === 1) {\n const localName = ensureMaxLen(base, cfg.maxLen);\n out.set(disambiguate(localName, out, cfg), locals[0].row.instance);\n } else {\n for (const l of locals) {\n const pref = normalizeOwnerPath(l.ownerPath, cfg.case);\n const name = ensureMaxLen(`${pref}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), l.row.instance);\n }\n }\n\n // Children\n for (const c of children) {\n const pre = cfg.prefixSource === 'provider' ? c.provider ?? c.ownerPath : c.ownerPath;\n const name = ensureMaxLen(`${pre}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), c.row.instance);\n }\n } else {\n // Prefix everyone by source\n for (const r of group) {\n const pre = cfg.prefixSource === 'provider' ? r.provider ?? r.ownerPath : r.ownerPath;\n const name = ensureMaxLen(`${pre}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), r.row.instance);\n }\n }\n }\n\n return [...out.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([name, instance]) => ({ name, instance }));\n\n function disambiguate(candidate: string, pool: Map<string, any>, cfg: Required<ResourceExportOptions>): string {\n if (!pool.has(candidate)) return candidate;\n const maxAttempts = 10000;\n let n = 2;\n while (n <= maxAttempts) {\n const withN = ensureMaxLen(`${candidate}${sepFor(cfg.case)}${n}`, cfg.maxLen);\n if (!pool.has(withN)) return withN;\n n++;\n }\n throw new Error(`Failed to disambiguate name \"${candidate}\" after ${maxAttempts} attempts`);\n }\n }\n\n /** Lookup by the exported (resolved) name. */\n getExported(name: string, opts?: ResourceExportOptions): ResourceInstance | undefined {\n const pairs = this.exportResolvedNames(opts);\n return pairs.find((p) => p.name === name)?.instance;\n }\n\n /* -------------------- Subscriptions -------------------- */\n\n subscribe(\n opts: { immediate?: boolean; filter?: (i: ResourceInstance) => boolean },\n cb: (evt: ResourceChangeEvent) => void,\n ): () => void {\n const filter = opts.filter ?? (() => true);\n if (opts.immediate) {\n cb({\n kind: 'reset',\n changeScope: 'global',\n version: this.version,\n snapshot: this.listAllInstances().filter(filter),\n });\n }\n return this.emitter.on((e) => cb({ ...e, snapshot: this.listAllInstances().filter(filter) }));\n }\n\n private bump(kind: ResourceChangeEvent['kind']) {\n const version = ++this.version;\n this.emitter.emit({ kind, changeScope: 'global', version, snapshot: this.listAllInstances() });\n }\n\n /* -------------------- Helpers -------------------- */\n\n /** Build an IndexedResource row */\n private makeRow(\n token: Token,\n instance: ResourceInstance,\n lineage: EntryLineage,\n source: ResourceRegistry,\n ): IndexedResource {\n const ownerKey = ownerKeyOf(lineage);\n const baseName = instance.name;\n const qualifiedName = qualifiedNameOf(lineage, baseName);\n const qualifiedId = `${ownerKey}:${tokenName(token)}`;\n return {\n token,\n instance,\n baseName,\n uri: instance.uri,\n uriTemplate: instance.uriTemplate,\n isTemplate: instance.isTemplate,\n lineage,\n ownerKey,\n qualifiedName,\n qualifiedId,\n source,\n };\n }\n\n /** Clone a child row and prepend lineage (with adjacent de-dup to avoid double prefixes). */\n private relineage(row: IndexedResource, prepend: EntryLineage): IndexedResource {\n const merged = [...prepend, ...row.lineage];\n const lineage = dedupLineage(merged);\n\n const ownerKey = ownerKeyOf(lineage);\n const qualifiedName = qualifiedNameOf(lineage, row.baseName);\n const qualifiedId = `${ownerKey}:${tokenName(row.token)}`;\n return {\n token: row.token,\n instance: row.instance, // REFERENCE the same instance\n baseName: row.baseName,\n uri: row.uri,\n uriTemplate: row.uriTemplate,\n isTemplate: row.isTemplate,\n lineage,\n ownerKey,\n qualifiedName,\n qualifiedId,\n source: row.source, // keep original source (who constructed instance)\n };\n }\n\n /** Best-effort provider id used for prefixing. */\n private providerIdOf(inst: ResourceInstance): string | undefined {\n try {\n const meta: unknown = inst.getMetadata?.();\n if (!meta || typeof meta !== 'object') return undefined;\n\n const metaObj = meta as Record<string, unknown>;\n const maybe = metaObj['providerId'] ?? metaObj['provider'] ?? metaObj['ownerId'];\n if (typeof maybe === 'string' && maybe.length > 0) return maybe;\n\n const cls = metaObj['cls'];\n if (cls && typeof cls === 'function') {\n const id = getMetadata('id', cls);\n if (typeof id === 'string' && id.length > 0) return id;\n if ('name' in cls && typeof cls.name === 'string') return cls.name;\n }\n } catch {\n /* ignore */\n }\n return undefined;\n }\n\n /** True if this registry (or adopted children) has any resources. */\n hasAny(): boolean {\n return this.listAllIndexed().length > 0 || this.tokens.size > 0;\n }\n\n /**\n * Get the MCP capabilities for resources.\n * These are reported to clients during initialization.\n */\n getCapabilities(): Partial<ServerCapabilities> {\n return this.hasAny()\n ? {\n resources: {\n // Subscription support per MCP 2025-11-25 spec\n subscribe: true,\n // List change notifications are only supported when resources are registered\n listChanged: true,\n },\n }\n : {};\n }\n\n /**\n * Dynamically register a resource or resource template at runtime.\n *\n * Used for system resources like the ui:// template that should be\n * registered when tools with UI configs exist.\n *\n * @param resourceDef - Resource class, function, or template to register\n */\n registerDynamicResource(resourceDef: ResourceType): void {\n const isTemplate = isResourceTemplate(resourceDef);\n const rec = isTemplate ? normalizeResourceTemplate(resourceDef) : normalizeResource(resourceDef);\n const token = rec.provide;\n\n // Skip if already registered\n if (this.tokens.has(token)) {\n return;\n }\n\n // Add to registry structures\n this.tokens.add(token);\n this.defs.set(token, rec);\n\n // Build dependency graph (same pattern as buildGraph)\n const deps = resourceDiscoveryDeps(rec);\n const depSet = new Set<Token>();\n for (const d of deps) {\n // Validate against hierarchical providers; throws early if missing\n this.providers.get(d);\n depSet.add(d);\n }\n this.graph.set(token, depSet);\n\n // Create instance\n const ri = new ResourceInstance(rec, this.providers, this.owner);\n this.instances.set(token as Token<ResourceInstance>, ri);\n\n // Add to local rows with lineage\n const lineage: EntryLineage = this.owner ? [this.owner] : [];\n const row = this.makeRow(token, ri, lineage, this);\n this.localRows.push(row);\n\n // Rebuild indexes and emit change event\n this.reindex();\n this.bump('reset');\n }\n}\n\n/* -------------------- lineage utility -------------------- */\n\n/** Remove only adjacent duplicates like [adapter:x, adapter:x] → [adapter:x] */\nfunction dedupLineage(l: EntryLineage): EntryLineage {\n const out: EntryLineage = [];\n for (const o of l) {\n const last = out[out.length - 1];\n if (!last || last.kind !== o.kind || last.id !== o.id) out.push(o);\n }\n return out;\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EntryLineage, Token, Type, FuncType } from '../common';
|
|
2
|
+
import { ResourceInstance } from './resource.instance';
|
|
3
|
+
import ResourceRegistry from './resource.registry';
|
|
4
|
+
import type { NameCase } from '../utils/naming.utils';
|
|
5
|
+
export interface ResourceTemplateInterface<In = any, Out = any> {
|
|
6
|
+
execute(uri: string, params: Record<string, string>, context: any): Promise<Out>;
|
|
7
|
+
}
|
|
8
|
+
export type ResourceTemplateType<In = any, Out = any> = Type<ResourceTemplateInterface<In, Out>> | FuncType<ResourceTemplateInterface<In, Out>>;
|
|
9
|
+
/** Internal augmented row: instance + provenance + token */
|
|
10
|
+
export type IndexedResource = {
|
|
11
|
+
token: Token;
|
|
12
|
+
instance: ResourceInstance;
|
|
13
|
+
/** base resource name from metadata (unmodified) */
|
|
14
|
+
baseName: string;
|
|
15
|
+
/** URI for static resources */
|
|
16
|
+
uri?: string;
|
|
17
|
+
/** URI template for template resources */
|
|
18
|
+
uriTemplate?: string;
|
|
19
|
+
/** Whether this is a template resource */
|
|
20
|
+
isTemplate: boolean;
|
|
21
|
+
/** lineage & qualified info */
|
|
22
|
+
lineage: EntryLineage;
|
|
23
|
+
ownerKey: string;
|
|
24
|
+
qualifiedName: string;
|
|
25
|
+
qualifiedId: string;
|
|
26
|
+
/** which registry constructed the instance (the "owner" registry) */
|
|
27
|
+
source: ResourceRegistry;
|
|
28
|
+
};
|
|
29
|
+
export type ResourceExportOptions = {
|
|
30
|
+
case?: NameCase;
|
|
31
|
+
maxLen?: number;
|
|
32
|
+
prefixChildrenOnConflict?: boolean;
|
|
33
|
+
prefixSource?: 'provider' | 'owner';
|
|
34
|
+
};
|
|
35
|
+
export declare const DEFAULT_RESOURCE_EXPORT_OPTS: Required<ResourceExportOptions>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// file: libs/sdk/src/resource/resource.types.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DEFAULT_RESOURCE_EXPORT_OPTS = void 0;
|
|
5
|
+
exports.DEFAULT_RESOURCE_EXPORT_OPTS = {
|
|
6
|
+
case: 'snake',
|
|
7
|
+
maxLen: 64,
|
|
8
|
+
prefixChildrenOnConflict: true,
|
|
9
|
+
prefixSource: 'provider',
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=resource.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.types.js","sourceRoot":"","sources":["../../../src/resource/resource.types.ts"],"names":[],"mappings":";AAAA,gDAAgD;;;AAuDnC,QAAA,4BAA4B,GAAoC;IAC3E,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,EAAE;IACV,wBAAwB,EAAE,IAAI;IAC9B,YAAY,EAAE,UAAU;CACzB,CAAC","sourcesContent":["// file: libs/sdk/src/resource/resource.types.ts\n\nimport { EntryLineage, Token, Type, FuncType } from '../common';\nimport { ResourceInstance } from './resource.instance';\nimport ResourceRegistry from './resource.registry';\nimport type { NameCase } from '../utils/naming.utils';\n\n// ============================================================================\n// Resource Template Type (interface equivalent)\n// ============================================================================\n\nexport interface ResourceTemplateInterface<In = any, Out = any> {\n execute(uri: string, params: Record<string, string>, context: any): Promise<Out>;\n}\n\nexport type ResourceTemplateType<In = any, Out = any> =\n | Type<ResourceTemplateInterface<In, Out>>\n | FuncType<ResourceTemplateInterface<In, Out>>;\n\n// ============================================================================\n// Indexed Resource (for registry internal use)\n// ============================================================================\n\n/** Internal augmented row: instance + provenance + token */\nexport type IndexedResource = {\n token: Token;\n instance: ResourceInstance;\n /** base resource name from metadata (unmodified) */\n baseName: string;\n /** URI for static resources */\n uri?: string;\n /** URI template for template resources */\n uriTemplate?: string;\n /** Whether this is a template resource */\n isTemplate: boolean;\n /** lineage & qualified info */\n lineage: EntryLineage;\n ownerKey: string; // \"app:Portal/plugin:Okta\"\n qualifiedName: string; // \"app:Portal/plugin:Okta:resourceName\"\n qualifiedId: string; // \"app:Portal/plugin:Okta:tokenName(<token>)\"\n /** which registry constructed the instance (the \"owner\" registry) */\n source: ResourceRegistry;\n};\n\n// ============================================================================\n// Export Name Options\n// ============================================================================\n\nexport type ResourceExportOptions = {\n case?: NameCase; // default 'snake'\n maxLen?: number; // default 64\n prefixChildrenOnConflict?: boolean; // default true\n prefixSource?: 'provider' | 'owner'; // default 'provider'\n};\n\nexport const DEFAULT_RESOURCE_EXPORT_OPTS: Required<ResourceExportOptions> = {\n case: 'snake',\n maxLen: 64,\n prefixChildrenOnConflict: true,\n prefixSource: 'provider',\n};\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ResourceMetadata, ResourceTemplateMetadata, ResourceType, Token, ResourceRecord, ResourceTemplateRecord } from '../common';
|
|
2
|
+
import { ResourceTemplateType } from './resource.types';
|
|
3
|
+
export { splitWords, toCase, sepFor, normalizeSegment, normalizeProviderId, normalizeOwnerPath, shortHash, ensureMaxLen, } from '../utils/naming.utils';
|
|
4
|
+
export { ownerKeyOf, qualifiedNameOf } from '../utils/lineage.utils';
|
|
5
|
+
export { parseUriTemplate, matchUriTemplate, expandUriTemplate, extractTemplateParams, isUriTemplate, } from '../utils/uri-template.utils';
|
|
6
|
+
export { buildResourceContent as buildParsedResourceResult } from '../utils/content.utils';
|
|
7
|
+
/**
|
|
8
|
+
* Collect metadata from a class decorated with @FrontMcpResource
|
|
9
|
+
*/
|
|
10
|
+
export declare function collectResourceMetadata(cls: ResourceType): ResourceMetadata;
|
|
11
|
+
/**
|
|
12
|
+
* Collect metadata from a class decorated with @FrontMcpResourceTemplate
|
|
13
|
+
*/
|
|
14
|
+
export declare function collectResourceTemplateMetadata(cls: ResourceTemplateType): ResourceTemplateMetadata;
|
|
15
|
+
/**
|
|
16
|
+
* Normalize any resource input (class or function) to a ResourceRecord
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizeResource(item: any): ResourceRecord;
|
|
19
|
+
/**
|
|
20
|
+
* Normalize any resource template input (class or function) to a ResourceTemplateRecord
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeResourceTemplate(item: any): ResourceTemplateRecord;
|
|
23
|
+
/**
|
|
24
|
+
* Determine if an item is a resource template (vs static resource)
|
|
25
|
+
*/
|
|
26
|
+
export declare function isResourceTemplate(item: any): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get dependency tokens for graph/cycle detection
|
|
29
|
+
*/
|
|
30
|
+
export declare function resourceDiscoveryDeps(rec: ResourceRecord | ResourceTemplateRecord): Token[];
|