← Files NGS Analysis WorkbenchARCHIVED FILE

mcp/ngs_workbench_mcp/workflows/resolution.py

1.84 KB · Sep 30, 2026 · 23:20 UTC

↓ Download file

"""Resolve one catalog version into an engine execution binding."""

from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path

from ngs_workbench_daemon.persistence import SqlAlchemyUnitOfWork, default_database
from ngs_workbench_daemon.persistence.workflows import (
    WorkflowEntryRecord,
    WorkflowRepository,
    WorkflowVersionRecord,
)

from .defaults import PLUGIN_ROOT
from .source import WorkflowSource


@dataclass(frozen=True)
class ResolvedWorkflow:
    entry: WorkflowEntryRecord
    version: WorkflowVersionRecord

    def local_execution_source(self) -> WorkflowSource | None:
        version = self.version
        if version.source_kind != "local":
            return None
        assert version.local_root is not None and version.entrypoint is not None
        root = Path(version.local_root)
        if self.entry.owner == "bundled":
            root = PLUGIN_ROOT / root
        return WorkflowSource(
            engine=self.entry.engine,
            kind="local",
            root=str(root.resolve()),
            entrypoint=version.entrypoint,
            source_sha256=version.source_sha256,
        )


def resolve_workflow(workflow_id: str, engine: str | None = None) -> ResolvedWorkflow:
    with SqlAlchemyUnitOfWork(default_database()) as unit_of_work:
        assert unit_of_work.session is not None
        repository = WorkflowRepository(unit_of_work.session)
        entry = repository.get_entry(workflow_id)
        version = repository.get_current_version(workflow_id)
    if entry is None or version is None or entry.archived_at_ms is not None:
        raise ValueError(f"workflow is unavailable: {workflow_id}")
    if engine is not None and entry.engine != engine:
        raise ValueError(f"workflow {workflow_id!r} is not a {engine} workflow")
    return ResolvedWorkflow(entry=entry, version=version)

SHA-256: aad438fb579dd4813312a16daebeb119ace620bb6ec426114e98f1cd71f7dabd