43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
"""Runtime supervision capability negotiation without pretending support."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import asdict, dataclass
|
|
from datetime import datetime, timezone
|
|
from typing import Any
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RuntimeCapabilities:
|
|
canCancel: bool = False
|
|
canPause: bool = False
|
|
canResume: bool = False
|
|
canRollback: bool = False
|
|
canReduceAuthority: bool = False
|
|
canQuarantine: bool = False
|
|
|
|
|
|
CAPABILITY_FOR_INTERVENTION = {
|
|
"cancel": "canCancel",
|
|
"pause": "canPause",
|
|
"resume": "canResume",
|
|
"roll_back": "canRollback",
|
|
"reduce_authority": "canReduceAuthority",
|
|
"quarantine": "canQuarantine",
|
|
}
|
|
|
|
|
|
def negotiate_intervention(intervention_id: str, intervention: str, requested_by: str, capabilities: RuntimeCapabilities) -> dict[str, Any]:
|
|
capability = CAPABILITY_FOR_INTERVENTION.get(intervention)
|
|
supported = bool(capability and getattr(capabilities, capability))
|
|
return {
|
|
"intervention_id": intervention_id,
|
|
"type": intervention,
|
|
"requested_by": requested_by,
|
|
"status": "pending" if supported else "unsupported",
|
|
"reason_code": "runtime_intervention_supported_pending_adapter" if supported else "runtime_intervention_unsupported",
|
|
"required_capability": capability,
|
|
"runtime_capabilities": asdict(capabilities),
|
|
"timestamp": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
|
|
}
|