@owox/backend 0.35.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/common/exceptions/concurrency-limit-exceeded.exception.d.ts +1 -1
- package/dist/src/common/exceptions/concurrency-limit-exceeded.exception.js +2 -2
- package/dist/src/common/markdown/markdown-parser.service.d.ts +2 -0
- package/dist/src/common/markdown/markdown-parser.service.js +15 -8
- package/dist/src/common/validators/max-byte-length.validator.d.ts +2 -0
- package/dist/src/common/validators/max-byte-length.validator.js +29 -0
- package/dist/src/config/env-validation.config.d.ts +12 -0
- package/dist/src/config/env-validation.config.js +7 -0
- package/dist/src/data-marts/ai-insights/agent/types.d.ts +6 -6
- package/dist/src/data-marts/calculated-fields/calculated-field-validator.service.js +22 -30
- package/dist/src/data-marts/calculated-fields/calculated-field.utils.d.ts +1 -0
- package/dist/src/data-marts/calculated-fields/calculated-field.utils.js +21 -0
- package/dist/src/data-marts/calculated-fields/formula-analyzer.d.ts +1 -0
- package/dist/src/data-marts/calculated-fields/formula-analyzer.js +2 -0
- package/dist/src/data-marts/calculated-fields/formula-violations.d.ts +7 -0
- package/dist/src/data-marts/calculated-fields/formula-violations.js +82 -1
- package/dist/src/data-marts/calculated-fields/join-grain.d.ts +32 -0
- package/dist/src/data-marts/calculated-fields/join-grain.js +107 -0
- package/dist/src/data-marts/calculated-fields/set-quantifier.d.ts +8 -0
- package/dist/src/data-marts/calculated-fields/set-quantifier.js +12 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/connector-message.schema.d.ts +66 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/connector-message.schema.js +13 -1
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-credentials-update.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-credentials-update.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-error.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-error.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-log.schema.d.ts +12 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-log.schema.js +4 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-requested-date.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-requested-date.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-state-update.schema.d.ts +16 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-state-update.schema.js +16 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-status.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-status.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-warning.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-warning.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/services/connector-event.translator.d.ts +10 -0
- package/dist/src/data-marts/connector-types/connector-message/services/connector-event.translator.js +138 -0
- package/dist/src/data-marts/connector-types/connector-message/services/connector-message-parser.service.d.ts +1 -3
- package/dist/src/data-marts/connector-types/connector-message/services/connector-message-parser.service.js +30 -34
- package/dist/src/data-marts/connector-types/connector-message/services/connector-output-capture.service.js +10 -12
- package/dist/src/data-marts/connector-types/connector-message/services/connector-state.service.js +3 -1
- package/dist/src/data-marts/connector-types/enums/connector-message-type-enum.d.ts +1 -0
- package/dist/src/data-marts/connector-types/enums/connector-message-type-enum.js +1 -0
- package/dist/src/data-marts/controllers/connector-definition.controller.d.ts +30 -0
- package/dist/src/data-marts/controllers/connector-definition.controller.js +252 -0
- package/dist/src/data-marts/controllers/data-mart-preview.controller.d.ts +10 -0
- package/dist/src/data-marts/controllers/data-mart-preview.controller.js +58 -0
- package/dist/src/data-marts/controllers/data-mart.controller.d.ts +5 -1
- package/dist/src/data-marts/controllers/data-mart.controller.js +25 -4
- package/dist/src/data-marts/controllers/insight-template.controller.js +4 -4
- package/dist/src/data-marts/controllers/insight.controller.js +5 -5
- package/dist/src/data-marts/controllers/project-data-mart-runs.controller.js +1 -1
- package/dist/src/data-marts/controllers/spec/connector-definition.api.d.ts +12 -0
- package/dist/src/data-marts/controllers/spec/connector-definition.api.js +179 -0
- package/dist/src/data-marts/controllers/spec/data-mart.api.d.ts +1 -0
- package/dist/src/data-marts/controllers/spec/data-mart.api.js +5 -0
- package/dist/src/data-marts/controllers/spec/report-openapi.d.ts +18 -0
- package/dist/src/data-marts/controllers/spec/report-openapi.js +3 -0
- package/dist/src/data-marts/data-marts.module.js +20 -2
- package/dist/src/data-marts/data-storage-types/blending/metric-sleeve.planner.js +3 -12
- package/dist/src/data-marts/data-storage-types/data-mart-schema.utils.d.ts +1 -0
- package/dist/src/data-marts/data-storage-types/data-mart-schema.utils.js +16 -0
- package/dist/src/data-marts/dto/domain/blendable-schema.dto.d.ts +10 -0
- package/dist/src/data-marts/dto/domain/blendable-schema.dto.js +71 -1
- package/dist/src/data-marts/dto/domain/create-data-mart.command.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/create-data-mart.command.js +3 -1
- package/dist/src/data-marts/dto/domain/create-report.command.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/create-report.command.js +3 -1
- package/dist/src/data-marts/dto/domain/data-mart-list-item.dto.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/data-mart-list-item.dto.js +3 -1
- package/dist/src/data-marts/dto/domain/data-mart.dto.d.ts +4 -1
- package/dist/src/data-marts/dto/domain/data-mart.dto.js +5 -1
- package/dist/src/data-marts/dto/domain/model-canvas.dto.d.ts +4 -0
- package/dist/src/data-marts/dto/domain/report-like-read-plan.d.ts +2 -0
- package/dist/src/data-marts/dto/domain/report.dto.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/report.dto.js +3 -1
- package/dist/src/data-marts/dto/domain/update-data-mart-icon.command.d.ts +9 -0
- package/dist/src/data-marts/dto/domain/update-data-mart-icon.command.js +19 -0
- package/dist/src/data-marts/dto/domain/update-report.command.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/update-report.command.js +3 -1
- package/dist/src/data-marts/dto/presentation/create-data-mart-request-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/create-data-mart-request-api.dto.js +13 -0
- package/dist/src/data-marts/dto/presentation/create-report-request-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/create-report-request-api.dto.js +10 -0
- package/dist/src/data-marts/dto/presentation/custom-connector-response.dto.d.ts +46 -0
- package/dist/src/data-marts/dto/presentation/custom-connector-response.dto.js +216 -0
- package/dist/src/data-marts/dto/presentation/custom-connector.dto.d.ts +27 -0
- package/dist/src/data-marts/dto/presentation/custom-connector.dto.js +159 -0
- package/dist/src/data-marts/dto/presentation/data-mart-list-item-response-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/data-mart-list-item-response-api.dto.js +10 -0
- package/dist/src/data-marts/dto/presentation/data-mart-response-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/data-mart-response-api.dto.js +10 -0
- package/dist/src/data-marts/dto/presentation/model-canvas-response-api.dto.d.ts +4 -0
- package/dist/src/data-marts/dto/presentation/model-canvas-response-api.dto.js +20 -0
- package/dist/src/data-marts/dto/presentation/preview-data-mart-request-api.dto.d.ts +7 -0
- package/dist/src/data-marts/dto/presentation/preview-data-mart-request-api.dto.js +56 -0
- package/dist/src/data-marts/dto/presentation/preview-data-mart-response-api.dto.d.ts +12 -0
- package/dist/src/data-marts/dto/presentation/preview-data-mart-response-api.dto.js +64 -0
- package/dist/src/data-marts/dto/presentation/report-response-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/report-response-api.dto.js +6 -0
- package/dist/src/data-marts/dto/presentation/run-data-mart-request-api.dto.js +67 -0
- package/dist/src/data-marts/dto/presentation/update-data-mart-description-api.dto.js +3 -0
- package/dist/src/data-marts/dto/presentation/update-data-mart-icon-api.dto.d.ts +4 -0
- package/dist/src/data-marts/dto/presentation/update-data-mart-icon-api.dto.js +30 -0
- package/dist/src/data-marts/dto/presentation/update-report-request-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/update-report-request-api.dto.js +10 -0
- package/dist/src/data-marts/dto/schemas/auto-aggregation-opt-out.schema.d.ts +15 -0
- package/dist/src/data-marts/dto/schemas/auto-aggregation-opt-out.schema.js +29 -0
- package/dist/src/data-marts/dto/schemas/data-mart-run/data-mart-run.schema.d.ts +9 -0
- package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/connector-definition.schema.d.ts +15 -0
- package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/connector-definition.schema.js +1 -0
- package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/data-mart-definition.schema.d.ts +7 -0
- package/dist/src/data-marts/dto/schemas/data-quality/data-quality-run.schema.d.ts +20 -0
- package/dist/src/data-marts/entities/connector-definition-version.entity.d.ts +16 -0
- package/dist/src/data-marts/entities/connector-definition-version.entity.js +78 -0
- package/dist/src/data-marts/entities/connector-definition.entity.d.ts +14 -0
- package/dist/src/data-marts/entities/connector-definition.entity.js +82 -0
- package/dist/src/data-marts/entities/data-mart.entity.d.ts +2 -0
- package/dist/src/data-marts/entities/data-mart.entity.js +5 -0
- package/dist/src/data-marts/entities/report.entity.d.ts +2 -0
- package/dist/src/data-marts/entities/report.entity.js +11 -0
- package/dist/src/data-marts/enums/data-mart-icon.enum.d.ts +75 -0
- package/dist/src/data-marts/enums/data-mart-icon.enum.js +80 -0
- package/dist/src/data-marts/errors/connector-credential-boundary.error.d.ts +3 -0
- package/dist/src/data-marts/errors/connector-credential-boundary.error.js +14 -0
- package/dist/src/data-marts/facades/mcp-data-marts.facade.d.ts +2 -0
- package/dist/src/data-marts/facades/mcp-data-marts.facade.impl.d.ts +7 -1
- package/dist/src/data-marts/facades/mcp-data-marts.facade.impl.js +70 -5
- package/dist/src/data-marts/mappers/connector-definition.mapper.d.ts +14 -0
- package/dist/src/data-marts/mappers/connector-definition.mapper.js +57 -0
- package/dist/src/data-marts/mappers/data-mart.mapper.d.ts +9 -6
- package/dist/src/data-marts/mappers/data-mart.mapper.js +44 -19
- package/dist/src/data-marts/mappers/insight-template.mapper.d.ts +1 -1
- package/dist/src/data-marts/mappers/insight-template.mapper.js +2 -2
- package/dist/src/data-marts/mappers/insight.mapper.d.ts +1 -1
- package/dist/src/data-marts/mappers/insight.mapper.js +2 -2
- package/dist/src/data-marts/mappers/model-canvas.mapper.d.ts +10 -2
- package/dist/src/data-marts/mappers/model-canvas.mapper.js +9 -3
- package/dist/src/data-marts/mappers/report.mapper.js +4 -3
- package/dist/src/data-marts/services/auto-collapse.resolver.d.ts +1 -1
- package/dist/src/data-marts/services/auto-collapse.resolver.js +4 -0
- package/dist/src/data-marts/services/blendable-schema.service.d.ts +2 -0
- package/dist/src/data-marts/services/blendable-schema.service.js +59 -0
- package/dist/src/data-marts/services/connector/connector-credential-injector.service.d.ts +1 -1
- package/dist/src/data-marts/services/connector/connector-credential-injector.service.js +15 -1
- package/dist/src/data-marts/services/connector/connector-definition.service.d.ts +59 -0
- package/dist/src/data-marts/services/connector/connector-definition.service.js +491 -0
- package/dist/src/data-marts/services/connector/connector-executor.service.d.ts +9 -1
- package/dist/src/data-marts/services/connector/connector-executor.service.js +173 -63
- package/dist/src/data-marts/services/connector/connector-fields-preview.service.js +1 -1
- package/dist/src/data-marts/services/connector/connector-message.utils.js +2 -2
- package/dist/src/data-marts/services/connector/connector-preview-credentials.service.js +1 -1
- package/dist/src/data-marts/services/connector/connector-preview-support.d.ts +1 -1
- package/dist/src/data-marts/services/connector/connector-preview-support.js +14 -21
- package/dist/src/data-marts/services/connector/connector-process-spawner.service.d.ts +11 -2
- package/dist/src/data-marts/services/connector/connector-process-spawner.service.js +88 -60
- package/dist/src/data-marts/services/connector/connector-secret.service.d.ts +6 -3
- package/dist/src/data-marts/services/connector/connector-secret.service.js +77 -12
- package/dist/src/data-marts/services/connector/connector-source-config.service.js +1 -1
- package/dist/src/data-marts/services/connector/connector-source-credentials.service.d.ts +6 -2
- package/dist/src/data-marts/services/connector/connector-source-credentials.service.js +18 -16
- package/dist/src/data-marts/services/connector/connector-specification.mapper.d.ts +47 -0
- package/dist/src/data-marts/services/connector/connector-specification.mapper.js +46 -0
- package/dist/src/data-marts/services/connector/connector-test.service.d.ts +43 -0
- package/dist/src/data-marts/services/connector/connector-test.service.js +343 -0
- package/dist/src/data-marts/services/connector/connector.service.d.ts +8 -2
- package/dist/src/data-marts/services/connector/connector.service.js +65 -54
- package/dist/src/data-marts/services/connector/declarative-manifest-schemas.d.ts +4 -0
- package/dist/src/data-marts/services/connector/declarative-manifest-schemas.js +48 -0
- package/dist/src/data-marts/services/connector/run-log-flusher.d.ts +21 -0
- package/dist/src/data-marts/services/connector/run-log-flusher.js +67 -0
- package/dist/src/data-marts/services/data-mart.service.js +2 -0
- package/dist/src/data-marts/services/report-sql-composer.service.js +15 -1
- package/dist/src/data-marts/services/report.service.d.ts +1 -0
- package/dist/src/data-marts/services/report.service.js +13 -0
- package/dist/src/data-marts/services/scheduled-trigger.service.d.ts +1 -0
- package/dist/src/data-marts/services/scheduled-trigger.service.js +13 -0
- package/dist/src/data-marts/use-cases/create-data-mart.service.js +1 -0
- package/dist/src/data-marts/use-cases/create-report.service.js +2 -0
- package/dist/src/data-marts/use-cases/get-model-canvas-data-marts.service.d.ts +5 -1
- package/dist/src/data-marts/use-cases/get-model-canvas-data-marts.service.js +16 -3
- package/dist/src/data-marts/use-cases/list-project-scheduled-triggers.service.js +1 -1
- package/dist/src/data-marts/use-cases/preview-data-mart.service.d.ts +59 -0
- package/dist/src/data-marts/use-cases/preview-data-mart.service.js +293 -0
- package/dist/src/data-marts/use-cases/stream-http-data.service.js +1 -0
- package/dist/src/data-marts/use-cases/update-data-mart-definition.service.d.ts +1 -1
- package/dist/src/data-marts/use-cases/update-data-mart-definition.service.js +8 -6
- package/dist/src/data-marts/use-cases/update-data-mart-icon.service.d.ts +12 -0
- package/dist/src/data-marts/use-cases/update-data-mart-icon.service.js +46 -0
- package/dist/src/data-marts/use-cases/update-data-mart-schema.service.js +14 -1
- package/dist/src/data-marts/use-cases/update-report.service.js +9 -1
- package/dist/src/ee/ee.module.js +5 -8
- package/dist/src/ee/mcp/auth/mcp-auth-context.d.ts +0 -4
- package/dist/src/ee/mcp/auth/mcp-auth.middleware.d.ts +26 -0
- package/dist/src/ee/mcp/auth/mcp-auth.middleware.js +184 -0
- package/dist/src/ee/mcp/http-headers.util.d.ts +2 -0
- package/dist/src/ee/mcp/http-headers.util.js +8 -0
- package/dist/src/ee/mcp/observability/mcp-bus-wiring.js +4 -4
- package/dist/src/ee/mcp/observability/mcp-call-instrumentation.d.ts +2 -4
- package/dist/src/ee/mcp/observability/mcp-call-instrumentation.js +6 -6
- package/dist/src/ee/mcp/sdk/mcp-sdk-server.factory.d.ts +1 -1
- package/dist/src/ee/mcp/sdk/mcp-sdk-server.factory.js +5 -5
- package/dist/src/ee/mcp/tools/add-destination.tool.d.ts +20 -14
- package/dist/src/ee/mcp/tools/add-destination.tool.js +10 -10
- package/dist/src/ee/mcp/tools/add-report.tool.d.ts +88 -228
- package/dist/src/ee/mcp/tools/add-report.tool.js +28 -28
- package/dist/src/ee/mcp/tools/create-report-run-schedule.tool.d.ts +2 -12
- package/dist/src/ee/mcp/tools/create-report-run-schedule.tool.js +13 -13
- package/dist/src/ee/mcp/tools/data-mart-catalog.tool.d.ts +15 -81
- package/dist/src/ee/mcp/tools/data-mart-catalog.tool.js +11 -11
- package/dist/src/ee/mcp/tools/data-mart-details.tool.d.ts +19 -111
- package/dist/src/ee/mcp/tools/data-mart-details.tool.js +64 -48
- package/dist/src/ee/mcp/tools/delete-report-run-schedule.tool.d.ts +2 -6
- package/dist/src/ee/mcp/tools/delete-report-run-schedule.tool.js +7 -7
- package/dist/src/ee/mcp/tools/delete-report.tool.d.ts +2 -6
- package/dist/src/ee/mcp/tools/delete-report.tool.js +4 -4
- package/dist/src/ee/mcp/tools/get-data-mart-reports.tool.d.ts +30 -195
- package/dist/src/ee/mcp/tools/get-data-mart-reports.tool.js +22 -22
- package/dist/src/ee/mcp/tools/get-report-output-schema.tool.d.ts +3 -21
- package/dist/src/ee/mcp/tools/get-report-output-schema.tool.js +10 -10
- package/dist/src/ee/mcp/tools/get-report-run-status.tool.d.ts +15 -11
- package/dist/src/ee/mcp/tools/get-report-run-status.tool.js +14 -14
- package/dist/src/ee/mcp/tools/list-destinations.tool.d.ts +12 -20
- package/dist/src/ee/mcp/tools/list-destinations.tool.js +10 -10
- package/dist/src/ee/mcp/tools/list-report-run-schedules.tool.d.ts +5 -61
- package/dist/src/ee/mcp/tools/list-report-run-schedules.tool.js +14 -14
- package/dist/src/ee/mcp/tools/mcp-getting-started.util.d.ts +4 -52
- package/dist/src/ee/mcp/tools/mcp-getting-started.util.js +13 -13
- package/dist/src/ee/mcp/tools/mcp-tool.definition.d.ts +2 -2
- package/dist/src/ee/mcp/tools/project-context.tool.d.ts +3 -17
- package/dist/src/ee/mcp/tools/project-context.tool.js +10 -10
- package/dist/src/ee/mcp/tools/query-data-mart.input.d.ts +111 -152
- package/dist/src/ee/mcp/tools/query-data-mart.input.js +39 -39
- package/dist/src/ee/mcp/tools/query-data-mart.tool.d.ts +60 -130
- package/dist/src/ee/mcp/tools/query-data-mart.tool.js +35 -35
- package/dist/src/ee/mcp/tools/report-output-controls-output.d.ts +17 -60
- package/dist/src/ee/mcp/tools/report-output-controls-output.js +20 -20
- package/dist/src/ee/mcp/tools/report-run-outcome.d.ts +6 -42
- package/dist/src/ee/mcp/tools/report-run-outcome.js +20 -20
- package/dist/src/ee/mcp/tools/run-report.tool.d.ts +2 -6
- package/dist/src/ee/mcp/tools/run-report.tool.js +5 -5
- package/dist/src/ee/mcp/tools/search-data-marts.tool.d.ts +7 -79
- package/dist/src/ee/mcp/tools/search-data-marts.tool.js +11 -11
- package/dist/src/ee/mcp/tools/search-reports.tool.d.ts +15 -61
- package/dist/src/ee/mcp/tools/search-reports.tool.js +15 -15
- package/dist/src/ee/mcp/tools/summarize-data-catalog.tool.d.ts +7 -79
- package/dist/src/ee/mcp/tools/summarize-data-catalog.tool.js +15 -15
- package/dist/src/ee/mcp/tools/update-report-run-schedule.tool.d.ts +2 -12
- package/dist/src/ee/mcp/tools/update-report-run-schedule.tool.js +13 -13
- package/dist/src/ee/mcp/tools/update-report.tool.d.ts +105 -414
- package/dist/src/ee/mcp/tools/update-report.tool.js +20 -20
- package/dist/src/ee/mcp/transport/mcp-http-entry.service.d.ts +30 -0
- package/dist/src/ee/mcp/transport/mcp-http-entry.service.js +193 -0
- package/dist/src/idp/guards/idp.guard.js +2 -8
- package/dist/src/idp/oauth/controllers/oauth-authorization.controller.d.ts +4 -0
- package/dist/src/idp/oauth/controllers/oauth-authorization.controller.js +77 -1
- package/dist/src/idp/oauth/controllers/oauth-metadata.controller.d.ts +2 -1
- package/dist/src/idp/oauth/controllers/oauth-metadata.controller.js +5 -8
- package/dist/src/idp/oauth/controllers/oauth-token.controller.js +14 -1
- package/dist/src/idp/oauth/oauth-request.validator.d.ts +8 -0
- package/dist/src/idp/oauth/oauth-request.validator.js +27 -0
- package/dist/src/idp/utils/is-authentication-error.d.ts +1 -0
- package/dist/src/idp/utils/is-authentication-error.js +9 -0
- package/dist/src/idp/utils/role-hierarchy.d.ts +3 -0
- package/dist/src/idp/utils/role-hierarchy.js +14 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +3 -1
- package/dist/src/migrations/1788048000000-create-connector-definition-tables.d.ts +6 -0
- package/dist/src/migrations/1788048000000-create-connector-definition-tables.js +116 -0
- package/dist/src/migrations/1790156789783-add-auto-aggregation-opt-out-to-report.d.ts +8 -0
- package/dist/src/migrations/1790156789783-add-auto-aggregation-opt-out-to-report.js +30 -0
- package/dist/src/migrations/1790247861000-add-icon-to-data-mart.d.ts +8 -0
- package/dist/src/migrations/1790247861000-add-icon-to-data-mart.js +31 -0
- package/package.json +10 -6
- package/dist/src/ee/mcp/auth/mcp-auth.exception-filter.d.ts +0 -14
- package/dist/src/ee/mcp/auth/mcp-auth.exception-filter.js +0 -84
- package/dist/src/ee/mcp/auth/mcp-auth.guard.d.ts +0 -14
- package/dist/src/ee/mcp/auth/mcp-auth.guard.js +0 -99
- package/dist/src/ee/mcp/controllers/mcp-transport.controller.d.ts +0 -17
- package/dist/src/ee/mcp/controllers/mcp-transport.controller.js +0 -134
- package/dist/src/ee/mcp/sdk/mcp-streamable-http-transport.handler.d.ts +0 -16
- package/dist/src/ee/mcp/sdk/mcp-streamable-http-transport.handler.js +0 -133
|
@@ -66,7 +66,7 @@ let UpdateDataMartDefinitionService = class UpdateDataMartDefinitionService {
|
|
|
66
66
|
this.assertDefinitionTypeChangeAllowed(previousDefinitionType, command.definitionType);
|
|
67
67
|
definitionTypeChanged = true;
|
|
68
68
|
}
|
|
69
|
-
const connectorCapabilities = this.
|
|
69
|
+
const connectorCapabilities = await this.resolveConnectorCapabilities(command);
|
|
70
70
|
this.validateConnectorConfigurationCount(command, connectorCapabilities);
|
|
71
71
|
if (dataMart.storage.type === data_storage_type_enum_1.DataStorageType.LEGACY_GOOGLE_BIGQUERY) {
|
|
72
72
|
if (command.definitionType !== data_mart_definition_type_enum_1.DataMartDefinitionType.SQL) {
|
|
@@ -91,11 +91,11 @@ let UpdateDataMartDefinitionService = class UpdateDataMartDefinitionService {
|
|
|
91
91
|
}
|
|
92
92
|
this.validateSecretReferences(connectorDefinition, previousDefinition, sourceDefinition);
|
|
93
93
|
if (sourceDefinition) {
|
|
94
|
-
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecretsFromSource(connectorDefinition, sourceDefinition);
|
|
95
|
-
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecrets(mergedDefinition, previousDefinition);
|
|
94
|
+
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecretsFromSource(command.projectId, connectorDefinition, sourceDefinition);
|
|
95
|
+
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecrets(command.projectId, mergedDefinition, previousDefinition);
|
|
96
96
|
}
|
|
97
97
|
else {
|
|
98
|
-
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecrets(connectorDefinition, previousDefinition);
|
|
98
|
+
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecrets(command.projectId, connectorDefinition, previousDefinition);
|
|
99
99
|
}
|
|
100
100
|
dataMart.definition = await this.connectorSecretService.extractAndSaveSecrets(dataMart.id, command.projectId, connectorDefinition.connector.source.name, mergedDefinition);
|
|
101
101
|
await this.connectorSecretService.deleteOrphanedSecrets(dataMart.id, dataMart.definition, previousDefinition);
|
|
@@ -119,13 +119,15 @@ let UpdateDataMartDefinitionService = class UpdateDataMartDefinitionService {
|
|
|
119
119
|
await this.advancedSearchIndexSync?.scheduleReindex(search_facade_1.SearchableEntityType.DATA_MART, dataMart.id, command.projectId);
|
|
120
120
|
return this.mapper.toDomainDto(dataMart);
|
|
121
121
|
}
|
|
122
|
-
|
|
122
|
+
async resolveConnectorCapabilities(command) {
|
|
123
123
|
if (command.definitionType !== data_mart_definition_type_enum_1.DataMartDefinitionType.CONNECTOR) {
|
|
124
124
|
return undefined;
|
|
125
125
|
}
|
|
126
126
|
const definition = command.definition;
|
|
127
127
|
const source = definition?.connector?.source;
|
|
128
|
-
return source?.name
|
|
128
|
+
return source?.name
|
|
129
|
+
? this.connectorService.resolveConnectorCapabilities(command.projectId, source.name, source.version)
|
|
130
|
+
: undefined;
|
|
129
131
|
}
|
|
130
132
|
validateConnectorConfigurationCount(command, capabilities) {
|
|
131
133
|
if (!capabilities?.singleConfiguration) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DataMartMapper } from '../mappers/data-mart.mapper';
|
|
2
|
+
import { DataMartDto } from '../dto/domain/data-mart.dto';
|
|
3
|
+
import { DataMartService } from '../services/data-mart.service';
|
|
4
|
+
import { UpdateDataMartIconCommand } from '../dto/domain/update-data-mart-icon.command';
|
|
5
|
+
import { AccessDecisionService } from '../services/access-decision';
|
|
6
|
+
export declare class UpdateDataMartIconService {
|
|
7
|
+
private readonly dataMartService;
|
|
8
|
+
private readonly mapper;
|
|
9
|
+
private readonly accessDecisionService;
|
|
10
|
+
constructor(dataMartService: DataMartService, mapper: DataMartMapper, accessDecisionService: AccessDecisionService);
|
|
11
|
+
run(command: UpdateDataMartIconCommand): Promise<DataMartDto>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.UpdateDataMartIconService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const data_mart_mapper_1 = require("../mappers/data-mart.mapper");
|
|
15
|
+
const data_mart_service_1 = require("../services/data-mart.service");
|
|
16
|
+
const access_decision_1 = require("../services/access-decision");
|
|
17
|
+
let UpdateDataMartIconService = class UpdateDataMartIconService {
|
|
18
|
+
dataMartService;
|
|
19
|
+
mapper;
|
|
20
|
+
accessDecisionService;
|
|
21
|
+
constructor(dataMartService, mapper, accessDecisionService) {
|
|
22
|
+
this.dataMartService = dataMartService;
|
|
23
|
+
this.mapper = mapper;
|
|
24
|
+
this.accessDecisionService = accessDecisionService;
|
|
25
|
+
}
|
|
26
|
+
async run(command) {
|
|
27
|
+
const dataMart = await this.dataMartService.getByIdAndProjectId(command.id, command.projectId);
|
|
28
|
+
if (command.userId) {
|
|
29
|
+
const canEdit = await this.accessDecisionService.canAccess(command.userId, command.roles, access_decision_1.EntityType.DATA_MART, command.id, access_decision_1.Action.EDIT, command.projectId);
|
|
30
|
+
if (!canEdit) {
|
|
31
|
+
throw new common_1.ForbiddenException('You do not have permission to edit this DataMart');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
dataMart.icon = command.icon;
|
|
35
|
+
await this.dataMartService.save(dataMart);
|
|
36
|
+
return this.mapper.toDomainDto(dataMart);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.UpdateDataMartIconService = UpdateDataMartIconService;
|
|
40
|
+
exports.UpdateDataMartIconService = UpdateDataMartIconService = __decorate([
|
|
41
|
+
(0, common_1.Injectable)(),
|
|
42
|
+
__metadata("design:paramtypes", [data_mart_service_1.DataMartService,
|
|
43
|
+
data_mart_mapper_1.DataMartMapper,
|
|
44
|
+
access_decision_1.AccessDecisionService])
|
|
45
|
+
], UpdateDataMartIconService);
|
|
46
|
+
//# sourceMappingURL=update-data-mart-icon.service.js.map
|
|
@@ -18,7 +18,9 @@ const data_mart_entity_1 = require("../entities/data-mart.entity");
|
|
|
18
18
|
const calculated_field_utils_1 = require("../calculated-fields/calculated-field.utils");
|
|
19
19
|
const calculated_field_validator_service_1 = require("../calculated-fields/calculated-field-validator.service");
|
|
20
20
|
const formula_violations_1 = require("../calculated-fields/formula-violations");
|
|
21
|
+
const join_grain_1 = require("../calculated-fields/join-grain");
|
|
21
22
|
const data_storage_credentials_resolver_service_1 = require("../data-storage-types/data-storage-credentials-resolver.service");
|
|
23
|
+
const data_mart_schema_utils_1 = require("../data-storage-types/data-mart-schema.utils");
|
|
22
24
|
const data_mart_schema_field_status_enum_1 = require("../data-storage-types/enums/data-mart-schema-field-status.enum");
|
|
23
25
|
const data_mart_schema_parser_facade_service_1 = require("../data-storage-types/facades/data-mart-schema-parser-facade.service");
|
|
24
26
|
const data_mart_mapper_1 = require("../mappers/data-mart.mapper");
|
|
@@ -57,6 +59,7 @@ let UpdateDataMartSchemaService = UpdateDataMartSchemaService_1 = class UpdateDa
|
|
|
57
59
|
}
|
|
58
60
|
const parsed = await this.schemaParserFacade.validateAndParse(command.schema, dataMart.storage.type);
|
|
59
61
|
const introducesNativeField = applyServerOwnedFieldStatuses(parsed, dataMart.schema);
|
|
62
|
+
const previousFields = dataMart.schema?.fields ?? [];
|
|
60
63
|
dataMart.schema = parsed;
|
|
61
64
|
if (introducesNativeField) {
|
|
62
65
|
dataMart.schemaActualizedAt = null;
|
|
@@ -102,7 +105,11 @@ let UpdateDataMartSchemaService = UpdateDataMartSchemaService_1 = class UpdateDa
|
|
|
102
105
|
await this.saveAndInvalidate(dataMart);
|
|
103
106
|
await this.searchIndexInvalidation?.scheduleDataMartSchemaChanged(dataMart.id, command.projectId);
|
|
104
107
|
this.logger.debug(`Data mart ${command.id} schema updated`);
|
|
105
|
-
return {
|
|
108
|
+
return {
|
|
109
|
+
...this.mapper.toDomainDto(dataMart),
|
|
110
|
+
warnings: (0, join_grain_1.withoutUntouchedJoinAdvisories)(warnings, editedCalculatedFields(previousFields, calculatedFields), (0, data_mart_schema_utils_1.declaredPrimaryKeyFields)(previousFields).sort().join('\n') !==
|
|
111
|
+
(0, data_mart_schema_utils_1.declaredPrimaryKeyFields)(parsed.fields).sort().join('\n')),
|
|
112
|
+
};
|
|
106
113
|
}
|
|
107
114
|
async saveAndInvalidate(dataMart) {
|
|
108
115
|
await this.dataMartService.save(dataMart);
|
|
@@ -158,4 +165,10 @@ function applyFieldStatuses(fields, persistedFields) {
|
|
|
158
165
|
function nestedFieldsOf(field) {
|
|
159
166
|
return 'fields' in field && Array.isArray(field.fields) ? field.fields : undefined;
|
|
160
167
|
}
|
|
168
|
+
function editedCalculatedFields(previousFields, calculatedFields) {
|
|
169
|
+
const previous = new Map((0, calculated_field_utils_1.calculatedFieldsOf)(previousFields).map(field => [field.name, field.calculated.formula]));
|
|
170
|
+
return new Set(calculatedFields
|
|
171
|
+
.filter(field => previous.get(field.name) !== field.calculated.formula)
|
|
172
|
+
.map(field => field.name));
|
|
173
|
+
}
|
|
161
174
|
//# sourceMappingURL=update-data-mart-schema.service.js.map
|
|
@@ -32,6 +32,7 @@ const report_access_service_1 = require("../services/report-access.service");
|
|
|
32
32
|
const report_data_cache_service_1 = require("../services/report-data-cache.service");
|
|
33
33
|
const output_controls_validator_service_1 = require("../services/output-controls-validator.service");
|
|
34
34
|
const unique_count_sources_1 = require("../dto/schemas/unique-count-sources");
|
|
35
|
+
const auto_aggregation_opt_out_schema_1 = require("../dto/schemas/auto-aggregation-opt-out.schema");
|
|
35
36
|
const advanced_search_index_sync_service_1 = require("../services/advanced-search-index-sync.service");
|
|
36
37
|
const search_facade_1 = require("../../common/search/search.facade");
|
|
37
38
|
let UpdateReportService = class UpdateReportService {
|
|
@@ -132,6 +133,11 @@ let UpdateReportService = class UpdateReportService {
|
|
|
132
133
|
const previousDateTruncConfig = report.dateTruncConfig ?? null;
|
|
133
134
|
const nextDateTruncConfig = command.dateTruncConfig ?? null;
|
|
134
135
|
const dateTruncChanged = JSON.stringify(previousDateTruncConfig) !== JSON.stringify(nextDateTruncConfig);
|
|
136
|
+
const previousAutoAggregationOptOut = (0, auto_aggregation_opt_out_schema_1.foldEmptyAutoAggregationOptOut)(report.autoAggregationOptOut);
|
|
137
|
+
const nextAutoAggregationOptOut = (0, auto_aggregation_opt_out_schema_1.selectedAutoAggregationOptOut)(command.autoAggregationOptOut === undefined
|
|
138
|
+
? previousAutoAggregationOptOut
|
|
139
|
+
: command.autoAggregationOptOut, nextColumnConfig);
|
|
140
|
+
const autoAggregationOptOutChanged = JSON.stringify(previousAutoAggregationOptOut) !== JSON.stringify(nextAutoAggregationOptOut);
|
|
135
141
|
report.title = command.title;
|
|
136
142
|
report.dataDestination = dataDestination;
|
|
137
143
|
report.destinationConfig = command.destinationConfig;
|
|
@@ -142,6 +148,7 @@ let UpdateReportService = class UpdateReportService {
|
|
|
142
148
|
report.aggregationConfig = nextAggregationConfig;
|
|
143
149
|
report.dateTruncConfig = nextDateTruncConfig;
|
|
144
150
|
report.uniqueCountConfig = nextUniqueCountConfig;
|
|
151
|
+
report.autoAggregationOptOut = nextAutoAggregationOptOut;
|
|
145
152
|
const updatedReport = await this.reportRepository.save(report);
|
|
146
153
|
await this.advancedSearchIndexSync?.scheduleReindex(search_facade_1.SearchableEntityType.REPORT, updatedReport.id, command.projectId);
|
|
147
154
|
if (command.ownerIds !== undefined) {
|
|
@@ -158,7 +165,8 @@ let UpdateReportService = class UpdateReportService {
|
|
|
158
165
|
limitChanged ||
|
|
159
166
|
aggregationChanged ||
|
|
160
167
|
dateTruncChanged ||
|
|
161
|
-
uniqueCountChanged
|
|
168
|
+
uniqueCountChanged ||
|
|
169
|
+
autoAggregationOptOutChanged) {
|
|
162
170
|
await this.reportDataCacheService.invalidateByReportId(updatedReport.id);
|
|
163
171
|
}
|
|
164
172
|
const fresh = await this.reportRepository.findOne({
|
package/dist/src/ee/ee.module.js
CHANGED
|
@@ -15,15 +15,13 @@ const mcp_resource_module_1 = require("../mcp-resource/mcp-resource.module");
|
|
|
15
15
|
const project_settings_module_1 = require("../project-settings/project-settings.module");
|
|
16
16
|
const idp_mcp_auth_adapter_1 = require("./mcp/auth/idp-mcp-auth.adapter");
|
|
17
17
|
const mcp_auth_port_1 = require("./mcp/auth/mcp-auth.port");
|
|
18
|
-
const
|
|
19
|
-
const mcp_auth_guard_1 = require("./mcp/auth/mcp-auth.guard");
|
|
18
|
+
const mcp_auth_middleware_1 = require("./mcp/auth/mcp-auth.middleware");
|
|
20
19
|
const mcp_config_1 = require("./mcp/config/mcp.config");
|
|
21
20
|
const mcp_metadata_controller_1 = require("./mcp/controllers/mcp-metadata.controller");
|
|
22
|
-
const mcp_transport_controller_1 = require("./mcp/controllers/mcp-transport.controller");
|
|
23
21
|
const mcp_bus_extras_module_1 = require("./mcp/observability/mcp-bus-extras.module");
|
|
24
22
|
const mcp_call_instrumentation_1 = require("./mcp/observability/mcp-call-instrumentation");
|
|
25
23
|
const mcp_sdk_server_factory_1 = require("./mcp/sdk/mcp-sdk-server.factory");
|
|
26
|
-
const
|
|
24
|
+
const mcp_http_entry_service_1 = require("./mcp/transport/mcp-http-entry.service");
|
|
27
25
|
const mcp_instructions_service_1 = require("./mcp/instructions/mcp-instructions.service");
|
|
28
26
|
const mcp_tool_providers_1 = require("./mcp/tools/mcp-tool.providers");
|
|
29
27
|
const mcp_tool_registry_1 = require("./mcp/tools/mcp-tool.registry");
|
|
@@ -40,7 +38,7 @@ exports.EeModule = EeModule = __decorate([
|
|
|
40
38
|
project_settings_module_1.ProjectSettingsModule,
|
|
41
39
|
mcp_bus_extras_module_1.McpBusExtrasModule,
|
|
42
40
|
],
|
|
43
|
-
controllers: [mcp_metadata_controller_1.McpMetadataController
|
|
41
|
+
controllers: [mcp_metadata_controller_1.McpMetadataController],
|
|
44
42
|
providers: [
|
|
45
43
|
mcp_config_1.McpConfigService,
|
|
46
44
|
idp_mcp_auth_adapter_1.IdpMcpAuthAdapter,
|
|
@@ -48,15 +46,14 @@ exports.EeModule = EeModule = __decorate([
|
|
|
48
46
|
provide: mcp_auth_port_1.MCP_AUTH_PORT,
|
|
49
47
|
useExisting: idp_mcp_auth_adapter_1.IdpMcpAuthAdapter,
|
|
50
48
|
},
|
|
51
|
-
|
|
52
|
-
mcp_auth_exception_filter_1.McpAuthExceptionFilter,
|
|
49
|
+
mcp_auth_middleware_1.McpAuthMiddleware,
|
|
53
50
|
...mcp_tool_providers_1.MCP_TOOL_PROVIDER_CLASSES,
|
|
54
51
|
mcp_tool_providers_1.MCP_TOOL_DEFINITIONS_PROVIDER,
|
|
55
52
|
mcp_tool_registry_1.McpToolRegistry,
|
|
56
53
|
mcp_call_instrumentation_1.McpCallInstrumentation,
|
|
57
54
|
mcp_sdk_server_factory_1.McpSdkServerFactory,
|
|
58
55
|
mcp_instructions_service_1.McpInstructionsService,
|
|
59
|
-
|
|
56
|
+
mcp_http_entry_service_1.McpHttpEntryService,
|
|
60
57
|
],
|
|
61
58
|
exports: [mcp_config_1.McpConfigService],
|
|
62
59
|
})
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
|
+
import type { AuthInfo } from '@modelcontextprotocol/server';
|
|
3
|
+
import type { McpTokenPayload } from '@owox/idp-protocol';
|
|
4
|
+
import { McpResourceResolverService } from '../../../mcp-resource/mcp-resource-resolver.service';
|
|
5
|
+
import { McpConfigService } from '../config/mcp.config';
|
|
6
|
+
import { type McpAuthPort } from './mcp-auth.port';
|
|
7
|
+
export interface McpAuthenticatedRequest extends Request {
|
|
8
|
+
auth?: AuthInfo;
|
|
9
|
+
}
|
|
10
|
+
export declare class McpAuthMiddleware {
|
|
11
|
+
private readonly auth;
|
|
12
|
+
private readonly resourceResolver;
|
|
13
|
+
private readonly config;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
constructor(auth: McpAuthPort, resourceResolver: McpResourceResolverService, config: McpConfigService);
|
|
16
|
+
handle: RequestHandler;
|
|
17
|
+
private verify;
|
|
18
|
+
private reject;
|
|
19
|
+
private rejectUnexpected;
|
|
20
|
+
private extractBearerToken;
|
|
21
|
+
private getRequestedSessionId;
|
|
22
|
+
private assertPayload;
|
|
23
|
+
private getChallengeHeader;
|
|
24
|
+
private isExpectedAnonymousProbe;
|
|
25
|
+
}
|
|
26
|
+
export declare function toMcpAuthContext(authInfo: AuthInfo | undefined): McpTokenPayload;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var McpAuthMiddleware_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.McpAuthMiddleware = void 0;
|
|
17
|
+
exports.toMcpAuthContext = toMcpAuthContext;
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const internal_helpers_1 = require("@owox/internal-helpers");
|
|
20
|
+
const mcp_resource_resolver_service_1 = require("../../../mcp-resource/mcp-resource-resolver.service");
|
|
21
|
+
const mcp_config_1 = require("../config/mcp.config");
|
|
22
|
+
const http_headers_util_1 = require("../http-headers.util");
|
|
23
|
+
const mcp_auth_port_1 = require("./mcp-auth.port");
|
|
24
|
+
const REQUIRED_SCOPES = ['mcp:read'];
|
|
25
|
+
class McpAuthRejection extends Error {
|
|
26
|
+
constructor(message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = 'McpAuthRejection';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let McpAuthMiddleware = McpAuthMiddleware_1 = class McpAuthMiddleware {
|
|
32
|
+
auth;
|
|
33
|
+
resourceResolver;
|
|
34
|
+
config;
|
|
35
|
+
logger = new common_1.Logger(McpAuthMiddleware_1.name);
|
|
36
|
+
constructor(auth, resourceResolver, config) {
|
|
37
|
+
this.auth = auth;
|
|
38
|
+
this.resourceResolver = resourceResolver;
|
|
39
|
+
this.config = config;
|
|
40
|
+
}
|
|
41
|
+
handle = async (request, response, next) => {
|
|
42
|
+
let resourceContext = null;
|
|
43
|
+
try {
|
|
44
|
+
resourceContext = this.resourceResolver.tryResolveRequest(request);
|
|
45
|
+
request.auth = await this.verify(request, resourceContext);
|
|
46
|
+
next();
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof McpAuthRejection) {
|
|
50
|
+
this.reject(request, response, error.message, resourceContext);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
this.rejectUnexpected(request, response, error);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
async verify(request, resourceContext) {
|
|
58
|
+
const token = this.extractBearerToken(request);
|
|
59
|
+
if (!resourceContext) {
|
|
60
|
+
throw new McpAuthRejection('Invalid MCP resource');
|
|
61
|
+
}
|
|
62
|
+
const payload = await this.auth.verifyToken(token, resourceContext.resource, REQUIRED_SCOPES);
|
|
63
|
+
if (!payload) {
|
|
64
|
+
throw new McpAuthRejection('Invalid MCP bearer token');
|
|
65
|
+
}
|
|
66
|
+
this.assertPayload(payload, resourceContext);
|
|
67
|
+
this.logger.debug('MCP auth accepted', {
|
|
68
|
+
method: request.method,
|
|
69
|
+
url: request.originalUrl ?? request.url,
|
|
70
|
+
requestSessionId: this.getRequestedSessionId(request),
|
|
71
|
+
projectId: payload.projectId,
|
|
72
|
+
clientId: payload.clientId,
|
|
73
|
+
resource: payload.resource,
|
|
74
|
+
scopes: payload.scopes,
|
|
75
|
+
roles: payload.roles,
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
token,
|
|
79
|
+
clientId: payload.clientId,
|
|
80
|
+
scopes: payload.scopes,
|
|
81
|
+
extra: { mcpContext: payload },
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
reject(request, response, message, resourceContext) {
|
|
85
|
+
const metadata = {
|
|
86
|
+
method: request.method,
|
|
87
|
+
url: request.originalUrl ?? request.url,
|
|
88
|
+
requestSessionId: this.getRequestedSessionId(request),
|
|
89
|
+
accept: request.headers?.accept,
|
|
90
|
+
contentType: request.headers?.['content-type'],
|
|
91
|
+
hasAuthorization: Boolean(request.headers?.authorization),
|
|
92
|
+
message,
|
|
93
|
+
};
|
|
94
|
+
if (this.isExpectedAnonymousProbe(request, message)) {
|
|
95
|
+
this.logger.log('MCP auth rejected', metadata);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this.logger.warn('MCP auth rejected', metadata);
|
|
99
|
+
}
|
|
100
|
+
response.setHeader('WWW-Authenticate', this.getChallengeHeader(resourceContext));
|
|
101
|
+
response.status(401).json({
|
|
102
|
+
statusCode: 401,
|
|
103
|
+
message,
|
|
104
|
+
error: 'Unauthorized',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
rejectUnexpected(request, response, error) {
|
|
108
|
+
this.logger.error('MCP auth failed unexpectedly', {
|
|
109
|
+
method: request.method,
|
|
110
|
+
url: request.originalUrl ?? request.url,
|
|
111
|
+
requestSessionId: this.getRequestedSessionId(request),
|
|
112
|
+
message: (0, internal_helpers_1.castError)(error).message,
|
|
113
|
+
});
|
|
114
|
+
response.status(500).json({
|
|
115
|
+
statusCode: 500,
|
|
116
|
+
message: 'Internal server error',
|
|
117
|
+
error: 'Internal Server Error',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
extractBearerToken(request) {
|
|
121
|
+
const authorization = request.headers.authorization;
|
|
122
|
+
const value = Array.isArray(authorization) ? authorization[0] : authorization;
|
|
123
|
+
if (!value?.startsWith('Bearer ')) {
|
|
124
|
+
throw new McpAuthRejection('Missing MCP bearer token');
|
|
125
|
+
}
|
|
126
|
+
const token = value.slice('Bearer '.length).trim();
|
|
127
|
+
if (!token) {
|
|
128
|
+
throw new McpAuthRejection('Missing MCP bearer token');
|
|
129
|
+
}
|
|
130
|
+
return token;
|
|
131
|
+
}
|
|
132
|
+
getRequestedSessionId(request) {
|
|
133
|
+
return (0, http_headers_util_1.firstHeaderValue)(request, 'mcp-session-id');
|
|
134
|
+
}
|
|
135
|
+
assertPayload(payload, resourceContext) {
|
|
136
|
+
if (payload.authFlow !== 'mcp') {
|
|
137
|
+
throw new McpAuthRejection('Invalid MCP auth flow');
|
|
138
|
+
}
|
|
139
|
+
if (payload.resource !== resourceContext.resource) {
|
|
140
|
+
throw new McpAuthRejection('Invalid MCP resource');
|
|
141
|
+
}
|
|
142
|
+
if (resourceContext.kind === 'project' && payload.projectId !== resourceContext.projectId) {
|
|
143
|
+
throw new McpAuthRejection('Invalid MCP project context');
|
|
144
|
+
}
|
|
145
|
+
if (!payload.projectId) {
|
|
146
|
+
throw new McpAuthRejection('Missing MCP project context');
|
|
147
|
+
}
|
|
148
|
+
if (!payload.roles.length) {
|
|
149
|
+
throw new McpAuthRejection('Missing MCP project roles');
|
|
150
|
+
}
|
|
151
|
+
for (const scope of REQUIRED_SCOPES) {
|
|
152
|
+
if (!payload.scopes.includes(scope)) {
|
|
153
|
+
throw new McpAuthRejection('Missing MCP scope');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
getChallengeHeader(resourceContext) {
|
|
158
|
+
const metadataUrl = resourceContext
|
|
159
|
+
? `${resourceContext.publicBaseUrl}/.well-known/oauth-protected-resource`
|
|
160
|
+
: this.config.protectedResourceMetadataUrl;
|
|
161
|
+
return `Bearer resource_metadata="${metadataUrl}", scope="${this.config.scopes.join(' ')}"`;
|
|
162
|
+
}
|
|
163
|
+
isExpectedAnonymousProbe(request, message) {
|
|
164
|
+
return (request.method === 'GET' &&
|
|
165
|
+
(request.originalUrl ?? request.url) === '/mcp' &&
|
|
166
|
+
!request.headers?.authorization &&
|
|
167
|
+
message === 'Missing MCP bearer token');
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
exports.McpAuthMiddleware = McpAuthMiddleware;
|
|
171
|
+
exports.McpAuthMiddleware = McpAuthMiddleware = McpAuthMiddleware_1 = __decorate([
|
|
172
|
+
(0, common_1.Injectable)(),
|
|
173
|
+
__param(0, (0, common_1.Inject)(mcp_auth_port_1.MCP_AUTH_PORT)),
|
|
174
|
+
__metadata("design:paramtypes", [Object, mcp_resource_resolver_service_1.McpResourceResolverService,
|
|
175
|
+
mcp_config_1.McpConfigService])
|
|
176
|
+
], McpAuthMiddleware);
|
|
177
|
+
function toMcpAuthContext(authInfo) {
|
|
178
|
+
const mcpContext = authInfo?.extra?.mcpContext;
|
|
179
|
+
if (!mcpContext) {
|
|
180
|
+
throw new Error('MCP request reached the server factory without a verified auth context');
|
|
181
|
+
}
|
|
182
|
+
return mcpContext;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=mcp-auth.middleware.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.firstHeaderValue = firstHeaderValue;
|
|
4
|
+
function firstHeaderValue(request, name) {
|
|
5
|
+
const header = request.headers?.[name];
|
|
6
|
+
return Array.isArray(header) ? header[0] : header;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=http-headers.util.js.map
|
|
@@ -3,15 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.mcpOffloadPathBuilder = mcpOffloadPathBuilder;
|
|
4
4
|
exports.mcpSpanMapper = mcpSpanMapper;
|
|
5
5
|
exports.buildMcpBusExtras = buildMcpBusExtras;
|
|
6
|
-
const
|
|
6
|
+
const zod_v4_1 = require("zod-v4");
|
|
7
7
|
const node_crypto_1 = require("node:crypto");
|
|
8
8
|
const internal_helpers_1 = require("@owox/internal-helpers");
|
|
9
9
|
const DEFAULT_INLINE_MAX_BYTES = 4096;
|
|
10
10
|
const GCS_TIMEOUT_MS = 10000;
|
|
11
11
|
const logger = internal_helpers_1.LoggerFactory.createNamedLogger('McpBusWiring');
|
|
12
|
-
const logSchema =
|
|
13
|
-
MCP_LOG_GCS_BUCKET:
|
|
14
|
-
MCP_LOG_INLINE_MAX_BYTES:
|
|
12
|
+
const logSchema = zod_v4_1.z.object({
|
|
13
|
+
MCP_LOG_GCS_BUCKET: zod_v4_1.z.string().trim().min(1).optional().catch(undefined),
|
|
14
|
+
MCP_LOG_INLINE_MAX_BYTES: zod_v4_1.z.coerce.number().int().positive().optional().catch(undefined),
|
|
15
15
|
});
|
|
16
16
|
function mcpOffloadPathBuilder(payload) {
|
|
17
17
|
const date = new Date().toISOString().slice(0, 10);
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
+
import type { ServerContext } from '@modelcontextprotocol/server';
|
|
1
2
|
import { OwoxEventDispatcher } from '../../../common/event-dispatcher/owox-event-dispatcher';
|
|
2
3
|
import { ClsContextService } from '../../../common/logger/cls-context.service';
|
|
3
4
|
import type { McpToolResult } from '../tools/mcp-tool.definition';
|
|
4
|
-
export type SdkToolCallback = (input: unknown,
|
|
5
|
-
signal?: AbortSignal;
|
|
6
|
-
_meta?: Record<string, unknown>;
|
|
7
|
-
}) => Promise<McpToolResult>;
|
|
5
|
+
export type SdkToolCallback = (input: unknown, ctx?: ServerContext) => Promise<McpToolResult>;
|
|
8
6
|
export declare class McpCallInstrumentation {
|
|
9
7
|
private readonly dispatcher;
|
|
10
8
|
private readonly cls;
|
|
@@ -24,7 +24,7 @@ let McpCallInstrumentation = class McpCallInstrumentation {
|
|
|
24
24
|
this.cls = cls;
|
|
25
25
|
}
|
|
26
26
|
wrap(toolName, callback) {
|
|
27
|
-
return async (input,
|
|
27
|
+
return async (input, ctx) => {
|
|
28
28
|
try {
|
|
29
29
|
this.cls.set(mcp_tool_diagnostics_1.MCP_TOOL_DIAGNOSTICS_KEY, {});
|
|
30
30
|
}
|
|
@@ -32,21 +32,21 @@ let McpCallInstrumentation = class McpCallInstrumentation {
|
|
|
32
32
|
}
|
|
33
33
|
const startedAt = Date.now();
|
|
34
34
|
try {
|
|
35
|
-
const result = await callback(input,
|
|
36
|
-
this.emit(toolName, input, Date.now() - startedAt, { result },
|
|
35
|
+
const result = await callback(input, ctx);
|
|
36
|
+
this.emit(toolName, input, Date.now() - startedAt, { result }, ctx);
|
|
37
37
|
return result;
|
|
38
38
|
}
|
|
39
39
|
catch (error) {
|
|
40
|
-
this.emit(toolName, input, Date.now() - startedAt, { error },
|
|
40
|
+
this.emit(toolName, input, Date.now() - startedAt, { error }, ctx);
|
|
41
41
|
throw error;
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
-
emit(toolName, input, durationMs, outcome,
|
|
45
|
+
emit(toolName, input, durationMs, outcome, ctx) {
|
|
46
46
|
try {
|
|
47
47
|
const context = this.cls.get(mcp_log_context_1.MCP_LOG_CONTEXT_KEY) ?? {};
|
|
48
48
|
const diagnostics = this.cls.get(mcp_tool_diagnostics_1.MCP_TOOL_DIAGNOSTICS_KEY) ?? {};
|
|
49
|
-
const meta =
|
|
49
|
+
const meta = ctx?.mcpReq?._meta;
|
|
50
50
|
const event = (0, mcp_tool_call_event_1.buildMcpToolCallEvent)({
|
|
51
51
|
methodName: 'tools/call',
|
|
52
52
|
toolName,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { McpServer } from '@modelcontextprotocol/
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/server';
|
|
2
2
|
import type { McpAuthContext } from '../auth/mcp-auth-context';
|
|
3
3
|
import { McpConfigService } from '../config/mcp.config';
|
|
4
4
|
import { McpCallInstrumentation } from '../observability/mcp-call-instrumentation';
|
|
@@ -11,7 +11,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.McpSdkServerFactory = void 0;
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
|
-
const
|
|
14
|
+
const server_1 = require("@modelcontextprotocol/server");
|
|
15
15
|
const mcp_config_1 = require("../config/mcp.config");
|
|
16
16
|
const mcp_call_instrumentation_1 = require("../observability/mcp-call-instrumentation");
|
|
17
17
|
const mcp_tool_registry_1 = require("../tools/mcp-tool.registry");
|
|
@@ -30,13 +30,13 @@ let McpSdkServerFactory = class McpSdkServerFactory {
|
|
|
30
30
|
version: this.config.serverVersion,
|
|
31
31
|
};
|
|
32
32
|
const server = instructions
|
|
33
|
-
? new
|
|
34
|
-
: new
|
|
33
|
+
? new server_1.McpServer(serverInfo, { instructions })
|
|
34
|
+
: new server_1.McpServer(serverInfo);
|
|
35
35
|
const sdkToolRegistrar = server;
|
|
36
36
|
for (const tool of this.toolRegistry.getTools()) {
|
|
37
|
-
const wrapped = this.instrumentation.wrap(tool.name, async (input,
|
|
37
|
+
const wrapped = this.instrumentation.wrap(tool.name, async (input, ctx) => {
|
|
38
38
|
this.assertScopes(mcpContext, tool.requiredScopes);
|
|
39
|
-
return tool.handler(input, mcpContext,
|
|
39
|
+
return tool.handler(input, mcpContext, ctx?.mcpReq?.signal);
|
|
40
40
|
});
|
|
41
41
|
sdkToolRegistrar.registerTool(tool.name, {
|
|
42
42
|
description: tool.description,
|
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
1
|
+
import { z } from 'zod-v4';
|
|
2
2
|
import type { McpScope } from '@owox/idp-protocol';
|
|
3
3
|
import { PublicOriginService } from '../../../common/config/public-origin.service';
|
|
4
4
|
import { type McpDataDestinationsFacade } from '../../../data-marts/facades/mcp-data-destinations.facade';
|
|
5
5
|
import type { McpAuthContext } from '../auth/mcp-auth-context';
|
|
6
6
|
import { type McpToolDefinition, type McpToolResult } from './mcp-tool.definition';
|
|
7
7
|
declare const inputSchema: z.ZodObject<{
|
|
8
|
-
destination_type: z.ZodEnum<
|
|
8
|
+
destination_type: z.ZodEnum<{
|
|
9
|
+
email: "email";
|
|
10
|
+
looker_studio: "looker_studio";
|
|
11
|
+
google_sheets: "google_sheets";
|
|
12
|
+
slack: "slack";
|
|
13
|
+
teams: "teams";
|
|
14
|
+
google_chat: "google_chat";
|
|
15
|
+
}>;
|
|
9
16
|
title: z.ZodOptional<z.ZodString>;
|
|
10
|
-
emails: z.ZodOptional<z.ZodArray<z.ZodString
|
|
11
|
-
},
|
|
12
|
-
destination_type: "email" | "looker_studio" | "google_sheets" | "slack" | "teams" | "google_chat";
|
|
13
|
-
title?: string | undefined;
|
|
14
|
-
emails?: string[] | undefined;
|
|
15
|
-
}, {
|
|
16
|
-
destination_type: "email" | "looker_studio" | "google_sheets" | "slack" | "teams" | "google_chat";
|
|
17
|
-
title?: string | undefined;
|
|
18
|
-
emails?: string[] | undefined;
|
|
19
|
-
}>;
|
|
17
|
+
emails: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
18
|
+
}, z.core.$strict>;
|
|
20
19
|
type AddDestinationInput = z.infer<typeof inputSchema>;
|
|
21
20
|
export declare class AddDestinationTool implements McpToolDefinition<AddDestinationInput> {
|
|
22
21
|
private readonly destinations;
|
|
@@ -24,9 +23,16 @@ export declare class AddDestinationTool implements McpToolDefinition<AddDestinat
|
|
|
24
23
|
readonly name = "add_destination";
|
|
25
24
|
readonly description: string;
|
|
26
25
|
readonly zodSchema: {
|
|
27
|
-
destination_type: z.ZodEnum<
|
|
26
|
+
destination_type: z.ZodEnum<{
|
|
27
|
+
email: "email";
|
|
28
|
+
looker_studio: "looker_studio";
|
|
29
|
+
google_sheets: "google_sheets";
|
|
30
|
+
slack: "slack";
|
|
31
|
+
teams: "teams";
|
|
32
|
+
google_chat: "google_chat";
|
|
33
|
+
}>;
|
|
28
34
|
title: z.ZodOptional<z.ZodString>;
|
|
29
|
-
emails: z.ZodOptional<z.ZodArray<z.ZodString
|
|
35
|
+
emails: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
36
|
};
|
|
31
37
|
readonly outputSchema: {
|
|
32
38
|
authorization_url: z.ZodOptional<z.ZodString>;
|