from typing import Dict, Any from .lineage_model import CodexEntry, SegmentLineage, EpochInfo, ContributorInfo from .epoch_mapper import parse_epoch from .contributor_index import register_contributor def resolve_lineage(manifest: Dict[str, Any]) -> CodexEntry: source_file = manifest.get("source_file", "unknown") source_type = manifest.get("source_type", ".py") version = manifest.get("version", "1.0.0") origin = manifest.get("origin", "unknown") timestamp = manifest.get("timestamp") epoch_str = manifest.get("epoch", "v1") epoch = parse_epoch(str(epoch_str)) contributor_name = manifest.get("contributor", "unknown") contributor = register_contributor(contributor_name) segments = [] codex_lineage = manifest.get("codex_lineage", {}) segment_list = codex_lineage.get("segments", []) for seg in segment_list: segment = SegmentLineage( segment_id=seg.get("id", "unknown"), start_line=seg.get("start", 0), end_line=seg.get("end", 0), start_byte=seg.get("start_byte", 0), end_byte=seg.get("end_byte", 0) ) segments.append(segment) return CodexEntry( source_file=source_file, source_type=source_type, version=version, origin=origin, epoch=epoch, contributor=contributor, segments=segments, timestamp=timestamp )