(root: Optional[Path])
| 2791 | |
| 2792 | |
| 2793 | def _collect_logs(root: Optional[Path]) -> list[dict]: |
| 2794 | if not root or not root.exists(): |
| 2795 | return [] |
| 2796 | patterns = ["agent_events.log", "*_agent_events.log", "agent_events-prev-*.log"] |
| 2797 | seen: set[Path] = set() |
| 2798 | entries: list[dict] = [] |
| 2799 | for pattern in patterns: |
| 2800 | for path in root.rglob(pattern): |
| 2801 | if not path.is_file(): |
| 2802 | continue |
| 2803 | resolved = path.resolve() |
| 2804 | if resolved in seen: |
| 2805 | continue |
| 2806 | seen.add(resolved) |
| 2807 | try: |
| 2808 | stat = resolved.stat() |
| 2809 | group = "outputs" |
| 2810 | label = _log_label(resolved) |
| 2811 | if log_root_path: |
| 2812 | try: |
| 2813 | rel = resolved.relative_to(log_root_path) |
| 2814 | parent = rel.parent |
| 2815 | label = rel.name |
| 2816 | parent_group = parent.as_posix() if parent else "" |
| 2817 | group = ( |
| 2818 | parent_group if parent_group not in ("", ".") else "outputs" |
| 2819 | ) |
| 2820 | except Exception: |
| 2821 | group = "outputs" |
| 2822 | entries.append( |
| 2823 | { |
| 2824 | "path": str(resolved), |
| 2825 | "label": label, |
| 2826 | "group": group or "logs", |
| 2827 | "mtime": stat.st_mtime, |
| 2828 | } |
| 2829 | ) |
| 2830 | except Exception: |
| 2831 | continue |
| 2832 | entries.sort(key=lambda e: e.get("label", "").lower()) |
| 2833 | return entries |
| 2834 | |
| 2835 | |
| 2836 | @app.route("/api/logs") |
no test coverage detected