@@ -100,6 +100,16 @@ def _should_add_local_src(candidate: Path) -> bool:
100100 "IBKR_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD" ,
101101 "EXECUTION_REPORT_GCS_URI" ,
102102)
103+ SCHEDULER_TIME_DEFAULTS = {
104+ "main_time" : "45 15" ,
105+ "probe_time" : "35 9,15" ,
106+ "precheck_time" : "45 9" ,
107+ }
108+ SCHEDULER_TIME_ENV = {
109+ "main_time" : "CLOUD_SCHEDULER_MAIN_TIME" ,
110+ "probe_time" : "CLOUD_SCHEDULER_PROBE_TIME" ,
111+ "precheck_time" : "CLOUD_SCHEDULER_PRECHECK_TIME" ,
112+ }
103113
104114
105115def build_sync_plan (env : Mapping [str , str ] = os .environ ) -> dict [str , object ]:
@@ -270,10 +280,46 @@ def _build_target_plan(
270280 "service_name" : service_name ,
271281 "strategy_profile" : canonical_profile ,
272282 "env" : env_values ,
283+ "scheduler" : _build_scheduler_plan (
284+ target = target ,
285+ defaults = defaults ,
286+ env = env ,
287+ env_values = env_values ,
288+ per_service_mode = per_service_mode ,
289+ ),
273290 "remove_env_vars" : sorted (set (remove_env_vars ) - set (env_values )),
274291 }
275292
276293
294+ def _build_scheduler_plan (
295+ * ,
296+ target : Mapping [str , object ],
297+ defaults : Mapping [str , object ],
298+ env : Mapping [str , str ],
299+ env_values : Mapping [str , str ],
300+ per_service_mode : bool ,
301+ ) -> dict [str , str ]:
302+ market = str (env_values .get ("IBKR_MARKET" ) or "" ).strip ().upper ()
303+ timezone = str (env_values .get ("IBKR_MARKET_TIMEZONE" ) or "" ).strip ()
304+ if not timezone :
305+ timezone = "Asia/Hong_Kong" if market == "HK" else "America/New_York"
306+
307+ scheduler = {"timezone" : timezone }
308+ for key , env_name in SCHEDULER_TIME_ENV .items ():
309+ scheduler [key ] = (
310+ _target_env_value (
311+ target ,
312+ defaults ,
313+ env ,
314+ env_name ,
315+ per_service_mode = per_service_mode ,
316+ allow_shared_fallback = True ,
317+ )
318+ or SCHEDULER_TIME_DEFAULTS [key ]
319+ )
320+ return scheduler
321+
322+
277323def _validate_profile_inputs (
278324 * ,
279325 service_name : str ,
0 commit comments