@tdk-landscape/tdk-cli-core 1.3.15 → 1.3.26

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 (274) hide show
  1. package/Tiltfile +144 -0
  2. package/discovery/AGENTS.md +362 -0
  3. package/discovery/TILT_DISCOVERY.star +424 -0
  4. package/discovery/Tiltfile +58 -0
  5. package/discovery/config.star +258 -0
  6. package/discovery/constants.star +127 -0
  7. package/discovery/deterministic.star +211 -0
  8. package/discovery/discovery_daemon.star +191 -0
  9. package/discovery/discovery_orchestrator.star +460 -0
  10. package/discovery/filtering.star +5 -0
  11. package/discovery/identity-management-backend/service.yaml +26 -0
  12. package/discovery/identity-management-frontend/service.yaml +29 -0
  13. package/discovery/identity-sdk/service.yaml +9 -0
  14. package/discovery/incremental_discovery.star +213 -0
  15. package/discovery/indexing.star +7 -0
  16. package/discovery/json_manifest_scanner.star +51 -0
  17. package/discovery/libraries.star +46 -0
  18. package/discovery/loading.star +23 -0
  19. package/discovery/manifest/constants.star +104 -0
  20. package/discovery/manifest/loading.star +386 -0
  21. package/discovery/manifest/normalize.star +281 -0
  22. package/discovery/manifest/validation.star +108 -0
  23. package/discovery/normalization.star +11 -0
  24. package/discovery/registry.star +544 -0
  25. package/discovery/resource_snapshot.py +382 -0
  26. package/discovery/resource_snapshot.star +143 -0
  27. package/discovery/schemas.star +1 -0
  28. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  29. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  30. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  31. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  32. package/discovery/test_resource_snapshot.py +251 -0
  33. package/discovery/validation.star +78 -0
  34. package/discovery/versioning.star +1 -0
  35. package/dist/commands/config.d.ts.map +1 -1
  36. package/dist/commands/config.js +11 -0
  37. package/dist/commands/config.js.map +1 -1
  38. package/dist/commands/doctor.d.ts.map +1 -1
  39. package/dist/commands/doctor.js +1 -2
  40. package/dist/commands/doctor.js.map +1 -1
  41. package/dist/commands/project.d.ts.map +1 -1
  42. package/dist/commands/project.js +36 -41
  43. package/dist/commands/project.js.map +1 -1
  44. package/dist/commands/resource.d.ts.map +1 -1
  45. package/dist/commands/resource.js +51 -55
  46. package/dist/commands/resource.js.map +1 -1
  47. package/dist/commands/stack.d.ts.map +1 -1
  48. package/dist/commands/stack.js +22 -24
  49. package/dist/commands/stack.js.map +1 -1
  50. package/dist/commands/ui.d.ts.map +1 -1
  51. package/dist/commands/ui.js +1 -2
  52. package/dist/commands/ui.js.map +1 -1
  53. package/dist/commands/up.d.ts.map +1 -1
  54. package/dist/commands/up.js +1 -2
  55. package/dist/commands/up.js.map +1 -1
  56. package/dist/commands/upgrade.d.ts +8 -0
  57. package/dist/commands/upgrade.d.ts.map +1 -1
  58. package/dist/commands/upgrade.js +59 -18
  59. package/dist/commands/upgrade.js.map +1 -1
  60. package/dist/generator/extension-fetch.d.ts +19 -0
  61. package/dist/generator/extension-fetch.d.ts.map +1 -1
  62. package/dist/generator/extension-fetch.js +71 -5
  63. package/dist/generator/extension-fetch.js.map +1 -1
  64. package/dist/generator/template-engine.d.ts +1 -0
  65. package/dist/generator/template-engine.d.ts.map +1 -1
  66. package/dist/generator/template-engine.js +50 -6
  67. package/dist/generator/template-engine.js.map +1 -1
  68. package/dist/utils/command-helpers.d.ts.map +1 -1
  69. package/dist/utils/command-helpers.js +7 -9
  70. package/dist/utils/command-helpers.js.map +1 -1
  71. package/dist/utils/constants.d.ts +1 -0
  72. package/dist/utils/constants.d.ts.map +1 -1
  73. package/dist/utils/constants.js +1 -0
  74. package/dist/utils/constants.js.map +1 -1
  75. package/dist/utils/errors.d.ts +2 -0
  76. package/dist/utils/errors.d.ts.map +1 -1
  77. package/dist/utils/errors.js +6 -1
  78. package/dist/utils/errors.js.map +1 -1
  79. package/dist/utils/project-features.d.ts.map +1 -1
  80. package/dist/utils/project-features.js +1 -1
  81. package/dist/utils/project-features.js.map +1 -1
  82. package/dist/utils/resource-features.d.ts.map +1 -1
  83. package/dist/utils/resource-features.js +2 -2
  84. package/dist/utils/resource-features.js.map +1 -1
  85. package/dist/utils/tar.js +4 -4
  86. package/dist/utils/tar.js.map +1 -1
  87. package/dist/utils/validation.d.ts +7 -0
  88. package/dist/utils/validation.d.ts.map +1 -1
  89. package/dist/utils/validation.js +9 -0
  90. package/dist/utils/validation.js.map +1 -1
  91. package/engine/AGENTS.md +705 -0
  92. package/engine/README.md +29 -0
  93. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  94. package/engine/Tiltfile +80 -0
  95. package/engine/assets/docker/golden-layers.Dockerfile +221 -0
  96. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
  97. package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
  98. package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
  99. package/engine/config.star +3 -0
  100. package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
  101. package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
  102. package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
  103. package/engine/docs/C4-ARCHITECTURE.md +17 -0
  104. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
  105. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
  106. package/engine/docs/README.md +284 -0
  107. package/engine/entrypoint.star +97 -0
  108. package/engine/lifecycle/orchestrator.star +260 -0
  109. package/engine/paths.star +717 -0
  110. package/engine/schemas/manifest-schema.json +301 -0
  111. package/engine/schemas/service-schema.json +301 -0
  112. package/engine/scripts/README.md +89 -0
  113. package/engine/scripts/build-and-publish-lib.sh +205 -0
  114. package/engine/scripts/check-lib-publish.sh +85 -0
  115. package/engine/scripts/debug-container.sh +258 -0
  116. package/engine/scripts/generate-manifest.sh +197 -0
  117. package/engine/spec.master +702 -0
  118. package/engine/spec.master.example +341 -0
  119. package/engine/topologies/README.md +34 -0
  120. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  121. package/engine/topologies/platform/docker/auth/auth.star +167 -0
  122. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  123. package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
  124. package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
  125. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
  126. package/engine/topologies/platform/docker/compose/compose.star +636 -0
  127. package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
  128. package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
  129. package/engine/topologies/platform/docker/config/bunignore.star +142 -0
  130. package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
  131. package/engine/topologies/platform/docker/constants.star +170 -0
  132. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
  133. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
  134. package/engine/topologies/platform/docker/index.star +27 -0
  135. package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
  136. package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
  137. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
  138. package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
  139. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
  140. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
  141. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
  142. package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
  143. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
  144. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
  145. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
  146. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
  147. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
  148. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
  149. package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
  150. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
  151. package/engine/topologies/platform/docker/networking/traefik.star +232 -0
  152. package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
  153. package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
  154. package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
  155. package/engine/topologies/platform/net/proxy.star +4 -0
  156. package/engine/topologies/platform/registries/local.star +4 -0
  157. package/engine/topologies/platform/security/secrets.star +239 -0
  158. package/engine/topologies/platform/state/relational.star +4 -0
  159. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  160. package/engine/topologies/tilt/common/utils.star +364 -0
  161. package/engine/topologies/tilt/common/utils_debug.star +69 -0
  162. package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
  163. package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
  164. package/engine/topologies/tilt/common/utils_env.star +43 -0
  165. package/engine/topologies/tilt/common/utils_output.star +97 -0
  166. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  167. package/engine/topologies/tilt/config/defaults.star +3 -0
  168. package/engine/topologies/tilt/config/feature_flags.star +10 -0
  169. package/engine/topologies/tilt/config/global.star +55 -0
  170. package/engine/topologies/tilt/config/profiles.star +382 -0
  171. package/engine/topologies/tilt/generators/agents_md.star +62 -0
  172. package/engine/topologies/tilt/generators/api_gateway.star +145 -0
  173. package/engine/topologies/tilt/generators/index.star +124 -0
  174. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  175. package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
  176. package/engine/topologies/tilt/generators/infisical/index.star +57 -0
  177. package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
  178. package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
  179. package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
  180. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
  181. package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
  182. package/engine/topologies/tilt/generators/npmrc.star +111 -0
  183. package/engine/topologies/tilt/generators/tsconfig.star +23 -0
  184. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
  185. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
  186. package/engine/topologies/tilt/generators/typescript/common.star +7 -0
  187. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
  188. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
  189. package/engine/topologies/tilt/generators/typescript/include.star +23 -0
  190. package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
  191. package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
  192. package/engine/topologies/tilt/generators/validators.star +853 -0
  193. package/engine/topologies/tilt/generators/vite/backend.star +78 -0
  194. package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
  195. package/engine/topologies/tilt/generators/vite/generators.star +43 -0
  196. package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
  197. package/engine/topologies/tilt/generators/vite/library.star +65 -0
  198. package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
  199. package/engine/topologies/tilt/generators/vite/templates.star +737 -0
  200. package/engine/topologies/tilt/generators/vite_config.star +22 -0
  201. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  202. package/engine/topologies/tilt/manifest/README.md +693 -0
  203. package/engine/topologies/tilt/manifest/__init__.star +218 -0
  204. package/engine/topologies/tilt/manifest/constants.star +252 -0
  205. package/engine/topologies/tilt/manifest/errors.star +266 -0
  206. package/engine/topologies/tilt/manifest/integration.star +339 -0
  207. package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
  208. package/engine/topologies/tilt/manifest/loader.star +214 -0
  209. package/engine/topologies/tilt/manifest/mapper.star +227 -0
  210. package/engine/topologies/tilt/manifest/parser.star +400 -0
  211. package/engine/topologies/tilt/manifest/schema.star +462 -0
  212. package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
  213. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
  214. package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
  215. package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
  216. package/engine/topologies/tilt/manifest/validator.star +717 -0
  217. package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
  218. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  219. package/engine/topologies/tilt/resources/conditions.star +3 -0
  220. package/engine/topologies/tilt/resources/databases.star +244 -0
  221. package/engine/topologies/tilt/resources/declaration.star +3 -0
  222. package/engine/topologies/tilt/resources/deps.star +3 -0
  223. package/engine/topologies/tilt/resources/infra-loader.star +437 -0
  224. package/engine/topologies/tilt/resources/libs.star +30 -0
  225. package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
  226. package/engine/topologies/tilt/resources/libs_paths.star +79 -0
  227. package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
  228. package/engine/topologies/tilt/resources/libs_setup.star +164 -0
  229. package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
  230. package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
  231. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
  232. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
  233. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
  234. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
  235. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
  236. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
  237. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  238. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
  239. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
  240. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
  241. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
  242. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
  243. package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
  244. package/engine/topologies/tilt/resources/orchestrator.star +54 -0
  245. package/engine/topologies/tilt/resources/ordering.star +3 -0
  246. package/engine/topologies/tilt/resources/triggers.star +3 -0
  247. package/engine/topologies/tilt/resources/watchers.star +299 -0
  248. package/engine/where-things-live.star +717 -0
  249. package/ext/Tiltfile +66 -0
  250. package/ext/ide-components/README.md +219 -0
  251. package/ext/ide-components/code_executor/server.py +268 -0
  252. package/ext/ide-components/code_viewer/server.py +206 -0
  253. package/ext/ide-components/config_inspector/server.py +1050 -0
  254. package/ext/ide-components/file_browser/server.py +285 -0
  255. package/ext/ide-components/shared/config_service.py +469 -0
  256. package/ext/ide-components/shared/file_utils.py +298 -0
  257. package/ext/ide-components/shared/http_utils.py +232 -0
  258. package/ext/ide-components/shared/static/styles.css +1334 -0
  259. package/ext/ide-components/shared/syntax_highlighter.py +140 -0
  260. package/ext/ide-components/shared/template_engine.py +123 -0
  261. package/ext/ide-components/shared/templates/base.html +121 -0
  262. package/ext/ide-components/shared/test_config_service.py +326 -0
  263. package/ext/ide-components/shared/tilt_integration.py +158 -0
  264. package/ext/ui-enhancements/cron-status-server.sh +49 -0
  265. package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
  266. package/ext/ui-enhancements/extension.yaml +36 -0
  267. package/ext/ui-enhancements/tiltfile.py +99 -0
  268. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  269. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  270. package/ext/ui-enhancements/ui/icons.css +125 -0
  271. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  272. package/package.json +13 -9
  273. package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
  274. package/specs/specs/TILT_TECH_STACK.star +159 -0
@@ -0,0 +1,230 @@
1
+ # =============================================================================
2
+ # 🌐 - API PATH CONSTANTS (Dynamic)
3
+ # =============================================================================
4
+ # API paths are generated dynamically from manifest stack and appName fields
5
+ # No hardcoded resource names - all from service.json
6
+ # =============================================================================
7
+
8
+
9
+
10
+ # =============================================================================
11
+ # API VERSION AND BASE PATH
12
+ # =============================================================================
13
+
14
+ # === INLINED CONSTANTS for pure extension loading ===
15
+ HEALTH_CHECK_PATH = "/health"
16
+ # === END INLINED CONSTANTS ===
17
+
18
+
19
+ API_VERSION_V1 = "v1"
20
+ API_BASE_PATH = "/api"
21
+
22
+ # =============================================================================
23
+ # DYNAMIC API PATH GENERATION
24
+ # =============================================================================
25
+
26
+ def generate_api_path(stack, app_name):
27
+ """Generate API path from manifest stack and appName.
28
+
29
+ URL Restructuring: Changed from /api/v1/{app-name} to /api/{stack}-management
30
+ This provides clean separation between frontend and backend while removing version from path.
31
+ """
32
+ # NEW: Use /api/{stack}-management pattern
33
+ # Examples: /api/user-management, /api/order-management
34
+ return "/api/" + stack + "-management"
35
+
36
+ # =============================================================================
37
+ # SERVICE STACK TO API PATH MAPPING (Dynamic)
38
+ # =============================================================================
39
+ # This is populated at runtime from discovered manifests
40
+ # No hardcoded resource names
41
+
42
+ RESOURCE_STACK_TO_API_PATH = {}
43
+
44
+ # =============================================================================
45
+ # API PATH TO SERVICE MAPPING (Dynamic)
46
+ # =============================================================================
47
+
48
+ API_PATH_TO_RESOURCE_STACK = {}
49
+ API_PATH_TO_RESOURCE_DOMAIN = API_PATH_TO_RESOURCE_STACK
50
+
51
+ # =============================================================================
52
+ # HELPER FUNCTIONS
53
+ # =============================================================================
54
+
55
+ def _pluralize_stack(stack):
56
+ """Convert stack to proper plural form.
57
+
58
+ Handles irregular plurals and special cases for platform stacks.
59
+
60
+ Args:
61
+ stack: Singular stack name (e.g., "user", "order", "product")
62
+
63
+ Returns:
64
+ str: Pluralized stack name (e.g., "users", "orders", "products")
65
+ """
66
+ # Already plural
67
+ if stack.endswith("s"):
68
+ return stack
69
+
70
+ # Special cases - irregular plurals (common English patterns)
71
+ irregulars = {
72
+ "category": "categories",
73
+ "city": "cities",
74
+ "company": "companies",
75
+ "story": "stories",
76
+ }
77
+
78
+ if stack in irregulars:
79
+ return irregulars[stack]
80
+
81
+ # Words ending in 'y' (not preceded by a vowel) -> 'ies'
82
+ if stack.endswith("y") and len(stack) > 1 and stack[-2] not in "aeiou":
83
+ return stack[:-1] + "ies"
84
+
85
+ # Words ending in 'ch', 'sh', 'ss', 'x', 'z', 'o' -> add 'es'
86
+ if stack.endswith(("ch", "sh", "ss", "x", "z", "o")):
87
+ return stack + "es"
88
+
89
+ # Default: add 's'
90
+ return stack + "s"
91
+
92
+
93
+ def get_api_path_for_stack(stack, manifest=None):
94
+ """Returns the full API path for a service stack.
95
+
96
+ URL Restructuring: Changed from /api/v1/{stack}s to /api/{stack}-management
97
+ This aligns API paths with resource naming conventions.
98
+
99
+ Args:
100
+ stack: Service stack name from manifest.json
101
+ manifest: Optional manifest dict that may contain 'apiPath' override
102
+
103
+ Returns:
104
+ Full API path string (e.g., "/api/user-management")
105
+ Falls back to "/api/{stack}-management" if not found
106
+ Returns apiPath from manifest if explicitly specified
107
+ """
108
+ # Check for explicit apiPath override in manifest
109
+ if manifest and manifest.get("apiPath"):
110
+ return manifest.get("apiPath")
111
+
112
+ # NEW: Use /api/{stack}-management pattern instead of /api/v1/{pluralized}
113
+ return RESOURCE_STACK_TO_API_PATH.get(stack, "/api/" + stack + "-management")
114
+
115
+ # Backwards compatibility alias
116
+ get_api_path_for_domain = get_api_path_for_stack
117
+
118
+ def get_api_path_for_resource(resource_name):
119
+ """Returns the full API path for a resource name.
120
+
121
+ Args:
122
+ resource_name: Resource appName from manifest
123
+
124
+ Returns:
125
+ Full API path string
126
+ """
127
+ # Extract stack from resource name using pattern matching
128
+ # No hardcoded resource names - all patterns derived from naming conventions
129
+ if "-management-backend" in resource_name:
130
+ stack = resource_name.replace("-management-backend", "")
131
+ elif "-management-frontend" in resource_name:
132
+ stack = resource_name.replace("-management-frontend", "")
133
+ elif "-planner-backend" in resource_name:
134
+ stack = resource_name.replace("-planner-backend", "")
135
+ elif "-planner-frontend" in resource_name:
136
+ stack = resource_name.replace("-planner-frontend", "")
137
+ elif "-backend" in resource_name:
138
+ stack = resource_name.replace("-backend", "")
139
+ elif "-frontend" in resource_name:
140
+ stack = resource_name.replace("-frontend", "")
141
+ else:
142
+ stack = resource_name
143
+
144
+ return get_api_path_for_stack(stack)
145
+
146
+ # Backwards compatibility alias
147
+ get_api_path_for_service = get_api_path_for_resource
148
+
149
+ def get_stack_for_api_path(api_path):
150
+ """Returns the service stack for an API path (reverse lookup).
151
+
152
+ Args:
153
+ api_path: Full API path
154
+
155
+ Returns:
156
+ Service stack string
157
+ """
158
+ return API_PATH_TO_RESOURCE_STACK.get(api_path, "")
159
+
160
+ # Backwards compatibility alias
161
+ get_domain_for_api_path = get_stack_for_api_path
162
+
163
+ # Load project name for dynamic localhost domain
164
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
165
+ def _load_project_localhost():
166
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
167
+ project_json_path = '.tdk/project.json'
168
+ if project_root:
169
+ project_json_path = project_root + '/' + project_json_path
170
+
171
+ if os.path.exists(project_json_path):
172
+ _project_json = read_json(project_json_path)
173
+ return _project_json.get('project', {}).get('name', 'tdk-project') + ".localhost"
174
+ return "tdk-project.localhost"
175
+
176
+ _PROJECT_LOCALHOST = _load_project_localhost()
177
+
178
+ def build_traefik_url(api_path, host=None, scheme="http"):
179
+ """Builds full Traefik gateway URL from API path.
180
+
181
+ Args:
182
+ api_path: API path
183
+ host: Gateway host (default: {project}.localhost from project.json)
184
+ scheme: URL scheme (default: http)
185
+
186
+ Returns:
187
+ Full URL string
188
+ """
189
+ if host == None:
190
+ host = _PROJECT_LOCALHOST
191
+ return scheme + "://" + host + api_path
192
+
193
+ def build_health_endpoint(api_path, health_path="/health"):
194
+ """Builds health check endpoint path from API path.
195
+
196
+ Args:
197
+ api_path: API path
198
+ health_path: Health endpoint suffix (default: /health)
199
+
200
+ Returns:
201
+ Full health endpoint path
202
+ """
203
+ return api_path + health_path
204
+
205
+ def get_all_api_paths():
206
+ """Returns a list of all defined API paths from discovered services.
207
+
208
+ Returns:
209
+ List of API path strings
210
+ """
211
+ return RESOURCE_DOMAIN_TO_API_PATH.values()
212
+
213
+ def is_valid_api_path(api_path):
214
+ """Checks if an API path is valid/defined.
215
+
216
+ Args:
217
+ api_path: API path to check
218
+
219
+ Returns:
220
+ True if valid, False otherwise
221
+ """
222
+ return api_path in API_PATH_TO_RESOURCE_DOMAIN
223
+
224
+ # =============================================================================
225
+ # LEGACY COMPATIBILITY (Deprecated - for migration only)
226
+ # =============================================================================
227
+ # All legacy paths removed - use dynamic path generation from manifests
228
+
229
+ LEGACY_DOMAIN_TO_API_PATH = {}
230
+ RESOURCE_DOMAIN_TO_API_PATH = LEGACY_DOMAIN_TO_API_PATH
@@ -0,0 +1,27 @@
1
+ def _sablier_middleware_suffix(manifest):
2
+ """Return (middleware_suffix, group, enabled) for a manifest's Sablier block.
3
+
4
+ When a workload opts in via a `sablier` block, it is fronted by the file-provider
5
+ middleware `sablier-<group>@file` (defined in the platform proxy dynamic config).
6
+ The leading comma lets callers append the suffix to an existing middlewares list.
7
+ """
8
+ sablier_cfg = manifest.get('sablier', {}) if manifest else {}
9
+ if not sablier_cfg.get('enable', False):
10
+ return "", "", False
11
+ group = sablier_cfg.get('group', manifest.get('stack', '') if manifest else '')
12
+ if not group:
13
+ return ",sablier-base@file", "", True
14
+ return ",sablier-" + group + "@file", group, True
15
+
16
+
17
+ def _sablier_container_labels(group, indent):
18
+ """Container labels that let Sablier discover, wake, and stop this workload.
19
+
20
+ `traefik.docker.allownonrunning=true` keeps the router registered while the
21
+ container is stopped, so the next request can trigger the wake.
22
+ """
23
+ lines = [indent + '- "sablier.enable=true"']
24
+ if group:
25
+ lines.append(indent + '- "sablier.group=' + group + '"')
26
+ lines.append(indent + '- "traefik.docker.allownonrunning=true"')
27
+ return "\n" + "\n".join(lines)
@@ -0,0 +1,232 @@
1
+ # =============================================================================
2
+ # 🐳 TILT SDK - TRAEFIK LABELS GENERATOR
3
+ # =============================================================================
4
+
5
+ load(
6
+ "./traefik_constants.star",
7
+ "TRAEFIK_BACKEND_ENABLE_HTTP",
8
+ "TRAEFIK_BACKEND_ENABLE_HTTPS",
9
+ "TRAEFIK_PROJECT_HOST",
10
+ "TRAEFIK_PROJECT_API_HOST",
11
+ "TRAEFIK_DOCKER_NETWORK",
12
+ "TRAEFIK_ENABLE_LABEL",
13
+ "TRAEFIK_FRONTEND_ENABLE_HTTP",
14
+ "TRAEFIK_FRONTEND_ENABLE_HTTPS",
15
+ "TRAEFIK_FRONTEND_PRIORITY_BASE",
16
+ "TRAEFIK_MIDDLEWARE_SUFFIX",
17
+ "TRAEFIK_WEB_ENTRYPOINT",
18
+ "TRAEFIK_WEBSECURE_ENTRYPOINT",
19
+ "TRAEFIK_API_VERSION",
20
+ "TRAEFIK_HEALTHCHECK_INTERVAL",
21
+ "TRAEFIK_HEALTHCHECK_TIMEOUT",
22
+ "TRAEFIK_HEALTHCHECK_RETRIES",
23
+ "TRAEFIK_STARTUP_GRACE_PERIOD",
24
+ "TRAEFIK_API_BASE_PATH",
25
+ )
26
+ load("./traefik_helpers.star",
27
+ "backend_rule",
28
+ "build_entrypoints",
29
+ "cli_api_path",
30
+ "frontend_rule",
31
+ "get_api_path",
32
+ "project_backend_rule",
33
+ )
34
+ # load("./sablier_container_cycle.star",
35
+ # "_sablier_middleware_suffix",
36
+ # "_sablier_container_labels",
37
+ # )
38
+
39
+ def _sablier_middleware_suffix(_):
40
+ # Stub: no Sablier middleware needed
41
+ return "", "", False
42
+
43
+ def _sablier_container_labels(_, __):
44
+ # Stub: no extra labels needed
45
+ return ""
46
+
47
+
48
+ # Sablier functions imported from sablier_container_cycle.star
49
+
50
+
51
+ def get_frontend_traefik_labels(res_name, domain, base_path, port, traefik_host=None, manifest=None):
52
+ """Generate Traefik labels for frontend services."""
53
+ # Priority based on path length ensures more specific paths win over broader ones
54
+ router_priority = TRAEFIK_FRONTEND_PRIORITY_BASE + len(base_path or "")
55
+ frontend_route_rule = frontend_rule(res_name, base_path, traefik_host)
56
+ frontend_entrypoints = build_entrypoints(
57
+ TRAEFIK_FRONTEND_ENABLE_HTTP,
58
+ TRAEFIK_FRONTEND_ENABLE_HTTPS,
59
+ )
60
+ middleware_name = res_name + TRAEFIK_MIDDLEWARE_SUFFIX
61
+
62
+ # Check if maintenance feature is enabled
63
+ features = manifest.get('features', []) if manifest else []
64
+ maintenance_middleware = ""
65
+ if 'maintenance' in features:
66
+ maintenance_middleware = ",maintenance@file"
67
+
68
+ # On-demand scaling: attach the Sablier middleware when opted in via the manifest
69
+ sablier_middleware, sablier_group, sablier_enabled = _sablier_middleware_suffix(manifest)
70
+
71
+ labels = """ - "{traefik_enable_label}"
72
+ - 'traefik.http.routers.{res_name}.rule={frontend_route_rule}'
73
+ - "traefik.http.routers.{res_name}.entrypoints={frontend_entrypoints}"
74
+ - "traefik.http.routers.{res_name}.priority={router_priority}"
75
+ - "traefik.http.routers.{res_name}.middlewares={middleware_name}{maintenance_middleware}{sablier_middleware}"
76
+ - "traefik.http.middlewares.{middleware_name}.stripprefix.prefixes={base_path}"
77
+ - "traefik.http.services.{res_name}.loadbalancer.server.port={port}"
78
+ - "traefik.docker.network={traefik_network}\"""".format(
79
+ res_name=res_name,
80
+ traefik_enable_label=TRAEFIK_ENABLE_LABEL,
81
+ frontend_route_rule=frontend_route_rule,
82
+ frontend_entrypoints=frontend_entrypoints,
83
+ middleware_name=middleware_name,
84
+ base_path=base_path,
85
+ port=port,
86
+ router_priority=router_priority,
87
+ traefik_network=TRAEFIK_DOCKER_NETWORK,
88
+ maintenance_middleware=maintenance_middleware,
89
+ sablier_middleware=sablier_middleware,
90
+ )
91
+
92
+ if sablier_enabled:
93
+ labels += _sablier_container_labels(sablier_group, " ")
94
+
95
+ return labels
96
+
97
+ def get_backend_traefik_labels(
98
+ resource_entry_name,
99
+ traefik_host,
100
+ traefik_path,
101
+ traefik_resource_name,
102
+ internal_port,
103
+ health_path,
104
+ manifest=None,
105
+ ):
106
+ """Generate Traefik labels for backend services with enhanced health checks."""
107
+ backend_route_rule = backend_rule(traefik_host, traefik_path)
108
+ backend_entrypoints = build_entrypoints(
109
+ TRAEFIK_BACKEND_ENABLE_HTTP,
110
+ TRAEFIK_BACKEND_ENABLE_HTTPS,
111
+ )
112
+ middleware_name = resource_entry_name + TRAEFIK_MIDDLEWARE_SUFFIX
113
+
114
+ # Check if maintenance feature is enabled
115
+ features = manifest.get('features', []) if manifest else []
116
+ maintenance_middleware = ""
117
+ if 'maintenance' in features:
118
+ maintenance_middleware = ",maintenance@file"
119
+
120
+ # On-demand scaling: attach the Sablier middleware when opted in via the manifest
121
+ sablier_middleware, sablier_group, sablier_enabled = _sablier_middleware_suffix(manifest)
122
+
123
+ # Build middleware config only if traefik_path is not empty
124
+ if traefik_path:
125
+ middleware_config_lines = [
126
+ ' - "traefik.http.routers.' + resource_entry_name + '.middlewares=' + middleware_name + maintenance_middleware + sablier_middleware + '"',
127
+ ' - "traefik.http.middlewares.' + middleware_name + '.stripprefix.prefixes=' + traefik_path + '"',
128
+ ]
129
+ middleware_config = "\n".join(middleware_config_lines)
130
+ elif sablier_middleware:
131
+ # No strip-prefix path, but still front the router with the Sablier middleware
132
+ middleware_config = ' - "traefik.http.routers.' + resource_entry_name + '.middlewares=' + sablier_middleware.lstrip(",") + '"'
133
+ else:
134
+ # No middleware if path is empty - router has no middlewares
135
+ middleware_config = ""
136
+
137
+ labels = """ - "{traefik_enable_label}"
138
+ - "traefik.http.routers.{resource_entry_name}.rule={backend_route_rule}"
139
+ - "traefik.http.routers.{resource_entry_name}.entrypoints={backend_entrypoints}"
140
+ - "traefik.http.routers.{resource_entry_name}.service={traefik_resource_name}"
141
+ {middleware_config}
142
+ - "traefik.http.services.{traefik_resource_name}.loadbalancer.server.port={internal_port}"
143
+ - "traefik.http.services.{traefik_resource_name}.loadbalancer.healthcheck.path={health_path}"
144
+ - "traefik.http.services.{traefik_resource_name}.loadbalancer.healthcheck.interval={health_interval}"
145
+ - "traefik.http.services.{traefik_resource_name}.loadbalancer.healthcheck.timeout={health_timeout}"
146
+ - "traefik.http.services.{traefik_resource_name}.loadbalancer.healthcheck.followredirects=false"
147
+ - "traefik.docker.network={traefik_network}"
148
+ """.format(
149
+ resource_entry_name=resource_entry_name,
150
+ traefik_enable_label=TRAEFIK_ENABLE_LABEL,
151
+ backend_route_rule=backend_route_rule,
152
+ backend_entrypoints=backend_entrypoints,
153
+ traefik_resource_name=traefik_resource_name,
154
+ middleware_config=middleware_config,
155
+ internal_port=internal_port,
156
+ health_path=health_path,
157
+ health_interval=TRAEFIK_HEALTHCHECK_INTERVAL,
158
+ health_timeout=TRAEFIK_HEALTHCHECK_TIMEOUT,
159
+ traefik_network=TRAEFIK_DOCKER_NETWORK,
160
+ )
161
+
162
+ # Emit Sablier discovery labels so the Sablier container can wake/stop this workload
163
+ if sablier_enabled:
164
+ labels += _sablier_container_labels(sablier_group, " ")
165
+
166
+ # Generate project localhost routing to match `tdk up` URLs:
167
+ # http://api.{project}.localhost/api/{resource-name}
168
+ if manifest:
169
+ stack = manifest.get("stack", "")
170
+ api_path = cli_api_path(resource_entry_name, manifest)
171
+ project_rule = project_backend_rule(manifest, resource_entry_name)
172
+ project_entrypoints = build_entrypoints(
173
+ TRAEFIK_BACKEND_ENABLE_HTTP,
174
+ TRAEFIK_BACKEND_ENABLE_HTTPS,
175
+ )
176
+ # Calculate priority based on path length (more specific = higher priority)
177
+ router_priority = TRAEFIK_FRONTEND_PRIORITY_BASE + len(api_path)
178
+
179
+ # Generate old path pattern for redirect (e.g., /{stack}-management/api/v1/)
180
+ old_path_pattern = "/{stack}-management/api/v1".format(stack=stack) if stack else ""
181
+ management_path = get_api_path(stack, manifest) if stack else ""
182
+
183
+ labels += """
184
+ - "traefik.http.routers.{resource_entry_name}-project.rule={project_rule}"
185
+ - "traefik.http.routers.{resource_entry_name}-project.entrypoints={project_entrypoints}"
186
+ - "traefik.http.routers.{resource_entry_name}-project.service={traefik_resource_name}"
187
+ - "traefik.http.routers.{resource_entry_name}-project.middlewares={middleware_name}-project{maintenance_middleware}{sablier_middleware}"
188
+ - "traefik.http.middlewares.{middleware_name}-project.stripprefix.prefixes={api_path}"
189
+ - "traefik.http.routers.{resource_entry_name}-project.priority={router_priority}"
190
+ """.format(
191
+ resource_entry_name=resource_entry_name,
192
+ traefik_resource_name=traefik_resource_name,
193
+ project_rule=project_rule,
194
+ project_entrypoints=project_entrypoints,
195
+ middleware_name=middleware_name,
196
+ maintenance_middleware=maintenance_middleware,
197
+ sablier_middleware=sablier_middleware,
198
+ api_path=api_path,
199
+ router_priority=router_priority,
200
+ )
201
+
202
+ if management_path and management_path != api_path:
203
+ labels += """
204
+ - "traefik.http.routers.{resource_entry_name}-management.rule=Host(`{api_host}`) && PathPrefix(`{management_path}`)"
205
+ - "traefik.http.routers.{resource_entry_name}-management.entrypoints={project_entrypoints}"
206
+ - "traefik.http.routers.{resource_entry_name}-management.service={traefik_resource_name}"
207
+ - "traefik.http.routers.{resource_entry_name}-management.middlewares={middleware_name}-management"
208
+ - "traefik.http.middlewares.{middleware_name}-management.stripprefix.prefixes={management_path}"
209
+ - "traefik.http.routers.{resource_entry_name}-management.priority={mgmt_priority}"
210
+ """.format(
211
+ resource_entry_name=resource_entry_name,
212
+ traefik_resource_name=traefik_resource_name,
213
+ api_host=TRAEFIK_PROJECT_API_HOST,
214
+ management_path=management_path,
215
+ project_entrypoints=project_entrypoints,
216
+ middleware_name=middleware_name,
217
+ mgmt_priority=TRAEFIK_FRONTEND_PRIORITY_BASE + len(management_path),
218
+ )
219
+
220
+ if old_path_pattern:
221
+ labels += """
222
+ # Redirect middleware for URL restructuring: old path -> new path
223
+ - "traefik.http.middlewares.{resource_entry_name}-redirect.redirectregex.regex=^`{old_path_pattern}/(.*)`"
224
+ - "traefik.http.middlewares.{resource_entry_name}-redirect.redirectregex.replacement=`{api_path}/$$1`"
225
+ - "traefik.http.middlewares.{resource_entry_name}-redirect.redirectregex.permanent=true"
226
+ """.format(
227
+ resource_entry_name=resource_entry_name,
228
+ old_path_pattern=old_path_pattern,
229
+ api_path=api_path,
230
+ )
231
+
232
+ return labels
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env starlark
2
+ # =============================================================================
3
+ # 🐳 TILT SDK - TRAEFIK CONSTANTS
4
+ # =============================================================================
5
+ # STORY 4 FIX: API Gateway 504 Error Prevention
6
+ # - Startup grace period: 30s (allows services to fully initialize)
7
+ # - Extended timeouts for cold-start services
8
+ # - Proper health check sequencing
9
+ # =============================================================================
10
+
11
+ # === INLINED CONSTANTS for pure extension loading ===
12
+ TRAEFIK_CONFIG = {
13
+ "entrypoint": "web",
14
+ "web_entrypoint": "web",
15
+ "network": "traefik-public",
16
+ "default_host": "localhost",
17
+ "default_port": 8080,
18
+ "tls_enabled": False,
19
+ "entrypoints": ["web"],
20
+ "middlewares": [],
21
+ "tls": {"enabled": False},
22
+ "healthcheck_path": "/health",
23
+ "healthcheck_interval": "10s",
24
+ "healthcheck_timeout": "5s",
25
+ "frontend_priority_base": 100,
26
+ "websecure_entrypoint": "websecure",
27
+ "enable_strip_prefix": True,
28
+ "localhost_suffix": ".localhost",
29
+ "healthcheck_retries": 3,
30
+ "resource_startup_delay": "30s",
31
+ "startup_grace_period": "30s",
32
+ "response_timeout": "30s",
33
+ "connection_timeout": "10s",
34
+ "retry_attempts": 3,
35
+ "circuit_breaker_threshold": 5,
36
+ "strip_prefix_middleware_suffix": "-strip-prefix",
37
+ "retry_initial_interval": "1s",
38
+ "retry_max_interval": "10s",
39
+ "rate_limit_requests": 100,
40
+ "rate_limit_period": "1m",
41
+ "buffer_request_body": True,
42
+ "forward_auth_url": "",
43
+ "api_base_path": "/api",
44
+ "api_version": "v1"
45
+ }
46
+ DEFAULTS = {}
47
+
48
+ # === END INLINED CONSTANTS ===
49
+
50
+
51
+ load("../constants.star", "PlatformDockerConstants")
52
+ # =============================================================================
53
+ # MASTER CONFIG IMPORTS - Use centralized configuration
54
+ # =============================================================================
55
+
56
+
57
+ # =============================================================================
58
+ # API PATH CONSTANTS - Import for dynamic API path generation
59
+ # =============================================================================
60
+ load("./api_path_constants.star",
61
+ "get_api_path_for_domain",
62
+ "get_api_path_for_service",
63
+ "build_traefik_url",
64
+ "build_health_endpoint")
65
+
66
+ TRAEFIK_ENABLE_LABEL = "traefik.enable=true"
67
+ TRAEFIK_DOCKER_NETWORK = PlatformDockerConstants.NETWORK_TRAEFIK_PUBLIC
68
+
69
+ # Entrypoints from master config
70
+ TRAEFIK_WEBSECURE_ENTRYPOINT = TRAEFIK_CONFIG["websecure_entrypoint"]
71
+
72
+ TRAEFIK_FRONTEND_ENABLE_HTTP = True
73
+ TRAEFIK_FRONTEND_ENABLE_HTTPS = True
74
+ TRAEFIK_BACKEND_ENABLE_HTTP = True
75
+ TRAEFIK_BACKEND_ENABLE_HTTPS = False
76
+
77
+ # Middleware settings from master config
78
+ TRAEFIK_ENABLE_STRIP_PREFIX_MIDDLEWARE = TRAEFIK_CONFIG["enable_strip_prefix"]
79
+ TRAEFIK_ENABLE_FRONTEND_HOST_RULE = True
80
+ TRAEFIK_ENABLE_FRONTEND_PATH_RULE = True
81
+ TRAEFIK_ENABLE_BACKEND_HOST_RULE = True
82
+ TRAEFIK_ENABLE_BACKEND_PATH_RULE = True
83
+
84
+ TRAEFIK_PROJECT_HOST = PlatformDockerConstants.LOCAL_DOMAIN
85
+ TRAEFIK_PROJECT_APP_HOST = PlatformDockerConstants.APP_LOCAL_DOMAIN
86
+ TRAEFIK_PROJECT_API_HOST = PlatformDockerConstants.API_LOCAL_DOMAIN
87
+ TRAEFIK_FRONTEND_LOCALHOST_SUFFIX = TRAEFIK_CONFIG["localhost_suffix"]
88
+
89
+ # Priority from master config
90
+ TRAEFIK_FRONTEND_PRIORITY_BASE = TRAEFIK_CONFIG["frontend_priority_base"]
91
+
92
+ # =============================================================================
93
+ # STORY 4 FIX: Health check configuration with 30-second grace period
94
+ # =============================================================================
95
+ # From TILT_RESOURCE_DEFAULTS.star - centralized configuration
96
+ # Health check configuration - optimized to prevent 504s on startup
97
+ TRAEFIK_HEALTHCHECK_RETRIES = TRAEFIK_CONFIG["healthcheck_retries"]
98
+
99
+ # STORY 4 FIX: 30-second grace period (matches issue requirement)
100
+ TRAEFIK_RESOURCE_STARTUP_DELAY = TRAEFIK_CONFIG["resource_startup_delay"]
101
+ TRAEFIK_HEALTHY_THRESHOLD = TRAEFIK_CONFIG["retry_attempts"]
102
+ TRAEFIK_MIDDLEWARE_SUFFIX = TRAEFIK_CONFIG["strip_prefix_middleware_suffix"]
103
+
104
+ # =============================================================================
105
+ # API ROUTING PATHS - Dynamic from Manifests
106
+ # =============================================================================
107
+ # API paths are generated dynamically from manifest domain and appName fields
108
+ # No hardcoded service names - all from service.json
109
+ # =============================================================================
110
+
111
+ # Planner service paths are generated dynamically from manifests
112
+ # Use get_api_path_for_domain() function instead of hardcoded constants
113
+
114
+ # API paths are now generated dynamically - no hardcoded constants
115
+ # Use get_api_path_for_domain() function instead
116
+
117
+ # =============================================================================
118
+ # API ROUTING PATTERN
119
+ # =============================================================================
120
+ # Standard API path pattern generated from manifest: /api/v1/{appName}
121
+ # Domain comes from service manifest, allowing dynamic service discovery
122
+ # No hardcoded examples - all paths from service.json
123
+ # =============================================================================
124
+ # TRAEFIK_API_VERSION and TRAEFIK_API_BASE_PATH now imported from master config
125
+
126
+ # =============================================================================
127
+ # STORY 4 FIX: Retry middleware configuration for transient failures
128
+ # =============================================================================
129
+ TRAEFIK_RETRY_ATTEMPTS = TRAEFIK_CONFIG["retry_attempts"]
130
+ TRAEFIK_RETRY_INITIAL_INTERVAL = TRAEFIK_CONFIG["retry_initial_interval"]
131
+
132
+ # =============================================================================
133
+ # MASTER CONFIG RE-EXPORTS
134
+ # =============================================================================
135
+ # Re-export all values imported from master config so other files can load them
136
+ # from this module. This maintains backward compatibility.
137
+
138
+ # Define traefik constants from master config (available for other files to load)
139
+ TRAEFIK_WEB_ENTRYPOINT = TRAEFIK_CONFIG["web_entrypoint"]
140
+ TRAEFIK_WEBSECURE_ENTRYPOINT = TRAEFIK_CONFIG["websecure_entrypoint"]
141
+ TRAEFIK_HEALTHCHECK_INTERVAL = TRAEFIK_CONFIG["healthcheck_interval"]
142
+ TRAEFIK_HEALTHCHECK_TIMEOUT = TRAEFIK_CONFIG["healthcheck_timeout"]
143
+ TRAEFIK_HEALTHCHECK_RETRIES = TRAEFIK_CONFIG["healthcheck_retries"]
144
+ TRAEFIK_STARTUP_GRACE_PERIOD = TRAEFIK_CONFIG["startup_grace_period"]
145
+ TRAEFIK_API_BASE_PATH = TRAEFIK_CONFIG["api_base_path"]
146
+ TRAEFIK_API_VERSION = TRAEFIK_CONFIG["api_version"]