Coverage report: 93%

Files Functions Classes

coverage.py v7.13.5, created at 2026-04-14 23:55 +0000

      Statements   Branches   Total
File function   coverage statements missing excluded   coverage branches partial   coverage
src / local_deep_research / __init__.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / __version__.py (no function)   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / __init__.py (no function)   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / __init__.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer.explore   100% 30 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer.generate_exploration_queries   100% 7 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._choose_strategy   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._get_top_strategies   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._generate_query_with_strategy   100% 15 0 0   100% 10 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._direct_search_query   100% 5 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._synonym_expansion_query   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._category_exploration_query   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._related_terms_query   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._constraint_focused_query   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._update_strategy_stats   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._adapt_strategy   100% 5 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py AdaptiveExplorer._try_next_strategy   100% 6 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / adaptive_explorer.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer.explore   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer.generate_exploration_queries   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer._execute_search   100% 16 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer._extract_candidates_from_results   100% 16 0 0   90% 10 1   96%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer._generate_answer_candidates   100% 15 0 0   83% 6 1   95%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer._extract_entity_names   100% 14 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer._should_continue_exploration   100% 9 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer._deduplicate_candidates   100% 8 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py BaseCandidateExplorer._rank_candidates_by_relevance   100% 15 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / base_explorer.py (no function)   100% 29 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer.explore   97% 39 1 0   93% 14 1   96%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer.generate_exploration_queries   100% 11 0 0   88% 8 1   95%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._prioritize_constraints   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._generate_constraint_queries   100% 13 0 0   90% 10 1   96%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._name_pattern_queries   100% 8 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._property_queries   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._event_queries   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._location_queries   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._cross_constraint_exploration   100% 7 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._combine_constraints_query   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._early_validate_candidates   100% 7 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._quick_name_validation   100% 5 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._rank_by_constraint_alignment   100% 9 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py ConstraintGuidedExplorer._basic_exploration   100% 5 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / constraint_guided_explorer.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer.explore   100% 41 0 0   100% 14 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer.generate_exploration_queries   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._categorize_candidates   100% 7 0 0   75% 4 1   91%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._determine_category   100% 18 0 0   100% 16 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._calculate_diversity_score   86% 14 2 0   75% 8 2   82%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._find_underrepresented_categories   100% 5 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._generate_diversity_queries   69% 26 8 0   59% 22 1   65%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._generate_category_queries   100% 6 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._filter_for_diversity   100% 9 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._is_sufficiently_different   100% 10 0 0   83% 6 1   94%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._final_diversity_selection   100% 12 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py DiversityExplorer._rank_by_diversity   100% 9 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / diversity_explorer.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / parallel_explorer.py ParallelExplorer.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / parallel_explorer.py ParallelExplorer.explore   100% 35 0 0   100% 10 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / parallel_explorer.py ParallelExplorer.generate_exploration_queries   100% 11 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / parallel_explorer.py ParallelExplorer._generate_query_variations   100% 14 0 0   83% 6 1   95%
src / local_deep_research / advanced_search_system / candidate_exploration / parallel_explorer.py ParallelExplorer._generate_candidate_based_queries   100% 6 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / parallel_explorer.py ParallelExplorer._generate_constraint_queries   100% 5 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / parallel_explorer.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py SearchProgress.update_coverage   100% 3 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py SearchProgress.get_uncovered_entities   100% 7 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py ProgressiveExplorer.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py ProgressiveExplorer.explore   100% 14 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py ProgressiveExplorer.generate_verification_searches   100% 10 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py ProgressiveExplorer._extract_candidates_from_results   100% 18 0 0   100% 14 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py ProgressiveExplorer._update_entity_coverage   100% 5 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py ProgressiveExplorer.suggest_next_searches   100% 22 0 0   91% 22 2   95%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py ProgressiveExplorer._parallel_search   100% 8 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py ProgressiveExplorer._parallel_search.search_query   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidate_exploration / progressive_explorer.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidates / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidates / base_candidate.py Candidate.add_evidence   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / candidates / base_candidate.py Candidate.calculate_score   100% 12 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / candidates / base_candidate.py Candidate.get_unverified_constraints   100% 5 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidates / base_candidate.py Candidate.get_weak_evidence   100% 5 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / candidates / base_candidate.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / __init__.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / base_constraint_checker.py BaseConstraintChecker.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / base_constraint_checker.py BaseConstraintChecker.check_candidate   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / constraint_checking / base_constraint_checker.py BaseConstraintChecker.should_reject_candidate   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / constraint_checking / base_constraint_checker.py BaseConstraintChecker._gather_evidence_for_constraint   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / base_constraint_checker.py BaseConstraintChecker._log_constraint_result   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / base_constraint_checker.py BaseConstraintChecker._calculate_weighted_score   100% 3 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / base_constraint_checker.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / constraint_checker.py ConstraintChecker.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / constraint_checker.py ConstraintChecker.check_candidate   100% 31 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / constraint_checker.py ConstraintChecker._gather_evidence_for_constraint   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / constraint_checker.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py DualConfidenceChecker.__init__   100% 8 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py DualConfidenceChecker.check_candidate   84% 32 5 0   80% 10 2   83%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py DualConfidenceChecker._evaluate_constraint_with_reevaluation   74% 19 5 0   62% 8 3   70%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py DualConfidenceChecker._should_early_reject   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py DualConfidenceChecker.should_reject_candidate_from_averages   100% 9 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py DualConfidenceChecker.should_reject_candidate   100% 13 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py DualConfidenceChecker._log_constraint_result_detailed   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py DualConfidenceChecker._llm_prescreen_candidate   100% 16 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / dual_confidence_checker.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / evidence_analyzer.py EvidenceAnalyzer.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / evidence_analyzer.py EvidenceAnalyzer.analyze_evidence_dual_confidence   84% 19 3 0   50% 2 1   81%
src / local_deep_research / advanced_search_system / constraint_checking / evidence_analyzer.py EvidenceAnalyzer._extract_score   75% 8 2 0   100% 2 0   80%
src / local_deep_research / advanced_search_system / constraint_checking / evidence_analyzer.py EvidenceAnalyzer.evaluate_evidence_list   100% 15 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / evidence_analyzer.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer.relax_constraints_progressively   100% 26 0 0   92% 12 1   97%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer._create_constraint_variations   100% 11 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer._relax_statistical_constraint   88% 17 2 0   100% 4 0   90%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer._relax_comparison_constraint   100% 15 0 0   90% 10 1   96%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer._relax_temporal_constraint   100% 18 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer._relax_property_constraint   100% 14 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer._create_relaxed_constraint   82% 11 2 0   62% 8 1   74%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer._get_constraint_type   100% 20 0 0   100% 18 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py IntelligentConstraintRelaxer.analyze_relaxation_impact   100% 19 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / intelligent_constraint_relaxer.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / rejection_engine.py RejectionEngine.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / rejection_engine.py RejectionEngine.should_reject_candidate   100% 9 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / rejection_engine.py RejectionEngine.check_all_constraints   100% 7 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / rejection_engine.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / strict_checker.py StrictChecker.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / strict_checker.py StrictChecker.check_candidate   100% 21 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / strict_checker.py StrictChecker.should_reject_candidate   100% 9 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / strict_checker.py StrictChecker._evaluate_constraint_strictly   75% 16 4 0   83% 6 1   77%
src / local_deep_research / advanced_search_system / constraint_checking / strict_checker.py StrictChecker._check_name_pattern_strictly   95% 20 1 0   88% 8 1   93%
src / local_deep_research / advanced_search_system / constraint_checking / strict_checker.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / threshold_checker.py ThresholdChecker.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / threshold_checker.py ThresholdChecker.check_candidate   100% 28 0 0   100% 10 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / threshold_checker.py ThresholdChecker.should_reject_candidate   100% 6 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / threshold_checker.py ThresholdChecker._check_constraint_satisfaction   100% 12 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / constraint_checking / threshold_checker.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraints / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraints / base_constraint.py Constraint.__post_init__   100% 2 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / constraints / base_constraint.py Constraint.to_search_terms   100% 9 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / constraints / base_constraint.py Constraint.is_critical   100% 3 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / constraints / base_constraint.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraints / constraint_analyzer.py ConstraintAnalyzer.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraints / constraint_analyzer.py ConstraintAnalyzer.extract_constraints   100% 25 0 0   100% 12 0   100%
src / local_deep_research / advanced_search_system / constraints / constraint_analyzer.py ConstraintAnalyzer._parse_constraint_type   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / constraints / constraint_analyzer.py ConstraintAnalyzer._parse_weight   100% 7 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / constraints / constraint_analyzer.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / __init__.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / base_evidence.py EvidenceType.base_confidence   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / base_evidence.py Evidence.__post_init__   100% 2 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / evidence / base_evidence.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / evaluator.py EvidenceEvaluator.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / evaluator.py EvidenceEvaluator.extract_evidence   100% 14 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / evaluator.py EvidenceEvaluator._parse_evidence_response   100% 15 0 0   100% 10 0   100%
src / local_deep_research / advanced_search_system / evidence / evaluator.py EvidenceEvaluator._parse_evidence_type   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / evaluator.py EvidenceEvaluator._assess_match_quality   100% 5 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / evidence / evaluator.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / requirements.py EvidenceRequirements.get_requirements   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / requirements.py EvidenceRequirements.get_minimum_confidence   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / evidence / requirements.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / base_filter.py BaseFilter.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / base_filter.py BaseFilter.filter_results   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / filters / base_filter.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / cross_engine_filter.py CrossEngineFilter.__init__   88% 17 2 0   100% 4 0   90%
src / local_deep_research / advanced_search_system / filters / cross_engine_filter.py CrossEngineFilter._prepare_and_return   100% 4 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / filters / cross_engine_filter.py CrossEngineFilter.filter_results   100% 49 0 0   100% 26 0   100%
src / local_deep_research / advanced_search_system / filters / cross_engine_filter.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / followup_relevance_filter.py FollowUpRelevanceFilter.filter_results   100% 8 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / filters / followup_relevance_filter.py FollowUpRelevanceFilter._select_relevant_sources   100% 32 0 0   100% 12 0   100%
src / local_deep_research / advanced_search_system / filters / followup_relevance_filter.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.__init__   100% 21 0 0   100% 12 0   100%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.close   75% 4 1 0   50% 4 2   62%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.create_default   100% 8 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.__db_session   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.__make_search_system   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.__analyze_journal_reputation   94% 18 1 0   50% 2 1   90%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.__add_journal_to_db   0% 9 9 0   0% 2 0   0%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.__clean_journal_name   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.__check_result   88% 16 2 0   100% 4 0   90%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py JournalReputationFilter.filter_results   100% 5 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / filters / journal_reputation_filter.py (no function)   100% 30 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / base_findings.py BaseFindingsRepository.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / base_findings.py BaseFindingsRepository.add_finding   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / findings / base_findings.py BaseFindingsRepository.get_findings   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / findings / base_findings.py BaseFindingsRepository.clear_findings   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / findings / base_findings.py BaseFindingsRepository.synthesize_findings   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / findings / base_findings.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py format_links   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.add_finding   100% 8 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.get_findings   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.clear_findings   100% 3 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.add_documents   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.set_questions_by_iteration   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.format_findings_to_text   100% 12 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.synthesize_findings   97% 115 4 0   95% 60 3   96%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.synthesize_findings.timeout_handler   0% 4 4 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.synthesize_findings.timeout_handler.handler   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.synthesize_findings.invoke_with_timeout   93% 15 1 0   75% 4 1   89%
src / local_deep_research / advanced_search_system / findings / repository.py FindingsRepository.synthesize_findings.invoke_with_timeout.target   60% 5 2 0   100% 0 0   60%
src / local_deep_research / advanced_search_system / findings / repository.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py Topic.add_supporting_source   100% 2 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py Topic.reject_source   100% 4 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py Topic.update_lead_source   100% 5 0 0   75% 4 1   89%
src / local_deep_research / advanced_search_system / findings / topic.py Topic.get_all_sources   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py Topic.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py TopicGraph.add_topic   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py TopicGraph.get_topic   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py TopicGraph.link_topics   100% 7 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py TopicGraph.set_parent_child   100% 6 0 0   75% 4 1   90%
src / local_deep_research / advanced_search_system / findings / topic.py TopicGraph.get_root_topics   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py TopicGraph.get_related_topics   100% 9 0 0   83% 6 1   93%
src / local_deep_research / advanced_search_system / findings / topic.py TopicGraph.merge_topics   100% 27 0 0   88% 26 3   94%
src / local_deep_research / advanced_search_system / findings / topic.py TopicGraph.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / findings / topic.py (no function)   100% 27 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator.generate   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator.generate_knowledge   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator.generate_sub_knowledge   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator.compress_knowledge   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator.format_citations   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator._validate_knowledge   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator._validate_links   100% 7 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py BaseKnowledgeGenerator._extract_key_points   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / base_knowledge.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler.build_context   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler._extract_findings   100% 9 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler._extract_sources   100% 12 0 0   100% 10 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler._extract_entities   100% 11 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler._create_summary   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler._extract_metadata   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler.summarize_for_followup   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler._generate_summary   91% 22 2 0   86% 14 2   89%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler.identify_gaps   100% 11 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler.format_for_settings_snapshot   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py FollowUpContextHandler.get_relevant_context_for_llm   100% 14 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / knowledge / followup_context_manager.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / standard_knowledge.py StandardKnowledge.generate_knowledge   100% 10 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / knowledge / standard_knowledge.py StandardKnowledge.generate_sub_knowledge   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / standard_knowledge.py StandardKnowledge.generate   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / standard_knowledge.py StandardKnowledge.compress_knowledge   100% 10 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / knowledge / standard_knowledge.py StandardKnowledge.format_citations   100% 6 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / knowledge / standard_knowledge.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator._initialize_default_patterns   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator.generate_query   100% 7 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator._generate_from_patterns   90% 30 3 0   82% 22 4   87%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator._generate_with_expansion   100% 10 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator._get_semantic_expansions   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator._generate_with_llm   100% 10 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator.update_patterns   100% 12 0 0   83% 6 1   94%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator._extract_pattern   100% 8 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator._format_constraints   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator.generate_fallback_queries   100% 20 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator._generate_single_constraint_query   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py AdaptiveQueryGenerator.optimize_constraint_combinations   100% 17 0 0   100% 14 0   100%
src / local_deep_research / advanced_search_system / query_generation / adaptive_query_generator.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / __init__.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / atomic_fact_question.py AtomicFactQuestionGenerator.generate_questions   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / questions / atomic_fact_question.py AtomicFactQuestionGenerator._decompose_to_atomic_facts   100% 16 0 0   100% 10 0   100%
src / local_deep_research / advanced_search_system / questions / atomic_fact_question.py AtomicFactQuestionGenerator._generate_gap_filling_questions   100% 17 0 0   100% 12 0   100%
src / local_deep_research / advanced_search_system / questions / atomic_fact_question.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / base_question.py BaseQuestionGenerator.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / base_question.py BaseQuestionGenerator.generate_questions   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / questions / base_question.py BaseQuestionGenerator._format_previous_questions   100% 6 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / questions / base_question.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py BrowseCompQuestionGenerator.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py BrowseCompQuestionGenerator.generate_questions   100% 5 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py BrowseCompQuestionGenerator._extract_entities   100% 15 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py BrowseCompQuestionGenerator._expand_temporal_ranges   100% 13 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py BrowseCompQuestionGenerator._generate_initial_searches   94% 34 2 0   91% 32 3   92%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py BrowseCompQuestionGenerator._generate_progressive_searches   98% 47 1 0   88% 40 5   93%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py BrowseCompQuestionGenerator._format_previous_searches   100% 12 0 0   90% 10 1   95%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py BrowseCompQuestionGenerator._was_searched   100% 7 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / questions / browsecomp_question.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / decomposition_question.py DecompositionQuestionGenerator.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / decomposition_question.py DecompositionQuestionGenerator.generate_questions   94% 87 5 0   87% 62 8   91%
src / local_deep_research / advanced_search_system / questions / decomposition_question.py DecompositionQuestionGenerator._generate_default_questions   100% 36 0 0   88% 26 3   95%
src / local_deep_research / advanced_search_system / questions / decomposition_question.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / entity_aware_question.py EntityAwareQuestionGenerator.generate_questions   100% 19 0 0   100% 6 0   100%
src / local_deep_research / advanced_search_system / questions / entity_aware_question.py EntityAwareQuestionGenerator.generate_sub_questions   100% 23 0 0   90% 10 1   97%
src / local_deep_research / advanced_search_system / questions / entity_aware_question.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / flexible_browsecomp_question.py FlexibleBrowseCompQuestionGenerator._generate_progressive_searches   100% 22 0 0   93% 14 1   97%
src / local_deep_research / advanced_search_system / questions / flexible_browsecomp_question.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / base_followup_question.py BaseFollowUpQuestionGenerator.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / base_followup_question.py BaseFollowUpQuestionGenerator.set_follow_up_context   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / base_followup_question.py BaseFollowUpQuestionGenerator.generate_contextualized_query   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / questions / followup / base_followup_question.py BaseFollowUpQuestionGenerator.generate_questions   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / base_followup_question.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / llm_followup_question.py LLMFollowUpQuestionGenerator.generate_contextualized_query   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / llm_followup_question.py LLMFollowUpQuestionGenerator.generate_questions   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / llm_followup_question.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / simple_followup_question.py SimpleFollowUpQuestionGenerator.generate_contextualized_query   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / followup / simple_followup_question.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / news_question.py NewsQuestionGenerator.generate_questions   100% 7 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / questions / news_question.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / questions / standard_question.py StandardQuestionGenerator.generate_questions   100% 15 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / questions / standard_question.py StandardQuestionGenerator.generate_sub_questions   100% 19 0 0   88% 8 1   96%
src / local_deep_research / advanced_search_system / questions / standard_question.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / repositories / __init__.py (no function)   0% 2 2 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager.analyze_constraint_relationships   100% 10 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._analyze_pair   100% 17 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager.create_constraint_clusters   100% 18 0 0   88% 8 1   96%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._create_relationship_clusters   100% 26 0 0   100% 16 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._create_semantic_clusters   100% 34 0 0   94% 18 1   98%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager.generate_cross_constraint_queries   100% 12 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._generate_combined_query   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._generate_progressive_queries   100% 7 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._generate_intersection_query   100% 8 0 0   100% 4 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._generate_validation_queries   100% 7 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager.validate_candidate_across_constraints   100% 15 0 0   92% 12 1   96%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._validate_with_cluster   100% 15 0 0   67% 6 2   90%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._validate_pair   0% 12 12 0   0% 4 0   0%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._calculate_cluster_coherence   100% 14 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._deduplicate_clusters   100% 13 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._format_constraints_for_clustering   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager._format_constraints_for_query   100% 4 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py CrossConstraintManager.optimize_search_order   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / search_optimization / cross_constraint_manager.py (no function)   100% 34 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager.analyze_source   100% 15 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._extract_domain   100% 6 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._determine_source_type   100% 21 0 0   100% 18 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._analyze_content_type   100% 6 0 0   100% 2 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._calculate_credibility   100% 11 0 0   100% 10 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._extract_specialties   56% 9 4 0   50% 2 1   55%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._extract_temporal_coverage   83% 12 2 0   100% 4 0   88%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._extract_geographic_focus   100% 11 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager.calculate_diversity_metrics   100% 21 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._calculate_temporal_diversity   100% 10 0 0   100% 8 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager.recommend_additional_sources   100% 19 0 0   93% 14 1   97%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._identify_diversity_gaps   100% 24 0 0   81% 16 3   92%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._get_source_type_modifier   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager._get_region_domain   100% 2 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager.select_diverse_sources   100% 21 0 0   92% 12 1   97%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py SourceDiversityManager.track_source_effectiveness   100% 8 0 0   83% 6 1   93%
src / local_deep_research / advanced_search_system / source_management / diversity_manager.py (no function)   100% 34 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / tools / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / tools / base_tool.py BaseTool.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / tools / base_tool.py BaseTool.execute   0% 1 1 0   100% 0 0   0%
src / local_deep_research / advanced_search_system / tools / base_tool.py BaseTool.get_schema   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / tools / base_tool.py BaseTool.validate_parameters   100% 17 0 0   92% 12 1   97%
src / local_deep_research / advanced_search_system / tools / base_tool.py BaseTool._log_execution   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / tools / base_tool.py BaseTool._log_result   100% 1 0 0   100% 0 0   100%
src / local_deep_research / advanced_search_system / tools / base_tool.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / api / __init__.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / api / benchmark_functions.py evaluate_simpleqa   100% 10 0 0   100% 6 0   100%
src / local_deep_research / api / benchmark_functions.py evaluate_browsecomp   100% 10 0 0   100% 6 0   100%
src / local_deep_research / api / benchmark_functions.py evaluate_xbench_deepsearch   100% 10 0 0   100% 6 0   100%
src / local_deep_research / api / benchmark_functions.py get_available_benchmarks   100% 1 0 0   100% 0 0   100%
src / local_deep_research / api / benchmark_functions.py compare_configurations   100% 38 0 0   100% 10 0   100%
src / local_deep_research / api / benchmark_functions.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / api / client.py LDRClient.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / api / client.py LDRClient.login   100% 26 0 0   100% 6 0   100%
src / local_deep_research / api / client.py LDRClient._api_headers   100% 3 0 0   100% 2 0   100%
src / local_deep_research / api / client.py LDRClient.quick_research   86% 21 3 0   83% 12 2   85%
src / local_deep_research / api / client.py LDRClient.wait_for_research   100% 15 0 0   90% 10 1   96%
src / local_deep_research / api / client.py LDRClient.get_settings   100% 6 0 0   100% 4 0   100%
src / local_deep_research / api / client.py LDRClient.update_setting   100% 4 0 0   100% 2 0   100%
src / local_deep_research / api / client.py LDRClient.get_history   91% 11 1 0   88% 8 1   89%
src / local_deep_research / api / client.py LDRClient.logout   100% 6 0 0   100% 2 0   100%
src / local_deep_research / api / client.py LDRClient.submit_benchmark   100% 2 0 0   100% 0 0   100%
src / local_deep_research / api / client.py LDRClient.get_benchmarks   100% 4 0 0   100% 2 0   100%
src / local_deep_research / api / client.py LDRClient.__enter__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / api / client.py LDRClient.__exit__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / api / client.py quick_query   100% 5 0 0   100% 2 0   100%
src / local_deep_research / api / client.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / api / research_functions.py _close_system   100% 6 0 0   50% 4 2   80%
src / local_deep_research / api / research_functions.py _init_search_system   87% 31 4 0   100% 16 0   91%
src / local_deep_research / api / research_functions.py quick_summary   96% 49 2 0   92% 26 2   95%
src / local_deep_research / api / research_functions.py generate_report   91% 45 4 0   79% 24 5   87%
src / local_deep_research / api / research_functions.py detailed_research   97% 29 1 0   79% 14 3   91%
src / local_deep_research / api / research_functions.py analyze_documents   98% 44 1 0   90% 10 1   96%
src / local_deep_research / api / research_functions.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager._get_typed_value   100% 12 0 0   100% 4 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager._load_defaults   76% 21 5 0   83% 12 2   79%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.get_setting   100% 5 0 0   100% 2 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.set_setting   100% 5 0 0   100% 2 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.get_all_settings   100% 1 0 0   100% 0 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.load_from_defaults_file   100% 1 0 0   100% 0 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.create_or_update_setting   100% 9 0 0   100% 4 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.delete_setting   100% 4 0 0   100% 2 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.get_bool_setting   100% 2 0 0   100% 0 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.get_settings_snapshot   100% 7 0 0   100% 4 0   100%
src / local_deep_research / api / settings_utils.py InMemorySettingsManager.import_settings   100% 9 0 0   100% 8 0   100%
src / local_deep_research / api / settings_utils.py get_default_settings_snapshot   100% 2 0 0   100% 0 0   100%
src / local_deep_research / api / settings_utils.py create_settings_snapshot   89% 37 4 0   88% 32 4   88%
src / local_deep_research / api / settings_utils.py extract_setting_value   100% 8 0 0   100% 6 0   100%
src / local_deep_research / api / settings_utils.py extract_bool_setting   100% 2 0 0   100% 0 0   100%
src / local_deep_research / api / settings_utils.py (no function)   100% 24 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / __init__.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / benchmark_functions.py evaluate_simpleqa   100% 27 0 0   95% 22 1   98%
src / local_deep_research / benchmarks / benchmark_functions.py evaluate_browsecomp   93% 27 2 0   86% 22 3   90%
src / local_deep_research / benchmarks / benchmark_functions.py evaluate_xbench_deepsearch   96% 27 1 0   86% 22 3   92%
src / local_deep_research / benchmarks / benchmark_functions.py get_available_benchmarks   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / benchmark_functions.py compare_configurations   100% 37 0 0   100% 10 0   100%
src / local_deep_research / benchmarks / benchmark_functions.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / evaluator.py compare_configurations   100% 42 0 0   92% 12 1   98%
src / local_deep_research / benchmarks / comparison / evaluator.py _evaluate_single_configuration   97% 39 1 0   50% 2 1   95%
src / local_deep_research / benchmarks / comparison / evaluator.py _calculate_average_metrics   100% 31 0 0   85% 20 3   94%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_comparison_visualizations   100% 23 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_metric_comparison_chart   100% 30 0 0   100% 14 0   100%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart   100% 37 0 0   100% 8 0   100%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart.radar_factory   100% 12 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart.radar_factory.RadarAxes.__init__   0% 2 2 0   100% 0 0   0%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart.radar_factory.RadarAxes.fill   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart.radar_factory.RadarAxes.plot   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart.radar_factory.RadarAxes.set_varlabels   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart.radar_factory.RadarAxes._gen_axes_patch   0% 5 5 0   0% 4 0   0%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart.radar_factory.RadarAxes._gen_axes_spines   0% 12 12 0   0% 4 0   0%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_spider_chart.radar_factory.unit_poly_verts   0% 5 5 0   0% 2 0   0%
src / local_deep_research / benchmarks / comparison / evaluator.py _create_pareto_chart   100% 42 0 0   100% 14 0   100%
src / local_deep_research / benchmarks / comparison / evaluator.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / results.py Benchmark_results.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / results.py Benchmark_results.add_result   100% 4 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / results.py Benchmark_results.get_all   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / results.py Benchmark_results.get_best   100% 6 0 0   100% 6 0   100%
src / local_deep_research / benchmarks / comparison / results.py Benchmark_results._load_results   100% 5 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / results.py Benchmark_results._save_results   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / comparison / results.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets.py (no function)   0% 2 2 0   100% 0 0   0%
src / local_deep_research / benchmarks / datasets / __init__.py get_available_datasets   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / datasets / __init__.py load_dataset   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / datasets / __init__.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.get_dataset_info   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.get_default_dataset_path   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.process_example   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.load   92% 37 3 0   100% 14 0   94%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.get_examples   67% 3 1 0   50% 2 1   60%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.get_example   100% 4 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.get_question   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / base.py BenchmarkDataset.get_answer   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / base.py DatasetRegistry.register   100% 7 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / datasets / base.py DatasetRegistry.get_dataset_class   100% 3 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / datasets / base.py DatasetRegistry.create_dataset   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / base.py DatasetRegistry.get_available_datasets   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / base.py DatasetRegistry.load_dataset   0% 2 2 0   100% 0 0   0%
src / local_deep_research / benchmarks / datasets / base.py (no function)   100% 32 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / browsecomp.py BrowseCompDataset.get_dataset_info   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / browsecomp.py BrowseCompDataset.get_default_dataset_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / browsecomp.py BrowseCompDataset.process_example   94% 35 2 0   86% 14 2   92%
src / local_deep_research / benchmarks / datasets / browsecomp.py BrowseCompDataset.get_question   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / browsecomp.py BrowseCompDataset.get_answer   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / browsecomp.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / custom_dataset_template.py CustomDataset.get_dataset_info   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / custom_dataset_template.py CustomDataset.get_default_dataset_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / custom_dataset_template.py CustomDataset.process_example   100% 10 0 0   100% 6 0   100%
src / local_deep_research / benchmarks / datasets / custom_dataset_template.py CustomDataset.get_question   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / custom_dataset_template.py CustomDataset.get_answer   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / custom_dataset_template.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / simpleqa.py SimpleQADataset.get_dataset_info   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / simpleqa.py SimpleQADataset.get_default_dataset_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / simpleqa.py SimpleQADataset.process_example   100% 10 0 0   100% 6 0   100%
src / local_deep_research / benchmarks / datasets / simpleqa.py SimpleQADataset.get_question   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / simpleqa.py SimpleQADataset.get_answer   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / simpleqa.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / utils.py derive_key   100% 4 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / utils.py decrypt   84% 51 8 0   88% 16 2   85%
src / local_deep_research / benchmarks / datasets / utils.py get_known_answer_map   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / utils.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / xbench_deepsearch.py XBenchDeepSearchDataset.xor_decrypt   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / xbench_deepsearch.py XBenchDeepSearchDataset.get_dataset_info   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / xbench_deepsearch.py XBenchDeepSearchDataset.get_default_dataset_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / xbench_deepsearch.py XBenchDeepSearchDataset.load   100% 6 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / datasets / xbench_deepsearch.py XBenchDeepSearchDataset.load_data   95% 37 2 0   80% 10 2   91%
src / local_deep_research / benchmarks / datasets / xbench_deepsearch.py XBenchDeepSearchDataset._load_from_url   94% 31 2 0   80% 10 2   90%
src / local_deep_research / benchmarks / datasets / xbench_deepsearch.py XBenchDeepSearchDataset.process_example   100% 5 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / datasets / xbench_deepsearch.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.__init__   100% 12 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.start   100% 13 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.stop   100% 8 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor._monitor_resources   100% 18 0 0   100% 8 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.monitor   100% 4 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.get_process_stats   100% 5 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.get_system_stats   100% 6 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.get_combined_stats   100% 13 0 0   100% 10 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.print_summary   100% 14 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py ResourceMonitor.export_data   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py check_system_resources   100% 12 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / efficiency / resource_monitor.py (no function)   88% 24 3 0   100% 0 0   88%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.start   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.stop   100% 3 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.start_timer   100% 3 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.stop_timer   100% 13 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.timer   100% 4 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.get_timings   100% 7 0 0   83% 6 1   92%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.get_summary   93% 15 1 0   83% 12 2   89%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py SpeedProfiler.print_summary   70% 10 3 0   25% 4 1   57%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py time_function   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py time_function.wrapper   100% 5 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / efficiency / speed_profiler.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / __init__.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / base.py BaseBenchmarkEvaluator.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / base.py BaseBenchmarkEvaluator.get_name   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / base.py BaseBenchmarkEvaluator.evaluate   0% 1 1 0   100% 0 0   0%
src / local_deep_research / benchmarks / evaluators / base.py BaseBenchmarkEvaluator._create_subdirectory   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / base.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / browsecomp.py BrowseCompEvaluator.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / browsecomp.py BrowseCompEvaluator.evaluate   100% 10 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / browsecomp.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / composite.py CompositeBenchmarkEvaluator.__init__   100% 8 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / evaluators / composite.py CompositeBenchmarkEvaluator.evaluate   100% 16 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / evaluators / composite.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / simpleqa.py SimpleQAEvaluator.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / evaluators / simpleqa.py SimpleQAEvaluator.evaluate   100% 12 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / evaluators / simpleqa.py SimpleQAEvaluator._run_with_dataset_class   100% 43 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / evaluators / simpleqa.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / graders.py get_evaluation_llm   100% 16 0 0   100% 10 0   100%
src / local_deep_research / benchmarks / graders.py extract_answer_from_response   100% 8 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / graders.py grade_single_result   100% 42 0 0   100% 8 0   100%
src / local_deep_research / benchmarks / graders.py grade_results   100% 5 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / graders.py _grade_results_inner   100% 65 0 0   96% 24 1   99%
src / local_deep_research / benchmarks / graders.py human_evaluation   58% 48 20 0   56% 18 6   58%
src / local_deep_research / benchmarks / graders.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / metrics.py (no function)   0% 3 3 0   100% 0 0   0%
src / local_deep_research / benchmarks / metrics / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / metrics / calculation.py calculate_metrics   100% 43 0 0   100% 22 0   100%
src / local_deep_research / benchmarks / metrics / calculation.py evaluate_benchmark_quality   90% 21 2 0   100% 2 0   91%
src / local_deep_research / benchmarks / metrics / calculation.py measure_execution_time   100% 32 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / metrics / calculation.py calculate_quality_metrics   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / metrics / calculation.py calculate_speed_metrics   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / metrics / calculation.py calculate_resource_metrics   100% 6 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / metrics / calculation.py calculate_combined_score   100% 17 0 0   100% 10 0   100%
src / local_deep_research / benchmarks / metrics / calculation.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / metrics / reporting.py generate_report   100% 49 0 0   96% 26 1   99%
src / local_deep_research / benchmarks / metrics / reporting.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / models / __init__.py (no function)   0% 2 2 0   100% 0 0   0%
src / local_deep_research / benchmarks / optimization / __init__.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / api.py optimize_parameters   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / api.py optimize_for_speed   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / api.py optimize_for_quality   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / api.py optimize_for_efficiency   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / api.py get_default_param_space   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / api.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / metrics.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer.__init__   100% 23 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer.optimize   91% 35 3 0   75% 12 3   87%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._get_default_param_space   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._objective   100% 27 0 0   100% 14 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._run_experiment   100% 22 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._optimization_callback   100% 3 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._save_results   100% 24 0 0   100% 12 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._create_visualizations   100% 12 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._create_quick_visualizations   100% 10 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._create_optuna_visualizations   68% 31 10 0   75% 8 2   69%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._create_custom_visualizations   100% 6 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._create_quality_vs_speed_plot   47% 49 26 0   40% 10 2   46%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._create_parameter_evolution_plots   12% 33 29 0   10% 10 1   12%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py OptunaOptimizer._create_duration_vs_score_plot   91% 32 3 0   75% 8 2   88%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py optimize_parameters   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py optimize_for_speed   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py optimize_for_quality   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py optimize_for_efficiency   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / optimization / optuna_optimizer.py (no function)   92% 40 3 0   100% 0 0   92%
src / local_deep_research / benchmarks / runners.py format_query   100% 3 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / runners.py run_benchmark   100% 99 0 0   100% 40 0   100%
src / local_deep_research / benchmarks / runners.py run_simpleqa_benchmark   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / runners.py run_browsecomp_benchmark   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / runners.py run_xbench_deepsearch_benchmark   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / runners.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / templates.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py index   100% 6 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py results   100% 1 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py start_benchmark   100% 49 0 0   90% 20 2   97%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py get_running_benchmark   100% 13 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py get_benchmark_status   100% 11 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py cancel_benchmark   100% 10 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py get_benchmark_history   100% 47 0 0   79% 14 3   95%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py get_benchmark_results   95% 41 2 0   83% 12 2   92%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py export_benchmark_results   100% 17 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py get_saved_configs   50% 6 3 0   100% 0 0   50%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py start_benchmark_simple   100% 42 0 0   89% 18 2   97%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py validate_config   86% 22 3 0   100% 12 0   91%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py get_search_quality   100% 8 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py delete_benchmark_run   100% 20 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_routes.py (no function)   100% 59 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkQueueTracker.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkQueueTracker.add_task   100% 3 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkQueueTracker.update_task_status   100% 5 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkQueueTracker.get_task_status   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkQueueTracker.remove_task   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkQueueTracker.cleanup_completed_tasks   100% 15 0 0   92% 12 1   96%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService._get_socket_service   100% 7 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.generate_config_hash   100% 4 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.generate_query_hash   100% 2 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.create_benchmark_run   100% 14 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.get_existing_results   100% 14 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.start_benchmark   89% 36 4 0   62% 8 3   84%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService._run_benchmark_thread   97% 71 2 0   68% 22 7   90%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService._create_task_queue   100% 15 0 0   100% 10 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService._process_benchmark_task   100% 45 0 0   100% 4 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService._process_benchmark_task.benchmark_progress_callback   100% 13 0 0   100% 6 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.sync_pending_results   94% 34 2 0   100% 12 0   96%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService._sync_results_to_database   100% 37 0 0   81% 16 3   94%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService._send_progress_update   100% 7 0 0   100% 0 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService._calculate_final_accuracy   100% 16 0 0   75% 4 1   95%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.update_benchmark_status   100% 17 0 0   88% 8 1   96%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.get_benchmark_status   81% 54 10 0   67% 18 6   78%
src / local_deep_research / benchmarks / web_api / benchmark_service.py BenchmarkService.cancel_benchmark   100% 9 0 0   100% 2 0   100%
src / local_deep_research / benchmarks / web_api / benchmark_service.py (no function)   100% 50 0 0   100% 0 0   100%
src / local_deep_research / citation_handler.py CitationHandler.__init__   100% 10 0 0   100% 4 0   100%
src / local_deep_research / citation_handler.py CitationHandler._create_handler   100% 16 0 0   100% 6 0   100%
src / local_deep_research / citation_handler.py CitationHandler.analyze_initial   100% 1 0 0   100% 0 0   100%
src / local_deep_research / citation_handler.py CitationHandler.analyze_followup   100% 1 0 0   100% 0 0   100%
src / local_deep_research / citation_handler.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / __init__.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / base_citation_handler.py BaseCitationHandler.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / base_citation_handler.py BaseCitationHandler.get_setting   100% 6 0 0   100% 4 0   100%
src / local_deep_research / citation_handlers / base_citation_handler.py BaseCitationHandler.is_fact_checking_enabled   100% 8 0 0   100% 4 0   100%
src / local_deep_research / citation_handlers / base_citation_handler.py BaseCitationHandler._get_output_instruction_prefix   100% 4 0 0   100% 2 0   100%
src / local_deep_research / citation_handlers / base_citation_handler.py BaseCitationHandler._create_documents   100% 11 0 0   88% 8 1   95%
src / local_deep_research / citation_handlers / base_citation_handler.py BaseCitationHandler._format_sources   100% 5 0 0   100% 2 0   100%
src / local_deep_research / citation_handlers / base_citation_handler.py BaseCitationHandler.analyze_initial   0% 1 1 0   100% 0 0   0%
src / local_deep_research / citation_handlers / base_citation_handler.py BaseCitationHandler.analyze_followup   0% 1 1 0   100% 0 0   0%
src / local_deep_research / citation_handlers / base_citation_handler.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / forced_answer_citation_handler.py ForcedAnswerCitationHandler.analyze_initial   100% 11 0 0   100% 4 0   100%
src / local_deep_research / citation_handlers / forced_answer_citation_handler.py ForcedAnswerCitationHandler.analyze_followup   100% 15 0 0   100% 4 0   100%
src / local_deep_research / citation_handlers / forced_answer_citation_handler.py ForcedAnswerCitationHandler._needs_answer_extraction   100% 10 0 0   100% 8 0   100%
src / local_deep_research / citation_handlers / forced_answer_citation_handler.py ForcedAnswerCitationHandler._extract_direct_answer   100% 7 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / forced_answer_citation_handler.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler.analyze_initial   100% 11 0 0   100% 2 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler.analyze_followup   100% 11 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._identify_question_type   100% 18 0 0   100% 16 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._apply_precision_extraction   100% 15 0 0   100% 14 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._extract_full_name   100% 29 0 0   75% 20 5   90%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._extract_single_answer   100% 10 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._extract_dimension   98% 45 1 0   90% 20 2   95%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._extract_score   100% 9 0 0   100% 2 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._extract_temporal   100% 12 0 0   100% 4 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._extract_number   100% 9 0 0   100% 2 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._extract_best_name   100% 8 0 0   100% 4 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py PrecisionExtractionHandler._extract_key_facts   100% 6 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / precision_extraction_handler.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / citation_handlers / standard_citation_handler.py StandardCitationHandler.analyze_initial   100% 9 0 0   100% 2 0   100%
src / local_deep_research / citation_handlers / standard_citation_handler.py StandardCitationHandler.analyze_followup   100% 11 0 0   100% 2 0   100%
src / local_deep_research / citation_handlers / standard_citation_handler.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / config / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / config / constants.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py is_openai_available   100% 8 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py is_anthropic_available   100% 8 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py is_openai_endpoint_available   100% 8 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py is_ollama_available   100% 8 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py is_lmstudio_available   100% 8 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py is_llamacpp_available   100% 11 0 0   100% 2 0   100%
src / local_deep_research / config / llm_config.py is_google_available   100% 8 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py is_openrouter_available   100% 8 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py get_available_providers   100% 20 0 0   100% 18 0   100%
src / local_deep_research / config / llm_config.py get_selected_llm_provider   100% 1 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py _get_context_window_for_provider   100% 8 0 0   100% 4 0   100%
src / local_deep_research / config / llm_config.py get_llm   95% 173 9 0   82% 82 15   91%
src / local_deep_research / config / llm_config.py wrap_llm_without_think_tags   100% 31 0 0   100% 20 0   100%
src / local_deep_research / config / llm_config.py wrap_llm_without_think_tags.ProcessingLLMWrapper.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py wrap_llm_without_think_tags.ProcessingLLMWrapper.invoke   92% 13 1 0   83% 6 1   89%
src / local_deep_research / config / llm_config.py wrap_llm_without_think_tags.ProcessingLLMWrapper.__getattr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py wrap_llm_without_think_tags.ProcessingLLMWrapper.close   100% 5 0 0   100% 0 0   100%
src / local_deep_research / config / llm_config.py (no function)   94% 31 2 0   100% 0 0   94%
src / local_deep_research / config / paths.py get_data_directory   100% 8 0 0   100% 2 0   100%
src / local_deep_research / config / paths.py get_research_outputs_directory   100% 5 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_cache_directory   100% 5 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_logs_directory   100% 5 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_encrypted_database_path   100% 4 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_user_database_filename   100% 2 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_library_directory   100% 5 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_config_directory   100% 5 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_models_directory   100% 5 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_backup_directory   100% 4 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_user_backup_directory   100% 5 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py get_data_dir   100% 1 0 0   100% 0 0   100%
src / local_deep_research / config / paths.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / config / search_config.py get_search_snippets_only_setting   100% 1 0 0   100% 0 0   100%
src / local_deep_research / config / search_config.py get_search   100% 19 0 0   90% 10 1   97%
src / local_deep_research / config / search_config.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / config / thread_settings.py set_settings_context   100% 1 0 0   100% 0 0   100%
src / local_deep_research / config / thread_settings.py clear_settings_context   100% 2 0 0   100% 2 0   100%
src / local_deep_research / config / thread_settings.py get_settings_context   100% 3 0 0   100% 2 0   100%
src / local_deep_research / config / thread_settings.py settings_context   100% 4 0 0   100% 0 0   100%
src / local_deep_research / config / thread_settings.py get_setting_from_snapshot   100% 26 0 0   100% 22 0   100%
src / local_deep_research / config / thread_settings.py get_bool_setting_from_snapshot   100% 2 0 0   100% 0 0   100%
src / local_deep_research / config / thread_settings.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / constants.py get_available_strategies   100% 3 0 0   100% 2 0   100%
src / local_deep_research / constants.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / content_fetcher / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher._get_downloader   90% 48 5 0   100% 18 0   92%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher.fetch   100% 47 0 0   96% 24 1   99%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher.fetch_text   100% 4 0 0   100% 2 0   100%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher.fetch_batch   100% 1 0 0   100% 0 0   100%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher.get_url_info   100% 2 0 0   100% 0 0   100%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher.close   0% 3 3 0   0% 2 0   0%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher.__enter__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / content_fetcher / fetcher.py ContentFetcher.__exit__   0% 2 2 0   100% 0 0   0%
src / local_deep_research / content_fetcher / fetcher.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / content_fetcher / url_classifier.py URLClassifier.classify   94% 33 2 0   100% 34 0   97%
src / local_deep_research / content_fetcher / url_classifier.py URLClassifier._is_pdf_url   100% 11 0 0   100% 6 0   100%
src / local_deep_research / content_fetcher / url_classifier.py URLClassifier.extract_id   100% 26 0 0   88% 24 3   94%
src / local_deep_research / content_fetcher / url_classifier.py URLClassifier.get_source_name   100% 2 0 0   100% 0 0   100%
src / local_deep_research / content_fetcher / url_classifier.py (no function)   100% 32 0 0   100% 0 0   100%
src / local_deep_research / database / alembic_runner.py get_migrations_dir   83% 6 1 0   50% 2 1   75%
src / local_deep_research / database / alembic_runner.py _validate_migrations_permissions   83% 12 2 0   80% 10 2   82%
src / local_deep_research / database / alembic_runner.py get_alembic_config   100% 5 0 0   100% 0 0   100%
src / local_deep_research / database / alembic_runner.py get_current_revision   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / alembic_runner.py get_head_revision   100% 5 0 0   100% 0 0   100%
src / local_deep_research / database / alembic_runner.py needs_migration   92% 12 1 0   75% 8 2   85%
src / local_deep_research / database / alembic_runner.py stamp_database   100% 5 0 0   100% 0 0   100%
src / local_deep_research / database / alembic_runner.py run_migrations   100% 23 0 0   100% 8 0   100%
src / local_deep_research / database / alembic_runner.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / database / auth_db.py get_auth_db_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / auth_db.py _get_auth_engine   91% 22 2 0   100% 8 0   93%
src / local_deep_research / database / auth_db.py _get_auth_engine._apply_auth_pragmas   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / auth_db.py init_auth_database   100% 10 0 0   100% 2 0   100%
src / local_deep_research / database / auth_db.py get_auth_db_session   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / auth_db.py auth_db_session   100% 5 0 0   100% 0 0   100%
src / local_deep_research / database / auth_db.py dispose_auth_engine   100% 6 0 0   100% 2 0   100%
src / local_deep_research / database / auth_db.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / database / backup / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / backup / backup_scheduler.py BackupScheduler.__new__   100% 5 0 0   75% 4 1   89%
src / local_deep_research / database / backup / backup_scheduler.py BackupScheduler.__init__   100% 8 0 0   100% 2 0   100%
src / local_deep_research / database / backup / backup_scheduler.py BackupScheduler.schedule_backup   100% 9 0 0   100% 2 0   100%
src / local_deep_research / database / backup / backup_scheduler.py BackupScheduler._run_backup   100% 10 0 0   100% 2 0   100%
src / local_deep_research / database / backup / backup_scheduler.py BackupScheduler._backup_completed   100% 6 0 0   100% 0 0   100%
src / local_deep_research / database / backup / backup_scheduler.py BackupScheduler.shutdown   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / backup / backup_scheduler.py BackupScheduler.get_pending_count   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / backup / backup_scheduler.py get_backup_scheduler   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / backup / backup_scheduler.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / database / backup / backup_service.py _get_user_lock   100% 4 0 0   100% 2 0   100%
src / local_deep_research / database / backup / backup_service.py BackupService.__init__   100% 7 0 0   100% 0 0   100%
src / local_deep_research / database / backup / backup_service.py BackupService.create_backup   100% 9 0 0   100% 4 0   100%
src / local_deep_research / database / backup / backup_service.py BackupService._create_backup_impl   89% 64 7 0   88% 16 2   89%
src / local_deep_research / database / backup / backup_service.py BackupService._verify_backup   100% 25 0 0   88% 8 1   97%
src / local_deep_research / database / backup / backup_service.py BackupService._cleanup_old_backups   84% 38 6 0   100% 14 0   88%
src / local_deep_research / database / backup / backup_service.py BackupService._cleanup_old_backups._safe_mtime   50% 4 2 0   100% 0 0   50%
src / local_deep_research / database / backup / backup_service.py BackupService.list_backups   67% 12 4 0   100% 2 0   71%
src / local_deep_research / database / backup / backup_service.py BackupService.list_backups._safe_mtime_list   50% 4 2 0   100% 0 0   50%
src / local_deep_research / database / backup / backup_service.py BackupService.purge_and_refresh   69% 13 4 0   100% 4 0   76%
src / local_deep_research / database / backup / backup_service.py BackupService.get_latest_backup   100% 7 0 0   100% 0 0   100%
src / local_deep_research / database / backup / backup_service.py BackupService.get_latest_backup._safe_mtime_latest   75% 4 1 0   100% 0 0   75%
src / local_deep_research / database / backup / backup_service.py (no function)   100% 28 0 0   100% 0 0   100%
src / local_deep_research / database / credential_store_base.py CredentialStoreBase.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / credential_store_base.py CredentialStoreBase._store_credentials   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / credential_store_base.py CredentialStoreBase._retrieve_credentials   100% 12 0 0   100% 6 0   100%
src / local_deep_research / database / credential_store_base.py CredentialStoreBase._cleanup_expired   100% 4 0 0   100% 2 0   100%
src / local_deep_research / database / credential_store_base.py CredentialStoreBase.clear_entry   100% 3 0 0   100% 2 0   100%
src / local_deep_research / database / credential_store_base.py CredentialStoreBase.store   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / credential_store_base.py CredentialStoreBase.retrieve   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / credential_store_base.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.__init__   100% 7 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager._get_pool_kwargs   100% 3 0 0   100% 2 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager._is_valid_encryption_key   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.is_user_connected   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager._check_encryption_available   91% 44 4 0   62% 8 3   87%
src / local_deep_research / database / encrypted_db.py DatabaseManager._get_user_db_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager._apply_pragmas   33% 15 10 0   25% 4 1   32%
src / local_deep_research / database / encrypted_db.py DatabaseManager._make_sqlcipher_connection   100% 19 0 0   100% 2 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.create_user_database   90% 50 5 0   83% 12 0   89%
src / local_deep_research / database / encrypted_db.py DatabaseManager.create_user_database.create_engine_connection   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.open_user_database   87% 46 6 0   86% 14 2   87%
src / local_deep_research / database / encrypted_db.py DatabaseManager.open_user_database.create_open_connection   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.get_session   100% 7 0 0   100% 2 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.get_connected_usernames   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.close_user_database   100% 8 0 0   100% 2 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.close_all_databases   100% 7 0 0   100% 2 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.check_database_integrity   100% 18 0 0   100% 6 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.change_password   84% 19 3 0   100% 6 0   88%
src / local_deep_research / database / encrypted_db.py DatabaseManager.user_exists   100% 5 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.get_memory_usage   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / encrypted_db.py DatabaseManager.create_thread_safe_session_for_metrics   91% 11 1 0   83% 6 1   88%
src / local_deep_research / database / encrypted_db.py (no function)   100% 36 0 0   100% 0 0   100%
src / local_deep_research / database / initialize.py initialize_database   86% 14 2 0   100% 2 0   88%
src / local_deep_research / database / initialize.py _initialize_default_settings   100% 12 0 0   100% 2 0   100%
src / local_deep_research / database / initialize.py check_database_schema   88% 16 2 0   90% 10 1   88%
src / local_deep_research / database / initialize.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / database / library_init.py seed_source_types   100% 16 0 0   100% 4 0   100%
src / local_deep_research / database / library_init.py ensure_default_library_collection   100% 15 0 0   100% 2 0   100%
src / local_deep_research / database / library_init.py ensure_research_history_collection   100% 15 0 0   100% 2 0   100%
src / local_deep_research / database / library_init.py initialize_library_for_user   100% 14 0 0   100% 0 0   100%
src / local_deep_research / database / library_init.py get_default_library_id   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / library_init.py get_source_type_id   100% 9 0 0   100% 2 0   100%
src / local_deep_research / database / library_init.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / database / models / __init__.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / database / models / active_research.py UserActiveResearch.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / active_research.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / database / models / auth.py User.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / auth.py User.database_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / auth.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / database / models / base.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / models / benchmark.py (no function)   100% 101 0 0   100% 0 0   100%
src / local_deep_research / database / models / cache.py Cache.is_expired   86% 7 1 0   75% 4 1   82%
src / local_deep_research / database / models / cache.py Cache.set_ttl   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / models / cache.py Cache.record_hit   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / models / cache.py Cache.__repr__   0% 2 2 0   100% 0 0   0%
src / local_deep_research / database / models / cache.py SearchCache.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / cache.py (no function)   100% 35 0 0   100% 0 0   100%
src / local_deep_research / database / models / download_tracker.py DownloadTracker.__repr__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / models / download_tracker.py DownloadDuplicates.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / download_tracker.py DownloadAttempt.__repr__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / models / download_tracker.py (no function)   100% 42 0 0   100% 0 0   100%
src / local_deep_research / database / models / file_integrity.py FileIntegrityRecord.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / file_integrity.py FileVerificationFailure.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / file_integrity.py (no function)   100% 37 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py SourceType.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py UploadBatch.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py Document.__repr__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py DocumentBlob.__repr__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py Collection.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py DocumentCollection.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / library.py DocumentChunk.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py DownloadQueue.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / library.py LibraryStatistics.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py RAGIndex.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py RagDocumentStatus.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / library.py CollectionFolder.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py CollectionFolderFile.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / library.py (no function)   100% 291 0 0   100% 0 0   100%
src / local_deep_research / database / models / logs.py ResearchLog.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / logs.py Journal.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / logs.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / database / models / metrics.py TokenUsage.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / metrics.py ModelUsage.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / metrics.py ResearchRating.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / metrics.py SearchCall.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / metrics.py (no function)   100% 92 0 0   100% 0 0   100%
src / local_deep_research / database / models / news.py SubscriptionFolder.to_dict   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / news.py (no function)   100% 110 0 0   100% 0 0   100%
src / local_deep_research / database / models / providers.py ProviderModel.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / providers.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / database / models / queue.py (no function)   100% 27 0 0   100% 0 0   100%
src / local_deep_research / database / models / queued_research.py QueuedResearch.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / queued_research.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / database / models / rate_limiting.py RateLimitAttempt.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / rate_limiting.py RateLimitEstimate.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / rate_limiting.py (no function)   100% 28 0 0   100% 0 0   100%
src / local_deep_research / database / models / reports.py Report.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / reports.py ReportSection.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / models / reports.py (no function)   100% 51 0 0   100% 0 0   100%
src / local_deep_research / database / models / research.py ResearchTask.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / research.py SearchQuery.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / research.py SearchResult.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / research.py ResearchResource.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / research.py ResearchHistory.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / research.py Research.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / research.py ResearchStrategy.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / research.py (no function)   100% 122 0 0   100% 0 0   100%
src / local_deep_research / database / models / settings.py UserSettings.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / settings.py APIKey.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / settings.py Setting.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / settings.py (no function)   100% 52 0 0   100% 0 0   100%
src / local_deep_research / database / models / user_base.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / models / user_news_search_history.py UserNewsSearchHistory.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / user_news_search_history.py UserNewsSearchHistory.to_dict   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / models / user_news_search_history.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / database / pool_config.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService._safe_commit   100% 6 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.update_queue_status   100% 10 0 0   100% 4 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.get_queue_status   100% 4 0 0   100% 2 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.add_task_metadata   100% 4 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.update_task_status   100% 12 0 0   100% 6 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.get_pending_tasks   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.cleanup_old_tasks   100% 4 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.get_active_task_count   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService.get_queued_task_count   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService._get_or_create_status   100% 5 0 0   100% 2 0   100%
src / local_deep_research / database / queue_service.py UserQueueService._increment_queue_count   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py UserQueueService._update_queue_counts   100% 4 0 0   100% 0 0   100%
src / local_deep_research / database / queue_service.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / database / session_context.py get_g_db_session   75% 12 3 0   100% 4 0   81%
src / local_deep_research / database / session_context.py get_user_db_session   92% 49 4 0   97% 34 1   94%
src / local_deep_research / database / session_context.py with_user_database   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / session_context.py with_user_database.wrapper   100% 4 0 0   100% 0 0   100%
src / local_deep_research / database / session_context.py ensure_db_session   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / session_context.py ensure_db_session.wrapper   100% 18 0 0   100% 8 0   100%
src / local_deep_research / database / session_context.py DatabaseAccessMixin.get_db_session   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / session_context.py DatabaseAccessMixin.execute_with_db   0% 1 1 0   100% 0 0   0%
src / local_deep_research / database / session_context.py (no function)   100% 20 0 0   100% 0 0   100%
src / local_deep_research / database / session_passwords.py SessionPasswordStore.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / session_passwords.py SessionPasswordStore.store_session_password   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / session_passwords.py SessionPasswordStore.get_session_password   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / session_passwords.py SessionPasswordStore.clear_session   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / session_passwords.py SessionPasswordStore.clear_all_for_user   100% 4 0 0   100% 2 0   100%
src / local_deep_research / database / session_passwords.py SessionPasswordStore.store   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / session_passwords.py SessionPasswordStore.retrieve   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / session_passwords.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_compat.py get_sqlcipher_module   100% 5 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_compat.py (no function)   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py get_salt_file_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py get_salt_for_database   100% 9 0 0   100% 2 0   100%
src / local_deep_research / database / sqlcipher_utils.py create_database_salt   100% 11 0 0   100% 2 0   100%
src / local_deep_research / database / sqlcipher_utils.py has_per_database_salt   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py _get_key_from_password   100% 4 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py get_key_from_password   100% 5 0 0   100% 2 0   100%
src / local_deep_research / database / sqlcipher_utils.py set_sqlcipher_key   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py set_sqlcipher_key_from_hex   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py set_sqlcipher_rekey   100% 7 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py _get_min_kdf_iterations   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py get_sqlcipher_settings   83% 12 2 0   75% 4 1   81%
src / local_deep_research / database / sqlcipher_utils.py apply_cipher_defaults_before_key   100% 5 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py apply_sqlcipher_pragmas   100% 8 0 0   100% 2 0   100%
src / local_deep_research / database / sqlcipher_utils.py apply_performance_pragmas   100% 9 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py verify_sqlcipher_connection   100% 10 0 0   100% 2 0   100%
src / local_deep_research / database / sqlcipher_utils.py get_sqlcipher_version   100% 7 0 0   100% 0 0   100%
src / local_deep_research / database / sqlcipher_utils.py create_sqlcipher_connection   96% 26 1 0   88% 8 1   94%
src / local_deep_research / database / sqlcipher_utils.py (no function)   100% 39 0 0   100% 0 0   100%
src / local_deep_research / database / temp_auth.py TemporaryAuthStore.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / temp_auth.py TemporaryAuthStore.store_auth   100% 4 0 0   100% 0 0   100%
src / local_deep_research / database / temp_auth.py TemporaryAuthStore.retrieve_auth   100% 4 0 0   100% 2 0   100%
src / local_deep_research / database / temp_auth.py TemporaryAuthStore.peek_auth   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / temp_auth.py TemporaryAuthStore.store   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / temp_auth.py TemporaryAuthStore.retrieve   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / temp_auth.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py ThreadLocalSessionManager.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py ThreadLocalSessionManager.get_session   94% 34 2 0   88% 8 1   93%
src / local_deep_research / database / thread_local_session.py ThreadLocalSessionManager.get_current_session   100% 3 0 0   100% 2 0   100%
src / local_deep_research / database / thread_local_session.py ThreadLocalSessionManager._cleanup_thread_session   88% 16 2 0   100% 4 0   90%
src / local_deep_research / database / thread_local_session.py ThreadLocalSessionManager.cleanup_thread   100% 6 0 0   100% 4 0   100%
src / local_deep_research / database / thread_local_session.py ThreadLocalSessionManager.cleanup_dead_threads   100% 7 0 0   100% 4 0   100%
src / local_deep_research / database / thread_local_session.py ThreadLocalSessionManager.cleanup_all   100% 4 0 0   100% 2 0   100%
src / local_deep_research / database / thread_local_session.py get_metrics_session   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py get_current_thread_session   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py cleanup_current_thread   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py cleanup_dead_threads   100% 4 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py _ThreadCleanup.__enter__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py _ThreadCleanup.__exit__   100% 15 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py thread_cleanup   100% 5 0 0   100% 2 0   100%
src / local_deep_research / database / thread_local_session.py thread_cleanup.wrapper   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py ThreadSessionContext.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py ThreadSessionContext.__enter__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py ThreadSessionContext.__exit__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / thread_local_session.py (no function)   100% 30 0 0   100% 0 0   100%
src / local_deep_research / database / thread_metrics.py ThreadSafeMetricsWriter.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / database / thread_metrics.py ThreadSafeMetricsWriter.set_user_password   100% 3 0 0   100% 2 0   100%
src / local_deep_research / database / thread_metrics.py ThreadSafeMetricsWriter.get_session   93% 29 2 0   79% 14 1   88%
src / local_deep_research / database / thread_metrics.py ThreadSafeMetricsWriter.write_token_metrics   100% 4 0 0   100% 0 0   100%
src / local_deep_research / database / thread_metrics.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / defaults / __init__.py get_default_file_path   100% 3 0 0   100% 2 0   100%
src / local_deep_research / defaults / __init__.py list_default_files   100% 1 0 0   100% 0 0   100%
src / local_deep_research / defaults / __init__.py ensure_defaults_exist   88% 8 1 0   67% 6 2   79%
src / local_deep_research / defaults / __init__.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / __init__.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / bytes_loader.py load_from_bytes   88% 32 4 0   100% 8 0   90%
src / local_deep_research / document_loaders / bytes_loader.py extract_text_from_bytes   100% 11 0 0   100% 2 0   100%
src / local_deep_research / document_loaders / bytes_loader.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / json_loader.py extract_strings_from_json   100% 12 0 0   100% 10 0   100%
src / local_deep_research / document_loaders / json_loader.py SimpleJSONLoader.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / json_loader.py SimpleJSONLoader.lazy_load   100% 18 0 0   100% 2 0   100%
src / local_deep_research / document_loaders / json_loader.py SimpleJSONLoader.load   100% 1 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / json_loader.py extract_text_from_json   100% 13 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / json_loader.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / loader_registry.py get_supported_extensions   100% 1 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / loader_registry.py is_extension_supported   100% 2 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / loader_registry.py get_loader_for_path   100% 12 0 0   100% 2 0   100%
src / local_deep_research / document_loaders / loader_registry.py get_loader_class_for_extension   100% 5 0 0   100% 2 0   100%
src / local_deep_research / document_loaders / loader_registry.py (no function)   76% 74 18 0   57% 14 6   73%
src / local_deep_research / document_loaders / yaml_loader.py YAMLLoader.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / yaml_loader.py YAMLLoader.lazy_load   100% 17 0 0   100% 2 0   100%
src / local_deep_research / document_loaders / yaml_loader.py YAMLLoader.load   100% 1 0 0   100% 0 0   100%
src / local_deep_research / document_loaders / yaml_loader.py extract_text_from_yaml   100% 13 0 0   100% 2 0   100%
src / local_deep_research / document_loaders / yaml_loader.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / domain_classifier / __init__.py __getattr__   100% 7 0 0   100% 4 0   100%
src / local_deep_research / domain_classifier / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier._get_llm   100% 3 0 0   100% 2 0   100%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier.close   100% 2 0 0   100% 0 0   100%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier._get_domain_samples   100% 5 0 0   100% 2 0   100%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier._build_classification_prompt   100% 10 0 0   100% 6 0   100%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier.classify_domain   77% 30 7 0   83% 6 1   78%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier.classify_all_domains   94% 50 3 0   94% 18 1   94%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier.get_classification   100% 6 0 0   100% 0 0   100%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier.get_all_classifications   100% 6 0 0   100% 0 0   100%
src / local_deep_research / domain_classifier / classifier.py DomainClassifier.get_categories_summary   100% 19 0 0   88% 8 1   96%
src / local_deep_research / domain_classifier / classifier.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / domain_classifier / models.py DomainClassification.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / domain_classifier / models.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / embeddings / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / embeddings_config.py _get_provider_classes   100% 6 0 0   100% 2 0   100%
src / local_deep_research / embeddings / embeddings_config.py is_sentence_transformers_available   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / embeddings_config.py is_ollama_embeddings_available   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / embeddings_config.py is_openai_embeddings_available   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / embeddings_config.py get_available_embedding_providers   100% 8 0 0   100% 6 0   100%
src / local_deep_research / embeddings / embeddings_config.py get_embedding_function   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / embeddings_config.py get_embeddings   92% 13 1 0   75% 8 2   86%
src / local_deep_research / embeddings / embeddings_config.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / base.py BaseEmbeddingProvider.create_embeddings   0% 1 1 0   100% 0 0   0%
src / local_deep_research / embeddings / providers / base.py BaseEmbeddingProvider.is_available   0% 1 1 0   100% 0 0   0%
src / local_deep_research / embeddings / providers / base.py BaseEmbeddingProvider.get_available_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / base.py BaseEmbeddingProvider.is_embedding_model   0% 1 1 0   100% 0 0   0%
src / local_deep_research / embeddings / providers / base.py BaseEmbeddingProvider.get_model_info   100% 1 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / base.py BaseEmbeddingProvider.validate_config   100% 3 0 0   100% 2 0   100%
src / local_deep_research / embeddings / providers / base.py BaseEmbeddingProvider.get_provider_info   100% 1 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / base.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / implementations / __init__.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / implementations / ollama.py OllamaEmbeddingsProvider.create_embeddings   100% 7 0 0   100% 4 0   100%
src / local_deep_research / embeddings / providers / implementations / ollama.py OllamaEmbeddingsProvider.is_available   73% 11 3 0   100% 0 0   73%
src / local_deep_research / embeddings / providers / implementations / ollama.py OllamaEmbeddingsProvider._get_model_capabilities   100% 7 0 0   100% 2 0   100%
src / local_deep_research / embeddings / providers / implementations / ollama.py OllamaEmbeddingsProvider.is_embedding_model   100% 5 0 0   100% 2 0   100%
src / local_deep_research / embeddings / providers / implementations / ollama.py OllamaEmbeddingsProvider.get_available_models   100% 19 0 0   100% 8 0   100%
src / local_deep_research / embeddings / providers / implementations / ollama.py _name_looks_like_embedding   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / implementations / ollama.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / implementations / openai.py OpenAIEmbeddingsProvider.create_embeddings   100% 22 0 0   100% 14 0   100%
src / local_deep_research / embeddings / providers / implementations / openai.py OpenAIEmbeddingsProvider.is_available   100% 6 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / implementations / openai.py OpenAIEmbeddingsProvider.get_available_models   100% 17 0 0   100% 6 0   100%
src / local_deep_research / embeddings / providers / implementations / openai.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / implementations / sentence_transformers.py SentenceTransformersProvider.create_embeddings   100% 8 0 0   100% 4 0   100%
src / local_deep_research / embeddings / providers / implementations / sentence_transformers.py SentenceTransformersProvider.is_available   100% 1 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / implementations / sentence_transformers.py SentenceTransformersProvider.get_available_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / embeddings / providers / implementations / sentence_transformers.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / embeddings / splitters / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / splitters / text_splitter_registry.py get_text_splitter   100% 29 0 0   94% 16 1   98%
src / local_deep_research / embeddings / splitters / text_splitter_registry.py is_semantic_chunker_available   100% 2 0 0   100% 0 0   100%
src / local_deep_research / embeddings / splitters / text_splitter_registry.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / error_handling / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter.categorize_error   100% 7 0 0   100% 6 0   100%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter.get_user_friendly_title   100% 2 0 0   100% 0 0   100%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter.get_suggested_actions   100% 2 0 0   100% 0 0   100%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter.analyze_error   100% 7 0 0   100% 2 0   100%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter._send_error_notifications   77% 30 7 0   67% 12 2   74%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter._extract_service_name   100% 6 0 0   100% 4 0   100%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter._determine_severity   100% 2 0 0   100% 0 0   100%
src / local_deep_research / error_handling / error_reporter.py ErrorReporter._is_recoverable   100% 2 0 0   100% 0 0   100%
src / local_deep_research / error_handling / error_reporter.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / error_handling / report_generator.py ErrorReportGenerator.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / error_handling / report_generator.py ErrorReportGenerator.generate_error_report   100% 26 0 0   83% 6 1   97%
src / local_deep_research / error_handling / report_generator.py ErrorReportGenerator._format_partial_results   100% 34 0 0   92% 24 2   97%
src / local_deep_research / error_handling / report_generator.py ErrorReportGenerator._get_technical_context   100% 27 0 0   100% 20 0   100%
src / local_deep_research / error_handling / report_generator.py ErrorReportGenerator.generate_quick_error_summary   100% 2 0 0   100% 0 0   100%
src / local_deep_research / error_handling / report_generator.py ErrorReportGenerator._make_error_user_friendly   100% 6 0 0   100% 4 0   100%
src / local_deep_research / error_handling / report_generator.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / exceptions.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / exporters / __init__.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / exporters / base.py BaseExporter.format_name   0% 1 1 0   100% 0 0   0%
src / local_deep_research / exporters / base.py BaseExporter.file_extension   0% 1 1 0   100% 0 0   0%
src / local_deep_research / exporters / base.py BaseExporter.mimetype   0% 1 1 0   100% 0 0   0%
src / local_deep_research / exporters / base.py BaseExporter._validate_content_size   100% 2 0 0   100% 2 0   100%
src / local_deep_research / exporters / base.py BaseExporter.export   0% 1 1 0   100% 0 0   0%
src / local_deep_research / exporters / base.py BaseExporter._generate_safe_filename   100% 4 0 0   100% 2 0   100%
src / local_deep_research / exporters / base.py BaseExporter._prepend_title_if_needed   100% 7 0 0   100% 6 0   100%
src / local_deep_research / exporters / base.py (no function)   100% 27 0 0   100% 0 0   100%
src / local_deep_research / exporters / latex_exporter.py LaTeXExporter.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / exporters / latex_exporter.py LaTeXExporter.format_name   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / latex_exporter.py LaTeXExporter.file_extension   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / latex_exporter.py LaTeXExporter.mimetype   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / latex_exporter.py LaTeXExporter.export   100% 10 0 0   100% 0 0   100%
src / local_deep_research / exporters / latex_exporter.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / exporters / odt_exporter.py ODTExporter.format_name   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / odt_exporter.py ODTExporter.file_extension   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / odt_exporter.py ODTExporter.mimetype   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / odt_exporter.py ODTExporter.export   94% 35 2 0   83% 12 2   91%
src / local_deep_research / exporters / odt_exporter.py ODTExporter._add_footer   100% 2 0 0   100% 0 0   100%
src / local_deep_research / exporters / odt_exporter.py ODTExporter._sanitize_metadata   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / odt_exporter.py (no function)   86% 22 3 0   100% 0 0   86%
src / local_deep_research / exporters / pdf_exporter.py PDFExporter.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / exporters / pdf_exporter.py PDFExporter.format_name   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / pdf_exporter.py PDFExporter.file_extension   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / pdf_exporter.py PDFExporter.mimetype   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / pdf_exporter.py PDFExporter.export   100% 14 0 0   100% 2 0   100%
src / local_deep_research / exporters / pdf_exporter.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / exporters / quarto_exporter.py QuartoExporter.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / exporters / quarto_exporter.py QuartoExporter.format_name   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / quarto_exporter.py QuartoExporter.file_extension   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / quarto_exporter.py QuartoExporter.mimetype   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / quarto_exporter.py QuartoExporter.export   100% 23 0 0   100% 2 0   100%
src / local_deep_research / exporters / quarto_exporter.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / exporters / registry.py ExporterRegistry.register   100% 5 0 0   100% 0 0   100%
src / local_deep_research / exporters / registry.py ExporterRegistry.get_exporter   100% 9 0 0   100% 4 0   100%
src / local_deep_research / exporters / registry.py ExporterRegistry.get_available_formats   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / registry.py ExporterRegistry.is_format_supported   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / registry.py ExporterRegistry.clear   100% 2 0 0   100% 0 0   100%
src / local_deep_research / exporters / registry.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / exporters / ris_exporter.py RISExporter.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / exporters / ris_exporter.py RISExporter.format_name   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / ris_exporter.py RISExporter.file_extension   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / ris_exporter.py RISExporter.mimetype   100% 1 0 0   100% 0 0   100%
src / local_deep_research / exporters / ris_exporter.py RISExporter.export   100% 10 0 0   100% 0 0   100%
src / local_deep_research / exporters / ris_exporter.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / followup_research / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / followup_research / models.py FollowUpRequest.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / followup_research / models.py FollowUpResponse.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / followup_research / models.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / followup_research / routes.py prepare_followup   100% 23 0 0   100% 4 0   100%
src / local_deep_research / followup_research / routes.py start_followup   100% 48 0 0   100% 4 0   100%
src / local_deep_research / followup_research / routes.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / followup_research / service.py FollowUpResearchService.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / followup_research / service.py FollowUpResearchService.load_parent_research   93% 28 2 0   83% 6 1   91%
src / local_deep_research / followup_research / service.py FollowUpResearchService.prepare_research_context   100% 5 0 0   100% 2 0   100%
src / local_deep_research / followup_research / service.py FollowUpResearchService.perform_followup   100% 7 0 0   100% 2 0   100%
src / local_deep_research / followup_research / service.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / __init__.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / database_init.py init_database   100% 6 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / database_init.py verify_table_exists   100% 10 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / database_init.py (no function)   75% 8 2 0   50% 2 1   70%
src / local_deep_research / library / download_management / failure_classifier.py BaseFailure.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / failure_classifier.py BaseFailure.is_permanent   100% 1 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / failure_classifier.py BaseFailure.can_retry_now   100% 3 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / failure_classifier.py BaseFailure.get_cooldown_remaining   100% 6 0 0   100% 4 0   100%
src / local_deep_research / library / download_management / failure_classifier.py BaseFailure.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / failure_classifier.py PermanentFailure.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / failure_classifier.py TemporaryFailure.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / failure_classifier.py RateLimitFailure.__init__   100% 7 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / failure_classifier.py FailureClassifier.classify_failure   91% 33 3 0   90% 30 3   90%
src / local_deep_research / library / download_management / failure_classifier.py FailureClassifier.classify_from_exception   100% 3 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / failure_classifier.py (no function)   100% 20 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / filters / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / filters / resource_filter.py ResourceFilter.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / filters / resource_filter.py ResourceFilter.filter_downloadable_resources   100% 5 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / filters / resource_filter.py ResourceFilter._apply_legacy_file_check   100% 1 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / filters / resource_filter.py ResourceFilter.get_filter_summary   100% 2 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / filters / resource_filter.py ResourceFilter.get_skipped_resources_info   100% 7 0 0   100% 4 0   100%
src / local_deep_research / library / download_management / filters / resource_filter.py ResourceFilter.should_skip_resource   100% 2 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / filters / resource_filter.py ResourceFilter.get_retry_statistics   100% 1 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / filters / resource_filter.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / models / __init__.py ResourceDownloadStatus.__repr__   0% 1 1 0   100% 0 0   0%
src / local_deep_research / library / download_management / models / __init__.py (no function)   100% 38 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py ResourceFilterResult.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py FilterSummary.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py FilterSummary.add_result   100% 8 0 0   100% 6 0   100%
src / local_deep_research / library / download_management / retry_manager.py FilterSummary.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py RetryManager.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py RetryManager.should_retry_resource   100% 2 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py RetryManager.record_attempt   100% 7 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / retry_manager.py RetryManager.filter_resources   100% 19 0 0   88% 8 1   96%
src / local_deep_research / library / download_management / retry_manager.py RetryManager.get_filter_summary   100% 4 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / retry_manager.py RetryManager._get_resource_status   100% 7 0 0   100% 6 0   100%
src / local_deep_research / library / download_management / retry_manager.py RetryManager.get_retry_statistics   100% 2 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py RetryManager.reset_daily_retry_counters   100% 6 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py RetryManager.clear_old_permanent_failures   100% 1 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / retry_manager.py (no function)   100% 26 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / status_tracker.py compute_retry_cooldown   100% 7 0 0   100% 6 0   100%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker.__init__   100% 8 0 0   100% 0 0   100%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker._get_session   0% 1 1 0   100% 0 0   0%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker.mark_failure   50% 6 3 0   50% 2 1   50%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker._apply_failure   100% 35 0 0   100% 12 0   100%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker.mark_success   50% 6 3 0   50% 2 1   50%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker._apply_success   100% 8 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker.can_retry   95% 20 1 0   93% 14 1   94%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker.get_resource_status   100% 5 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker.get_failed_resources_count   100% 7 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / status_tracker.py ResourceStatusTracker.clear_permanent_failures   100% 16 0 0   100% 2 0   100%
src / local_deep_research / library / download_management / status_tracker.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / llm / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py LLMRegistry.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py LLMRegistry.register   100% 6 0 0   100% 2 0   100%
src / local_deep_research / llm / llm_registry.py LLMRegistry.unregister   100% 5 0 0   100% 2 0   100%
src / local_deep_research / llm / llm_registry.py LLMRegistry.get   100% 3 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py LLMRegistry.is_registered   100% 3 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py LLMRegistry.list_registered   100% 2 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py LLMRegistry.clear   100% 3 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py register_llm   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py unregister_llm   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py get_llm_from_registry   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py is_llm_registered   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py list_registered_llms   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py clear_llm_registry   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / llm_registry.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / auto_discovery.py ProviderInfo.__init__   100% 7 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / auto_discovery.py ProviderInfo._generate_display_name   100% 6 0 0   100% 4 0   100%
src / local_deep_research / llm / providers / auto_discovery.py ProviderInfo.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / auto_discovery.py ProviderDiscovery.__new__   100% 4 0 0   100% 2 0   100%
src / local_deep_research / llm / providers / auto_discovery.py ProviderDiscovery.discover_providers   100% 30 0 0   93% 14 1   98%
src / local_deep_research / llm / providers / auto_discovery.py ProviderDiscovery.get_provider_info   100% 3 0 0   100% 2 0   100%
src / local_deep_research / llm / providers / auto_discovery.py ProviderDiscovery.get_provider_options   86% 7 1 0   75% 4 1   82%
src / local_deep_research / llm / providers / auto_discovery.py ProviderDiscovery.get_available_provider_options   92% 12 1 0   88% 8 1   90%
src / local_deep_research / llm / providers / auto_discovery.py ProviderDiscovery.get_provider_class   100% 2 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / auto_discovery.py discover_providers   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / auto_discovery.py get_discovered_provider_options   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / auto_discovery.py get_available_discovered_provider_options   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / auto_discovery.py get_provider_class   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / auto_discovery.py (no function)   100% 27 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / base.py normalize_provider   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / base.py BaseLLMProvider.create_llm   100% 0 0 1   100% 0 0   100%
src / local_deep_research / llm / providers / base.py BaseLLMProvider.is_available   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / base.py BaseLLMProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / base.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / anthropic.py AnthropicProvider.create_llm   88% 16 2 0   100% 6 0   91%
src / local_deep_research / llm / providers / implementations / anthropic.py AnthropicProvider.is_available   100% 5 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / anthropic.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / custom_openai_endpoint.py CustomOpenAIEndpointProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / custom_openai_endpoint.py CustomOpenAIEndpointProvider.is_available   100% 15 0 0   100% 6 0   100%
src / local_deep_research / llm / providers / implementations / custom_openai_endpoint.py CustomOpenAIEndpointProvider.create_llm   100% 4 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / custom_openai_endpoint.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / google.py GoogleProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / google.py GoogleProvider.list_models_for_api   100% 25 0 0   100% 10 0   100%
src / local_deep_research / llm / providers / implementations / google.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / ionos.py IONOSProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / ionos.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / lmstudio.py LMStudioProvider.create_llm   100% 6 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / lmstudio.py LMStudioProvider.is_available   100% 9 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / lmstudio.py LMStudioProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / lmstudio.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / ollama.py OllamaProvider._get_auth_headers   100% 6 0 0   100% 4 0   100%
src / local_deep_research / llm / providers / implementations / ollama.py OllamaProvider.list_models_for_api   100% 14 0 0   100% 4 0   100%
src / local_deep_research / llm / providers / implementations / ollama.py OllamaProvider.create_llm   95% 22 1 0   83% 12 2   91%
src / local_deep_research / llm / providers / implementations / ollama.py OllamaProvider.is_available   100% 25 0 0   100% 4 0   100%
src / local_deep_research / llm / providers / implementations / ollama.py OllamaProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / ollama.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / openai.py OpenAIProvider.create_llm   100% 46 0 0   100% 16 0   100%
src / local_deep_research / llm / providers / implementations / openai.py OpenAIProvider.is_available   100% 5 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / openai.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / openrouter.py OpenRouterProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / openrouter.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / xai.py XAIProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / implementations / xai.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / openai_base.py OpenAICompatibleProvider.create_llm   100% 38 0 0   100% 14 0   100%
src / local_deep_research / llm / providers / openai_base.py OpenAICompatibleProvider._create_llm_instance   93% 14 1 0   75% 4 1   89%
src / local_deep_research / llm / providers / openai_base.py OpenAICompatibleProvider.is_available   100% 7 0 0   100% 2 0   100%
src / local_deep_research / llm / providers / openai_base.py OpenAICompatibleProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src / local_deep_research / llm / providers / openai_base.py OpenAICompatibleProvider._get_base_url_for_models   100% 5 0 0   75% 4 1   89%
src / local_deep_research / llm / providers / openai_base.py OpenAICompatibleProvider.list_models_for_api   100% 21 0 0   90% 10 1   97%
src / local_deep_research / llm / providers / openai_base.py OpenAICompatibleProvider.list_models   100% 9 0 0   50% 2 1   91%
src / local_deep_research / llm / providers / openai_base.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / mcp / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / mcp / __main__.py (no function)   67% 3 1 0   50% 2 1   60%
src / local_deep_research / mcp / client.py MCPClient.__init__   100% 10 0 0   100% 2 0   100%
src / local_deep_research / mcp / client.py MCPClient._validate_server_config   100% 21 0 0   94% 16 1   97%
src / local_deep_research / mcp / client.py MCPClient.connect   0% 19 19 0   100% 0 0   0%
src / local_deep_research / mcp / client.py MCPClient._initialize_with_retry   0% 14 14 0   0% 6 0   0%
src / local_deep_research / mcp / client.py MCPClient.list_tools   79% 14 3 0   100% 4 0   83%
src / local_deep_research / mcp / client.py MCPClient.call_tool   92% 24 2 0   86% 14 2   89%
src / local_deep_research / mcp / client.py MCPClientManager.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / mcp / client.py MCPClientManager.connect_all   33% 18 12 0   25% 4 1   32%
src / local_deep_research / mcp / client.py MCPClientManager.list_all_tools   89% 9 1 0   100% 2 0   91%
src / local_deep_research / mcp / client.py MCPClientManager.call_tool   67% 3 1 0   50% 2 1   60%
src / local_deep_research / mcp / client.py MCPClientManager.get_connected_servers   100% 1 0 0   100% 0 0   100%
src / local_deep_research / mcp / client.py run_async   100% 14 0 0   100% 0 0   100%
src / local_deep_research / mcp / client.py (no function)   92% 36 3 0   100% 0 0   92%
src / local_deep_research / mcp / server.py _classify_error   100% 16 0 0   100% 14 0   100%
src / local_deep_research / mcp / server.py _validate_query   100% 6 0 0   100% 4 0   100%
src / local_deep_research / mcp / server.py _validate_iterations   100% 7 0 0   100% 6 0   100%
src / local_deep_research / mcp / server.py _validate_questions_per_iteration   100% 7 0 0   100% 6 0   100%
src / local_deep_research / mcp / server.py _validate_max_results   100% 5 0 0   100% 4 0   100%
src / local_deep_research / mcp / server.py _validate_temperature   100% 7 0 0   100% 6 0   100%
src / local_deep_research / mcp / server.py _validate_search_engine   100% 18 0 0   100% 6 0   100%
src / local_deep_research / mcp / server.py _validate_strategy   90% 10 1 0   83% 6 1   88%
src / local_deep_research / mcp / server.py _build_settings_overrides   100% 16 0 0   100% 14 0   100%
src / local_deep_research / mcp / server.py quick_research   100% 16 0 0   100% 0 0   100%
src / local_deep_research / mcp / server.py detailed_research   100% 16 0 0   100% 0 0   100%
src / local_deep_research / mcp / server.py generate_report   100% 22 0 0   88% 8 1   97%
src / local_deep_research / mcp / server.py analyze_documents   94% 18 1 0   75% 4 1   91%
src / local_deep_research / mcp / server.py search   82% 34 6 0   70% 10 3   80%
src / local_deep_research / mcp / server.py _execute_search   100% 12 0 0   100% 6 0   100%
src / local_deep_research / mcp / server.py list_search_engines   100% 14 0 0   100% 2 0   100%
src / local_deep_research / mcp / server.py list_strategies   33% 6 4 0   100% 0 0   33%
src / local_deep_research / mcp / server.py get_configuration   100% 9 0 0   100% 0 0   100%
src / local_deep_research / mcp / server.py run_server   0% 4 4 0   100% 0 0   0%
src / local_deep_research / mcp / server.py (no function)   98% 41 1 0   50% 2 1   95%
src / local_deep_research / metrics / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / metrics / database.py MetricsDatabase.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / metrics / database.py MetricsDatabase.get_session   100% 18 0 0   100% 6 0   100%
src / local_deep_research / metrics / database.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / __init__.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / cost_calculator.py CostCalculator.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / cost_calculator.py CostCalculator.__aenter__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / cost_calculator.py CostCalculator.__aexit__   100% 2 0 0   50% 2 1   75%
src / local_deep_research / metrics / pricing / cost_calculator.py CostCalculator.get_model_pricing   100% 11 0 0   100% 6 0   100%
src / local_deep_research / metrics / pricing / cost_calculator.py CostCalculator.calculate_cost   100% 7 0 0   100% 2 0   100%
src / local_deep_research / metrics / pricing / cost_calculator.py CostCalculator.calculate_batch_costs   70% 10 3 0   100% 2 0   75%
src / local_deep_research / metrics / pricing / cost_calculator.py CostCalculator.calculate_cost_sync   100% 14 0 0   100% 8 0   100%
src / local_deep_research / metrics / pricing / cost_calculator.py CostCalculator.get_research_cost_summary   100% 17 0 0   100% 4 0   100%
src / local_deep_research / metrics / pricing / cost_calculator.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache._load_cache   0% 1 1 0   100% 0 0   0%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache._save_cache   0% 1 1 0   100% 0 0   0%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.get   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.set   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.get_model_pricing   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.set_model_pricing   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.get_all_pricing   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.set_all_pricing   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.clear   100% 2 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.clear_expired   100% 2 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py PricingCache.get_cache_stats   100% 2 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_cache.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.__aenter__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.__aexit__   100% 2 0 0   100% 2 0   100%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher._load_static_pricing   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.fetch_openai_pricing   50% 6 3 0   100% 0 0   50%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.fetch_anthropic_pricing   50% 6 3 0   100% 0 0   50%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.fetch_google_pricing   50% 6 3 0   100% 0 0   50%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.fetch_huggingface_pricing   100% 11 0 0   100% 4 0   100%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.get_model_pricing   100% 28 0 0   86% 22 3   94%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher._get_models_by_provider   100% 11 0 0   100% 8 0   100%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.get_all_pricing   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / pricing / pricing_fetcher.py PricingFetcher.get_provider_from_model   93% 14 1 0   92% 12 1   92%
src / local_deep_research / metrics / pricing / pricing_fetcher.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / metrics / query_utils.py get_period_days   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / query_utils.py get_time_filter_condition   100% 12 0 0   100% 10 0   100%
src / local_deep_research / metrics / query_utils.py get_research_mode_condition   100% 5 0 0   100% 4 0   100%
src / local_deep_research / metrics / query_utils.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / metrics / search_tracker.py SearchTracker.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / search_tracker.py SearchTracker.record_search   94% 35 2 0   100% 10 0   96%
src / local_deep_research / metrics / search_tracker.py SearchTracker.get_search_metrics   100% 25 0 0   100% 12 0   100%
src / local_deep_research / metrics / search_tracker.py SearchTracker.get_research_search_metrics   100% 13 0 0   100% 0 0   100%
src / local_deep_research / metrics / search_tracker.py SearchTracker.get_search_time_series   100% 17 0 0   83% 6 1   96%
src / local_deep_research / metrics / search_tracker.py get_search_tracker   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / search_tracker.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / metrics / token_counter.py TokenCountingCallback.__init__   100% 21 0 0   100% 0 0   100%
src / local_deep_research / metrics / token_counter.py TokenCountingCallback.on_llm_start   94% 64 4 0   91% 44 2   93%
src / local_deep_research / metrics / token_counter.py TokenCountingCallback.on_llm_end   100% 42 0 0   100% 32 0   100%
src / local_deep_research / metrics / token_counter.py TokenCountingCallback.on_llm_error   100% 6 0 0   100% 4 0   100%
src / local_deep_research / metrics / token_counter.py TokenCountingCallback._get_context_overflow_fields   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / token_counter.py TokenCountingCallback._save_to_db   100% 51 0 0   100% 16 0   100%
src / local_deep_research / metrics / token_counter.py TokenCountingCallback.get_counts   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / token_counter.py TokenCounter.__init__   100% 0 0 0   100% 0 0   100%
src / local_deep_research / metrics / token_counter.py TokenCounter.create_callback   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / token_counter.py TokenCounter.get_research_metrics   100% 16 0 0   100% 4 0   100%
src / local_deep_research / metrics / token_counter.py TokenCounter.get_overall_metrics   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / token_counter.py TokenCounter._get_metrics_from_encrypted_db   70% 140 42 0   54% 72 17   65%
src / local_deep_research / metrics / token_counter.py TokenCounter._get_empty_metrics   100% 1 0 0   100% 0 0   100%
src / local_deep_research / metrics / token_counter.py TokenCounter.get_enhanced_metrics   91% 54 5 0   67% 12 4   86%
src / local_deep_research / metrics / token_counter.py TokenCounter.get_research_timeline_metrics   100% 37 0 0   88% 16 2   96%
src / local_deep_research / metrics / token_counter.py (no function)   100% 29 0 0   100% 0 0   100%
src / local_deep_research / news / __init__.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / news / api.py get_recommender   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / api.py _notify_scheduler_about_subscription_change   100% 19 0 0   88% 8 1   96%
src / local_deep_research / news / api.py get_news_feed   90% 128 13 0   83% 58 10   88%
src / local_deep_research / news / api.py get_subscription_history   86% 36 5 0   83% 6 1   86%
src / local_deep_research / news / api.py _format_time_ago   100% 20 0 0   100% 8 0   100%
src / local_deep_research / news / api.py get_subscription   100% 13 0 0   100% 2 0   100%
src / local_deep_research / news / api.py get_subscriptions   82% 17 3 0   100% 2 0   84%
src / local_deep_research / news / api.py update_subscription   85% 48 7 0   84% 32 5   85%
src / local_deep_research / news / api.py create_subscription   86% 22 3 0   100% 2 0   88%
src / local_deep_research / news / api.py delete_subscription   81% 16 3 0   100% 2 0   83%
src / local_deep_research / news / api.py get_votes_for_cards   73% 22 6 0   62% 8 1   70%
src / local_deep_research / news / api.py submit_feedback   79% 29 6 0   70% 10 1   77%
src / local_deep_research / news / api.py research_news_item   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / api.py save_news_preferences   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / api.py get_news_categories   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / api.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / news / core / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py CardVersion.__post_init__   100% 2 0 0   100% 2 0   100%
src / local_deep_research / news / core / base_card.py BaseCard.__post_init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py BaseCard.set_progress_callback   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py BaseCard._update_progress   100% 2 0 0   100% 2 0   100%
src / local_deep_research / news / core / base_card.py BaseCard.save   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / core / base_card.py BaseCard.add_version   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / core / base_card.py BaseCard.get_latest_version   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / core / base_card.py BaseCard.to_base_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py BaseCard.get_card_type   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / base_card.py BaseCard.to_dict   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / base_card.py BaseCard._extract_headline   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py BaseCard._extract_summary   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py BaseCard._calculate_impact   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py BaseCard._extract_topics   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / core / base_card.py BaseCard._extract_entities   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py NewsCard.__post_init__   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / core / base_card.py NewsCard.get_card_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py NewsCard.to_dict   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py ResearchCard.get_card_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py ResearchCard.to_dict   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py UpdateCard.__post_init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py UpdateCard.get_card_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py UpdateCard.to_dict   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py OverviewCard.get_card_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py OverviewCard.to_dict   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / core / base_card.py (no function)   100% 83 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_factory.py CardFactory.register_card_type   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / core / card_factory.py CardFactory.get_storage   50% 12 6 0   50% 6 1   50%
src / local_deep_research / news / core / card_factory.py CardFactory.create_card   100% 10 0 0   100% 2 0   100%
src / local_deep_research / news / core / card_factory.py CardFactory.load_card   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / core / card_factory.py CardFactory.get_user_cards   100% 11 0 0   100% 6 0   100%
src / local_deep_research / news / core / card_factory.py CardFactory.get_recent_cards   100% 8 0 0   75% 4 1   92%
src / local_deep_research / news / core / card_factory.py CardFactory.update_card   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_factory.py CardFactory.delete_card   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_factory.py CardFactory._reconstruct_card   100% 32 0 0   100% 14 0   100%
src / local_deep_research / news / core / card_factory.py CardFactory.create_news_card_from_analysis   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / core / card_factory.py create_card   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_factory.py load_card   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_factory.py (no function)   100% 30 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.__init__   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.session   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.create   84% 19 3 0   50% 2 1   81%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.get   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.update   100% 19 0 0   100% 12 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.delete   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.list   100% 15 0 0   100% 10 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.get_recent   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage._card_to_dict   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.get_by_user   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.get_latest_version   75% 8 2 0   75% 4 1   75%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.add_version   100% 20 0 0   83% 6 1   96%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.update_latest_info   100% 13 0 0   67% 6 2   89%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.archive_card   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_storage.py SQLCardStorage.pin_card   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / card_storage.py (no function)   100% 24 0 0   100% 0 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer.close   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer.analyze_news   100% 20 0 0   100% 4 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer.extract_news_items   100% 19 0 0   100% 8 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer.generate_big_picture   100% 11 0 0   100% 2 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer.generate_watch_for   100% 22 0 0   90% 10 1   97%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer.generate_patterns   100% 17 0 0   100% 6 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer.extract_topics   100% 25 0 0   100% 12 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer._prepare_snippets   100% 13 0 0   100% 10 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer._validate_news_item   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer._count_categories   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer._summarize_impact   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / core / news_analyzer.py NewsAnalyzer._empty_analysis   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / news_analyzer.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / news / core / relevance_service.py RelevanceService.calculate_relevance   100% 20 0 0   100% 18 0   100%
src / local_deep_research / news / core / relevance_service.py RelevanceService.calculate_trending_score   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / core / relevance_service.py RelevanceService.filter_trending   100% 7 0 0   100% 4 0   100%
src / local_deep_research / news / core / relevance_service.py RelevanceService.personalize_feed   100% 8 0 0   100% 4 0   100%
src / local_deep_research / news / core / relevance_service.py get_relevance_service   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / core / relevance_service.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / news / core / search_integration.py NewsSearchCallback.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / search_integration.py NewsSearchCallback.tracking_enabled   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / core / search_integration.py NewsSearchCallback.__call__   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / core / search_integration.py NewsSearchCallback._track_user_search   57% 7 3 0   100% 0 0   57%
src / local_deep_research / news / core / search_integration.py NewsSearchCallback._calculate_quality   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / core / search_integration.py create_search_wrapper   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / core / search_integration.py create_search_wrapper.wrapped_search   100% 11 0 0   100% 0 0   100%
src / local_deep_research / news / core / search_integration.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage.py BaseStorage.create   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py BaseStorage.get   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py BaseStorage.update   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py BaseStorage.delete   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py BaseStorage.list   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py BaseStorage.generate_id   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage.py CardStorage.get_by_user   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py CardStorage.get_latest_version   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py CardStorage.add_version   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py CardStorage.update_latest_info   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py CardStorage.archive_card   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py CardStorage.pin_card   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py SubscriptionStorage.get_active_subscriptions   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py SubscriptionStorage.get_due_subscriptions   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py SubscriptionStorage.update_refresh_time   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py SubscriptionStorage.increment_stats   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py SubscriptionStorage.pause_subscription   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py SubscriptionStorage.resume_subscription   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py SubscriptionStorage.expire_subscription   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py RatingStorage.get_user_rating   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py RatingStorage.upsert_rating   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py RatingStorage.get_ratings_summary   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py RatingStorage.get_user_ratings   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py PreferenceStorage.get_user_preferences   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py PreferenceStorage.upsert_preferences   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py PreferenceStorage.add_liked_item   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py PreferenceStorage.add_disliked_item   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py PreferenceStorage.update_preference_embedding   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / core / storage.py (no function)   100% 64 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage_manager.py StorageManager.__init__   100% 7 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage_manager.py StorageManager._get_current_session   100% 6 0 0   75% 4 1   90%
src / local_deep_research / news / core / storage_manager.py StorageManager.cards   83% 6 1 0   75% 4 1   80%
src / local_deep_research / news / core / storage_manager.py StorageManager.subscriptions   83% 6 1 0   75% 4 1   80%
src / local_deep_research / news / core / storage_manager.py StorageManager.ratings   83% 6 1 0   75% 4 1   80%
src / local_deep_research / news / core / storage_manager.py StorageManager.preferences   83% 6 1 0   75% 4 1   80%
src / local_deep_research / news / core / storage_manager.py StorageManager.get_user_feed   100% 18 0 0   88% 8 1   96%
src / local_deep_research / news / core / storage_manager.py StorageManager.get_trending_news   100% 6 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage_manager.py StorageManager.record_interaction   100% 25 0 0   92% 12 1   97%
src / local_deep_research / news / core / storage_manager.py StorageManager.get_user_subscriptions   100% 6 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage_manager.py StorageManager.get_user_stats   100% 11 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage_manager.py StorageManager.get_card   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage_manager.py StorageManager.get_card_interactions   100% 10 0 0   100% 2 0   100%
src / local_deep_research / news / core / storage_manager.py StorageManager.update_card   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / core / storage_manager.py StorageManager.cleanup_old_data   100% 18 0 0   83% 6 1   96%
src / local_deep_research / news / core / storage_manager.py get_storage_manager   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / core / storage_manager.py (no function)   100% 40 0 0   100% 0 0   100%
src / local_deep_research / news / core / utils.py get_local_date_string   100% 18 0 0   100% 6 0   100%
src / local_deep_research / news / core / utils.py generate_card_id   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / utils.py generate_subscription_id   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / utils.py utc_now   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / core / utils.py hours_ago   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / core / utils.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py NewsAPIException.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py NewsAPIException.to_dict   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / exceptions.py NewsFeatureDisabledException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py InvalidLimitException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py SubscriptionNotFoundException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py SubscriptionCreationException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py SubscriptionUpdateException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py SubscriptionDeletionException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py DatabaseAccessException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py NewsFeedGenerationException.__init__   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / exceptions.py ResearchProcessingException.__init__   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / exceptions.py NotImplementedException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py InvalidParameterException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py SchedulerNotificationException.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / exceptions.py (no function)   100% 28 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py scheduler_control_required   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py scheduler_control_required.wrapper   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / flask_api.py safe_error_message   100% 8 0 0   100% 6 0   100%
src / local_deep_research / news / flask_api.py _is_job_owned_by_user   100% 7 0 0   100% 6 0   100%
src / local_deep_research / news / flask_api.py get_user_id   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / flask_api.py get_news_feed   100% 21 0 0   100% 4 0   100%
src / local_deep_research / news / flask_api.py create_subscription   93% 27 2 0   100% 2 0   93%
src / local_deep_research / news / flask_api.py vote_on_news   100% 16 0 0   100% 4 0   100%
src / local_deep_research / news / flask_api.py get_batch_feedback   94% 16 1 0   75% 4 1   90%
src / local_deep_research / news / flask_api.py submit_feedback   100% 17 0 0   100% 6 0   100%
src / local_deep_research / news / flask_api.py research_news_item   100% 7 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py get_current_user_subscriptions   100% 10 0 0   100% 2 0   100%
src / local_deep_research / news / flask_api.py get_subscription   100% 9 0 0   100% 4 0   100%
src / local_deep_research / news / flask_api.py update_subscription   90% 20 2 0   100% 8 0   93%
src / local_deep_research / news / flask_api.py delete_subscription   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / flask_api.py run_subscription_now   88% 32 4 0   75% 12 3   84%
src / local_deep_research / news / flask_api.py get_subscription_history   82% 11 2 0   100% 2 0   85%
src / local_deep_research / news / flask_api.py save_preferences   100% 8 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py get_categories   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py get_scheduler_status   100% 34 0 0   90% 10 1   98%
src / local_deep_research / news / flask_api.py start_scheduler   83% 12 2 0   100% 2 0   86%
src / local_deep_research / news / flask_api.py stop_scheduler   83% 12 2 0   100% 4 0   88%
src / local_deep_research / news / flask_api.py check_subscriptions_now   35% 20 13 0   50% 6 1   38%
src / local_deep_research / news / flask_api.py trigger_cleanup   80% 10 2 0   100% 2 0   83%
src / local_deep_research / news / flask_api.py get_active_users   83% 12 2 0   100% 2 0   86%
src / local_deep_research / news / flask_api.py scheduler_stats   90% 20 2 0   90% 10 1   90%
src / local_deep_research / news / flask_api.py check_overdue_subscriptions   87% 46 6 0   70% 10 3   84%
src / local_deep_research / news / flask_api.py get_folders   100% 8 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py create_folder   85% 13 2 0   100% 4 0   88%
src / local_deep_research / news / flask_api.py update_folder   80% 10 2 0   100% 2 0   83%
src / local_deep_research / news / flask_api.py delete_folder   80% 10 2 0   100% 2 0   83%
src / local_deep_research / news / flask_api.py get_subscriptions_organized   100% 11 0 0   100% 2 0   100%
src / local_deep_research / news / flask_api.py update_subscription_folder   0% 25 25 0   0% 10 0   0%
src / local_deep_research / news / flask_api.py get_subscription_stats   100% 8 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py bad_request   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py not_found   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py internal_error   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / flask_api.py get_search_history   100% 14 0 0   100% 2 0   100%
src / local_deep_research / news / flask_api.py add_search_history   86% 22 3 0   100% 4 0   88%
src / local_deep_research / news / flask_api.py clear_search_history   100% 15 0 0   100% 2 0   100%
src / local_deep_research / news / flask_api.py (no function)   100% 133 0 0   100% 0 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.get_user_folders   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.create_folder   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.update_folder   100% 9 0 0   100% 6 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.delete_folder   100% 9 0 0   100% 4 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.get_subscriptions_by_folder   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.update_subscription   100% 20 0 0   100% 10 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.delete_subscription   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / folder_manager.py FolderManager.get_subscription_stats   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / folder_manager.py FolderManager._sub_to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / folder_manager.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / base_preference.py BasePreferenceManager.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / base_preference.py BasePreferenceManager.get_preferences   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / preference_manager / base_preference.py BasePreferenceManager.update_preferences   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / preference_manager / base_preference.py BasePreferenceManager.add_interest   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / base_preference.py BasePreferenceManager.remove_interest   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / base_preference.py BasePreferenceManager.ignore_topic   100% 8 0 0   100% 4 0   100%
src / local_deep_research / news / preference_manager / base_preference.py BasePreferenceManager.boost_source   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / base_preference.py BasePreferenceManager.get_default_preferences   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / base_preference.py TopicRegistry.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / base_preference.py TopicRegistry.extract_topics   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / base_preference.py TopicRegistry.register_topic   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / base_preference.py TopicRegistry.get_trending_topics   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / base_preference.py TopicRegistry.get_topic_info   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / base_preference.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.__init__   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.session   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.create   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.get   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.update   100% 9 0 0   100% 6 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.delete   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.list   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.get_user_preferences   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.upsert_preferences   100% 11 0 0   83% 6 1   94%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.add_liked_item   100% 12 0 0   100% 6 0   100%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.add_disliked_item   100% 12 0 0   83% 6 1   94%
src / local_deep_research / news / preference_manager / storage.py SQLPreferenceStorage.update_preference_embedding   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / preference_manager / storage.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem.rate   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem.get_rating   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem.get_rating_type   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem.get_recent_ratings   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem.get_card_ratings   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem.remove_rating   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem._create_rating_record   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / base_rater.py BaseRatingSystem._validate_rating_value   100% 2 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / base_rater.py QualityRatingSystem.get_rating_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / base_rater.py QualityRatingSystem.rate   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / base_rater.py QualityRatingSystem._validate_rating_value   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / base_rater.py QualityRatingSystem.get_rating   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / base_rater.py RelevanceRatingSystem.get_rating_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / base_rater.py RelevanceRatingSystem.rate   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / base_rater.py RelevanceRatingSystem._validate_rating_value   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / base_rater.py RelevanceRatingSystem.get_rating   67% 3 1 0   50% 2 1   60%
src / local_deep_research / news / rating_system / base_rater.py (no function)   100% 37 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.__init__   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.session   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.create   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.get   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.update   100% 10 0 0   100% 6 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.delete   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.list   92% 13 1 0   90% 10 1   91%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.get_user_rating   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.upsert_rating   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.get_ratings_summary   90% 10 1 0   50% 2 1   83%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage.get_user_ratings   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / rating_system / storage.py SQLRatingStorage._get_rating_distribution   100% 5 0 0   100% 4 0   100%
src / local_deep_research / news / rating_system / storage.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender.set_progress_callback   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender._update_progress   100% 2 0 0   100% 2 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender.generate_recommendations   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender._get_user_preferences   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender._get_user_ratings   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender._execute_search   100% 11 0 0   100% 4 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender._filter_by_preferences   100% 11 0 0   100% 10 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender._sort_by_relevance   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender._sort_by_relevance.calculate_score   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / base_recommender.py BaseRecommender.get_strategy_info   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / base_recommender.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / topic_based.py TopicBasedRecommender.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / topic_based.py TopicBasedRecommender.generate_recommendations   100% 27 0 0   100% 4 0   100%
src / local_deep_research / news / recommender / topic_based.py TopicBasedRecommender._get_trending_topics   100% 12 0 0   100% 10 0   100%
src / local_deep_research / news / recommender / topic_based.py TopicBasedRecommender._filter_topics_by_preferences   100% 15 0 0   100% 8 0   100%
src / local_deep_research / news / recommender / topic_based.py TopicBasedRecommender._generate_topic_query   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / topic_based.py TopicBasedRecommender._create_recommendation_card   100% 30 0 0   83% 6 1   97%
src / local_deep_research / news / recommender / topic_based.py SearchBasedRecommender.generate_recommendations   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / recommender / topic_based.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / __init__.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.__init__   94% 17 1 0   50% 2 1   89%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription._calculate_next_refresh   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.should_refresh   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.is_due_for_refresh   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.generate_search_query   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.get_subscription_type   0% 1 1 0   100% 0 0   0%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.on_refresh_start   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.on_refresh_success   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.on_refresh_error   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.pause   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.resume   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.update_interval   100% 7 0 0   100% 4 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.save   75% 4 1 0   50% 2 1   67%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.mark_refreshed   89% 9 1 0   50% 2 1   82%
src / local_deep_research / news / subscription_manager / base_subscription.py BaseSubscription.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / base_subscription.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py SchedulerCredentialStore.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py SchedulerCredentialStore.store   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py SchedulerCredentialStore.retrieve   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py SchedulerCredentialStore.clear   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py DocumentSchedulerSettings.defaults   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.__new__   100% 5 0 0   75% 4 1   89%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.__init__   100% 13 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._load_default_config   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.initialize_with_settings   100% 6 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._get_setting   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.set_app   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._wrap_job   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._wrap_job.wrapper   60% 5 2 0   50% 2 1   57%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._get_document_scheduler_settings   93% 29 2 0   88% 8 1   92%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.invalidate_user_settings_cache   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.invalidate_all_settings_cache   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.start   93% 14 1 0   83% 6 1   90%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.stop   100% 8 0 0   100% 4 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.update_user_info   100% 20 0 0   100% 4 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.unregister_user   100% 13 0 0   100% 4 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._schedule_user_subscriptions   96% 52 2 0   94% 18 1   96%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._schedule_document_processing   100% 34 0 0   100% 6 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._process_user_documents   98% 122 2 0   97% 34 1   98%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.get_document_scheduler_status   100% 11 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.trigger_document_processing   100% 22 0 0   100% 6 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._check_user_overdue_subscriptions   100% 22 0 0   100% 8 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._check_subscription   95% 41 2 0   90% 10 1   94%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._trigger_subscription_research_sync   95% 37 2 0   83% 6 1   93%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._store_research_result   100% 51 0 0   100% 12 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._store_research_result.make_serializable   89% 9 1 0   88% 8 1   88%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._run_cleanup_with_tracking   100% 5 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._cleanup_inactive_users   100% 16 0 0   100% 4 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._reload_config   100% 15 0 0   100% 8 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.get_status   100% 9 0 0   75% 4 1   92%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler._estimate_memory_usage   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py NewsScheduler.get_user_sessions_summary   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py get_news_scheduler   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / scheduler.py (no function)   100% 72 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscription.__init__   100% 10 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscription.query   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscription.get_subscription_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscription.generate_search_query   100% 9 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscription._transform_to_news_query   100% 8 0 0   100% 6 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscription.evolve_query   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscription.get_statistics   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscription.to_dict   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscriptionFactory.from_user_search   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py SearchSubscriptionFactory.from_recommendation   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / search_subscription.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.session   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.create   100% 7 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.get   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.update   100% 12 0 0   100% 8 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.delete   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.list   87% 15 2 0   70% 10 3   80%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.get_active_subscriptions   100% 6 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.get_due_subscriptions   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.update_refresh_time   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.increment_stats   100% 9 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.pause_subscription   100% 7 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.resume_subscription   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / storage.py SQLSubscriptionStorage.expire_subscription   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / storage.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.__init__   100% 12 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.get_subscription_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.generate_search_query   100% 10 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.update_activity   100% 6 0 0   100% 4 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.evolve_topic   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.add_related_topic   100% 3 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.merge_with   100% 5 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.should_auto_expire   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.get_statistics   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscription.to_dict   100% 3 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscriptionFactory.from_news_extraction   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py TopicSubscriptionFactory.from_user_interest   100% 2 0 0   100% 0 0   100%
src / local_deep_research / news / subscription_manager / topic_subscription.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / news / utils / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / news / utils / headline_generator.py generate_headline   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / utils / headline_generator.py _generate_with_llm   100% 21 0 0   100% 4 0   100%
src / local_deep_research / news / utils / headline_generator.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / news / utils / topic_generator.py generate_topics   100% 4 0 0   100% 2 0   100%
src / local_deep_research / news / utils / topic_generator.py _generate_with_llm   100% 29 0 0   100% 10 0   100%
src / local_deep_research / news / utils / topic_generator.py _validate_topics   100% 18 0 0   100% 12 0   100%
src / local_deep_research / news / utils / topic_generator.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / news / web.py create_news_blueprint   100% 15 0 0   100% 0 0   100%
src / local_deep_research / news / web.py create_news_blueprint._show_all_strategies   83% 12 2 0   100% 2 0   86%
src / local_deep_research / news / web.py create_news_blueprint.news_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / web.py create_news_blueprint.subscriptions_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / news / web.py create_news_blueprint.new_subscription_page   100% 8 0 0   100% 2 0   100%
src / local_deep_research / news / web.py create_news_blueprint.edit_subscription_page   100% 18 0 0   100% 4 0   100%
src / local_deep_research / news / web.py create_news_blueprint.health_check   100% 8 0 0   100% 0 0   100%
src / local_deep_research / news / web.py load_user_settings   100% 9 0 0   100% 2 0   100%
src / local_deep_research / news / web.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / notifications / __init__.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / notifications / exceptions.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / notifications / manager.py NotificationManager.__init__   100% 15 0 0   100% 2 0   100%
src / local_deep_research / notifications / manager.py NotificationManager._get_setting   100% 1 0 0   100% 0 0   100%
src / local_deep_research / notifications / manager.py NotificationManager.send_notification   100% 27 0 0   100% 8 0   100%
src / local_deep_research / notifications / manager.py NotificationManager.test_service   100% 1 0 0   100% 0 0   100%
src / local_deep_research / notifications / manager.py NotificationManager._should_notify   100% 7 0 0   100% 0 0   100%
src / local_deep_research / notifications / manager.py NotificationManager._log_notification   100% 5 0 0   100% 0 0   100%
src / local_deep_research / notifications / manager.py RateLimiter.__init__   100% 8 0 0   100% 0 0   100%
src / local_deep_research / notifications / manager.py RateLimiter.set_user_limits   100% 3 0 0   100% 0 0   100%
src / local_deep_research / notifications / manager.py RateLimiter.get_user_limits   100% 2 0 0   100% 0 0   100%
src / local_deep_research / notifications / manager.py RateLimiter.is_allowed   100% 19 0 0   100% 6 0   100%
src / local_deep_research / notifications / manager.py RateLimiter._clean_old_entries   100% 6 0 0   100% 4 0   100%
src / local_deep_research / notifications / manager.py RateLimiter.reset   100% 5 0 0   100% 2 0   100%
src / local_deep_research / notifications / manager.py RateLimiter._cleanup_inactive_users_if_needed   100% 22 0 0   93% 14 1   97%
src / local_deep_research / notifications / manager.py (no function)   100% 26 0 0   100% 0 0   100%
src / local_deep_research / notifications / queue_helpers.py send_queue_notification   100% 13 0 0   100% 2 0   100%
src / local_deep_research / notifications / queue_helpers.py send_queue_failed_notification   100% 15 0 0   100% 4 0   100%
src / local_deep_research / notifications / queue_helpers.py send_queue_failed_notification_from_session   100% 10 0 0   100% 2 0   100%
src / local_deep_research / notifications / queue_helpers.py send_research_completed_notification_from_session   97% 34 1 0   100% 6 0   98%
src / local_deep_research / notifications / queue_helpers.py send_research_failed_notification_from_session   93% 28 2 0   75% 4 1   91%
src / local_deep_research / notifications / queue_helpers.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / notifications / service.py NotificationService.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / notifications / service.py NotificationService._send_with_retry   100% 9 0 0   100% 2 0   100%
src / local_deep_research / notifications / service.py NotificationService.send   95% 21 1 0   90% 10 1   94%
src / local_deep_research / notifications / service.py NotificationService.send_event   100% 5 0 0   100% 0 0   100%
src / local_deep_research / notifications / service.py NotificationService.test_service   100% 16 0 0   100% 6 0   100%
src / local_deep_research / notifications / service.py NotificationService._validate_url   100% 5 0 0   100% 4 0   100%
src / local_deep_research / notifications / service.py NotificationService.get_service_type   100% 4 0 0   100% 4 0   100%
src / local_deep_research / notifications / service.py (no function)   100% 24 0 0   100% 0 0   100%
src / local_deep_research / notifications / templates.py NotificationTemplate._get_jinja_env   100% 12 0 0   100% 4 0   100%
src / local_deep_research / notifications / templates.py NotificationTemplate.format   100% 25 0 0   100% 6 0   100%
src / local_deep_research / notifications / templates.py NotificationTemplate._get_fallback_template   100% 2 0 0   100% 0 0   100%
src / local_deep_research / notifications / templates.py NotificationTemplate.get_required_context   87% 23 3 0   88% 8 1   87%
src / local_deep_research / notifications / templates.py (no function)   100% 26 0 0   100% 0 0   100%
src / local_deep_research / notifications / url_builder.py build_notification_url   100% 22 0 0   100% 8 0   100%
src / local_deep_research / notifications / url_builder.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / report_generator.py get_report_generator   100% 1 0 0   100% 0 0   100%
src / local_deep_research / report_generator.py IntegratedReportGenerator.__init__   100% 13 0 0   100% 4 0   100%
src / local_deep_research / report_generator.py IntegratedReportGenerator.close   100% 3 0 0   100% 2 0   100%
src / local_deep_research / report_generator.py IntegratedReportGenerator.generate_report   100% 10 0 0   100% 6 0   100%
src / local_deep_research / report_generator.py IntegratedReportGenerator._determine_report_structure   100% 26 0 0   94% 16 1   98%
src / local_deep_research / report_generator.py IntegratedReportGenerator._truncate_at_sentence_boundary   100% 12 0 0   100% 8 0   100%
src / local_deep_research / report_generator.py IntegratedReportGenerator._build_previous_context   100% 7 0 0   100% 4 0   100%
src / local_deep_research / report_generator.py IntegratedReportGenerator._research_and_generate_sections   100% 59 0 0   88% 26 3   96%
src / local_deep_research / report_generator.py IntegratedReportGenerator._generate_sections   100% 1 0 0   100% 0 0   100%
src / local_deep_research / report_generator.py IntegratedReportGenerator._format_final_report   100% 20 0 0   100% 8 0   100%
src / local_deep_research / report_generator.py IntegratedReportGenerator._generate_error_report   100% 1 0 0   100% 0 0   100%
src / local_deep_research / report_generator.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / research_library / __init__.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / __init__.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / routes / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py _ValidationError.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py _validate_document_ids   100% 7 0 0   100% 4 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py delete_document   100% 9 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py delete_document_blob   100% 10 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py get_document_deletion_preview   89% 9 1 0   50% 2 1   82%
src / local_deep_research / research_library / deletion / routes / delete_routes.py remove_document_from_collection   67% 9 3 0   0% 2 0   55%
src / local_deep_research / research_library / deletion / routes / delete_routes.py delete_collection   100% 11 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py delete_collection_index   100% 9 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py get_collection_deletion_preview   89% 9 1 0   50% 2 1   82%
src / local_deep_research / research_library / deletion / routes / delete_routes.py delete_documents_bulk   100% 10 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py delete_documents_blobs_bulk   100% 10 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py remove_documents_from_collection_bulk   100% 10 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py get_bulk_deletion_preview   100% 12 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / routes / delete_routes.py (no function)   100% 43 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / services / __init__.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / services / bulk_deletion.py BulkDeletionService.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / services / bulk_deletion.py BulkDeletionService.delete_documents   100% 12 0 0   100% 4 0   100%
src / local_deep_research / research_library / deletion / services / bulk_deletion.py BulkDeletionService.delete_blobs   92% 13 1 0   83% 6 1   89%
src / local_deep_research / research_library / deletion / services / bulk_deletion.py BulkDeletionService.remove_documents_from_collection   100% 13 0 0   100% 6 0   100%
src / local_deep_research / research_library / deletion / services / bulk_deletion.py BulkDeletionService.get_bulk_preview   83% 18 3 0   67% 6 2   79%
src / local_deep_research / research_library / deletion / services / bulk_deletion.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / services / collection_deletion.py CollectionDeletionService.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / services / collection_deletion.py CollectionDeletionService.delete_collection   100% 31 0 0   88% 8 1   97%
src / local_deep_research / research_library / deletion / services / collection_deletion.py CollectionDeletionService.delete_collection_index_only   84% 25 4 0   100% 2 0   85%
src / local_deep_research / research_library / deletion / services / collection_deletion.py CollectionDeletionService.get_deletion_preview   100% 10 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / services / collection_deletion.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / services / document_deletion.py DocumentDeletionService.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / services / document_deletion.py DocumentDeletionService.delete_document   100% 35 0 0   100% 8 0   100%
src / local_deep_research / research_library / deletion / services / document_deletion.py DocumentDeletionService.delete_blob_only   100% 30 0 0   100% 10 0   100%
src / local_deep_research / research_library / deletion / services / document_deletion.py DocumentDeletionService.remove_from_collection   100% 36 0 0   100% 10 0   100%
src / local_deep_research / research_library / deletion / services / document_deletion.py DocumentDeletionService.get_deletion_preview   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / services / document_deletion.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / utils / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.delete_document_chunks   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.delete_collection_chunks   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.get_document_blob_size   100% 4 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.delete_document_blob   100% 7 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.delete_filesystem_file   100% 13 0 0   100% 6 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.delete_faiss_index_files   100% 19 0 0   100% 6 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.delete_rag_indices_for_collection   100% 10 0 0   100% 4 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.update_download_tracker   100% 14 0 0   100% 4 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.count_document_in_collections   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.get_document_collections   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.remove_from_faiss_index   70% 10 3 0   25% 4 1   57%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py CascadeHelper.delete_document_completely   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / deletion / utils / cascade_helper.py (no function)   100% 32 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / __init__.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / arxiv.py ArxivDownloader.can_handle   60% 5 2 0   100% 0 0   60%
src / local_deep_research / research_library / downloaders / arxiv.py ArxivDownloader.download   67% 3 1 0   50% 2 1   60%
src / local_deep_research / research_library / downloaders / arxiv.py ArxivDownloader.download_with_result   100% 21 0 0   100% 12 0   100%
src / local_deep_research / research_library / downloaders / arxiv.py ArxivDownloader._download_pdf   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / arxiv.py ArxivDownloader._download_text   100% 14 0 0   100% 8 0   100%
src / local_deep_research / research_library / downloaders / arxiv.py ArxivDownloader._extract_arxiv_id   100% 6 0 0   100% 4 0   100%
src / local_deep_research / research_library / downloaders / arxiv.py ArxivDownloader._fetch_from_arxiv_api   100% 37 0 0   86% 22 3   95%
src / local_deep_research / research_library / downloaders / arxiv.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.close   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.__del__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.__enter__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.__exit__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.can_handle   0% 1 1 0   100% 0 0   0%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.download   0% 1 1 0   100% 0 0   0%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.download_pdf   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.download_with_result   100% 4 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.download_text   71% 7 2 0   100% 2 0   78%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader._is_pdf_content   83% 6 1 0   75% 4 1   80%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader._download_pdf   91% 46 4 0   93% 14 1   92%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.extract_text_from_pdf   100% 15 0 0   100% 4 0   100%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader._fetch_text_from_api   0% 1 1 0   100% 0 0   0%
src / local_deep_research / research_library / downloaders / base.py BaseDownloader.get_metadata   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / base.py (no function)   100% 36 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / biorxiv.py BioRxivDownloader.can_handle   71% 7 2 0   100% 2 0   78%
src / local_deep_research / research_library / downloaders / biorxiv.py BioRxivDownloader.download   100% 3 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / biorxiv.py BioRxivDownloader.download_with_result   100% 26 0 0   100% 16 0   100%
src / local_deep_research / research_library / downloaders / biorxiv.py BioRxivDownloader._download_pdf   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / biorxiv.py BioRxivDownloader._download_text   100% 9 0 0   100% 6 0   100%
src / local_deep_research / research_library / downloaders / biorxiv.py BioRxivDownloader._convert_to_pdf_url   100% 5 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / biorxiv.py BioRxivDownloader._fetch_abstract_from_page   100% 24 0 0   100% 10 0   100%
src / local_deep_research / research_library / downloaders / biorxiv.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / direct_pdf.py DirectPDFDownloader.can_handle   94% 16 1 0   88% 8 1   92%
src / local_deep_research / research_library / downloaders / direct_pdf.py DirectPDFDownloader.download   100% 8 0 0   100% 6 0   100%
src / local_deep_research / research_library / downloaders / direct_pdf.py DirectPDFDownloader.download_with_result   100% 24 0 0   100% 14 0   100%
src / local_deep_research / research_library / downloaders / direct_pdf.py DirectPDFDownloader._download_pdf   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / direct_pdf.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / __init__.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / base.py BaseExtractor.extract   100% 0 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / base.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / justext_extractor.py JustextExtractor.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / justext_extractor.py JustextExtractor.extract   48% 25 13 0   50% 8 2   48%
src / local_deep_research / research_library / downloaders / extraction / justext_extractor.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py extract_metadata   69% 16 5 0   100% 2 0   72%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py metadata_to_text   77% 30 7 0   68% 28 5   72%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py _has_type   25% 8 6 0   12% 8 1   19%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py _format_product   93% 30 2 0   50% 20 10   76%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py _format_article   83% 18 3 0   42% 12 5   67%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py _format_software   83% 18 3 0   50% 12 6   70%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py _format_opengraph   94% 16 1 0   83% 6 1   91%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py _format_generic   0% 8 8 0   0% 4 0   0%
src / local_deep_research / research_library / downloaders / extraction / metadata_extractor.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / newspaper_extractor.py NewspaperExtractor.extract   61% 18 7 0   50% 2 1   60%
src / local_deep_research / research_library / downloaders / extraction / newspaper_extractor.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py _run_extractors_parallel   45% 11 6 0   100% 0 0   45%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py _count_boilerplate   75% 4 1 0   50% 2 1   67%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py _quality_score   100% 3 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py extract_content   90% 50 5 0   83% 30 5   88%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py extract_content_with_metadata   95% 20 1 0   92% 12 1   94%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py _try_specialized_downloader   0% 43 43 0   0% 16 0   0%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py fetch_and_extract   0% 17 17 0   0% 4 0   0%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py batch_fetch_and_extract   0% 29 29 0   0% 10 0   0%
src / local_deep_research / research_library / downloaders / extraction / pipeline.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / readability_extractor.py ReadabilityExtractor.extract   56% 18 8 0   67% 6 2   58%
src / local_deep_research / research_library / downloaders / extraction / readability_extractor.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / trafilatura_extractor.py TrafilaturaExtractor.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / extraction / trafilatura_extractor.py TrafilaturaExtractor.extract   46% 13 7 0   50% 2 1   47%
src / local_deep_research / research_library / downloaders / extraction / trafilatura_extractor.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / generic.py GenericDownloader.can_handle   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / generic.py GenericDownloader.download   88% 8 1 0   67% 6 2   79%
src / local_deep_research / research_library / downloaders / generic.py GenericDownloader.download_with_result   96% 48 2 0   100% 24 0   97%
src / local_deep_research / research_library / downloaders / generic.py GenericDownloader._download_pdf   89% 19 2 0   100% 6 0   92%
src / local_deep_research / research_library / downloaders / generic.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / html.py HTMLDownloader.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / html.py HTMLDownloader.can_handle   60% 5 2 0   100% 0 0   60%
src / local_deep_research / research_library / downloaders / html.py HTMLDownloader.download   100% 15 0 0   100% 6 0   100%
src / local_deep_research / research_library / downloaders / html.py HTMLDownloader.download_with_result   100% 16 0 0   100% 8 0   100%
src / local_deep_research / research_library / downloaders / html.py HTMLDownloader._fetch_html   100% 20 0 0   100% 4 0   100%
src / local_deep_research / research_library / downloaders / html.py HTMLDownloader._extract_content   73% 11 3 0   100% 2 0   77%
src / local_deep_research / research_library / downloaders / html.py HTMLDownloader._format_extracted_content   100% 13 0 0   100% 8 0   100%
src / local_deep_research / research_library / downloaders / html.py HTMLDownloader.get_metadata   87% 23 3 0   92% 12 1   89%
src / local_deep_research / research_library / downloaders / html.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / openalex.py OpenAlexDownloader.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / openalex.py OpenAlexDownloader.can_handle   60% 5 2 0   100% 0 0   60%
src / local_deep_research / research_library / downloaders / openalex.py OpenAlexDownloader.download   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / openalex.py OpenAlexDownloader.download_with_result   100% 14 0 0   100% 8 0   100%
src / local_deep_research / research_library / downloaders / openalex.py OpenAlexDownloader._extract_work_id   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / openalex.py OpenAlexDownloader._get_pdf_url   100% 45 0 0   94% 16 1   98%
src / local_deep_research / research_library / downloaders / openalex.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / playwright_html.py _run_async   0% 10 10 0   0% 2 0   0%
src / local_deep_research / research_library / downloaders / playwright_html.py PlaywrightHTMLDownloader.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / playwright_html.py PlaywrightHTMLDownloader._fetch_html   0% 4 4 0   0% 2 0   0%
src / local_deep_research / research_library / downloaders / playwright_html.py PlaywrightHTMLDownloader._fetch_with_crawl4ai   0% 32 32 0   0% 4 0   0%
src / local_deep_research / research_library / downloaders / playwright_html.py PlaywrightHTMLDownloader._fetch_with_crawl4ai._crawl   0% 2 2 0   100% 0 0   0%
src / local_deep_research / research_library / downloaders / playwright_html.py PlaywrightHTMLDownloader._fetch_with_playwright   0% 38 38 0   0% 6 0   0%
src / local_deep_research / research_library / downloaders / playwright_html.py PlaywrightHTMLDownloader.close   23% 13 10 0   50% 4 2   29%
src / local_deep_research / research_library / downloaders / playwright_html.py AutoHTMLDownloader.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / playwright_html.py AutoHTMLDownloader._get_playwright_downloader   67% 3 1 0   50% 2 1   60%
src / local_deep_research / research_library / downloaders / playwright_html.py AutoHTMLDownloader._has_spa_signals   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / playwright_html.py AutoHTMLDownloader._fetch_html   82% 11 2 0   100% 2 0   85%
src / local_deep_research / research_library / downloaders / playwright_html.py AutoHTMLDownloader.download   90% 21 2 0   62% 8 3   83%
src / local_deep_research / research_library / downloaders / playwright_html.py AutoHTMLDownloader.download_with_result   0% 21 21 0   0% 8 0   0%
src / local_deep_research / research_library / downloaders / playwright_html.py AutoHTMLDownloader.close   100% 4 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / playwright_html.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader.can_handle   86% 14 2 0   100% 8 0   91%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader.download   100% 4 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader.download_with_result   100% 7 0 0   100% 4 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._download_pdf_content   100% 10 0 0   100% 6 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._download_pdf_with_result   98% 64 1 0   89% 36 4   95%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._download_text   100% 21 0 0   88% 16 2   95%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._fetch_text_from_europe_pmc   100% 28 0 0   93% 14 1   98%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._apply_rate_limit   100% 7 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._download_pmc_direct   100% 9 0 0   100% 4 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._download_pubmed   84% 19 3 0   70% 10 1   79%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._download_europe_pmc   100% 5 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._try_europe_pmc_api   100% 17 0 0   100% 8 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._get_pmc_id_from_pmid   100% 23 0 0   92% 12 1   97%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._download_via_europe_pmc   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py PubMedDownloader._download_via_ncbi_pmc   100% 9 0 0   100% 4 0   100%
src / local_deep_research / research_library / downloaders / pubmed.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / semantic_scholar.py SemanticScholarDownloader.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / semantic_scholar.py SemanticScholarDownloader.can_handle   100% 5 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / semantic_scholar.py SemanticScholarDownloader.download   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / downloaders / semantic_scholar.py SemanticScholarDownloader.download_with_result   86% 14 2 0   75% 8 2   82%
src / local_deep_research / research_library / downloaders / semantic_scholar.py SemanticScholarDownloader._extract_paper_id   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / downloaders / semantic_scholar.py SemanticScholarDownloader._get_pdf_url   100% 28 0 0   90% 10 1   97%
src / local_deep_research / research_library / downloaders / semantic_scholar.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py handle_web_api_exception   100% 4 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / library_routes.py get_authenticated_user_password   100% 15 0 0   100% 4 0   100%
src / local_deep_research / research_library / routes / library_routes.py library_page   100% 26 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py document_details_page   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / library_routes.py download_manager_page   100% 22 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / library_routes.py get_library_stats   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py get_collections_list   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py get_documents   100% 11 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py toggle_favorite   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py delete_document   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py get_pdf_url   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py view_pdf_page   100% 17 0 0   100% 4 0   100%
src / local_deep_research / research_library / routes / library_routes.py serve_pdf_api   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py view_text_page   100% 11 0 0   100% 4 0   100%
src / local_deep_research / research_library / routes / library_routes.py serve_text_api   100% 11 0 0   100% 4 0   100%
src / local_deep_research / research_library / routes / library_routes.py open_folder   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py download_single_resource   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / library_routes.py download_text_single   93% 14 1 0   75% 4 1   89%
src / local_deep_research / research_library / routes / library_routes.py download_all_text   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py download_all_text.generate   85% 48 7 0   57% 14 2   79%
src / local_deep_research / research_library / routes / library_routes.py download_research_pdfs   100% 7 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py download_bulk   100% 10 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / library_routes.py download_bulk.generate   90% 81 8 0   83% 24 4   89%
src / local_deep_research / research_library / routes / library_routes.py get_research_list   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py sync_library   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / library_routes.py mark_for_redownload   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / library_routes.py queue_all_undownloaded   90% 52 5 0   81% 16 3   88%
src / local_deep_research / research_library / routes / library_routes.py get_research_sources   89% 18 2 0   100% 6 0   92%
src / local_deep_research / research_library / routes / library_routes.py check_downloads   100% 15 0 0   100% 6 0   100%
src / local_deep_research / research_library / routes / library_routes.py download_source   93% 28 2 0   92% 12 1   92%
src / local_deep_research / research_library / routes / library_routes.py (no function)   100% 106 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / rag_routes.py _get_auto_index_executor   100% 4 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / rag_routes.py _shutdown_auto_index_executor   100% 3 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / rag_routes.py get_rag_service   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / rag_routes.py get_supported_formats   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / rag_routes.py embedding_settings_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / rag_routes.py view_document_chunks   100% 17 0 0   83% 6 1   96%
src / local_deep_research / research_library / routes / rag_routes.py collections_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / rag_routes.py collection_details_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / rag_routes.py collection_upload_page   100% 5 0 0   100% 2 0   100%
src / local_deep_research / research_library / routes / rag_routes.py collection_create_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / rag_routes.py get_current_settings   100% 14 0 0   50% 2 1   94%
src / local_deep_research / research_library / routes / rag_routes.py test_embedding   100% 26 0 0   100% 4 0   100%
src / local_deep_research / research_library / routes / rag_routes.py get_available_models   100% 18 0 0   100% 4 0   100%
src / local_deep_research / research_library / routes / rag_routes.py get_index_info   87% 15 2 0   100% 4 0   89%
src / local_deep_research / research_library / routes / rag_routes.py get_rag_stats   80% 10 2 0   100% 2 0   83%
src / local_deep_research / research_library / routes / rag_routes.py index_document   88% 17 2 0   100% 6 0   91%
src / local_deep_research / research_library / routes / rag_routes.py remove_document   88% 16 2 0   83% 6 1   86%
src / local_deep_research / research_library / routes / rag_routes.py index_research   82% 11 2 0   100% 2 0   85%
src / local_deep_research / research_library / routes / rag_routes.py index_all   0% 11 11 0   0% 2 0   0%
src / local_deep_research / research_library / routes / rag_routes.py index_all.generate   0% 33 33 0   0% 12 0   0%
src / local_deep_research / research_library / routes / rag_routes.py configure_rag   100% 35 0 0   100% 6 0   100%
src / local_deep_research / research_library / routes / rag_routes.py get_documents   94% 35 2 0   100% 6 0   95%
src / local_deep_research / research_library / routes / rag_routes.py index_local_library   83% 18 3 0   83% 6 1   83%
src / local_deep_research / research_library / routes / rag_routes.py index_local_library.generate   0% 36 36 0   0% 12 0   0%
src / local_deep_research / research_library / routes / rag_routes.py get_collections   87% 15 2 0   100% 4 0   89%
src / local_deep_research / research_library / routes / rag_routes.py create_collection   89% 19 2 0   100% 4 0   91%
src / local_deep_research / research_library / routes / rag_routes.py update_collection   90% 21 2 0   88% 8 1   90%
src / local_deep_research / research_library / routes / rag_routes.py upload_to_collection   86% 117 16 0   90% 40 4   87%
src / local_deep_research / research_library / routes / rag_routes.py get_collection_documents   94% 34 2 0   92% 12 1   93%
src / local_deep_research / research_library / routes / rag_routes.py index_collection   100% 17 0 0   50% 2 1   95%
src / local_deep_research / research_library / routes / rag_routes.py index_collection.generate   85% 81 12 0   67% 24 4   81%
src / local_deep_research / research_library / routes / rag_routes.py index_collection.generate.index_in_thread   80% 10 2 0   100% 0 0   80%
src / local_deep_research / research_library / routes / rag_routes.py _get_rag_service_for_thread   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / rag_routes.py trigger_auto_index   100% 17 0 0   100% 4 0   100%
src / local_deep_research / research_library / routes / rag_routes.py _auto_index_documents_worker   100% 16 0 0   83% 6 1   95%
src / local_deep_research / research_library / routes / rag_routes.py _background_index_worker   100% 62 0 0   100% 18 0   100%
src / local_deep_research / research_library / routes / rag_routes.py _update_task_status   100% 20 0 0   100% 14 0   100%
src / local_deep_research / research_library / routes / rag_routes.py _is_task_cancelled   100% 8 0 0   100% 0 0   100%
src / local_deep_research / research_library / routes / rag_routes.py start_background_index   100% 27 0 0   83% 6 1   97%
src / local_deep_research / research_library / routes / rag_routes.py get_index_status   100% 19 0 0   83% 6 1   96%
src / local_deep_research / research_library / routes / rag_routes.py cancel_indexing   100% 23 0 0   83% 6 1   97%
src / local_deep_research / research_library / routes / rag_routes.py (no function)   100% 137 0 0   100% 0 0   100%
src / local_deep_research / research_library / search / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / search / routes / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / search / routes / search_routes.py get_research_history_collection   100% 26 0 0   50% 2 1   96%
src / local_deep_research / research_library / search / routes / search_routes.py convert_all_research   100% 15 0 0   50% 2 1   94%
src / local_deep_research / research_library / search / routes / search_routes.py add_research_to_collection   88% 26 3 0   75% 8 2   85%
src / local_deep_research / research_library / search / routes / search_routes.py search_collection   90% 39 4 0   79% 14 3   87%
src / local_deep_research / research_library / search / routes / search_routes.py _enrich_with_research_metadata   95% 22 1 0   83% 6 1   93%
src / local_deep_research / research_library / search / routes / search_routes.py _enrich_with_document_metadata   91% 22 2 0   100% 8 0   93%
src / local_deep_research / research_library / search / routes / search_routes.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / research_library / search / services / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / search / services / research_history_indexer.py ResearchHistoryIndexer.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / search / services / research_history_indexer.py ResearchHistoryIndexer.get_or_create_collection   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / search / services / research_history_indexer.py ResearchHistoryIndexer.index_research   100% 24 0 0   90% 10 1   97%
src / local_deep_research / research_library / search / services / research_history_indexer.py ResearchHistoryIndexer.convert_all_research   100% 29 0 0   100% 8 0   100%
src / local_deep_research / research_library / search / services / research_history_indexer.py ResearchHistoryIndexer._create_document_from_report   100% 20 0 0   100% 8 0   100%
src / local_deep_research / research_library / search / services / research_history_indexer.py ResearchHistoryIndexer._ensure_in_collection   100% 3 0 0   100% 2 0   100%
src / local_deep_research / research_library / search / services / research_history_indexer.py auto_convert_research   100% 6 0 0   100% 0 0   100%
src / local_deep_research / research_library / search / services / research_history_indexer.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.__init__   100% 19 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.close   100% 10 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.__enter__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.__exit__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._setup_directories   100% 3 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._normalize_url   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._get_url_hash   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.is_already_downloaded   100% 11 0 0   100% 6 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.get_text_content   100% 19 0 0   100% 8 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.queue_research_downloads   100% 25 0 0   92% 12 1   97%
src / local_deep_research / research_library / services / download_service.py DownloadService._is_downloadable   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.download_resource   97% 36 1 0   86% 14 2   94%
src / local_deep_research / research_library / services / download_service.py DownloadService._download_pdf   100% 94 0 0   95% 22 1   99%
src / local_deep_research / research_library / services / download_service.py DownloadService._extract_text_from_pdf   100% 23 0 0   100% 12 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService.download_as_text   85% 27 4 0   75% 16 4   81%
src / local_deep_research / research_library / services / download_service.py DownloadService._record_retry_attempt   67% 3 1 0   50% 2 1   60%
src / local_deep_research / research_library / services / download_service.py DownloadService._try_library_text_extraction   100% 38 0 0   94% 18 1   98%
src / local_deep_research / research_library / services / download_service.py DownloadService._try_existing_text   100% 8 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._try_legacy_text_file   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._try_existing_pdf_extraction   100% 26 0 0   100% 8 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._try_api_text_extraction   95% 22 1 0   88% 8 1   93%
src / local_deep_research / research_library / services / download_service.py DownloadService._fallback_pdf_extraction   100% 31 0 0   100% 6 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._get_downloader   100% 4 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._download_generic   100% 12 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._download_arxiv   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._try_europe_pmc   100% 22 0 0   83% 12 2   94%
src / local_deep_research / research_library / services / download_service.py DownloadService._download_pubmed   93% 98 7 0   64% 42 15   84%
src / local_deep_research / research_library / services / download_service.py DownloadService._download_semantic_scholar   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._download_biorxiv   100% 8 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._save_text_with_db   100% 42 0 0   100% 10 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._create_text_document_record   100% 16 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / download_service.py DownloadService._record_failed_text_extraction   100% 16 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / download_service.py (no function)   100% 61 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.__init__   100% 27 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.close   100% 10 0 0   100% 6 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.__enter__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.__exit__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.db_password   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.db_password   100% 5 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService._get_index_hash   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService._get_index_path   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService._deduplicate_chunks   100% 9 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService._get_or_create_rag_index   100% 14 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.load_or_create_faiss_index   97% 59 2 0   89% 18 2   95%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.get_current_index_info   100% 16 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.index_document   93% 72 5 0   77% 22 5   89%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.index_all_documents   100% 23 0 0   100% 12 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.remove_document_from_rag   100% 17 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.index_documents_batch   100% 26 0 0   100% 8 0   100%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.get_rag_stats   87% 15 2 0   75% 4 1   84%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.index_local_file   94% 51 3 0   82% 22 2   90%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.index_user_document   97% 39 1 0   88% 16 2   95%
src / local_deep_research / research_library / services / library_rag_service.py LibraryRAGService.remove_collection_from_index   100% 25 0 0   88% 8 1   97%
src / local_deep_research / research_library / services / library_rag_service.py (no function)   100% 40 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService._has_blob_in_db   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService._get_safe_absolute_path   100% 4 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService._is_arxiv_url   60% 5 2 0   100% 0 0   60%
src / local_deep_research / research_library / services / library_service.py LibraryService._is_pubmed_url   86% 14 2 0   100% 8 0   91%
src / local_deep_research / research_library / services / library_service.py LibraryService._apply_date_filter   0% 10 10 0   0% 6 0   0%
src / local_deep_research / research_library / services / library_service.py LibraryService._escape_like   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService._apply_domain_filter   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService._apply_search_filter   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_library_stats   100% 12 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.count_documents   0% 12 12 0   0% 8 0   0%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_documents   88% 52 6 0   77% 26 6   85%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_all_collections   100% 8 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_research_list_for_dropdown   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_research_list_with_stats   100% 19 0 0   100% 6 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_download_manager_summary_stats   100% 7 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_pdf_previews_batch   90% 40 4 0   88% 24 3   89%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_document_by_id   100% 14 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.toggle_favorite   100% 7 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.delete_document   100% 22 0 0   100% 10 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.open_file_location   100% 20 0 0   90% 10 1   97%
src / local_deep_research / research_library / services / library_service.py LibraryService.get_unique_domains   100% 4 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService._extract_domain   60% 5 2 0   100% 0 0   60%
src / local_deep_research / research_library / services / library_service.py LibraryService._get_url_hash   100% 5 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService._get_storage_path   100% 3 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.sync_library_with_filesystem   100% 22 0 0   100% 6 0   100%
src / local_deep_research / research_library / services / library_service.py LibraryService.mark_for_redownload   100% 14 0 0   83% 6 1   95%
src / local_deep_research / research_library / services / library_service.py (no function)   100% 44 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager.__init__   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager._get_safe_file_path   100% 12 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager.save_pdf   95% 22 1 0   88% 8 1   93%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager.load_pdf   100% 10 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager.has_pdf   100% 10 0 0   100% 6 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager.pdf_exists   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager._infer_storage_mode   100% 5 0 0   100% 4 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager._save_to_filesystem   100% 9 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager._save_to_database   100% 9 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager._load_from_filesystem   55% 11 5 0   75% 4 1   60%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager._load_from_database   100% 6 0 0   100% 2 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager._generate_filename   100% 14 0 0   100% 8 0   100%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager.delete_pdf   86% 21 3 0   88% 8 1   86%
src / local_deep_research / research_library / services / pdf_storage_manager.py PDFStorageManager.upgrade_to_pdf   76% 21 5 0   83% 6 1   78%
src / local_deep_research / research_library / services / pdf_storage_manager.py (no function)   100% 27 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / rag_service_factory.py get_rag_service   100% 33 0 0   100% 12 0   100%
src / local_deep_research / research_library / services / rag_service_factory.py get_rag_service._col   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / services / rag_service_factory.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / research_library / utils / __init__.py is_downloadable_domain   81% 21 4 0   92% 12 1   85%
src / local_deep_research / research_library / utils / __init__.py is_downloadable_url   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / utils / __init__.py get_document_for_resource   100% 3 0 0   100% 2 0   100%
src / local_deep_research / research_library / utils / __init__.py get_url_hash   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_library / utils / __init__.py get_library_storage_path   100% 10 0 0   100% 2 0   100%
src / local_deep_research / research_library / utils / __init__.py open_file_location   83% 18 3 0   75% 8 2   81%
src / local_deep_research / research_library / utils / __init__.py get_absolute_library_path   92% 13 1 0   75% 4 1   88%
src / local_deep_research / research_library / utils / __init__.py get_absolute_path_from_settings   94% 17 1 0   83% 6 1   91%
src / local_deep_research / research_library / utils / __init__.py handle_api_error   100% 2 0 0   100% 0 0   100%
src / local_deep_research / research_library / utils / __init__.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / research_scheduler / document_scheduler.py DocumentSchedulerUtil.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_scheduler / document_scheduler.py DocumentSchedulerUtil.get_status   100% 6 0 0   100% 0 0   100%
src / local_deep_research / research_scheduler / document_scheduler.py DocumentSchedulerUtil.trigger_manual_run   100% 9 0 0   100% 2 0   100%
src / local_deep_research / research_scheduler / document_scheduler.py get_document_scheduler   100% 3 0 0   100% 2 0   100%
src / local_deep_research / research_scheduler / document_scheduler.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / research_scheduler / routes.py get_current_username   100% 1 0 0   100% 0 0   100%
src / local_deep_research / research_scheduler / routes.py get_scheduler_status   90% 10 1 0   50% 2 1   83%
src / local_deep_research / research_scheduler / routes.py trigger_manual_run   92% 12 1 0   75% 4 1   88%
src / local_deep_research / research_scheduler / routes.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / search_system.py AdvancedSearchSystem.__init__   100% 44 0 0   94% 18 1   98%
src / local_deep_research / search_system.py AdvancedSearchSystem.close   100% 3 0 0   100% 2 0   100%
src / local_deep_research / search_system.py AdvancedSearchSystem._progress_callback   0% 3 3 0   0% 2 0   0%
src / local_deep_research / search_system.py AdvancedSearchSystem.set_progress_callback   100% 3 0 0   50% 2 1   80%
src / local_deep_research / search_system.py AdvancedSearchSystem.analyze_topic   100% 4 0 0   100% 2 0   100%
src / local_deep_research / search_system.py AdvancedSearchSystem._perform_search   100% 29 0 0   100% 6 0   100%
src / local_deep_research / search_system.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / search_system_factory.py _get_setting   100% 6 0 0   100% 4 0   100%
src / local_deep_research / search_system_factory.py create_strategy   96% 140 6 0   94% 82 5   95%
src / local_deep_research / search_system_factory.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / security / __init__.py (no function)   100% 26 0 0   100% 0 0   100%
src / local_deep_research / security / account_lockout.py AccountLockoutManager.__init__   100% 8 0 0   100% 4 0   100%
src / local_deep_research / security / account_lockout.py AccountLockoutManager.is_locked   100% 12 0 0   100% 6 0   100%
src / local_deep_research / security / account_lockout.py AccountLockoutManager._evict   100% 8 0 0   100% 4 0   100%
src / local_deep_research / security / account_lockout.py AccountLockoutManager.record_failure   100% 8 0 0   100% 4 0   100%
src / local_deep_research / security / account_lockout.py AccountLockoutManager.record_success   100% 4 0 0   100% 2 0   100%
src / local_deep_research / security / account_lockout.py get_account_lockout_manager   100% 5 0 0   75% 4 1   89%
src / local_deep_research / security / account_lockout.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / security / data_sanitizer.py DataSanitizer.sanitize   100% 8 0 0   100% 6 0   100%
src / local_deep_research / security / data_sanitizer.py DataSanitizer.redact   100% 8 0 0   100% 6 0   100%
src / local_deep_research / security / data_sanitizer.py sanitize_data   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / data_sanitizer.py redact_data   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / data_sanitizer.py filter_research_metadata   100% 9 0 0   100% 4 0   100%
src / local_deep_research / security / data_sanitizer.py strip_settings_snapshot   100% 9 0 0   100% 4 0   100%
src / local_deep_research / security / data_sanitizer.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / security / decorators.py require_json_body   100% 3 0 0   100% 0 0   100%
src / local_deep_research / security / decorators.py require_json_body.decorator   100% 2 0 0   100% 0 0   100%
src / local_deep_research / security / decorators.py require_json_body.decorator.wrapper   100% 8 0 0   100% 6 0   100%
src / local_deep_research / security / decorators.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / __init__.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / base_verifier.py BaseFileVerifier.should_verify   0% 1 1 0   100% 0 0   0%
src / local_deep_research / security / file_integrity / base_verifier.py BaseFileVerifier.get_file_type   0% 1 1 0   100% 0 0   0%
src / local_deep_research / security / file_integrity / base_verifier.py BaseFileVerifier.allows_modifications   0% 1 1 0   100% 0 0   0%
src / local_deep_research / security / file_integrity / base_verifier.py BaseFileVerifier.calculate_checksum   100% 5 0 0   100% 2 0   100%
src / local_deep_research / security / file_integrity / base_verifier.py BaseFileVerifier.get_algorithm   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / base_verifier.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.__init__   100% 11 0 0   100% 4 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager._normalize_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.register_verifier   100% 2 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.record_file   100% 23 0 0   100% 6 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.verify_file   100% 23 0 0   100% 8 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.update_checksum   100% 17 0 0   100% 6 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.get_file_stats   100% 5 0 0   100% 2 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.get_failure_history   100% 8 0 0   100% 4 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager._get_verifier_for_file   100% 4 0 0   100% 4 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager._needs_verification   100% 8 0 0   100% 6 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager._do_verification   100% 14 0 0   100% 6 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager._update_stats   100% 8 0 0   100% 2 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager._log_failure   100% 16 0 0   83% 6 1   95%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager._cleanup_old_failures   100% 6 0 0   100% 4 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager._check_global_cleanup_needed   100% 9 0 0   100% 4 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.cleanup_all_old_failures   100% 11 0 0   100% 4 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py FileIntegrityManager.get_total_failure_count   100% 2 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / integrity_manager.py (no function)   91% 32 3 0   100% 0 0   91%
src / local_deep_research / security / file_integrity / verifiers / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / verifiers / faiss_verifier.py FAISSIndexVerifier.should_verify   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / verifiers / faiss_verifier.py FAISSIndexVerifier.get_file_type   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / verifiers / faiss_verifier.py FAISSIndexVerifier.allows_modifications   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / file_integrity / verifiers / faiss_verifier.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / security / file_upload_validator.py FileUploadValidator.validate_file_size   100% 12 0 0   100% 8 0   100%
src / local_deep_research / security / file_upload_validator.py FileUploadValidator.validate_file_count   100% 5 0 0   100% 4 0   100%
src / local_deep_research / security / file_upload_validator.py FileUploadValidator.validate_mime_type   100% 5 0 0   100% 4 0   100%
src / local_deep_research / security / file_upload_validator.py FileUploadValidator.validate_pdf_structure   100% 11 0 0   100% 2 0   100%
src / local_deep_research / security / file_upload_validator.py FileUploadValidator.validate_upload   100% 10 0 0   100% 6 0   100%
src / local_deep_research / security / file_upload_validator.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / security / file_write_verifier.py _sanitize_sensitive_data   100% 11 0 0   100% 8 0   100%
src / local_deep_research / security / file_write_verifier.py write_file_verified   100% 15 0 0   100% 4 0   100%
src / local_deep_research / security / file_write_verifier.py write_json_verified   100% 5 0 0   100% 2 0   100%
src / local_deep_research / security / file_write_verifier.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / security / filename_sanitizer.py sanitize_filename   100% 19 0 0   100% 12 0   100%
src / local_deep_research / security / filename_sanitizer.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / security / ip_ranges.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / security / log_sanitizer.py strip_control_chars   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / log_sanitizer.py sanitize_for_log   100% 4 0 0   100% 2 0   100%
src / local_deep_research / security / log_sanitizer.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / security / module_whitelist.py validate_module_import   100% 13 0 0   100% 8 0   100%
src / local_deep_research / security / module_whitelist.py get_safe_module_class   100% 17 0 0   100% 4 0   100%
src / local_deep_research / security / module_whitelist.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / security / network_utils.py is_private_ip   100% 9 0 0   100% 4 0   100%
src / local_deep_research / security / network_utils.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / security / notification_validator.py NotificationURLValidator._is_private_ip   100% 7 0 0   100% 2 0   100%
src / local_deep_research / security / notification_validator.py NotificationURLValidator.validate_service_url   87% 23 3 0   93% 14 1   89%
src / local_deep_research / security / notification_validator.py NotificationURLValidator.validate_service_url_strict   100% 4 0 0   100% 2 0   100%
src / local_deep_research / security / notification_validator.py NotificationURLValidator.validate_multiple_urls   100% 10 0 0   100% 8 0   100%
src / local_deep_research / security / notification_validator.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / security / password_validator.py PasswordValidator.get_requirements   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / password_validator.py PasswordValidator.validate_strength   100% 8 0 0   100% 6 0   100%
src / local_deep_research / security / password_validator.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / security / path_validator.py PathValidator.validate_safe_path   75% 20 5 0   100% 8 0   82%
src / local_deep_research / security / path_validator.py PathValidator.validate_local_filesystem_path   100% 45 0 0   100% 34 0   100%
src / local_deep_research / security / path_validator.py PathValidator.sanitize_for_filesystem_ops   100% 7 0 0   100% 4 0   100%
src / local_deep_research / security / path_validator.py PathValidator.validate_model_path   100% 12 0 0   100% 8 0   100%
src / local_deep_research / security / path_validator.py PathValidator.validate_data_path   100% 4 0 0   100% 2 0   100%
src / local_deep_research / security / path_validator.py PathValidator.validate_config_path   100% 30 0 0   100% 22 0   100%
src / local_deep_research / security / path_validator.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / security / rate_limiter.py get_client_ip   100% 7 0 0   100% 4 0   100%
src / local_deep_research / security / rate_limiter.py get_current_username   100% 3 0 0   100% 2 0   100%
src / local_deep_research / security / rate_limiter.py _get_user_api_rate_limit   100% 16 0 0   83% 6 1   95%
src / local_deep_research / security / rate_limiter.py _get_api_rate_limit_string   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / rate_limiter.py _is_api_rate_limit_exempt   100% 3 0 0   100% 2 0   100%
src / local_deep_research / security / rate_limiter.py _get_api_user_key   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / rate_limiter.py _get_upload_user_key   100% 4 0 0   100% 2 0   100%
src / local_deep_research / security / rate_limiter.py (no function)   100% 28 0 0   100% 0 0   100%
src / local_deep_research / security / safe_requests.py _install_body_guard   100% 4 0 0   100% 0 0   100%
src / local_deep_research / security / safe_requests.py _install_body_guard.bounded_read   100% 6 0 0   100% 2 0   100%
src / local_deep_research / security / safe_requests.py _check_response_size   100% 24 0 0   100% 10 0   100%
src / local_deep_research / security / safe_requests.py _resolve_redirect_method   100% 7 0 0   100% 6 0   100%
src / local_deep_research / security / safe_requests.py safe_get   100% 35 0 0   93% 14 1   98%
src / local_deep_research / security / safe_requests.py safe_post   95% 41 2 0   94% 16 1   95%
src / local_deep_research / security / safe_requests.py SafeSession.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / security / safe_requests.py SafeSession.request   100% 5 0 0   100% 4 0   100%
src / local_deep_research / security / safe_requests.py SafeSession.send   100% 6 0 0   100% 2 0   100%
src / local_deep_research / security / safe_requests.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / security / security_headers.py SecurityHeaders.__init__   100% 2 0 0   100% 2 0   100%
src / local_deep_research / security / security_headers.py SecurityHeaders.init_app   100% 16 0 0   100% 2 0   100%
src / local_deep_research / security / security_headers.py SecurityHeaders.get_csp_policy   100% 2 0 0   100% 0 0   100%
src / local_deep_research / security / security_headers.py SecurityHeaders.get_permissions_policy   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / security_headers.py SecurityHeaders.add_security_headers   100% 19 0 0   100% 6 0   100%
src / local_deep_research / security / security_headers.py SecurityHeaders._is_api_route   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / security_headers.py SecurityHeaders._validate_cors_config   100% 8 0 0   100% 6 0   100%
src / local_deep_research / security / security_headers.py SecurityHeaders._add_cors_headers   100% 21 0 0   90% 10 1   97%
src / local_deep_research / security / security_headers.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / security / security_settings.py _load_security_settings   71% 7 2 0   100% 2 0   78%
src / local_deep_research / security / security_settings.py _convert_value   100% 11 0 0   100% 6 0   100%
src / local_deep_research / security / security_settings.py _validate_bounds   100% 8 0 0   100% 4 0   100%
src / local_deep_research / security / security_settings.py get_security_default   88% 17 2 0   80% 10 2   85%
src / local_deep_research / security / security_settings.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / security / ssrf_validator.py is_ip_blocked   100% 23 0 0   100% 16 0   100%
src / local_deep_research / security / ssrf_validator.py validate_url   82% 33 6 0   100% 10 0   86%
src / local_deep_research / security / ssrf_validator.py get_safe_url   100% 6 0 0   100% 4 0   100%
src / local_deep_research / security / ssrf_validator.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / security / url_builder.py normalize_bind_address   100% 3 0 0   100% 2 0   100%
src / local_deep_research / security / url_builder.py build_base_url_from_settings   100% 15 0 0   100% 4 0   100%
src / local_deep_research / security / url_builder.py build_full_url   100% 10 0 0   100% 4 0   100%
src / local_deep_research / security / url_builder.py validate_constructed_url   85% 13 2 0   100% 8 0   90%
src / local_deep_research / security / url_builder.py mask_sensitive_url   86% 14 2 0   100% 6 0   90%
src / local_deep_research / security / url_builder.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / security / url_validator.py URLValidator.is_unsafe_scheme   100% 8 0 0   100% 6 0   100%
src / local_deep_research / security / url_validator.py URLValidator.is_safe_url   90% 29 3 0   100% 20 0   94%
src / local_deep_research / security / url_validator.py URLValidator._has_suspicious_patterns   100% 6 0 0   100% 4 0   100%
src / local_deep_research / security / url_validator.py URLValidator.sanitize_url   87% 15 2 0   100% 8 0   91%
src / local_deep_research / security / url_validator.py URLValidator.is_academic_url   75% 8 2 0   100% 2 0   80%
src / local_deep_research / security / url_validator.py URLValidator.extract_doi   100% 6 0 0   100% 4 0   100%
src / local_deep_research / security / url_validator.py URLValidator.validate_http_url   76% 21 5 0   93% 14 1   83%
src / local_deep_research / security / url_validator.py URLValidator.is_safe_redirect_url   100% 27 0 0   100% 16 0   100%
src / local_deep_research / security / url_validator.py URLValidator.get_safe_redirect_path   92% 12 1 0   88% 8 1   90%
src / local_deep_research / security / url_validator.py get_javascript_url_validator   100% 1 0 0   100% 0 0   100%
src / local_deep_research / security / url_validator.py (no function)   100% 30 0 0   100% 0 0   100%
src / local_deep_research / settings / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / settings / base.py ISettingsManager.get_setting   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py ISettingsManager.set_setting   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py ISettingsManager.get_all_settings   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py ISettingsManager.create_or_update_setting   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py ISettingsManager.delete_setting   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py ISettingsManager.get_bool_setting   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py ISettingsManager.get_settings_snapshot   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py ISettingsManager.load_from_defaults_file   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py ISettingsManager.import_settings   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / base.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / settings / env_definitions / __init__.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / settings / env_definitions / bootstrap.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_definitions / db_config.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_definitions / news_scheduler.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_definitions / security.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / settings / env_definitions / server.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_definitions / testing.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / settings / env_registry.py _create_registry   100% 4 0 0   100% 2 0   100%
src / local_deep_research / settings / env_registry.py get_env_setting   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_registry.py is_test_mode   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_registry.py is_ci_environment   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_registry.py is_github_actions   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_registry.py is_rate_limiting_enabled   100% 8 0 0   100% 2 0   100%
src / local_deep_research / settings / env_registry.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py EnvSetting.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py EnvSetting.get_value   100% 6 0 0   100% 4 0   100%
src / local_deep_research / settings / env_settings.py EnvSetting._convert_value   0% 1 1 0   100% 0 0   0%
src / local_deep_research / settings / env_settings.py EnvSetting._get_raw_value   100% 9 0 0   100% 6 0   100%
src / local_deep_research / settings / env_settings.py EnvSetting.is_set   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py EnvSetting.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py BooleanSetting.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py BooleanSetting._convert_value   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py StringSetting.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py StringSetting._convert_value   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py IntegerSetting.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py IntegerSetting._convert_value   100% 10 0 0   100% 4 0   100%
src / local_deep_research / settings / env_settings.py PathSetting.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py PathSetting.get_value   86% 14 2 0   100% 6 0   90%
src / local_deep_research / settings / env_settings.py SecretSetting.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py SecretSetting.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py SecretSetting.__str__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py EnumSetting.__init__   100% 6 0 0   100% 2 0   100%
src / local_deep_research / settings / env_settings.py EnumSetting._convert_value   100% 8 0 0   100% 6 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.register_category   100% 3 0 0   100% 2 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.get   100% 9 0 0   100% 2 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.get_setting_object   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.is_env_only   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.get_env_var   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.get_all_env_vars   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.get_category_settings   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.get_bootstrap_vars   100% 5 0 0   100% 4 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.get_testing_vars   100% 4 0 0   100% 2 0   100%
src / local_deep_research / settings / env_settings.py SettingsRegistry.list_all_settings   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / env_settings.py (no function)   100% 47 0 0   100% 0 0   100%
src / local_deep_research / settings / logger.py log_settings   91% 11 1 0   75% 8 2   84%
src / local_deep_research / settings / logger.py redact_sensitive_keys   93% 15 1 0   90% 10 1   92%
src / local_deep_research / settings / logger.py create_settings_summary   100% 6 0 0   100% 2 0   100%
src / local_deep_research / settings / logger.py get_settings_log_level   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / logger.py (no function)   100% 21 0 0   100% 8 0   100%
src / local_deep_research / settings / manager.py parse_boolean   100% 11 0 0   100% 8 0   100%
src / local_deep_research / settings / manager.py _parse_number   100% 4 0 0   100% 2 0   100%
src / local_deep_research / settings / manager.py _parse_json_value   100% 9 0 0   100% 4 0   100%
src / local_deep_research / settings / manager.py _parse_multiselect   100% 13 0 0   88% 8 1   95%
src / local_deep_research / settings / manager.py _filter_setting_columns   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py _infer_ui_element   100% 9 0 0   100% 8 0   100%
src / local_deep_research / settings / manager.py get_typed_setting_value   100% 18 0 0   100% 8 0   100%
src / local_deep_research / settings / manager.py check_env_setting   100% 8 0 0   100% 4 0   100%
src / local_deep_research / settings / manager.py SettingsManager.__init__   100% 8 0 0   100% 2 0   100%
src / local_deep_research / settings / manager.py SettingsManager.close   0% 8 8 0   0% 2 0   0%
src / local_deep_research / settings / manager.py SettingsManager._ensure_settings_initialized   88% 8 1 0   75% 4 1   83%
src / local_deep_research / settings / manager.py SettingsManager._check_thread_safety   100% 3 0 0   100% 2 0   100%
src / local_deep_research / settings / manager.py SettingsManager.settings_locked   100% 9 0 0   100% 4 0   100%
src / local_deep_research / settings / manager.py SettingsManager.default_settings   84% 37 6 0   90% 10 1   85%
src / local_deep_research / settings / manager.py SettingsManager.__get_typed_setting_value   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py SettingsManager.__query_settings   100% 12 0 0   100% 8 0   100%
src / local_deep_research / settings / manager.py SettingsManager.get_setting   93% 27 2 0   94% 16 1   93%
src / local_deep_research / settings / manager.py SettingsManager.get_bool_setting   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py SettingsManager.set_setting   92% 39 3 0   90% 20 2   92%
src / local_deep_research / settings / manager.py SettingsManager.clear_cache   0% 2 2 0   100% 0 0   0%
src / local_deep_research / settings / manager.py SettingsManager.get_all_settings   84% 37 6 0   88% 16 2   85%
src / local_deep_research / settings / manager.py SettingsManager.get_settings_snapshot   70% 10 3 0   67% 6 2   69%
src / local_deep_research / settings / manager.py SettingsManager.create_or_update_setting   98% 46 1 0   95% 20 1   97%
src / local_deep_research / settings / manager.py SettingsManager.delete_setting   100% 12 0 0   100% 4 0   100%
src / local_deep_research / settings / manager.py SettingsManager.load_from_defaults_file   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py SettingsManager.db_version_matches_package   100% 3 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py SettingsManager.update_db_version   86% 7 1 0   50% 2 1   78%
src / local_deep_research / settings / manager.py SettingsManager.import_settings   96% 24 1 0   83% 18 3   90%
src / local_deep_research / settings / manager.py SettingsManager._create_setting   100% 17 0 0   100% 12 0   100%
src / local_deep_research / settings / manager.py SettingsManager._emit_settings_changed   89% 18 2 0   83% 6 1   88%
src / local_deep_research / settings / manager.py SettingsManager.get_bootstrap_env_vars   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py SettingsManager.is_bootstrap_env_var   100% 2 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py SettingsManager.is_env_only_setting   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py SettingsManager.get_env_var_for_setting   100% 1 0 0   100% 0 0   100%
src / local_deep_research / settings / manager.py SettingsManager.get_setting_key_for_env_var   100% 5 0 0   100% 2 0   100%
src / local_deep_research / settings / manager.py SnapshotSettingsContext.__init__   100% 8 0 0   100% 4 0   100%
src / local_deep_research / settings / manager.py SnapshotSettingsContext.get_setting   100% 4 0 0   100% 2 0   100%
src / local_deep_research / settings / manager.py (no function)   100% 64 0 0   100% 0 0   100%
src / local_deep_research / storage / __init__.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / storage / base.py ReportStorage.save_report   0% 1 1 0   100% 0 0   0%
src / local_deep_research / storage / base.py ReportStorage.get_report   0% 1 1 0   100% 0 0   0%
src / local_deep_research / storage / base.py ReportStorage.get_report_with_metadata   0% 1 1 0   100% 0 0   0%
src / local_deep_research / storage / base.py ReportStorage.delete_report   0% 1 1 0   100% 0 0   0%
src / local_deep_research / storage / base.py ReportStorage.list_reports   0% 1 1 0   100% 0 0   0%
src / local_deep_research / storage / base.py ReportStorage.report_exists   0% 1 1 0   100% 0 0   0%
src / local_deep_research / storage / base.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / storage / database.py DatabaseReportStorage.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / storage / database.py DatabaseReportStorage.save_report   100% 17 0 0   100% 6 0   100%
src / local_deep_research / storage / database.py DatabaseReportStorage.get_report   100% 8 0 0   100% 2 0   100%
src / local_deep_research / storage / database.py DatabaseReportStorage.get_report_with_metadata   62% 8 3 0   100% 2 0   70%
src / local_deep_research / storage / database.py DatabaseReportStorage.list_reports   100% 7 0 0   100% 0 0   100%
src / local_deep_research / storage / database.py DatabaseReportStorage.delete_report   100% 11 0 0   100% 2 0   100%
src / local_deep_research / storage / database.py DatabaseReportStorage.report_exists   100% 6 0 0   100% 0 0   100%
src / local_deep_research / storage / database.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / storage / database_with_file_backup.py DatabaseWithFileBackupStorage.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / storage / database_with_file_backup.py DatabaseWithFileBackupStorage.save_report   100% 12 0 0   100% 6 0   100%
src / local_deep_research / storage / database_with_file_backup.py DatabaseWithFileBackupStorage.get_report   100% 1 0 0   100% 0 0   100%
src / local_deep_research / storage / database_with_file_backup.py DatabaseWithFileBackupStorage.delete_report   100% 7 0 0   100% 2 0   100%
src / local_deep_research / storage / database_with_file_backup.py DatabaseWithFileBackupStorage.list_reports   100% 1 0 0   100% 0 0   100%
src / local_deep_research / storage / database_with_file_backup.py DatabaseWithFileBackupStorage.get_report_with_metadata   100% 1 0 0   100% 0 0   100%
src / local_deep_research / storage / database_with_file_backup.py DatabaseWithFileBackupStorage.report_exists   100% 1 0 0   100% 0 0   100%
src / local_deep_research / storage / database_with_file_backup.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / storage / factory.py get_report_storage   100% 9 0 0   100% 4 0   100%
src / local_deep_research / storage / factory.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / storage / file.py FileReportStorage.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / storage / file.py FileReportStorage._get_report_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / storage / file.py FileReportStorage._get_metadata_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / storage / file.py FileReportStorage.save_report   100% 12 0 0   100% 2 0   100%
src / local_deep_research / storage / file.py FileReportStorage.get_report   100% 9 0 0   100% 2 0   100%
src / local_deep_research / storage / file.py FileReportStorage.get_report_with_metadata   79% 14 3 0   100% 4 0   83%
src / local_deep_research / storage / file.py FileReportStorage.list_reports   100% 11 0 0   100% 2 0   100%
src / local_deep_research / storage / file.py FileReportStorage._load_metadata   100% 9 0 0   100% 2 0   100%
src / local_deep_research / storage / file.py FileReportStorage.delete_report   100% 13 0 0   100% 4 0   100%
src / local_deep_research / storage / file.py FileReportStorage.report_exists   100% 1 0 0   100% 0 0   100%
src / local_deep_research / storage / file.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py find_sources_section   100% 5 0 0   100% 4 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._create_source_word_replacer   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._create_source_word_replacer.replace_source_word   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._create_citation_formatter   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._create_citation_formatter.formatter   100% 4 0 0   100% 2 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._replace_comma_citations   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._replace_comma_citations._replacer   100% 7 0 0   100% 4 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter.format_document   94% 18 1 0   92% 12 1   93%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._find_sources_section   100% 1 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._parse_sources   100% 10 0 0   100% 4 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_number_hyperlinks   100% 7 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_number_hyperlinks.format_number_link   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_number_hyperlinks.replace_citation   100% 1 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_hyperlinks   100% 7 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_hyperlinks.format_domain_link   100% 3 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_hyperlinks.replace_citation   100% 1 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_id_hyperlinks   100% 20 0 0   92% 12 1   97%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_id_hyperlinks.format_domain_id_link   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_id_hyperlinks.replace_citation   100% 1 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_id_always_hyperlinks   100% 17 0 0   90% 10 1   96%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_id_always_hyperlinks.format_domain_id_link   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._format_domain_id_always_hyperlinks.replace_citation   100% 1 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._to_superscript   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py CitationFormatter._extract_domain   93% 15 1 0   100% 8 0   96%
src / local_deep_research / text_optimization / citation_formatter.py QuartoExporter.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py QuartoExporter.export_to_quarto   100% 14 0 0   100% 2 0   100%
src / local_deep_research / text_optimization / citation_formatter.py QuartoExporter.export_to_quarto.replace_comma_citations   100% 4 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py QuartoExporter.export_to_quarto.replace_citation   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py QuartoExporter._generate_bibliography   100% 17 0 0   100% 4 0   100%
src / local_deep_research / text_optimization / citation_formatter.py RISExporter.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py RISExporter.export_to_ris   100% 43 0 0   83% 24 4   94%
src / local_deep_research / text_optimization / citation_formatter.py RISExporter._create_ris_entry   97% 66 2 0   100% 30 0   98%
src / local_deep_research / text_optimization / citation_formatter.py LaTeXExporter.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py LaTeXExporter.export_to_latex   100% 26 0 0   100% 14 0   100%
src / local_deep_research / text_optimization / citation_formatter.py LaTeXExporter._create_latex_header   100% 1 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py LaTeXExporter._create_latex_footer   100% 1 0 0   100% 0 0   100%
src / local_deep_research / text_optimization / citation_formatter.py LaTeXExporter._escape_latex   100% 4 0 0   100% 2 0   100%
src / local_deep_research / text_optimization / citation_formatter.py LaTeXExporter._convert_lists   100% 17 0 0   100% 10 0   100%
src / local_deep_research / text_optimization / citation_formatter.py LaTeXExporter._create_bibliography   100% 16 0 0   100% 6 0   100%
src / local_deep_research / text_optimization / citation_formatter.py (no function)   100% 42 0 0   100% 0 0   100%
src / local_deep_research / text_processing / __init__.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / text_processing / text_cleaner.py remove_surrogates   100% 7 0 0   100% 2 0   100%
src / local_deep_research / text_processing / text_cleaner.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / utilities / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / utilities / db_utils.py get_db_session   100% 24 0 0   100% 12 0   100%
src / local_deep_research / utilities / db_utils.py get_settings_manager   70% 33 10 0   61% 18 3   67%
src / local_deep_research / utilities / db_utils.py no_db_settings   100% 3 0 0   100% 0 0   100%
src / local_deep_research / utilities / db_utils.py no_db_settings.wrapper   100% 6 0 0   100% 0 0   100%
src / local_deep_research / utilities / db_utils.py get_setting_from_db_main_thread   89% 18 2 0   100% 4 0   91%
src / local_deep_research / utilities / db_utils.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / utilities / enums.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.__init__   100% 16 0 0   100% 6 0   100%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.close   100% 2 0 0   100% 0 0   100%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.create_index   100% 14 0 0   100% 6 0   100%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.delete_index   100% 10 0 0   100% 2 0   100%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.index_document   100% 7 0 0   100% 0 0   100%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.bulk_index_documents   100% 13 0 0   100% 4 0   100%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.index_file   95% 22 1 0   50% 4 2   88%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.index_directory   84% 19 3 0   100% 6 0   88%
src / local_deep_research / utilities / es_utils.py ElasticsearchManager.search   100% 8 0 0   100% 2 0   100%
src / local_deep_research / utilities / es_utils.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / utilities / formatting.py human_size   100% 5 0 0   100% 4 0   100%
src / local_deep_research / utilities / formatting.py (no function)   100% 1 0 0   100% 0 0   100%
src / local_deep_research / utilities / json_utils.py get_llm_response_text   100% 10 0 0   100% 8 0   100%
src / local_deep_research / utilities / json_utils.py extract_json   100% 39 0 0   88% 24 3   95%
src / local_deep_research / utilities / json_utils.py _remove_think_tags   100% 4 0 0   100% 0 0   100%
src / local_deep_research / utilities / json_utils.py _strip_code_fences   100% 9 0 0   88% 8 1   94%
src / local_deep_research / utilities / json_utils.py _extract_by_brackets   100% 5 0 0   100% 2 0   100%
src / local_deep_research / utilities / json_utils.py _clean_llm_json_artifacts   100% 4 0 0   100% 0 0   100%
src / local_deep_research / utilities / json_utils.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / utilities / llm_utils.py _close_base_llm   100% 11 0 0   100% 8 0   100%
src / local_deep_research / utilities / llm_utils.py get_ollama_base_url   100% 3 0 0   100% 0 0   100%
src / local_deep_research / utilities / llm_utils.py get_server_url   100% 19 0 0   100% 10 0   100%
src / local_deep_research / utilities / llm_utils.py fetch_ollama_models   100% 17 0 0   100% 6 0   100%
src / local_deep_research / utilities / llm_utils.py get_model   77% 57 13 0   100% 16 0   82%
src / local_deep_research / utilities / llm_utils.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / utilities / log_utils.py InterceptHandler.emit   100% 14 0 0   75% 4 1   94%
src / local_deep_research / utilities / log_utils.py log_for_research   100% 3 0 0   100% 0 0   100%
src / local_deep_research / utilities / log_utils.py log_for_research.wrapped   100% 4 0 0   100% 0 0   100%
src / local_deep_research / utilities / log_utils.py _get_research_id   100% 6 0 0   100% 4 0   100%
src / local_deep_research / utilities / log_utils.py _process_log_queue   73% 15 4 0   100% 6 0   81%
src / local_deep_research / utilities / log_utils.py _write_log_to_database   100% 10 0 0   50% 2 1   92%
src / local_deep_research / utilities / log_utils.py database_sink   100% 9 0 0   100% 2 0   100%
src / local_deep_research / utilities / log_utils.py frontend_progress_sink   100% 6 0 0   100% 2 0   100%
src / local_deep_research / utilities / log_utils.py flush_log_queue   100% 12 0 0   100% 4 0   100%
src / local_deep_research / utilities / log_utils.py config_logger   100% 20 0 0   100% 4 0   100%
src / local_deep_research / utilities / log_utils.py config_logger._sanitize_record   0% 1 1 0   100% 0 0   0%
src / local_deep_research / utilities / log_utils.py (no function)   100% 31 0 0   100% 0 0   100%
src / local_deep_research / utilities / resource_utils.py safe_close   100% 12 0 0   100% 8 0   100%
src / local_deep_research / utilities / resource_utils.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache.__init__   100% 15 0 0   100% 2 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache._init_db   100% 6 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache._normalize_query   100% 2 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache._get_query_hash   100% 7 0 0   100% 2 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache._cleanup_expired   100% 9 0 0   50% 2 1   91%
src / local_deep_research / utilities / search_cache.py SearchCache._evict_lru_memory   100% 7 0 0   100% 4 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache.get   100% 27 0 0   100% 6 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache.put   100% 26 0 0   100% 4 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache.get_or_fetch   95% 58 3 0   85% 20 3   92%
src / local_deep_research / utilities / search_cache.py SearchCache.invalidate   100% 12 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache.clear_all   100% 11 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache.dispose   100% 7 0 0   100% 2 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache.__del__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_cache.py SearchCache.get_stats   100% 12 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_cache.py get_search_cache   100% 5 0 0   75% 4 1   89%
src / local_deep_research / utilities / search_cache.py _dispose_global_cache   100% 3 0 0   100% 2 0   100%
src / local_deep_research / utilities / search_cache.py normalize_entity_query   100% 3 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_cache.py (no function)   100% 36 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_utilities.py remove_think_tags   100% 4 0 0   100% 0 0   100%
src / local_deep_research / utilities / search_utilities.py extract_links_from_search_results   100% 17 0 0   100% 6 0   100%
src / local_deep_research / utilities / search_utilities.py format_links_to_markdown   100% 26 0 0   100% 16 0   100%
src / local_deep_research / utilities / search_utilities.py format_findings   95% 75 4 0   100% 32 0   96%
src / local_deep_research / utilities / search_utilities.py print_search_results   100% 5 0 0   100% 2 0   100%
src / local_deep_research / utilities / search_utilities.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / utilities / setup_utils.py setup_user_directories   0% 2 2 0   100% 0 0   0%
src / local_deep_research / utilities / setup_utils.py (no function)   0% 1 1 0   100% 0 0   0%
src / local_deep_research / utilities / thread_context.py set_search_context   100% 3 0 0   100% 2 0   100%
src / local_deep_research / utilities / thread_context.py clear_search_context   100% 2 0 0   100% 2 0   100%
src / local_deep_research / utilities / thread_context.py get_search_context   100% 4 0 0   100% 2 0   100%
src / local_deep_research / utilities / thread_context.py search_context   100% 4 0 0   100% 0 0   100%
src / local_deep_research / utilities / thread_context.py preserve_research_context   100% 4 0 0   100% 0 0   100%
src / local_deep_research / utilities / thread_context.py preserve_research_context.wrapper   100% 11 0 0   100% 2 0   100%
src / local_deep_research / utilities / thread_context.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / utilities / threading_utils.py thread_specific_cache   100% 2 0 0   100% 0 0   100%
src / local_deep_research / utilities / threading_utils.py thread_specific_cache._key_func   100% 6 0 0   100% 2 0   100%
src / local_deep_research / utilities / threading_utils.py thread_with_app_context   100% 3 0 0   100% 0 0   100%
src / local_deep_research / utilities / threading_utils.py thread_with_app_context._run_with_context   100% 4 0 0   100% 2 0   100%
src / local_deep_research / utilities / threading_utils.py thread_context   100% 15 0 0   100% 4 0   100%
src / local_deep_research / utilities / threading_utils.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / utilities / type_utils.py to_bool   100% 7 0 0   100% 6 0   100%
src / local_deep_research / utilities / type_utils.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / utilities / url_utils.py normalize_url   100% 16 0 0   100% 10 0   100%
src / local_deep_research / utilities / url_utils.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / web / api.py api_access_control   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / api.py api_access_control.decorated_function   100% 13 0 0   100% 6 0   100%
src / local_deep_research / web / api.py api_documentation   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / api.py health_check   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / api.py api_quick_summary_test   100% 12 0 0   100% 2 0   100%
src / local_deep_research / web / api.py _serialize_results   100% 5 0 0   100% 4 0   100%
src / local_deep_research / web / api.py api_quick_summary   89% 54 6 0   79% 14 3   87%
src / local_deep_research / web / api.py api_generate_report   100% 22 0 0   100% 4 0   100%
src / local_deep_research / web / api.py api_analyze_documents   100% 12 0 0   100% 2 0   100%
src / local_deep_research / web / api.py (no function)   100% 39 0 0   100% 0 0   100%
src / local_deep_research / web / app.py main   100% 30 0 0   100% 4 0   100%
src / local_deep_research / web / app.py main.flush_logs_on_exit   100% 7 0 0   100% 0 0   100%
src / local_deep_research / web / app.py main.shutdown_scheduler   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web / app.py main.shutdown_databases   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / app.py (no function)   90% 10 1 0   50% 2 1   83%
src / local_deep_research / web / app_factory.py _is_private_ip   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py create_app   91% 147 13 0   83% 12 2   91%
src / local_deep_research / web / app_factory.py create_app.SecureCookieMiddleware.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py create_app.SecureCookieMiddleware.__call__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py create_app.SecureCookieMiddleware.__call__.custom_start_response   100% 9 0 0   88% 8 1   94%
src / local_deep_research / web / app_factory.py create_app.SecureCookieMiddleware._should_add_secure_flag   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web / app_factory.py create_app.ServerHeaderMiddleware.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py create_app.ServerHeaderMiddleware.__call__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py create_app.ServerHeaderMiddleware.__call__.custom_start_response   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py create_app.ratelimit_handler   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py apply_middleware   100% 31 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py apply_middleware.inject_frontend_constants   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py apply_middleware.cleanup_db_session   81% 21 4 0   100% 2 0   83%
src / local_deep_research / web / app_factory.py apply_middleware.handle_websocket_requests   100% 8 0 0   75% 4 1   92%
src / local_deep_research / web / app_factory.py register_blueprints   100% 67 0 0   83% 6 1   99%
src / local_deep_research / web / app_factory.py register_blueprints.index   100% 17 0 0   75% 4 1   95%
src / local_deep_research / web / app_factory.py register_blueprints.favicon   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py register_blueprints.app_serve_static   33% 36 24 0   25% 12 3   31%
src / local_deep_research / web / app_factory.py register_error_handlers   83% 23 4 0   100% 0 0   83%
src / local_deep_research / web / app_factory.py register_error_handlers.not_found   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / app_factory.py register_error_handlers.server_error   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / app_factory.py register_error_handlers.handle_unauthorized   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / app_factory.py register_error_handlers.handle_request_too_large   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / app_factory.py register_error_handlers.handle_web_api_exception   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py register_error_handlers.handle_csrf_error   100% 8 0 0   100% 2 0   100%
src / local_deep_research / web / app_factory.py register_error_handlers.handle_news_api_exception   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py create_database   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / app_factory.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / web / auth / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / auth / cleanup_middleware.py cleanup_completed_research   94% 33 2 0   100% 14 0   96%
src / local_deep_research / web / auth / cleanup_middleware.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / auth / connection_cleanup.py _count_open_fds   25% 16 12 0   25% 4 1   25%
src / local_deep_research / web / auth / connection_cleanup.py cleanup_idle_connections   70% 60 18 0   60% 20 4   68%
src / local_deep_research / web / auth / connection_cleanup.py start_connection_cleanup_scheduler   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web / auth / connection_cleanup.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / web / auth / database_middleware.py ensure_user_database   100% 38 0 0   92% 26 2   97%
src / local_deep_research / web / auth / database_middleware.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web / auth / decorators.py _safe_redirect_to_login   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / auth / decorators.py login_required   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / auth / decorators.py login_required.decorated_function   100% 13 0 0   100% 8 0   100%
src / local_deep_research / web / auth / decorators.py current_user   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / auth / decorators.py get_current_db_session   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / auth / decorators.py inject_current_user   100% 11 0 0   100% 6 0   100%
src / local_deep_research / web / auth / decorators.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / web / auth / middleware_optimizer.py should_skip_database_middleware   100% 12 0 0   100% 10 0   100%
src / local_deep_research / web / auth / middleware_optimizer.py should_skip_queue_checks   100% 5 0 0   100% 4 0   100%
src / local_deep_research / web / auth / middleware_optimizer.py should_skip_session_cleanup   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / auth / middleware_optimizer.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / auth / password_utils.py get_user_password   100% 16 0 0   100% 10 0   100%
src / local_deep_research / web / auth / password_utils.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / auth / queue_middleware.py process_pending_queue_operations   90% 20 2 0   100% 10 0   93%
src / local_deep_research / web / auth / queue_middleware.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / auth / queue_middleware_v2.py notify_queue_processor   100% 14 0 0   100% 8 0   100%
src / local_deep_research / web / auth / queue_middleware_v2.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web / auth / routes.py get_csrf_token   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / auth / routes.py login_page   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web / auth / routes.py login   93% 41 3 0   80% 10 2   90%
src / local_deep_research / web / auth / routes.py _perform_post_login_tasks   90% 59 6 0   80% 10 2   88%
src / local_deep_research / web / auth / routes.py validate_password   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / auth / routes.py register_page   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web / auth / routes.py register   82% 76 14 0   92% 24 2   84%
src / local_deep_research / web / auth / routes.py logout   89% 19 2 0   67% 6 2   84%
src / local_deep_research / web / auth / routes.py check_auth   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / auth / routes.py change_password_page   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / auth / routes.py change_password   85% 48 7 0   80% 20 4   84%
src / local_deep_research / web / auth / routes.py integrity_check   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web / auth / routes.py (no function)   100% 46 0 0   100% 0 0   100%
src / local_deep_research / web / auth / session_cleanup.py cleanup_stale_sessions   100% 15 0 0   100% 10 0   100%
src / local_deep_research / web / auth / session_cleanup.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.create_session   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.validate_session   100% 13 0 0   100% 4 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.destroy_session   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.destroy_all_user_sessions   100% 7 0 0   100% 4 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.cleanup_expired_sessions   100% 11 0 0   100% 8 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.get_active_sessions_count   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.get_user_sessions   100% 6 0 0   100% 4 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.get_active_usernames   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / auth / session_manager.py SessionManager.has_active_sessions_for   100% 9 0 0   100% 6 0   100%
src / local_deep_research / web / auth / session_manager.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / web / database / benchmark_schema.py create_benchmark_tables_simple   100% 11 0 0   100% 6 0   100%
src / local_deep_research / web / database / benchmark_schema.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / web / exceptions.py WebAPIException.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web / exceptions.py WebAPIException.to_dict   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / exceptions.py AuthenticationRequiredError.__init__   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / exceptions.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / models / database.py get_db_connection   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / models / database.py calculate_duration   100% 49 0 0   90% 10 1   98%
src / local_deep_research / web / models / database.py get_logs_for_research   100% 11 0 0   100% 2 0   100%
src / local_deep_research / web / models / database.py get_total_logs_for_research   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / models / database.py (no function)   100% 16 0 0   50% 2 1   94%
src / local_deep_research / web / models / settings.py LLMSetting.validate_llm_key   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / models / settings.py SearchSetting.validate_search_key   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / models / settings.py ReportSetting.validate_report_key   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / models / settings.py AppSetting.validate_app_key   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / models / settings.py (no function)   100% 32 0 0   100% 0 0   100%
src / local_deep_research / web / queue / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / queue / manager.py QueueManager.add_to_queue   100% 19 0 0   100% 0 0   100%
src / local_deep_research / web / queue / manager.py QueueManager.get_queue_position   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web / queue / manager.py QueueManager.remove_from_queue   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web / queue / manager.py QueueManager.get_user_queue   100% 8 0 0   100% 4 0   100%
src / local_deep_research / web / queue / manager.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.__init__   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.start   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.stop   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.notify_user_activity   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.notify_research_queued   100% 31 0 0   92% 12 1   98%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2._start_research_directly   95% 38 2 0   50% 4 2   90%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.notify_research_completed   100% 10 0 0   100% 0 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.notify_research_failed   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2._process_queue_loop   87% 30 4 0   100% 10 0   90%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2._process_user_queue   85% 27 4 0   88% 8 1   86%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2._start_queued_researches   100% 15 0 0   100% 2 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2._start_research   100% 17 0 0   100% 4 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.process_user_request   100% 16 0 0   83% 6 1   95%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.queue_progress_update   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.queue_error_update   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / queue / processor_v2.py QueueProcessorV2.process_pending_operations_for_user   100% 38 0 0   83% 18 3   95%
src / local_deep_research / web / queue / processor_v2.py (no function)   100% 34 0 0   100% 0 0   100%
src / local_deep_research / web / routes / api_routes.py get_current_config   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / routes / api_routes.py api_start_research   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / api_routes.py api_research_status   79% 14 3 0   50% 6 1   70%
src / local_deep_research / web / routes / api_routes.py api_terminate_research   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web / routes / api_routes.py api_get_resources   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / routes / api_routes.py api_add_resource   100% 23 0 0   100% 6 0   100%
src / local_deep_research / web / routes / api_routes.py api_delete_resource   100% 8 0 0   100% 2 0   100%
src / local_deep_research / web / routes / api_routes.py check_ollama_status   100% 34 0 0   100% 6 0   100%
src / local_deep_research / web / routes / api_routes.py check_ollama_model   100% 51 0 0   100% 12 0   100%
src / local_deep_research / web / routes / api_routes.py api_get_config   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / api_routes.py (no function)   100% 47 0 0   100% 0 0   100%
src / local_deep_research / web / routes / context_overflow_api.py get_context_overflow_metrics   100% 72 0 0   96% 28 1   99%
src / local_deep_research / web / routes / context_overflow_api.py get_research_context_overflow   100% 30 0 0   100% 10 0   100%
src / local_deep_research / web / routes / context_overflow_api.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py is_research_active   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py get_active_research_ids   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py get_active_research_snapshot   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web / routes / globals.py get_research_field   100% 10 0 0   100% 6 0   100%
src / local_deep_research / web / routes / globals.py set_active_research   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py update_active_research   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / routes / globals.py append_research_log   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / routes / globals.py update_progress_if_higher   100% 9 0 0   100% 4 0   100%
src / local_deep_research / web / routes / globals.py remove_active_research   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py iter_active_research   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / routes / globals.py get_active_research_count   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py get_usernames_with_active_research   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py is_termination_requested   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py set_termination_flag   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py clear_termination_flag   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py is_research_thread_alive   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web / routes / globals.py update_progress_and_check_active   100% 9 0 0   100% 4 0   100%
src / local_deep_research / web / routes / globals.py cleanup_research   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / routes / globals.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / web / routes / history_routes.py history_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / history_routes.py get_history   100% 28 0 0   100% 4 0   100%
src / local_deep_research / web / routes / history_routes.py get_research_status   100% 24 0 0   100% 6 0   100%
src / local_deep_research / web / routes / history_routes.py get_research_details   100% 24 0 0   100% 4 0   100%
src / local_deep_research / web / routes / history_routes.py get_report   100% 20 0 0   100% 4 0   100%
src / local_deep_research / web / routes / history_routes.py get_markdown   100% 16 0 0   100% 4 0   100%
src / local_deep_research / web / routes / history_routes.py get_research_logs   100% 14 0 0   100% 4 0   100%
src / local_deep_research / web / routes / history_routes.py get_log_count   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / history_routes.py (no function)   100% 41 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py _extract_domain   100% 8 0 0   100% 2 0   100%
src / local_deep_research / web / routes / metrics_routes.py get_rating_analytics   100% 24 0 0   100% 10 0   100%
src / local_deep_research / web / routes / metrics_routes.py get_link_analytics   97% 91 3 0   92% 48 4   95%
src / local_deep_research / web / routes / metrics_routes.py get_strategy_analytics   100% 31 0 0   100% 12 0   100%
src / local_deep_research / web / routes / metrics_routes.py get_rate_limiting_analytics   100% 66 0 0   100% 28 0   100%
src / local_deep_research / web / routes / metrics_routes.py metrics_dashboard   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py context_overflow_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_metrics   100% 33 0 0   100% 2 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_rate_limiting_metrics   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_current_rate_limits   100% 11 0 0   100% 2 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_research_link_metrics   92% 38 3 0   75% 20 5   86%
src / local_deep_research / web / routes / metrics_routes.py api_research_metrics   100% 7 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_research_timeline_metrics   100% 7 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_research_search_metrics   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_enhanced_metrics   100% 15 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_get_research_rating   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_save_research_rating   100% 18 0 0   100% 4 0   100%
src / local_deep_research / web / routes / metrics_routes.py star_reviews   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py cost_analytics   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_star_reviews   100% 32 0 0   100% 12 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_pricing   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_model_pricing   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_cost_calculation   100% 15 0 0   100% 2 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_research_costs   100% 23 0 0   100% 6 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_cost_analytics   100% 46 0 0   94% 18 1   98%
src / local_deep_research / web / routes / metrics_routes.py link_analytics   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_link_analytics   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_get_domain_classifications   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_get_classifications_summary   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_classify_domains   100% 30 0 0   100% 6 0   100%
src / local_deep_research / web / routes / metrics_routes.py api_classification_progress   100% 17 0 0   83% 6 1   96%
src / local_deep_research / web / routes / metrics_routes.py (no function)   100% 103 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py handle_api_errors   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py handle_api_errors.wrapper   100% 7 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py handle_news_api_exception   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py get_news_feed   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py get_subscriptions   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py create_subscription   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py get_subscription   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py update_subscription   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py delete_subscription   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py get_subscription_history   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py submit_feedback   100% 8 0 0   100% 2 0   100%
src / local_deep_research / web / routes / news_routes.py research_news_item   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web / routes / news_routes.py save_preferences   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py get_categories   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / routes / news_routes.py (no function)   100% 69 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py redirect_static   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py progress_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py research_details_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py results_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py history_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py settings_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py _extract_research_params   100% 34 0 0   100% 16 0   100%
src / local_deep_research / web / routes / research_routes.py _queue_research   100% 13 0 0   100% 2 0   100%
src / local_deep_research / web / routes / research_routes.py start_research   98% 169 3 0   91% 46 4   97%
src / local_deep_research / web / routes / research_routes.py terminate_research   88% 42 5 0   90% 10 1   88%
src / local_deep_research / web / routes / research_routes.py delete_research   81% 21 4 0   83% 6 1   81%
src / local_deep_research / web / routes / research_routes.py clear_history   76% 21 5 0   75% 8 2   76%
src / local_deep_research / web / routes / research_routes.py open_file_location   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py save_raw_config   93% 28 2 0   100% 4 0   94%
src / local_deep_research / web / routes / research_routes.py save_raw_config.find_blocked_keys   86% 14 2 0   75% 12 1   81%
src / local_deep_research / web / routes / research_routes.py get_history   90% 21 2 0   100% 6 0   93%
src / local_deep_research / web / routes / research_routes.py get_research_details   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web / routes / research_routes.py get_research_logs   100% 14 0 0   100% 4 0   100%
src / local_deep_research / web / routes / research_routes.py get_research_report   100% 18 0 0   100% 4 0   100%
src / local_deep_research / web / routes / research_routes.py export_research_report   81% 31 6 0   100% 6 0   84%
src / local_deep_research / web / routes / research_routes.py get_research_status   96% 52 2 0   100% 22 0   97%
src / local_deep_research / web / routes / research_routes.py get_queue_status   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py get_queue_position   90% 10 1 0   50% 2 1   83%
src / local_deep_research / web / routes / research_routes.py get_upload_limits   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / research_routes.py upload_pdf   84% 51 8 0   89% 18 2   86%
src / local_deep_research / web / routes / research_routes.py (no function)   100% 99 0 0   100% 0 0   100%
src / local_deep_research / web / routes / route_registry.py get_all_routes   100% 7 0 0   100% 4 0   100%
src / local_deep_research / web / routes / route_registry.py get_routes_by_blueprint   100% 9 0 0   100% 4 0   100%
src / local_deep_research / web / routes / route_registry.py find_route   100% 6 0 0   100% 4 0   100%
src / local_deep_research / web / routes / route_registry.py (no function)   60% 10 4 0   17% 6 1   44%
src / local_deep_research / web / routes / settings_routes.py _get_setting_from_session   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web / routes / settings_routes.py validate_setting   100% 18 0 0   100% 20 0   100%
src / local_deep_research / web / routes / settings_routes.py coerce_setting_for_write   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py settings_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py save_all_settings   97% 119 4 0   96% 76 3   96%
src / local_deep_research / web / routes / settings_routes.py reset_to_defaults   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py save_settings   89% 38 4 0   100% 12 0   92%
src / local_deep_research / web / routes / settings_routes.py api_get_all_settings   73% 11 3 0   100% 2 0   77%
src / local_deep_research / web / routes / settings_routes.py api_get_db_setting   62% 13 5 0   75% 4 1   65%
src / local_deep_research / web / routes / settings_routes.py api_update_setting   92% 37 3 0   100% 18 0   95%
src / local_deep_research / web / routes / settings_routes.py api_delete_setting   79% 14 3 0   100% 6 0   85%
src / local_deep_research / web / routes / settings_routes.py api_import_settings   57% 7 3 0   100% 0 0   57%
src / local_deep_research / web / routes / settings_routes.py api_get_categories   57% 7 3 0   100% 0 0   57%
src / local_deep_research / web / routes / settings_routes.py api_get_types   50% 6 3 0   100% 0 0   50%
src / local_deep_research / web / routes / settings_routes.py api_get_ui_elements   50% 6 3 0   100% 0 0   50%
src / local_deep_research / web / routes / settings_routes.py api_get_available_models   62% 175 66 0   48% 54 8   59%
src / local_deep_research / web / routes / settings_routes.py _get_engine_icon_and_category   100% 27 0 0   100% 16 0   100%
src / local_deep_research / web / routes / settings_routes.py api_get_available_search_engines   82% 38 7 0   67% 12 4   78%
src / local_deep_research / web / routes / settings_routes.py api_get_search_favorites   62% 8 3 0   100% 2 0   70%
src / local_deep_research / web / routes / settings_routes.py api_update_search_favorites   79% 14 3 0   100% 6 0   85%
src / local_deep_research / web / routes / settings_routes.py api_toggle_search_favorite   86% 22 3 0   100% 8 0   90%
src / local_deep_research / web / routes / settings_routes.py main_config_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py collections_config_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py api_keys_config_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py search_engines_config_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py llm_config_page   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py open_file_location   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py inject_csrf_token   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py fix_corrupted_settings   100% 77 0 0   92% 64 5   96%
src / local_deep_research / web / routes / settings_routes.py api_get_warnings   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py api_get_backup_status   0% 24 24 0   0% 6 0   0%
src / local_deep_research / web / routes / settings_routes.py check_ollama_status   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web / routes / settings_routes.py api_get_rate_limiting_status   100% 13 0 0   100% 2 0   100%
src / local_deep_research / web / routes / settings_routes.py api_reset_engine_rate_limiting   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py api_cleanup_rate_limiting   100% 10 0 0   100% 0 0   100%
src / local_deep_research / web / routes / settings_routes.py get_bulk_settings   100% 16 0 0   100% 4 0   100%
src / local_deep_research / web / routes / settings_routes.py api_get_data_location   100% 18 0 0   100% 2 0   100%
src / local_deep_research / web / routes / settings_routes.py api_test_notification_url   100% 13 0 0   100% 2 0   100%
src / local_deep_research / web / routes / settings_routes.py (no function)   100% 154 0 0   100% 0 0   100%
src / local_deep_research / web / server_config.py get_server_config_path   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / server_config.py has_legacy_customizations   100% 14 0 0   100% 8 0   100%
src / local_deep_research / web / server_config.py _load_legacy_config   100% 21 0 0   100% 12 0   100%
src / local_deep_research / web / server_config.py load_server_config   100% 23 0 0   100% 14 0   100%
src / local_deep_research / web / server_config.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / web / services / pdf_extraction_service.py PDFExtractionService.extract_text_and_metadata   91% 22 2 0   100% 6 0   93%
src / local_deep_research / web / services / pdf_extraction_service.py PDFExtractionService.extract_batch   100% 12 0 0   100% 4 0   100%
src / local_deep_research / web / services / pdf_extraction_service.py get_pdf_extraction_service   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / services / pdf_extraction_service.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web / services / pdf_service.py PDFService.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / services / pdf_service.py PDFService.markdown_to_pdf   100% 16 0 0   100% 2 0   100%
src / local_deep_research / web / services / pdf_service.py PDFService._markdown_to_html   100% 14 0 0   100% 6 0   100%
src / local_deep_research / web / services / pdf_service.py get_pdf_service   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / services / pdf_service.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web / services / research_service.py _parse_research_metadata   100% 10 0 0   100% 4 0   100%
src / local_deep_research / web / services / research_service.py get_citation_formatter   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web / services / research_service.py export_report_to_memory   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web / services / research_service.py save_research_strategy   100% 14 0 0   100% 2 0   100%
src / local_deep_research / web / services / research_service.py get_research_strategy   100% 7 0 0   100% 0 0   100%
src / local_deep_research / web / services / research_service.py start_research_process   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web / services / research_service.py start_research_process._rate_limited_callback   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / services / research_service.py _generate_report_path   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / services / research_service.py run_research_process   83% 419 70 0   86% 120 11   84%
src / local_deep_research / web / services / research_service.py run_research_process.progress_callback   78% 77 17 0   77% 52 12   78%
src / local_deep_research / web / services / research_service.py run_research_process.check_termination   0% 4 4 0   0% 2 0   0%
src / local_deep_research / web / services / research_service.py cleanup_research_resources   96% 25 1 0   83% 6 1   94%
src / local_deep_research / web / services / research_service.py handle_termination   100% 10 0 0   100% 0 0   100%
src / local_deep_research / web / services / research_service.py cancel_research   100% 25 0 0   100% 6 0   100%
src / local_deep_research / web / services / research_service.py (no function)   100% 48 0 0   100% 0 0   100%
src / local_deep_research / web / services / research_sources_service.py ResearchSourcesService.save_research_sources   100% 31 0 0   90% 10 1   98%
src / local_deep_research / web / services / research_sources_service.py ResearchSourcesService.get_research_sources   100% 11 0 0   100% 2 0   100%
src / local_deep_research / web / services / research_sources_service.py ResearchSourcesService.update_research_with_sources   100% 17 0 0   75% 4 1   95%
src / local_deep_research / web / services / research_sources_service.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web / services / resource_service.py get_resources_for_research   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web / services / resource_service.py add_resource   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web / services / resource_service.py delete_resource   100% 14 0 0   100% 2 0   100%
src / local_deep_research / web / services / resource_service.py (no function)   100% 7 0 0   100% 0 0   100%
src / local_deep_research / web / services / settings_service.py set_setting   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / services / settings_service.py get_all_settings   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / services / settings_service.py create_or_update_setting   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / services / settings_service.py invalidate_settings_caches   62% 13 5 0   50% 2 1   60%
src / local_deep_research / web / services / settings_service.py validate_setting   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / services / settings_service.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__new__   100% 6 0 0   100% 4 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__init_singleton   100% 29 0 0   100% 10 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__init_singleton.on_connect   0% 1 1 0   100% 0 0   0%
src / local_deep_research / web / services / socket_service.py SocketIOService.__init_singleton.on_disconnect   0% 1 1 0   100% 0 0   0%
src / local_deep_research / web / services / socket_service.py SocketIOService.__init_singleton.on_subscribe   0% 1 1 0   100% 0 0   0%
src / local_deep_research / web / services / socket_service.py SocketIOService.__init_singleton.on_error   0% 1 1 0   100% 0 0   0%
src / local_deep_research / web / services / socket_service.py SocketIOService.__init_singleton.on_default_error   0% 1 1 0   100% 0 0   0%
src / local_deep_research / web / services / socket_service.py SocketIOService.__log_info   100% 2 0 0   100% 2 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__log_error   100% 2 0 0   100% 2 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__log_exception   100% 2 0 0   100% 2 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.emit_socket_event   100% 8 0 0   100% 2 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.emit_to_subscribers   100% 21 0 0   100% 8 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.remove_subscriptions_for_research   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__handle_connect   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__handle_disconnect   100% 20 0 0   100% 6 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__handle_subscribe   100% 13 0 0   88% 8 1   95%
src / local_deep_research / web / services / socket_service.py SocketIOService.__handle_socket_error   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.__handle_default_error   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / services / socket_service.py SocketIOService.run   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web / services / socket_service.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.__new__   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.themes   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.get_theme   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.get_theme_ids   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.get_themes_by_group   100% 6 0 0   100% 4 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.get_combined_css   100% 17 0 0   80% 10 2   93%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.get_themes_json   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.get_metadata_json   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.get_settings_options   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.get_grouped_settings_options   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.is_valid_theme   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py ThemeRegistry.clear_cache   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py get_themes   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py get_themes_json   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py get_theme_metadata   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / __init__.py (no function)   100% 27 0 0   100% 0 0   100%
src / local_deep_research / web / themes / loader.py ThemeLoader.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / themes / loader.py ThemeLoader.parse_frontmatter   100% 8 0 0   100% 2 0   100%
src / local_deep_research / web / themes / loader.py ThemeLoader.extract_theme_id   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / themes / loader.py ThemeLoader.validate_css_variables   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / themes / loader.py ThemeLoader.load_theme   100% 21 0 0   100% 8 0   100%
src / local_deep_research / web / themes / loader.py ThemeLoader.get_css_content   75% 4 1 0   50% 2 1   67%
src / local_deep_research / web / themes / loader.py ThemeLoader.load_all_themes   81% 16 3 0   67% 12 2   75%
src / local_deep_research / web / themes / loader.py ThemeLoader.clear_cache   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / themes / loader.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / web / themes / schema.py ThemeMetadata.to_dict   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / themes / schema.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / web / utils / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / web / utils / formatters.py convert_debug_to_markdown   100% 21 0 0   100% 4 0   100%
src / local_deep_research / web / utils / formatters.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / utils / route_decorators.py with_user_session   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / utils / route_decorators.py with_user_session.decorator   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / utils / route_decorators.py with_user_session.decorator.wrapper   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web / utils / route_decorators.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / utils / templates.py render_template_with_defaults   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web / utils / templates.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / utils / theme_helper.py ThemeHelper.__init__   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / utils / theme_helper.py ThemeHelper.init_app   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / utils / theme_helper.py ThemeHelper.get_themes   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / utils / theme_helper.py ThemeHelper.clear_cache   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web / utils / theme_helper.py (no function)   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web / utils / vite_helper.py ViteHelper.__init__   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web / utils / vite_helper.py ViteHelper.init_app   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web / utils / vite_helper.py ViteHelper._load_manifest   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web / utils / vite_helper.py ViteHelper.vite_hmr   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web / utils / vite_helper.py ViteHelper.vite_asset   100% 14 0 0   100% 10 0   100%
src / local_deep_research / web / utils / vite_helper.py ViteHelper._fallback_assets   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web / utils / vite_helper.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / web / warning_checks / __init__.py _safe_check   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / warning_checks / __init__.py calculate_warnings   86% 64 9 0   83% 24 4   85%
src / local_deep_research / web / warning_checks / __init__.py (no function)   100% 10 0 0   100% 0 0   100%
src / local_deep_research / web / warning_checks / backup.py check_backup_disabled   100% 5 0 0   100% 4 0   100%
src / local_deep_research / web / warning_checks / backup.py check_no_backups_exist   100% 7 0 0   100% 6 0   100%
src / local_deep_research / web / warning_checks / backup.py check_backup_healthy   100% 7 0 0   100% 6 0   100%
src / local_deep_research / web / warning_checks / backup.py (no function)   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web / warning_checks / context.py check_context_below_history   100% 11 0 0   100% 6 0   100%
src / local_deep_research / web / warning_checks / context.py check_context_truncation_history   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web / warning_checks / context.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web / warning_checks / hardware.py check_high_context   100% 7 0 0   100% 6 0   100%
src / local_deep_research / web / warning_checks / hardware.py check_model_mismatch   100% 11 0 0   100% 10 0   100%
src / local_deep_research / web / warning_checks / hardware.py check_legacy_server_config   100% 6 0 0   100% 4 0   100%
src / local_deep_research / web / warning_checks / hardware.py (no function)   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / default_search_engines.py get_default_elasticsearch_config   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / default_search_engines.py get_default_search_engine_configs   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / default_search_engines.py (no function)   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engine_registry.py get_engine_entry   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engine_registry.py (no function)   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / __init__.py (no function)   100% 0 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / full_search.py _Invokable.invoke   100% 1 0 0   50% 2 1   67%
src / local_deep_research / web_search_engines / engines / full_search.py FullSearchResults.__init__   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / full_search.py FullSearchResults.check_urls   100% 17 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / full_search.py FullSearchResults.run   100% 27 0 0   100% 16 0   100%
src / local_deep_research / web_search_engines / engines / full_search.py FullSearchResults._get_full_content   100% 22 0 0   100% 14 0   100%
src / local_deep_research / web_search_engines / engines / full_search.py FullSearchResults.invoke   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / full_search.py FullSearchResults.__call__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / full_search.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py LocalEmbeddingManager.__init__   100% 11 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py LocalEmbeddingManager.close   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py LocalEmbeddingManager.__enter__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py LocalEmbeddingManager.__exit__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py LocalEmbeddingManager.embeddings   100% 6 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py LocalEmbeddingManager._initialize_embeddings   100% 13 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py LocalEmbeddingManager._store_chunks_to_db   100% 29 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py LocalEmbeddingManager._delete_chunks_from_db   94% 17 1 0   83% 6 1   91%
src / local_deep_research / web_search_engines / engines / local_embedding_manager.py (no function)   100% 21 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine.__init__   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine._get_search_config   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine._get_available_engines   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine.analyze_query   48% 58 30 0   50% 38 1   49%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine._get_previews   100% 37 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine._get_full_content   100% 13 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine._get_engine_instance   100% 14 0 0   83% 6 1   95%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine.close   100% 7 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py MetaSearchEngine.invoke   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / meta_search_engine.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py _get_global_executor   100% 11 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py shutdown_global_executor   100% 8 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine.__init__   100% 16 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine._get_search_config   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine._get_available_engines   92% 25 2 0   94% 16 1   93%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine._get_available_generic_engines   100% 13 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine.select_engines   100% 49 0 0   90% 30 3   96%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine._get_engine_instance   100% 15 0 0   67% 6 2   90%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine._execute_single_engine   100% 13 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine._get_previews   88% 50 6 0   100% 16 0   91%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine._get_full_content   96% 24 1 0   83% 12 2   92%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine.close   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py ParallelSearchEngine.invoke   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / parallel_search_engine.py (no function)   100% 32 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py ArXivSearchEngine.__init__   100% 13 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py ArXivSearchEngine._get_search_results   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py ArXivSearchEngine._get_previews   100% 15 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py ArXivSearchEngine._get_full_content   95% 61 3 0   95% 20 1   95%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py ArXivSearchEngine.run   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py ArXivSearchEngine.get_paper_details   100% 22 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py ArXivSearchEngine.search_by_author   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py ArXivSearchEngine.search_by_category   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_arxiv.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_brave.py BraveSearchEngine.__init__   100% 9 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_brave.py BraveSearchEngine._get_previews   96% 23 1 0   100% 4 0   96%
src / local_deep_research / web_search_engines / engines / search_engine_brave.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_collection.py CollectionSearchEngine.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_collection.py CollectionSearchEngine._load_collection_embedding_settings   100% 16 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_collection.py CollectionSearchEngine.search   100% 39 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_collection.py CollectionSearchEngine._get_document_url   87% 15 2 0   83% 6 1   86%
src / local_deep_research / web_search_engines / engines / search_engine_collection.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_ddg.py DuckDuckGoSearchEngine.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_ddg.py DuckDuckGoSearchEngine._get_previews   100% 20 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_ddg.py DuckDuckGoSearchEngine._get_full_content   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_ddg.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_elasticsearch.py ElasticsearchSearchEngine.__init__   100% 21 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_elasticsearch.py ElasticsearchSearchEngine.close   0% 3 3 0   100% 0 0   0%
src / local_deep_research / web_search_engines / engines / search_engine_elasticsearch.py ElasticsearchSearchEngine._get_previews   100% 26 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_elasticsearch.py ElasticsearchSearchEngine._get_full_content   100% 24 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_elasticsearch.py ElasticsearchSearchEngine.search_by_query_string   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_elasticsearch.py ElasticsearchSearchEngine.search_by_dsl   100% 7 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_elasticsearch.py ElasticsearchSearchEngine._process_es_response   100% 16 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_elasticsearch.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_exa.py ExaSearchEngine.__init__   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_exa.py ExaSearchEngine._get_previews   97% 60 2 0   93% 28 2   95%
src / local_deep_research / web_search_engines / engines / search_engine_exa.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine.__init__   100% 13 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine.close   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._handle_rate_limits   100% 9 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._optimize_github_query   100% 24 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._search_github   100% 36 0 0   92% 12 1   98%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._get_readme_content   100% 16 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._get_recent_issues   100% 12 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._get_file_content   100% 16 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._format_repository_preview   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._format_code_preview   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._format_issue_preview   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._format_user_preview   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._get_previews   100% 38 0 0   95% 22 1   98%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._get_full_content   100% 40 0 0   100% 24 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine.search_repository   100% 22 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine.search_code   100% 16 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine.search_issues   100% 16 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine.set_search_type   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py GitHubSearchEngine._filter_for_relevance   100% 21 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_github.py (no function)   100% 32 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_google_pse.py GooglePSESearchEngine.__init__   100% 30 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_google_pse.py GooglePSESearchEngine._validate_connection   100% 10 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_google_pse.py GooglePSESearchEngine._respect_rate_limit   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_google_pse.py GooglePSESearchEngine._make_request   97% 36 1 0   90% 10 1   96%
src / local_deep_research / web_search_engines / engines / search_engine_google_pse.py GooglePSESearchEngine._get_previews   100% 27 0 0   92% 12 1   97%
src / local_deep_research / web_search_engines / engines / search_engine_google_pse.py GooglePSESearchEngine._get_full_content   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_google_pse.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine.__init__   100% 15 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine._optimize_query_for_guardian   100% 24 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine._adapt_dates_for_query_type   100% 25 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine._adaptive_search   100% 34 0 0   92% 12 1   98%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine._get_all_data   100% 39 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine._get_previews   100% 11 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine._get_full_content   100% 8 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine.run   86% 44 6 0   77% 22 3   83%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine.search_by_section   89% 9 1 0   50% 2 1   82%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py GuardianSearchEngine.get_recent_articles   92% 12 1 0   50% 2 1   86%
src / local_deep_research / web_search_engines / engines / search_engine_guardian.py (no function)   100% 20 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine.__init__   100% 11 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine._build_query_params   75% 16 4 0   64% 14 5   70%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine._get_best_format_url   100% 7 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine._get_text_url   100% 4 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine._fetch_book_text   97% 30 1 0   79% 14 3   91%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine._parse_authors   100% 9 0 0   83% 6 1   93%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine._get_previews   86% 50 7 0   71% 14 2   83%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine._get_full_content   100% 39 0 0   100% 22 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine.get_book   100% 11 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py GutenbergSearchEngine.search_by_topic   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_gutenberg.py (no function)   100% 24 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_library.py LibraryRAGSearchEngine.__init__   100% 9 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_library.py LibraryRAGSearchEngine.search   100% 72 0 0   96% 26 1   99%
src / local_deep_research / web_search_engines / engines / search_engine_library.py LibraryRAGSearchEngine._get_previews   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_library.py LibraryRAGSearchEngine._get_full_content   71% 24 7 0   60% 10 2   68%
src / local_deep_research / web_search_engines / engines / search_engine_library.py LibraryRAGSearchEngine.close   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_library.py (no function)   100% 20 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_mojeek.py MojeekSearchEngine._is_valid_search_result   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_mojeek.py MojeekSearchEngine.__init__   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_mojeek.py MojeekSearchEngine._get_search_results   97% 37 1 0   88% 16 2   94%
src / local_deep_research / web_search_engines / engines / search_engine_mojeek.py MojeekSearchEngine._get_previews   100% 10 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_mojeek.py MojeekSearchEngine._get_full_content   80% 10 2 0   100% 4 0   86%
src / local_deep_research / web_search_engines / engines / search_engine_mojeek.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_nasa_ads.py NasaAdsSearchEngine.__init__   77% 22 5 0   83% 6 1   79%
src / local_deep_research / web_search_engines / engines / search_engine_nasa_ads.py NasaAdsSearchEngine._get_previews   91% 54 5 0   86% 22 3   89%
src / local_deep_research / web_search_engines / engines / search_engine_nasa_ads.py NasaAdsSearchEngine._format_doc_preview   91% 34 3 0   86% 14 2   90%
src / local_deep_research / web_search_engines / engines / search_engine_nasa_ads.py NasaAdsSearchEngine._get_full_content   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_nasa_ads.py (no function)   100% 17 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_openalex.py OpenAlexSearchEngine.__init__   90% 21 2 0   100% 6 0   93%
src / local_deep_research / web_search_engines / engines / search_engine_openalex.py OpenAlexSearchEngine._get_previews   100% 57 0 0   100% 24 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_openalex.py OpenAlexSearchEngine._format_work_preview   98% 47 1 0   86% 22 3   94%
src / local_deep_research / web_search_engines / engines / search_engine_openalex.py OpenAlexSearchEngine._reconstruct_abstract   100% 11 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_openalex.py OpenAlexSearchEngine._get_full_content   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_openalex.py (no function)   100% 18 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py OpenLibrarySearchEngine.__init__   100% 7 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py OpenLibrarySearchEngine._build_query_params   92% 13 1 0   90% 10 1   91%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py OpenLibrarySearchEngine._get_cover_url   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py OpenLibrarySearchEngine._get_previews   85% 66 10 0   71% 24 7   81%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py OpenLibrarySearchEngine._get_full_content   95% 61 3 0   88% 48 6   92%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py OpenLibrarySearchEngine._fetch_work_details   93% 15 1 0   100% 4 0   95%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py OpenLibrarySearchEngine.get_book_by_isbn   91% 11 1 0   100% 0 0   91%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py OpenLibrarySearchEngine.get_author   86% 14 2 0   50% 2 1   81%
src / local_deep_research / web_search_engines / engines / search_engine_openlibrary.py (no function)   100% 23 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine.__init__   100% 18 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine._make_request   100% 22 0 0   88% 8 1   97%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine._expand_query_with_llm   89% 18 2 0   75% 4 1   86%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine._multi_pass_search   95% 43 2 0   83% 18 3   92%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine._get_previews   93% 15 1 0   83% 6 1   90%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine._convert_document_to_preview   91% 98 9 0   78% 36 8   87%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine._get_full_content   84% 31 5 0   92% 12 1   86%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine.run   83% 18 3 0   62% 8 1   77%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine.arun   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine.test_connection   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py PaperlessSearchEngine.get_document_count   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_paperless.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine.__init__   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine._search_compounds   100% 14 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine._get_compound_by_name   95% 21 1 0   100% 4 0   96%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine._get_compound_properties   100% 15 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine._get_compound_description   100% 19 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine._get_compound_synonyms   100% 19 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine._get_previews   85% 60 9 0   75% 28 3   82%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine._get_full_content   93% 43 3 0   53% 32 15   76%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine.get_compound   100% 10 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py PubChemSearchEngine.search_by_formula   100% 20 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubchem.py (no function)   100% 24 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine.__init__   100% 28 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._get_result_count   100% 14 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._extract_core_terms   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._expand_time_window   94% 18 1 0   93% 14 1   94%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._optimize_query_for_pubmed   96% 49 2 0   88% 24 3   93%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._simplify_query   100% 12 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._is_historical_focused   100% 18 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._adaptive_search   100% 35 0 0   100% 16 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._search_pubmed   100% 27 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._get_article_summaries   95% 40 2 0   67% 18 6   86%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._get_article_abstracts   94% 50 3 0   81% 26 5   89%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._get_article_detailed_metadata   97% 67 2 0   80% 46 9   90%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._create_enriched_content   100% 43 0 0   100% 36 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._find_pmc_ids   92% 25 2 0   71% 14 4   85%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._get_pmc_full_text   97% 35 1 0   70% 20 6   87%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._get_previews   95% 84 4 0   76% 54 13   88%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine._get_full_content   96% 91 4 0   80% 64 13   89%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine.search_by_author   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine.search_by_journal   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine.search_recent   100% 9 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py PubMedSearchEngine.advanced_search   100% 10 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_pubmed.py (no function)   100% 36 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_retriever.py RetrieverSearchEngine.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_retriever.py RetrieverSearchEngine.run   100% 11 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_retriever.py RetrieverSearchEngine._convert_document_to_result   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_retriever.py RetrieverSearchEngine._get_previews   100% 11 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_retriever.py RetrieverSearchEngine._get_full_content   100% 4 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_retriever.py RetrieverSearchEngine.arun   100% 14 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_retriever.py (no function)   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_scaleserp.py ScaleSerpSearchEngine.__init__   100% 13 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_scaleserp.py ScaleSerpSearchEngine._get_previews   95% 60 3 0   91% 22 2   94%
src / local_deep_research / web_search_engines / engines / search_engine_scaleserp.py ScaleSerpSearchEngine._get_full_content   100% 4 0 0   50% 2 1   83%
src / local_deep_research / web_search_engines / engines / search_engine_scaleserp.py ScaleSerpSearchEngine._temp_attributes   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_scaleserp.py (no function)   100% 15 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine._normalize_list   100% 15 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine._is_valid_search_result   100% 5 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine.__init__   100% 33 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine._respect_rate_limit   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine._get_search_results   93% 75 5 0   83% 30 5   90%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine._get_previews   100% 16 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine._get_full_content   92% 13 1 0   83% 6 1   89%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine.invoke   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine.results   100% 12 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine.get_self_hosting_instructions   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py SearXNGSearchEngine.run   73% 11 3 0   100% 2 0   77%
src / local_deep_research / web_search_engines / engines / search_engine_searxng.py (no function)   100% 31 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine.__init__   100% 28 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._create_session   100% 9 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine.close   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine.__del__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine.__enter__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine.__exit__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._respect_rate_limit   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._make_request   94% 17 1 0   88% 8 1   92%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._optimize_query   100% 17 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._direct_search   100% 22 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._adaptive_search   100% 48 0 0   92% 26 2   97%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._get_paper_details   100% 16 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._get_previews   100% 34 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._get_previews._year_key   60% 5 2 0   100% 0 0   60%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py SemanticScholarSearchEngine._get_full_content   100% 27 0 0   86% 22 3   94%
src / local_deep_research / web_search_engines / engines / search_engine_semantic_scholar.py (no function)   100% 30 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_serpapi.py SerpAPISearchEngine.__init__   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_serpapi.py SerpAPISearchEngine._get_previews   100% 16 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_serpapi.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_serper.py SerperSearchEngine.__init__   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_serper.py SerperSearchEngine._get_previews   100% 55 0 0   100% 20 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_serper.py SerperSearchEngine._get_full_content   100% 4 0 0   50% 2 1   83%
src / local_deep_research / web_search_engines / engines / search_engine_serper.py SerperSearchEngine._temp_attributes   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_serper.py (no function)   100% 19 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine.__init__   100% 19 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine._apply_backoff   67% 6 2 0   75% 4 1   70%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine._handle_backoff   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine._build_query_params   90% 10 1 0   88% 8 1   89%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine._decode_html   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine._get_site_name   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine._get_previews   94% 64 4 0   86% 14 2   92%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine._get_full_content   95% 39 2 0   89% 18 2   93%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine._fetch_top_answers   100% 21 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine.get_question   100% 15 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine.get_answers   100% 14 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py StackExchangeSearchEngine.search_by_tag   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_stackexchange.py (no function)   100% 31 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_tavily.py TavilySearchEngine.__init__   100% 12 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_tavily.py TavilySearchEngine.__init__.TavilyWrapper.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_tavily.py TavilySearchEngine.__init__.TavilyWrapper.run   0% 1 1 0   100% 0 0   0%
src / local_deep_research / web_search_engines / engines / search_engine_tavily.py TavilySearchEngine._get_previews   100% 29 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_tavily.py TavilySearchEngine._get_full_content   100% 6 0 0   83% 6 1   92%
src / local_deep_research / web_search_engines / engines / search_engine_tavily.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine.__init__   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine._extract_urls_from_query   93% 29 2 0   90% 10 1   92%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine._format_timestamp   77% 13 3 0   100% 2 0   80%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine._get_wayback_snapshots   100% 29 0 0   100% 12 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine._get_previews   94% 17 1 0   88% 8 1   92%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine._remove_boilerplate   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine._get_wayback_content   100% 9 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine._get_full_content   100% 22 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine.search_by_url   100% 9 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine.search_by_date_range   94% 18 1 0   83% 6 1   92%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py WaybackSearchEngine.get_latest_snapshot   100% 17 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wayback.py (no function)   100% 22 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py WikinewsSearchEngine.__init__   85% 13 2 0   50% 2 1   80%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py WikinewsSearchEngine._optimize_query_for_wikinews   100% 18 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py WikinewsSearchEngine._adapt_date_range_for_query   100% 19 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py WikinewsSearchEngine._fetch_search_results   100% 13 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py WikinewsSearchEngine._process_search_result   90% 21 2 0   75% 8 2   86%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py WikinewsSearchEngine._fetch_full_content_and_pubdate   100% 21 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py WikinewsSearchEngine._get_previews   100% 16 0 0   70% 10 3   88%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py WikinewsSearchEngine._get_full_content   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py _clean_wikinews_snippet   100% 5 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikinews.py (no function)   100% 32 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikipedia.py WikipediaSearchEngine.__init__   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikipedia.py WikipediaSearchEngine._get_previews   100% 40 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikipedia.py WikipediaSearchEngine._get_full_content   93% 29 2 0   83% 6 1   91%
src / local_deep_research / web_search_engines / engines / search_engine_wikipedia.py WikipediaSearchEngine.get_summary   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikipedia.py WikipediaSearchEngine.get_page   95% 19 1 0   83% 6 1   92%
src / local_deep_research / web_search_engines / engines / search_engine_wikipedia.py WikipediaSearchEngine.set_language   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_wikipedia.py (no function)   100% 16 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine.__init__   100% 8 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine._build_query_params   100% 8 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine._parse_creators   100% 6 0 0   75% 4 1   90%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine._get_resource_type_label   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine._get_previews   95% 62 3 0   83% 18 3   92%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine._get_full_content   100% 36 0 0   100% 22 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine.get_record   100% 11 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine.search_datasets   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py ZenodoSearchEngine.search_software   100% 5 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / engines / search_engine_zenodo.py (no function)   100% 25 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / __main__.py (no function)   0% 3 3 0   0% 2 0   0%
src / local_deep_research / web_search_engines / rate_limiting / exceptions.py (no function)   100% 6 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / __init__.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / detection.py is_llm_rate_limit_error   91% 22 2 0   94% 16 1   92%
src / local_deep_research / web_search_engines / rate_limiting / llm / detection.py extract_retry_after   89% 18 2 0   100% 8 0   92%
src / local_deep_research / web_search_engines / rate_limiting / llm / detection.py (no function)   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py AdaptiveLLMWait.__init__   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py AdaptiveLLMWait.__call__   100% 9 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper   100% 12 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.__init__   67% 6 2 0   50% 2 1   62%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._should_rate_limit   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._check_if_local_model   100% 10 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._get_rate_limit_key   100% 17 0 0   100% 10 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.invoke   100% 13 0 0   75% 4 1   94%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.invoke._invoke_with_retry   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._do_invoke   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.__getattr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.close   0% 5 5 0   100% 0 0   0%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.__str__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.__repr__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / llm / wrapper.py (no function)   100% 13 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py _get_db_imports   100% 8 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.__init__   100% 18 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.__init__.get_setting_or_default   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker._apply_profile   100% 9 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker._load_estimates   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker._ensure_estimates_loaded   100% 32 0 0   100% 12 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.get_wait_time   100% 21 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.apply_rate_limit   100% 7 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.record_outcome   100% 14 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker._update_estimate   100% 57 0 0   100% 16 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker._get_in_memory_stats   100% 10 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.get_stats   96% 25 1 0   90% 10 1   94%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.reset_engine   88% 33 4 0   83% 12 2   87%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.get_search_quality_stats   100% 14 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker._get_quality_status   100% 9 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py AdaptiveRateLimitTracker.cleanup_old_data   87% 30 4 0   80% 10 2   85%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py get_tracker   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / rate_limiting / tracker.py (no function)   100% 28 0 2   100% 0 0   100%
src / local_deep_research / web_search_engines / relevance_filter.py _unwrap_llm   100% 7 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / relevance_filter.py _build_batch_prompt   100% 8 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / relevance_filter.py _run_batch   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / relevance_filter.py filter_previews_for_relevance   98% 54 1 0   96% 26 1   98%
src / local_deep_research / web_search_engines / relevance_filter.py _invoke_text   75% 12 3 0   50% 4 2   69%
src / local_deep_research / web_search_engines / relevance_filter.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py RetrieverRegistry.__init__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py RetrieverRegistry.register   100% 3 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py RetrieverRegistry.register_multiple   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py RetrieverRegistry.get   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py RetrieverRegistry.unregister   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py RetrieverRegistry.clear   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py RetrieverRegistry.is_registered   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py RetrieverRegistry.list_registered   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / retriever_registry.py (no function)   100% 14 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py AdaptiveWait.__init__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py AdaptiveWait.__call__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._ensure_list   100% 19 0 0   93% 14 1   97%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._load_engine_class   83% 12 2 0   100% 2 0   86%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._check_api_key_availability   100% 8 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.__init__   100% 20 0 0   100% 6 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.max_filtered_results   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.max_filtered_results   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.max_results   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.max_results   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._get_adaptive_wait   100% 4 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._record_retry_outcome   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.run   90% 41 4 0   100% 12 0   92%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.run._run_with_retry   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.run._execute_search   100% 40 0 0   100% 14 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.invoke   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._filter_for_relevance   100% 6 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._is_valid_api_key   100% 17 0 0   100% 14 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._resolve_api_key   100% 10 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._is_rate_limit_error   100% 24 0 0   100% 20 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._raise_if_rate_limit   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._extract_full_result   100% 4 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._get_full_content   100% 3 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._init_full_search   100% 7 0 0   100% 2 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._temp_attributes   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._sanitize_error_message   100% 7 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._mask_api_key   100% 6 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine._get_previews   0% 1 1 0   100% 0 0   0%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.close   83% 6 1 0   67% 6 2   75%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.__enter__   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py BaseSearchEngine.__exit__   100% 2 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_base.py (no function)   100% 65 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engine_factory.py create_search_engine   98% 113 2 0   89% 70 6   95%
src / local_deep_research / web_search_engines / search_engine_factory.py _create_full_search_wrapper   100% 44 0 0   80% 30 6   92%
src / local_deep_research / web_search_engines / search_engine_factory.py get_search   96% 26 1 0   94% 16 1   95%
src / local_deep_research / web_search_engines / search_engine_factory.py (no function)   100% 11 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engines_config.py _get_setting   100% 13 0 0   100% 4 0   100%
src / local_deep_research / web_search_engines / search_engines_config.py _extract_per_engine_config   100% 11 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / search_engines_config.py search_config   100% 39 0 0   100% 18 0   100%
src / local_deep_research / web_search_engines / search_engines_config.py get_available_engines   96% 25 1 0   94% 16 1   95%
src / local_deep_research / web_search_engines / search_engines_config.py _resolve_api_key   100% 13 0 0   100% 8 0   100%
src / local_deep_research / web_search_engines / search_engines_config.py default_search_engine   100% 1 0 0   100% 0 0   100%
src / local_deep_research / web_search_engines / search_engines_config.py (no function)   100% 11 0 0   100% 0 0   100%
Total     95% 43034 2358 3   90% 12724 978   93%

No items found using the specified filter.