@wildo-ai/platform-config-lib 1.0.1

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 (230) hide show
  1. package/dist/esm/bootstrap/application-backend-env.contracts.d.ts +2 -0
  2. package/dist/esm/bootstrap/application-backend-env.contracts.d.ts.map +1 -0
  3. package/dist/esm/bootstrap/application-backend-env.contracts.js +2 -0
  4. package/dist/esm/bootstrap/application-backend-env.contracts.js.map +1 -0
  5. package/dist/esm/bootstrap/bootstrap-planner.d.ts +20 -0
  6. package/dist/esm/bootstrap/bootstrap-planner.d.ts.map +1 -0
  7. package/dist/esm/bootstrap/bootstrap-planner.js +26 -0
  8. package/dist/esm/bootstrap/bootstrap-planner.js.map +1 -0
  9. package/dist/esm/bootstrap/bootstrap.contracts.d.ts +120 -0
  10. package/dist/esm/bootstrap/bootstrap.contracts.d.ts.map +1 -0
  11. package/dist/esm/bootstrap/bootstrap.contracts.js +117 -0
  12. package/dist/esm/bootstrap/bootstrap.contracts.js.map +1 -0
  13. package/dist/esm/bootstrap/bootstrap.schemas.d.ts +485 -0
  14. package/dist/esm/bootstrap/bootstrap.schemas.d.ts.map +1 -0
  15. package/dist/esm/bootstrap/bootstrap.schemas.js +130 -0
  16. package/dist/esm/bootstrap/bootstrap.schemas.js.map +1 -0
  17. package/dist/esm/bootstrap/platform-runtime-env.contracts.d.ts +78 -0
  18. package/dist/esm/bootstrap/platform-runtime-env.contracts.d.ts.map +1 -0
  19. package/dist/esm/bootstrap/platform-runtime-env.contracts.js +98 -0
  20. package/dist/esm/bootstrap/platform-runtime-env.contracts.js.map +1 -0
  21. package/dist/esm/bootstrap/runtime-topology.contracts.d.ts +17 -0
  22. package/dist/esm/bootstrap/runtime-topology.contracts.d.ts.map +1 -0
  23. package/dist/esm/bootstrap/runtime-topology.contracts.js +60 -0
  24. package/dist/esm/bootstrap/runtime-topology.contracts.js.map +1 -0
  25. package/dist/esm/credentials/credential-generator.service.d.ts +11 -0
  26. package/dist/esm/credentials/credential-generator.service.d.ts.map +1 -0
  27. package/dist/esm/credentials/credential-generator.service.js +31 -0
  28. package/dist/esm/credentials/credential-generator.service.js.map +1 -0
  29. package/dist/esm/credentials/credentials-provisioner.service.d.ts +190 -0
  30. package/dist/esm/credentials/credentials-provisioner.service.d.ts.map +1 -0
  31. package/dist/esm/credentials/credentials-provisioner.service.js +278 -0
  32. package/dist/esm/credentials/credentials-provisioner.service.js.map +1 -0
  33. package/dist/esm/index.d.ts +16 -0
  34. package/dist/esm/index.d.ts.map +1 -0
  35. package/dist/esm/index.js +16 -0
  36. package/dist/esm/index.js.map +1 -0
  37. package/dist/esm/infra-managers/infra-manager.models.d.ts +146 -0
  38. package/dist/esm/infra-managers/infra-manager.models.d.ts.map +1 -0
  39. package/dist/esm/infra-managers/infra-manager.models.js +2 -0
  40. package/dist/esm/infra-managers/infra-manager.models.js.map +1 -0
  41. package/dist/esm/infra-managers/mongo-atlas-manager.service.d.ts +64 -0
  42. package/dist/esm/infra-managers/mongo-atlas-manager.service.d.ts.map +1 -0
  43. package/dist/esm/infra-managers/mongo-atlas-manager.service.js +307 -0
  44. package/dist/esm/infra-managers/mongo-atlas-manager.service.js.map +1 -0
  45. package/dist/esm/infra-managers/postgresql-manager.service.d.ts +115 -0
  46. package/dist/esm/infra-managers/postgresql-manager.service.d.ts.map +1 -0
  47. package/dist/esm/infra-managers/postgresql-manager.service.js +403 -0
  48. package/dist/esm/infra-managers/postgresql-manager.service.js.map +1 -0
  49. package/dist/esm/infra-managers/rabbitmq-manager.service.d.ts +64 -0
  50. package/dist/esm/infra-managers/rabbitmq-manager.service.d.ts.map +1 -0
  51. package/dist/esm/infra-managers/rabbitmq-manager.service.js +288 -0
  52. package/dist/esm/infra-managers/rabbitmq-manager.service.js.map +1 -0
  53. package/dist/esm/infra-managers/redis-manager.service.d.ts +78 -0
  54. package/dist/esm/infra-managers/redis-manager.service.d.ts.map +1 -0
  55. package/dist/esm/infra-managers/redis-manager.service.js +326 -0
  56. package/dist/esm/infra-managers/redis-manager.service.js.map +1 -0
  57. package/dist/esm/project-config/define-framework-config.d.ts +36 -0
  58. package/dist/esm/project-config/define-framework-config.d.ts.map +1 -0
  59. package/dist/esm/project-config/define-framework-config.js +30 -0
  60. package/dist/esm/project-config/define-framework-config.js.map +1 -0
  61. package/dist/esm/project-config/define-infra-config.d.ts +128 -0
  62. package/dist/esm/project-config/define-infra-config.d.ts.map +1 -0
  63. package/dist/esm/project-config/define-infra-config.js +87 -0
  64. package/dist/esm/project-config/define-infra-config.js.map +1 -0
  65. package/dist/esm/project-config/define-minion-config.d.ts +41 -0
  66. package/dist/esm/project-config/define-minion-config.d.ts.map +1 -0
  67. package/dist/esm/project-config/define-minion-config.js +24 -0
  68. package/dist/esm/project-config/define-minion-config.js.map +1 -0
  69. package/dist/esm/project-config/define-platform-config.d.ts +65 -0
  70. package/dist/esm/project-config/define-platform-config.d.ts.map +1 -0
  71. package/dist/esm/project-config/define-platform-config.js +22 -0
  72. package/dist/esm/project-config/define-platform-config.js.map +1 -0
  73. package/dist/esm/project-config/define-platform-env-config.d.ts +41 -0
  74. package/dist/esm/project-config/define-platform-env-config.d.ts.map +1 -0
  75. package/dist/esm/project-config/define-platform-env-config.js +45 -0
  76. package/dist/esm/project-config/define-platform-env-config.js.map +1 -0
  77. package/dist/esm/project-config/define-project-config.d.ts +38 -0
  78. package/dist/esm/project-config/define-project-config.d.ts.map +1 -0
  79. package/dist/esm/project-config/define-project-config.js +57 -0
  80. package/dist/esm/project-config/define-project-config.js.map +1 -0
  81. package/dist/esm/project-config/define-saas-config.d.ts +252 -0
  82. package/dist/esm/project-config/define-saas-config.d.ts.map +1 -0
  83. package/dist/esm/project-config/define-saas-config.js +137 -0
  84. package/dist/esm/project-config/define-saas-config.js.map +1 -0
  85. package/dist/esm/project-config/define-sharing-policy.d.ts +35 -0
  86. package/dist/esm/project-config/define-sharing-policy.d.ts.map +1 -0
  87. package/dist/esm/project-config/define-sharing-policy.js +30 -0
  88. package/dist/esm/project-config/define-sharing-policy.js.map +1 -0
  89. package/dist/esm/project-config/define-worker-config.d.ts +42 -0
  90. package/dist/esm/project-config/define-worker-config.d.ts.map +1 -0
  91. package/dist/esm/project-config/define-worker-config.js +24 -0
  92. package/dist/esm/project-config/define-worker-config.js.map +1 -0
  93. package/dist/esm/project-config/index.d.ts +22 -0
  94. package/dist/esm/project-config/index.d.ts.map +1 -0
  95. package/dist/esm/project-config/index.js +22 -0
  96. package/dist/esm/project-config/index.js.map +1 -0
  97. package/dist/esm/project-config/loader.d.ts +42 -0
  98. package/dist/esm/project-config/loader.d.ts.map +1 -0
  99. package/dist/esm/project-config/loader.js +164 -0
  100. package/dist/esm/project-config/loader.js.map +1 -0
  101. package/dist/esm/project-config/shared/application-modules.schemas.d.ts +10 -0
  102. package/dist/esm/project-config/shared/application-modules.schemas.d.ts.map +1 -0
  103. package/dist/esm/project-config/shared/application-modules.schemas.js +6 -0
  104. package/dist/esm/project-config/shared/application-modules.schemas.js.map +1 -0
  105. package/dist/esm/project-config/shared/application-modules.utils.d.ts +6 -0
  106. package/dist/esm/project-config/shared/application-modules.utils.d.ts.map +1 -0
  107. package/dist/esm/project-config/shared/application-modules.utils.js +26 -0
  108. package/dist/esm/project-config/shared/application-modules.utils.js.map +1 -0
  109. package/dist/esm/project-config/shared/backing-services.schemas.d.ts +68 -0
  110. package/dist/esm/project-config/shared/backing-services.schemas.d.ts.map +1 -0
  111. package/dist/esm/project-config/shared/backing-services.schemas.js +49 -0
  112. package/dist/esm/project-config/shared/backing-services.schemas.js.map +1 -0
  113. package/dist/esm/project-config/shared/data-services.schemas.d.ts +33 -0
  114. package/dist/esm/project-config/shared/data-services.schemas.d.ts.map +1 -0
  115. package/dist/esm/project-config/shared/data-services.schemas.js +47 -0
  116. package/dist/esm/project-config/shared/data-services.schemas.js.map +1 -0
  117. package/dist/esm/project-config/shared/env-example-defaults.d.ts +27 -0
  118. package/dist/esm/project-config/shared/env-example-defaults.d.ts.map +1 -0
  119. package/dist/esm/project-config/shared/env-example-defaults.js +30 -0
  120. package/dist/esm/project-config/shared/env-example-defaults.js.map +1 -0
  121. package/dist/esm/project-config/shared/environment.schemas.d.ts +106 -0
  122. package/dist/esm/project-config/shared/environment.schemas.d.ts.map +1 -0
  123. package/dist/esm/project-config/shared/environment.schemas.js +111 -0
  124. package/dist/esm/project-config/shared/environment.schemas.js.map +1 -0
  125. package/dist/esm/project-config/shared/infrastructure-defaults.schemas.d.ts +42 -0
  126. package/dist/esm/project-config/shared/infrastructure-defaults.schemas.d.ts.map +1 -0
  127. package/dist/esm/project-config/shared/infrastructure-defaults.schemas.js +42 -0
  128. package/dist/esm/project-config/shared/infrastructure-defaults.schemas.js.map +1 -0
  129. package/dist/esm/project-config/shared/k8s-utils.d.ts +36 -0
  130. package/dist/esm/project-config/shared/k8s-utils.d.ts.map +1 -0
  131. package/dist/esm/project-config/shared/k8s-utils.js +50 -0
  132. package/dist/esm/project-config/shared/k8s-utils.js.map +1 -0
  133. package/dist/esm/project-config/shared/platform-services.schemas.d.ts +30 -0
  134. package/dist/esm/project-config/shared/platform-services.schemas.d.ts.map +1 -0
  135. package/dist/esm/project-config/shared/platform-services.schemas.js +27 -0
  136. package/dist/esm/project-config/shared/platform-services.schemas.js.map +1 -0
  137. package/dist/esm/project-config/shared/service-definitions.schemas.d.ts +42 -0
  138. package/dist/esm/project-config/shared/service-definitions.schemas.d.ts.map +1 -0
  139. package/dist/esm/project-config/shared/service-definitions.schemas.js +29 -0
  140. package/dist/esm/project-config/shared/service-definitions.schemas.js.map +1 -0
  141. package/dist/esm/project-config/sharing-policy-validation.d.ts +40 -0
  142. package/dist/esm/project-config/sharing-policy-validation.d.ts.map +1 -0
  143. package/dist/esm/project-config/sharing-policy-validation.js +143 -0
  144. package/dist/esm/project-config/sharing-policy-validation.js.map +1 -0
  145. package/dist/esm/release/framework-release.constants.d.ts +3 -0
  146. package/dist/esm/release/framework-release.constants.d.ts.map +1 -0
  147. package/dist/esm/release/framework-release.constants.js +3 -0
  148. package/dist/esm/release/framework-release.constants.js.map +1 -0
  149. package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.d.ts +23 -0
  150. package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.d.ts.map +1 -0
  151. package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.js +13 -0
  152. package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.js.map +1 -0
  153. package/dist/esm/schemas/framework-info.schemas.d.ts +8 -0
  154. package/dist/esm/schemas/framework-info.schemas.d.ts.map +1 -0
  155. package/dist/esm/schemas/framework-info.schemas.js +8 -0
  156. package/dist/esm/schemas/framework-info.schemas.js.map +1 -0
  157. package/dist/esm/schemas/framework-secrets.schemas.d.ts +22 -0
  158. package/dist/esm/schemas/framework-secrets.schemas.d.ts.map +1 -0
  159. package/dist/esm/schemas/framework-secrets.schemas.js +14 -0
  160. package/dist/esm/schemas/framework-secrets.schemas.js.map +1 -0
  161. package/dist/esm/schemas/platform-application-config.schemas.d.ts +20 -0
  162. package/dist/esm/schemas/platform-application-config.schemas.d.ts.map +1 -0
  163. package/dist/esm/schemas/platform-application-config.schemas.js +19 -0
  164. package/dist/esm/schemas/platform-application-config.schemas.js.map +1 -0
  165. package/dist/esm/schemas/platform-application-secrets.schemas.d.ts +54 -0
  166. package/dist/esm/schemas/platform-application-secrets.schemas.d.ts.map +1 -0
  167. package/dist/esm/schemas/platform-application-secrets.schemas.js +67 -0
  168. package/dist/esm/schemas/platform-application-secrets.schemas.js.map +1 -0
  169. package/dist/esm/schemas/platform-config.schemas.d.ts +66 -0
  170. package/dist/esm/schemas/platform-config.schemas.d.ts.map +1 -0
  171. package/dist/esm/schemas/platform-config.schemas.js +28 -0
  172. package/dist/esm/schemas/platform-config.schemas.js.map +1 -0
  173. package/dist/esm/workspace-scope/index.d.ts +3 -0
  174. package/dist/esm/workspace-scope/index.d.ts.map +1 -0
  175. package/dist/esm/workspace-scope/index.js +3 -0
  176. package/dist/esm/workspace-scope/index.js.map +1 -0
  177. package/dist/esm/workspace-scope/workspace-scope-detector.d.ts +15 -0
  178. package/dist/esm/workspace-scope/workspace-scope-detector.d.ts.map +1 -0
  179. package/dist/esm/workspace-scope/workspace-scope-detector.js +87 -0
  180. package/dist/esm/workspace-scope/workspace-scope-detector.js.map +1 -0
  181. package/dist/esm/workspace-scope/workspace-scope.schemas.d.ts +118 -0
  182. package/dist/esm/workspace-scope/workspace-scope.schemas.d.ts.map +1 -0
  183. package/dist/esm/workspace-scope/workspace-scope.schemas.js +157 -0
  184. package/dist/esm/workspace-scope/workspace-scope.schemas.js.map +1 -0
  185. package/dist/tsconfig.build.tsbuildinfo +1 -0
  186. package/package.json +52 -0
  187. package/src/bootstrap/application-backend-env.contracts.ts +17 -0
  188. package/src/bootstrap/bootstrap-planner.ts +46 -0
  189. package/src/bootstrap/bootstrap.contracts.ts +251 -0
  190. package/src/bootstrap/bootstrap.schemas.ts +164 -0
  191. package/src/bootstrap/platform-runtime-env.contracts.ts +99 -0
  192. package/src/bootstrap/runtime-topology.contracts.ts +102 -0
  193. package/src/credentials/credential-generator.service.ts +39 -0
  194. package/src/index.ts +16 -0
  195. package/src/project-config/__tests__/application-modules.utils.test.ts +53 -0
  196. package/src/project-config/__tests__/define-framework-config.test.ts +43 -0
  197. package/src/project-config/__tests__/define-saas-config.test.ts +210 -0
  198. package/src/project-config/__tests__/loader.test.ts +100 -0
  199. package/src/project-config/define-framework-config.ts +44 -0
  200. package/src/project-config/define-infra-config.ts +168 -0
  201. package/src/project-config/define-minion-config.ts +27 -0
  202. package/src/project-config/define-platform-config.ts +28 -0
  203. package/src/project-config/define-platform-env-config.ts +59 -0
  204. package/src/project-config/define-project-config.ts +63 -0
  205. package/src/project-config/define-saas-config.ts +171 -0
  206. package/src/project-config/define-sharing-policy.ts +36 -0
  207. package/src/project-config/define-worker-config.ts +27 -0
  208. package/src/project-config/index.ts +23 -0
  209. package/src/project-config/loader.ts +220 -0
  210. package/src/project-config/shared/application-modules.schemas.ts +12 -0
  211. package/src/project-config/shared/application-modules.utils.ts +65 -0
  212. package/src/project-config/shared/backing-services.schemas.ts +59 -0
  213. package/src/project-config/shared/data-services.schemas.ts +58 -0
  214. package/src/project-config/shared/env-example-defaults.ts +50 -0
  215. package/src/project-config/shared/environment.schemas.ts +136 -0
  216. package/src/project-config/shared/infrastructure-defaults.schemas.ts +47 -0
  217. package/src/project-config/shared/k8s-utils.ts +56 -0
  218. package/src/project-config/shared/platform-services.schemas.ts +33 -0
  219. package/src/project-config/shared/service-definitions.schemas.ts +38 -0
  220. package/src/project-config/sharing-policy-validation.ts +159 -0
  221. package/src/release/framework-release.constants.ts +2 -0
  222. package/src/schemas/__tests__/platform-config.schemas.test.ts +90 -0
  223. package/src/schemas/framework-info.schemas.ts +13 -0
  224. package/src/schemas/framework-secrets.schemas.ts +19 -0
  225. package/src/schemas/platform-application-config.schemas.ts +25 -0
  226. package/src/schemas/platform-application-secrets.schemas.ts +78 -0
  227. package/src/schemas/platform-config.schemas.ts +45 -0
  228. package/src/workspace-scope/index.ts +2 -0
  229. package/src/workspace-scope/workspace-scope-detector.ts +98 -0
  230. package/src/workspace-scope/workspace-scope.schemas.ts +224 -0
@@ -0,0 +1,17 @@
1
+ export {
2
+ APPLICATION_BACKEND_BOOTSTRAP_ENV_KEY_LIST,
3
+ APPLICATION_BACKEND_DATA_ENV_KEY_LIST,
4
+ APPLICATION_BACKEND_ENV_KEY_LIST,
5
+ APPLICATION_BACKEND_PLATFORM_URL_ENV_KEY_LIST,
6
+ APPLICATION_BACKEND_RUNTIME_ENV_KEY_LIST,
7
+ APPLICATION_BACKEND_SENSITIVE_ENV_KEYS,
8
+ ApplicationBackendBootstrapEnvKey,
9
+ ApplicationBackendBootstrapEnvKeys,
10
+ ApplicationBackendDataEnvKey,
11
+ ApplicationBackendDataEnvKeys,
12
+ type ApplicationBackendEnvKey,
13
+ ApplicationBackendPlatformUrlEnvKey,
14
+ ApplicationBackendPlatformUrlEnvKeys,
15
+ ApplicationBackendRuntimeEnvKey,
16
+ ApplicationBackendRuntimeEnvKeys,
17
+ } from '@wildo-ai/platform-core-shared';
@@ -0,0 +1,46 @@
1
+ import { BootstrapExecutorKind, BootstrapStepId } from './bootstrap.schemas';
2
+
3
+ export interface BootstrapPlanInput {
4
+ executor: BootstrapExecutorKind;
5
+ initializePlatform?: boolean;
6
+ ensureApplication?: boolean;
7
+ fetchBootstrapCredentials?: boolean;
8
+ generateRuntimeArtifacts?: boolean;
9
+ startLocalRuntime?: boolean;
10
+ }
11
+
12
+ export interface BootstrapPlanStep {
13
+ id: BootstrapStepId;
14
+ required: boolean;
15
+ }
16
+
17
+ /**
18
+ * Build a semantic bootstrap plan independent of the concrete executor.
19
+ * Executors (CLI local processes, CI/CD remote jobs, HTTP workflows) can interpret
20
+ * the same ordered steps differently while keeping one shared core behavior.
21
+ */
22
+ export function buildBootstrapPlan(input: BootstrapPlanInput): BootstrapPlanStep[] {
23
+ const steps: BootstrapPlanStep[] = [];
24
+
25
+ if (input.initializePlatform) {
26
+ steps.push({ id: BootstrapStepId.INITIALIZE_PLATFORM, required: true });
27
+ }
28
+
29
+ if (input.ensureApplication) {
30
+ steps.push({ id: BootstrapStepId.ENSURE_APPLICATION, required: true });
31
+ }
32
+
33
+ if (input.fetchBootstrapCredentials) {
34
+ steps.push({ id: BootstrapStepId.FETCH_BOOTSTRAP_CREDENTIALS, required: true });
35
+ }
36
+
37
+ if (input.generateRuntimeArtifacts) {
38
+ steps.push({ id: BootstrapStepId.GENERATE_RUNTIME_ARTIFACTS, required: true });
39
+ }
40
+
41
+ if (input.executor === BootstrapExecutorKind.LOCAL && input.startLocalRuntime) {
42
+ steps.push({ id: BootstrapStepId.START_LOCAL_RUNTIME, required: true });
43
+ }
44
+
45
+ return steps;
46
+ }
@@ -0,0 +1,251 @@
1
+ import { RuntimeEnvironment } from '@wildo-ai/saas-models';
2
+ import type { ApplicationModules } from '../project-config/shared/application-modules.schemas';
3
+ import {
4
+ getDeclaredApplicationModuleIds,
5
+ getServiceBoundApplicationModuleIds,
6
+ } from '../project-config/shared/application-modules.utils';
7
+ import type { AppDataServices } from '../project-config/shared/data-services.schemas';
8
+ import { deriveAppDatabaseName } from '../project-config/shared/data-services.schemas';
9
+ import type {
10
+ CapabilityBindingInput,
11
+ ExternalProvidersConfigurationsInput,
12
+ } from '../project-config/define-saas-config';
13
+ import {
14
+ AdminAppManagedDeclarationSchema,
15
+ AppBootstrapCredentialsResponseSchema,
16
+ type AppBootstrapCredentialsResponse,
17
+ type AppBootstrapFirstAdminSeed,
18
+ type AdminAppManagedDeclaration,
19
+ type AdminAppInitializeRequest,
20
+ } from './bootstrap.schemas';
21
+
22
+ export interface BuildAppBootstrapCredentialsResponseInput {
23
+ appSlug: string;
24
+ environment: RuntimeEnvironment;
25
+ applicationId: string;
26
+ primarySecret: string;
27
+ appsManagerUrl: string;
28
+ }
29
+
30
+ /**
31
+ * apps-manager control-plane bootstrap protocol details shared by CLI callers
32
+ * and apps-manager producers.
33
+ */
34
+ export const APPS_MANAGER_ADMIN_SECRET_HEADER = 'X-Admin-Secret';
35
+ export const APPS_MANAGER_API_PREFIX = '/api/v1';
36
+
37
+ export function buildAdminInitializeApplicationPath(appSlug: string): string {
38
+ return `/admin/apps/${encodeURIComponent(appSlug)}/initialize`;
39
+ }
40
+
41
+ export function buildAppBootstrapCredentialsPath(
42
+ appSlug: string,
43
+ environment: RuntimeEnvironment,
44
+ ): string {
45
+ return `/admin/apps/${encodeURIComponent(appSlug)}/credentials/${environment}`;
46
+ }
47
+
48
+ /**
49
+ * Build and validate the shared bootstrap credentials response envelope.
50
+ * This keeps the response contract identical across apps-manager producers and CLI consumers.
51
+ */
52
+ export function buildAppBootstrapCredentialsResponse(
53
+ input: BuildAppBootstrapCredentialsResponseInput,
54
+ ): AppBootstrapCredentialsResponse {
55
+ return AppBootstrapCredentialsResponseSchema.parse({
56
+ success: true,
57
+ appSlug: input.appSlug,
58
+ environment: input.environment,
59
+ credentials: {
60
+ APPLICATION_ID: input.applicationId,
61
+ PLATFORM_APPLICATION_PRIMARY_SECRET: input.primarySecret,
62
+ PLATFORM_APPS_MANAGER_URL: input.appsManagerUrl,
63
+ APPLICATION_ENV: input.environment,
64
+ },
65
+ });
66
+ }
67
+
68
+ /**
69
+ * Small shared semantic descriptor for already-loaded app config.
70
+ * Filesystem/path-bearing adapter data should stay in the CLI layer.
71
+ */
72
+ export interface NormalizedProjectAppDescriptor {
73
+ appKey: string;
74
+ appPath: string;
75
+ appType: 'saas';
76
+ }
77
+
78
+ export function normalizeProjectApps(input: {
79
+ apps: Record<string, { path: string; type: 'saas' }>;
80
+ }): NormalizedProjectAppDescriptor[] {
81
+ return Object.entries(input.apps).map(([appKey, app]) => ({
82
+ appKey,
83
+ appPath: app.path,
84
+ appType: app.type,
85
+ }));
86
+ }
87
+
88
+ export interface NormalizedSaasBackendServiceDescriptor {
89
+ key: string;
90
+ path: string;
91
+ serviceName: string;
92
+ defaultPort?: number | undefined;
93
+ }
94
+
95
+ export interface NormalizedSaasFrontendServiceDescriptor {
96
+ key: string;
97
+ path: string;
98
+ serviceName: string;
99
+ defaultPort?: number | undefined;
100
+ frontendType: string;
101
+ }
102
+
103
+ export interface NormalizedSaasRuntimeDescriptor {
104
+ appSlug: string;
105
+ appDisplayName: string;
106
+ appDatabaseName?: string | undefined;
107
+ backendServices: NormalizedSaasBackendServiceDescriptor[];
108
+ frontendServices: NormalizedSaasFrontendServiceDescriptor[];
109
+ managedDeclaration: AdminAppManagedDeclaration;
110
+ firstAdminSeed?: AppBootstrapFirstAdminSeed | undefined;
111
+ declaredModules: NonNullable<ApplicationModules>;
112
+ moduleIds: string[];
113
+ moduleIdsByService: Record<string, string[]>;
114
+ }
115
+
116
+ export interface NormalizedLocalServiceAddressingDescriptor {
117
+ host?: string | undefined;
118
+ port?: number | undefined;
119
+ url?: string | undefined;
120
+ }
121
+
122
+ export function normalizeSaasModuleBindings(input: {
123
+ services: Record<string, { serviceName: string }>;
124
+ modules?: ApplicationModules | undefined;
125
+ }) {
126
+ const declaredModules = input.modules ?? {};
127
+
128
+ return {
129
+ declaredModules,
130
+ moduleIds: getDeclaredApplicationModuleIds(declaredModules),
131
+ moduleIdsByService: Object.fromEntries(
132
+ Object.keys(input.services).map((serviceKey) => [
133
+ serviceKey,
134
+ getServiceBoundApplicationModuleIds(declaredModules, serviceKey),
135
+ ]),
136
+ ),
137
+ };
138
+ }
139
+
140
+ export function buildAdminAppManagedDeclaration(input: {
141
+ name: string;
142
+ slug: string;
143
+ displayName: string;
144
+ description?: string | undefined;
145
+ type: 'saas';
146
+ services: Record<
147
+ string,
148
+ {
149
+ serviceName: string;
150
+ frontendType?: string | undefined;
151
+ }
152
+ >;
153
+ capabilities?: Record<string, CapabilityBindingInput> | undefined;
154
+ externalProvidersConfigurations?: ExternalProvidersConfigurationsInput | undefined;
155
+ }): AdminAppManagedDeclaration {
156
+ return AdminAppManagedDeclarationSchema.parse({
157
+ app: {
158
+ name: input.name,
159
+ slug: input.slug,
160
+ displayName: input.displayName,
161
+ description: input.description,
162
+ type: input.type,
163
+ },
164
+ frontendServices: Object.values(input.services)
165
+ .filter((service) => service.frontendType !== undefined)
166
+ .map((service) => ({
167
+ serviceName: service.serviceName,
168
+ frontendType: service.frontendType,
169
+ })),
170
+ capabilities: input.capabilities,
171
+ externalProvidersConfigurations: input.externalProvidersConfigurations,
172
+ });
173
+ }
174
+
175
+ export function normalizeSaasRuntimeDescriptor(input: {
176
+ projectAppKey?: string | undefined;
177
+ name: string;
178
+ slug: string;
179
+ displayName: string;
180
+ description?: string | undefined;
181
+ type: 'saas';
182
+ services: Record<
183
+ string,
184
+ {
185
+ path: string;
186
+ serviceName: string;
187
+ defaultPort?: number | undefined;
188
+ frontendType?: string | undefined;
189
+ }
190
+ >;
191
+ capabilities?: Record<string, CapabilityBindingInput> | undefined;
192
+ externalProvidersConfigurations?: ExternalProvidersConfigurationsInput | undefined;
193
+ dataServices?: AppDataServices | undefined;
194
+ modules?: ApplicationModules | undefined;
195
+ bootstrap?: {
196
+ firstAdmin?: AppBootstrapFirstAdminSeed | undefined;
197
+ } | undefined;
198
+ }): NormalizedSaasRuntimeDescriptor {
199
+ if (input.projectAppKey && input.projectAppKey !== input.slug) {
200
+ throw new Error(
201
+ `Project app key "${input.projectAppKey}" must match SaaS slug "${input.slug}" for coherent app identity`,
202
+ );
203
+ }
204
+
205
+ const backendServices = Object.entries(input.services)
206
+ .filter(([, service]) => service.frontendType === undefined)
207
+ .map(([key, service]) => ({
208
+ key,
209
+ path: service.path,
210
+ serviceName: service.serviceName,
211
+ defaultPort: service.defaultPort,
212
+ }));
213
+
214
+ const frontendServices = Object.entries(input.services)
215
+ .filter(([, service]) => service.frontendType !== undefined)
216
+ .map(([key, service]) => ({
217
+ key,
218
+ path: service.path,
219
+ serviceName: service.serviceName,
220
+ defaultPort: service.defaultPort,
221
+ frontendType: service.frontendType!,
222
+ }));
223
+ const normalizedModuleBindings = normalizeSaasModuleBindings({
224
+ services: input.services,
225
+ modules: input.modules,
226
+ });
227
+
228
+ return {
229
+ appSlug: input.slug,
230
+ appDisplayName: input.displayName,
231
+ appDatabaseName: deriveAppDatabaseName(input.dataServices),
232
+ backendServices,
233
+ frontendServices,
234
+ managedDeclaration: buildAdminAppManagedDeclaration({
235
+ name: input.name,
236
+ slug: input.slug,
237
+ displayName: input.displayName,
238
+ description: input.description,
239
+ type: input.type,
240
+ services: input.services,
241
+ capabilities: input.capabilities,
242
+ externalProvidersConfigurations: input.externalProvidersConfigurations,
243
+ }),
244
+ firstAdminSeed: input.bootstrap?.firstAdmin,
245
+ declaredModules: normalizedModuleBindings.declaredModules,
246
+ moduleIds: normalizedModuleBindings.moduleIds,
247
+ moduleIdsByService: normalizedModuleBindings.moduleIdsByService,
248
+ };
249
+ }
250
+
251
+ export type { AdminAppInitializeRequest };
@@ -0,0 +1,164 @@
1
+ import {
2
+ AppConfiguration_Shared_AppIdentity_Schema,
3
+ CapabilityBindingsPolicySchema,
4
+ EngineCapability,
5
+ FrontendServicesConfigSchema,
6
+ RuntimeEnvironment,
7
+ } from '@wildo-ai/saas-models';
8
+ import { z } from 'zod';
9
+ import {
10
+ CapabilityBindingSchema,
11
+ ExternalProvidersConfigurationsSchema,
12
+ } from '../project-config/define-saas-config';
13
+ import { AppFrontendType } from '../project-config/shared/service-definitions.schemas';
14
+
15
+ /**
16
+ * Shared bootstrap execution mode.
17
+ * The workflow semantics stay the same; only the executor differs.
18
+ */
19
+ export enum BootstrapExecutorKind {
20
+ LOCAL = 'local',
21
+ REMOTE = 'remote',
22
+ }
23
+
24
+ /**
25
+ * Shared bootstrap step identifiers.
26
+ * These represent semantic workflow stages, not package-specific implementation details.
27
+ */
28
+ export enum BootstrapStepId {
29
+ INITIALIZE_PLATFORM = 'initialize-platform',
30
+ ENSURE_APPLICATION = 'ensure-application',
31
+ FETCH_BOOTSTRAP_CREDENTIALS = 'fetch-bootstrap-credentials',
32
+ GENERATE_RUNTIME_ARTIFACTS = 'generate-runtime-artifacts',
33
+ START_LOCAL_RUNTIME = 'start-local-runtime',
34
+ }
35
+
36
+ /**
37
+ * Minimum bootstrap credentials required for an application backend to authenticate
38
+ * with apps-manager and fetch its full runtime configuration.
39
+ */
40
+ export const AppBootstrapCredentialsSchema = z.object({
41
+ APPLICATION_ID: z.string().min(1),
42
+ PLATFORM_APPLICATION_PRIMARY_SECRET: z.string().min(1),
43
+ PLATFORM_APPS_MANAGER_URL: z.url(),
44
+ APPLICATION_ENV: z.nativeEnum(RuntimeEnvironment),
45
+ });
46
+
47
+ /**
48
+ * Shared response envelope returned by apps-manager when bootstrap credentials are requested.
49
+ * Both apps-manager and CLI should rely on this same contract.
50
+ * `environment` / `APPLICATION_ENV` describe runtime semantics for the
51
+ * bootstrapped application process, not the project-level remote environment id.
52
+ */
53
+ export const AppBootstrapCredentialsResponseSchema = z.object({
54
+ success: z.literal(true),
55
+ appSlug: z.string().min(1),
56
+ environment: z.nativeEnum(RuntimeEnvironment),
57
+ credentials: AppBootstrapCredentialsSchema,
58
+ });
59
+
60
+ export const AdminAppManagedDeclarationSchema = z.object({
61
+ app: z.object({
62
+ name: z.string().min(1),
63
+ slug: z.string().min(1),
64
+ displayName: z.string().min(1),
65
+ description: z.string().optional(),
66
+ type: z.literal('saas'),
67
+ }),
68
+ frontendServices: z.array(z.object({
69
+ serviceName: z.string().min(1),
70
+ frontendType: z.enum(AppFrontendType),
71
+ })).default([]),
72
+ capabilities: z.partialRecord(
73
+ z.enum(EngineCapability),
74
+ CapabilityBindingSchema,
75
+ ).optional(),
76
+ externalProvidersConfigurations: ExternalProvidersConfigurationsSchema,
77
+ });
78
+
79
+ export const AppBootstrapFirstAdminSeedSchema = z.object({
80
+ userTypes: z.array(z.string().min(1)).min(1),
81
+ });
82
+
83
+ const AppBootstrapRotatedPublicKeyEntrySchema = z.object({
84
+ kid: z.string().min(1),
85
+ publicKey: z.string().min(1),
86
+ });
87
+
88
+ export const AppBootstrapConfigMetadataResponseSchema = z.object({
89
+ appSlug: z.string().min(1),
90
+ appIdentity: AppConfiguration_Shared_AppIdentity_Schema.optional(),
91
+ frontendServices: FrontendServicesConfigSchema.optional(),
92
+ capabilities: CapabilityBindingsPolicySchema.optional(),
93
+ email: z.object({
94
+ isTransactionalWildoManaged: z.boolean(),
95
+ isMarketingWildoManaged: z.boolean(),
96
+ }).optional(),
97
+ externalProvidersConfigurations: ExternalProvidersConfigurationsSchema,
98
+ jwt: z.object({
99
+ publicKey: z.record(z.string(), z.string()),
100
+ rotatedPublicKeys: z.record(
101
+ z.string(),
102
+ z.array(AppBootstrapRotatedPublicKeyEntrySchema),
103
+ ).optional(),
104
+ }).optional(),
105
+ });
106
+
107
+ /**
108
+ * Shared admin request payload for a single app initialization.
109
+ * This describes the control-plane contract, independently of whether the caller
110
+ * is the CLI or a future CI/CD executor.
111
+ */
112
+ export const AdminAppInitializeRequestSchema = z.object({
113
+ name: z.string().min(1).optional(),
114
+ appDatabaseName: z.string().min(1).optional(),
115
+ override: z.boolean().optional(),
116
+ userEmail: z.string().email().optional(),
117
+ userFirstName: z.string().min(1).optional(),
118
+ userLastName: z.string().min(1).optional(),
119
+ userPassword: z.string().min(1).optional(),
120
+ managedDeclaration: AdminAppManagedDeclarationSchema.optional(),
121
+ firstAdminSeed: AppBootstrapFirstAdminSeedSchema.optional(),
122
+ });
123
+
124
+ export const AdminAppInitializeTargetSchema = z.object({
125
+ slug: z.string().min(1),
126
+ name: z.string().min(1).optional(),
127
+ appDatabaseName: z.string().min(1).optional(),
128
+ managedDeclaration: AdminAppManagedDeclarationSchema.optional(),
129
+ firstAdminSeed: AppBootstrapFirstAdminSeedSchema.optional(),
130
+ });
131
+
132
+ export const AdminAppsInitializeBatchRequestSchema = z.object({
133
+ override: z.boolean().optional(),
134
+ userEmail: z.string().email().optional(),
135
+ userFirstName: z.string().min(1).optional(),
136
+ userLastName: z.string().min(1).optional(),
137
+ userPassword: z.string().min(1).optional(),
138
+ targets: z.array(AdminAppInitializeTargetSchema).min(1),
139
+ });
140
+
141
+ /**
142
+ * Shared success response for a single app initialization request.
143
+ */
144
+ export const AdminAppInitializeResponseSchema = z.object({
145
+ success: z.literal(true),
146
+ application: z.object({
147
+ name: z.string().min(1),
148
+ slug: z.string().min(1),
149
+ }),
150
+ credentials: z.object({
151
+ email: z.string().email(),
152
+ password: z.string().min(1),
153
+ }),
154
+ });
155
+
156
+ export type AppBootstrapCredentials = z.infer<typeof AppBootstrapCredentialsSchema>;
157
+ export type AppBootstrapCredentialsResponse = z.infer<typeof AppBootstrapCredentialsResponseSchema>;
158
+ export type AdminAppManagedDeclaration = z.infer<typeof AdminAppManagedDeclarationSchema>;
159
+ export type AppBootstrapFirstAdminSeed = z.infer<typeof AppBootstrapFirstAdminSeedSchema>;
160
+ export type AppBootstrapConfigMetadataResponse = z.infer<typeof AppBootstrapConfigMetadataResponseSchema>;
161
+ export type AdminAppInitializeRequest = z.infer<typeof AdminAppInitializeRequestSchema>;
162
+ export type AdminAppInitializeTarget = z.infer<typeof AdminAppInitializeTargetSchema>;
163
+ export type AdminAppsInitializeBatchRequest = z.infer<typeof AdminAppsInitializeBatchRequestSchema>;
164
+ export type AdminAppInitializeResponse = z.infer<typeof AdminAppInitializeResponseSchema>;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Shared environment contract for platform runtime processes.
3
+ *
4
+ * This captures the canonical env-var vocabulary used by CLI-generated platform
5
+ * `.env` material and by platform services such as apps-manager at runtime.
6
+ * Keep these keys declarative and cross-executor: the contract owns names and
7
+ * sensitivity classification, while writers/readers own behavior.
8
+ */
9
+
10
+ export enum PlatformProcessEnvKey {
11
+ HOST = 'HOST',
12
+ PORT = 'PORT',
13
+ SERVICE_NAME = 'SERVICE_NAME',
14
+ PLATFORM_ENVIRONMENT_ID = 'PLATFORM_ENVIRONMENT_ID',
15
+ APPLICATION_ENV = 'APPLICATION_ENV',
16
+ APPS_MANAGER_MODE = 'APPS_MANAGER_MODE',
17
+ }
18
+
19
+ export enum PlatformServiceUrlEnvKey {
20
+ PLATFORM_APPS_MANAGER_URL = 'PLATFORM_APPS_MANAGER_URL',
21
+ PLATFORM_FILE_GENERATOR_URL = 'PLATFORM_FILE_GENERATOR_URL',
22
+ PLATFORM_CRONTABS_BATCHES_MANAGER_URL = 'PLATFORM_CRONTABS_BATCHES_MANAGER_URL',
23
+ }
24
+
25
+ export enum PlatformInfrastructureEnvKey {
26
+ MONGO_CONNECT_URL = 'MONGO_CONNECT_URL',
27
+ MONGO_PLATFORM_URL = 'MONGO_PLATFORM_URL',
28
+ BASE_MONGO_SERVER_URL = 'BASE_MONGO_SERVER_URL',
29
+ REDIS_HOST = 'REDIS_HOST',
30
+ REDIS_PORT = 'REDIS_PORT',
31
+ REDIS_ADMIN_USER = 'REDIS_ADMIN_USER',
32
+ REDIS_ADMIN_PASSWORD = 'REDIS_ADMIN_PASSWORD',
33
+ RABBITMQ_HOST = 'RABBITMQ_HOST',
34
+ RABBITMQ_PORT = 'RABBITMQ_PORT',
35
+ RABBITMQ_MANAGEMENT_PORT = 'RABBITMQ_MANAGEMENT_PORT',
36
+ RABBITMQ_ADMIN_USERNAME = 'RABBITMQ_ADMIN_USERNAME',
37
+ RABBITMQ_ADMIN_PASSWORD = 'RABBITMQ_ADMIN_PASSWORD',
38
+ STORAGE_PROVIDER = 'STORAGE_PROVIDER',
39
+ STORAGE_ENDPOINT = 'STORAGE_ENDPOINT',
40
+ STORAGE_PORT = 'STORAGE_PORT',
41
+ STORAGE_USE_SSL = 'STORAGE_USE_SSL',
42
+ STORAGE_BUCKET = 'STORAGE_BUCKET',
43
+ STORAGE_ACCESS_KEY = 'STORAGE_ACCESS_KEY',
44
+ STORAGE_SECRET_KEY = 'STORAGE_SECRET_KEY',
45
+ GOTENBERG_URL = 'GOTENBERG_URL',
46
+ PG_HOST = 'PG_HOST',
47
+ PG_PORT = 'PG_PORT',
48
+ PG_ADMIN_USER = 'PG_ADMIN_USER',
49
+ PG_ADMIN_PASSWORD = 'PG_ADMIN_PASSWORD',
50
+ PG_ADMIN_DATABASE = 'PG_ADMIN_DATABASE',
51
+ PG_SSL_MODE = 'PG_SSL_MODE',
52
+ }
53
+
54
+ export enum PlatformSecurityEnvKey {
55
+ PLATFORM_APPS_MANAGER_PRIVATE_KEY = 'PLATFORM_APPS_MANAGER_PRIVATE_KEY',
56
+ PLATFORM_APPS_MANAGER_PUBLIC_KEY = 'PLATFORM_APPS_MANAGER_PUBLIC_KEY',
57
+ PLATFORM_APPLICATION_PRIMARY_SECRET = 'PLATFORM_APPLICATION_PRIMARY_SECRET',
58
+ PLATFORM_ADMIN_SECRET = 'PLATFORM_ADMIN_SECRET',
59
+ }
60
+
61
+ export enum PlatformAdminEnvKey {
62
+ ADMIN_EMAIL = 'ADMIN_EMAIL',
63
+ ADMIN_PASSWORD = 'ADMIN_PASSWORD',
64
+ ADMIN_FIRST_NAME = 'ADMIN_FIRST_NAME',
65
+ ADMIN_LAST_NAME = 'ADMIN_LAST_NAME',
66
+ GITHUB_WILDO_APPS_DEFAULT_ORG_URL = 'GITHUB_WILDO_APPS_DEFAULT_ORG_URL',
67
+ GITHUB_WILDO_APPS_ADMIN_USER = 'GITHUB_WILDO_APPS_ADMIN_USER',
68
+ GITHUB_WILDO_APPS_ADMIN_TOKEN = 'GITHUB_WILDO_APPS_ADMIN_TOKEN',
69
+ GITHUB_WILDO_APPS_ADMIN_SSH_SK = 'GITHUB_WILDO_APPS_ADMIN_SSH_SK',
70
+ }
71
+
72
+ export enum PlatformKubernetesEnvKey {
73
+ K8S_NAMESPACE = 'K8S_NAMESPACE',
74
+ K8S_EXTERNAL_BASE_DOMAIN = 'K8S_EXTERNAL_BASE_DOMAIN',
75
+ K8S_IMAGE_REGISTRY = 'K8S_IMAGE_REGISTRY',
76
+ }
77
+
78
+ export const PlatformProcessEnvKeys = PlatformProcessEnvKey;
79
+ export const PlatformServiceUrlEnvKeys = PlatformServiceUrlEnvKey;
80
+ export const PlatformInfrastructureEnvKeys = PlatformInfrastructureEnvKey;
81
+ export const PlatformSecurityEnvKeys = PlatformSecurityEnvKey;
82
+ export const PlatformAdminEnvKeys = PlatformAdminEnvKey;
83
+ export const PlatformKubernetesEnvKeys = PlatformKubernetesEnvKey;
84
+
85
+ export const PLATFORM_RUNTIME_SENSITIVE_ENV_KEYS = new Set<string>([
86
+ PlatformInfrastructureEnvKey.MONGO_CONNECT_URL,
87
+ PlatformInfrastructureEnvKey.MONGO_PLATFORM_URL,
88
+ PlatformInfrastructureEnvKey.REDIS_ADMIN_PASSWORD,
89
+ PlatformInfrastructureEnvKey.RABBITMQ_ADMIN_PASSWORD,
90
+ PlatformInfrastructureEnvKey.STORAGE_ACCESS_KEY,
91
+ PlatformInfrastructureEnvKey.STORAGE_SECRET_KEY,
92
+ PlatformInfrastructureEnvKey.PG_ADMIN_PASSWORD,
93
+ PlatformSecurityEnvKey.PLATFORM_APPS_MANAGER_PRIVATE_KEY,
94
+ PlatformSecurityEnvKey.PLATFORM_APPS_MANAGER_PUBLIC_KEY,
95
+ PlatformSecurityEnvKey.PLATFORM_APPLICATION_PRIMARY_SECRET,
96
+ PlatformSecurityEnvKey.PLATFORM_ADMIN_SECRET,
97
+ PlatformAdminEnvKey.ADMIN_PASSWORD,
98
+ PlatformAdminEnvKey.GITHUB_WILDO_APPS_ADMIN_TOKEN,
99
+ ]);
@@ -0,0 +1,102 @@
1
+ import {
2
+ buildApplicationRuntimeEndpoints,
3
+ buildPlatformRuntimeEndpoints,
4
+ type RuntimeEndpointUrls,
5
+ } from '@wildo-ai/platform-core-shared';
6
+ import {
7
+ buildK8sInternalUrl,
8
+ buildK8sPublicUrl,
9
+ } from '../project-config/shared/k8s-utils';
10
+ import { PLATFORM_DEFAULT_PORTS } from '../project-config/shared/infrastructure-defaults.schemas';
11
+
12
+ export {
13
+ buildApplicationRuntimeEndpoints,
14
+ buildPlatformRuntimeEndpoints,
15
+ parseRuntimeEndpointsRecord,
16
+ PlatformApplicationType,
17
+ PlatformRuntimeEndpointKey,
18
+ serializeRuntimeEndpointsRecord,
19
+ } from '@wildo-ai/platform-core-shared';
20
+
21
+ export type {
22
+ ApplicationRuntimeEndpointsInput,
23
+ PlatformRuntimeEndpointsInput,
24
+ RuntimeEndpointUrls,
25
+ } from '@wildo-ai/platform-core-shared';
26
+
27
+ export function buildLocalhostPlatformRuntimeEndpoints(
28
+ host: string = 'localhost',
29
+ ): Record<string, RuntimeEndpointUrls> {
30
+ const buildUrl = (port: number): RuntimeEndpointUrls => ({
31
+ publicUrl: `http://${host}:${port}`,
32
+ internalUrl: `http://${host}:${port}`,
33
+ });
34
+
35
+ return buildPlatformRuntimeEndpoints({
36
+ appsManager: buildUrl(PLATFORM_DEFAULT_PORTS.APPS_MANAGER),
37
+ crontabsBatchesManager: buildUrl(PLATFORM_DEFAULT_PORTS.CRONTABS_BATCHES_MANAGER),
38
+ fileGenerator: buildUrl(PLATFORM_DEFAULT_PORTS.FILE_GENERATOR),
39
+ });
40
+ }
41
+
42
+ export interface LocalhostApplicationRuntimeEndpointsInput {
43
+ mainBackendApiPort?: number | undefined;
44
+ frontendApplicationPorts?: Record<string, number> | undefined;
45
+ websitePort?: number | undefined;
46
+ technicalDocumentationPort?: number | undefined;
47
+ host?: string | undefined;
48
+ }
49
+
50
+ export function buildLocalhostApplicationRuntimeEndpoints(
51
+ input: LocalhostApplicationRuntimeEndpointsInput,
52
+ ): Record<string, RuntimeEndpointUrls> {
53
+ const host = input.host ?? 'localhost';
54
+ const buildUrl = (port: number): RuntimeEndpointUrls => ({
55
+ publicUrl: `http://${host}:${port}`,
56
+ internalUrl: `http://${host}:${port}`,
57
+ });
58
+
59
+ return buildApplicationRuntimeEndpoints({
60
+ frontendApplications: input.frontendApplicationPorts
61
+ ? Object.fromEntries(
62
+ Object.entries(input.frontendApplicationPorts).map(([frontendServiceName, port]) => [
63
+ frontendServiceName,
64
+ buildUrl(port),
65
+ ]),
66
+ )
67
+ : undefined,
68
+ ...(input.websitePort ? { website: buildUrl(input.websitePort) } : {}),
69
+ ...(input.technicalDocumentationPort
70
+ ? { technicalDocumentation: buildUrl(input.technicalDocumentationPort) }
71
+ : {}),
72
+ ...(input.mainBackendApiPort
73
+ ? {
74
+ mainBackendApi: buildUrl(input.mainBackendApiPort),
75
+ healthCheckApi: buildUrl(input.mainBackendApiPort - 1),
76
+ mainWebhookApi: buildUrl(input.mainBackendApiPort - 2),
77
+ oauth2ProviderApi: buildUrl(input.mainBackendApiPort - 3),
78
+ mcpApi: buildUrl(input.mainBackendApiPort - 4),
79
+ }
80
+ : {}),
81
+ });
82
+ }
83
+
84
+ export function buildK8sPlatformRuntimeEndpoints(input: {
85
+ baseDomain: string;
86
+ namespace: string;
87
+ }): Record<string, RuntimeEndpointUrls> {
88
+ return buildPlatformRuntimeEndpoints({
89
+ appsManager: {
90
+ publicUrl: buildK8sPublicUrl('platform-apps-manager', input.baseDomain),
91
+ internalUrl: buildK8sInternalUrl('platform-apps-manager', PLATFORM_DEFAULT_PORTS.APPS_MANAGER, input.namespace),
92
+ },
93
+ crontabsBatchesManager: {
94
+ publicUrl: buildK8sPublicUrl('platform-crontabs-batches-manager', input.baseDomain),
95
+ internalUrl: buildK8sInternalUrl('platform-crontabs-batches-manager', PLATFORM_DEFAULT_PORTS.CRONTABS_BATCHES_MANAGER, input.namespace),
96
+ },
97
+ fileGenerator: {
98
+ publicUrl: buildK8sPublicUrl('platform-file-generator', input.baseDomain),
99
+ internalUrl: buildK8sInternalUrl('platform-file-generator', PLATFORM_DEFAULT_PORTS.FILE_GENERATOR, input.namespace),
100
+ },
101
+ });
102
+ }