Source code for ralph.pipeline.parallel.mode

"""Parallel execution mode definitions for same-workspace parallel workers v1."""

from __future__ import annotations

from dataclasses import dataclass, field
from typing import TYPE_CHECKING

from ralph.pipeline.parallel.parallel_execution_mode import ParallelExecutionMode

if TYPE_CHECKING:
    from pathlib import Path

    from ralph.interrupt.asyncio_bridge import SignalBridge
    from ralph.mcp.multimodal.capabilities import (
        MultimodalModelIdentity,
        ResolvedCapabilityProfile,
    )
    from ralph.mcp.server.factory import McpServerFactory


[docs] @dataclass(frozen=True) class SameWorkspaceContext: """Runtime context for same-workspace parallel execution. Workers run against ``repo_root`` directly. Per-worker mutable state lives under ``worker_namespace_root / <unit_id> / {artifacts,tmp,logs,handoffs}``. Workers share one checkout; post-development coordination is state aggregation only. The session contract fields (``session_drain``, ``session_capabilities``, ``session_model_identity``, ``session_capability_profile``) carry the parent phase's resolved MCP session plan verbatim so that parallel workers expose the same multimodal capability surface as the serial execution path. """ repo_root: Path mcp_factory: McpServerFactory executor_command: tuple[str, ...] | None = None worker_commands: dict[str, tuple[str, ...]] = field(default_factory=dict) signal_bridge: SignalBridge | None = None worker_namespace_root: Path | None = None worker_manifest_paths: dict[str, Path] = field(default_factory=dict) session_drain: str = "" session_capabilities: frozenset[str] = frozenset() session_model_identity: MultimodalModelIdentity | None = None session_capability_profile: ResolvedCapabilityProfile | None = None def __post_init__(self) -> None: if self.worker_namespace_root is None: object.__setattr__( self, "worker_namespace_root", self.repo_root / ".agent" / "workers", )
__all__ = ["ParallelExecutionMode", "SameWorkspaceContext"]