@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
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// file: libs/sdk/src/prompt/prompt.instance.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PromptInstance = void 0;
|
|
5
|
+
const common_1 = require("../common");
|
|
6
|
+
const hooks_utils_1 = require("../hooks/hooks.utils");
|
|
7
|
+
const prompt_utils_1 = require("./prompt.utils");
|
|
8
|
+
class PromptInstance extends common_1.PromptEntry {
|
|
9
|
+
providers;
|
|
10
|
+
scope;
|
|
11
|
+
hooks;
|
|
12
|
+
constructor(record, providers, owner) {
|
|
13
|
+
super(record);
|
|
14
|
+
this.owner = owner;
|
|
15
|
+
this.providers = providers;
|
|
16
|
+
this.name = record.metadata.name;
|
|
17
|
+
this.fullName = this.owner.id + ':' + this.name;
|
|
18
|
+
this.scope = this.providers.getActiveScope();
|
|
19
|
+
this.hooks = this.scope.providers.getHooksRegistry();
|
|
20
|
+
this.ready = this.initialize();
|
|
21
|
+
}
|
|
22
|
+
async initialize() {
|
|
23
|
+
// Register hooks for prompts:get-prompt, prompts:list-prompts flows
|
|
24
|
+
const hooks = (0, hooks_utils_1.normalizeHooksFromCls)(this.record.provide).filter((hook) => hook.metadata.flow === 'prompts:get-prompt' || hook.metadata.flow === 'prompts:list-prompts');
|
|
25
|
+
if (hooks.length > 0) {
|
|
26
|
+
await this.hooks.registerHooks(true, ...hooks);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
getMetadata() {
|
|
30
|
+
return this.record.metadata;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a prompt context (class or function wrapper).
|
|
34
|
+
*/
|
|
35
|
+
create(args, ctx) {
|
|
36
|
+
const metadata = this.metadata;
|
|
37
|
+
const providers = this.providers;
|
|
38
|
+
const scope = this.providers.getActiveScope();
|
|
39
|
+
const logger = scope.logger;
|
|
40
|
+
const authInfo = ctx.authInfo;
|
|
41
|
+
const promptCtorArgs = {
|
|
42
|
+
metadata,
|
|
43
|
+
args,
|
|
44
|
+
providers,
|
|
45
|
+
logger,
|
|
46
|
+
authInfo,
|
|
47
|
+
};
|
|
48
|
+
const record = this.record;
|
|
49
|
+
switch (record.kind) {
|
|
50
|
+
case common_1.PromptKind.CLASS_TOKEN:
|
|
51
|
+
return new record.provide(promptCtorArgs);
|
|
52
|
+
case common_1.PromptKind.FUNCTION:
|
|
53
|
+
return new FunctionPromptContext(record, promptCtorArgs);
|
|
54
|
+
default:
|
|
55
|
+
// Exhaustive check: TypeScript will error if a new PromptKind is added but not handled
|
|
56
|
+
// The assertion below catches runtime cases that TypeScript can't detect
|
|
57
|
+
throw new Error(`Unhandled prompt kind: ${record.kind}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parse and validate arguments against the prompt's argument definitions.
|
|
62
|
+
* @param args Arguments from the MCP request
|
|
63
|
+
* @returns Validated arguments
|
|
64
|
+
*/
|
|
65
|
+
parseArguments(args) {
|
|
66
|
+
const argDefs = this.metadata.arguments ?? [];
|
|
67
|
+
const result = {};
|
|
68
|
+
// Check required arguments
|
|
69
|
+
for (const argDef of argDefs) {
|
|
70
|
+
const value = args?.[argDef.name];
|
|
71
|
+
if (argDef.required && (value === undefined || value === null)) {
|
|
72
|
+
throw new Error(`Missing required argument: ${argDef.name}`);
|
|
73
|
+
}
|
|
74
|
+
if (value !== undefined) {
|
|
75
|
+
result[argDef.name] = value;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Include any additional arguments not in the definition
|
|
79
|
+
if (args) {
|
|
80
|
+
for (const [key, value] of Object.entries(args)) {
|
|
81
|
+
if (!(key in result)) {
|
|
82
|
+
result[key] = value;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convert the raw prompt return value into an MCP GetPromptResult.
|
|
90
|
+
*/
|
|
91
|
+
parseOutput(raw) {
|
|
92
|
+
return (0, prompt_utils_1.buildParsedPromptResult)(raw, this.metadata);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Safe version of parseOutput that returns success/error instead of throwing.
|
|
96
|
+
*/
|
|
97
|
+
safeParseOutput(raw) {
|
|
98
|
+
try {
|
|
99
|
+
return { success: true, data: this.parseOutput(raw) };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return { success: false, error: error instanceof Error ? error : new Error(String(error)) };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.PromptInstance = PromptInstance;
|
|
107
|
+
/**
|
|
108
|
+
* Prompt context for function-decorated prompts.
|
|
109
|
+
*/
|
|
110
|
+
class FunctionPromptContext extends common_1.PromptContext {
|
|
111
|
+
record;
|
|
112
|
+
constructor(record, args) {
|
|
113
|
+
super(args);
|
|
114
|
+
this.record = record;
|
|
115
|
+
}
|
|
116
|
+
execute(args) {
|
|
117
|
+
return this.record.provide(args, this);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=prompt.instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.instance.js","sourceRoot":"","sources":["../../../src/prompt/prompt.instance.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/sdk/src/prompt/prompt.instance.ts\n\nimport {\n EntryOwnerRef,\n PromptEntry,\n PromptGetExtra,\n ParsedPromptResult,\n PromptSafeTransformResult,\n PromptRecord,\n PromptKind,\n PromptContext,\n PromptCtorArgs,\n PromptMetadata,\n PromptFunctionTokenRecord,\n} from '../common';\nimport ProviderRegistry from '../provider/provider.registry';\nimport HookRegistry from '../hooks/hook.registry';\nimport { Scope } from '../scope';\nimport { normalizeHooksFromCls } from '../hooks/hooks.utils';\nimport { buildParsedPromptResult } from './prompt.utils';\nimport { GetPromptResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport class PromptInstance extends PromptEntry {\n private readonly providers: ProviderRegistry;\n readonly scope: Scope;\n readonly hooks: HookRegistry;\n\n constructor(record: PromptRecord, providers: ProviderRegistry, owner: EntryOwnerRef) {\n super(record);\n this.owner = owner;\n this.providers = providers;\n this.name = record.metadata.name;\n this.fullName = this.owner.id + ':' + this.name;\n this.scope = this.providers.getActiveScope();\n this.hooks = this.scope.providers.getHooksRegistry();\n\n this.ready = this.initialize();\n }\n\n protected async initialize(): Promise<void> {\n // Register hooks for prompts:get-prompt, prompts:list-prompts flows\n const hooks = normalizeHooksFromCls(this.record.provide).filter(\n (hook) => hook.metadata.flow === 'prompts:get-prompt' || hook.metadata.flow === 'prompts:list-prompts',\n );\n if (hooks.length > 0) {\n await this.hooks.registerHooks(true, ...hooks);\n }\n }\n\n getMetadata(): PromptMetadata {\n return this.record.metadata;\n }\n\n /**\n * Create a prompt context (class or function wrapper).\n */\n override create(args: Record<string, string>, ctx: PromptGetExtra): PromptContext {\n const metadata = this.metadata;\n const providers = this.providers;\n const scope = this.providers.getActiveScope();\n const logger = scope.logger;\n const authInfo = ctx.authInfo;\n\n const promptCtorArgs: PromptCtorArgs = {\n metadata,\n args,\n providers,\n logger,\n authInfo,\n };\n\n const record = this.record;\n\n switch (record.kind) {\n case PromptKind.CLASS_TOKEN:\n return new (record.provide as unknown as new (args: PromptCtorArgs) => PromptContext)(promptCtorArgs);\n case PromptKind.FUNCTION:\n return new FunctionPromptContext(record as PromptFunctionTokenRecord, promptCtorArgs);\n default:\n // Exhaustive check: TypeScript will error if a new PromptKind is added but not handled\n // The assertion below catches runtime cases that TypeScript can't detect\n throw new Error(`Unhandled prompt kind: ${(record as { kind: string }).kind}`);\n }\n }\n\n /**\n * Parse and validate arguments against the prompt's argument definitions.\n * @param args Arguments from the MCP request\n * @returns Validated arguments\n */\n override parseArguments(args?: Record<string, string>): Record<string, string> {\n const argDefs = this.metadata.arguments ?? [];\n const result: Record<string, string> = {};\n\n // Check required arguments\n for (const argDef of argDefs) {\n const value = args?.[argDef.name];\n if (argDef.required && (value === undefined || value === null)) {\n throw new Error(`Missing required argument: ${argDef.name}`);\n }\n if (value !== undefined) {\n result[argDef.name] = value;\n }\n }\n\n // Include any additional arguments not in the definition\n if (args) {\n for (const [key, value] of Object.entries(args)) {\n if (!(key in result)) {\n result[key] = value;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Convert the raw prompt return value into an MCP GetPromptResult.\n */\n override parseOutput(raw: unknown): ParsedPromptResult {\n return buildParsedPromptResult(raw, this.metadata);\n }\n\n /**\n * Safe version of parseOutput that returns success/error instead of throwing.\n */\n override safeParseOutput(raw: unknown): PromptSafeTransformResult<ParsedPromptResult> {\n try {\n return { success: true, data: this.parseOutput(raw) };\n } catch (error: unknown) {\n return { success: false, error: error instanceof Error ? error : new Error(String(error)) };\n }\n }\n}\n\n/**\n * Prompt context for function-decorated prompts.\n */\nclass FunctionPromptContext extends PromptContext {\n constructor(private readonly record: PromptFunctionTokenRecord, args: PromptCtorArgs) {\n super(args);\n }\n\n execute(args: Record<string, string>): Promise<GetPromptResult> {\n return this.record.provide(args, this) as Promise<GetPromptResult>;\n }\n}\n"]}
|
|
@@ -1,16 +1,83 @@
|
|
|
1
|
+
import { EntryOwnerRef, PromptEntry, PromptRecord, PromptRegistryInterface, PromptType } from '../common';
|
|
2
|
+
import { PromptChangeEvent } from './prompt.events';
|
|
1
3
|
import ProviderRegistry from '../provider/provider.registry';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
import { RegistryAbstract, RegistryBuildMapResult } from '../regsitry';
|
|
5
|
+
import { PromptInstance } from './prompt.instance';
|
|
6
|
+
import { PromptExportOptions, IndexedPrompt } from './prompt.types';
|
|
7
|
+
import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
export default class PromptRegistry extends RegistryAbstract<PromptInstance, // instances map holds PromptInstance
|
|
9
|
+
PromptRecord, PromptType[]> implements PromptRegistryInterface {
|
|
10
|
+
/** Who owns this registry (used for provenance). */
|
|
11
|
+
owner: EntryOwnerRef;
|
|
12
|
+
/** Prompts truly owned/constructed by THIS registry (with lineage applied) */
|
|
13
|
+
private localRows;
|
|
14
|
+
/** Adopted prompt rows from each child registry (references to the same instances) */
|
|
15
|
+
private adopted;
|
|
16
|
+
/** Children registries that we track */
|
|
17
|
+
private children;
|
|
18
|
+
private byQualifiedId;
|
|
19
|
+
private byName;
|
|
20
|
+
private byOwnerAndName;
|
|
21
|
+
private byOwner;
|
|
22
|
+
private version;
|
|
23
|
+
private emitter;
|
|
24
|
+
constructor(providers: ProviderRegistry, list: PromptType[], owner: EntryOwnerRef);
|
|
25
|
+
protected buildMap(list: PromptType[]): RegistryBuildMapResult<PromptRecord>;
|
|
26
|
+
protected buildGraph(): void;
|
|
12
27
|
protected initialize(): Promise<void>;
|
|
13
|
-
|
|
14
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Adopt prompts from a child registry. Parent runs after children are ready.
|
|
30
|
+
* We *reference* the child's prompt instances; no duplicates are created.
|
|
31
|
+
*/
|
|
32
|
+
adoptFromChild(child: PromptRegistry, _childOwner: EntryOwnerRef): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get all prompts
|
|
35
|
+
*/
|
|
36
|
+
getPrompts(includeHidden?: boolean): PromptEntry[];
|
|
37
|
+
/**
|
|
38
|
+
* Get inline prompts (local only)
|
|
39
|
+
*/
|
|
15
40
|
getInlinePrompts(): PromptEntry[];
|
|
41
|
+
/**
|
|
42
|
+
* Find a prompt by exact name match
|
|
43
|
+
*/
|
|
44
|
+
findByName(name: string): PromptInstance | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Find all prompts matching a name
|
|
47
|
+
*/
|
|
48
|
+
findAllByName(name: string): PromptInstance[];
|
|
49
|
+
/** Internal snapshot of effective indexed rows (locals + adopted). */
|
|
50
|
+
listAllIndexed(): IndexedPrompt[];
|
|
51
|
+
/** List all instances (locals + adopted). */
|
|
52
|
+
listAllInstances(): readonly PromptInstance[];
|
|
53
|
+
/** List instances by owner path (e.g. "app:Portal/plugin:Okta") */
|
|
54
|
+
listByOwner(ownerPath: string): readonly PromptInstance[];
|
|
55
|
+
private reindex;
|
|
56
|
+
/**
|
|
57
|
+
* Produce unique, MCP-valid exported names.
|
|
58
|
+
*/
|
|
59
|
+
exportResolvedNames(opts?: PromptExportOptions): Array<{
|
|
60
|
+
name: string;
|
|
61
|
+
instance: PromptInstance;
|
|
62
|
+
}>;
|
|
63
|
+
/** Lookup by the exported (resolved) name. */
|
|
64
|
+
getExported(name: string, opts?: PromptExportOptions): PromptInstance | undefined;
|
|
65
|
+
subscribe(opts: {
|
|
66
|
+
immediate?: boolean;
|
|
67
|
+
filter?: (i: PromptInstance) => boolean;
|
|
68
|
+
}, cb: (evt: PromptChangeEvent) => void): () => void;
|
|
69
|
+
private bump;
|
|
70
|
+
/** Build an IndexedPrompt row */
|
|
71
|
+
private makeRow;
|
|
72
|
+
/** Clone a child row and prepend lineage (with adjacent de-dup to avoid double prefixes). */
|
|
73
|
+
private relineage;
|
|
74
|
+
/** Best-effort provider id used for prefixing. */
|
|
75
|
+
private providerIdOf;
|
|
76
|
+
/** True if this registry (or adopted children) has any prompts. */
|
|
77
|
+
hasAny(): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Get the MCP capabilities for prompts.
|
|
80
|
+
* These are reported to clients during initialization.
|
|
81
|
+
*/
|
|
82
|
+
getCapabilities(): Partial<ServerCapabilities>;
|
|
16
83
|
}
|
|
@@ -1,35 +1,380 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// file: libs/sdk/src/prompt/prompt.registry.ts
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const metadata_utils_1 = require("../utils/metadata.utils");
|
|
6
|
+
const prompt_events_1 = require("./prompt.events");
|
|
7
|
+
const prompt_utils_1 = require("./prompt.utils");
|
|
8
|
+
const token_utils_1 = require("../utils/token.utils");
|
|
3
9
|
const regsitry_1 = require("../regsitry");
|
|
10
|
+
const prompt_instance_1 = require("./prompt.instance");
|
|
11
|
+
const prompt_types_1 = require("./prompt.types");
|
|
12
|
+
const get_prompt_flow_1 = tslib_1.__importDefault(require("./flows/get-prompt.flow"));
|
|
13
|
+
const prompts_list_flow_1 = tslib_1.__importDefault(require("./flows/prompts-list.flow"));
|
|
14
|
+
/** Maximum attempts for name disambiguation to prevent infinite loops */
|
|
15
|
+
const MAX_DISAMBIGUATE_ATTEMPTS = 10000;
|
|
4
16
|
class PromptRegistry extends regsitry_1.RegistryAbstract {
|
|
5
|
-
|
|
6
|
-
|
|
17
|
+
/** Who owns this registry (used for provenance). */
|
|
18
|
+
owner;
|
|
19
|
+
/** Prompts truly owned/constructed by THIS registry (with lineage applied) */
|
|
20
|
+
localRows = [];
|
|
21
|
+
/** Adopted prompt 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
|
+
byOwnerAndName = new Map(); // "ownerKey:name" -> row
|
|
29
|
+
byOwner = new Map(); // ownerKey -> rows
|
|
30
|
+
// version + emitter
|
|
31
|
+
version = 0;
|
|
32
|
+
emitter = new prompt_events_1.PromptEmitter();
|
|
33
|
+
constructor(providers, list, owner) {
|
|
34
|
+
// disable auto so subclass fields initialize first
|
|
35
|
+
super('PromptRegistry', providers, list, false);
|
|
36
|
+
this.owner = owner;
|
|
37
|
+
// now it's safe to run the lifecycle
|
|
38
|
+
this.buildGraph();
|
|
39
|
+
this.ready = this.initialize();
|
|
7
40
|
}
|
|
41
|
+
/* -------------------- Build-time: defs + dep checks -------------------- */
|
|
8
42
|
buildMap(list) {
|
|
9
43
|
const tokens = new Set();
|
|
10
44
|
const defs = new Map();
|
|
11
45
|
const graph = new Map();
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
46
|
+
for (const raw of list) {
|
|
47
|
+
const rec = (0, prompt_utils_1.normalizePrompt)(raw);
|
|
48
|
+
const provide = rec.provide;
|
|
49
|
+
tokens.add(provide);
|
|
50
|
+
defs.set(provide, rec);
|
|
51
|
+
graph.set(provide, new Set());
|
|
52
|
+
}
|
|
53
|
+
return { tokens, defs, graph };
|
|
17
54
|
}
|
|
18
55
|
buildGraph() {
|
|
19
|
-
|
|
56
|
+
for (const token of this.tokens) {
|
|
57
|
+
const rec = this.defs.get(token);
|
|
58
|
+
const deps = (0, prompt_utils_1.promptDiscoveryDeps)(rec);
|
|
59
|
+
for (const d of deps) {
|
|
60
|
+
// Validate against hierarchical providers; throws early if missing
|
|
61
|
+
this.providers.get(d);
|
|
62
|
+
this.graph.get(token).add(d);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
20
65
|
}
|
|
21
|
-
|
|
22
|
-
|
|
66
|
+
/* -------------------- Initialize: create ONE PromptInstance per local prompt -------------------- */
|
|
67
|
+
async initialize() {
|
|
68
|
+
// Instantiate each local prompt once and store in this.instances
|
|
69
|
+
for (const token of this.tokens) {
|
|
70
|
+
const rec = this.defs.get(token);
|
|
71
|
+
// Single, authoritative instance per local prompt
|
|
72
|
+
const pi = new prompt_instance_1.PromptInstance(rec, this.providers, this.owner);
|
|
73
|
+
this.instances.set(token, pi);
|
|
74
|
+
const lineage = this.owner ? [this.owner] : [];
|
|
75
|
+
const row = this.makeRow(token, pi, lineage, this);
|
|
76
|
+
this.localRows.push(row);
|
|
77
|
+
}
|
|
78
|
+
// Adopt prompts from child app registries
|
|
79
|
+
const childAppRegistries = this.providers.getRegistries('AppRegistry');
|
|
80
|
+
childAppRegistries.forEach((appRegistry) => {
|
|
81
|
+
const apps = appRegistry.getApps();
|
|
82
|
+
for (const app of apps) {
|
|
83
|
+
const appPromptRegistries = app.providers.getRegistries('PromptRegistry');
|
|
84
|
+
appPromptRegistries
|
|
85
|
+
.filter((r) => r.owner.kind === 'app')
|
|
86
|
+
.forEach((appPromptRegistry) => {
|
|
87
|
+
this.adoptFromChild(appPromptRegistry, appPromptRegistry.owner);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
// Adopt prompts from other child prompt registries
|
|
92
|
+
const childPromptRegistries = this.providers.getRegistries('PromptRegistry');
|
|
93
|
+
childPromptRegistries
|
|
94
|
+
.filter((r) => r !== this)
|
|
95
|
+
.forEach((promptRegistry) => {
|
|
96
|
+
this.adoptFromChild(promptRegistry, promptRegistry.owner);
|
|
97
|
+
});
|
|
98
|
+
// Build effective indexes from (locals + already adopted children)
|
|
99
|
+
this.reindex();
|
|
100
|
+
this.bump('reset');
|
|
101
|
+
// Register prompt flows with the scope
|
|
102
|
+
const scope = this.providers.getActiveScope();
|
|
103
|
+
await scope.registryFlows(get_prompt_flow_1.default, prompts_list_flow_1.default);
|
|
23
104
|
}
|
|
24
|
-
|
|
25
|
-
|
|
105
|
+
/* -------------------- Adoption: reference child instances (no cloning) -------------------- */
|
|
106
|
+
/**
|
|
107
|
+
* Adopt prompts from a child registry. Parent runs after children are ready.
|
|
108
|
+
* We *reference* the child's prompt instances; no duplicates are created.
|
|
109
|
+
*/
|
|
110
|
+
adoptFromChild(child, _childOwner) {
|
|
111
|
+
if (this.children.has(child))
|
|
112
|
+
return;
|
|
113
|
+
const childRows = child.listAllIndexed();
|
|
114
|
+
const prepend = this.owner ? [this.owner] : [];
|
|
115
|
+
const adoptedRows = childRows.map((r) => this.relineage(r, prepend));
|
|
116
|
+
this.adopted.set(child, adoptedRows);
|
|
117
|
+
this.children.add(child);
|
|
118
|
+
// keep live if child changes
|
|
119
|
+
child.subscribe({ immediate: false }, () => {
|
|
120
|
+
const latest = child.listAllIndexed().map((r) => this.relineage(r, prepend));
|
|
121
|
+
this.adopted.set(child, latest);
|
|
122
|
+
this.reindex();
|
|
123
|
+
this.bump('reset');
|
|
124
|
+
});
|
|
125
|
+
this.reindex();
|
|
126
|
+
this.bump('reset');
|
|
26
127
|
}
|
|
27
|
-
|
|
28
|
-
|
|
128
|
+
/* -------------------- Public API -------------------- */
|
|
129
|
+
/**
|
|
130
|
+
* Get all prompts
|
|
131
|
+
*/
|
|
132
|
+
getPrompts(includeHidden = false) {
|
|
133
|
+
const all = this.listAllIndexed();
|
|
134
|
+
return all
|
|
135
|
+
.filter((r) => {
|
|
136
|
+
const meta = r.instance.metadata;
|
|
137
|
+
const hidden = 'hideFromDiscovery' in meta && meta.hideFromDiscovery === true;
|
|
138
|
+
return !hidden || includeHidden;
|
|
139
|
+
})
|
|
140
|
+
.map((r) => r.instance);
|
|
29
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Get inline prompts (local only)
|
|
144
|
+
*/
|
|
30
145
|
getInlinePrompts() {
|
|
31
|
-
return [];
|
|
146
|
+
return [...this.instances.values()];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Find a prompt by exact name match
|
|
150
|
+
*/
|
|
151
|
+
findByName(name) {
|
|
152
|
+
const rows = this.byName.get(name);
|
|
153
|
+
return rows?.[0]?.instance;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Find all prompts matching a name
|
|
157
|
+
*/
|
|
158
|
+
findAllByName(name) {
|
|
159
|
+
const rows = this.byName.get(name) ?? [];
|
|
160
|
+
return rows.map((r) => r.instance);
|
|
161
|
+
}
|
|
162
|
+
/** Internal snapshot of effective indexed rows (locals + adopted). */
|
|
163
|
+
listAllIndexed() {
|
|
164
|
+
return [...this.localRows, ...[...this.adopted.values()].flat()];
|
|
165
|
+
}
|
|
166
|
+
/** List all instances (locals + adopted). */
|
|
167
|
+
listAllInstances() {
|
|
168
|
+
return this.listAllIndexed().map((r) => r.instance);
|
|
169
|
+
}
|
|
170
|
+
/** List instances by owner path (e.g. "app:Portal/plugin:Okta") */
|
|
171
|
+
listByOwner(ownerPath) {
|
|
172
|
+
return (this.byOwner.get(ownerPath) ?? []).map((r) => r.instance);
|
|
173
|
+
}
|
|
174
|
+
/* -------------------- Indexing & lookups -------------------- */
|
|
175
|
+
reindex() {
|
|
176
|
+
const effective = this.listAllIndexed();
|
|
177
|
+
this.byQualifiedId.clear();
|
|
178
|
+
this.byName.clear();
|
|
179
|
+
this.byOwnerAndName.clear();
|
|
180
|
+
this.byOwner.clear();
|
|
181
|
+
for (const r of effective) {
|
|
182
|
+
this.byQualifiedId.set(r.qualifiedId, r);
|
|
183
|
+
const listByName = this.byName.get(r.baseName) ?? [];
|
|
184
|
+
listByName.push(r);
|
|
185
|
+
this.byName.set(r.baseName, listByName);
|
|
186
|
+
const byOwnerKey = this.byOwner.get(r.ownerKey) ?? [];
|
|
187
|
+
byOwnerKey.push(r);
|
|
188
|
+
this.byOwner.set(r.ownerKey, byOwnerKey);
|
|
189
|
+
const on = `${r.ownerKey}:${r.baseName}`;
|
|
190
|
+
if (!this.byOwnerAndName.has(on))
|
|
191
|
+
this.byOwnerAndName.set(on, r);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/* -------------------- Conflict-aware exported names -------------------- */
|
|
195
|
+
/**
|
|
196
|
+
* Produce unique, MCP-valid exported names.
|
|
197
|
+
*/
|
|
198
|
+
exportResolvedNames(opts) {
|
|
199
|
+
const cfg = { ...prompt_types_1.DEFAULT_PROMPT_EXPORT_OPTS, ...(opts ?? {}) };
|
|
200
|
+
const rows = this.listAllIndexed().map((r) => {
|
|
201
|
+
const base = (0, prompt_utils_1.normalizeSegment)(r.baseName, cfg.case);
|
|
202
|
+
const isLocal = r.source === this;
|
|
203
|
+
const provider = (0, prompt_utils_1.normalizeProviderId)(this.providerIdOf(r.instance), cfg.case);
|
|
204
|
+
const ownerPath = (0, prompt_utils_1.normalizeOwnerPath)(r.ownerKey, cfg.case);
|
|
205
|
+
return { base, row: r, isLocal, provider, ownerPath };
|
|
206
|
+
});
|
|
207
|
+
// group by standardized base
|
|
208
|
+
const byBase = new Map();
|
|
209
|
+
for (const r of rows) {
|
|
210
|
+
const list = byBase.get(r.base) ?? [];
|
|
211
|
+
list.push(r);
|
|
212
|
+
byBase.set(r.base, list);
|
|
213
|
+
}
|
|
214
|
+
const out = new Map();
|
|
215
|
+
for (const [base, group] of byBase.entries()) {
|
|
216
|
+
if (group.length === 1) {
|
|
217
|
+
const g = group[0];
|
|
218
|
+
out.set((0, prompt_utils_1.ensureMaxLen)(base, cfg.maxLen), g.row.instance);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const locals = group.filter((g) => g.isLocal);
|
|
222
|
+
const children = group.filter((g) => !g.isLocal);
|
|
223
|
+
if (cfg.prefixChildrenOnConflict && locals.length > 0) {
|
|
224
|
+
// Locals
|
|
225
|
+
if (locals.length === 1) {
|
|
226
|
+
const localName = (0, prompt_utils_1.ensureMaxLen)(base, cfg.maxLen);
|
|
227
|
+
out.set(disambiguate(localName, out, cfg), locals[0].row.instance);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
for (const l of locals) {
|
|
231
|
+
const pref = (0, prompt_utils_1.normalizeOwnerPath)(l.ownerPath, cfg.case);
|
|
232
|
+
const name = (0, prompt_utils_1.ensureMaxLen)(`${pref}${(0, prompt_utils_1.sepFor)(cfg.case)}${base}`, cfg.maxLen);
|
|
233
|
+
out.set(disambiguate(name, out, cfg), l.row.instance);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Children
|
|
237
|
+
for (const c of children) {
|
|
238
|
+
const pre = cfg.prefixSource === 'provider' ? c.provider ?? c.ownerPath : c.ownerPath;
|
|
239
|
+
const name = (0, prompt_utils_1.ensureMaxLen)(`${pre}${(0, prompt_utils_1.sepFor)(cfg.case)}${base}`, cfg.maxLen);
|
|
240
|
+
out.set(disambiguate(name, out, cfg), c.row.instance);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
// Prefix everyone by source
|
|
245
|
+
for (const r of group) {
|
|
246
|
+
const pre = cfg.prefixSource === 'provider' ? r.provider ?? r.ownerPath : r.ownerPath;
|
|
247
|
+
const name = (0, prompt_utils_1.ensureMaxLen)(`${pre}${(0, prompt_utils_1.sepFor)(cfg.case)}${base}`, cfg.maxLen);
|
|
248
|
+
out.set(disambiguate(name, out, cfg), r.row.instance);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return [...out.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([name, instance]) => ({ name, instance }));
|
|
253
|
+
function disambiguate(candidate, pool, cfg) {
|
|
254
|
+
if (!pool.has(candidate))
|
|
255
|
+
return candidate;
|
|
256
|
+
let n = 2;
|
|
257
|
+
while (n <= MAX_DISAMBIGUATE_ATTEMPTS) {
|
|
258
|
+
const withN = (0, prompt_utils_1.ensureMaxLen)(`${candidate}${(0, prompt_utils_1.sepFor)(cfg.case)}${n}`, cfg.maxLen);
|
|
259
|
+
if (!pool.has(withN))
|
|
260
|
+
return withN;
|
|
261
|
+
n++;
|
|
262
|
+
}
|
|
263
|
+
throw new Error(`Failed to disambiguate name "${candidate}" after ${MAX_DISAMBIGUATE_ATTEMPTS} attempts`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/** Lookup by the exported (resolved) name. */
|
|
267
|
+
getExported(name, opts) {
|
|
268
|
+
const pairs = this.exportResolvedNames(opts);
|
|
269
|
+
return pairs.find((p) => p.name === name)?.instance;
|
|
270
|
+
}
|
|
271
|
+
/* -------------------- Subscriptions -------------------- */
|
|
272
|
+
subscribe(opts, cb) {
|
|
273
|
+
const filter = opts.filter ?? (() => true);
|
|
274
|
+
if (opts.immediate) {
|
|
275
|
+
cb({
|
|
276
|
+
kind: 'reset',
|
|
277
|
+
changeScope: 'global',
|
|
278
|
+
version: this.version,
|
|
279
|
+
snapshot: this.listAllInstances().filter(filter),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return this.emitter.on((e) => cb({ ...e, snapshot: this.listAllInstances().filter(filter) }));
|
|
283
|
+
}
|
|
284
|
+
bump(kind) {
|
|
285
|
+
const version = ++this.version;
|
|
286
|
+
this.emitter.emit({ kind, changeScope: 'global', version, snapshot: this.listAllInstances() });
|
|
287
|
+
}
|
|
288
|
+
/* -------------------- Helpers -------------------- */
|
|
289
|
+
/** Build an IndexedPrompt row */
|
|
290
|
+
makeRow(token, instance, lineage, source) {
|
|
291
|
+
const ownerKey = (0, prompt_utils_1.ownerKeyOf)(lineage);
|
|
292
|
+
const baseName = instance.name;
|
|
293
|
+
const qualifiedName = (0, prompt_utils_1.qualifiedNameOf)(lineage, baseName);
|
|
294
|
+
const qualifiedId = `${ownerKey}:${(0, token_utils_1.tokenName)(token)}`;
|
|
295
|
+
return {
|
|
296
|
+
token,
|
|
297
|
+
instance,
|
|
298
|
+
baseName,
|
|
299
|
+
lineage,
|
|
300
|
+
ownerKey,
|
|
301
|
+
qualifiedName,
|
|
302
|
+
qualifiedId,
|
|
303
|
+
source,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
/** Clone a child row and prepend lineage (with adjacent de-dup to avoid double prefixes). */
|
|
307
|
+
relineage(row, prepend) {
|
|
308
|
+
const merged = [...prepend, ...row.lineage];
|
|
309
|
+
const lineage = dedupLineage(merged);
|
|
310
|
+
const ownerKey = (0, prompt_utils_1.ownerKeyOf)(lineage);
|
|
311
|
+
const qualifiedName = (0, prompt_utils_1.qualifiedNameOf)(lineage, row.baseName);
|
|
312
|
+
const qualifiedId = `${ownerKey}:${(0, token_utils_1.tokenName)(row.token)}`;
|
|
313
|
+
return {
|
|
314
|
+
token: row.token,
|
|
315
|
+
instance: row.instance, // REFERENCE the same instance
|
|
316
|
+
baseName: row.baseName,
|
|
317
|
+
lineage,
|
|
318
|
+
ownerKey,
|
|
319
|
+
qualifiedName,
|
|
320
|
+
qualifiedId,
|
|
321
|
+
source: row.source, // keep original source (who constructed instance)
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/** Best-effort provider id used for prefixing. */
|
|
325
|
+
providerIdOf(inst) {
|
|
326
|
+
try {
|
|
327
|
+
const meta = inst.getMetadata?.();
|
|
328
|
+
if (!meta || typeof meta !== 'object')
|
|
329
|
+
return undefined;
|
|
330
|
+
const metaObj = meta;
|
|
331
|
+
const maybe = metaObj['providerId'] ?? metaObj['provider'] ?? metaObj['ownerId'];
|
|
332
|
+
if (typeof maybe === 'string' && maybe.length > 0)
|
|
333
|
+
return maybe;
|
|
334
|
+
const cls = metaObj['cls'];
|
|
335
|
+
if (cls && typeof cls === 'function') {
|
|
336
|
+
const id = (0, metadata_utils_1.getMetadata)('id', cls);
|
|
337
|
+
if (typeof id === 'string' && id.length > 0)
|
|
338
|
+
return id;
|
|
339
|
+
if ('name' in cls && typeof cls.name === 'string')
|
|
340
|
+
return cls.name;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// Silently ignore errors - provider ID lookup is best-effort for prefixing
|
|
345
|
+
// and should not fail the overall operation
|
|
346
|
+
}
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
/** True if this registry (or adopted children) has any prompts. */
|
|
350
|
+
hasAny() {
|
|
351
|
+
return this.listAllIndexed().length > 0 || this.tokens.size > 0;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get the MCP capabilities for prompts.
|
|
355
|
+
* These are reported to clients during initialization.
|
|
356
|
+
*/
|
|
357
|
+
getCapabilities() {
|
|
358
|
+
return this.hasAny()
|
|
359
|
+
? {
|
|
360
|
+
prompts: {
|
|
361
|
+
// List change notifications are only supported when prompts are registered
|
|
362
|
+
listChanged: true,
|
|
363
|
+
},
|
|
364
|
+
}
|
|
365
|
+
: {};
|
|
32
366
|
}
|
|
33
367
|
}
|
|
34
368
|
exports.default = PromptRegistry;
|
|
369
|
+
/* -------------------- lineage utility -------------------- */
|
|
370
|
+
/** Remove only adjacent duplicates like [adapter:x, adapter:x] → [adapter:x] */
|
|
371
|
+
function dedupLineage(l) {
|
|
372
|
+
const out = [];
|
|
373
|
+
for (const o of l) {
|
|
374
|
+
const last = out[out.length - 1];
|
|
375
|
+
if (!last || last.kind !== o.kind || last.id !== o.id)
|
|
376
|
+
out.push(o);
|
|
377
|
+
}
|
|
378
|
+
return out;
|
|
379
|
+
}
|
|
35
380
|
//# sourceMappingURL=prompt.registry.js.map
|