|
19 | 19 |
|
20 | 20 | from src.core.config.app_config import AppConfig |
21 | 21 | from src.core.di.container import ServiceCollection |
| 22 | +from src.core.di.registrations._shared import register_singleton_if_absent |
22 | 23 | from src.core.interfaces.application_state_interface import IApplicationState |
23 | | -from src.core.interfaces.di_interface import IServiceProvider |
| 24 | +from src.core.interfaces.backend_completion_flow_interface import ( |
| 25 | + IBackendCompletionFlow, |
| 26 | +) |
| 27 | +from src.core.interfaces.backend_lifecycle_manager_interface import ( |
| 28 | + IBackendLifecycleManager, |
| 29 | +) |
| 30 | +from src.core.interfaces.di_interface import IServiceProvider |
24 | 31 | from src.core.interfaces.response_parser_interface import IResponseParser |
25 | 32 |
|
26 | 33 | # from src.core.interfaces.secure_state_interface import ISecureStateService # Removed unresolved import |
@@ -323,6 +330,9 @@ def secure_state_factory(provider: IServiceProvider) -> SecureStateService: |
323 | 330 | # Register connection activity tracker (if enabled) |
324 | 331 | self._register_activity_tracker(services, config) |
325 | 332 |
|
| 333 | + # Register usage window warm-up scheduler (if enabled) |
| 334 | + self._register_usage_window_warmup_service(services, config) |
| 335 | + |
326 | 336 | # Register wire capture service |
327 | 337 | self._register_wire_capture_service(services) |
328 | 338 |
|
@@ -475,6 +485,44 @@ def cleanup_scheduler_factory( |
475 | 485 | if logger.isEnabledFor(logging.INFO): |
476 | 486 | logger.info("Connection tracker cleanup scheduler registered") |
477 | 487 |
|
| 488 | + def _register_usage_window_warmup_service( |
| 489 | + self, services: ServiceCollection, config: AppConfig |
| 490 | + ) -> None: |
| 491 | + if not config.usage_window_warmup.enabled: |
| 492 | + if logger.isEnabledFor(logging.DEBUG): |
| 493 | + logger.debug("Usage window warm-up scheduler disabled") |
| 494 | + return |
| 495 | + |
| 496 | + from src.core.services.usage_window_warmup_service import ( |
| 497 | + UsageWindowWarmupService, |
| 498 | + ) |
| 499 | + |
| 500 | + def warmup_service_factory( |
| 501 | + provider: IServiceProvider, |
| 502 | + ) -> UsageWindowWarmupService: |
| 503 | + completion_flow = provider.get_required_service( |
| 504 | + IBackendCompletionFlow # type: ignore[type-abstract] |
| 505 | + ) |
| 506 | + backend_lifecycle_manager = provider.get_service( |
| 507 | + IBackendLifecycleManager # type: ignore[type-abstract] |
| 508 | + ) |
| 509 | + from src.core.services.warmup_target_resolver import WarmupTargetResolver |
| 510 | + |
| 511 | + target_resolver = WarmupTargetResolver(backend_lifecycle_manager) |
| 512 | + return UsageWindowWarmupService( |
| 513 | + completion_flow=completion_flow, |
| 514 | + config=config.usage_window_warmup, |
| 515 | + target_resolver=target_resolver, |
| 516 | + ) |
| 517 | + |
| 518 | + register_singleton_if_absent( |
| 519 | + services, |
| 520 | + UsageWindowWarmupService, |
| 521 | + implementation_factory=warmup_service_factory, |
| 522 | + ) |
| 523 | + if logger.isEnabledFor(logging.INFO): |
| 524 | + logger.info("Usage window warm-up scheduler registered") |
| 525 | + |
478 | 526 | def _register_wire_capture_service(self, services: ServiceCollection) -> None: |
479 | 527 | """Register wire capture service. |
480 | 528 |
|
|
0 commit comments