feat: add durable Core Hub absorption runtime
This commit is contained in:
parent
7e1ec03f0c
commit
8ab1d0c09a
20 changed files with 2423 additions and 15 deletions
|
|
@ -11,6 +11,10 @@ def _env_bool(name: str, default: bool) -> bool:
|
|||
return raw.strip().lower() in {"1", "true", "yes", "on"}
|
||||
|
||||
|
||||
def _env_set(name: str) -> frozenset[str]:
|
||||
return frozenset(value.strip() for value in os.getenv(name, "").split(",") if value.strip())
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class RuntimeSettings:
|
||||
environment: str = "development"
|
||||
|
|
@ -23,6 +27,21 @@ class RuntimeSettings:
|
|||
mcp_port: int = 8011
|
||||
mcp_transport: str = "http"
|
||||
database_url: str | None = None
|
||||
api_token: str | None = None
|
||||
v2_groups: frozenset[str] = frozenset()
|
||||
v2_write_groups: frozenset[str] = frozenset()
|
||||
legacy_write_groups: frozenset[str] = frozenset()
|
||||
legacy_health: bool = False
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
overlap = self.v2_write_groups & self.legacy_write_groups
|
||||
if overlap:
|
||||
joined = ", ".join(sorted(overlap))
|
||||
raise ValueError(f"hub-core and Core Hub write groups overlap: {joined}")
|
||||
unknown = self.v2_write_groups - self.v2_groups
|
||||
if unknown:
|
||||
joined = ", ".join(sorted(unknown))
|
||||
raise ValueError(f"hub-core write groups are not enabled: {joined}")
|
||||
|
||||
@classmethod
|
||||
def from_env(cls) -> RuntimeSettings:
|
||||
|
|
@ -41,6 +60,11 @@ class RuntimeSettings:
|
|||
mcp_port=int(os.getenv("HUB_CORE_MCP_PORT", "8011")),
|
||||
mcp_transport=os.getenv("HUB_CORE_MCP_TRANSPORT", "http"),
|
||||
database_url=os.getenv("HUB_CORE_DATABASE_URL") or os.getenv("DATABASE_URL"),
|
||||
api_token=os.getenv("HUB_CORE_API_TOKEN") or os.getenv("CORE_HUB_API_TOKEN"),
|
||||
v2_groups=_env_set("HUB_CORE_V2_GROUPS"),
|
||||
v2_write_groups=_env_set("HUB_CORE_V2_WRITE_GROUPS"),
|
||||
legacy_write_groups=_env_set("CORE_HUB_V2_WRITE_GROUPS"),
|
||||
legacy_health=_env_bool("HUB_CORE_LEGACY_HEALTH", False),
|
||||
)
|
||||
|
||||
def readiness_checks(self, store_backend: str) -> dict[str, str]:
|
||||
|
|
@ -51,6 +75,9 @@ class RuntimeSettings:
|
|||
"active_backend": store_backend,
|
||||
"ephemeral_backend": "allowed" if ephemeral_allowed else "not_allowed",
|
||||
"contract": "helixforge.hub-extension/0.1.0",
|
||||
"v2_groups": ",".join(sorted(self.v2_groups)) or "none",
|
||||
"v2_write_groups": ",".join(sorted(self.v2_write_groups)) or "none",
|
||||
"legacy_write_groups": ",".join(sorted(self.legacy_write_groups)) or "none",
|
||||
}
|
||||
|
||||
def is_ready(self, store_backend: str) -> bool:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue