1"""DI wiring for the governance relay ledger service.
2
3Nothing is bound when governance is disabled. The SQL ledger store
4and service are built and bound during :func:`boot_relay_ledger` once
5the database contract is resolvable.
6"""
7
8from __future__ import annotations
9
10from lexigram.ai.governance.config import GovernanceConfig
11from lexigram.ai.governance.relay_ledger import (
12 RelayLedgerService,
13 SqlRelayLedgerStore,
14)
15from lexigram.contracts.ai.relay import RelayLedgerServiceProtocol
16from lexigram.contracts.core.di import BootContainerProtocol
17from lexigram.contracts.data import DatabaseProviderProtocol
18from lexigram.logging import get_logger
19
20logger = get_logger(__name__)
21
22__all__ = ["boot_relay_ledger", "register_relay_ledger"]
23
24
25def register_relay_ledger(
26 container: object,
27 config: object,
28) -> None:
29 """Register relay ledger services.
30
31 Args:
32 container: The container registrar to bind into.
33 config: Governance configuration; ``enabled`` gates the service.
34 """
35 del container
36 if not isinstance(config, GovernanceConfig) or not config.enabled:
37 logger.info("relay_ledger_disabled", reason="governance disabled")
38 return
39 logger.info("relay_ledger_registered")
40
41
42async def boot_relay_ledger(
43 container: BootContainerProtocol,
44 config: object,
45) -> None:
46 """Build the ledger store and service and bind the service contract.
47
48 Args:
49 container: The boot container used to resolve contracts.
50 config: Governance configuration driving the bootstrap.
51 """
52 if not isinstance(config, GovernanceConfig) or not config.enabled:
53 logger.info("relay_ledger_boot_skipped", reason="governance disabled")
54 return
55
56 database = await container.resolve_optional(DatabaseProviderProtocol)
57 if database is None:
58 logger.warning(
59 "relay_ledger_missing_dependency",
60 missing="DatabaseProviderProtocol",
61 )
62 return
63
64 store = SqlRelayLedgerStore(database)
65 service = RelayLedgerService(store=store)
66 container.singleton(RelayLedgerServiceProtocol, service)
67 logger.info("relay_ledger_booted", store="SqlRelayLedgerStore")