@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,326 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import Redis from 'ioredis';
14
+ import { injectable, inject } from 'inversify';
15
+ import { PLATFORM_RUNTIME_BRIDGE_TYPES, } from '../runtime-bridge/platform-runtime-bridge.contracts.js';
16
+ /**
17
+ * Redis Connection Manager Service
18
+ * Manages Redis connections for different applications and platform services
19
+ */
20
+ let RedisConnectionManagerService = class RedisConnectionManagerService {
21
+ logger;
22
+ connections = new Map();
23
+ adminRedis = null;
24
+ logDebug;
25
+ constructor(logger) {
26
+ this.logger = logger;
27
+ this.logDebug = this.logger.debugByType('RedisConnectionManagerService');
28
+ this.logger.setDebugTypeLogging('RedisConnectionManagerService', true);
29
+ this.logDebug('Redis connection manager service initialized');
30
+ }
31
+ // =====================
32
+ // ACL MANAGEMENT (Admin)
33
+ // =====================
34
+ /**
35
+ * Check if Redis ACL admin is initialized and ready to use
36
+ * @returns true if initializeAclAdmin() has been called successfully
37
+ */
38
+ isAclAdminInitialized() {
39
+ return this.adminRedis !== null;
40
+ }
41
+ /**
42
+ * Initialize Redis ACL admin connection with retry logic.
43
+ * Waits for Redis to be ready before returning.
44
+ * @param config - Redis admin configuration
45
+ * @param maxRetries - Maximum number of retry attempts (default: 10)
46
+ * @param retryDelayMs - Delay between retries in milliseconds (default: 3000)
47
+ * @throws Error if connection cannot be established after all retries
48
+ */
49
+ async initializeAclAdmin(config, maxRetries = 10, retryDelayMs = 3000) {
50
+ if (this.adminRedis)
51
+ return;
52
+ this.logDebug('Initializing Redis ACL admin connection');
53
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
54
+ try {
55
+ this.adminRedis = new Redis(config.adminUrl, {
56
+ enableReadyCheck: true,
57
+ connectTimeout: 10000,
58
+ commandTimeout: 5000,
59
+ lazyConnect: true, // Don't connect immediately
60
+ });
61
+ // CRITICAL: Attach error handler before connect to prevent unhandled errors during Redis restarts
62
+ this.adminRedis.on('error', (err) => {
63
+ this.logger.error('Redis ACL admin connection error', { error: err.message });
64
+ });
65
+ this.adminRedis.on('close', () => {
66
+ this.logger.warn('Redis ACL admin connection closed');
67
+ });
68
+ this.adminRedis.on('reconnecting', () => {
69
+ this.logDebug('Redis ACL admin reconnecting...');
70
+ });
71
+ await this.adminRedis.connect();
72
+ await this.adminRedis.ping();
73
+ this.logDebug('Redis ACL admin connection verified', { attempt });
74
+ return;
75
+ }
76
+ catch (error) {
77
+ const errorMsg = error instanceof Error ? error.message : String(error);
78
+ const isConnectionError = errorMsg.includes('ECONNREFUSED') || errorMsg.includes('ETIMEDOUT');
79
+ // Clean up failed connection
80
+ if (this.adminRedis) {
81
+ try {
82
+ this.adminRedis.disconnect();
83
+ }
84
+ catch { }
85
+ this.adminRedis = null;
86
+ }
87
+ if (attempt === maxRetries) {
88
+ throw new Error(`Redis ACL admin connection failed after ${maxRetries} attempts: ${errorMsg}`);
89
+ }
90
+ if (isConnectionError) {
91
+ this.logDebug(`Redis not ready (attempt ${attempt}/${maxRetries}), retrying in ${retryDelayMs}ms...`, { error: errorMsg });
92
+ await this.sleep(retryDelayMs);
93
+ }
94
+ else {
95
+ // Non-connection error (e.g., auth failure) - fail immediately
96
+ throw new Error(`Redis ACL admin connection error: ${errorMsg}`);
97
+ }
98
+ }
99
+ }
100
+ }
101
+ sleep(ms) {
102
+ return new Promise(resolve => setTimeout(resolve, ms));
103
+ }
104
+ async upsertTenantUserAcl(input) {
105
+ if (!this.adminRedis)
106
+ throw new Error('Redis ACL admin not initialized');
107
+ // Include @pubsub for psubscribe/subscribe operations needed by Socket.IO Redis adapter
108
+ const allowCats = input.allowCategories ?? ['@read', '@write', '@pubsub'];
109
+ const denyCats = input.denyCategories ?? ['@dangerous'];
110
+ // SECURITY NOTE: SCAN is intentionally allowed because:
111
+ // 1. Key pattern ACL (~{username}:*) already restricts which keys SCAN can return
112
+ // 2. SCAN is non-blocking (unlike KEYS which uses cursor-based iteration)
113
+ // 3. Required for legitimate operations like editing state cleanup on disconnect
114
+ // KEYS is still denied as it's a blocking O(N) operation that can freeze Redis
115
+ const denyCmds = input.denyCommands ?? ['FLUSHALL', 'CONFIG', 'SHUTDOWN', 'KEYS'];
116
+ const args = [
117
+ 'SETUSER',
118
+ input.username,
119
+ 'on',
120
+ `>${input.password}`,
121
+ 'resetkeys',
122
+ 'resetchannels',
123
+ // Revoke all commands first (more widely supported than 'resetcommands')
124
+ '-@all',
125
+ `~${input.keyPattern}`,
126
+ ];
127
+ // SECURITY FIX: Use tenant-specific channel patterns instead of allchannels
128
+ // Socket.IO Redis adapter creates multiple channel types with namespace:
129
+ // - {prefix}#/{namespace}#... (main broadcast channel)
130
+ // - {prefix}-request#/{namespace}# (request routing channel)
131
+ // - {prefix}-response#/{namespace}# (response routing channel)
132
+ //
133
+ // For Redis ACL, PSUBSCRIBE patterns must be explicitly allowed.
134
+ // ACL pattern `&foo#*` matches SUBSCRIBE to any `foo#...` channel
135
+ // but PSUBSCRIBE to pattern `foo#/#*` requires `&foo#/#*` in the ACL.
136
+ //
137
+ // We allow both generic patterns and the specific `/#` namespace patterns
138
+ // to support both SUBSCRIBE and PSUBSCRIBE operations.
139
+ args.push(`&${input.username}#*`);
140
+ args.push(`&${input.username}#/#*`);
141
+ args.push(`&${input.username}-request#*`);
142
+ args.push(`&${input.username}-request#/#*`);
143
+ args.push(`&${input.username}-response#*`);
144
+ args.push(`&${input.username}-response#/#*`);
145
+ for (const cat of allowCats)
146
+ args.push(`+${cat}`);
147
+ for (const cat of denyCats)
148
+ args.push(`-${cat}`);
149
+ for (const cmd of denyCmds)
150
+ args.push(`-${cmd}`);
151
+ // Explicitly allow INFO command for ioredis ready check
152
+ args.push('+INFO');
153
+ // Allow EVAL/EVALSHA for Lua scripting (used by auth session atomic updates,
154
+ // rate limiting, etc.). Safe: scripts run under the same key ACL restrictions.
155
+ args.push('+EVAL');
156
+ args.push('+EVALSHA');
157
+ this.logDebug('Applying Redis ACL SETUSER', {
158
+ username: input.username,
159
+ keyPattern: input.keyPattern,
160
+ channelPatterns: [
161
+ `${input.username}#*`, `${input.username}#/#*`,
162
+ `${input.username}-request#*`, `${input.username}-request#/#*`,
163
+ `${input.username}-response#*`, `${input.username}-response#/#*`
164
+ ]
165
+ });
166
+ try {
167
+ await this.adminRedis.acl(...args);
168
+ }
169
+ catch (e) {
170
+ // If user exists, SETUSER updates in-place; if command failed for transient reason, retry once
171
+ this.logDebug('Redis ACL SETUSER failed, retrying once', { error: e instanceof Error ? e.message : String(e) });
172
+ await this.adminRedis.acl(...args);
173
+ }
174
+ return { username: input.username, configured: true };
175
+ }
176
+ async deleteTenantUser(username) {
177
+ if (!this.adminRedis)
178
+ throw new Error('Redis ACL admin not initialized');
179
+ this.logDebug('Deleting Redis ACL user', { username });
180
+ const res = await this.adminRedis.acl('DELUSER', username);
181
+ return { username, deleted: res === 1 };
182
+ }
183
+ /**
184
+ * Persist ACL configuration to disk.
185
+ * This saves all ACL users (including tenant users) to the ACL file.
186
+ * Required for tenant users to survive Valkey/Redis restarts.
187
+ *
188
+ * IMPORTANT: The Valkey StatefulSet must have the ACL file on a
189
+ * persistent volume for this to be effective. See deployment.yaml.hbs.
190
+ */
191
+ async aclSave() {
192
+ if (!this.adminRedis)
193
+ throw new Error('Redis ACL admin not initialized');
194
+ this.logDebug('Persisting ACL configuration to disk');
195
+ try {
196
+ await this.adminRedis.acl('SAVE');
197
+ this.logDebug('ACL configuration saved successfully');
198
+ }
199
+ catch (e) {
200
+ const errorMsg = e instanceof Error ? e.message : String(e);
201
+ this.logger.error('Failed to save ACL configuration', { error: errorMsg });
202
+ throw new Error(`ACL SAVE failed: ${errorMsg}`);
203
+ }
204
+ }
205
+ /**
206
+ * Create a new Redis connection
207
+ */
208
+ async createConnection(connectionName, redisUrl, options) {
209
+ try {
210
+ if (this.connections.has(connectionName)) {
211
+ this.logger.warn(`Redis connection ${connectionName} already exists, returning existing connection`);
212
+ return this.connections.get(connectionName);
213
+ }
214
+ const defaultOptions = {
215
+ enableReadyCheck: true,
216
+ maxRetriesPerRequest: 3,
217
+ connectTimeout: 10000,
218
+ commandTimeout: 5000,
219
+ ...options
220
+ };
221
+ const redis = new Redis(redisUrl, defaultOptions);
222
+ redis.on('connect', () => {
223
+ this.logger.info(`Redis connected: ${connectionName}`);
224
+ });
225
+ redis.on('error', (error) => {
226
+ this.logger.error(`Redis connection error for ${connectionName}:`, error);
227
+ });
228
+ redis.on('close', () => {
229
+ this.logger.warn(`Redis connection closed: ${connectionName}`);
230
+ });
231
+ // Wait for connection to be ready
232
+ await redis.ping();
233
+ this.connections.set(connectionName, redis);
234
+ this.logger.info(`Redis connection '${connectionName}' established successfully`);
235
+ return redis;
236
+ }
237
+ catch (error) {
238
+ this.logger.error(`Failed to create Redis connection '${connectionName}':`, error);
239
+ throw error;
240
+ }
241
+ }
242
+ /**
243
+ * Get an existing Redis connection by name
244
+ */
245
+ getConnection(connectionName) {
246
+ return this.connections.get(connectionName);
247
+ }
248
+ /**
249
+ * Get all connection names
250
+ */
251
+ getConnectionNames() {
252
+ return Array.from(this.connections.keys());
253
+ }
254
+ /**
255
+ * Close a specific connection
256
+ */
257
+ async closeConnection(connectionName) {
258
+ const redis = this.connections.get(connectionName);
259
+ if (redis) {
260
+ await redis.quit();
261
+ this.connections.delete(connectionName);
262
+ this.logger.info(`Redis connection '${connectionName}' closed`);
263
+ }
264
+ }
265
+ /**
266
+ * Close all connections
267
+ */
268
+ async closeAllConnections() {
269
+ const closePromises = Array.from(this.connections.entries()).map(async ([name, redis]) => {
270
+ await redis.quit();
271
+ this.logger.info(`Redis connection '${name}' closed`);
272
+ });
273
+ await Promise.all(closePromises);
274
+ this.connections.clear();
275
+ this.logger.info('All Redis connections closed');
276
+ }
277
+ /**
278
+ * Check if a connection exists and is ready
279
+ */
280
+ async isConnectionReady(connectionName) {
281
+ const redis = this.connections.get(connectionName);
282
+ if (!redis)
283
+ return false;
284
+ try {
285
+ await redis.ping();
286
+ return true;
287
+ }
288
+ catch {
289
+ return false;
290
+ }
291
+ }
292
+ /**
293
+ * Get connection health status
294
+ */
295
+ async getConnectionHealth() {
296
+ const health = {};
297
+ const healthChecks = Array.from(this.connections.entries()).map(async ([name, redis]) => {
298
+ try {
299
+ const start = Date.now();
300
+ await redis.ping();
301
+ const latency = Date.now() - start;
302
+ health[name] = { status: 'connected', latency };
303
+ }
304
+ catch (error) {
305
+ health[name] = { status: 'disconnected' };
306
+ }
307
+ });
308
+ await Promise.all(healthChecks);
309
+ return health;
310
+ }
311
+ };
312
+ RedisConnectionManagerService = __decorate([
313
+ injectable(),
314
+ __param(0, inject(PLATFORM_RUNTIME_BRIDGE_TYPES.Logger)),
315
+ __metadata("design:paramtypes", [Object])
316
+ ], RedisConnectionManagerService);
317
+ export { RedisConnectionManagerService };
318
+ // Predefined connection types for platform management
319
+ export var PlatformRedisType;
320
+ (function (PlatformRedisType) {
321
+ PlatformRedisType["PLATFORM_CACHE"] = "platform-cache";
322
+ PlatformRedisType["SESSION_STORE"] = "session-store";
323
+ PlatformRedisType["RATE_LIMITING"] = "rate-limiting";
324
+ PlatformRedisType["PUB_SUB"] = "pub-sub";
325
+ })(PlatformRedisType || (PlatformRedisType = {}));
326
+ //# sourceMappingURL=redis-manager.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-manager.service.js","sourceRoot":"","sources":["../../../src/infra-managers/redis-manager.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,KAAuB,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EACL,6BAA6B,GAE9B,MAAM,qDAAqD,CAAC;AAQ7D;;;GAGG;AAEI,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;IAMgB;IALhD,WAAW,GAAuB,IAAI,GAAG,EAAE,CAAC;IAC5C,UAAU,GAAiB,IAAI,CAAC;IAC9B,QAAQ,CAA+D;IAEjF,YACwD,MAA6B;QAA7B,WAAM,GAAN,MAAM,CAAuB;QAEnF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,CAAC,8CAA8C,CAAC,CAAC;IAChE,CAAC;IAED,wBAAwB;IACxB,yBAAyB;IACzB,wBAAwB;IAExB;;;OAGG;IACI,qBAAqB;QAC1B,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC;IAClC,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,kBAAkB,CAC7B,MAA2B,EAC3B,aAAqB,EAAE,EACvB,eAAuB,IAAI;QAE3B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAE5B,IAAI,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QAEzD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE;oBAC3C,gBAAgB,EAAE,IAAI;oBACtB,cAAc,EAAE,KAAK;oBACrB,cAAc,EAAE,IAAI;oBACpB,WAAW,EAAE,IAAI,EAAE,4BAA4B;iBAChD,CAAC,CAAC;gBAEH,kGAAkG;gBAClG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChF,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBACxD,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;oBACtC,IAAI,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;gBAEH,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,QAAQ,CAAC,qCAAqC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAE9F,6BAA6B;gBAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,IAAI,CAAC;wBAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;oBAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACzB,CAAC;gBAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CAAC,2CAA2C,UAAU,cAAc,QAAQ,EAAE,CAAC,CAAC;gBACjG,CAAC;gBAED,IAAI,iBAAiB,EAAE,CAAC;oBACtB,IAAI,CAAC,QAAQ,CAAC,4BAA4B,OAAO,IAAI,UAAU,kBAAkB,YAAY,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC3H,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,+DAA+D;oBAC/D,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,KAA8B;QAC7D,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACzE,wFAAwF;QACxF,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,wDAAwD;QACxD,kFAAkF;QAClF,0EAA0E;QAC1E,iFAAiF;QACjF,+EAA+E;QAC/E,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAElF,MAAM,IAAI,GAAa;YACrB,SAAS;YACT,KAAK,CAAC,QAAQ;YACd,IAAI;YACJ,IAAI,KAAK,CAAC,QAAQ,EAAE;YACpB,WAAW;YACX,eAAe;YACf,yEAAyE;YACzE,OAAO;YACP,IAAI,KAAK,CAAC,UAAU,EAAE;SACvB,CAAC;QACF,4EAA4E;QAC5E,yEAAyE;QACzE,gEAAgE;QAChE,mEAAmE;QACnE,kEAAkE;QAClE,GAAG;QACH,iEAAiE;QACjE,kEAAkE;QAClE,sEAAsE;QACtE,GAAG;QACH,0EAA0E;QAC1E,uDAAuD;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,aAAa,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,eAAe,CAAC,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACjD,wDAAwD;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,6EAA6E;QAC7E,+EAA+E;QAC/E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtB,IAAI,CAAC,QAAQ,CAAC,4BAA4B,EAAE;YAC1C,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,eAAe,EAAE;gBACf,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,MAAM;gBAC9C,GAAG,KAAK,CAAC,QAAQ,YAAY,EAAE,GAAG,KAAK,CAAC,QAAQ,cAAc;gBAC9D,GAAG,KAAK,CAAC,QAAQ,aAAa,EAAE,GAAG,KAAK,CAAC,QAAQ,eAAe;aACjE;SACF,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAO,IAAI,CAAC,UAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,+FAA+F;YAC/F,IAAI,CAAC,QAAQ,CAAC,yCAAyC,EAAE,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChH,MAAO,IAAI,CAAC,UAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAO,IAAI,CAAC,UAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAO,IAAI,CAAC,UAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACpB,cAAsB,EACtB,QAAgB,EAChB,OAAsB;QAEtB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,cAAc,gDAAgD,CAAC,CAAC;gBACrG,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC;YAC/C,CAAC;YAED,MAAM,cAAc,GAAiB;gBACnC,gBAAgB,EAAE,IAAI;gBACtB,oBAAoB,EAAE,CAAC;gBACvB,cAAc,EAAE,KAAK;gBACrB,cAAc,EAAE,IAAI;gBACpB,GAAG,OAAO;aACX,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAElD,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,cAAc,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,cAAc,EAAE,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YAEnB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,cAAc,4BAA4B,CAAC,CAAC;YAElF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,cAAc,IAAI,EAAE,KAAK,CAAC,CAAC;YACnF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,cAAsB;QAClC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,cAAsB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,cAAc,UAAU,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAC9D,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACtB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,UAAU,CAAC,CAAC;QACxD,CAAC,CACF,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,cAAsB;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,MAAM,GAAyD,EAAE,CAAC;QAExE,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAC7D,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;YAClD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;YAC5C,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAA;AAjUY,6BAA6B;IADzC,UAAU,EAAE;IAOR,WAAA,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAA;;GANpC,6BAA6B,CAiUzC;;AAED,sDAAsD;AACtD,MAAM,CAAN,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,sDAAiC,CAAA;IACjC,oDAA+B,CAAA;IAC/B,oDAA+B,CAAA;IAC/B,wCAAmB,CAAA;AACrB,CAAC,EALW,iBAAiB,KAAjB,iBAAiB,QAK5B"}
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ export declare const WildoFrameworkReleaseNpmConfigSchema: z.ZodObject<{
3
+ scope: z.ZodLiteral<"@wildo-ai">;
4
+ packages: z.ZodDefault<z.ZodArray<z.ZodString>>;
5
+ }, z.core.$strip, core.$ZodObjectExtra>;
6
+ export type WildoFrameworkReleaseNpmConfig = z.infer<typeof WildoFrameworkReleaseNpmConfigSchema>;
7
+ export declare const WildoFrameworkReleaseDockerConfigSchema: z.ZodObject<{
8
+ namespace: z.ZodLiteral<"wildoai">;
9
+ images: z.ZodDefault<z.ZodArray<z.ZodString>>;
10
+ }, z.core.$strip, core.$ZodObjectExtra>;
11
+ export type WildoFrameworkReleaseDockerConfig = z.infer<typeof WildoFrameworkReleaseDockerConfigSchema>;
12
+ export declare const WildoFrameworkConfigSchema: z.ZodObject<{
13
+ version: z.ZodDefault<z.ZodNumber>;
14
+ frameworkVersion: z.ZodString;
15
+ minCliVersion: z.ZodString;
16
+ publish: z.ZodObject<{
17
+ npm: z.ZodObject<{
18
+ scope: z.ZodLiteral<"@wildo-ai">;
19
+ packages: z.ZodDefault<z.ZodArray<z.ZodString>>;
20
+ }, z.core.$strip, core.$ZodObjectExtra>;
21
+ docker: z.ZodObject<{
22
+ namespace: z.ZodLiteral<"wildoai">;
23
+ images: z.ZodDefault<z.ZodArray<z.ZodString>>;
24
+ }, z.core.$strip, core.$ZodObjectExtra>;
25
+ }, z.core.$strip, core.$ZodObjectExtra>;
26
+ }, z.core.$strip, core.$ZodObjectExtra>;
27
+ export type WildoFrameworkConfig = z.infer<typeof WildoFrameworkConfigSchema>;
28
+ export type WildoFrameworkConfigInput = z.input<typeof WildoFrameworkConfigSchema>;
29
+ /**
30
+ * Define framework-scoped release configuration.
31
+ *
32
+ * This is the author-owned source of truth for framework release metadata that
33
+ * later materializes into `wildo-framework.info.json` and the CLI publish flow.
34
+ */
35
+ export declare function defineFrameworkConfig(config: WildoFrameworkConfigInput): WildoFrameworkConfig;
36
+ //# sourceMappingURL=define-framework-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-framework-config.d.ts","sourceRoot":"","sources":["../../../src/project-config/define-framework-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,oCAAoC;;;uCAG/C,CAAC;AACH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAElG,eAAO,MAAM,uCAAuC;;;uCAGlD,CAAC;AACH,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uCAAuC,CAAC,CAAC;AAExG,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;uCAQrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,yBAAyB,GAAG,oBAAoB,CAE7F"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ import { FRAMEWORK_RELEASE_DOCKER_NAMESPACE, FRAMEWORK_RELEASE_NPM_SCOPE, } from '../release/framework-release.constants.js';
3
+ const SimpleSemverSchema = z.string().regex(/^\d+\.\d+\.\d+$/, 'must be a simple semver string in the form x.y.z');
4
+ export const WildoFrameworkReleaseNpmConfigSchema = z.object({
5
+ scope: z.literal(FRAMEWORK_RELEASE_NPM_SCOPE),
6
+ packages: z.array(z.string().min(1)).default([]),
7
+ });
8
+ export const WildoFrameworkReleaseDockerConfigSchema = z.object({
9
+ namespace: z.literal(FRAMEWORK_RELEASE_DOCKER_NAMESPACE),
10
+ images: z.array(z.string().min(1)).default([]),
11
+ });
12
+ export const WildoFrameworkConfigSchema = z.object({
13
+ version: z.number().int().positive().default(1),
14
+ frameworkVersion: SimpleSemverSchema,
15
+ minCliVersion: SimpleSemverSchema,
16
+ publish: z.object({
17
+ npm: WildoFrameworkReleaseNpmConfigSchema,
18
+ docker: WildoFrameworkReleaseDockerConfigSchema,
19
+ }),
20
+ });
21
+ /**
22
+ * Define framework-scoped release configuration.
23
+ *
24
+ * This is the author-owned source of truth for framework release metadata that
25
+ * later materializes into `wildo-framework.info.json` and the CLI publish flow.
26
+ */
27
+ export function defineFrameworkConfig(config) {
28
+ return WildoFrameworkConfigSchema.parse(config);
29
+ }
30
+ //# sourceMappingURL=define-framework-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-framework-config.js","sourceRoot":"","sources":["../../../src/project-config/define-framework-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,kCAAkC,EAClC,2BAA2B,GAC5B,MAAM,wCAAwC,CAAC;AAEhD,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CACzC,iBAAiB,EACjB,kDAAkD,CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACjD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,uCAAuC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9D,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC;IACxD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC/C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,gBAAgB,EAAE,kBAAkB;IACpC,aAAa,EAAE,kBAAkB;IACjC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,GAAG,EAAE,oCAAoC;QACzC,MAAM,EAAE,uCAAuC;KAChD,CAAC;CACH,CAAC,CAAC;AAIH;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAiC;IACrE,OAAO,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,128 @@
1
+ import { z } from 'zod';
2
+ import { WildoDeploymentRuntime, WildoImageTagStrategy } from './shared/environment.schemas.js';
3
+ /**
4
+ * Addressing config for local or Docker Compose services.
5
+ * Describes how to reach a service (host, port, URL override).
6
+ */
7
+ export declare const InfraServiceAddressingSchema: z.ZodObject<{
8
+ host: z.ZodOptional<z.ZodString>;
9
+ port: z.ZodOptional<z.ZodNumber>;
10
+ url: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip, core.$ZodObjectExtra>;
12
+ export type InfraServiceAddressing = z.infer<typeof InfraServiceAddressingSchema>;
13
+ /**
14
+ * Scaling config for Kubernetes-deployed services.
15
+ * Controls replica count per service in K8s Deployment manifests.
16
+ */
17
+ export declare const InfraServiceK8sSchema: z.ZodObject<{
18
+ replicas: z.ZodOptional<z.ZodNumber>;
19
+ }, z.core.$strip, core.$ZodObjectExtra>;
20
+ export type InfraServiceK8s = z.infer<typeof InfraServiceK8sSchema>;
21
+ export declare const WildoInfraConfigSchema: z.ZodObject<{
22
+ version: z.ZodDefault<z.ZodNumber>;
23
+ environment: z.ZodString;
24
+ deployment: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
25
+ branch: z.ZodString;
26
+ runtime: z.ZodLiteral<WildoDeploymentRuntime.DOCKER_COMPOSE>;
27
+ imageTagStrategy: z.ZodDefault<z.ZodEnum<typeof WildoImageTagStrategy>>;
28
+ }, z.core.$strip, core.$ZodObjectExtra>, z.ZodObject<{
29
+ branch: z.ZodString;
30
+ runtime: z.ZodLiteral<WildoDeploymentRuntime.KUBERNETES>;
31
+ registry: z.ZodOptional<z.ZodString>;
32
+ namespace: z.ZodOptional<z.ZodString>;
33
+ imageTagStrategy: z.ZodDefault<z.ZodEnum<typeof WildoImageTagStrategy>>;
34
+ }, z.core.$strip, core.$ZodObjectExtra>], "runtime">>;
35
+ database: z.ZodOptional<z.ZodObject<{
36
+ name: z.ZodOptional<z.ZodString>;
37
+ host: z.ZodOptional<z.ZodString>;
38
+ port: z.ZodOptional<z.ZodNumber>;
39
+ }, z.core.$strip, core.$ZodObjectExtra>>;
40
+ cache: z.ZodOptional<z.ZodObject<{
41
+ host: z.ZodOptional<z.ZodString>;
42
+ port: z.ZodOptional<z.ZodNumber>;
43
+ database: z.ZodOptional<z.ZodNumber>;
44
+ }, z.core.$strip, core.$ZodObjectExtra>>;
45
+ queue: z.ZodOptional<z.ZodObject<{
46
+ host: z.ZodOptional<z.ZodString>;
47
+ port: z.ZodOptional<z.ZodNumber>;
48
+ vhost: z.ZodOptional<z.ZodString>;
49
+ }, z.core.$strip, core.$ZodObjectExtra>>;
50
+ storage: z.ZodOptional<z.ZodObject<{
51
+ bucket: z.ZodOptional<z.ZodString>;
52
+ endpoint: z.ZodOptional<z.ZodString>;
53
+ }, z.core.$strip, core.$ZodObjectExtra>>;
54
+ services: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
55
+ host: z.ZodOptional<z.ZodString>;
56
+ port: z.ZodOptional<z.ZodNumber>;
57
+ url: z.ZodOptional<z.ZodString>;
58
+ replicas: z.ZodOptional<z.ZodNumber>;
59
+ }, z.core.$strip, core.$ZodObjectExtra>>>;
60
+ domain: z.ZodOptional<z.ZodString>;
61
+ }, z.core.$strip, core.$ZodObjectExtra>;
62
+ export type WildoInfraConfig = z.infer<typeof WildoInfraConfigSchema>;
63
+ export type WildoInfraConfigInput = z.input<typeof WildoInfraConfigSchema>;
64
+ interface InfraConfigBase {
65
+ version?: number;
66
+ environment: string;
67
+ database?: {
68
+ name?: string;
69
+ host?: string;
70
+ port?: number;
71
+ };
72
+ cache?: {
73
+ host?: string;
74
+ port?: number;
75
+ database?: number;
76
+ };
77
+ queue?: {
78
+ host?: string;
79
+ port?: number;
80
+ vhost?: string;
81
+ };
82
+ storage?: {
83
+ bucket?: string;
84
+ endpoint?: string;
85
+ };
86
+ domain?: string;
87
+ }
88
+ /** Input shape when no deployment is configured (local environment). */
89
+ interface InfraConfigLocal extends InfraConfigBase {
90
+ deployment?: undefined;
91
+ services?: Record<string, InfraServiceAddressing>;
92
+ }
93
+ /** Input shape for Docker Compose runtime. */
94
+ interface InfraConfigDockerCompose extends InfraConfigBase {
95
+ deployment: {
96
+ branch: string;
97
+ runtime: WildoDeploymentRuntime.DOCKER_COMPOSE;
98
+ imageTagStrategy?: WildoImageTagStrategy | `${WildoImageTagStrategy}`;
99
+ };
100
+ services?: Record<string, InfraServiceAddressing>;
101
+ }
102
+ /** Input shape for Kubernetes runtime — services support `replicas`. */
103
+ interface InfraConfigKubernetes extends InfraConfigBase {
104
+ deployment: {
105
+ branch: string;
106
+ runtime: WildoDeploymentRuntime.KUBERNETES;
107
+ registry?: string;
108
+ namespace?: string;
109
+ imageTagStrategy?: WildoImageTagStrategy | `${WildoImageTagStrategy}`;
110
+ };
111
+ services?: Record<string, InfraServiceK8s>;
112
+ }
113
+ /**
114
+ * Define per-environment infrastructure configuration for a SaaS app.
115
+ *
116
+ * The function is overloaded to enforce runtime-specific constraints at
117
+ * compile time:
118
+ * - **No deployment / Docker Compose**: services accept `host`, `port`, `url`
119
+ * - **Kubernetes**: services accept `replicas`
120
+ *
121
+ * Additional runtime validation via Zod `superRefine` catches mismatches
122
+ * that TypeScript inference might not catch (e.g., generic `WildoInfraConfigInput`).
123
+ */
124
+ export declare function defineInfraConfig(config: InfraConfigLocal): WildoInfraConfig;
125
+ export declare function defineInfraConfig(config: InfraConfigDockerCompose): WildoInfraConfig;
126
+ export declare function defineInfraConfig(config: InfraConfigKubernetes): WildoInfraConfig;
127
+ export {};
128
+ //# sourceMappingURL=define-infra-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-infra-config.d.ts","sourceRoot":"","sources":["../../../src/project-config/define-infra-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,sBAAsB,EAEtB,qBAAqB,EACtB,MAAM,8BAA8B,CAAC;AAMtC;;;GAGG;AACH,eAAO,MAAM,4BAA4B;;;;uCAIvC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;uCAEhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAiBpE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAuDjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAM3E,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wEAAwE;AACxE,UAAU,gBAAiB,SAAQ,eAAe;IAChD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACnD;AAED,8CAA8C;AAC9C,UAAU,wBAAyB,SAAQ,eAAe;IACxD,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,sBAAsB,CAAC,cAAc,CAAC;QAC/C,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,GAAG,qBAAqB,EAAE,CAAC;KACvE,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACnD;AAED,wEAAwE;AACxE,UAAU,qBAAsB,SAAQ,eAAe;IACrD,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,sBAAsB,CAAC,UAAU,CAAC;QAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,GAAG,qBAAqB,EAAE,CAAC;KACvE,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC5C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;AAC9E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,gBAAgB,CAAC;AACtF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,qBAAqB,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { z } from 'zod';
2
+ import { WildoEnvironmentIdSchema, WildoDeploymentRuntime, WildoDeploymentConfigSchema, } from './shared/environment.schemas.js';
3
+ // ============================================================================
4
+ // Service Schemas — runtime-specific shapes
5
+ // ============================================================================
6
+ /**
7
+ * Addressing config for local or Docker Compose services.
8
+ * Describes how to reach a service (host, port, URL override).
9
+ */
10
+ export const InfraServiceAddressingSchema = z.object({
11
+ host: z.string().optional(),
12
+ port: z.number().int().positive().optional(),
13
+ url: z.string().optional(),
14
+ });
15
+ /**
16
+ * Scaling config for Kubernetes-deployed services.
17
+ * Controls replica count per service in K8s Deployment manifests.
18
+ */
19
+ export const InfraServiceK8sSchema = z.object({
20
+ replicas: z.number().int().positive().optional(),
21
+ });
22
+ /**
23
+ * Internal union schema for Zod parsing — accepts all fields,
24
+ * runtime validation in `superRefine` enforces per-runtime constraints.
25
+ */
26
+ const InfraServiceSchema = z.object({
27
+ host: z.string().optional(),
28
+ port: z.number().int().positive().optional(),
29
+ url: z.string().optional(),
30
+ replicas: z.number().int().positive().optional(),
31
+ });
32
+ // ============================================================================
33
+ // Infra Config Schema
34
+ // ============================================================================
35
+ export const WildoInfraConfigSchema = z.object({
36
+ version: z.number().int().positive().default(1),
37
+ environment: WildoEnvironmentIdSchema,
38
+ deployment: WildoDeploymentConfigSchema.optional(),
39
+ database: z.object({
40
+ name: z.string().min(1).optional(),
41
+ host: z.string().optional(),
42
+ port: z.number().int().positive().optional(),
43
+ }).optional(),
44
+ cache: z.object({
45
+ host: z.string().optional(),
46
+ port: z.number().int().positive().optional(),
47
+ database: z.number().int().nonnegative().optional(),
48
+ }).optional(),
49
+ queue: z.object({
50
+ host: z.string().optional(),
51
+ port: z.number().int().positive().optional(),
52
+ vhost: z.string().optional(),
53
+ }).optional(),
54
+ storage: z.object({
55
+ bucket: z.string().min(1).optional(),
56
+ endpoint: z.string().optional(),
57
+ }).optional(),
58
+ services: z.record(z.string(), InfraServiceSchema).optional(),
59
+ domain: z.string().optional(),
60
+ }).superRefine((data, ctx) => {
61
+ const runtime = data.deployment?.runtime;
62
+ const services = data.services;
63
+ if (!services)
64
+ return;
65
+ for (const [name, svc] of Object.entries(services)) {
66
+ if (runtime !== WildoDeploymentRuntime.KUBERNETES && svc.replicas !== undefined) {
67
+ ctx.addIssue({
68
+ code: z.ZodIssueCode.custom,
69
+ path: ['services', name, 'replicas'],
70
+ message: `"replicas" is only valid when deployment.runtime is "${WildoDeploymentRuntime.KUBERNETES}". Docker Compose always runs 1 container per service.`,
71
+ });
72
+ }
73
+ if (runtime === WildoDeploymentRuntime.KUBERNETES) {
74
+ if (svc.host !== undefined || svc.port !== undefined || svc.url !== undefined) {
75
+ ctx.addIssue({
76
+ code: z.ZodIssueCode.custom,
77
+ path: ['services', name],
78
+ message: `"host"/"port"/"url" are not used in Kubernetes runtime — service discovery handles addressing.`,
79
+ });
80
+ }
81
+ }
82
+ }
83
+ });
84
+ export function defineInfraConfig(config) {
85
+ return WildoInfraConfigSchema.parse(config);
86
+ }
87
+ //# sourceMappingURL=define-infra-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-infra-config.js","sourceRoot":"","sources":["../../../src/project-config/define-infra-config.ts"],"names":[],"mappings":"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"}