mcp-creatio 0.6.2 → 0.6.4
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 +280 -156
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +27 -10
- package/dist/cli.js.map +1 -1
- package/dist/config-builder.d.ts +8 -0
- package/dist/config-builder.d.ts.map +1 -1
- package/dist/config-builder.js +147 -43
- package/dist/config-builder.js.map +1 -1
- package/dist/consts.d.ts.map +1 -1
- package/dist/consts.js +2 -1
- package/dist/consts.js.map +1 -1
- package/dist/creatio/auth/auth-manager.d.ts.map +1 -1
- package/dist/creatio/auth/auth-manager.js +5 -2
- package/dist/creatio/auth/auth-manager.js.map +1 -1
- package/dist/creatio/auth/auth.d.ts +4 -31
- package/dist/creatio/auth/auth.d.ts.map +1 -1
- package/dist/creatio/auth/auth.js +20 -26
- package/dist/creatio/auth/auth.js.map +1 -1
- package/dist/creatio/auth/constants.d.ts +14 -0
- package/dist/creatio/auth/constants.d.ts.map +1 -0
- package/dist/creatio/auth/constants.js +20 -0
- package/dist/creatio/auth/constants.js.map +1 -0
- package/dist/creatio/auth/contracts.d.ts +15 -0
- package/dist/creatio/auth/contracts.d.ts.map +1 -0
- package/dist/creatio/auth/contracts.js +3 -0
- package/dist/creatio/auth/contracts.js.map +1 -0
- package/dist/creatio/auth/headers.d.ts +3 -0
- package/dist/creatio/auth/headers.d.ts.map +1 -0
- package/dist/creatio/auth/headers.js +15 -0
- package/dist/creatio/auth/headers.js.map +1 -0
- package/dist/creatio/auth/identity.d.ts +8 -0
- package/dist/creatio/auth/identity.d.ts.map +1 -0
- package/dist/creatio/auth/identity.js +18 -0
- package/dist/creatio/auth/identity.js.map +1 -0
- package/dist/creatio/auth/index.d.ts +4 -3
- package/dist/creatio/auth/index.d.ts.map +1 -1
- package/dist/creatio/auth/index.js +5 -3
- package/dist/creatio/auth/index.js.map +1 -1
- package/dist/creatio/auth/providers/base-oauth2-provider.d.ts +13 -7
- package/dist/creatio/auth/providers/base-oauth2-provider.d.ts.map +1 -1
- package/dist/creatio/auth/providers/base-oauth2-provider.js +29 -19
- package/dist/creatio/auth/providers/base-oauth2-provider.js.map +1 -1
- package/dist/creatio/auth/providers/base-provider.js +1 -1
- package/dist/creatio/auth/providers/base-provider.js.map +1 -1
- package/dist/creatio/auth/providers/broker-provider.d.ts +20 -0
- package/dist/creatio/auth/providers/broker-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/broker-provider.js +72 -0
- package/dist/creatio/auth/providers/broker-provider.js.map +1 -0
- package/dist/creatio/auth/providers/creatio-oauth-client.d.ts +27 -0
- package/dist/creatio/auth/providers/creatio-oauth-client.d.ts.map +1 -0
- package/dist/creatio/auth/providers/creatio-oauth-client.js +122 -0
- package/dist/creatio/auth/providers/creatio-oauth-client.js.map +1 -0
- package/dist/creatio/auth/providers/index.d.ts +3 -1
- package/dist/creatio/auth/providers/index.d.ts.map +1 -1
- package/dist/creatio/auth/providers/index.js +3 -1
- package/dist/creatio/auth/providers/index.js.map +1 -1
- package/dist/creatio/auth/providers/oauth2-bearer-provider.d.ts +17 -0
- package/dist/creatio/auth/providers/oauth2-bearer-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/oauth2-bearer-provider.js +33 -0
- package/dist/creatio/auth/providers/oauth2-bearer-provider.js.map +1 -0
- package/dist/creatio/auth/providers/oauth2-provider.d.ts +2 -2
- package/dist/creatio/auth/providers/oauth2-provider.d.ts.map +1 -1
- package/dist/creatio/auth/providers/oauth2-provider.js +4 -9
- package/dist/creatio/auth/providers/oauth2-provider.js.map +1 -1
- package/dist/creatio/auth/providers/type.d.ts +20 -1
- package/dist/creatio/auth/providers/type.d.ts.map +1 -1
- package/dist/creatio/auth/providers/type.js +22 -2
- package/dist/creatio/auth/providers/type.js.map +1 -1
- package/dist/creatio/client-config.d.ts +26 -5
- package/dist/creatio/client-config.d.ts.map +1 -1
- package/dist/creatio/engines/admin-operation-engine.d.ts +1 -1
- package/dist/creatio/engines/admin-operation-engine.d.ts.map +1 -1
- package/dist/creatio/engines/admin-operation-engine.js +3 -3
- package/dist/creatio/engines/admin-operation-engine.js.map +1 -1
- package/dist/creatio/engines/configuration-engine.d.ts +1 -1
- package/dist/creatio/engines/configuration-engine.d.ts.map +1 -1
- package/dist/creatio/engines/configuration-engine.js +3 -3
- package/dist/creatio/engines/configuration-engine.js.map +1 -1
- package/dist/creatio/engines/crud-engine.d.ts +1 -1
- package/dist/creatio/engines/crud-engine.d.ts.map +1 -1
- package/dist/creatio/engines/crud-engine.js +4 -4
- package/dist/creatio/engines/crud-engine.js.map +1 -1
- package/dist/creatio/engines/engine-manager.d.ts +4 -2
- package/dist/creatio/engines/engine-manager.d.ts.map +1 -1
- package/dist/creatio/engines/engine-manager.js +9 -10
- package/dist/creatio/engines/engine-manager.js.map +1 -1
- package/dist/creatio/engines/engine.d.ts.map +1 -1
- package/dist/creatio/engines/engine.js +12 -1
- package/dist/creatio/engines/engine.js.map +1 -1
- package/dist/creatio/engines/feature-engine.d.ts +1 -1
- package/dist/creatio/engines/feature-engine.d.ts.map +1 -1
- package/dist/creatio/engines/feature-engine.js +3 -3
- package/dist/creatio/engines/feature-engine.js.map +1 -1
- package/dist/creatio/engines/process-engine.d.ts +1 -1
- package/dist/creatio/engines/process-engine.d.ts.map +1 -1
- package/dist/creatio/engines/process-engine.js +3 -3
- package/dist/creatio/engines/process-engine.js.map +1 -1
- package/dist/creatio/engines/sys-settings-engine.d.ts +1 -1
- package/dist/creatio/engines/sys-settings-engine.d.ts.map +1 -1
- package/dist/creatio/engines/sys-settings-engine.js +3 -3
- package/dist/creatio/engines/sys-settings-engine.js.map +1 -1
- package/dist/creatio/engines/user-engine.d.ts +1 -1
- package/dist/creatio/engines/user-engine.d.ts.map +1 -1
- package/dist/creatio/engines/user-engine.js +3 -3
- package/dist/creatio/engines/user-engine.js.map +1 -1
- package/dist/creatio/provider-context.d.ts +3 -0
- package/dist/creatio/provider-context.d.ts.map +1 -1
- package/dist/creatio/services/client-cache-hash-client.d.ts +22 -0
- package/dist/creatio/services/client-cache-hash-client.d.ts.map +1 -0
- package/dist/creatio/services/client-cache-hash-client.js +56 -0
- package/dist/creatio/services/client-cache-hash-client.js.map +1 -0
- package/dist/creatio/services/creatio-service-context.d.ts +6 -1
- package/dist/creatio/services/creatio-service-context.d.ts.map +1 -1
- package/dist/creatio/services/creatio-service-context.js +15 -1
- package/dist/creatio/services/creatio-service-context.js.map +1 -1
- package/dist/creatio/services/crud-provider-factory.d.ts +4 -0
- package/dist/creatio/services/crud-provider-factory.d.ts.map +1 -1
- package/dist/creatio/services/crud-provider-factory.js +1 -1
- package/dist/creatio/services/crud-provider-factory.js.map +1 -1
- package/dist/creatio/services/dataservice/data-service-column-values.d.ts.map +1 -1
- package/dist/creatio/services/dataservice/data-service-crud-provider.d.ts +5 -3
- package/dist/creatio/services/dataservice/data-service-crud-provider.d.ts.map +1 -1
- package/dist/creatio/services/dataservice/data-service-crud-provider.js +8 -6
- package/dist/creatio/services/dataservice/data-service-crud-provider.js.map +1 -1
- package/dist/creatio/services/dataservice/data-service-filter-translator.d.ts.map +1 -1
- package/dist/creatio/services/dataservice/data-service-filter-translator.js +7 -2
- package/dist/creatio/services/dataservice/data-service-filter-translator.js.map +1 -1
- package/dist/creatio/services/dataservice/data-service-query-builder.d.ts.map +1 -1
- package/dist/creatio/services/dataservice/data-service-query-builder.js.map +1 -1
- package/dist/creatio/services/dataservice/data-service-schema.d.ts +6 -4
- package/dist/creatio/services/dataservice/data-service-schema.d.ts.map +1 -1
- package/dist/creatio/services/dataservice/data-service-schema.js +29 -18
- package/dist/creatio/services/dataservice/data-service-schema.js.map +1 -1
- package/dist/creatio/services/dataservice/data-service-transport.d.ts +4 -1
- package/dist/creatio/services/dataservice/data-service-transport.d.ts.map +1 -1
- package/dist/creatio/services/dataservice/data-service-transport.js +8 -3
- package/dist/creatio/services/dataservice/data-service-transport.js.map +1 -1
- package/dist/creatio/services/dataservice/data-service-types.d.ts +0 -19
- package/dist/creatio/services/dataservice/data-service-types.d.ts.map +1 -1
- package/dist/creatio/services/dataservice/data-service-value-type.d.ts +2 -1
- package/dist/creatio/services/dataservice/data-service-value-type.d.ts.map +1 -1
- package/dist/creatio/services/dataservice/data-service-value-type.js +20 -16
- package/dist/creatio/services/dataservice/data-service-value-type.js.map +1 -1
- package/dist/creatio/services/http-client.d.ts +13 -0
- package/dist/creatio/services/http-client.d.ts.map +1 -1
- package/dist/creatio/services/http-client.js +26 -2
- package/dist/creatio/services/http-client.js.map +1 -1
- package/dist/creatio/services/identifiers.d.ts +10 -0
- package/dist/creatio/services/identifiers.d.ts.map +1 -0
- package/dist/creatio/services/identifiers.js +20 -0
- package/dist/creatio/services/identifiers.js.map +1 -0
- package/dist/creatio/services/index.d.ts +2 -0
- package/dist/creatio/services/index.d.ts.map +1 -1
- package/dist/creatio/services/index.js +2 -0
- package/dist/creatio/services/index.js.map +1 -1
- package/dist/creatio/services/odata/metadata-store.d.ts +16 -3
- package/dist/creatio/services/odata/metadata-store.d.ts.map +1 -1
- package/dist/creatio/services/odata/metadata-store.js +65 -38
- package/dist/creatio/services/odata/metadata-store.js.map +1 -1
- package/dist/creatio/services/odata/odata-crud-provider.d.ts.map +1 -1
- package/dist/creatio/services/odata/odata-crud-provider.js +10 -25
- package/dist/creatio/services/odata/odata-crud-provider.js.map +1 -1
- package/dist/creatio/services/odata/odata-query-translator.d.ts +4 -5
- package/dist/creatio/services/odata/odata-query-translator.d.ts.map +1 -1
- package/dist/creatio/services/odata/odata-query-translator.js +32 -20
- package/dist/creatio/services/odata/odata-query-translator.js.map +1 -1
- package/dist/creatio/services/schema-freshness-gate.d.ts +26 -0
- package/dist/creatio/services/schema-freshness-gate.d.ts.map +1 -0
- package/dist/creatio/services/schema-freshness-gate.js +58 -0
- package/dist/creatio/services/schema-freshness-gate.js.map +1 -0
- package/dist/creatio/services/user-info-provider.d.ts.map +1 -1
- package/dist/creatio/services/user-info-provider.js +2 -2
- package/dist/creatio/services/user-info-provider.js.map +1 -1
- package/dist/index.js +35 -4
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +1 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +6 -2
- package/dist/log.js.map +1 -1
- package/dist/server/bearer/base-url-guard.d.ts +20 -0
- package/dist/server/bearer/base-url-guard.d.ts.map +1 -0
- package/dist/server/bearer/base-url-guard.js +55 -0
- package/dist/server/bearer/base-url-guard.js.map +1 -0
- package/dist/server/bearer/bearer-edge.d.ts +42 -0
- package/dist/server/bearer/bearer-edge.d.ts.map +1 -0
- package/dist/server/bearer/bearer-edge.js +122 -0
- package/dist/server/bearer/bearer-edge.js.map +1 -0
- package/dist/server/bearer/bearer-token.d.ts +27 -0
- package/dist/server/bearer/bearer-token.d.ts.map +1 -0
- package/dist/server/bearer/bearer-token.js +50 -0
- package/dist/server/bearer/bearer-token.js.map +1 -0
- package/dist/server/bearer/index.d.ts +3 -0
- package/dist/server/bearer/index.d.ts.map +1 -0
- package/dist/server/bearer/index.js +19 -0
- package/dist/server/bearer/index.js.map +1 -0
- package/dist/server/http/auth-edge.d.ts +26 -0
- package/dist/server/http/auth-edge.d.ts.map +1 -0
- package/dist/server/http/auth-edge.js +75 -0
- package/dist/server/http/auth-edge.js.map +1 -0
- package/dist/server/http/broker-handlers.d.ts +45 -0
- package/dist/server/http/broker-handlers.d.ts.map +1 -0
- package/dist/server/http/broker-handlers.js +224 -0
- package/dist/server/http/broker-handlers.js.map +1 -0
- package/dist/server/http/{httpServer.d.ts → http-server.d.ts} +5 -13
- package/dist/server/http/http-server.d.ts.map +1 -0
- package/dist/server/http/{httpServer.js → http-server.js} +19 -53
- package/dist/server/http/http-server.js.map +1 -0
- package/dist/server/http/index.d.ts +1 -3
- package/dist/server/http/index.d.ts.map +1 -1
- package/dist/server/http/index.js +1 -3
- package/dist/server/http/index.js.map +1 -1
- package/dist/server/http/mcp-handlers.d.ts.map +1 -1
- package/dist/server/http/mcp-handlers.js +16 -3
- package/dist/server/http/mcp-handlers.js.map +1 -1
- package/dist/server/http/middleware.d.ts +3 -4
- package/dist/server/http/middleware.d.ts.map +1 -1
- package/dist/server/http/middleware.js +33 -23
- package/dist/server/http/middleware.js.map +1 -1
- package/dist/server/http/public-origin.d.ts +10 -0
- package/dist/server/http/public-origin.d.ts.map +1 -0
- package/dist/server/http/public-origin.js +19 -0
- package/dist/server/http/public-origin.js.map +1 -0
- package/dist/server/http/rate-limiter.d.ts +1 -1
- package/dist/server/http/rate-limiter.d.ts.map +1 -1
- package/dist/server/http/rate-limiter.js +11 -11
- package/dist/server/http/rate-limiter.js.map +1 -1
- package/dist/server/http-agent.d.ts +9 -0
- package/dist/server/http-agent.d.ts.map +1 -0
- package/dist/server/http-agent.js +35 -0
- package/dist/server/http-agent.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/keepalive.d.ts +26 -0
- package/dist/server/keepalive.d.ts.map +1 -0
- package/dist/server/keepalive.js +64 -0
- package/dist/server/keepalive.js.map +1 -0
- package/dist/server/mcp/creatio-rest.d.ts +6 -0
- package/dist/server/mcp/creatio-rest.d.ts.map +1 -1
- package/dist/server/mcp/creatio-rest.js +21 -3
- package/dist/server/mcp/creatio-rest.js.map +1 -1
- package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts +1 -1
- package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts.map +1 -1
- package/dist/server/mcp/crtmcp/crt-mcp-client.js +16 -13
- package/dist/server/mcp/crtmcp/crt-mcp-client.js.map +1 -1
- package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.d.ts +2 -2
- package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.d.ts.map +1 -1
- package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.js +17 -17
- package/dist/server/mcp/crtmcp/crt-mcp-tool-preparer.js.map +1 -1
- package/dist/server/mcp/dataforge/dataforge-client.d.ts +12 -12
- package/dist/server/mcp/dataforge/dataforge-client.d.ts.map +1 -1
- package/dist/server/mcp/dataforge/dataforge-client.js +40 -47
- package/dist/server/mcp/dataforge/dataforge-client.js.map +1 -1
- package/dist/server/mcp/dataforge/dataforge-tool-preparer.d.ts +2 -2
- package/dist/server/mcp/dataforge/dataforge-tool-preparer.d.ts.map +1 -1
- package/dist/server/mcp/dataforge/dataforge-tool-preparer.js +9 -9
- package/dist/server/mcp/dataforge/dataforge-tool-preparer.js.map +1 -1
- package/dist/server/mcp/filters.d.ts.map +1 -1
- package/dist/server/mcp/filters.js +4 -1
- package/dist/server/mcp/filters.js.map +1 -1
- package/dist/server/mcp/globalsearch/globalsearch-client.d.ts +4 -4
- package/dist/server/mcp/globalsearch/globalsearch-client.d.ts.map +1 -1
- package/dist/server/mcp/globalsearch/globalsearch-client.js +39 -50
- package/dist/server/mcp/globalsearch/globalsearch-client.js.map +1 -1
- package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.d.ts +1 -1
- package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.d.ts.map +1 -1
- package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.js +1 -1
- package/dist/server/mcp/globalsearch/globalsearch-tool-preparer.js.map +1 -1
- package/dist/server/mcp/server.d.ts +35 -8
- package/dist/server/mcp/server.d.ts.map +1 -1
- package/dist/server/mcp/server.js +113 -45
- package/dist/server/mcp/server.js.map +1 -1
- package/dist/server/mcp/tools-data.d.ts +2 -2
- package/dist/server/mcp/tools-data.d.ts.map +1 -1
- package/dist/server/mcp/tools-data.js +1 -1
- package/dist/server/mcp/tools-data.js.map +1 -1
- package/dist/server/oauth/oauth-server.d.ts +41 -10
- package/dist/server/oauth/oauth-server.d.ts.map +1 -1
- package/dist/server/oauth/oauth-server.js +82 -48
- package/dist/server/oauth/oauth-server.js.map +1 -1
- package/dist/server/oauth/storage.d.ts +42 -5
- package/dist/server/oauth/storage.d.ts.map +1 -1
- package/dist/server/oauth/storage.js +81 -18
- package/dist/server/oauth/storage.js.map +1 -1
- package/dist/server/oauth/token-manager.d.ts +21 -4
- package/dist/server/oauth/token-manager.d.ts.map +1 -1
- package/dist/server/oauth/token-manager.js +18 -19
- package/dist/server/oauth/token-manager.js.map +1 -1
- package/dist/server/oauth/types.d.ts +0 -12
- package/dist/server/oauth/types.d.ts.map +1 -1
- package/dist/server/oauth/validators.d.ts.map +1 -1
- package/dist/server/oauth/validators.js +14 -5
- package/dist/server/oauth/validators.js.map +1 -1
- package/dist/sessions/index.d.ts +1 -1
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +1 -1
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/redis-token-store.d.ts +22 -0
- package/dist/sessions/redis-token-store.d.ts.map +1 -0
- package/dist/sessions/redis-token-store.js +70 -0
- package/dist/sessions/redis-token-store.js.map +1 -0
- package/dist/sessions/session-context.d.ts +21 -40
- package/dist/sessions/session-context.d.ts.map +1 -1
- package/dist/sessions/session-context.js +25 -105
- package/dist/sessions/session-context.js.map +1 -1
- package/dist/sessions/token-crypto.d.ts +8 -0
- package/dist/sessions/token-crypto.d.ts.map +1 -0
- package/dist/sessions/token-crypto.js +43 -0
- package/dist/sessions/token-crypto.js.map +1 -0
- package/dist/sessions/token-store.d.ts +42 -0
- package/dist/sessions/token-store.d.ts.map +1 -0
- package/dist/sessions/token-store.js +66 -0
- package/dist/sessions/token-store.js.map +1 -0
- package/dist/utils/context.d.ts +12 -0
- package/dist/utils/context.d.ts.map +1 -1
- package/dist/utils/context.js +16 -0
- package/dist/utils/context.js.map +1 -1
- package/dist/utils/env-aliases.d.ts +9 -0
- package/dist/utils/env-aliases.d.ts.map +1 -0
- package/dist/utils/env-aliases.js +61 -0
- package/dist/utils/env-aliases.js.map +1 -0
- package/dist/utils/env.d.ts +5 -0
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +10 -1
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/redact.d.ts +25 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +64 -0
- package/dist/utils/redact.js.map +1 -0
- package/package.json +78 -76
- package/dist/creatio/auth/providers/oauth2-code-provider.d.ts +0 -21
- package/dist/creatio/auth/providers/oauth2-code-provider.d.ts.map +0 -1
- package/dist/creatio/auth/providers/oauth2-code-provider.js +0 -251
- package/dist/creatio/auth/providers/oauth2-code-provider.js.map +0 -1
- package/dist/server/http/creatio-oauth-handlers.d.ts +0 -13
- package/dist/server/http/creatio-oauth-handlers.d.ts.map +0 -1
- package/dist/server/http/creatio-oauth-handlers.js +0 -160
- package/dist/server/http/creatio-oauth-handlers.js.map +0 -1
- package/dist/server/http/httpServer.d.ts.map +0 -1
- package/dist/server/http/httpServer.js.map +0 -1
- package/dist/server/http/mcp-oauth-handlers.d.ts +0 -11
- package/dist/server/http/mcp-oauth-handlers.d.ts.map +0 -1
- package/dist/server/http/mcp-oauth-handlers.js +0 -118
- package/dist/server/http/mcp-oauth-handlers.js.map +0 -1
- package/dist/sessions/token-refresh-scheduler.d.ts +0 -16
- package/dist/sessions/token-refresh-scheduler.d.ts.map +0 -1
- package/dist/sessions/token-refresh-scheduler.js +0 -66
- package/dist/sessions/token-refresh-scheduler.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odata-crud-provider.d.ts","sourceRoot":"","sources":["../../../../src/creatio/services/odata/odata-crud-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"odata-crud-provider.d.ts","sourceRoot":"","sources":["../../../../src/creatio/services/odata/odata-crud-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,SAAS,EACT,UAAU,EACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,qBAAa,iBAAkB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IAEnD,SAAgB,IAAI,mBAAmB;IAEvC,SAAgB,YAAY,EAAE,gBAAgB,CAAqC;gBAGlF,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,kBAAkB,EACjC,UAAU,uBAA6B;IAOxC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAQjB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAInC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAI7D,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,eAAe;IAqBxC,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAqC3C,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,gBAAgB;IAqB7C,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,gBAAgB;CAmBpD"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.ODataCrudProvider = void 0;
|
|
7
|
-
const log_1 = __importDefault(require("../../../log"));
|
|
8
4
|
const entity_name_1 = require("../entity-name");
|
|
5
|
+
const identifiers_1 = require("../identifiers");
|
|
9
6
|
const odata_query_translator_1 = require("./odata-query-translator");
|
|
10
7
|
const odata_routes_1 = require("./odata-routes");
|
|
11
8
|
class ODataCrudProvider {
|
|
@@ -31,9 +28,8 @@ class ODataCrudProvider {
|
|
|
31
28
|
return `${(0, odata_routes_1.odataRoot)(this._client.normalizedBaseUrl)}/${(0, entity_name_1.assertEntityName)(entity)}`;
|
|
32
29
|
}
|
|
33
30
|
_formatEntityKey(id) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (NUMERIC_PATTERN.test(id) || GUID_PATTERN.test(id)) {
|
|
31
|
+
// A numeric or GUID key is a bare literal; any other string key is quoted (quotes doubled).
|
|
32
|
+
if (/^\d+$/.test(id) || identifiers_1.GUID_RE.test(id)) {
|
|
37
33
|
return id;
|
|
38
34
|
}
|
|
39
35
|
return `'${id.replace(/'/g, "''")}'`;
|
|
@@ -60,20 +56,20 @@ class ODataCrudProvider {
|
|
|
60
56
|
}
|
|
61
57
|
async read(query) {
|
|
62
58
|
const { entity, count } = query;
|
|
63
|
-
const startTime = Date.now();
|
|
64
59
|
const queryParams = this._translator.buildQueryParams(query);
|
|
65
60
|
const url = this._buildEntityUrl(entity) + this._buildQueryString(queryParams);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
return this._client.request('read', url, async () => {
|
|
62
|
+
const headers = await this._client.getJsonHeaders();
|
|
63
|
+
return this._client.fetchWithAuth(url, async () => ({ headers }));
|
|
64
|
+
}, async (response, duration) => {
|
|
65
|
+
const body = await response.json().catch(() => ({}));
|
|
69
66
|
const value = this._extractODataValue(body);
|
|
70
67
|
const items = Array.isArray(value) ? value : value != null ? [value] : [];
|
|
71
|
-
const duration = Date.now() - startTime;
|
|
72
68
|
// `@odata.count` is the server-side total of all matching records (ignores $top/$skip).
|
|
73
69
|
const total = body && typeof body === 'object' && '@odata.count' in body
|
|
74
70
|
? Number(body['@odata.count'])
|
|
75
71
|
: undefined;
|
|
76
|
-
|
|
72
|
+
this._client.logSuccess('read', response.status, duration, {
|
|
77
73
|
entity,
|
|
78
74
|
select: query.columns?.join(','),
|
|
79
75
|
expand: query.odata?.expand?.join(','),
|
|
@@ -82,21 +78,10 @@ class ODataCrudProvider {
|
|
|
82
78
|
count,
|
|
83
79
|
resultCount: items.length,
|
|
84
80
|
total,
|
|
85
|
-
duration,
|
|
86
81
|
});
|
|
87
82
|
// Surface the server-side total only when a count was requested and present.
|
|
88
83
|
return count && total !== undefined ? { items, totalCount: total } : { items };
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
const duration = Date.now() - startTime;
|
|
92
|
-
log_1.default.error('creatio.crud.read.error', {
|
|
93
|
-
entity,
|
|
94
|
-
url,
|
|
95
|
-
error: String(error?.message ?? error),
|
|
96
|
-
duration,
|
|
97
|
-
});
|
|
98
|
-
throw error;
|
|
99
|
-
}
|
|
84
|
+
}, { errorPrefix: 'creatio_read_failed', logContext: { entity } });
|
|
100
85
|
}
|
|
101
86
|
async update({ entity, id, data }) {
|
|
102
87
|
const url = `${this._buildEntityUrl(entity)}(${this._formatEntityKey(id)})`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odata-crud-provider.js","sourceRoot":"","sources":["../../../../src/creatio/services/odata/odata-crud-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"odata-crud-provider.js","sourceRoot":"","sources":["../../../../src/creatio/services/odata/odata-crud-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,10 +12,9 @@ import { FilterNode, ReadQuery } from '../../contracts';
|
|
|
12
12
|
* embedded quotes doubled.
|
|
13
13
|
*/
|
|
14
14
|
export declare class ODataQueryTranslator {
|
|
15
|
-
private static readonly
|
|
16
|
-
private _isGuid;
|
|
15
|
+
private static readonly SAFE_PATH;
|
|
17
16
|
private _isIdish;
|
|
18
|
-
private
|
|
17
|
+
private _assertPath;
|
|
19
18
|
private _escapeStr;
|
|
20
19
|
/** Render a literal. `temporal` allows ISO date/datetime strings to be emitted unquoted
|
|
21
20
|
* (comparison operators); the string functions (contains/…) always quote. */
|
|
@@ -26,11 +25,11 @@ export declare class ODataQueryTranslator {
|
|
|
26
25
|
private _condition;
|
|
27
26
|
private _inCondition;
|
|
28
27
|
private _node;
|
|
29
|
-
/** Render a {@link FilterNode} into an OData `$filter` expression (or undefined if empty). */
|
|
30
|
-
translateFilter(node: FilterNode | undefined): string | undefined;
|
|
31
28
|
/** Combine the structured filter with an optional raw `$filter` escape hatch (AND-joined). */
|
|
32
29
|
private _resolveFilter;
|
|
33
30
|
private _orderBy;
|
|
31
|
+
/** Render a {@link FilterNode} into an OData `$filter` expression (or undefined if empty). */
|
|
32
|
+
translateFilter(node: FilterNode | undefined): string | undefined;
|
|
34
33
|
/** Build the encoded OData query-string params for a read. */
|
|
35
34
|
buildQueryParams(query: ReadQuery): string[];
|
|
36
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odata-query-translator.d.ts","sourceRoot":"","sources":["../../../../src/creatio/services/odata/odata-query-translator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"odata-query-translator.d.ts","sourceRoot":"","sources":["../../../../src/creatio/services/odata/odata-query-translator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5F;;;;;;;;;;;GAWG;AACH,qBAAa,oBAAoB;IAKhC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAyD;IAI1F,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,UAAU;IAIlB;kFAC8E;IAC9E,OAAO,CAAC,WAAW;IA4BnB;iFAC6E;IAC7E,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,KAAK;IAmBb,8FAA8F;IAC9F,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,QAAQ;IAOhB,8FAA8F;IACvF,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS;IAIxE,8DAA8D;IACvD,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE;CA6BnD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ODataQueryTranslator = void 0;
|
|
4
|
+
const identifiers_1 = require("../identifiers");
|
|
4
5
|
const lookup_path_1 = require("../lookup-path");
|
|
5
6
|
/**
|
|
6
7
|
* Projects a neutral {@link ReadQuery} onto OData query-string parameters. This is the
|
|
@@ -15,17 +16,22 @@ const lookup_path_1 = require("../lookup-path");
|
|
|
15
16
|
* embedded quotes doubled.
|
|
16
17
|
*/
|
|
17
18
|
class ODataQueryTranslator {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
// A column path is an identifier, optionally navigation-dotted with `/` (e.g. `Contact/Name`).
|
|
20
|
+
// Filter/select/orderby field names are concatenated into the `$filter`/`$select`/`$orderby`
|
|
21
|
+
// expressions, so reject anything else to deny OData expression injection via a crafted column
|
|
22
|
+
// name (CWE-943) — filter *values* are already escaped/typed; this guards the *identifiers*.
|
|
23
|
+
static SAFE_PATH = /^[A-Za-z_][A-Za-z0-9_]*(\/[A-Za-z_][A-Za-z0-9_]*)*$/;
|
|
24
|
+
// A field whose name ends in `Id` (the scalar key `Id`, a lookup FK `XxxId`, or a nav `Xxx/Id`)
|
|
25
|
+
// — such a column is GUID-typed, so a GUID literal against it is emitted bare (see _literalFor).
|
|
22
26
|
_isIdish(field) {
|
|
23
|
-
return /
|
|
27
|
+
return /Id$/i.test(field);
|
|
28
|
+
}
|
|
29
|
+
_assertPath(field) {
|
|
30
|
+
if (!ODataQueryTranslator.SAFE_PATH.test(field)) {
|
|
31
|
+
throw new Error(`unsafe_odata_identifier:${field}`);
|
|
32
|
+
}
|
|
33
|
+
return field;
|
|
24
34
|
}
|
|
25
|
-
// ISO-8601 date / date-time. OData v4 expresses Edm.Date and Edm.DateTimeOffset literals
|
|
26
|
-
// UNQUOTED (e.g. `2026-06-01`, `2026-06-01T00:00:00Z`); quoting them 400s with
|
|
27
|
-
// "incompatible types Edm.DateTimeOffset and Edm.String".
|
|
28
|
-
static ISO_DATETIME = /^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2})?(\.\d+)?(Z|[+-]\d{2}:?\d{2})?)?$/;
|
|
29
35
|
_escapeStr(value) {
|
|
30
36
|
return value.replace(/'/g, "''");
|
|
31
37
|
}
|
|
@@ -46,10 +52,12 @@ class ODataQueryTranslator {
|
|
|
46
52
|
const v = String(value);
|
|
47
53
|
// Bare (unquoted) GUID for any Id-typed path — the scalar key `Id`, a lookup FK
|
|
48
54
|
// `XxxId`, or a navigation `Xxx/Id`. Other strings (incl. `Xxx/Name`) are quoted.
|
|
49
|
-
if (
|
|
55
|
+
if ((0, identifiers_1.isGuid)(v) && this._isIdish(field)) {
|
|
50
56
|
return v;
|
|
51
57
|
}
|
|
52
|
-
|
|
58
|
+
// OData v4 expresses Edm.Date / Edm.DateTimeOffset literals UNQUOTED (quoting them 400s
|
|
59
|
+
// with "incompatible types Edm.DateTimeOffset and Edm.String").
|
|
60
|
+
if (temporal && (0, identifiers_1.isIsoDateLike)(v)) {
|
|
53
61
|
return v;
|
|
54
62
|
}
|
|
55
63
|
return `'${this._escapeStr(v)}'`;
|
|
@@ -59,10 +67,10 @@ class ODataQueryTranslator {
|
|
|
59
67
|
/** Navigate a lookup compared to a GUID to its `Id` path (`ContactId`/`Owner`/`Contact/Type`
|
|
60
68
|
* -> `…/Id`); non-GUID values and already-`Id` paths are left untouched. */
|
|
61
69
|
_lookupNavField(field, value) {
|
|
62
|
-
return
|
|
70
|
+
return (0, identifiers_1.isGuid)(value) ? (0, lookup_path_1.lookupIdPath)(field, '/') : field;
|
|
63
71
|
}
|
|
64
72
|
_condition(node) {
|
|
65
|
-
const field = String(node.field);
|
|
73
|
+
const field = this._assertPath(String(node.field));
|
|
66
74
|
const { op } = node;
|
|
67
75
|
if (op === 'isNull') {
|
|
68
76
|
return `${field} eq null`;
|
|
@@ -85,6 +93,7 @@ class ODataQueryTranslator {
|
|
|
85
93
|
if (!node.values.length) {
|
|
86
94
|
return undefined;
|
|
87
95
|
}
|
|
96
|
+
this._assertPath(String(node.field));
|
|
88
97
|
const parts = node.values.map((v) => {
|
|
89
98
|
const f = this._lookupNavField(node.field, v);
|
|
90
99
|
return `${f} eq ${this._literalFor(f, v)}`;
|
|
@@ -98,7 +107,9 @@ class ODataQueryTranslator {
|
|
|
98
107
|
if (node.kind === 'in') {
|
|
99
108
|
return this._inCondition(node);
|
|
100
109
|
}
|
|
101
|
-
const rendered = node.items
|
|
110
|
+
const rendered = node.items
|
|
111
|
+
.map((n) => this._node(n))
|
|
112
|
+
.filter((s) => Boolean(s));
|
|
102
113
|
if (!rendered.length) {
|
|
103
114
|
return undefined;
|
|
104
115
|
}
|
|
@@ -107,10 +118,6 @@ class ODataQueryTranslator {
|
|
|
107
118
|
}
|
|
108
119
|
return `(${rendered.join(` ${node.logic} `)})`;
|
|
109
120
|
}
|
|
110
|
-
/** Render a {@link FilterNode} into an OData `$filter` expression (or undefined if empty). */
|
|
111
|
-
translateFilter(node) {
|
|
112
|
-
return node ? this._node(node) : undefined;
|
|
113
|
-
}
|
|
114
121
|
/** Combine the structured filter with an optional raw `$filter` escape hatch (AND-joined). */
|
|
115
122
|
_resolveFilter(query) {
|
|
116
123
|
const structured = this.translateFilter(query.filter);
|
|
@@ -124,7 +131,11 @@ class ODataQueryTranslator {
|
|
|
124
131
|
if (!query.order || query.order.length === 0) {
|
|
125
132
|
return undefined;
|
|
126
133
|
}
|
|
127
|
-
return query.order.map((o) => `${o.field} ${o.dir}`).join(', ');
|
|
134
|
+
return query.order.map((o) => `${this._assertPath(o.field)} ${o.dir}`).join(', ');
|
|
135
|
+
}
|
|
136
|
+
/** Render a {@link FilterNode} into an OData `$filter` expression (or undefined if empty). */
|
|
137
|
+
translateFilter(node) {
|
|
138
|
+
return node ? this._node(node) : undefined;
|
|
128
139
|
}
|
|
129
140
|
/** Build the encoded OData query-string params for a read. */
|
|
130
141
|
buildQueryParams(query) {
|
|
@@ -134,7 +145,8 @@ class ODataQueryTranslator {
|
|
|
134
145
|
params.push(`$filter=${encodeURIComponent(filter)}`);
|
|
135
146
|
}
|
|
136
147
|
if (query.columns && query.columns.length > 0) {
|
|
137
|
-
|
|
148
|
+
const columns = query.columns.map((c) => this._assertPath(c));
|
|
149
|
+
params.push(`$select=${encodeURIComponent(columns.join(','))}`);
|
|
138
150
|
}
|
|
139
151
|
const expand = query.odata?.expand;
|
|
140
152
|
if (expand && expand.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odata-query-translator.js","sourceRoot":"","sources":["../../../../src/creatio/services/odata/odata-query-translator.ts"],"names":[],"mappings":";;;AACA,gDAA8C;AAE9C;;;;;;;;;;;GAWG;AACH,MAAa,oBAAoB;
|
|
1
|
+
{"version":3,"file":"odata-query-translator.js","sourceRoot":"","sources":["../../../../src/creatio/services/odata/odata-query-translator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ClientCacheHashClient } from './client-cache-hash-client';
|
|
2
|
+
/**
|
|
3
|
+
* Freshness policy ("thermostat") for the schema/metadata caches. It turns Creatio's client-cache
|
|
4
|
+
* hashes into a per-base-url VERSION TOKEN: a schema-cache entry stamped with an older token is
|
|
5
|
+
* treated as stale and refetched. This mirrors how the Freedom UI keeps its caches fresh.
|
|
6
|
+
*
|
|
7
|
+
* - Caches the hash snapshot per base URL for a short TTL, so we poll the endpoint at most once per
|
|
8
|
+
* ~TTL no matter how many schema reads happen.
|
|
9
|
+
* - Degrades gracefully: if the endpoint is unavailable, returns a coarse time-bucketed token so
|
|
10
|
+
* caches refresh on a fallback cadence rather than going stale forever.
|
|
11
|
+
* - Keyed by base URL so a multi-tenant gateway deployment never reuses tenant A's version for B.
|
|
12
|
+
*/
|
|
13
|
+
export declare class SchemaFreshnessGate {
|
|
14
|
+
private readonly _client;
|
|
15
|
+
private readonly _ttlMs;
|
|
16
|
+
private readonly _snapshots;
|
|
17
|
+
constructor(client: ClientCacheHashClient, ttlMs?: number);
|
|
18
|
+
/**
|
|
19
|
+
* Current schema-version token for `baseUrl`. Stable while the data model is unchanged; changes
|
|
20
|
+
* when Creatio's `runtime-entity-schema` hash or the global `cacheVersion` changes. Callers stamp
|
|
21
|
+
* cached schemas with this and treat a mismatch as a miss.
|
|
22
|
+
*/
|
|
23
|
+
getSchemaVersion(baseUrl: string): Promise<string>;
|
|
24
|
+
private _fetchToken;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=schema-freshness-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-freshness-gate.d.ts","sourceRoot":"","sources":["../../../src/creatio/services/schema-freshness-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAenE;;;;;;;;;;GAUG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoD;gBAEnE,MAAM,EAAE,qBAAqB,EAAE,KAAK,GAAE,MAAgC;IAKlF;;;;OAIG;IACU,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAWjD,WAAW;CAQzB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemaFreshnessGate = void 0;
|
|
4
|
+
/** The ClientCache bucket that flips when the entity data model changes (add/alter/remove an
|
|
5
|
+
* entity or column). Its value = configuration hash + user culture. Watching this + `cacheVersion`
|
|
6
|
+
* is exactly what the Freedom UI does to invalidate its own runtime-entity-schema cache. */
|
|
7
|
+
const ENTITY_SCHEMA_HASH_NAME = 'runtime-entity-schema';
|
|
8
|
+
/** How long a fetched hash snapshot is trusted before we re-poll. Bounds endpoint load AND the
|
|
9
|
+
* worst-case staleness window after a data-model change. */
|
|
10
|
+
const DEFAULT_SNAPSHOT_TTL_MS = 60 * 1000;
|
|
11
|
+
/** When the endpoint is unavailable, fall back to a coarse time-bucketed token so schema caches
|
|
12
|
+
* still refresh on a fixed cadence instead of being trusted indefinitely. */
|
|
13
|
+
const FALLBACK_BUCKET_MS = 5 * 60 * 1000;
|
|
14
|
+
/**
|
|
15
|
+
* Freshness policy ("thermostat") for the schema/metadata caches. It turns Creatio's client-cache
|
|
16
|
+
* hashes into a per-base-url VERSION TOKEN: a schema-cache entry stamped with an older token is
|
|
17
|
+
* treated as stale and refetched. This mirrors how the Freedom UI keeps its caches fresh.
|
|
18
|
+
*
|
|
19
|
+
* - Caches the hash snapshot per base URL for a short TTL, so we poll the endpoint at most once per
|
|
20
|
+
* ~TTL no matter how many schema reads happen.
|
|
21
|
+
* - Degrades gracefully: if the endpoint is unavailable, returns a coarse time-bucketed token so
|
|
22
|
+
* caches refresh on a fallback cadence rather than going stale forever.
|
|
23
|
+
* - Keyed by base URL so a multi-tenant gateway deployment never reuses tenant A's version for B.
|
|
24
|
+
*/
|
|
25
|
+
class SchemaFreshnessGate {
|
|
26
|
+
_client;
|
|
27
|
+
_ttlMs;
|
|
28
|
+
_snapshots = new Map();
|
|
29
|
+
constructor(client, ttlMs = DEFAULT_SNAPSHOT_TTL_MS) {
|
|
30
|
+
this._client = client;
|
|
31
|
+
this._ttlMs = ttlMs;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Current schema-version token for `baseUrl`. Stable while the data model is unchanged; changes
|
|
35
|
+
* when Creatio's `runtime-entity-schema` hash or the global `cacheVersion` changes. Callers stamp
|
|
36
|
+
* cached schemas with this and treat a mismatch as a miss.
|
|
37
|
+
*/
|
|
38
|
+
async getSchemaVersion(baseUrl) {
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
const cached = this._snapshots.get(baseUrl);
|
|
41
|
+
if (cached && now - cached.at < this._ttlMs) {
|
|
42
|
+
return cached.token;
|
|
43
|
+
}
|
|
44
|
+
const token = await this._fetchToken(now);
|
|
45
|
+
this._snapshots.set(baseUrl, { token, at: now });
|
|
46
|
+
return token;
|
|
47
|
+
}
|
|
48
|
+
async _fetchToken(now) {
|
|
49
|
+
const hashes = await this._client.getHashes();
|
|
50
|
+
if (!hashes) {
|
|
51
|
+
return `fallback:${Math.floor(now / FALLBACK_BUCKET_MS)}`;
|
|
52
|
+
}
|
|
53
|
+
const entitySchema = hashes.hashes[ENTITY_SCHEMA_HASH_NAME] ?? '';
|
|
54
|
+
return `v${hashes.cacheVersion}:${entitySchema}`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.SchemaFreshnessGate = SchemaFreshnessGate;
|
|
58
|
+
//# sourceMappingURL=schema-freshness-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-freshness-gate.js","sourceRoot":"","sources":["../../../src/creatio/services/schema-freshness-gate.ts"],"names":[],"mappings":";;;AAEA;;6FAE6F;AAC7F,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AAExD;6DAC6D;AAC7D,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1C;8EAC8E;AAC9E,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,MAAa,mBAAmB;IACd,OAAO,CAAwB;IAC/B,MAAM,CAAS;IACf,UAAU,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE/E,YAAY,MAA6B,EAAE,QAAgB,uBAAuB;QACjF,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,gBAAgB,CAAC,OAAe;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7C,OAAO,MAAM,CAAC,KAAK,CAAC;QACrB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAAW;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,YAAY,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,kBAAkB,CAAC,EAAE,CAAC;QAC3D,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;QAClE,OAAO,IAAI,MAAM,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;IAClD,CAAC;CACD;AAlCD,kDAkCC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-info-provider.d.ts","sourceRoot":"","sources":["../../../src/creatio/services/user-info-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,qBAAa,gBAAiB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C,SAAgB,IAAI,+BAA+B;gBAEvC,MAAM,EAAE,iBAAiB;IAIrC,OAAO,CAAC,cAAc;IAIT,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"user-info-provider.d.ts","sourceRoot":"","sources":["../../../src/creatio/services/user-info-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,qBAAa,gBAAiB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C,SAAgB,IAAI,+BAA+B;gBAEvC,MAAM,EAAE,iBAAiB;IAIrC,OAAO,CAAC,cAAc;IAIT,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;CAiB3D"}
|
|
@@ -12,14 +12,14 @@ class UserInfoProvider {
|
|
|
12
12
|
}
|
|
13
13
|
async getCurrentUserInfo() {
|
|
14
14
|
const url = this._getServiceUrl();
|
|
15
|
-
return this._client.
|
|
15
|
+
return this._client.request('getCurrentUserInfo', url, async () => {
|
|
16
16
|
const requestInit = await this._client.createPostRequest();
|
|
17
17
|
return this._client.fetchWithAuth(url, async () => requestInit);
|
|
18
18
|
}, async (response, duration) => {
|
|
19
19
|
this._client.logSuccess('getCurrentUserInfo', response.status, duration);
|
|
20
20
|
const body = await response.json().catch(() => ({}));
|
|
21
21
|
return body;
|
|
22
|
-
},
|
|
22
|
+
}, { errorPrefix: 'creatio_get_current_user_info_failed' });
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
exports.UserInfoProvider = UserInfoProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-info-provider.js","sourceRoot":"","sources":["../../../src/creatio/services/user-info-provider.ts"],"names":[],"mappings":";;;AAIA,MAAa,gBAAgB;IACX,OAAO,CAAoB;IAE5B,IAAI,GAAG,2BAA2B,CAAC;IAEnD,YAAY,MAAyB;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,cAAc;QACrB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,wDAAwD,CAAC;IAClG,CAAC;IAEM,KAAK,CAAC,kBAAkB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"user-info-provider.js","sourceRoot":"","sources":["../../../src/creatio/services/user-info-provider.ts"],"names":[],"mappings":";;;AAIA,MAAa,gBAAgB;IACX,OAAO,CAAoB;IAE5B,IAAI,GAAG,2BAA2B,CAAC;IAEnD,YAAY,MAAyB;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,cAAc;QACrB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,wDAAwD,CAAC;IAClG,CAAC;IAEM,KAAK,CAAC,kBAAkB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAC1B,oBAAoB,EACpB,GAAG,EACH,KAAK,IAAI,EAAE;YACV,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC,EACD,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,IAAuB,CAAC;QAChC,CAAC,EACD,EAAE,WAAW,EAAE,sCAAsC,EAAE,CACvD,CAAC;IACH,CAAC;CACD;AA9BD,4CA8BC"}
|
package/dist/index.js
CHANGED
|
@@ -8,22 +8,51 @@ const consts_1 = require("./consts");
|
|
|
8
8
|
const creatio_1 = require("./creatio");
|
|
9
9
|
const log_1 = __importDefault(require("./log"));
|
|
10
10
|
const server_1 = require("./server");
|
|
11
|
+
const sessions_1 = require("./sessions");
|
|
11
12
|
const utils_1 = require("./utils");
|
|
12
13
|
let _httpInstance;
|
|
14
|
+
let _keepAlive;
|
|
15
|
+
let _tokenStore;
|
|
16
|
+
/** Single shared Creatio session exists only for legacy / client_credentials — the modes the
|
|
17
|
+
* proactive keep-alive applies to (broker/delegated/gateway are per-user / per-request). */
|
|
18
|
+
function isSingleSessionMode(kind) {
|
|
19
|
+
return kind === creatio_1.AuthProviderType.Legacy || kind === creatio_1.AuthProviderType.OAuth2;
|
|
20
|
+
}
|
|
13
21
|
async function main() {
|
|
22
|
+
(0, server_1.installHttpAgent)();
|
|
14
23
|
log_1.default.appStart({ env: { node: process.version, HTTP_MCP_PORT: consts_1.HTTP_MCP_PORT } });
|
|
24
|
+
// Auth mode is resolved in config-builder: explicit CREATIO_MCP_AUTH_MODE, else inferred
|
|
25
|
+
// (legacy/client_credentials from creds, otherwise delegated for this multi-user HTTP server).
|
|
15
26
|
const cfg = (0, config_builder_1.getCreatioClientConfig)();
|
|
27
|
+
// Broker holds users' Creatio tokens server-side; a Redis store makes that stateless +
|
|
28
|
+
// restart-durable + multi-instance (default stays in-memory). Only broker mode needs it.
|
|
29
|
+
if (cfg.auth.kind === creatio_1.AuthProviderType.Broker) {
|
|
30
|
+
const tokenStoreConfig = (0, config_builder_1.getTokenStoreConfig)();
|
|
31
|
+
if (tokenStoreConfig.kind === 'redis') {
|
|
32
|
+
_tokenStore = await (0, sessions_1.createTokenStore)(tokenStoreConfig);
|
|
33
|
+
sessions_1.SessionContext.instance.setTokenStore(_tokenStore);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
16
36
|
const provider = new creatio_1.CreatioServiceContext(cfg);
|
|
17
|
-
const readonlyMode = (0, utils_1.envBool)('
|
|
37
|
+
const readonlyMode = (0, utils_1.envBool)('CREATIO_MCP_READONLY', false);
|
|
18
38
|
const engines = new creatio_1.CreatioEngineManager(provider, { readonly: readonlyMode });
|
|
19
39
|
const server = new server_1.Server(engines, {
|
|
20
40
|
readonlyMode,
|
|
21
|
-
disableDataForge: (0, utils_1.envBool)('
|
|
22
|
-
disableGlobalSearch: (0, utils_1.envBool)('
|
|
41
|
+
disableDataForge: (0, utils_1.envBool)('CREATIO_MCP_DISABLE_DATAFORGE', false),
|
|
42
|
+
disableGlobalSearch: (0, utils_1.envBool)('CREATIO_MCP_DISABLE_GLOBAL_SEARCH', false),
|
|
23
43
|
});
|
|
24
|
-
const http = new server_1.HttpServer(server);
|
|
44
|
+
const http = new server_1.HttpServer(server, cfg);
|
|
25
45
|
_httpInstance = http;
|
|
26
46
|
await http.start(consts_1.HTTP_MCP_PORT);
|
|
47
|
+
if (isSingleSessionMode(cfg.auth.kind)) {
|
|
48
|
+
_keepAlive = new server_1.SessionKeepAlive((0, server_1.keepAliveIntervalMs)(), async () => {
|
|
49
|
+
await engines.user.getCurrentUserInfo();
|
|
50
|
+
// Reuse the periodic ping to also refresh the schema-freshness snapshot (not a wasted
|
|
51
|
+
// round-trip): the next schema read starts from a warm, validated cache.
|
|
52
|
+
await engines.warmSchemaCache();
|
|
53
|
+
});
|
|
54
|
+
_keepAlive.start();
|
|
55
|
+
}
|
|
27
56
|
}
|
|
28
57
|
let shuttingDown = false;
|
|
29
58
|
async function shutdown(signal) {
|
|
@@ -33,7 +62,9 @@ async function shutdown(signal) {
|
|
|
33
62
|
shuttingDown = true;
|
|
34
63
|
try {
|
|
35
64
|
log_1.default.appStop({ reason: signal || 'shutdown' });
|
|
65
|
+
_keepAlive?.stop();
|
|
36
66
|
await _httpInstance?.stop();
|
|
67
|
+
await _tokenStore?.close();
|
|
37
68
|
}
|
|
38
69
|
catch (err) {
|
|
39
70
|
log_1.default.error('shutdown.error', { error: String(err) });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/log.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type LogLevel = 'info' | 'warn' | 'error';
|
|
2
2
|
export type LogVerbosity = LogLevel | 'silent';
|
|
3
|
-
export type CreatioAuthKind = 'legacy' | 'oauth2'
|
|
3
|
+
export type CreatioAuthKind = 'legacy' | 'oauth2';
|
|
4
4
|
export interface LogConfig {
|
|
5
5
|
level?: LogLevel;
|
|
6
6
|
}
|
package/dist/log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"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"}
|
package/dist/log.js
CHANGED
|
@@ -23,10 +23,12 @@ exports.httpResponse = httpResponse;
|
|
|
23
23
|
exports.httpError = httpError;
|
|
24
24
|
exports.logOperation = logOperation;
|
|
25
25
|
exports.audit = audit;
|
|
26
|
+
const env_1 = require("./utils/env");
|
|
27
|
+
const redact_1 = require("./utils/redact");
|
|
26
28
|
let _correlationId;
|
|
27
29
|
let _stderrOnly = false;
|
|
28
30
|
function resolveLogVerbosity() {
|
|
29
|
-
const raw = (
|
|
31
|
+
const raw = ((0, env_1.env)('CREATIO_MCP_LOG_LEVEL') || 'silent').toLowerCase();
|
|
30
32
|
if (raw === 'info') {
|
|
31
33
|
return 'info';
|
|
32
34
|
}
|
|
@@ -74,7 +76,9 @@ function output(level, msg, meta) {
|
|
|
74
76
|
if (meta && Object.keys(meta).length) {
|
|
75
77
|
entry.meta = meta;
|
|
76
78
|
}
|
|
77
|
-
|
|
79
|
+
// Final outward choke point: scrub any credential-looking substrings (tokens, secrets, auth
|
|
80
|
+
// headers) that may have slipped into msg/meta before they reach stdout/stderr or a log sink.
|
|
81
|
+
const line = (0, redact_1.redactSecrets)(JSON.stringify(entry));
|
|
78
82
|
if (_stderrOnly) {
|
|
79
83
|
process.stderr.write(line + '\n');
|
|
80
84
|
return;
|
package/dist/log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guards the gateway-only `X-Creatio-Base-Url` override. The override decides where each request's
|
|
3
|
+
* Bearer token is sent, so an unvalidated value is an SSRF / token-redirection lever (CWE-918):
|
|
4
|
+
* a compromised or misconfigured gateway could redirect the authenticated token to an attacker host
|
|
5
|
+
* or pivot to internal metadata endpoints.
|
|
6
|
+
*
|
|
7
|
+
* The real production control is an allowlist (`CREATIO_MCP_ALLOWED_BASE_URLS`). When it is set, the
|
|
8
|
+
* override MUST fall under an allowed origin. When it is NOT set, we keep the trusted-gateway posture
|
|
9
|
+
* (any http/https host is accepted) but ALWAYS block the cloud-metadata link-local address, since it
|
|
10
|
+
* is never a legitimate Creatio target and is the classic SSRF prize. On-prem private ranges are NOT
|
|
11
|
+
* blocked by default — legitimate tenants live there — so use the allowlist to lock things down.
|
|
12
|
+
*/
|
|
13
|
+
/** Parse the comma/space-separated `CREATIO_MCP_ALLOWED_BASE_URLS` into normalized origins. */
|
|
14
|
+
export declare function parseAllowedBaseUrls(raw: string | undefined): string[];
|
|
15
|
+
/**
|
|
16
|
+
* Whether `raw` is an acceptable base-URL override. `allowlist` is the parsed
|
|
17
|
+
* {@link parseAllowedBaseUrls} list ([] = none configured).
|
|
18
|
+
*/
|
|
19
|
+
export declare function isAllowedBaseUrl(raw: string, allowlist: string[]): boolean;
|
|
20
|
+
//# sourceMappingURL=base-url-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-url-guard.d.ts","sourceRoot":"","sources":["../../../src/server/bearer/base-url-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAQtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAsB1E"}
|