@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
|
@@ -0,0 +1,491 @@
|
|
|
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 ConnectorDefinitionService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.ConnectorDefinitionService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
19
|
+
const typeorm_2 = require("typeorm");
|
|
20
|
+
const typeorm_transactional_1 = require("typeorm-transactional");
|
|
21
|
+
const connectors_1 = require("@owox/connectors");
|
|
22
|
+
const business_violation_exception_1 = require("../../../common/exceptions/business-violation.exception");
|
|
23
|
+
const query_error_utils_1 = require("../../../common/typeorm/query-error.utils");
|
|
24
|
+
const custom_connector_dto_1 = require("../../dto/presentation/custom-connector.dto");
|
|
25
|
+
const data_mart_definition_type_enum_1 = require("../../enums/data-mart-definition-type.enum");
|
|
26
|
+
const connector_definition_entity_1 = require("../../entities/connector-definition.entity");
|
|
27
|
+
const connector_definition_version_entity_1 = require("../../entities/connector-definition-version.entity");
|
|
28
|
+
const access_decision_1 = require("../access-decision");
|
|
29
|
+
const data_mart_service_1 = require("../data-mart.service");
|
|
30
|
+
const declarative_manifest_schemas_1 = require("./declarative-manifest-schemas");
|
|
31
|
+
const NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
32
|
+
const MAX_NAME_LENGTH = 255;
|
|
33
|
+
function tombstonedName(name, id) {
|
|
34
|
+
const prefix = `deleted:${id}:`;
|
|
35
|
+
return prefix + name.slice(0, MAX_NAME_LENGTH - prefix.length);
|
|
36
|
+
}
|
|
37
|
+
function blankToNull(value) {
|
|
38
|
+
return typeof value === 'string' && value.trim() !== '' ? value : null;
|
|
39
|
+
}
|
|
40
|
+
const RESERVED_NAMES = new Set((connectors_1.AvailableConnectors ?? []).map(name => name.toLowerCase()));
|
|
41
|
+
const BUNDLED_NAMES = new Set(connectors_1.AvailableConnectors ?? []);
|
|
42
|
+
const SAVE_DRAFT_ATTEMPTS = 3;
|
|
43
|
+
const ACTIVE_VERSION_NUMBER_COLUMNS = ['id', 'version'];
|
|
44
|
+
const VERSION_SUMMARY_COLUMNS = [
|
|
45
|
+
'id',
|
|
46
|
+
'version',
|
|
47
|
+
'status',
|
|
48
|
+
'publishedAt',
|
|
49
|
+
];
|
|
50
|
+
let ConnectorDefinitionService = ConnectorDefinitionService_1 = class ConnectorDefinitionService {
|
|
51
|
+
definitionRepo;
|
|
52
|
+
versionRepo;
|
|
53
|
+
dataMartService;
|
|
54
|
+
accessDecisionService;
|
|
55
|
+
logger = new common_1.Logger(ConnectorDefinitionService_1.name);
|
|
56
|
+
constructor(definitionRepo, versionRepo, dataMartService, accessDecisionService) {
|
|
57
|
+
this.definitionRepo = definitionRepo;
|
|
58
|
+
this.versionRepo = versionRepo;
|
|
59
|
+
this.dataMartService = dataMartService;
|
|
60
|
+
this.accessDecisionService = accessDecisionService;
|
|
61
|
+
}
|
|
62
|
+
async create(projectId, userId, input) {
|
|
63
|
+
this.assertManifestFitsSpawn(input.manifest);
|
|
64
|
+
await this.assertNameAvailable(projectId, input.name);
|
|
65
|
+
let definition;
|
|
66
|
+
try {
|
|
67
|
+
definition = await this.definitionRepo.save(this.definitionRepo.create({
|
|
68
|
+
projectId,
|
|
69
|
+
name: input.name,
|
|
70
|
+
title: input.title,
|
|
71
|
+
description: blankToNull(input.description),
|
|
72
|
+
logo: blankToNull(input.logo),
|
|
73
|
+
docUrl: blankToNull(input.docUrl),
|
|
74
|
+
createdById: userId,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
if (!(0, query_error_utils_1.isUniqueConstraintViolation)(e)) {
|
|
79
|
+
throw e;
|
|
80
|
+
}
|
|
81
|
+
throw new common_1.ConflictException(`A custom connector named '${input.name}' was just created in this project by another request`);
|
|
82
|
+
}
|
|
83
|
+
await this.versionRepo.save(this.versionRepo.create({
|
|
84
|
+
connectorDefinitionId: definition.id,
|
|
85
|
+
version: 1,
|
|
86
|
+
manifest: input.manifest,
|
|
87
|
+
status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.DRAFT,
|
|
88
|
+
createdById: userId,
|
|
89
|
+
}));
|
|
90
|
+
return definition;
|
|
91
|
+
}
|
|
92
|
+
async listByProject(projectId) {
|
|
93
|
+
return this.definitionRepo.find({ where: { projectId } });
|
|
94
|
+
}
|
|
95
|
+
async getById(projectId, id) {
|
|
96
|
+
const def = await this.definitionRepo.findOne({ where: { id, projectId } });
|
|
97
|
+
if (!def) {
|
|
98
|
+
throw new common_1.NotFoundException(`Custom connector '${id}' not found`);
|
|
99
|
+
}
|
|
100
|
+
return def;
|
|
101
|
+
}
|
|
102
|
+
async updateMetadata(projectId, id, patch) {
|
|
103
|
+
await this.getById(projectId, id);
|
|
104
|
+
const columns = {};
|
|
105
|
+
if (patch.title !== undefined) {
|
|
106
|
+
columns.title = patch.title;
|
|
107
|
+
}
|
|
108
|
+
if (patch.description !== undefined) {
|
|
109
|
+
columns.description = patch.description;
|
|
110
|
+
}
|
|
111
|
+
if (patch.logo !== undefined) {
|
|
112
|
+
columns.logo = patch.logo;
|
|
113
|
+
}
|
|
114
|
+
if (patch.docUrl !== undefined) {
|
|
115
|
+
columns.docUrl = patch.docUrl;
|
|
116
|
+
}
|
|
117
|
+
if (Object.keys(columns).length > 0) {
|
|
118
|
+
await this.definitionRepo.update({ id, projectId }, columns);
|
|
119
|
+
}
|
|
120
|
+
return this.getById(projectId, id);
|
|
121
|
+
}
|
|
122
|
+
async listVersions(projectId, id) {
|
|
123
|
+
await this.getById(projectId, id);
|
|
124
|
+
return this.versionRepo.find({
|
|
125
|
+
where: { connectorDefinitionId: id },
|
|
126
|
+
order: { version: 'ASC' },
|
|
127
|
+
select: VERSION_SUMMARY_COLUMNS,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async getVersion(projectId, id, version) {
|
|
131
|
+
await this.getById(projectId, id);
|
|
132
|
+
const row = await this.versionRepo.findOne({
|
|
133
|
+
where: { connectorDefinitionId: id, version },
|
|
134
|
+
});
|
|
135
|
+
if (!row) {
|
|
136
|
+
throw new common_1.NotFoundException(`Version ${version} of connector '${id}' not found`);
|
|
137
|
+
}
|
|
138
|
+
return row;
|
|
139
|
+
}
|
|
140
|
+
async resolveManifest(projectId, name, version) {
|
|
141
|
+
const def = await this.definitionRepo.findOne({ where: { projectId, name } });
|
|
142
|
+
if (!def) {
|
|
143
|
+
throw new common_1.NotFoundException(`Custom connector '${name}' not found`);
|
|
144
|
+
}
|
|
145
|
+
const row = version !== undefined
|
|
146
|
+
? await this.versionRepo.findOne({
|
|
147
|
+
where: {
|
|
148
|
+
connectorDefinitionId: def.id,
|
|
149
|
+
version,
|
|
150
|
+
status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.PUBLISHED,
|
|
151
|
+
},
|
|
152
|
+
})
|
|
153
|
+
: await this.resolveActivePublished(def);
|
|
154
|
+
if (!row) {
|
|
155
|
+
throw new common_1.NotFoundException(`No published ${version !== undefined ? `version ${version}` : 'version'} for connector '${name}'`);
|
|
156
|
+
}
|
|
157
|
+
return row.manifest;
|
|
158
|
+
}
|
|
159
|
+
async tryResolveManifest(projectId, name, version) {
|
|
160
|
+
if (BUNDLED_NAMES.has(name)) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const def = await this.definitionRepo.findOne({ where: { projectId, name } });
|
|
164
|
+
if (!def) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const row = version !== undefined
|
|
168
|
+
? await this.versionRepo.findOne({
|
|
169
|
+
where: {
|
|
170
|
+
connectorDefinitionId: def.id,
|
|
171
|
+
version,
|
|
172
|
+
status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.PUBLISHED,
|
|
173
|
+
},
|
|
174
|
+
})
|
|
175
|
+
: def.activeVersionId
|
|
176
|
+
? await this.versionRepo.findOne({
|
|
177
|
+
where: {
|
|
178
|
+
id: def.activeVersionId,
|
|
179
|
+
status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.PUBLISHED,
|
|
180
|
+
},
|
|
181
|
+
})
|
|
182
|
+
: null;
|
|
183
|
+
if (!row) {
|
|
184
|
+
throw new common_1.BadRequestException(`Custom connector '${name}' has no published version${version !== undefined ? ` ${version}` : ''} to run`);
|
|
185
|
+
}
|
|
186
|
+
return row.manifest;
|
|
187
|
+
}
|
|
188
|
+
async saveDraft(projectId, id, manifest) {
|
|
189
|
+
this.assertManifestFitsSpawn(manifest);
|
|
190
|
+
await this.getById(projectId, id);
|
|
191
|
+
for (let attempt = 0; attempt < SAVE_DRAFT_ATTEMPTS; attempt++) {
|
|
192
|
+
const latest = await this.versionRepo.findOne({
|
|
193
|
+
where: { connectorDefinitionId: id },
|
|
194
|
+
order: { version: 'DESC' },
|
|
195
|
+
});
|
|
196
|
+
if (latest && latest.status === connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.DRAFT) {
|
|
197
|
+
const result = await this.versionRepo.update({ id: latest.id, status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.DRAFT }, { manifest });
|
|
198
|
+
if (result.affected) {
|
|
199
|
+
latest.manifest = manifest;
|
|
200
|
+
return latest;
|
|
201
|
+
}
|
|
202
|
+
const current = await this.versionRepo.findOne({ where: { id: latest.id } });
|
|
203
|
+
if (current?.status === connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.DRAFT) {
|
|
204
|
+
return current;
|
|
205
|
+
}
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
return await this.versionRepo.save(this.versionRepo.create({
|
|
210
|
+
connectorDefinitionId: id,
|
|
211
|
+
version: (latest?.version ?? 0) + 1,
|
|
212
|
+
manifest,
|
|
213
|
+
status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.DRAFT,
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
catch (e) {
|
|
217
|
+
if (!(0, query_error_utils_1.isUniqueConstraintViolation)(e)) {
|
|
218
|
+
throw e;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
throw new common_1.ConflictException(`Connector '${id}' is being changed by another request. Reload it and save again.`);
|
|
223
|
+
}
|
|
224
|
+
async publish(projectId, id, actor) {
|
|
225
|
+
const def = await this.getById(projectId, id);
|
|
226
|
+
await this.assertMayChangeActiveVersion(def, actor, 'Publishing', 'publish');
|
|
227
|
+
const draft = await this.versionRepo.findOne({
|
|
228
|
+
where: { connectorDefinitionId: id, status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.DRAFT },
|
|
229
|
+
order: { version: 'DESC' },
|
|
230
|
+
...(this.canLockRows() ? { lock: { mode: 'pessimistic_write' } } : {}),
|
|
231
|
+
});
|
|
232
|
+
if (!draft) {
|
|
233
|
+
throw new common_1.BadRequestException(`Connector '${id}' has no draft to publish`);
|
|
234
|
+
}
|
|
235
|
+
let model;
|
|
236
|
+
try {
|
|
237
|
+
model = new connectors_1.Core.ManifestParser().parse(JSON.stringify(draft.manifest));
|
|
238
|
+
}
|
|
239
|
+
catch (e) {
|
|
240
|
+
throw new common_1.BadRequestException(`Invalid connector manifest: ${e.message}`);
|
|
241
|
+
}
|
|
242
|
+
this.assertNodesHavePrimaryKeys(draft.manifest);
|
|
243
|
+
(0, declarative_manifest_schemas_1.specificationFromManifest)(draft.manifest);
|
|
244
|
+
(0, declarative_manifest_schemas_1.fieldsSchemaFromManifest)(draft.manifest);
|
|
245
|
+
const displayFields = this.displayFieldsOf(draft.manifest);
|
|
246
|
+
const warnings = this.reportSecretCoverage(def.name, draft.version, model);
|
|
247
|
+
const publishedAt = new Date();
|
|
248
|
+
const flipped = await this.versionRepo.update({ id: draft.id, status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.DRAFT }, { status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.PUBLISHED, publishedAt });
|
|
249
|
+
if (!flipped.affected) {
|
|
250
|
+
throw new common_1.ConflictException(`Connector '${id}' was published by another request. Reload it to see the result.`);
|
|
251
|
+
}
|
|
252
|
+
await this.definitionRepo.update({ id, projectId }, { ...displayFields, activeVersionId: draft.id });
|
|
253
|
+
const published = { ...draft, status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.PUBLISHED, publishedAt };
|
|
254
|
+
return { version: published, warnings };
|
|
255
|
+
}
|
|
256
|
+
canLockRows() {
|
|
257
|
+
return ['mysql', 'mariadb'].includes(String(this.versionRepo.manager?.connection?.options?.type));
|
|
258
|
+
}
|
|
259
|
+
assertNodesHavePrimaryKeys(manifest) {
|
|
260
|
+
const nodes = (manifest.nodes ?? {});
|
|
261
|
+
const problems = Object.entries(nodes)
|
|
262
|
+
.filter(([, node]) => !Array.isArray(node?.uniqueKeys) || node.uniqueKeys.length === 0)
|
|
263
|
+
.map(([name]) => `Node "${name}" has no primary key. Mark the fields that identify a row as its primary key.`);
|
|
264
|
+
if (problems.length > 0) {
|
|
265
|
+
throw new common_1.BadRequestException(problems.join(' '));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async setActiveVersion(projectId, id, version, actor) {
|
|
269
|
+
const def = await this.getById(projectId, id);
|
|
270
|
+
await this.assertMayChangeActiveVersion(def, actor, 'Activating this version', 'activate it');
|
|
271
|
+
const row = await this.versionRepo.findOne({
|
|
272
|
+
where: {
|
|
273
|
+
connectorDefinitionId: id,
|
|
274
|
+
version,
|
|
275
|
+
status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.PUBLISHED,
|
|
276
|
+
},
|
|
277
|
+
});
|
|
278
|
+
if (!row) {
|
|
279
|
+
throw new common_1.BadRequestException(`Connector '${id}' has no published version ${version} to activate`);
|
|
280
|
+
}
|
|
281
|
+
await this.definitionRepo.update({ id, projectId }, { ...this.displayFieldsOf(row.manifest), activeVersionId: row.id });
|
|
282
|
+
return this.getById(projectId, id);
|
|
283
|
+
}
|
|
284
|
+
displayFieldsOf(manifest) {
|
|
285
|
+
const fields = {};
|
|
286
|
+
if (typeof manifest.title === 'string' && manifest.title.trim() !== '') {
|
|
287
|
+
fields.title = manifest.title;
|
|
288
|
+
}
|
|
289
|
+
for (const key of ['description', 'docUrl']) {
|
|
290
|
+
if (key in manifest) {
|
|
291
|
+
const value = manifest[key];
|
|
292
|
+
fields[key] = typeof value === 'string' && value.trim() !== '' ? value : null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const tooLong = [
|
|
296
|
+
typeof fields.title === 'string' && fields.title.length > custom_connector_dto_1.MAX_VARCHAR_LENGTH && 'title',
|
|
297
|
+
typeof fields.docUrl === 'string' && fields.docUrl.length > custom_connector_dto_1.MAX_VARCHAR_LENGTH && 'docUrl',
|
|
298
|
+
typeof fields.description === 'string' &&
|
|
299
|
+
Buffer.byteLength(fields.description) > custom_connector_dto_1.MAX_TEXT_COLUMN_BYTES &&
|
|
300
|
+
'description',
|
|
301
|
+
].filter(Boolean);
|
|
302
|
+
if (tooLong.length > 0) {
|
|
303
|
+
throw new common_1.BadRequestException(`The manifest's ${tooLong.join(', ')} is too long: a title or docs link holds ` +
|
|
304
|
+
`${custom_connector_dto_1.MAX_VARCHAR_LENGTH} characters, a description ${custom_connector_dto_1.MAX_TEXT_COLUMN_BYTES} bytes.`);
|
|
305
|
+
}
|
|
306
|
+
return fields;
|
|
307
|
+
}
|
|
308
|
+
async assertMayChangeActiveVersion(def, actor, change, adminAction) {
|
|
309
|
+
const name = def.name.toLowerCase();
|
|
310
|
+
const connectorMarts = await this.dataMartService.findByProjectIdAndDefinitionType(def.projectId, data_mart_definition_type_enum_1.DataMartDefinitionType.CONNECTOR);
|
|
311
|
+
const followers = connectorMarts.filter(mart => {
|
|
312
|
+
const source = mart.definition?.connector?.source;
|
|
313
|
+
return source?.name?.toLowerCase() === name && typeof source.version !== 'number';
|
|
314
|
+
});
|
|
315
|
+
if (followers.length === 0)
|
|
316
|
+
return;
|
|
317
|
+
const ask = (ids, action) => this.accessDecisionService.canAccessMany(actor.userId, actor.roles, access_decision_1.EntityType.DATA_MART, ids, action, def.projectId);
|
|
318
|
+
const canEdit = await ask(followers.map(mart => mart.id), access_decision_1.Action.EDIT);
|
|
319
|
+
const denied = followers.filter(mart => !canEdit.get(mart.id));
|
|
320
|
+
if (denied.length === 0)
|
|
321
|
+
return;
|
|
322
|
+
const canSee = await ask(denied.map(mart => mart.id), access_decision_1.Action.SEE);
|
|
323
|
+
const named = denied.filter(mart => canSee.get(mart.id)).map(mart => `"${mart.title}"`);
|
|
324
|
+
const unseen = denied.length - named.length;
|
|
325
|
+
const listed = unseen > 0 ? [...named, `${unseen} you cannot see`] : named;
|
|
326
|
+
throw new common_1.ForbiddenException(`${change} would change what runs in Data Marts you cannot edit (${listed.join(', ')}). ` +
|
|
327
|
+
`Ask a project admin to ${adminAction}, or ask for edit access to those Data Marts.`);
|
|
328
|
+
}
|
|
329
|
+
async getActiveVersionNumberForDef(def) {
|
|
330
|
+
if (!def.activeVersionId)
|
|
331
|
+
return null;
|
|
332
|
+
const row = await this.versionRepo.findOne({
|
|
333
|
+
where: { id: def.activeVersionId },
|
|
334
|
+
select: ACTIVE_VERSION_NUMBER_COLUMNS,
|
|
335
|
+
});
|
|
336
|
+
return row ? row.version : null;
|
|
337
|
+
}
|
|
338
|
+
async getActiveVersionNumbersByDefId(defs) {
|
|
339
|
+
const activeVersionIds = defs
|
|
340
|
+
.map(def => def.activeVersionId)
|
|
341
|
+
.filter((id) => Boolean(id));
|
|
342
|
+
if (activeVersionIds.length === 0) {
|
|
343
|
+
return new Map();
|
|
344
|
+
}
|
|
345
|
+
const rows = await this.versionRepo.find({
|
|
346
|
+
where: { id: (0, typeorm_2.In)(activeVersionIds) },
|
|
347
|
+
select: ACTIVE_VERSION_NUMBER_COLUMNS,
|
|
348
|
+
});
|
|
349
|
+
const versionNumberById = new Map(rows.map(row => [row.id, row.version]));
|
|
350
|
+
const byDefId = new Map();
|
|
351
|
+
for (const def of defs) {
|
|
352
|
+
const version = def.activeVersionId ? versionNumberById.get(def.activeVersionId) : undefined;
|
|
353
|
+
if (version !== undefined) {
|
|
354
|
+
byDefId.set(def.id, version);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return byDefId;
|
|
358
|
+
}
|
|
359
|
+
async softDelete(projectId, id) {
|
|
360
|
+
const def = await this.getById(projectId, id);
|
|
361
|
+
const connectorMarts = await this.dataMartService.findByProjectIdAndDefinitionType(projectId, data_mart_definition_type_enum_1.DataMartDefinitionType.CONNECTOR);
|
|
362
|
+
const name = def.name.toLowerCase();
|
|
363
|
+
const referencedDataMarts = connectorMarts
|
|
364
|
+
.filter(mart => {
|
|
365
|
+
const definition = mart.definition;
|
|
366
|
+
return definition?.connector?.source?.name?.toLowerCase() === name;
|
|
367
|
+
})
|
|
368
|
+
.map(mart => mart.id);
|
|
369
|
+
if (referencedDataMarts.length > 0) {
|
|
370
|
+
throw new business_violation_exception_1.BusinessViolationException('Cannot delete the connector because it is referenced by existing data marts.', { referencedDataMarts });
|
|
371
|
+
}
|
|
372
|
+
await this.definitionRepo.update({ id }, { name: tombstonedName(def.name, id) });
|
|
373
|
+
await this.definitionRepo.softDelete(id);
|
|
374
|
+
}
|
|
375
|
+
reportSecretCoverage(connectorName, version, model) {
|
|
376
|
+
const prefix = `Connector '${connectorName}' v${version}:`;
|
|
377
|
+
const autoMarked = model.autoSecretAuthParameters ?? [];
|
|
378
|
+
if (autoMarked.length > 0) {
|
|
379
|
+
this.logger.log(`${prefix} marked ${autoMarked.join(', ')} as SECRET — ` +
|
|
380
|
+
`used by "authentication" but not declared secret in the manifest. ` +
|
|
381
|
+
`These values are stored separately and masked in API responses.`);
|
|
382
|
+
}
|
|
383
|
+
const warnings = [];
|
|
384
|
+
const undeclared = model.undeclaredAuthParameters ?? [];
|
|
385
|
+
if (undeclared.length > 0) {
|
|
386
|
+
warnings.push(`${prefix} "authentication" references undeclared ` +
|
|
387
|
+
`parameter(s) ${undeclared.join(', ')}. They cannot be marked SECRET, so any value ` +
|
|
388
|
+
`supplied under those names stays in plain text in the Data Mart definition. ` +
|
|
389
|
+
`Declare them in "parameters" to have them protected.`);
|
|
390
|
+
}
|
|
391
|
+
for (const entry of model.unprotectedRequestParameters ?? []) {
|
|
392
|
+
const where = entry.usedIn?.length ? ` at ${entry.usedIn.join(', ')}` : '';
|
|
393
|
+
warnings.push(`${prefix} parameter '${entry.parameter}' looks like a ` +
|
|
394
|
+
`credential and is interpolated into a node request${where}, but is not marked SECRET. ` +
|
|
395
|
+
`Its value stays in plain text in the Data Mart definition and is returned to anyone ` +
|
|
396
|
+
`who can read the Data Mart. Add "attributes": ["SECRET"] to the parameter if it is a ` +
|
|
397
|
+
`credential.`);
|
|
398
|
+
}
|
|
399
|
+
for (const parameter of this.collectSecretsCarryingValues(model.parameters)) {
|
|
400
|
+
warnings.push(`${prefix} parameter '${parameter}' is SECRET and declares a ` +
|
|
401
|
+
`default, placeholder or options list. Those are values for a credential field, and ` +
|
|
402
|
+
`the configuration specification — which every project member can read — ` +
|
|
403
|
+
`withholds them, so they will not reach the configuration form. Remove them, or drop the "SECRET" attribute if the value is not ` +
|
|
404
|
+
`a credential.`);
|
|
405
|
+
}
|
|
406
|
+
for (const warning of warnings) {
|
|
407
|
+
this.logger.warn(warning);
|
|
408
|
+
}
|
|
409
|
+
return warnings;
|
|
410
|
+
}
|
|
411
|
+
collectSecretsCarryingValues(parameters, prefix = '') {
|
|
412
|
+
if (!parameters || typeof parameters !== 'object' || Array.isArray(parameters))
|
|
413
|
+
return [];
|
|
414
|
+
const found = [];
|
|
415
|
+
for (const [name, raw] of Object.entries(parameters)) {
|
|
416
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
417
|
+
continue;
|
|
418
|
+
const field = raw;
|
|
419
|
+
const attributes = Array.isArray(field.attributes) ? field.attributes : [];
|
|
420
|
+
const carriesValue = ['default', 'placeholder', 'options'].some(key => field[key] !== undefined);
|
|
421
|
+
if (attributes.includes(connectors_1.Core.CONFIG_ATTRIBUTES.SECRET) && carriesValue) {
|
|
422
|
+
found.push(`${prefix}${name}`);
|
|
423
|
+
}
|
|
424
|
+
for (const branch of Array.isArray(field.oneOf) ? field.oneOf : []) {
|
|
425
|
+
const option = branch;
|
|
426
|
+
found.push(...this.collectSecretsCarryingValues(option.items, `${prefix}${name}.${option.value}.`));
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return found;
|
|
430
|
+
}
|
|
431
|
+
assertManifestFitsSpawn(manifest) {
|
|
432
|
+
const sizeBytes = Buffer.byteLength(JSON.stringify(manifest), 'utf8');
|
|
433
|
+
if (sizeBytes > custom_connector_dto_1.MAX_MANIFEST_SIZE_BYTES) {
|
|
434
|
+
throw new common_1.BadRequestException(`Connector manifest is ${sizeBytes} bytes, over the ${custom_connector_dto_1.MAX_MANIFEST_SIZE_BYTES}-byte limit. ` +
|
|
435
|
+
`A larger manifest cannot be passed to the connector runner, so it would fail on every run.`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
async resolveActivePublished(def) {
|
|
439
|
+
if (!def.activeVersionId)
|
|
440
|
+
return null;
|
|
441
|
+
return this.versionRepo.findOne({
|
|
442
|
+
where: { id: def.activeVersionId, status: connector_definition_version_entity_1.ConnectorDefinitionVersionStatus.PUBLISHED },
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
async assertNameAvailable(projectId, name) {
|
|
446
|
+
if (!NAME_PATTERN.test(name)) {
|
|
447
|
+
throw new common_1.BadRequestException(`Connector name '${name}' is invalid: must start with a letter and contain only letters, digits, or underscores`);
|
|
448
|
+
}
|
|
449
|
+
const normalized = name.toLowerCase();
|
|
450
|
+
if (RESERVED_NAMES.has(normalized)) {
|
|
451
|
+
throw new common_1.BadRequestException(`Connector name '${name}' is reserved by a built-in connector`);
|
|
452
|
+
}
|
|
453
|
+
const namesInProject = await this.definitionRepo.find({
|
|
454
|
+
where: { projectId },
|
|
455
|
+
withDeleted: true,
|
|
456
|
+
select: ['id', 'name'],
|
|
457
|
+
});
|
|
458
|
+
if (namesInProject.some(existing => existing.name.toLowerCase() === normalized)) {
|
|
459
|
+
throw new common_1.BadRequestException(`A custom connector named '${name}' already exists in this project`);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
exports.ConnectorDefinitionService = ConnectorDefinitionService;
|
|
464
|
+
__decorate([
|
|
465
|
+
(0, typeorm_transactional_1.Transactional)(),
|
|
466
|
+
__metadata("design:type", Function),
|
|
467
|
+
__metadata("design:paramtypes", [String, String, Object]),
|
|
468
|
+
__metadata("design:returntype", Promise)
|
|
469
|
+
], ConnectorDefinitionService.prototype, "create", null);
|
|
470
|
+
__decorate([
|
|
471
|
+
(0, typeorm_transactional_1.Transactional)(),
|
|
472
|
+
__metadata("design:type", Function),
|
|
473
|
+
__metadata("design:paramtypes", [String, String, Object]),
|
|
474
|
+
__metadata("design:returntype", Promise)
|
|
475
|
+
], ConnectorDefinitionService.prototype, "publish", null);
|
|
476
|
+
__decorate([
|
|
477
|
+
(0, typeorm_transactional_1.Transactional)(),
|
|
478
|
+
__metadata("design:type", Function),
|
|
479
|
+
__metadata("design:paramtypes", [String, String]),
|
|
480
|
+
__metadata("design:returntype", Promise)
|
|
481
|
+
], ConnectorDefinitionService.prototype, "softDelete", null);
|
|
482
|
+
exports.ConnectorDefinitionService = ConnectorDefinitionService = ConnectorDefinitionService_1 = __decorate([
|
|
483
|
+
(0, common_1.Injectable)(),
|
|
484
|
+
__param(0, (0, typeorm_1.InjectRepository)(connector_definition_entity_1.ConnectorDefinition)),
|
|
485
|
+
__param(1, (0, typeorm_1.InjectRepository)(connector_definition_version_entity_1.ConnectorDefinitionVersion)),
|
|
486
|
+
__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
487
|
+
typeorm_2.Repository,
|
|
488
|
+
data_mart_service_1.DataMartService,
|
|
489
|
+
access_decision_1.AccessDecisionService])
|
|
490
|
+
], ConnectorDefinitionService);
|
|
491
|
+
//# sourceMappingURL=connector-definition.service.js.map
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
1
2
|
import { Repository } from 'typeorm';
|
|
3
|
+
export declare const MAX_MERGED_RUN_OUTPUT_ENTRIES = 10000;
|
|
2
4
|
import { DataMart } from '../../entities/data-mart.entity';
|
|
3
5
|
import { DataMartRun } from '../../entities/data-mart-run.entity';
|
|
4
6
|
import { ConnectorOutputCaptureService } from '../../connector-types/connector-message/services/connector-output-capture.service';
|
|
@@ -8,6 +10,7 @@ import { GracefulShutdownService } from '../../../common/scheduler/services/grac
|
|
|
8
10
|
import { SystemTimeService } from '../../../common/scheduler/services/system-time.service';
|
|
9
11
|
import { OwoxEventDispatcher } from '../../../common/event-dispatcher/owox-event-dispatcher';
|
|
10
12
|
import { ProjectBillingService } from '../project-billing/project-billing.service';
|
|
13
|
+
import { ConnectorDefinitionService } from './connector-definition.service';
|
|
11
14
|
import { ConnectorProcessSpawnerService } from './connector-process-spawner.service';
|
|
12
15
|
import { ConnectorStorageConfigService } from './connector-storage-config.service';
|
|
13
16
|
import { ConnectorSourceConfigService } from './connector-source-config.service';
|
|
@@ -26,9 +29,11 @@ export declare class ConnectorExecutorService {
|
|
|
26
29
|
private readonly eventDispatcher;
|
|
27
30
|
private readonly projectBillingService;
|
|
28
31
|
private readonly dataMartService;
|
|
32
|
+
private readonly connectorDefinitionService;
|
|
29
33
|
private readonly connectorSourceCredentialsService;
|
|
34
|
+
private readonly configService;
|
|
30
35
|
private readonly logger;
|
|
31
|
-
constructor(dataMartRunRepository: Repository<DataMartRun>, processSpawner: ConnectorProcessSpawnerService, storageConfigService: ConnectorStorageConfigService, sourceConfigService: ConnectorSourceConfigService, credentialInjector: ConnectorCredentialInjectorService, connectorOutputCaptureService: ConnectorOutputCaptureService, connectorStateService: ConnectorStateService, gracefulShutdownService: GracefulShutdownService, systemTimeService: SystemTimeService, eventDispatcher: OwoxEventDispatcher, projectBillingService: ProjectBillingService, dataMartService: DataMartService, connectorSourceCredentialsService: ConnectorSourceCredentialsService);
|
|
36
|
+
constructor(dataMartRunRepository: Repository<DataMartRun>, processSpawner: ConnectorProcessSpawnerService, storageConfigService: ConnectorStorageConfigService, sourceConfigService: ConnectorSourceConfigService, credentialInjector: ConnectorCredentialInjectorService, connectorOutputCaptureService: ConnectorOutputCaptureService, connectorStateService: ConnectorStateService, gracefulShutdownService: GracefulShutdownService, systemTimeService: SystemTimeService, eventDispatcher: OwoxEventDispatcher, projectBillingService: ProjectBillingService, dataMartService: DataMartService, connectorDefinitionService: ConnectorDefinitionService, connectorSourceCredentialsService: ConnectorSourceCredentialsService, configService: ConfigService);
|
|
32
37
|
executeInBackground(dataMart: DataMart, run: DataMartRun, payload?: Record<string, unknown> | null, signal?: AbortSignal): Promise<void>;
|
|
33
38
|
private actualizeSchemaAfterConnectorExecution;
|
|
34
39
|
private runConnectorConfigurations;
|
|
@@ -41,7 +46,10 @@ export declare class ConnectorExecutorService {
|
|
|
41
46
|
private findSourceCredentialId;
|
|
42
47
|
private persistBackfillProgress;
|
|
43
48
|
private isSuccessfulConnectorStatus;
|
|
49
|
+
private stripManifestForRunner;
|
|
50
|
+
private createRunLogFlusher;
|
|
44
51
|
private updateRunStatus;
|
|
45
52
|
private mergeWithPersistedOutput;
|
|
53
|
+
private discountFlushedEntries;
|
|
46
54
|
private capMergedEntries;
|
|
47
55
|
}
|