Resolve paper references from either 1-based positions or actual paper IDs. If paper_refs is empty but papers is not, return all papers directly.
(paper_refs: List[int], papers: List[Dict])
| 4598 | |
| 4599 | def resolve_selected_papers(paper_refs: List[int], papers: List[Dict]) -> List[Dict]: |
| 4600 | """Resolve paper references from either 1-based positions or actual paper IDs. |
| 4601 | |
| 4602 | If paper_refs is empty but papers is not, return all papers directly. |
| 4603 | """ |
| 4604 | # If no refs provided but papers exist, return all papers (for direct PDF input) |
| 4605 | if not paper_refs and papers: |
| 4606 | return papers |
| 4607 | |
| 4608 | resolved: List[Dict] = [] |
| 4609 | seen_keys: set[str] = set() |
| 4610 | |
| 4611 | papers_by_id = {} |
| 4612 | for paper in papers: |
| 4613 | paper_id = paper.get("id") |
| 4614 | if paper_id is not None: |
| 4615 | papers_by_id[int(paper_id)] = paper |
| 4616 | |
| 4617 | for paper_ref in paper_refs: |
| 4618 | paper: Optional[Dict[str, Any]] = None |
| 4619 | |
| 4620 | idx = int(paper_ref) - 1 |
| 4621 | if 0 <= idx < len(papers): |
| 4622 | paper = papers[idx] |
| 4623 | |
| 4624 | if paper is None: |
| 4625 | paper = papers_by_id.get(int(paper_ref)) |
| 4626 | |
| 4627 | if paper is None: |
| 4628 | continue |
| 4629 | |
| 4630 | unique_key = str(paper.get("id") or paper.get("arxiv_id") or paper.get("title") or paper_ref) |
| 4631 | if unique_key in seen_keys: |
| 4632 | continue |
| 4633 | seen_keys.add(unique_key) |
| 4634 | resolved.append(paper) |
| 4635 | |
| 4636 | return resolved |
| 4637 | |
| 4638 | |
| 4639 | def _legacy_create_reading_report( |
| 4640 | user_id: str, |
no test coverage detected