Source code for ralph.prompts._capability_set
"""CapabilitySet — lightweight set of Ralph capabilities."""
from __future__ import annotations
from typing import TYPE_CHECKING
from ralph.mcp.protocol.capability_mapping import Capability as RalphCapability
from ralph.mcp.protocol.capability_mapping import SessionDrain
from ralph.mcp.session_plan import default_prompt_capability_identifiers
if TYPE_CHECKING:
from collections.abc import Iterable, Iterator
[docs]
class CapabilitySet:
"""Lightweight set of Ralph capabilities."""
def __init__(self, values: Iterable[RalphCapability] | None = None) -> None:
self._values = frozenset(values or ())
def contains(self, capability: RalphCapability) -> bool:
return capability in self._values
def insert(self, capability: RalphCapability) -> None:
self._values = frozenset((*self._values, capability))
def __iter__(self) -> Iterator[RalphCapability]:
return iter(self._values)
def iter(self) -> Iterable[RalphCapability]:
return iter(self._values)
def to_vec(self) -> tuple[RalphCapability, ...]:
return tuple(self._values)
@classmethod
def defaults_for_drain(cls, drain: SessionDrain) -> CapabilitySet:
return cls(_default_capabilities_for_drain(drain))
@classmethod
def from_identifiers(cls, identifiers: Iterable[str] | None) -> CapabilitySet:
if not identifiers:
return cls()
values: list[RalphCapability] = []
for identifier in identifiers:
try:
values.append(RalphCapability(identifier))
except ValueError:
continue
return cls(values)
def _default_capabilities_for_drain(drain: SessionDrain) -> tuple[RalphCapability, ...]:
return tuple(
RalphCapability(identifier) for identifier in default_prompt_capability_identifiers(drain)
)
DEFAULT_CAPABILITIES: dict[SessionDrain, tuple[RalphCapability, ...]] = {
drain: _default_capabilities_for_drain(drain) for drain in SessionDrain
}
__all__ = ["DEFAULT_CAPABILITIES", "CapabilitySet"]