@owox/backend 0.38.0 → 0.39.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.
Files changed (179) hide show
  1. package/dist/src/common/helpers/read-bounded-body.helper.d.ts +1 -0
  2. package/dist/src/common/helpers/read-bounded-body.helper.js +28 -0
  3. package/dist/src/common/scheduler/system-tasks/system-trigger-type.d.ts +3 -1
  4. package/dist/src/common/scheduler/system-tasks/system-trigger-type.js +2 -0
  5. package/dist/src/config/data-source-options.config.d.ts +4 -3
  6. package/dist/src/config/data-source-options.config.js +10 -3
  7. package/dist/src/config/plugin-collections-body-parser.config.js +3 -0
  8. package/dist/src/data-marts/credentials/credential.types.d.ts +26 -2
  9. package/dist/src/data-marts/credentials/credential.types.js +18 -6
  10. package/dist/src/data-marts/credentials/dto/credential-api.dto.d.ts +5 -1
  11. package/dist/src/data-marts/credentials/dto/credential-api.dto.js +21 -0
  12. package/dist/src/data-marts/credentials/dto/credential.dto.d.ts +2 -1
  13. package/dist/src/data-marts/credentials/entities/credential.entity.d.ts +2 -1
  14. package/dist/src/data-marts/credentials/entities/credential.entity.js +5 -0
  15. package/dist/src/data-marts/credentials/facades/credential-consumer-binding.facade.impl.js +6 -1
  16. package/dist/src/data-marts/credentials/mappers/credential.mapper.js +2 -0
  17. package/dist/src/data-marts/credentials/services/builtin-credential-definitions.js +8 -0
  18. package/dist/src/data-marts/credentials/services/credential-external-definition-registry.service.d.ts +4 -0
  19. package/dist/src/data-marts/credentials/services/credential-external-definition-registry.service.js +36 -17
  20. package/dist/src/data-marts/credentials/services/credential-fetch.service.d.ts +8 -0
  21. package/dist/src/data-marts/credentials/services/credential-fetch.service.js +115 -46
  22. package/dist/src/data-marts/credentials/services/credential-validation-probe.service.d.ts +3 -1
  23. package/dist/src/data-marts/credentials/services/credential-validation-probe.service.js +10 -2
  24. package/dist/src/data-marts/credentials/services/credential.service.d.ts +4 -0
  25. package/dist/src/data-marts/credentials/services/credential.service.js +36 -0
  26. package/dist/src/data-marts/credentials/services/google-service-account-key.d.ts +6 -0
  27. package/dist/src/data-marts/credentials/services/google-service-account-key.js +46 -0
  28. package/dist/src/data-marts/credentials/services/google-service-account-token.service.d.ts +25 -0
  29. package/dist/src/data-marts/credentials/services/google-service-account-token.service.js +177 -0
  30. package/dist/src/data-marts/credentials/use-cases/create-credential.service.d.ts +1 -0
  31. package/dist/src/data-marts/credentials/use-cases/create-credential.service.js +10 -2
  32. package/dist/src/data-marts/credentials/use-cases/update-credential.service.d.ts +1 -0
  33. package/dist/src/data-marts/credentials/use-cases/update-credential.service.js +28 -4
  34. package/dist/src/data-marts/credentials/use-cases/validate-credential.service.js +2 -5
  35. package/dist/src/data-marts/data-marts.module.js +4 -0
  36. package/dist/src/data-marts/data-storage-types/snowflake/adapters/snowflake-api.adapter.js +1 -0
  37. package/dist/src/data-marts/dto/presentation/run-data-mart-request-api.dto.js +4 -2
  38. package/dist/src/data-marts/services/connector/backfill-segment.d.ts +22 -0
  39. package/dist/src/data-marts/services/connector/backfill-segment.js +91 -0
  40. package/dist/src/data-marts/services/connector/connector-execution.service.d.ts +1 -0
  41. package/dist/src/data-marts/services/connector/connector-execution.service.js +3 -0
  42. package/dist/src/data-marts/services/connector/connector-executor.service.d.ts +4 -1
  43. package/dist/src/data-marts/services/connector/connector-executor.service.js +107 -23
  44. package/dist/src/data-marts/services/connector/connector-run.service.d.ts +3 -0
  45. package/dist/src/data-marts/services/connector/connector-run.service.js +98 -4
  46. package/dist/src/data-marts/services/data-mart-run.service.d.ts +1 -0
  47. package/dist/src/data-marts/services/data-mart-run.service.js +9 -0
  48. package/dist/src/data-marts/system-triggers/processors/repair-backfill-chains-processor.d.ts +14 -0
  49. package/dist/src/data-marts/system-triggers/processors/repair-backfill-chains-processor.js +45 -0
  50. package/dist/src/data-marts/use-cases/cancel-data-mart-run.service.d.ts +4 -0
  51. package/dist/src/data-marts/use-cases/cancel-data-mart-run.service.js +46 -1
  52. package/dist/src/data-marts/utils/manual-backfill-range.d.ts +52 -0
  53. package/dist/src/data-marts/utils/manual-backfill-range.js +110 -8
  54. package/dist/src/ee/mcp/instructions/mcp-system-instructions.d.ts +1 -1
  55. package/dist/src/ee/mcp/instructions/mcp-system-instructions.js +1 -0
  56. package/dist/src/idp/decorators/auth-context.decorator.js +1 -0
  57. package/dist/src/idp/guards/idp.guard.d.ts +3 -0
  58. package/dist/src/idp/guards/idp.guard.js +38 -8
  59. package/dist/src/idp/oauth/controllers/oauth-authorization.controller.js +8 -6
  60. package/dist/src/idp/oauth/mcp-client-integration.d.ts +1 -0
  61. package/dist/src/idp/oauth/mcp-client-integration.js +15 -0
  62. package/dist/src/idp/ports/plugin-runtime-authorizer.port.d.ts +6 -0
  63. package/dist/src/idp/types/auth.types.d.ts +1 -0
  64. package/dist/src/migrations/1790900000000-add-plugin-version-backend.d.ts +6 -0
  65. package/dist/src/migrations/1790900000000-add-plugin-version-backend.js +21 -0
  66. package/dist/src/migrations/1790900000001-create-plugin-action-execution.d.ts +6 -0
  67. package/dist/src/migrations/1790900000001-create-plugin-action-execution.js +77 -0
  68. package/dist/src/migrations/1791000000000-add-credential-public-metadata.d.ts +6 -0
  69. package/dist/src/migrations/1791000000000-add-credential-public-metadata.js +23 -0
  70. package/dist/src/plugin-host/collections/dto/domain/plugin-collection.types.d.ts +1 -0
  71. package/dist/src/plugin-host/collections/errors/plugin-collection.errors.d.ts +6 -0
  72. package/dist/src/plugin-host/collections/errors/plugin-collection.errors.js +19 -1
  73. package/dist/src/plugin-host/collections/services/plugin-collection-declaration.service.js +3 -3
  74. package/dist/src/plugin-host/collections/use-cases/put-plugin-collection-document.service.js +7 -0
  75. package/dist/src/plugin-host/constants/plugin-action-limits.d.ts +34 -0
  76. package/dist/src/plugin-host/constants/plugin-action-limits.js +51 -0
  77. package/dist/src/plugin-host/controllers/plugin-action-runtime.controller.d.ts +20 -0
  78. package/dist/src/plugin-host/controllers/plugin-action-runtime.controller.js +123 -0
  79. package/dist/src/plugin-host/controllers/plugin-credential-runtime.controller.js +11 -19
  80. package/dist/src/plugin-host/controllers/plugin-history.controller.d.ts +10 -0
  81. package/dist/src/plugin-host/controllers/plugin-history.controller.js +57 -0
  82. package/dist/src/plugin-host/controllers/plugin-release-check.controller.d.ts +10 -0
  83. package/dist/src/plugin-host/controllers/plugin-release-check.controller.js +58 -0
  84. package/dist/src/plugin-host/dto/domain/check-plugin-release.command.d.ts +22 -0
  85. package/dist/src/plugin-host/dto/domain/check-plugin-release.command.js +17 -0
  86. package/dist/src/plugin-host/dto/domain/list-plugin-history.command.d.ts +10 -0
  87. package/dist/src/plugin-host/dto/domain/list-plugin-history.command.js +18 -0
  88. package/dist/src/plugin-host/dto/domain/plugin-action-execution.command.d.ts +23 -0
  89. package/dist/src/plugin-host/dto/domain/plugin-action-execution.command.js +44 -0
  90. package/dist/src/plugin-host/dto/domain/plugin-action-execution.dto.d.ts +36 -0
  91. package/dist/src/plugin-host/dto/domain/plugin-action-execution.dto.js +3 -0
  92. package/dist/src/plugin-host/dto/domain/plugin-history.dto.d.ts +29 -0
  93. package/dist/src/plugin-host/dto/domain/plugin-history.dto.js +3 -0
  94. package/dist/src/plugin-host/dto/domain/plugin-view.dto.d.ts +1 -0
  95. package/dist/src/plugin-host/dto/presentation/plugin-action-api.dto.d.ts +44 -0
  96. package/dist/src/plugin-host/dto/presentation/plugin-action-api.dto.js +208 -0
  97. package/dist/src/plugin-host/dto/presentation/plugin-gallery-api.dto.d.ts +2 -0
  98. package/dist/src/plugin-host/dto/presentation/plugin-gallery-api.dto.js +7 -0
  99. package/dist/src/plugin-host/dto/presentation/plugin-history-api.dto.d.ts +29 -0
  100. package/dist/src/plugin-host/dto/presentation/plugin-history-api.dto.js +148 -0
  101. package/dist/src/plugin-host/dto/presentation/publication-api.dto.d.ts +17 -0
  102. package/dist/src/plugin-host/dto/presentation/publication-api.dto.js +95 -1
  103. package/dist/src/plugin-host/entities/plugin-action-execution.entity.d.ts +24 -0
  104. package/dist/src/plugin-host/entities/plugin-action-execution.entity.js +136 -0
  105. package/dist/src/plugin-host/entities/plugin-version.entity.d.ts +2 -1
  106. package/dist/src/plugin-host/entities/plugin-version.entity.js +5 -0
  107. package/dist/src/plugin-host/enums/plugin-action-execution-status.enum.d.ts +9 -0
  108. package/dist/src/plugin-host/enums/plugin-action-execution-status.enum.js +22 -0
  109. package/dist/src/plugin-host/enums/release-rejection-code.enum.d.ts +3 -0
  110. package/dist/src/plugin-host/enums/release-rejection-code.enum.js +6 -0
  111. package/dist/src/plugin-host/errors/plugin-action.errors.d.ts +45 -0
  112. package/dist/src/plugin-host/errors/plugin-action.errors.js +70 -0
  113. package/dist/src/plugin-host/errors/plugin-host.errors.d.ts +6 -0
  114. package/dist/src/plugin-host/errors/plugin-host.errors.js +10 -1
  115. package/dist/src/plugin-host/filters/plugin-host-exception.filter.js +2 -2
  116. package/dist/src/plugin-host/mappers/plugin-action-execution.mapper.d.ts +3 -0
  117. package/dist/src/plugin-host/mappers/plugin-action-execution.mapper.js +22 -0
  118. package/dist/src/plugin-host/mappers/plugin-presentation.mapper.d.ts +16 -1
  119. package/dist/src/plugin-host/mappers/plugin-presentation.mapper.js +80 -1
  120. package/dist/src/plugin-host/plugin-host.module.js +32 -0
  121. package/dist/src/plugin-host/services/action-input-validator.service.d.ts +23 -0
  122. package/dist/src/plugin-host/services/action-input-validator.service.js +277 -0
  123. package/dist/src/plugin-host/services/external-credential-definition-sync.service.d.ts +3 -0
  124. package/dist/src/plugin-host/services/external-credential-definition-sync.service.js +47 -15
  125. package/dist/src/plugin-host/services/plugin-action-dispatcher.service.d.ts +13 -0
  126. package/dist/src/plugin-host/services/plugin-action-dispatcher.service.js +140 -0
  127. package/dist/src/plugin-host/services/plugin-action-execution.service.d.ts +69 -0
  128. package/dist/src/plugin-host/services/plugin-action-execution.service.js +239 -0
  129. package/dist/src/plugin-host/services/plugin-action-starter.service.d.ts +22 -0
  130. package/dist/src/plugin-host/services/plugin-action-starter.service.js +81 -0
  131. package/dist/src/plugin-host/services/plugin-audit.service.d.ts +13 -0
  132. package/dist/src/plugin-host/services/plugin-audit.service.js +78 -0
  133. package/dist/src/plugin-host/services/plugin-publication.service.d.ts +2 -0
  134. package/dist/src/plugin-host/services/plugin-publication.service.js +18 -10
  135. package/dist/src/plugin-host/services/plugin-runtime-authorizer.service.d.ts +5 -2
  136. package/dist/src/plugin-host/services/plugin-runtime-authorizer.service.js +31 -3
  137. package/dist/src/plugin-host/services/plugin-version.service.d.ts +2 -1
  138. package/dist/src/plugin-host/services/release-candidate-rules.service.d.ts +51 -0
  139. package/dist/src/plugin-host/services/release-candidate-rules.service.js +198 -0
  140. package/dist/src/plugin-host/services/remote-url-validator.service.d.ts +7 -0
  141. package/dist/src/plugin-host/services/remote-url-validator.service.js +4 -0
  142. package/dist/src/plugin-host/system-triggers/plugin-action-execution-sweep.processor.d.ts +14 -0
  143. package/dist/src/plugin-host/system-triggers/plugin-action-execution-sweep.processor.js +50 -0
  144. package/dist/src/plugin-host/use-cases/cancel-plugin-action-execution.service.d.ts +8 -0
  145. package/dist/src/plugin-host/use-cases/cancel-plugin-action-execution.service.js +39 -0
  146. package/dist/src/plugin-host/use-cases/check-plugin-release.service.d.ts +22 -0
  147. package/dist/src/plugin-host/use-cases/check-plugin-release.service.js +152 -0
  148. package/dist/src/plugin-host/use-cases/get-current-plugin-action-execution.service.d.ts +14 -0
  149. package/dist/src/plugin-host/use-cases/get-current-plugin-action-execution.service.js +85 -0
  150. package/dist/src/plugin-host/use-cases/get-plugin-action-execution.service.d.ts +9 -0
  151. package/dist/src/plugin-host/use-cases/get-plugin-action-execution.service.js +67 -0
  152. package/dist/src/plugin-host/use-cases/get-plugin-installation-entry.service.js +2 -7
  153. package/dist/src/plugin-host/use-cases/install-plugin.service.js +4 -0
  154. package/dist/src/plugin-host/use-cases/list-plugin-history.service.d.ts +25 -0
  155. package/dist/src/plugin-host/use-cases/list-plugin-history.service.js +147 -0
  156. package/dist/src/plugin-host/use-cases/plugin-publisher-access.d.ts +5 -0
  157. package/dist/src/plugin-host/use-cases/plugin-publisher-access.js +28 -0
  158. package/dist/src/plugin-host/use-cases/start-plugin-action-execution.service.d.ts +12 -0
  159. package/dist/src/plugin-host/use-cases/start-plugin-action-execution.service.js +64 -0
  160. package/dist/src/plugin-host/use-cases/sync-plugin-releases.service.d.ts +3 -5
  161. package/dist/src/plugin-host/use-cases/sync-plugin-releases.service.js +15 -59
  162. package/dist/src/plugin-host/use-cases/uninstall-plugin.service.js +3 -1
  163. package/dist/src/plugin-host/use-cases/update-plugin.service.d.ts +0 -1
  164. package/dist/src/plugin-host/use-cases/update-plugin.service.js +3 -25
  165. package/dist/src/plugin-host/utils/action-input-schema.util.d.ts +14 -0
  166. package/dist/src/plugin-host/utils/action-input-schema.util.js +133 -0
  167. package/dist/src/plugin-host/utils/credential-handles.util.d.ts +3 -0
  168. package/dist/src/plugin-host/utils/credential-handles.util.js +13 -0
  169. package/dist/src/plugin-host/utils/execution-token.util.d.ts +5 -0
  170. package/dist/src/plugin-host/utils/execution-token.util.js +13 -0
  171. package/dist/src/plugin-host/utils/json-shape.util.d.ts +1 -0
  172. package/dist/src/plugin-host/utils/json-shape.util.js +21 -0
  173. package/dist/src/plugin-host/utils/plugin-action-outcome.util.d.ts +10 -0
  174. package/dist/src/plugin-host/utils/plugin-action-outcome.util.js +67 -0
  175. package/dist/src/plugin-host/utils/plugin-manifest.util.d.ts +121 -0
  176. package/dist/src/plugin-host/utils/plugin-manifest.util.js +111 -1
  177. package/dist/src/plugin-host/utils/request-abort-signal.util.d.ts +5 -0
  178. package/dist/src/plugin-host/utils/request-abort-signal.util.js +19 -0
  179. package/package.json +10 -8
@@ -22,6 +22,8 @@ export declare class PluginPublicationService {
22
22
  addToAudience(publicationId: string, projectIds: string[]): Promise<void>;
23
23
  removeFromAudience(publicationId: string, projectIds?: string[]): Promise<void>;
24
24
  findVisibleTo(projectId: string, userId: string): Promise<PluginPublication[]>;
25
+ findEverVisibleTo(projectId: string, userId: string): Promise<PluginPublication[]>;
26
+ private visibleTo;
25
27
  findDeploymentPluginIdByRepo(projectId: string, owner: string, name: string): Promise<string | null>;
26
28
  listManageable(scope: PluginPublicationScope, filters: {
27
29
  projectId?: string;
@@ -65,12 +65,15 @@ let PluginPublicationService = class PluginPublicationService {
65
65
  await this.audiences.update(projectIds ? { publicationId, projectId: (0, typeorm_2.In)(projectIds) } : { publicationId }, { isActive: false });
66
66
  }
67
67
  findVisibleTo(projectId, userId) {
68
- return this.publications
69
- .createQueryBuilder('publication')
70
- .where('publication.isActive = :isActive', { isActive: true })
71
- .andWhere(new typeorm_2.Brackets(scopes => {
68
+ return this.visibleTo(projectId, userId, true).getMany();
69
+ }
70
+ findEverVisibleTo(projectId, userId) {
71
+ return this.visibleTo(projectId, userId, false).getMany();
72
+ }
73
+ visibleTo(projectId, userId, activeOnly) {
74
+ const query = this.publications.createQueryBuilder('publication').where(new typeorm_2.Brackets(scopes => {
72
75
  scopes
73
- .where(this.deploymentVisibleToProject(projectId))
76
+ .where(this.deploymentVisibleToProject(projectId, activeOnly))
74
77
  .orWhere(new typeorm_2.Brackets(project => {
75
78
  project
76
79
  .where('publication.scope = :projectScope', {
@@ -86,9 +89,11 @@ let PluginPublicationService = class PluginPublicationService {
86
89
  .andWhere('publication.projectId = :projectId')
87
90
  .andWhere('publication.userId = :userId');
88
91
  }));
89
- }))
90
- .setParameters({ projectId, userId })
91
- .getMany();
92
+ }));
93
+ if (activeOnly) {
94
+ query.andWhere('publication.isActive = :isActive', { isActive: true });
95
+ }
96
+ return query.setParameters({ projectId, userId });
92
97
  }
93
98
  async findDeploymentPluginIdByRepo(projectId, owner, name) {
94
99
  const publication = await this.publications
@@ -111,7 +116,10 @@ let PluginPublicationService = class PluginPublicationService {
111
116
  ...(filters.userId ? { userId: filters.userId } : {}),
112
117
  });
113
118
  }
114
- deploymentVisibleToProject(projectId) {
119
+ deploymentVisibleToProject(projectId, activeAudienceOnly = true) {
120
+ const activeAudience = activeAudienceOnly
121
+ ? 'AND audience_row.isActive = :deploymentAudienceActive'
122
+ : '';
115
123
  return new typeorm_2.Brackets(deployment => {
116
124
  deployment
117
125
  .where('publication.scope = :deploymentScope', {
@@ -126,7 +134,7 @@ let PluginPublicationService = class PluginPublicationService {
126
134
  SELECT 1 FROM plugin_publication_project audience_row
127
135
  WHERE audience_row.publicationId = publication.id
128
136
  AND audience_row.projectId = :deploymentProjectId
129
- AND audience_row.isActive = :deploymentAudienceActive
137
+ ${activeAudience}
130
138
  )`, { deploymentProjectId: projectId, deploymentAudienceActive: true });
131
139
  }));
132
140
  });
@@ -1,7 +1,10 @@
1
- import { PluginRuntimeAuthorizerPort, PluginRuntimeIdentity } from '../../idp/ports/plugin-runtime-authorizer.port';
1
+ import { PluginExecutionIdentity, PluginRuntimeAuthorizerPort, PluginRuntimeIdentity } from '../../idp/ports/plugin-runtime-authorizer.port';
2
2
  import { PluginInstallationLookupPort } from '../facades/plugin-installation-lookup.facade';
3
+ import { PluginActionExecutionService } from './plugin-action-execution.service';
3
4
  export declare class PluginRuntimeAuthorizerService implements PluginRuntimeAuthorizerPort {
4
5
  private readonly installations;
5
- constructor(installations: PluginInstallationLookupPort);
6
+ private readonly executions;
7
+ constructor(installations: PluginInstallationLookupPort, executions: PluginActionExecutionService);
6
8
  assertActiveInstallation(identity: PluginRuntimeIdentity): Promise<void>;
9
+ resolveExecutionToken(token: string): Promise<PluginExecutionIdentity | null>;
7
10
  }
@@ -16,27 +16,55 @@ exports.PluginRuntimeAuthorizerService = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const idp_protocol_1 = require("@owox/idp-protocol");
18
18
  const plugin_installation_lookup_facade_1 = require("../facades/plugin-installation-lookup.facade");
19
+ const plugin_host_errors_1 = require("../errors/plugin-host.errors");
20
+ const execution_token_util_1 = require("../utils/execution-token.util");
21
+ const plugin_action_execution_service_1 = require("./plugin-action-execution.service");
19
22
  let PluginRuntimeAuthorizerService = class PluginRuntimeAuthorizerService {
20
23
  installations;
21
- constructor(installations) {
24
+ executions;
25
+ constructor(installations, executions) {
22
26
  this.installations = installations;
27
+ this.executions = executions;
23
28
  }
24
29
  async assertActiveInstallation(identity) {
25
30
  const installation = await this.installations.findSnapshot(identity.installationId);
26
31
  if (!installation ||
27
32
  !installation.isActive ||
28
- installation.isSuspended ||
29
33
  installation.pluginId !== identity.pluginId ||
30
34
  installation.projectId !== identity.projectId ||
31
35
  installation.userId !== identity.userId) {
32
36
  throw new idp_protocol_1.AuthorizationError('Plugin runtime access denied');
33
37
  }
38
+ if (installation.isSuspended) {
39
+ throw new plugin_host_errors_1.PluginSuspendedError(installation.pluginId);
40
+ }
41
+ }
42
+ async resolveExecutionToken(token) {
43
+ if (!token) {
44
+ return null;
45
+ }
46
+ const execution = await this.executions.findRunningByTokenHash((0, execution_token_util_1.hashExecutionToken)(token), new Date());
47
+ if (!execution) {
48
+ return null;
49
+ }
50
+ const role = idp_protocol_1.RoleEnum.safeParse(execution.role);
51
+ if (!role.success) {
52
+ return null;
53
+ }
54
+ return {
55
+ executionId: execution.id,
56
+ pluginId: execution.pluginId,
57
+ installationId: execution.installationId,
58
+ projectId: execution.projectId,
59
+ userId: execution.userId,
60
+ role: role.data,
61
+ };
34
62
  }
35
63
  };
36
64
  exports.PluginRuntimeAuthorizerService = PluginRuntimeAuthorizerService;
37
65
  exports.PluginRuntimeAuthorizerService = PluginRuntimeAuthorizerService = __decorate([
38
66
  (0, common_1.Injectable)(),
39
67
  __param(0, (0, common_1.Inject)(plugin_installation_lookup_facade_1.PLUGIN_INSTALLATION_LOOKUP)),
40
- __metadata("design:paramtypes", [Object])
68
+ __metadata("design:paramtypes", [Object, plugin_action_execution_service_1.PluginActionExecutionService])
41
69
  ], PluginRuntimeAuthorizerService);
42
70
  //# sourceMappingURL=plugin-runtime-authorizer.service.js.map
@@ -1,7 +1,7 @@
1
1
  import { DataSource, Repository } from 'typeorm';
2
2
  import { PluginVersion } from '../entities/plugin-version.entity';
3
3
  import { Plugin } from '../entities/plugin.entity';
4
- import type { PluginCollectionDeclaration } from '../utils/plugin-manifest.util';
4
+ import type { PluginBackendDeclaration, PluginCollectionDeclaration } from '../utils/plugin-manifest.util';
5
5
  import type { StoredCredentialRequirement } from '../../data-marts/credentials/credential.types';
6
6
  export interface InsertPluginVersionInput {
7
7
  readonly pluginId: string;
@@ -14,6 +14,7 @@ export interface InsertPluginVersionInput {
14
14
  readonly deliveryUrl: string;
15
15
  readonly collections: readonly PluginCollectionDeclaration[];
16
16
  readonly credentialRequirements: readonly StoredCredentialRequirement[];
17
+ readonly backend: PluginBackendDeclaration | null;
17
18
  readonly releasePublishedAt: Date | null;
18
19
  }
19
20
  export declare class PluginVersionService {
@@ -0,0 +1,51 @@
1
+ import type { StoredCredentialRequirement } from '../../data-marts/credentials/credential.types';
2
+ import { ReleaseRejectionCode } from '../enums/release-rejection-code.enum';
3
+ import { GithubRepoRef } from '../utils/github-repo-locator.util';
4
+ import { PluginManifest } from '../utils/plugin-manifest.util';
5
+ import { ActionInputValidatorService } from './action-input-validator.service';
6
+ import { ExternalCredentialDefinitionSyncService } from './external-credential-definition-sync.service';
7
+ import { GithubApiService } from './github-api.service';
8
+ import { PluginVersionService } from './plugin-version.service';
9
+ import { RemoteUrlValidatorService } from './remote-url-validator.service';
10
+ export interface ReleaseCandidate {
11
+ readonly pluginId: string;
12
+ readonly ref: GithubRepoRef;
13
+ readonly commitSha: string;
14
+ readonly semver: string | null;
15
+ }
16
+ export interface ReleaseCandidateIssue {
17
+ readonly code: ReleaseRejectionCode;
18
+ readonly detail: string;
19
+ }
20
+ type Rejection = {
21
+ readonly ok: false;
22
+ } & ReleaseCandidateIssue;
23
+ export type ReleaseCandidateVerdict = {
24
+ readonly ok: true;
25
+ readonly manifest: PluginManifest;
26
+ readonly credentialRequirements: readonly StoredCredentialRequirement[];
27
+ } | Rejection;
28
+ export interface ReleaseCandidateReport {
29
+ readonly issues: readonly ReleaseCandidateIssue[];
30
+ readonly baselineSemver: string | null;
31
+ readonly collectionsEvaluated: boolean;
32
+ }
33
+ export declare class ReleaseCandidateRulesService {
34
+ private readonly githubApi;
35
+ private readonly remoteUrlValidator;
36
+ private readonly versionService;
37
+ private readonly inputValidator;
38
+ private readonly externalCredentialDefinitions?;
39
+ constructor(githubApi: GithubApiService, remoteUrlValidator: RemoteUrlValidatorService, versionService: PluginVersionService, inputValidator: ActionInputValidatorService, externalCredentialDefinitions?: ExternalCredentialDefinitionSyncService | undefined);
40
+ firstFailure(candidate: ReleaseCandidate): Promise<ReleaseCandidateVerdict>;
41
+ collectAll(candidate: ReleaseCandidate): Promise<ReleaseCandidateReport>;
42
+ private fetchManifest;
43
+ private findBaseline;
44
+ private checkCollections;
45
+ private checkActions;
46
+ private checkBackendOrigin;
47
+ private lineIssue;
48
+ private checkBackendUrl;
49
+ private resolveCredentialRequirements;
50
+ }
51
+ export {};
@@ -0,0 +1,198 @@
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.ReleaseCandidateRulesService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const internal_helpers_1 = require("@owox/internal-helpers");
18
+ const release_rejection_code_enum_1 = require("../enums/release-rejection-code.enum");
19
+ const plugin_manifest_util_1 = require("../utils/plugin-manifest.util");
20
+ const semver_util_1 = require("../utils/semver.util");
21
+ const action_input_validator_service_1 = require("./action-input-validator.service");
22
+ const external_credential_definition_sync_service_1 = require("./external-credential-definition-sync.service");
23
+ const github_api_service_1 = require("./github-api.service");
24
+ const plugin_version_service_1 = require("./plugin-version.service");
25
+ const remote_url_validator_service_1 = require("./remote-url-validator.service");
26
+ let ReleaseCandidateRulesService = class ReleaseCandidateRulesService {
27
+ githubApi;
28
+ remoteUrlValidator;
29
+ versionService;
30
+ inputValidator;
31
+ externalCredentialDefinitions;
32
+ constructor(githubApi, remoteUrlValidator, versionService, inputValidator, externalCredentialDefinitions) {
33
+ this.githubApi = githubApi;
34
+ this.remoteUrlValidator = remoteUrlValidator;
35
+ this.versionService = versionService;
36
+ this.inputValidator = inputValidator;
37
+ this.externalCredentialDefinitions = externalCredentialDefinitions;
38
+ }
39
+ async firstFailure(candidate) {
40
+ const parsed = await this.fetchManifest(candidate);
41
+ if (!parsed.ok)
42
+ return parsed;
43
+ const { manifest } = parsed;
44
+ const baseline = await this.findBaseline(candidate);
45
+ const collections = baseline && this.checkCollections(baseline, manifest);
46
+ if (collections)
47
+ return { ok: false, ...collections };
48
+ const actions = baseline && this.checkActions(baseline, manifest);
49
+ if (actions)
50
+ return { ok: false, ...actions };
51
+ const backendOrigin = baseline && this.checkBackendOrigin(baseline, manifest);
52
+ if (backendOrigin)
53
+ return { ok: false, ...backendOrigin };
54
+ const delivery = await this.remoteUrlValidator.validate(manifest.delivery.url);
55
+ if (!delivery.ok)
56
+ return delivery;
57
+ const backendUrl = await this.checkBackendUrl(manifest);
58
+ if (backendUrl)
59
+ return { ok: false, ...backendUrl };
60
+ const credentials = await this.resolveCredentialRequirements(manifest, 'resolve');
61
+ if (!credentials.ok)
62
+ return credentials;
63
+ return { ok: true, manifest, credentialRequirements: credentials.requirements };
64
+ }
65
+ async collectAll(candidate) {
66
+ const parsed = await this.fetchManifest(candidate);
67
+ const baseline = await this.findBaseline(candidate);
68
+ const baselineSemver = baseline?.semver ?? null;
69
+ if (!parsed.ok) {
70
+ return {
71
+ issues: [{ code: parsed.code, detail: parsed.detail }],
72
+ baselineSemver,
73
+ collectionsEvaluated: false,
74
+ };
75
+ }
76
+ const { manifest } = parsed;
77
+ const issues = [];
78
+ const collections = baseline && this.checkCollections(baseline, manifest);
79
+ if (collections)
80
+ issues.push(collections);
81
+ const actions = baseline && this.checkActions(baseline, manifest);
82
+ if (actions)
83
+ issues.push(actions);
84
+ const backendOrigin = baseline && this.checkBackendOrigin(baseline, manifest);
85
+ if (backendOrigin)
86
+ issues.push(backendOrigin);
87
+ const delivery = await this.remoteUrlValidator.validate(manifest.delivery.url);
88
+ if (!delivery.ok)
89
+ issues.push({ code: delivery.code, detail: delivery.detail });
90
+ const backendUrl = await this.checkBackendUrl(manifest);
91
+ if (backendUrl)
92
+ issues.push(backendUrl);
93
+ const credentials = await this.resolveCredentialRequirements(manifest, 'preview');
94
+ if (!credentials.ok)
95
+ issues.push({ code: credentials.code, detail: credentials.detail });
96
+ return {
97
+ issues,
98
+ baselineSemver,
99
+ collectionsEvaluated: baseline !== undefined,
100
+ };
101
+ }
102
+ async fetchManifest({ ref, commitSha }) {
103
+ const parsed = (0, plugin_manifest_util_1.parsePluginManifest)(await this.githubApi.getFileAtCommit(ref, 'plugin.json', commitSha));
104
+ if (!parsed.ok)
105
+ return parsed;
106
+ const refusal = await this.inputValidator.compile((0, plugin_manifest_util_1.listActionInputSchemas)(parsed.manifest.backend));
107
+ return refusal
108
+ ? { ok: false, code: release_rejection_code_enum_1.ReleaseRejectionCode.ACTION_INPUT_UNSUPPORTED, detail: refusal }
109
+ : parsed;
110
+ }
111
+ async findBaseline({ pluginId, semver, }) {
112
+ if (semver === null)
113
+ return undefined;
114
+ return (await this.versionService.findAllByPluginId(pluginId))
115
+ .filter(version => (0, semver_util_1.sameCompatibilityLine)(version.semver, semver))
116
+ .reduce((highest, version) => (!highest || (0, semver_util_1.compareSemver)(version.semver, highest.semver) > 0 ? version : highest), undefined);
117
+ }
118
+ checkCollections(baseline, manifest) {
119
+ const incompatibility = (0, plugin_manifest_util_1.findIncompatibleCollectionChange)(baseline.collections ?? [], manifest.collections);
120
+ return incompatibility
121
+ ? this.lineIssue(release_rejection_code_enum_1.ReleaseRejectionCode.COLLECTIONS_INCOMPATIBLE, incompatibility, baseline)
122
+ : null;
123
+ }
124
+ checkActions(baseline, manifest) {
125
+ const incompatibility = (0, plugin_manifest_util_1.findIncompatibleActionChange)(baseline.backend, manifest.backend);
126
+ return incompatibility
127
+ ? this.lineIssue(release_rejection_code_enum_1.ReleaseRejectionCode.ACTIONS_INCOMPATIBLE, incompatibility, baseline)
128
+ : null;
129
+ }
130
+ checkBackendOrigin(baseline, manifest) {
131
+ if (!manifest.backend)
132
+ return null;
133
+ const origin = new URL((0, plugin_manifest_util_1.resolveBackendUrl)(manifest.backend, manifest.delivery.url)).origin;
134
+ const baselineOrigin = baseline.backend && new URL((0, plugin_manifest_util_1.resolveBackendUrl)(baseline.backend, baseline.deliveryUrl)).origin;
135
+ if (origin === baselineOrigin)
136
+ return null;
137
+ const change = baselineOrigin
138
+ ? `The backend cannot move from ${baselineOrigin} to ${origin}`
139
+ : `A backend on ${origin} cannot be added`;
140
+ return this.lineIssue(release_rejection_code_enum_1.ReleaseRejectionCode.BACKEND_ORIGIN_CHANGED, change, baseline);
141
+ }
142
+ lineIssue(code, incompatibility, baseline) {
143
+ const escape = (0, semver_util_1.majorOf)(baseline.semver) === 0
144
+ ? 'bump the minor version to ship this breaking change while below 1.0.0'
145
+ : 'publish a new major version to ship this breaking change';
146
+ return {
147
+ code,
148
+ detail: `${incompatibility} within the ${baseline.semver} compatibility line; ${escape}`,
149
+ };
150
+ }
151
+ async checkBackendUrl(manifest) {
152
+ if (!manifest.backend)
153
+ return null;
154
+ const checked = await this.remoteUrlValidator.checkPublicHttps((0, plugin_manifest_util_1.resolveBackendUrl)(manifest.backend, manifest.delivery.url));
155
+ return checked.ok ? null : { code: checked.code, detail: `backend.url: ${checked.detail}` };
156
+ }
157
+ async resolveCredentialRequirements(manifest, mode) {
158
+ if (!manifest.credentials.some(externalLocator)) {
159
+ return { ok: true, requirements: manifest.credentials };
160
+ }
161
+ if (!this.externalCredentialDefinitions) {
162
+ throw new Error('External Credential definitions are not available');
163
+ }
164
+ try {
165
+ if (mode === 'preview') {
166
+ await this.externalCredentialDefinitions.previewRequirements(manifest.credentials);
167
+ return { ok: true, requirements: manifest.credentials };
168
+ }
169
+ return {
170
+ ok: true,
171
+ requirements: await this.externalCredentialDefinitions.resolveRequirements(manifest.credentials),
172
+ };
173
+ }
174
+ catch (error) {
175
+ if (!(error instanceof external_credential_definition_sync_service_1.ExternalCredentialRequirementError))
176
+ throw error;
177
+ return {
178
+ ok: false,
179
+ code: release_rejection_code_enum_1.ReleaseRejectionCode.MANIFEST_SCHEMA,
180
+ detail: (0, internal_helpers_1.castError)(error).message,
181
+ };
182
+ }
183
+ }
184
+ };
185
+ exports.ReleaseCandidateRulesService = ReleaseCandidateRulesService;
186
+ exports.ReleaseCandidateRulesService = ReleaseCandidateRulesService = __decorate([
187
+ (0, common_1.Injectable)(),
188
+ __param(4, (0, common_1.Optional)()),
189
+ __metadata("design:paramtypes", [github_api_service_1.GithubApiService,
190
+ remote_url_validator_service_1.RemoteUrlValidatorService,
191
+ plugin_version_service_1.PluginVersionService,
192
+ action_input_validator_service_1.ActionInputValidatorService,
193
+ external_credential_definition_sync_service_1.ExternalCredentialDefinitionSyncService])
194
+ ], ReleaseCandidateRulesService);
195
+ function externalLocator(requirement) {
196
+ return (typeof requirement === 'string' ? requirement : requirement.id).startsWith('@');
197
+ }
198
+ //# sourceMappingURL=release-candidate-rules.service.js.map
@@ -13,6 +13,13 @@ export declare class RemoteUrlValidatorService {
13
13
  private readonly logger;
14
14
  constructor(config: PluginHostConfigService);
15
15
  validate(rawUrl: string): Promise<RemoteUrlCheckResult>;
16
+ checkPublicHttps(rawUrl: string): Promise<{
17
+ readonly ok: true;
18
+ } | {
19
+ readonly ok: false;
20
+ readonly code: ReleaseRejectionCode;
21
+ readonly detail: string;
22
+ }>;
16
23
  private run;
17
24
  private walk;
18
25
  private guard;
@@ -34,6 +34,10 @@ let RemoteUrlValidatorService = RemoteUrlValidatorService_1 = class RemoteUrlVal
34
34
  return this.reject(release_rejection_code_enum_1.ReleaseRejectionCode.URL_UNREACHABLE, 'The delivery URL could not be read');
35
35
  }
36
36
  }
37
+ async checkPublicHttps(rawUrl) {
38
+ const guarded = await this.guard(rawUrl);
39
+ return guarded.ok ? { ok: true } : guarded;
40
+ }
37
41
  async run(rawUrl) {
38
42
  const walked = await this.walk(rawUrl, release_rejection_code_enum_1.ReleaseRejectionCode.URL_UNREACHABLE);
39
43
  if (!walked.ok) {
@@ -0,0 +1,14 @@
1
+ import { SystemTrigger } from '../../common/scheduler/shared/entities/system-trigger.entity';
2
+ import { BaseSystemTaskProcessor } from '../../common/scheduler/system-tasks/base-system-task.processor';
3
+ import { SystemTriggerType } from '../../common/scheduler/system-tasks/system-trigger-type';
4
+ import { PluginActionExecutionService } from '../services/plugin-action-execution.service';
5
+ export declare class PluginActionExecutionSweepProcessor extends BaseSystemTaskProcessor {
6
+ private readonly executions;
7
+ private readonly logger;
8
+ constructor(executions: PluginActionExecutionService);
9
+ getType(): SystemTriggerType;
10
+ getDefaultCron(): string;
11
+ process(_trigger: SystemTrigger, options?: {
12
+ signal?: AbortSignal;
13
+ }): Promise<void>;
14
+ }
@@ -0,0 +1,50 @@
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 PluginActionExecutionSweepProcessor_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PluginActionExecutionSweepProcessor = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const base_system_task_processor_1 = require("../../common/scheduler/system-tasks/base-system-task.processor");
16
+ const system_trigger_type_1 = require("../../common/scheduler/system-tasks/system-trigger-type");
17
+ const plugin_action_limits_1 = require("../constants/plugin-action-limits");
18
+ const plugin_action_execution_service_1 = require("../services/plugin-action-execution.service");
19
+ const CRON = '* * * * *';
20
+ const HOUR_MS = 60 * 60 * 1000;
21
+ const DAY_MS = 24 * HOUR_MS;
22
+ let PluginActionExecutionSweepProcessor = PluginActionExecutionSweepProcessor_1 = class PluginActionExecutionSweepProcessor extends base_system_task_processor_1.BaseSystemTaskProcessor {
23
+ executions;
24
+ logger = new common_1.Logger(PluginActionExecutionSweepProcessor_1.name);
25
+ constructor(executions) {
26
+ super();
27
+ this.executions = executions;
28
+ }
29
+ getType() {
30
+ return system_trigger_type_1.SystemTriggerType.PLUGIN_ACTION_EXECUTION_SWEEP;
31
+ }
32
+ getDefaultCron() {
33
+ return CRON;
34
+ }
35
+ async process(_trigger, options) {
36
+ const now = Date.now();
37
+ const timedOut = await this.executions.timeOutOrphans(new Date(now - plugin_action_limits_1.PLUGIN_ACTION_LIMITS.orphanGraceMs));
38
+ await this.executions.clearPayloads(new Date(now - plugin_action_limits_1.PLUGIN_ACTION_LIMITS.payloadRetentionHours * HOUR_MS), options?.signal);
39
+ await this.executions.deleteFinished(new Date(now - plugin_action_limits_1.PLUGIN_ACTION_LIMITS.rowRetentionDays * DAY_MS), options?.signal);
40
+ if (timedOut > 0) {
41
+ this.logger.warn(`${timedOut} plugin action executions outlived the replica that dispatched them and were marked TIMED_OUT`);
42
+ }
43
+ }
44
+ };
45
+ exports.PluginActionExecutionSweepProcessor = PluginActionExecutionSweepProcessor;
46
+ exports.PluginActionExecutionSweepProcessor = PluginActionExecutionSweepProcessor = PluginActionExecutionSweepProcessor_1 = __decorate([
47
+ (0, common_1.Injectable)(),
48
+ __metadata("design:paramtypes", [plugin_action_execution_service_1.PluginActionExecutionService])
49
+ ], PluginActionExecutionSweepProcessor);
50
+ //# sourceMappingURL=plugin-action-execution-sweep.processor.js.map
@@ -0,0 +1,8 @@
1
+ import { CancelPluginActionExecutionCommand } from '../dto/domain/plugin-action-execution.command';
2
+ import type { PluginActionExecutionView } from '../dto/domain/plugin-action-execution.dto';
3
+ import { PluginActionExecutionService } from '../services/plugin-action-execution.service';
4
+ export declare class CancelPluginActionExecutionService {
5
+ private readonly executions;
6
+ constructor(executions: PluginActionExecutionService);
7
+ run(command: CancelPluginActionExecutionCommand): Promise<PluginActionExecutionView>;
8
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CancelPluginActionExecutionService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const plugin_action_errors_1 = require("../errors/plugin-action.errors");
15
+ const plugin_action_execution_mapper_1 = require("../mappers/plugin-action-execution.mapper");
16
+ const plugin_action_execution_service_1 = require("../services/plugin-action-execution.service");
17
+ let CancelPluginActionExecutionService = class CancelPluginActionExecutionService {
18
+ executions;
19
+ constructor(executions) {
20
+ this.executions = executions;
21
+ }
22
+ async run(command) {
23
+ const installationId = command.context.installationId;
24
+ if (installationId) {
25
+ await this.executions.cancel(command.id, installationId);
26
+ }
27
+ const execution = await this.executions.findById(command.id);
28
+ if (!execution || execution.installationId !== installationId) {
29
+ throw new plugin_action_errors_1.ExecutionNotFoundError();
30
+ }
31
+ return (0, plugin_action_execution_mapper_1.toPluginActionExecutionView)(execution);
32
+ }
33
+ };
34
+ exports.CancelPluginActionExecutionService = CancelPluginActionExecutionService;
35
+ exports.CancelPluginActionExecutionService = CancelPluginActionExecutionService = __decorate([
36
+ (0, common_1.Injectable)(),
37
+ __metadata("design:paramtypes", [plugin_action_execution_service_1.PluginActionExecutionService])
38
+ ], CancelPluginActionExecutionService);
39
+ //# sourceMappingURL=cancel-plugin-action-execution.service.js.map
@@ -0,0 +1,22 @@
1
+ import { PluginHostConfigService } from '../config/plugin-host.config';
2
+ import { CheckPluginReleaseCommand, PluginReleaseCheckResultDto } from '../dto/domain/check-plugin-release.command';
3
+ import { GithubApiService } from '../services/github-api.service';
4
+ import { PluginPublicationService } from '../services/plugin-publication.service';
5
+ import { PluginVersionService } from '../services/plugin-version.service';
6
+ import { PluginService } from '../services/plugin.service';
7
+ import { PublicationAuthorizationService } from '../services/publication-authorization.service';
8
+ import { ReleaseCandidateRulesService } from '../services/release-candidate-rules.service';
9
+ export declare class CheckPluginReleaseService {
10
+ private readonly pluginService;
11
+ private readonly authorization;
12
+ private readonly publications;
13
+ private readonly versionService;
14
+ private readonly githubApi;
15
+ private readonly candidateRules;
16
+ private readonly config;
17
+ private readonly lastCheckAt;
18
+ constructor(pluginService: PluginService, authorization: PublicationAuthorizationService, publications: PluginPublicationService, versionService: PluginVersionService, githubApi: GithubApiService, candidateRules: ReleaseCandidateRulesService, config: PluginHostConfigService);
19
+ run(command: CheckPluginReleaseCommand): Promise<PluginReleaseCheckResultDto>;
20
+ private versionConflict;
21
+ private claimSlot;
22
+ }