@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,343 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ConnectorTestService = exports.CONNECTOR_TEST_CONCURRENCY_LIMIT_CODE = exports.MAX_TEST_OUTPUT_LENGTH = exports.TEST_DATE_WINDOW_DAYS = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const config_1 = require("@nestjs/config");
|
|
18
|
+
const cross_spawn_1 = require("cross-spawn");
|
|
19
|
+
const connectors_1 = require("@owox/connectors");
|
|
20
|
+
const internal_helpers_1 = require("@owox/internal-helpers");
|
|
21
|
+
const concurrency_limit_exceeded_exception_1 = require("../../../common/exceptions/concurrency-limit-exceeded.exception");
|
|
22
|
+
const custom_connector_dto_1 = require("../../dto/presentation/custom-connector.dto");
|
|
23
|
+
const connector_process_spawner_service_1 = require("./connector-process-spawner.service");
|
|
24
|
+
const SAMPLE_ONLY_FIELD = '__owox_sample__';
|
|
25
|
+
const DEFAULT_TIMEOUT_MS = 20000;
|
|
26
|
+
exports.TEST_DATE_WINDOW_DAYS = 2;
|
|
27
|
+
exports.MAX_TEST_OUTPUT_LENGTH = 16 * 1024 * 1024;
|
|
28
|
+
const DEFAULT_MAX_TESTS_PER_PROJECT = 3;
|
|
29
|
+
const DEFAULT_MAX_TESTS_TOTAL = 10;
|
|
30
|
+
exports.CONNECTOR_TEST_CONCURRENCY_LIMIT_CODE = 'CONNECTOR_TEST_CONCURRENCY_LIMIT';
|
|
31
|
+
const CHILD_EXIT_GRACE_MS = 1000;
|
|
32
|
+
function readRunFailureEnvelope(line) {
|
|
33
|
+
let envelope;
|
|
34
|
+
try {
|
|
35
|
+
envelope = JSON.parse(line);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
if (envelope?.type === 'addWarningToCurrentStatus' && typeof envelope.warning === 'string') {
|
|
41
|
+
return envelope.warning;
|
|
42
|
+
}
|
|
43
|
+
if (envelope?.type === 'error' && typeof envelope.error === 'string') {
|
|
44
|
+
return envelope.error.split('\n')[0].replace(/^\w*Error: /, '');
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
let ConnectorTestService = class ConnectorTestService {
|
|
49
|
+
configService;
|
|
50
|
+
activeTestsByProject = new Map();
|
|
51
|
+
activeTestsTotal = 0;
|
|
52
|
+
constructor(configService) {
|
|
53
|
+
this.configService = configService;
|
|
54
|
+
}
|
|
55
|
+
wrapConfig(configuration) {
|
|
56
|
+
return Object.fromEntries(Object.entries(configuration).map(([k, v]) => [k, { value: v }]));
|
|
57
|
+
}
|
|
58
|
+
pruneToNode(manifest, node) {
|
|
59
|
+
const nodes = (manifest.nodes ?? {});
|
|
60
|
+
if (!nodes[node]) {
|
|
61
|
+
throw new common_1.BadRequestException(`Unknown node "${node}"`);
|
|
62
|
+
}
|
|
63
|
+
return { ...manifest, nodes: { [node]: nodes[node] } };
|
|
64
|
+
}
|
|
65
|
+
selectNodeFields(manifest, node) {
|
|
66
|
+
const nodes = (manifest.nodes ?? {});
|
|
67
|
+
const fields = nodes[node]?.fields ?? {};
|
|
68
|
+
return Object.keys(fields)
|
|
69
|
+
.map(f => `${node} ${f}`)
|
|
70
|
+
.join(', ');
|
|
71
|
+
}
|
|
72
|
+
manifestParseError(manifest) {
|
|
73
|
+
try {
|
|
74
|
+
new connectors_1.Core.ManifestParser().parse(JSON.stringify(manifest));
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
return (0, internal_helpers_1.castError)(e).message;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
assertFitsChildEnv(label, serialized) {
|
|
82
|
+
const sizeBytes = Buffer.byteLength(serialized, 'utf8');
|
|
83
|
+
if (sizeBytes > custom_connector_dto_1.MAX_MANIFEST_SIZE_BYTES) {
|
|
84
|
+
throw new common_1.BadRequestException(`Connector test ${label} is ${sizeBytes} bytes, over the ${custom_connector_dto_1.MAX_MANIFEST_SIZE_BYTES}-byte limit. ` +
|
|
85
|
+
`It is handed to the connector runner as an environment variable, which the operating ` +
|
|
86
|
+
`system refuses past that size.`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
runnerPath() {
|
|
90
|
+
return require.resolve('@owox/connectors/runner');
|
|
91
|
+
}
|
|
92
|
+
stopChild(child) {
|
|
93
|
+
if (child.pid === undefined || child.exitCode !== null || child.signalCode !== null) {
|
|
94
|
+
return Promise.resolve();
|
|
95
|
+
}
|
|
96
|
+
return new Promise(resolve => {
|
|
97
|
+
let done = false;
|
|
98
|
+
const settle = () => {
|
|
99
|
+
if (done)
|
|
100
|
+
return;
|
|
101
|
+
done = true;
|
|
102
|
+
clearTimeout(killTimer);
|
|
103
|
+
clearTimeout(giveUpTimer);
|
|
104
|
+
resolve();
|
|
105
|
+
};
|
|
106
|
+
child.once('close', settle);
|
|
107
|
+
child.once('error', settle);
|
|
108
|
+
const killTimer = setTimeout(() => {
|
|
109
|
+
try {
|
|
110
|
+
child.kill('SIGKILL');
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
}
|
|
114
|
+
}, CHILD_EXIT_GRACE_MS);
|
|
115
|
+
const giveUpTimer = setTimeout(settle, CHILD_EXIT_GRACE_MS * 2);
|
|
116
|
+
try {
|
|
117
|
+
child.kill('SIGTERM');
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
settle();
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
testDateWindow() {
|
|
125
|
+
const todayMs = Date.now();
|
|
126
|
+
return {
|
|
127
|
+
start: new Date(todayMs - (exports.TEST_DATE_WINDOW_DAYS - 1) * 86400000).toISOString().split('T')[0],
|
|
128
|
+
end: new Date(todayMs).toISOString().split('T')[0],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
limit(key, fallback) {
|
|
132
|
+
const configured = Number(this.configService?.get(key, fallback) ?? fallback);
|
|
133
|
+
return Number.isFinite(configured) && configured >= 1 ? Math.floor(configured) : fallback;
|
|
134
|
+
}
|
|
135
|
+
acquireTestSlot(projectId) {
|
|
136
|
+
const perProject = this.limit('MAX_CONNECTOR_TESTS_PER_PROJECT', DEFAULT_MAX_TESTS_PER_PROJECT);
|
|
137
|
+
const total = this.limit('MAX_CONNECTOR_TESTS_TOTAL', DEFAULT_MAX_TESTS_TOTAL);
|
|
138
|
+
const retryAfterSeconds = Math.ceil(DEFAULT_TIMEOUT_MS / 1000);
|
|
139
|
+
const active = this.activeTestsByProject.get(projectId) ?? 0;
|
|
140
|
+
if (active >= perProject) {
|
|
141
|
+
throw new concurrency_limit_exceeded_exception_1.ConcurrencyLimitExceededException(`This project already has ${perProject} connector test${perProject === 1 ? '' : 's'} running. ` +
|
|
142
|
+
`Wait for one to finish, then try again.`, { scope: 'project', limit: perProject, retryAfterSeconds }, exports.CONNECTOR_TEST_CONCURRENCY_LIMIT_CODE);
|
|
143
|
+
}
|
|
144
|
+
if (this.activeTestsTotal >= total) {
|
|
145
|
+
throw new concurrency_limit_exceeded_exception_1.ConcurrencyLimitExceededException(`This deployment already has ${total} connector tests running. Try again in a moment.`, { scope: 'deployment', limit: total, retryAfterSeconds }, exports.CONNECTOR_TEST_CONCURRENCY_LIMIT_CODE);
|
|
146
|
+
}
|
|
147
|
+
this.activeTestsByProject.set(projectId, active + 1);
|
|
148
|
+
this.activeTestsTotal += 1;
|
|
149
|
+
let released = false;
|
|
150
|
+
return () => {
|
|
151
|
+
if (released)
|
|
152
|
+
return;
|
|
153
|
+
released = true;
|
|
154
|
+
this.activeTestsTotal -= 1;
|
|
155
|
+
const remaining = (this.activeTestsByProject.get(projectId) ?? 1) - 1;
|
|
156
|
+
if (remaining > 0)
|
|
157
|
+
this.activeTestsByProject.set(projectId, remaining);
|
|
158
|
+
else
|
|
159
|
+
this.activeTestsByProject.delete(projectId);
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
async runTest(args, hooks = {}) {
|
|
163
|
+
this.assertFitsChildEnv('manifest', JSON.stringify(args.manifest));
|
|
164
|
+
this.assertFitsChildEnv('configuration', JSON.stringify(this.wrapConfig(args.configuration ?? {})));
|
|
165
|
+
const release = this.acquireTestSlot(args.projectId);
|
|
166
|
+
try {
|
|
167
|
+
const result = await this.execute(args, hooks);
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
release();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async execute(args, hooks) {
|
|
175
|
+
const maxRows = args.maxRows ?? 25;
|
|
176
|
+
const maxPages = args.maxPages ?? 1;
|
|
177
|
+
const timeoutMs = args.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
178
|
+
const pruned = this.pruneToNode(args.manifest, args.node);
|
|
179
|
+
const prunedError = this.manifestParseError(pruned);
|
|
180
|
+
if (prunedError) {
|
|
181
|
+
throw new common_1.BadRequestException(`Invalid manifest: ${prunedError}`);
|
|
182
|
+
}
|
|
183
|
+
const untestedNodeError = this.manifestParseError(args.manifest);
|
|
184
|
+
const sourceConfig = this.wrapConfig(args.configuration);
|
|
185
|
+
let sampleOnly = false;
|
|
186
|
+
if (sourceConfig.Fields === undefined) {
|
|
187
|
+
const fieldsSelection = this.selectNodeFields(pruned, args.node);
|
|
188
|
+
if (fieldsSelection) {
|
|
189
|
+
sourceConfig.Fields = { value: fieldsSelection };
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
sampleOnly = true;
|
|
193
|
+
sourceConfig.Fields = { value: `${args.node} ${SAMPLE_ONLY_FIELD}` };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const dateWindow = this.testDateWindow();
|
|
197
|
+
sourceConfig.LastRequestedDate = { value: dateWindow.start };
|
|
198
|
+
sourceConfig.ReimportLookbackWindow = { value: 0 };
|
|
199
|
+
const env = {
|
|
200
|
+
...(0, connector_process_spawner_service_1.inheritConnectorEnv)(),
|
|
201
|
+
OW_DATAMART_ID: 'test',
|
|
202
|
+
OW_RUN_ID: 'test',
|
|
203
|
+
OW_TEST: '1',
|
|
204
|
+
OW_TEST_MAX_ROWS: String(maxRows),
|
|
205
|
+
OW_TEST_MAX_PAGES: String(maxPages),
|
|
206
|
+
OW_MANIFEST: JSON.stringify(pruned),
|
|
207
|
+
OW_CONFIG: JSON.stringify({
|
|
208
|
+
source: { name: String(args.manifest.name ?? 'Custom'), config: sourceConfig },
|
|
209
|
+
storage: { name: 'LiveTest', config: {} },
|
|
210
|
+
}),
|
|
211
|
+
OW_RUN_CONFIG: JSON.stringify({ type: 'INCREMENTAL', data: [], state: {} }),
|
|
212
|
+
};
|
|
213
|
+
if (hooks.hang)
|
|
214
|
+
env.FAKE_HANG = '1';
|
|
215
|
+
if (hooks.env)
|
|
216
|
+
Object.assign(env, hooks.env);
|
|
217
|
+
const marker = connectors_1.Core.TEST_ROW_MARKER;
|
|
218
|
+
const rows = [];
|
|
219
|
+
const logs = [];
|
|
220
|
+
const errorLogs = [];
|
|
221
|
+
let runFailure = null;
|
|
222
|
+
let sample = [];
|
|
223
|
+
return new Promise(resolve => {
|
|
224
|
+
const child = (0, cross_spawn_1.spawn)('node', ['--no-deprecation', this.runnerPath()], {
|
|
225
|
+
env,
|
|
226
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
227
|
+
});
|
|
228
|
+
let settled = false;
|
|
229
|
+
const finish = (error) => {
|
|
230
|
+
if (settled)
|
|
231
|
+
return;
|
|
232
|
+
settled = true;
|
|
233
|
+
clearTimeout(timer);
|
|
234
|
+
stderrBuffer.flush();
|
|
235
|
+
const captured = rows.slice(0, maxRows);
|
|
236
|
+
if (error === null)
|
|
237
|
+
error = runFailure;
|
|
238
|
+
if (error === null && captured.length === 0)
|
|
239
|
+
error = errorLogs[0] ?? null;
|
|
240
|
+
if (error === null && captured.length === 0) {
|
|
241
|
+
logs.push(`Test produced 0 records: the request completed without error but recordSelector.recordPath matched no rows.` +
|
|
242
|
+
(sample.length > 0
|
|
243
|
+
? ` A raw response sample WAS received (${sample.length} record(s)), so recordPath is the likely culprit — compare it against the sample shape.`
|
|
244
|
+
: ` Check recordPath, the request path/queryParameters, and any filters.`) +
|
|
245
|
+
` If this node is fetched by date, note that a live test samples only ` +
|
|
246
|
+
`${dateWindow.start} to ${dateWindow.end}; a window with no data upstream ` +
|
|
247
|
+
`returns 0 records too.`);
|
|
248
|
+
}
|
|
249
|
+
if (untestedNodeError) {
|
|
250
|
+
logs.push(`This test ran only the node "${args.node}". Publishing validates every node, and ` +
|
|
251
|
+
`another node in this manifest cannot be published: ${untestedNodeError}`);
|
|
252
|
+
}
|
|
253
|
+
const result = {
|
|
254
|
+
rows: sampleOnly ? [] : captured,
|
|
255
|
+
logs,
|
|
256
|
+
error,
|
|
257
|
+
sample,
|
|
258
|
+
};
|
|
259
|
+
void this.stopChild(child).then(() => resolve(result));
|
|
260
|
+
};
|
|
261
|
+
const timer = setTimeout(() => finish(`Test run timed out after ${timeoutMs}ms`), timeoutMs);
|
|
262
|
+
let held = 0;
|
|
263
|
+
let overBudget = false;
|
|
264
|
+
const admit = (line) => {
|
|
265
|
+
if (overBudget)
|
|
266
|
+
return false;
|
|
267
|
+
if (held + line.length <= exports.MAX_TEST_OUTPUT_LENGTH) {
|
|
268
|
+
held += line.length;
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
overBudget = true;
|
|
272
|
+
logs.push(`Stopped reading the test output at ${exports.MAX_TEST_OUTPUT_LENGTH / 1024 / 1024} MiB: ` +
|
|
273
|
+
`the rows shown are the ones that arrived by then.`);
|
|
274
|
+
finish(null);
|
|
275
|
+
return false;
|
|
276
|
+
};
|
|
277
|
+
const onLine = (line) => {
|
|
278
|
+
if (!line || !admit(line))
|
|
279
|
+
return;
|
|
280
|
+
if (line.startsWith(marker)) {
|
|
281
|
+
try {
|
|
282
|
+
rows.push(JSON.parse(line.slice(marker.length)));
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
}
|
|
286
|
+
if (rows.length >= maxRows)
|
|
287
|
+
finish(null);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
const evt = JSON.parse(line);
|
|
292
|
+
if (evt && evt.type === 'SAMPLE') {
|
|
293
|
+
sample = Array.isArray(evt.records) ? evt.records : [];
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (evt &&
|
|
297
|
+
evt.type === 'LOG' &&
|
|
298
|
+
evt.level === 'error' &&
|
|
299
|
+
typeof evt.message === 'string') {
|
|
300
|
+
errorLogs.push(evt.message);
|
|
301
|
+
}
|
|
302
|
+
if (evt &&
|
|
303
|
+
evt.type === 'CONTROL' &&
|
|
304
|
+
evt.action === 'failed' &&
|
|
305
|
+
typeof evt.error === 'string') {
|
|
306
|
+
runFailure ??= evt.error;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
}
|
|
311
|
+
logs.push(line);
|
|
312
|
+
};
|
|
313
|
+
const stdoutBuffer = (0, connector_process_spawner_service_1.createCapturedLineBuffer)(onLine);
|
|
314
|
+
const stderrBuffer = (0, connector_process_spawner_service_1.createCapturedLineBuffer)(line => {
|
|
315
|
+
if (!line || !admit(line))
|
|
316
|
+
return;
|
|
317
|
+
logs.push(line);
|
|
318
|
+
const reported = readRunFailureEnvelope(line);
|
|
319
|
+
if (reported !== null)
|
|
320
|
+
runFailure ??= reported;
|
|
321
|
+
});
|
|
322
|
+
child.stdout?.setEncoding('utf8');
|
|
323
|
+
child.stderr?.setEncoding('utf8');
|
|
324
|
+
child.stdout?.on('data', (chunk) => stdoutBuffer.push(chunk));
|
|
325
|
+
child.stderr?.on('data', (chunk) => stderrBuffer.push(chunk));
|
|
326
|
+
child.on('close', code => {
|
|
327
|
+
if (settled)
|
|
328
|
+
return;
|
|
329
|
+
stdoutBuffer.flush();
|
|
330
|
+
stderrBuffer.flush();
|
|
331
|
+
finish(code === 0 ? null : `Test process exited with code ${String(code)}`);
|
|
332
|
+
});
|
|
333
|
+
child.on('error', err => finish(err.message));
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
exports.ConnectorTestService = ConnectorTestService;
|
|
338
|
+
exports.ConnectorTestService = ConnectorTestService = __decorate([
|
|
339
|
+
(0, common_1.Injectable)(),
|
|
340
|
+
__param(0, (0, common_1.Optional)()),
|
|
341
|
+
__metadata("design:paramtypes", [config_1.ConfigService])
|
|
342
|
+
], ConnectorTestService);
|
|
343
|
+
//# sourceMappingURL=connector-test.service.js.map
|
|
@@ -2,15 +2,22 @@ import { ConnectorDefinition } from '../../connector-types/connector-definition'
|
|
|
2
2
|
import { ConnectorSpecification, ConnectorSpecificationItem } from '../../connector-types/connector-specification';
|
|
3
3
|
import { ConnectorFieldsSchema } from '../../connector-types/connector-fields-schema';
|
|
4
4
|
import { ConnectorSourceCredentialsService } from './connector-source-credentials.service';
|
|
5
|
+
import { ConnectorDefinitionService } from './connector-definition.service';
|
|
5
6
|
import type { ConnectorCapabilities } from '../../connector-types/connector-capabilities';
|
|
6
7
|
export declare class ConnectorService {
|
|
7
8
|
private readonly connectorSourceCredentialsService;
|
|
9
|
+
private readonly connectorDefinitionService;
|
|
8
10
|
private readonly logger;
|
|
9
|
-
constructor(connectorSourceCredentialsService: ConnectorSourceCredentialsService);
|
|
11
|
+
constructor(connectorSourceCredentialsService: ConnectorSourceCredentialsService, connectorDefinitionService: ConnectorDefinitionService);
|
|
10
12
|
getAvailableConnectors(): Promise<ConnectorDefinition[]>;
|
|
11
13
|
getConnectorCapabilities(connectorName: string): ConnectorCapabilities;
|
|
14
|
+
resolveConnectorCapabilities(projectId: string, connectorName: string, version?: number): Promise<ConnectorCapabilities>;
|
|
15
|
+
private resolveBundledOrCustom;
|
|
12
16
|
getConnectorSpecification(connectorName: string): Promise<ConnectorSpecification>;
|
|
17
|
+
resolveConnectorSpecification(projectId: string, connectorName: string, version?: number): Promise<ConnectorSpecification>;
|
|
13
18
|
getConnectorFieldsSchema(connectorName: string): Promise<ConnectorFieldsSchema>;
|
|
19
|
+
getSpecificationFromManifest(manifest: Record<string, unknown>): ConnectorSpecification;
|
|
20
|
+
getFieldsSchemaFromManifest(manifest: Record<string, unknown>): ConnectorFieldsSchema;
|
|
14
21
|
getOAuthUiVariables(connectorName: string, fieldPath: string): Promise<Record<string, unknown>>;
|
|
15
22
|
getOAuthUiVariablesExpanded(connectorName: string, fieldPath: string): Promise<Record<string, unknown>>;
|
|
16
23
|
isOAuthEnabled(connectorName: string, fieldPath: string): Promise<boolean>;
|
|
@@ -34,5 +41,4 @@ export declare class ConnectorService {
|
|
|
34
41
|
private validateConnectorExists;
|
|
35
42
|
private createConnectorSource;
|
|
36
43
|
private getConnectorManifest;
|
|
37
|
-
private mapConfigToSchema;
|
|
38
44
|
}
|
|
@@ -16,12 +16,22 @@ const connectors_1 = require("@owox/connectors");
|
|
|
16
16
|
const connector_specification_1 = require("../../connector-types/connector-specification");
|
|
17
17
|
const connector_fields_schema_1 = require("../../connector-types/connector-fields-schema");
|
|
18
18
|
const connector_source_credentials_service_1 = require("./connector-source-credentials.service");
|
|
19
|
+
const connector_definition_service_1 = require("./connector-definition.service");
|
|
19
20
|
const connector_fields_schema_mapper_1 = require("./connector-fields-schema.mapper");
|
|
21
|
+
const connector_specification_mapper_1 = require("./connector-specification.mapper");
|
|
22
|
+
const declarative_manifest_schemas_1 = require("./declarative-manifest-schemas");
|
|
23
|
+
const connector_credential_boundary_error_1 = require("../../errors/connector-credential-boundary.error");
|
|
24
|
+
const NO_CAPABILITIES = Object.freeze({
|
|
25
|
+
singleConfiguration: false,
|
|
26
|
+
copySecretsByValue: false,
|
|
27
|
+
});
|
|
20
28
|
let ConnectorService = ConnectorService_1 = class ConnectorService {
|
|
21
29
|
connectorSourceCredentialsService;
|
|
30
|
+
connectorDefinitionService;
|
|
22
31
|
logger = new common_1.Logger(ConnectorService_1.name);
|
|
23
|
-
constructor(connectorSourceCredentialsService) {
|
|
32
|
+
constructor(connectorSourceCredentialsService, connectorDefinitionService) {
|
|
24
33
|
this.connectorSourceCredentialsService = connectorSourceCredentialsService;
|
|
34
|
+
this.connectorDefinitionService = connectorDefinitionService;
|
|
25
35
|
}
|
|
26
36
|
async getAvailableConnectors() {
|
|
27
37
|
return connectors_1.AvailableConnectors.map(connector => {
|
|
@@ -29,9 +39,9 @@ let ConnectorService = ConnectorService_1 = class ConnectorService {
|
|
|
29
39
|
return {
|
|
30
40
|
name: connector,
|
|
31
41
|
title: manifest.title,
|
|
32
|
-
description: manifest.description,
|
|
33
|
-
logo: manifest.logo,
|
|
34
|
-
docUrl: manifest.docUrl,
|
|
42
|
+
description: manifest.description ?? null,
|
|
43
|
+
logo: manifest.logo ?? null,
|
|
44
|
+
docUrl: manifest.docUrl ?? null,
|
|
35
45
|
};
|
|
36
46
|
});
|
|
37
47
|
}
|
|
@@ -43,12 +53,28 @@ let ConnectorService = ConnectorService_1 = class ConnectorService {
|
|
|
43
53
|
copySecretsByValue: capabilities?.copySecretsByValue === true,
|
|
44
54
|
};
|
|
45
55
|
}
|
|
56
|
+
async resolveConnectorCapabilities(projectId, connectorName, version) {
|
|
57
|
+
return this.resolveBundledOrCustom(projectId, connectorName, version, name => this.getConnectorCapabilities(name), () => NO_CAPABILITIES);
|
|
58
|
+
}
|
|
59
|
+
async resolveBundledOrCustom(projectId, connectorName, version, fromBundled, fromManifest) {
|
|
60
|
+
if (Object.keys(connectors_1.Connectors).includes(connectorName)) {
|
|
61
|
+
return fromBundled(connectorName);
|
|
62
|
+
}
|
|
63
|
+
const manifest = await this.connectorDefinitionService.tryResolveManifest(projectId, connectorName, version);
|
|
64
|
+
if (manifest) {
|
|
65
|
+
return fromManifest(manifest);
|
|
66
|
+
}
|
|
67
|
+
return fromBundled(connectorName);
|
|
68
|
+
}
|
|
46
69
|
async getConnectorSpecification(connectorName) {
|
|
47
70
|
this.validateConnectorExists(connectorName);
|
|
48
71
|
const source = this.createConnectorSource(connectorName);
|
|
49
|
-
const configSchema =
|
|
72
|
+
const configSchema = (0, connector_specification_mapper_1.mapConnectorSpecification)(source.parameters);
|
|
50
73
|
return connector_specification_1.ConnectorSpecification.parse(configSchema);
|
|
51
74
|
}
|
|
75
|
+
async resolveConnectorSpecification(projectId, connectorName, version) {
|
|
76
|
+
return this.resolveBundledOrCustom(projectId, connectorName, version, name => this.getConnectorSpecification(name), manifest => this.getSpecificationFromManifest(manifest));
|
|
77
|
+
}
|
|
52
78
|
async getConnectorFieldsSchema(connectorName) {
|
|
53
79
|
this.validateConnectorExists(connectorName);
|
|
54
80
|
const sourceInstance = this.createConnectorSource(connectorName);
|
|
@@ -63,6 +89,12 @@ let ConnectorService = ConnectorService_1 = class ConnectorService {
|
|
|
63
89
|
const fieldsSchema = (0, connector_fields_schema_mapper_1.mapConnectorFieldsSchema)(sourceFieldsSchema);
|
|
64
90
|
return connector_fields_schema_1.ConnectorFieldsSchema.parse(fieldsSchema);
|
|
65
91
|
}
|
|
92
|
+
getSpecificationFromManifest(manifest) {
|
|
93
|
+
return (0, declarative_manifest_schemas_1.specificationFromManifest)(manifest);
|
|
94
|
+
}
|
|
95
|
+
getFieldsSchemaFromManifest(manifest) {
|
|
96
|
+
return (0, declarative_manifest_schemas_1.fieldsSchemaFromManifest)(manifest);
|
|
97
|
+
}
|
|
66
98
|
async getOAuthUiVariables(connectorName, fieldPath) {
|
|
67
99
|
const specification = await this.getConnectorSpecification(connectorName);
|
|
68
100
|
const paths = fieldPath.split('.');
|
|
@@ -130,10 +162,10 @@ let ConnectorService = ConnectorService_1 = class ConnectorService {
|
|
|
130
162
|
throw new Error(`Credential with ID ${credentialId} not found`);
|
|
131
163
|
}
|
|
132
164
|
if (credential.projectId !== projectId) {
|
|
133
|
-
throw new
|
|
165
|
+
throw new connector_credential_boundary_error_1.ConnectorCredentialBoundaryError(`Credential with ID ${credentialId} not found`);
|
|
134
166
|
}
|
|
135
167
|
if (credential.connectorName !== connectorName) {
|
|
136
|
-
throw new
|
|
168
|
+
throw new connector_credential_boundary_error_1.ConnectorCredentialBoundaryError(`Credential belongs to connector ${credential.connectorName}, not ${connectorName}`);
|
|
137
169
|
}
|
|
138
170
|
const connector = this.createConnectorSource(connectorName);
|
|
139
171
|
const oauthVariables = await this.getOAuthVariablesForRefresh(connectorName, configuration);
|
|
@@ -262,61 +294,40 @@ let ConnectorService = ConnectorService_1 = class ConnectorService {
|
|
|
262
294
|
}
|
|
263
295
|
}
|
|
264
296
|
createConnectorSource(connectorName) {
|
|
265
|
-
const
|
|
266
|
-
|
|
297
|
+
const context = new connectors_1.Core.AbstractContext({
|
|
298
|
+
source: { name: connectorName, config: {} },
|
|
299
|
+
storage: { name: 'unused', config: {} },
|
|
300
|
+
runConfig: {},
|
|
301
|
+
env: { datamartId: null, runId: null },
|
|
302
|
+
});
|
|
303
|
+
const SourceClass = connectors_1.Connectors[connectorName][`${connectorName}Source`];
|
|
304
|
+
if (SourceClass) {
|
|
305
|
+
return new SourceClass(context);
|
|
306
|
+
}
|
|
307
|
+
const manifest = connectors_1.Connectors[connectorName].manifest;
|
|
308
|
+
if (manifest && manifest.nodes) {
|
|
309
|
+
let model;
|
|
310
|
+
try {
|
|
311
|
+
model = new connectors_1.Core.ManifestParser().parse(JSON.stringify(manifest));
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
this.logger.error(`Failed to parse declarative manifest for '${connectorName}': ${e.message}`);
|
|
315
|
+
throw new common_1.InternalServerErrorException(`Connector '${connectorName}' has an invalid declarative manifest`);
|
|
316
|
+
}
|
|
317
|
+
return new connectors_1.Core.DeclarativeSource(context, model);
|
|
318
|
+
}
|
|
319
|
+
this.logger.error(`Connector '${connectorName}' has neither a '${connectorName}Source' class nor a declarative manifest`);
|
|
320
|
+
throw new common_1.InternalServerErrorException(`Connector '${connectorName}' is misconfigured`);
|
|
267
321
|
}
|
|
268
322
|
getConnectorManifest(connectorName) {
|
|
269
323
|
const manifest = connectors_1.Connectors[connectorName].manifest;
|
|
270
324
|
return manifest;
|
|
271
325
|
}
|
|
272
|
-
mapConfigToSchema(config) {
|
|
273
|
-
const result = Object.keys(config).map(key => {
|
|
274
|
-
const item = {
|
|
275
|
-
name: key,
|
|
276
|
-
title: config[key].label,
|
|
277
|
-
description: config[key].description,
|
|
278
|
-
default: config[key].default,
|
|
279
|
-
requiredType: config[key].requiredType,
|
|
280
|
-
required: config[key].isRequired,
|
|
281
|
-
options: config[key].options,
|
|
282
|
-
placeholder: config[key].placeholder,
|
|
283
|
-
minimum: config[key].minimum,
|
|
284
|
-
attributes: config[key].attributes,
|
|
285
|
-
optionsDependsOn: config[key].optionsDependsOn,
|
|
286
|
-
oneOf: config[key].oneOf?.map(oneOf => {
|
|
287
|
-
return {
|
|
288
|
-
label: oneOf.label,
|
|
289
|
-
value: oneOf.value,
|
|
290
|
-
requiredType: oneOf.requiredType,
|
|
291
|
-
attributes: oneOf.attributes,
|
|
292
|
-
oauthParams: oneOf.oauthParams,
|
|
293
|
-
items: Object.entries(oneOf.items).reduce((acc, [itemKey, itemValue]) => {
|
|
294
|
-
acc[itemKey] = {
|
|
295
|
-
name: itemKey,
|
|
296
|
-
title: itemValue.label,
|
|
297
|
-
description: itemValue.description,
|
|
298
|
-
default: itemValue.default,
|
|
299
|
-
requiredType: itemValue.requiredType,
|
|
300
|
-
required: itemValue.isRequired,
|
|
301
|
-
options: itemValue.options,
|
|
302
|
-
placeholder: itemValue.placeholder,
|
|
303
|
-
minimum: itemValue.minimum,
|
|
304
|
-
attributes: itemValue.attributes,
|
|
305
|
-
optionsDependsOn: itemValue.optionsDependsOn,
|
|
306
|
-
};
|
|
307
|
-
return acc;
|
|
308
|
-
}, {}),
|
|
309
|
-
};
|
|
310
|
-
}),
|
|
311
|
-
};
|
|
312
|
-
return item;
|
|
313
|
-
});
|
|
314
|
-
return result;
|
|
315
|
-
}
|
|
316
326
|
};
|
|
317
327
|
exports.ConnectorService = ConnectorService;
|
|
318
328
|
exports.ConnectorService = ConnectorService = ConnectorService_1 = __decorate([
|
|
319
329
|
(0, common_1.Injectable)(),
|
|
320
|
-
__metadata("design:paramtypes", [connector_source_credentials_service_1.ConnectorSourceCredentialsService
|
|
330
|
+
__metadata("design:paramtypes", [connector_source_credentials_service_1.ConnectorSourceCredentialsService,
|
|
331
|
+
connector_definition_service_1.ConnectorDefinitionService])
|
|
321
332
|
], ConnectorService);
|
|
322
333
|
//# sourceMappingURL=connector.service.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ConnectorFieldsSchema } from '../../connector-types/connector-fields-schema';
|
|
2
|
+
import { ConnectorSpecification } from '../../connector-types/connector-specification';
|
|
3
|
+
export declare function specificationFromManifest(manifest: Record<string, unknown>): ConnectorSpecification;
|
|
4
|
+
export declare function fieldsSchemaFromManifest(manifest: Record<string, unknown>): ConnectorFieldsSchema;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.specificationFromManifest = specificationFromManifest;
|
|
4
|
+
exports.fieldsSchemaFromManifest = fieldsSchemaFromManifest;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const connectors_1 = require("@owox/connectors");
|
|
7
|
+
const connector_fields_schema_1 = require("../../connector-types/connector-fields-schema");
|
|
8
|
+
const connector_specification_1 = require("../../connector-types/connector-specification");
|
|
9
|
+
const connector_fields_schema_mapper_1 = require("./connector-fields-schema.mapper");
|
|
10
|
+
const connector_specification_mapper_1 = require("./connector-specification.mapper");
|
|
11
|
+
function specificationFromManifest(manifest) {
|
|
12
|
+
const source = declarativeSourceFromManifest(manifest);
|
|
13
|
+
return parseOrExplain(connector_specification_1.ConnectorSpecification, (0, connector_specification_mapper_1.mapConnectorSpecification)(source.parameters), 'parameter');
|
|
14
|
+
}
|
|
15
|
+
function fieldsSchemaFromManifest(manifest) {
|
|
16
|
+
const source = declarativeSourceFromManifest(manifest);
|
|
17
|
+
return parseOrExplain(connector_fields_schema_1.ConnectorFieldsSchema, (0, connector_fields_schema_mapper_1.mapConnectorFieldsSchema)(source.getFieldsSchema()), 'node');
|
|
18
|
+
}
|
|
19
|
+
function declarativeSourceFromManifest(manifest) {
|
|
20
|
+
const context = new connectors_1.Core.AbstractContext({
|
|
21
|
+
source: { name: 'custom', config: {} },
|
|
22
|
+
storage: { name: 'unused', config: {} },
|
|
23
|
+
runConfig: {},
|
|
24
|
+
env: { datamartId: null, runId: null },
|
|
25
|
+
});
|
|
26
|
+
let model;
|
|
27
|
+
try {
|
|
28
|
+
model = new connectors_1.Core.ManifestParser().parse(JSON.stringify(manifest));
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
throw new common_1.BadRequestException(`Invalid declarative manifest: ${e.message}`);
|
|
32
|
+
}
|
|
33
|
+
return new connectors_1.Core.DeclarativeSource(context, model);
|
|
34
|
+
}
|
|
35
|
+
const MANIFEST_KEYS = { title: 'label', required: 'isRequired' };
|
|
36
|
+
function parseOrExplain(schema, items, kind) {
|
|
37
|
+
const parsed = schema.safeParse(items);
|
|
38
|
+
if (parsed.success)
|
|
39
|
+
return parsed.data;
|
|
40
|
+
const problems = parsed.error.issues.map(issue => {
|
|
41
|
+
const [index, ...path] = issue.path;
|
|
42
|
+
const name = typeof index === 'number' ? items[index]?.name : undefined;
|
|
43
|
+
const where = path.map(key => MANIFEST_KEYS[key] ?? key).join('.');
|
|
44
|
+
return `${kind} "${String(name)}" ${where}: ${issue.message}`;
|
|
45
|
+
});
|
|
46
|
+
throw new common_1.BadRequestException(`Invalid declarative manifest: ${problems.join('; ')}`);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=declarative-manifest-schemas.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ConnectorMessage } from '../../connector-types/connector-message/schemas/connector-message.schema';
|
|
2
|
+
export interface RunLogSnapshot {
|
|
3
|
+
logs: string[];
|
|
4
|
+
errors: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function createRunLogSnapshotReader(logs: ConnectorMessage[], errors: ConnectorMessage[]): () => RunLogSnapshot;
|
|
7
|
+
export declare class RunLogFlusher {
|
|
8
|
+
private readonly intervalMs;
|
|
9
|
+
private readonly getSnapshot;
|
|
10
|
+
private readonly write;
|
|
11
|
+
private readonly onError?;
|
|
12
|
+
private timer;
|
|
13
|
+
private lastCount;
|
|
14
|
+
private inFlight;
|
|
15
|
+
private persisted;
|
|
16
|
+
constructor(intervalMs: number, getSnapshot: () => RunLogSnapshot, write: (snapshot: RunLogSnapshot) => Promise<void>, onError?: ((error: unknown) => void) | undefined);
|
|
17
|
+
start(): void;
|
|
18
|
+
flushIfDirty(): Promise<void>;
|
|
19
|
+
persistedSnapshot(): RunLogSnapshot | null;
|
|
20
|
+
stop(): Promise<void>;
|
|
21
|
+
}
|